Loading include/linux/mroute.h +1 −0 Original line number Diff line number Diff line Loading @@ -244,6 +244,7 @@ struct mfc_cache { #ifdef __KERNEL__ struct rtmsg; extern int ipmr_get_route(struct net *net, struct sk_buff *skb, __be32 saddr, __be32 daddr, struct rtmsg *rtm, int nowait); #endif Loading net/ipv4/ipmr.c +8 −8 Original line number Diff line number Diff line Loading @@ -2041,20 +2041,20 @@ static int __ipmr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb, return -EMSGSIZE; } int ipmr_get_route(struct net *net, struct sk_buff *skb, struct rtmsg *rtm, int nowait) int ipmr_get_route(struct net *net, struct sk_buff *skb, __be32 saddr, __be32 daddr, struct rtmsg *rtm, int nowait) { int err; struct mr_table *mrt; struct mfc_cache *cache; struct rtable *rt = skb_rtable(skb); struct mr_table *mrt; int err; mrt = ipmr_get_table(net, RT_TABLE_DEFAULT); if (mrt == NULL) return -ENOENT; rcu_read_lock(); cache = ipmr_cache_find(mrt, rt->rt_src, rt->rt_dst); cache = ipmr_cache_find(mrt, saddr, daddr); if (cache == NULL) { struct sk_buff *skb2; Loading Loading @@ -2087,8 +2087,8 @@ int ipmr_get_route(struct net *net, skb_reset_network_header(skb2); iph = ip_hdr(skb2); iph->ihl = sizeof(struct iphdr) >> 2; iph->saddr = rt->rt_src; iph->daddr = rt->rt_dst; iph->saddr = saddr; iph->daddr = daddr; iph->version = 0; err = ipmr_cache_unresolved(mrt, vif, skb2); read_unlock(&mrt_lock); Loading net/ipv4/route.c +3 −1 Original line number Diff line number Diff line Loading @@ -2857,7 +2857,9 @@ static int rt_fill_info(struct net *net, if (ipv4_is_multicast(dst) && !ipv4_is_local_multicast(dst) && IPV4_DEVCONF_ALL(net, MC_FORWARDING)) { int err = ipmr_get_route(net, skb, r, nowait); int err = ipmr_get_route(net, skb, rt->rt_src, rt->rt_dst, r, nowait); if (err <= 0) { if (!nowait) { if (err == 0) Loading Loading
include/linux/mroute.h +1 −0 Original line number Diff line number Diff line Loading @@ -244,6 +244,7 @@ struct mfc_cache { #ifdef __KERNEL__ struct rtmsg; extern int ipmr_get_route(struct net *net, struct sk_buff *skb, __be32 saddr, __be32 daddr, struct rtmsg *rtm, int nowait); #endif Loading
net/ipv4/ipmr.c +8 −8 Original line number Diff line number Diff line Loading @@ -2041,20 +2041,20 @@ static int __ipmr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb, return -EMSGSIZE; } int ipmr_get_route(struct net *net, struct sk_buff *skb, struct rtmsg *rtm, int nowait) int ipmr_get_route(struct net *net, struct sk_buff *skb, __be32 saddr, __be32 daddr, struct rtmsg *rtm, int nowait) { int err; struct mr_table *mrt; struct mfc_cache *cache; struct rtable *rt = skb_rtable(skb); struct mr_table *mrt; int err; mrt = ipmr_get_table(net, RT_TABLE_DEFAULT); if (mrt == NULL) return -ENOENT; rcu_read_lock(); cache = ipmr_cache_find(mrt, rt->rt_src, rt->rt_dst); cache = ipmr_cache_find(mrt, saddr, daddr); if (cache == NULL) { struct sk_buff *skb2; Loading Loading @@ -2087,8 +2087,8 @@ int ipmr_get_route(struct net *net, skb_reset_network_header(skb2); iph = ip_hdr(skb2); iph->ihl = sizeof(struct iphdr) >> 2; iph->saddr = rt->rt_src; iph->daddr = rt->rt_dst; iph->saddr = saddr; iph->daddr = daddr; iph->version = 0; err = ipmr_cache_unresolved(mrt, vif, skb2); read_unlock(&mrt_lock); Loading
net/ipv4/route.c +3 −1 Original line number Diff line number Diff line Loading @@ -2857,7 +2857,9 @@ static int rt_fill_info(struct net *net, if (ipv4_is_multicast(dst) && !ipv4_is_local_multicast(dst) && IPV4_DEVCONF_ALL(net, MC_FORWARDING)) { int err = ipmr_get_route(net, skb, r, nowait); int err = ipmr_get_route(net, skb, rt->rt_src, rt->rt_dst, r, nowait); if (err <= 0) { if (!nowait) { if (err == 0) Loading