aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2007-04-24 01:39:02 -0400
committerDavid S. Miller <davem@davemloft.net>2007-04-24 01:39:02 -0400
commit05d224468a273a9ee773a0e9d34227ee7f2c0840 (patch)
treea461b4cc9ba13a4a61b84199b04dba7850bfab41
parent4d4d3d1e8807d6aa9822eeedf7fe8500e1b7e38d (diff)
[XFRM]: beet: fix pseudo header length value
draft-nikander-esp-beet-mode-07.txt is not entirely clear on how the length value of the pseudo header should be calculated, it states "The Header Length field contains the length of the pseudo header, IPv4 options, and padding in 8 octets units.", but also states "Length in octets (Header Len + 1) * 8". draft-nikander-esp-beet-mode-08-pre1.txt [1] clarifies this, the header length should not include the first 8 byte. This change affects backwards compatibility, but option encapsulation didn't work until very recently anyway. [1] http://users.piuha.net/jmelen/BEET/draft-nikander-esp-beet-mode-08-pre1.txt Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/ipv4/xfrm4_mode_beet.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/net/ipv4/xfrm4_mode_beet.c b/net/ipv4/xfrm4_mode_beet.c
index f68dfd8a0f5c..d419e15d9803 100644
--- a/net/ipv4/xfrm4_mode_beet.c
+++ b/net/ipv4/xfrm4_mode_beet.c
@@ -52,7 +52,7 @@ static int xfrm4_beet_output(struct xfrm_state *x, struct sk_buff *skb)
52 52
53 ph = (struct ip_beet_phdr *)skb->h.raw; 53 ph = (struct ip_beet_phdr *)skb->h.raw;
54 ph->padlen = 4 - (optlen & 4); 54 ph->padlen = 4 - (optlen & 4);
55 ph->hdrlen = (optlen + ph->padlen + sizeof(*ph)) / 8; 55 ph->hdrlen = optlen / 8;
56 ph->nexthdr = top_iph->protocol; 56 ph->nexthdr = top_iph->protocol;
57 if (ph->padlen) 57 if (ph->padlen)
58 memset(ph + 1, IPOPT_NOP, ph->padlen); 58 memset(ph + 1, IPOPT_NOP, ph->padlen);
@@ -85,7 +85,7 @@ static int xfrm4_beet_input(struct xfrm_state *x, struct sk_buff *skb)
85 ph = (struct ip_beet_phdr *)(skb->h.ipiph + 1); 85 ph = (struct ip_beet_phdr *)(skb->h.ipiph + 1);
86 86
87 phlen = sizeof(*ph) + ph->padlen; 87 phlen = sizeof(*ph) + ph->padlen;
88 optlen = ph->hdrlen * 8 - phlen; 88 optlen = ph->hdrlen * 8 + (IPV4_BEET_PHMAXLEN - phlen);
89 if (optlen < 0 || optlen & 3 || optlen > 250) 89 if (optlen < 0 || optlen & 3 || optlen > 250)
90 goto out; 90 goto out;
91 91