Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ipv4: Lookup multicast routes by rtable using helper.

Create a common helper for this operation, since we do
it identically in three spots.

Suggested by Eric Dumazet.

Signed-off-by: David S. Miller <davem@davemloft.net>

+28 -42
+28 -42
net/ipv4/ipmr.c
··· 1793 1793 return 0; 1794 1794 } 1795 1795 1796 + static struct mr_table *ipmr_rt_fib_lookup(struct net *net, struct rtable *rt) 1797 + { 1798 + struct flowi fl = { 1799 + .fl4_dst = rt->rt_key_dst, 1800 + .fl4_src = rt->rt_key_src, 1801 + .fl4_tos = rt->rt_tos, 1802 + .oif = rt->rt_oif, 1803 + .iif = rt->rt_iif, 1804 + .mark = rt->rt_mark, 1805 + }; 1806 + struct mr_table *mrt; 1807 + int err; 1808 + 1809 + err = ipmr_fib_lookup(net, &fl, &mrt); 1810 + if (err) 1811 + return ERR_PTR(err); 1812 + return mrt; 1813 + } 1796 1814 1797 1815 /* 1798 1816 * Multicast packets for forwarding arrive here ··· 1823 1805 struct net *net = dev_net(skb->dev); 1824 1806 int local = skb_rtable(skb)->rt_flags & RTCF_LOCAL; 1825 1807 struct mr_table *mrt; 1826 - int err; 1827 1808 1828 1809 /* Packet is looped back after forward, it should not be 1829 1810 * forwarded second time, but still can be delivered locally. ··· 1830 1813 if (IPCB(skb)->flags & IPSKB_FORWARDED) 1831 1814 goto dont_forward; 1832 1815 1833 - { 1834 - struct rtable *rt = skb_rtable(skb); 1835 - struct flowi fl = { 1836 - .fl4_dst = rt->rt_key_dst, 1837 - .fl4_src = rt->rt_key_src, 1838 - .fl4_tos = rt->rt_tos, 1839 - .oif = rt->rt_oif, 1840 - .iif = rt->rt_iif, 1841 - .mark = rt->rt_mark, 1842 - }; 1843 - err = ipmr_fib_lookup(net, &fl, &mrt); 1844 - if (err < 0) { 1845 - kfree_skb(skb); 1846 - return err; 1847 - } 1816 + mrt = ipmr_rt_fib_lookup(net, skb_rtable(skb)); 1817 + if (IS_ERR(mrt)) { 1818 + kfree_skb(skb); 1819 + return PTR_ERR(mrt); 1848 1820 } 1849 1821 if (!local) { 1850 1822 if (IPCB(skb)->opt.router_alert) { ··· 1962 1956 1963 1957 pim = igmp_hdr(skb); 1964 1958 1965 - { 1966 - struct rtable *rt = skb_rtable(skb); 1967 - struct flowi fl = { 1968 - .fl4_dst = rt->rt_key_dst, 1969 - .fl4_src = rt->rt_key_src, 1970 - .fl4_tos = rt->rt_tos, 1971 - .oif = rt->rt_oif, 1972 - .iif = rt->rt_iif, 1973 - .mark = rt->rt_mark, 1974 - }; 1975 - if (ipmr_fib_lookup(net, &fl, &mrt) < 0) 1976 - goto drop; 1977 - } 1959 + mrt = ipmr_rt_fib_lookup(net, skb_rtable(skb)); 1960 + if (IS_ERR(mrt)) 1961 + goto drop; 1978 1962 if (!mrt->mroute_do_pim || 1979 1963 pim->group != PIM_V1_VERSION || pim->code != PIM_V1_REGISTER) 1980 1964 goto drop; ··· 1994 1998 csum_fold(skb_checksum(skb, 0, skb->len, 0)))) 1995 1999 goto drop; 1996 2000 1997 - { 1998 - struct rtable *rt = skb_rtable(skb); 1999 - struct flowi fl = { 2000 - .fl4_dst = rt->rt_key_dst, 2001 - .fl4_src = rt->rt_key_src, 2002 - .fl4_tos = rt->rt_tos, 2003 - .oif = rt->rt_oif, 2004 - .iif = rt->rt_iif, 2005 - .mark = rt->rt_mark, 2006 - }; 2007 - if (ipmr_fib_lookup(net, &fl, &mrt) < 0) 2008 - goto drop; 2009 - } 2001 + mrt = ipmr_rt_fib_lookup(net, skb_rtable(skb)); 2002 + if (IS_ERR(mrt)) 2003 + goto drop; 2010 2004 if (__pim_rcv(mrt, skb, sizeof(*pim))) { 2011 2005 drop: 2012 2006 kfree_skb(skb);