netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [IPV6] RAW: Add checksum default defines for MH.
@ 2007-01-03  9:32 Masahide NAKAMURA
  2007-01-24  6:19 ` David Miller
  0 siblings, 1 reply; 10+ messages in thread
From: Masahide NAKAMURA @ 2007-01-03  9:32 UTC (permalink / raw)
  To: davem, yoshfuji, takamiya; +Cc: netdev, Masahide NAKAMURA

Add checksum default defines for mobility header(MH) which
goes through raw socket. As the result kernel's behavior is
to handle MH checksum as default.

This patch also removes verifying inbound MH checksum at
mip6_mh_filter() since it did not consider user specified
checksum offset and was redundant check with raw socket code.

Signed-off-by: Masahide NAKAMURA <nakam@linux-ipv6.org>
---
 net/ipv6/mip6.c |   26 --------------------------
 net/ipv6/raw.c  |   13 +++++++++++--
 2 files changed, 11 insertions(+), 28 deletions(-)

diff --git a/net/ipv6/mip6.c b/net/ipv6/mip6.c
index be7dd7d..681bb07 100644
--- a/net/ipv6/mip6.c
+++ b/net/ipv6/mip6.c
@@ -89,7 +89,6 @@ static int mip6_mh_len(int type)
 int mip6_mh_filter(struct sock *sk, struct sk_buff *skb)
 {
 	struct ip6_mh *mh;
-	int mhlen;
 
 	if (!pskb_may_pull(skb, (skb->h.raw - skb->data) + 8) ||
 	    !pskb_may_pull(skb, (skb->h.raw - skb->data) + ((skb->h.raw[1] + 1) << 3)))
@@ -103,31 +102,6 @@ int mip6_mh_filter(struct sock *sk, stru
 		mip6_param_prob(skb, 0, (&mh->ip6mh_hdrlen) - skb->nh.raw);
 		return -1;
 	}
-	mhlen = (mh->ip6mh_hdrlen + 1) << 3;
-
-	if (skb->ip_summed == CHECKSUM_COMPLETE) {
-		skb->ip_summed = CHECKSUM_UNNECESSARY;
-		if (csum_ipv6_magic(&skb->nh.ipv6h->saddr,
-				    &skb->nh.ipv6h->daddr,
-				    mhlen, IPPROTO_MH,
-				    skb->csum)) {
-			LIMIT_NETDEBUG(KERN_DEBUG "mip6: MH hw checksum failed\n");
-			skb->ip_summed = CHECKSUM_NONE;
-		}
-	}
-	if (skb->ip_summed == CHECKSUM_NONE) {
-		if (csum_ipv6_magic(&skb->nh.ipv6h->saddr,
-				    &skb->nh.ipv6h->daddr,
-				    mhlen, IPPROTO_MH,
-				    skb_checksum(skb, 0, mhlen, 0))) {
-			LIMIT_NETDEBUG(KERN_DEBUG "mip6: MH checksum failed "
-				       "[" NIP6_FMT " > " NIP6_FMT "]\n",
-				       NIP6(skb->nh.ipv6h->saddr),
-				       NIP6(skb->nh.ipv6h->daddr));
-			return -1;
-		}
-		skb->ip_summed = CHECKSUM_UNNECESSARY;
-	}
 
 	if (mh->ip6mh_proto != IPPROTO_NONE) {
 		LIMIT_NETDEBUG(KERN_DEBUG "mip6: MH invalid payload proto = %d\n",
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
index 4ae1b19..4b83e69 100644
--- a/net/ipv6/raw.c
+++ b/net/ipv6/raw.c
@@ -1094,10 +1094,19 @@ static void rawv6_close(struct sock *sk,
 
 static int rawv6_init_sk(struct sock *sk)
 {
-	if (inet_sk(sk)->num == IPPROTO_ICMPV6) {
-		struct raw6_sock *rp = raw6_sk(sk);
+	struct raw6_sock *rp = raw6_sk(sk);
+
+	switch (inet_sk(sk)->num) {
+	case IPPROTO_ICMPV6:
 		rp->checksum = 1;
 		rp->offset   = 2;
+		break;
+	case IPPROTO_MH:
+		rp->checksum = 1;
+		rp->offset   = 4;
+		break;
+	default:
+		break;
 	}
 	return(0);
 }
-- 
1.4.2


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [IPV6] RAW: Add checksum default defines for MH.
@ 2007-01-03  9:57 Masahide NAKAMURA
  2007-02-07  6:43 ` YOSHIFUJI Hideaki / 吉藤英明
  0 siblings, 1 reply; 10+ messages in thread
From: Masahide NAKAMURA @ 2007-01-03  9:57 UTC (permalink / raw)
  To: davem, yoshfuji, takamiya; +Cc: netdev, Masahide NAKAMURA

Add checksum default defines for mobility header(MH) which
goes through raw socket. As the result kernel's behavior is
to handle MH checksum as default.

This patch also removes verifying inbound MH checksum at
mip6_mh_filter() since it did not consider user specified
checksum offset and was redundant check with raw socket code.

Signed-off-by: Masahide NAKAMURA <nakam@linux-ipv6.org>
---
 net/ipv6/mip6.c |   26 --------------------------
 net/ipv6/raw.c  |   13 +++++++++++--
 2 files changed, 11 insertions(+), 28 deletions(-)

diff --git a/net/ipv6/mip6.c b/net/ipv6/mip6.c
index be7dd7d..681bb07 100644
--- a/net/ipv6/mip6.c
+++ b/net/ipv6/mip6.c
@@ -89,7 +89,6 @@ static int mip6_mh_len(int type)
 int mip6_mh_filter(struct sock *sk, struct sk_buff *skb)
 {
 	struct ip6_mh *mh;
-	int mhlen;
 
 	if (!pskb_may_pull(skb, (skb->h.raw - skb->data) + 8) ||
 	    !pskb_may_pull(skb, (skb->h.raw - skb->data) + ((skb->h.raw[1] + 1) << 3)))
@@ -103,31 +102,6 @@ int mip6_mh_filter(struct sock *sk, stru
 		mip6_param_prob(skb, 0, (&mh->ip6mh_hdrlen) - skb->nh.raw);
 		return -1;
 	}
-	mhlen = (mh->ip6mh_hdrlen + 1) << 3;
-
-	if (skb->ip_summed == CHECKSUM_COMPLETE) {
-		skb->ip_summed = CHECKSUM_UNNECESSARY;
-		if (csum_ipv6_magic(&skb->nh.ipv6h->saddr,
-				    &skb->nh.ipv6h->daddr,
-				    mhlen, IPPROTO_MH,
-				    skb->csum)) {
-			LIMIT_NETDEBUG(KERN_DEBUG "mip6: MH hw checksum failed\n");
-			skb->ip_summed = CHECKSUM_NONE;
-		}
-	}
-	if (skb->ip_summed == CHECKSUM_NONE) {
-		if (csum_ipv6_magic(&skb->nh.ipv6h->saddr,
-				    &skb->nh.ipv6h->daddr,
-				    mhlen, IPPROTO_MH,
-				    skb_checksum(skb, 0, mhlen, 0))) {
-			LIMIT_NETDEBUG(KERN_DEBUG "mip6: MH checksum failed "
-				       "[" NIP6_FMT " > " NIP6_FMT "]\n",
-				       NIP6(skb->nh.ipv6h->saddr),
-				       NIP6(skb->nh.ipv6h->daddr));
-			return -1;
-		}
-		skb->ip_summed = CHECKSUM_UNNECESSARY;
-	}
 
 	if (mh->ip6mh_proto != IPPROTO_NONE) {
 		LIMIT_NETDEBUG(KERN_DEBUG "mip6: MH invalid payload proto = %d\n",
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
index 4ae1b19..4b83e69 100644
--- a/net/ipv6/raw.c
+++ b/net/ipv6/raw.c
@@ -1094,10 +1094,19 @@ static void rawv6_close(struct sock *sk,
 
 static int rawv6_init_sk(struct sock *sk)
 {
-	if (inet_sk(sk)->num == IPPROTO_ICMPV6) {
-		struct raw6_sock *rp = raw6_sk(sk);
+	struct raw6_sock *rp = raw6_sk(sk);
+
+	switch (inet_sk(sk)->num) {
+	case IPPROTO_ICMPV6:
 		rp->checksum = 1;
 		rp->offset   = 2;
+		break;
+	case IPPROTO_MH:
+		rp->checksum = 1;
+		rp->offset   = 4;
+		break;
+	default:
+		break;
 	}
 	return(0);
 }
-- 
1.4.2


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [IPV6] RAW: Add checksum default defines for MH.
  2007-01-03  9:32 [IPV6] RAW: Add checksum default defines for MH Masahide NAKAMURA
@ 2007-01-24  6:19 ` David Miller
  2007-01-24  6:56   ` Herbert Xu
  0 siblings, 1 reply; 10+ messages in thread
From: David Miller @ 2007-01-24  6:19 UTC (permalink / raw)
  To: nakam; +Cc: yoshfuji, takamiya, netdev

From: Masahide NAKAMURA <nakam@linux-ipv6.org>
Date: Wed,  3 Jan 2007 18:32:22 +0900

> Add checksum default defines for mobility header(MH) which
> goes through raw socket. As the result kernel's behavior is
> to handle MH checksum as default.
> 
> This patch also removes verifying inbound MH checksum at
> mip6_mh_filter() since it did not consider user specified
> checksum offset and was redundant check with raw socket code.
> 
> Signed-off-by: Masahide NAKAMURA <nakam@linux-ipv6.org>

Did a complete agreement occur that this patch is ok?

Thank you.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [IPV6] RAW: Add checksum default defines for MH.
  2007-01-24  6:19 ` David Miller
@ 2007-01-24  6:56   ` Herbert Xu
  2007-01-24  6:59     ` David Miller
  2007-01-24  7:05     ` YOSHIFUJI Hideaki / 吉藤英明
  0 siblings, 2 replies; 10+ messages in thread
From: Herbert Xu @ 2007-01-24  6:56 UTC (permalink / raw)
  To: David Miller; +Cc: nakam, yoshfuji, takamiya, netdev

David Miller <davem@davemloft.net> wrote:
>
> Did a complete agreement occur that this patch is ok?

My only concern is that we're putting an arbitrary list of
protocols in the generic raw.c.  What's the justification
for including these protocols in particular but not others?

Is there any reason why the application can't just use the
existing IPV6_CHECKSUM socket option to set the same fields?

Cheers,
-- 
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [IPV6] RAW: Add checksum default defines for MH.
  2007-01-24  6:56   ` Herbert Xu
@ 2007-01-24  6:59     ` David Miller
  2007-01-24 10:39       ` Masahide NAKAMURA
  2007-01-24  7:05     ` YOSHIFUJI Hideaki / 吉藤英明
  1 sibling, 1 reply; 10+ messages in thread
From: David Miller @ 2007-01-24  6:59 UTC (permalink / raw)
  To: herbert; +Cc: nakam, yoshfuji, takamiya, netdev

From: Herbert Xu <herbert@gondor.apana.org.au>
Date: Wed, 24 Jan 2007 17:56:23 +1100

> David Miller <davem@davemloft.net> wrote:
> >
> > Did a complete agreement occur that this patch is ok?
> 
> My only concern is that we're putting an arbitrary list of
> protocols in the generic raw.c.  What's the justification
> for including these protocols in particular but not others?
> 
> Is there any reason why the application can't just use the
> existing IPV6_CHECKSUM socket option to set the same fields?

My understanding in the MH case is that the kernel is going
to make changes to the header that the user can't predict
and thus it's impossible for them to set the correct checksum.

I don't know what the justification is for ICMP6 though :-)


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [IPV6] RAW: Add checksum default defines for MH.
  2007-01-24  6:56   ` Herbert Xu
  2007-01-24  6:59     ` David Miller
@ 2007-01-24  7:05     ` YOSHIFUJI Hideaki / 吉藤英明
  2007-01-24  7:06       ` Herbert Xu
  1 sibling, 1 reply; 10+ messages in thread
From: YOSHIFUJI Hideaki / 吉藤英明 @ 2007-01-24  7:05 UTC (permalink / raw)
  To: herbert; +Cc: davem, nakam, takamiya, netdev, yoshfuji

In article <E1H9c3T-0005HA-00@gondolin.me.apana.org.au> (at Wed, 24 Jan 2007 17:56:23 +1100), Herbert Xu <herbert@gondor.apana.org.au> says:

> David Miller <davem@davemloft.net> wrote:
> >
> > Did a complete agreement occur that this patch is ok?
> 
> My only concern is that we're putting an arbitrary list of
> protocols in the generic raw.c.  What's the justification
> for including these protocols in particular but not others?
> 
> Is there any reason why the application can't just use the
> existing IPV6_CHECKSUM socket option to set the same fields?

Yes, it can.

The only reason they (not myself :-)) want to put this in is
because the RFC says that MIP6 implementation MUST compute
checksum by default when it passes the MH to userspace.  On
the other hand, it also states that user space application SHOULD
set IPV6_CHECKSUM to 4.

--yoshfuji


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [IPV6] RAW: Add checksum default defines for MH.
  2007-01-24  7:05     ` YOSHIFUJI Hideaki / 吉藤英明
@ 2007-01-24  7:06       ` Herbert Xu
  0 siblings, 0 replies; 10+ messages in thread
From: Herbert Xu @ 2007-01-24  7:06 UTC (permalink / raw)
  To: YOSHIFUJI Hideaki / ?$B5HF#1QL@; +Cc: davem, nakam, takamiya, netdev

On Wed, Jan 24, 2007 at 04:05:41PM +0900, YOSHIFUJI Hideaki / ?$B5HF#1QL@ wrote:
> 
> The only reason they (not myself :-)) want to put this in is
> because the RFC says that MIP6 implementation MUST compute
> checksum by default when it passes the MH to userspace.  On
> the other hand, it also states that user space application SHOULD
> set IPV6_CHECKSUM to 4.

OK if the RFC says so then it's fine by me :)
-- 
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [IPV6] RAW: Add checksum default defines for MH.
  2007-01-24  6:59     ` David Miller
@ 2007-01-24 10:39       ` Masahide NAKAMURA
  0 siblings, 0 replies; 10+ messages in thread
From: Masahide NAKAMURA @ 2007-01-24 10:39 UTC (permalink / raw)
  To: David Miller; +Cc: herbert, yoshfuji, takamiya, netdev

David Miller wrote:
> From: Herbert Xu <herbert@gondor.apana.org.au>
> Date: Wed, 24 Jan 2007 17:56:23 +1100
> 
>> David Miller <davem@davemloft.net> wrote:
>>> Did a complete agreement occur that this patch is ok?
>> My only concern is that we're putting an arbitrary list of
>> protocols in the generic raw.c.  What's the justification
>> for including these protocols in particular but not others?
>>
>> Is there any reason why the application can't just use the
>> existing IPV6_CHECKSUM socket option to set the same fields?
> 
> My understanding in the MH case is that the kernel is going
> to make changes to the header that the user can't predict
> and thus it's impossible for them to set the correct checksum.

Yes, kernel will change the IPv6 header address, however,
actually it is possible to compute MH checksum by user-space
since final address (=home address) is seen by application
on both sending and receiving case and the checksum is calculated
by the address. It is true user can use IPV6_CHECKSUM option
to set the same fields.
(FYI, it is failed to validate MH checksum with IPv6 header
address on wire (or before parsing extension headers) for such
Mobile IPv6 routing optimized packet).

So this fix is not mandatory feature for kernel.
This patch just relaxes user application like ICMPv6 case
then we can cancel this if it is too much.

Thanks for taking care of this again, guys.

-- 
Masahide NAKAMURA

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [IPV6] RAW: Add checksum default defines for MH.
  2007-01-03  9:57 Masahide NAKAMURA
@ 2007-02-07  6:43 ` YOSHIFUJI Hideaki / 吉藤英明
  2007-02-07  8:04   ` David Miller
  0 siblings, 1 reply; 10+ messages in thread
From: YOSHIFUJI Hideaki / 吉藤英明 @ 2007-02-07  6:43 UTC (permalink / raw)
  To: davem; +Cc: takamiya, netdev, yoshfuji, nakam

Dave,

AFAIK, we have not heard objectsions and I finally agree on this.
Please apply.

Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>

--yoshfuji

In article <11678182681435-git-send-email-nakam@linux-ipv6.org> (at Wed,  3 Jan 2007 18:57:48 +0900), Masahide NAKAMURA <nakam@linux-ipv6.org> says:

> Add checksum default defines for mobility header(MH) which
> goes through raw socket. As the result kernel's behavior is
> to handle MH checksum as default.
> 
> This patch also removes verifying inbound MH checksum at
> mip6_mh_filter() since it did not consider user specified
> checksum offset and was redundant check with raw socket code.
> 
> Signed-off-by: Masahide NAKAMURA <nakam@linux-ipv6.org>
> ---
>  net/ipv6/mip6.c |   26 --------------------------
>  net/ipv6/raw.c  |   13 +++++++++++--
>  2 files changed, 11 insertions(+), 28 deletions(-)
> 
> diff --git a/net/ipv6/mip6.c b/net/ipv6/mip6.c
> index be7dd7d..681bb07 100644
> --- a/net/ipv6/mip6.c
> +++ b/net/ipv6/mip6.c
> @@ -89,7 +89,6 @@ static int mip6_mh_len(int type)
>  int mip6_mh_filter(struct sock *sk, struct sk_buff *skb)
>  {
>  	struct ip6_mh *mh;
> -	int mhlen;
>  
>  	if (!pskb_may_pull(skb, (skb->h.raw - skb->data) + 8) ||
>  	    !pskb_may_pull(skb, (skb->h.raw - skb->data) + ((skb->h.raw[1] + 1) << 3)))
> @@ -103,31 +102,6 @@ int mip6_mh_filter(struct sock *sk, stru
>  		mip6_param_prob(skb, 0, (&mh->ip6mh_hdrlen) - skb->nh.raw);
>  		return -1;
>  	}
> -	mhlen = (mh->ip6mh_hdrlen + 1) << 3;
> -
> -	if (skb->ip_summed == CHECKSUM_COMPLETE) {
> -		skb->ip_summed = CHECKSUM_UNNECESSARY;
> -		if (csum_ipv6_magic(&skb->nh.ipv6h->saddr,
> -				    &skb->nh.ipv6h->daddr,
> -				    mhlen, IPPROTO_MH,
> -				    skb->csum)) {
> -			LIMIT_NETDEBUG(KERN_DEBUG "mip6: MH hw checksum failed\n");
> -			skb->ip_summed = CHECKSUM_NONE;
> -		}
> -	}
> -	if (skb->ip_summed == CHECKSUM_NONE) {
> -		if (csum_ipv6_magic(&skb->nh.ipv6h->saddr,
> -				    &skb->nh.ipv6h->daddr,
> -				    mhlen, IPPROTO_MH,
> -				    skb_checksum(skb, 0, mhlen, 0))) {
> -			LIMIT_NETDEBUG(KERN_DEBUG "mip6: MH checksum failed "
> -				       "[" NIP6_FMT " > " NIP6_FMT "]\n",
> -				       NIP6(skb->nh.ipv6h->saddr),
> -				       NIP6(skb->nh.ipv6h->daddr));
> -			return -1;
> -		}
> -		skb->ip_summed = CHECKSUM_UNNECESSARY;
> -	}
>  
>  	if (mh->ip6mh_proto != IPPROTO_NONE) {
>  		LIMIT_NETDEBUG(KERN_DEBUG "mip6: MH invalid payload proto = %d\n",
> diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
> index 4ae1b19..4b83e69 100644
> --- a/net/ipv6/raw.c
> +++ b/net/ipv6/raw.c
> @@ -1094,10 +1094,19 @@ static void rawv6_close(struct sock *sk,
>  
>  static int rawv6_init_sk(struct sock *sk)
>  {
> -	if (inet_sk(sk)->num == IPPROTO_ICMPV6) {
> -		struct raw6_sock *rp = raw6_sk(sk);
> +	struct raw6_sock *rp = raw6_sk(sk);
> +
> +	switch (inet_sk(sk)->num) {
> +	case IPPROTO_ICMPV6:
>  		rp->checksum = 1;
>  		rp->offset   = 2;
> +		break;
> +	case IPPROTO_MH:
> +		rp->checksum = 1;
> +		rp->offset   = 4;
> +		break;
> +	default:
> +		break;
>  	}
>  	return(0);
>  }
> -- 
> 1.4.2
> 
> -
> 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

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [IPV6] RAW: Add checksum default defines for MH.
  2007-02-07  6:43 ` YOSHIFUJI Hideaki / 吉藤英明
@ 2007-02-07  8:04   ` David Miller
  0 siblings, 0 replies; 10+ messages in thread
From: David Miller @ 2007-02-07  8:04 UTC (permalink / raw)
  To: yoshfuji; +Cc: takamiya, netdev, nakam

From: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Date: Wed, 07 Feb 2007 15:43:34 +0900 (JST)

> AFAIK, we have not heard objectsions and I finally agree on this.
> Please apply.
> 
> Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>

Yes, thank you for reminding me, I will apply this to
net-2.6.21 right now.

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2007-02-07  8:04 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-01-03  9:32 [IPV6] RAW: Add checksum default defines for MH Masahide NAKAMURA
2007-01-24  6:19 ` David Miller
2007-01-24  6:56   ` Herbert Xu
2007-01-24  6:59     ` David Miller
2007-01-24 10:39       ` Masahide NAKAMURA
2007-01-24  7:05     ` YOSHIFUJI Hideaki / 吉藤英明
2007-01-24  7:06       ` Herbert Xu
  -- strict thread matches above, loose matches on Subject: below --
2007-01-03  9:57 Masahide NAKAMURA
2007-02-07  6:43 ` YOSHIFUJI Hideaki / 吉藤英明
2007-02-07  8:04   ` David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).