ipv4: Rework ipmr_rt_fib_lookup() flow key initialization.
authorDavid S. Miller <davem@davemloft.net>
Wed, 4 May 2011 02:42:43 +0000 (19:42 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 4 May 2011 02:42:43 +0000 (19:42 -0700)
Use information from the skb as much as possible, currently
this means daddr, saddr, and TOS.

Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/ipmr.c

index c81b9b661d26344f32f551a164f76d1da084a43f..3ad38a4495889681722846d1f0c20f4c4d76ecbb 100644 (file)
@@ -1788,12 +1788,14 @@ dont_forward:
        return 0;
 }
 
-static struct mr_table *ipmr_rt_fib_lookup(struct net *net, struct rtable *rt)
+static struct mr_table *ipmr_rt_fib_lookup(struct net *net, struct sk_buff *skb)
 {
+       struct rtable *rt = skb_rtable(skb);
+       struct iphdr *iph = ip_hdr(skb);
        struct flowi4 fl4 = {
-               .daddr = rt->rt_key_dst,
-               .saddr = rt->rt_key_src,
-               .flowi4_tos = rt->rt_tos,
+               .daddr = iph->daddr,
+               .saddr = iph->saddr,
+               .flowi4_tos = iph->tos,
                .flowi4_oif = rt->rt_oif,
                .flowi4_iif = rt->rt_iif,
                .flowi4_mark = rt->rt_mark,
@@ -1825,7 +1827,7 @@ int ip_mr_input(struct sk_buff *skb)
        if (IPCB(skb)->flags & IPSKB_FORWARDED)
                goto dont_forward;
 
-       mrt = ipmr_rt_fib_lookup(net, skb_rtable(skb));
+       mrt = ipmr_rt_fib_lookup(net, skb);
        if (IS_ERR(mrt)) {
                kfree_skb(skb);
                return PTR_ERR(mrt);
@@ -1957,7 +1959,7 @@ int pim_rcv_v1(struct sk_buff *skb)
 
        pim = igmp_hdr(skb);
 
-       mrt = ipmr_rt_fib_lookup(net, skb_rtable(skb));
+       mrt = ipmr_rt_fib_lookup(net, skb);
        if (IS_ERR(mrt))
                goto drop;
        if (!mrt->mroute_do_pim ||
@@ -1989,7 +1991,7 @@ static int pim_rcv(struct sk_buff *skb)
             csum_fold(skb_checksum(skb, 0, skb->len, 0))))
                goto drop;
 
-       mrt = ipmr_rt_fib_lookup(net, skb_rtable(skb));
+       mrt = ipmr_rt_fib_lookup(net, skb);
        if (IS_ERR(mrt))
                goto drop;
        if (__pim_rcv(mrt, skb, sizeof(*pim))) {