git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
tulip/pnic2.c: Use dev_<level> and pr_<level>
[safe/jmp/linux-2.6]
/
net
/
ipv4
/
xfrm4_mode_beet.c
diff --git
a/net/ipv4/xfrm4_mode_beet.c
b/net/ipv4/xfrm4_mode_beet.c
index
e093a7b
..
6341818
100644
(file)
--- a/
net/ipv4/xfrm4_mode_beet.c
+++ b/
net/ipv4/xfrm4_mode_beet.c
@@
-39,25
+39,26
@@
static void xfrm4_beet_make_header(struct sk_buff *skb)
static int xfrm4_beet_output(struct xfrm_state *x, struct sk_buff *skb)
{
struct ip_beet_phdr *ph;
static int xfrm4_beet_output(struct xfrm_state *x, struct sk_buff *skb)
{
struct ip_beet_phdr *ph;
- struct iphdr *
iph, *
top_iph;
+ struct iphdr *top_iph;
int hdrlen, optlen;
int hdrlen, optlen;
- iph = ip_hdr(skb);
-
hdrlen = 0;
hdrlen = 0;
- optlen =
iph->ihl * 4 - sizeof(*iph)
;
+ optlen =
XFRM_MODE_SKB_CB(skb)->optlen
;
if (unlikely(optlen))
hdrlen += IPV4_BEET_PHMAXLEN - (optlen & 4);
if (unlikely(optlen))
hdrlen += IPV4_BEET_PHMAXLEN - (optlen & 4);
- skb_set_network_header(skb, IPV4_BEET_PHMAXLEN - x->props.header_len -
- hdrlen);
+ skb_set_network_header(skb, -x->props.header_len -
+ hdrlen + (XFRM_MODE_SKB_CB(skb)->ihl - sizeof(*top_iph)));
+ if (x->sel.family != AF_INET6)
+ skb->network_header += IPV4_BEET_PHMAXLEN;
skb->mac_header = skb->network_header +
offsetof(struct iphdr, protocol);
skb->mac_header = skb->network_header +
offsetof(struct iphdr, protocol);
- skb->transport_header = skb->network_header + sizeof(*iph);
+ skb->transport_header = skb->network_header + sizeof(*
top_
iph);
xfrm4_beet_make_header(skb);
xfrm4_beet_make_header(skb);
- ph = (struct ip_beet_phdr *)__skb_pull(skb, sizeof(*iph) - hdrlen);
+ ph = (struct ip_beet_phdr *)
+ __skb_pull(skb, XFRM_MODE_SKB_CB(skb)->ihl - hdrlen);
top_iph = ip_hdr(skb);
top_iph = ip_hdr(skb);
@@
-102,7
+103,7
@@
static int xfrm4_beet_input(struct xfrm_state *x, struct sk_buff *skb)
XFRM_MODE_SKB_CB(skb)->protocol = ph->nexthdr;
XFRM_MODE_SKB_CB(skb)->protocol = ph->nexthdr;
- if (!pskb_may_pull(skb, phlen))
;
+ if (!pskb_may_pull(skb, phlen))
goto out;
__skb_pull(skb, phlen);
}
goto out;
__skb_pull(skb, phlen);
}