Message ID | 1381828777-15894-1-git-send-email-fan.du@windriver.com |
---|---|
State | Superseded, archived |
Delegated to: | David Miller |
Headers | show |
On 10/15/2013 05:19 AM, Fan Du wrote: > igb/ixgbe have hardware sctp checksum support, when this feature is enabled > and also IPsec is armed to protect sctp traffic, ugly things happened as > xfrm_output checks CHECKSUM_PARTIAL to do check sum operation(sum every thing > up and pack the 16bits result in the checksum field). The result is fail > establishment of sctp communication. > > Signed-off-by: Fan Du <fan.du@windriver.com> > Cc: Vlad Yasevich <vyasevich@gmail.com> > Cc: Neil Horman <nhorman@tuxdriver.com> > Cc: Steffen Klassert <steffen.klassert@secunet.com> > Acked-by: Vlad Yasevich <vyasevich@gmail.com> Looks good to me. -vlad > --- > v3: > - Rename is_xfrm_armed by dst_xfrm > - Move this funtion in include/net/dst.h > > v2: > - Split v1 into two separate patches. > > --- > include/net/dst.h | 12 ++++++++++++ > net/sctp/output.c | 3 ++- > 2 files changed, 14 insertions(+), 1 deletion(-) > > diff --git a/include/net/dst.h b/include/net/dst.h > index 211dcf1..44995c1 100644 > --- a/include/net/dst.h > +++ b/include/net/dst.h > @@ -478,10 +478,22 @@ static inline struct dst_entry *xfrm_lookup(struct net *net, > { > return dst_orig; > } > + > +static inline struct xfrm_state *dst_xfrm(const struct dst_entry *dst) > +{ > + return NULL; > +} > + > #else > struct dst_entry *xfrm_lookup(struct net *net, struct dst_entry *dst_orig, > const struct flowi *fl, struct sock *sk, > int flags); > + > +/* skb attached with this dst needs transformation if dst->xfrm is valid */ > +static inline struct xfrm_state *dst_xfrm(const struct dst_entry *dst) > +{ > + return dst->xfrm; > +} > #endif > > #endif /* _NET_DST_H */ > diff --git a/net/sctp/output.c b/net/sctp/output.c > index 0ac3a65..24b3718 100644 > --- a/net/sctp/output.c > +++ b/net/sctp/output.c > @@ -536,7 +536,8 @@ int sctp_packet_transmit(struct sctp_packet *packet) > * by CRC32-C as described in <draft-ietf-tsvwg-sctpcsum-02.txt>. > */ > if (!sctp_checksum_disable) { > - if (!(dst->dev->features & NETIF_F_SCTP_CSUM)) { > + if (!(dst->dev->features & NETIF_F_SCTP_CSUM) || > + (dst_xfrm(dst) != NULL)) { > __u32 crc32 = sctp_start_cksum((__u8 *)sh, cksum_buf_len); > > /* 3) Put the resultant value into the checksum field in the > -- 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
On 10/15/2013 09:05 PM, Vlad Yasevich wrote: > On 10/15/2013 05:19 AM, Fan Du wrote: >> igb/ixgbe have hardware sctp checksum support, when this feature is >> enabled >> and also IPsec is armed to protect sctp traffic, ugly things happened as >> xfrm_output checks CHECKSUM_PARTIAL to do check sum operation(sum >> every thing >> up and pack the 16bits result in the checksum field). The result is fail >> establishment of sctp communication. >> >> Signed-off-by: Fan Du <fan.du@windriver.com> >> Cc: Vlad Yasevich <vyasevich@gmail.com> >> Cc: Neil Horman <nhorman@tuxdriver.com> >> Cc: Steffen Klassert <steffen.klassert@secunet.com> >> Acked-by: Vlad Yasevich <vyasevich@gmail.com> > > Looks good to me. > Just tryied applying this and looks like you based this on net-next. This fixes a rather ugly bug when checksum offloading is done. I am going to rebase this and re-submit for net. -vlad > -vlad > >> --- >> v3: >> - Rename is_xfrm_armed by dst_xfrm >> - Move this funtion in include/net/dst.h >> >> v2: >> - Split v1 into two separate patches. >> >> --- >> include/net/dst.h | 12 ++++++++++++ >> net/sctp/output.c | 3 ++- >> 2 files changed, 14 insertions(+), 1 deletion(-) >> >> diff --git a/include/net/dst.h b/include/net/dst.h >> index 211dcf1..44995c1 100644 >> --- a/include/net/dst.h >> +++ b/include/net/dst.h >> @@ -478,10 +478,22 @@ static inline struct dst_entry >> *xfrm_lookup(struct net *net, >> { >> return dst_orig; >> } >> + >> +static inline struct xfrm_state *dst_xfrm(const struct dst_entry *dst) >> +{ >> + return NULL; >> +} >> + >> #else >> struct dst_entry *xfrm_lookup(struct net *net, struct dst_entry >> *dst_orig, >> const struct flowi *fl, struct sock *sk, >> int flags); >> + >> +/* skb attached with this dst needs transformation if dst->xfrm is >> valid */ >> +static inline struct xfrm_state *dst_xfrm(const struct dst_entry *dst) >> +{ >> + return dst->xfrm; >> +} >> #endif >> >> #endif /* _NET_DST_H */ >> diff --git a/net/sctp/output.c b/net/sctp/output.c >> index 0ac3a65..24b3718 100644 >> --- a/net/sctp/output.c >> +++ b/net/sctp/output.c >> @@ -536,7 +536,8 @@ int sctp_packet_transmit(struct sctp_packet *packet) >> * by CRC32-C as described in <draft-ietf-tsvwg-sctpcsum-02.txt>. >> */ >> if (!sctp_checksum_disable) { >> - if (!(dst->dev->features & NETIF_F_SCTP_CSUM)) { >> + if (!(dst->dev->features & NETIF_F_SCTP_CSUM) || >> + (dst_xfrm(dst) != NULL)) { >> __u32 crc32 = sctp_start_cksum((__u8 *)sh, cksum_buf_len); >> >> /* 3) Put the resultant value into the checksum field in >> the >> > -- 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
On 2013年10月16日 09:52, Vlad Yasevich wrote: > On 10/15/2013 09:05 PM, Vlad Yasevich wrote: >> On 10/15/2013 05:19 AM, Fan Du wrote: >>> igb/ixgbe have hardware sctp checksum support, when this feature is >>> enabled >>> and also IPsec is armed to protect sctp traffic, ugly things happened as >>> xfrm_output checks CHECKSUM_PARTIAL to do check sum operation(sum >>> every thing >>> up and pack the 16bits result in the checksum field). The result is fail >>> establishment of sctp communication. >>> >>> Signed-off-by: Fan Du <fan.du@windriver.com> >>> Cc: Vlad Yasevich <vyasevich@gmail.com> >>> Cc: Neil Horman <nhorman@tuxdriver.com> >>> Cc: Steffen Klassert <steffen.klassert@secunet.com> >>> Acked-by: Vlad Yasevich <vyasevich@gmail.com> >> >> Looks good to me. >> > > Just tryied applying this and looks like you based this on net-next. > This fixes a rather ugly bug when checksum offloading is done. > I am going to rebase this and re-submit for net. :( Sorry for the inconvenience. Stable tree might hurts also.
diff --git a/include/net/dst.h b/include/net/dst.h index 211dcf1..44995c1 100644 --- a/include/net/dst.h +++ b/include/net/dst.h @@ -478,10 +478,22 @@ static inline struct dst_entry *xfrm_lookup(struct net *net, { return dst_orig; } + +static inline struct xfrm_state *dst_xfrm(const struct dst_entry *dst) +{ + return NULL; +} + #else struct dst_entry *xfrm_lookup(struct net *net, struct dst_entry *dst_orig, const struct flowi *fl, struct sock *sk, int flags); + +/* skb attached with this dst needs transformation if dst->xfrm is valid */ +static inline struct xfrm_state *dst_xfrm(const struct dst_entry *dst) +{ + return dst->xfrm; +} #endif #endif /* _NET_DST_H */ diff --git a/net/sctp/output.c b/net/sctp/output.c index 0ac3a65..24b3718 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c @@ -536,7 +536,8 @@ int sctp_packet_transmit(struct sctp_packet *packet) * by CRC32-C as described in <draft-ietf-tsvwg-sctpcsum-02.txt>. */ if (!sctp_checksum_disable) { - if (!(dst->dev->features & NETIF_F_SCTP_CSUM)) { + if (!(dst->dev->features & NETIF_F_SCTP_CSUM) || + (dst_xfrm(dst) != NULL)) { __u32 crc32 = sctp_start_cksum((__u8 *)sh, cksum_buf_len); /* 3) Put the resultant value into the checksum field in the