Patchwork [v2,net-next] net/sctp: Refactor SCTP skb checksum computation

login
register
mail settings
Submitter Joe Stringer
Date July 25, 2013, 1:52 a.m.
Message ID <1374717125-28969-1-git-send-email-joe@wand.net.nz>
Download mbox | patch
Permalink /patch/261575/
State Accepted
Delegated to: David Miller
Headers show

Comments

Joe Stringer - July 25, 2013, 1:52 a.m.
This patch consolidates the SCTP checksum calculation code from various
places to a single new function, sctp_compute_cksum(skb, offset).

Signed-off-by: Joe Stringer <joe@wand.net.nz>
---
v2:
* Use skb->data + offset for start position of checksum calculation
* Fix existing bug in sctp_csum_check() where the incorrect offset was used
* Remove redundant variable in sctp_nat_csum()
---
 include/net/sctp/checksum.h           |   15 +++++++++++++++
 net/netfilter/ipvs/ip_vs_proto_sctp.c |   23 +++--------------------
 net/netfilter/nf_nat_proto_sctp.c     |    8 +-------
 net/sctp/input.c                      |   10 +---------
 4 files changed, 20 insertions(+), 36 deletions(-)
Julian Anastasov - July 25, 2013, 5:08 a.m.
Hello,

On Thu, 25 Jul 2013, Joe Stringer wrote:

> This patch consolidates the SCTP checksum calculation code from various
> places to a single new function, sctp_compute_cksum(skb, offset).
> 
> Signed-off-by: Joe Stringer <joe@wand.net.nz>
> ---
> v2:
> * Use skb->data + offset for start position of checksum calculation
> * Fix existing bug in sctp_csum_check() where the incorrect offset was used
> * Remove redundant variable in sctp_nat_csum()

	v2 looks good to me, thanks!

Reviewed-by: Julian Anastasov <ja@ssi.bg>

> ---
>  include/net/sctp/checksum.h           |   15 +++++++++++++++
>  net/netfilter/ipvs/ip_vs_proto_sctp.c |   23 +++--------------------
>  net/netfilter/nf_nat_proto_sctp.c     |    8 +-------
>  net/sctp/input.c                      |   10 +---------
>  4 files changed, 20 insertions(+), 36 deletions(-)

Regards

--
Julian Anastasov <ja@ssi.bg>
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Simon Horman - July 25, 2013, 5:24 a.m.
On Thu, Jul 25, 2013 at 08:08:11AM +0300, Julian Anastasov wrote:
> 
> 	Hello,
> 
> On Thu, 25 Jul 2013, Joe Stringer wrote:
> 
> > This patch consolidates the SCTP checksum calculation code from various
> > places to a single new function, sctp_compute_cksum(skb, offset).
> > 
> > Signed-off-by: Joe Stringer <joe@wand.net.nz>
> > ---
> > v2:
> > * Use skb->data + offset for start position of checksum calculation
> > * Fix existing bug in sctp_csum_check() where the incorrect offset was used
> > * Remove redundant variable in sctp_nat_csum()
> 
> 	v2 looks good to me, thanks!
> 
> Reviewed-by: Julian Anastasov <ja@ssi.bg>

IPVS portion:

Acked-by: Simon Horman <horms@verge.net.au>

Dave, could you consider taking this through net-next?

> > ---
> >  include/net/sctp/checksum.h           |   15 +++++++++++++++
> >  net/netfilter/ipvs/ip_vs_proto_sctp.c |   23 +++--------------------
> >  net/netfilter/nf_nat_proto_sctp.c     |    8 +-------
> >  net/sctp/input.c                      |   10 +---------
> >  4 files changed, 20 insertions(+), 36 deletions(-)
> 
> Regards
> 
> --
> Julian Anastasov <ja@ssi.bg>
> 
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Miller - July 25, 2013, 6:15 a.m.
From: Simon Horman <horms@verge.net.au>
Date: Thu, 25 Jul 2013 14:24:38 +0900

> On Thu, Jul 25, 2013 at 08:08:11AM +0300, Julian Anastasov wrote:
>> 
>> 	Hello,
>> 
>> On Thu, 25 Jul 2013, Joe Stringer wrote:
>> 
>> > This patch consolidates the SCTP checksum calculation code from various
>> > places to a single new function, sctp_compute_cksum(skb, offset).
>> > 
>> > Signed-off-by: Joe Stringer <joe@wand.net.nz>
>> > ---
>> > v2:
>> > * Use skb->data + offset for start position of checksum calculation
>> > * Fix existing bug in sctp_csum_check() where the incorrect offset was used
>> > * Remove redundant variable in sctp_nat_csum()
>> 
>> 	v2 looks good to me, thanks!
>> 
>> Reviewed-by: Julian Anastasov <ja@ssi.bg>
> 
> IPVS portion:
> 
> Acked-by: Simon Horman <horms@verge.net.au>
> 
> Dave, could you consider taking this through net-next?

Sure.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Miller - July 28, 2013, 3:07 a.m.
From: Joe Stringer <joe@wand.net.nz>
Date: Thu, 25 Jul 2013 10:52:05 +0900

> This patch consolidates the SCTP checksum calculation code from various
> places to a single new function, sctp_compute_cksum(skb, offset).
> 
> Signed-off-by: Joe Stringer <joe@wand.net.nz>

Applied, thanks.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/include/net/sctp/checksum.h b/include/net/sctp/checksum.h
index 0cb08e6..5d55082 100644
--- a/include/net/sctp/checksum.h
+++ b/include/net/sctp/checksum.h
@@ -85,4 +85,19 @@  static inline __le32 sctp_end_cksum(__u32 crc32)
 	return cpu_to_le32(~crc32);
 }
 
+/* Calculate the CRC32C checksum of an SCTP packet.  */
+static inline __le32 sctp_compute_cksum(const struct sk_buff *skb,
+					unsigned int offset)
+{
+	const struct sk_buff *iter;
+
+	__u32 crc32 = sctp_start_cksum(skb->data + offset,
+				       skb_headlen(skb) - offset);
+	skb_walk_frags(skb, iter)
+		crc32 = sctp_update_cksum((__u8 *) iter->data,
+					  skb_headlen(iter), crc32);
+
+	return sctp_end_cksum(crc32);
+}
+
 #endif /* __sctp_checksum_h__ */
diff --git a/net/netfilter/ipvs/ip_vs_proto_sctp.c b/net/netfilter/ipvs/ip_vs_proto_sctp.c
index 3c0da87..23e596e 100644
--- a/net/netfilter/ipvs/ip_vs_proto_sctp.c
+++ b/net/netfilter/ipvs/ip_vs_proto_sctp.c
@@ -66,15 +66,7 @@  sctp_conn_schedule(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd,
 static void sctp_nat_csum(struct sk_buff *skb, sctp_sctphdr_t *sctph,
 			  unsigned int sctphoff)
 {
-	__u32 crc32;
-	struct sk_buff *iter;
-
-	crc32 = sctp_start_cksum((__u8 *)sctph, skb_headlen(skb) - sctphoff);
-	skb_walk_frags(skb, iter)
-		crc32 = sctp_update_cksum((u8 *) iter->data,
-					  skb_headlen(iter), crc32);
-	sctph->checksum = sctp_end_cksum(crc32);
-
+	sctph->checksum = sctp_compute_cksum(skb, sctphoff);
 	skb->ip_summed = CHECKSUM_UNNECESSARY;
 }
 
@@ -151,10 +143,7 @@  sctp_csum_check(int af, struct sk_buff *skb, struct ip_vs_protocol *pp)
 {
 	unsigned int sctphoff;
 	struct sctphdr *sh, _sctph;
-	struct sk_buff *iter;
-	__le32 cmp;
-	__le32 val;
-	__u32 tmp;
+	__le32 cmp, val;
 
 #ifdef CONFIG_IP_VS_IPV6
 	if (af == AF_INET6)
@@ -168,13 +157,7 @@  sctp_csum_check(int af, struct sk_buff *skb, struct ip_vs_protocol *pp)
 		return 0;
 
 	cmp = sh->checksum;
-
-	tmp = sctp_start_cksum((__u8 *) sh, skb_headlen(skb));
-	skb_walk_frags(skb, iter)
-		tmp = sctp_update_cksum((__u8 *) iter->data,
-					skb_headlen(iter), tmp);
-
-	val = sctp_end_cksum(tmp);
+	val = sctp_compute_cksum(skb, sctphoff);
 
 	if (val != cmp) {
 		/* CRC failure, dump it. */
diff --git a/net/netfilter/nf_nat_proto_sctp.c b/net/netfilter/nf_nat_proto_sctp.c
index 396e55d..754536f 100644
--- a/net/netfilter/nf_nat_proto_sctp.c
+++ b/net/netfilter/nf_nat_proto_sctp.c
@@ -34,9 +34,7 @@  sctp_manip_pkt(struct sk_buff *skb,
 	       const struct nf_conntrack_tuple *tuple,
 	       enum nf_nat_manip_type maniptype)
 {
-	struct sk_buff *frag;
 	sctp_sctphdr_t *hdr;
-	__u32 crc32;
 
 	if (!skb_make_writable(skb, hdroff + sizeof(*hdr)))
 		return false;
@@ -51,11 +49,7 @@  sctp_manip_pkt(struct sk_buff *skb,
 		hdr->dest = tuple->dst.u.sctp.port;
 	}
 
-	crc32 = sctp_start_cksum((u8 *)hdr, skb_headlen(skb) - hdroff);
-	skb_walk_frags(skb, frag)
-		crc32 = sctp_update_cksum((u8 *)frag->data, skb_headlen(frag),
-					  crc32);
-	hdr->checksum = sctp_end_cksum(crc32);
+	hdr->checksum = sctp_compute_cksum(skb, hdroff);
 
 	return true;
 }
diff --git a/net/sctp/input.c b/net/sctp/input.c
index 3fa4d85..944f70e 100644
--- a/net/sctp/input.c
+++ b/net/sctp/input.c
@@ -87,15 +87,7 @@  static inline int sctp_rcv_checksum(struct net *net, struct sk_buff *skb)
 {
 	struct sctphdr *sh = sctp_hdr(skb);
 	__le32 cmp = sh->checksum;
-	struct sk_buff *list;
-	__le32 val;
-	__u32 tmp = sctp_start_cksum((__u8 *)sh, skb_headlen(skb));
-
-	skb_walk_frags(skb, list)
-		tmp = sctp_update_cksum((__u8 *)list->data, skb_headlen(list),
-					tmp);
-
-	val = sctp_end_cksum(tmp);
+	__le32 val = sctp_compute_cksum(skb, 0);
 
 	if (val != cmp) {
 		/* CRC failure, dump it. */