xfrm: fix xfrm by MARK logic
While using xfrm by MARK feature in 2.6.34 - 2.6.35 kernels, the mark is always cleared in flowi structure via memset in _decode_session4 (net/ipv4/xfrm4_policy.c), so the policy lookup fails. IPv6 code is affected by this bug too. Signed-off-by: Peter Kosyh <p.kosyh@gmail.com> Acked-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
8bd39456bd
commit
44b451f163
|
@ -108,6 +108,8 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse)
|
||||||
u8 *xprth = skb_network_header(skb) + iph->ihl * 4;
|
u8 *xprth = skb_network_header(skb) + iph->ihl * 4;
|
||||||
|
|
||||||
memset(fl, 0, sizeof(struct flowi));
|
memset(fl, 0, sizeof(struct flowi));
|
||||||
|
fl->mark = skb->mark;
|
||||||
|
|
||||||
if (!(iph->frag_off & htons(IP_MF | IP_OFFSET))) {
|
if (!(iph->frag_off & htons(IP_MF | IP_OFFSET))) {
|
||||||
switch (iph->protocol) {
|
switch (iph->protocol) {
|
||||||
case IPPROTO_UDP:
|
case IPPROTO_UDP:
|
||||||
|
|
|
@ -124,6 +124,8 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl, int reverse)
|
||||||
u8 nexthdr = nh[IP6CB(skb)->nhoff];
|
u8 nexthdr = nh[IP6CB(skb)->nhoff];
|
||||||
|
|
||||||
memset(fl, 0, sizeof(struct flowi));
|
memset(fl, 0, sizeof(struct flowi));
|
||||||
|
fl->mark = skb->mark;
|
||||||
|
|
||||||
ipv6_addr_copy(&fl->fl6_dst, reverse ? &hdr->saddr : &hdr->daddr);
|
ipv6_addr_copy(&fl->fl6_dst, reverse ? &hdr->saddr : &hdr->daddr);
|
||||||
ipv6_addr_copy(&fl->fl6_src, reverse ? &hdr->daddr : &hdr->saddr);
|
ipv6_addr_copy(&fl->fl6_src, reverse ? &hdr->daddr : &hdr->saddr);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue