From 715a705de42e1f5269ad1a97edab086c7f90fdc4 Mon Sep 17 00:00:00 2001 From: YOSHIFUJI Hideaki Date: Thu, 24 Apr 2008 21:30:38 -0700 Subject: [PATCH] --- yaml --- r: 93087 b: refs/heads/master c: 1a98d05f59704d60be85b03f727964e15c77224c h: refs/heads/master i: 93085: 2e0c7ad6e3919c460ad60a8429f23b124e79efec 93083: dacb381257fc0215f6b18dc40e59329bd948a951 93079: 0c437d93afa046356dae198f29849dc9973053a1 93071: 83008e34617b2cb22f4ec77da3f364db16b38b5d 93055: 5b1daf47cd9d134cee8ee1ce35b5e2b9249d31c1 v: v3 --- [refs] | 2 +- trunk/net/ipv6/raw.c | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index a0f087208cd0..e54d029b8d46 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 8d390efd903485923419584275fd0c2aa4c94183 +refs/heads/master: 1a98d05f59704d60be85b03f727964e15c77224c diff --git a/trunk/net/ipv6/raw.c b/trunk/net/ipv6/raw.c index 6193b124cbc7..396f0ea11090 100644 --- a/trunk/net/ipv6/raw.c +++ b/trunk/net/ipv6/raw.c @@ -971,6 +971,19 @@ static int do_rawv6_setsockopt(struct sock *sk, int level, int optname, switch (optname) { case IPV6_CHECKSUM: + if (inet_sk(sk)->num == IPPROTO_ICMPV6 && + level == IPPROTO_IPV6) { + /* + * RFC3542 tells that IPV6_CHECKSUM socket + * option in the IPPROTO_IPV6 level is not + * allowed on ICMPv6 sockets. + * If you want to set it, use IPPROTO_RAW + * level IPV6_CHECKSUM socket option + * (Linux extension). + */ + return -EINVAL; + } + /* You may get strange result with a positive odd offset; RFC2292bis agrees with me. */ if (val > 0 && (val&1)) @@ -1046,6 +1059,11 @@ static int do_rawv6_getsockopt(struct sock *sk, int level, int optname, switch (optname) { case IPV6_CHECKSUM: + /* + * We allow getsockopt() for IPPROTO_IPV6-level + * IPV6_CHECKSUM socket option on ICMPv6 sockets + * since RFC3542 is silent about it. + */ if (rp->checksum == 0) val = -1; else