Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
The new route handling in ip_mc_finish_output() from 'net' overlapped with the new support for returning congestion notifications from BPF programs. In order to handle this I had to take the dev_loopback_xmit() calls out of the switch statement. The aquantia driver conflicts were simple overlapping changes. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@ -327,18 +327,35 @@ static int ip_finish_output(struct net *net, struct sock *sk, struct sk_buff *sk
|
||||
static int ip_mc_finish_output(struct net *net, struct sock *sk,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
int ret;
|
||||
struct rtable *new_rt;
|
||||
bool do_cn = false;
|
||||
int ret, err;
|
||||
|
||||
ret = BPF_CGROUP_RUN_PROG_INET_EGRESS(sk, skb);
|
||||
switch (ret) {
|
||||
case NET_XMIT_SUCCESS:
|
||||
return dev_loopback_xmit(net, sk, skb);
|
||||
case NET_XMIT_CN:
|
||||
return dev_loopback_xmit(net, sk, skb) ? : ret;
|
||||
do_cn = true;
|
||||
/* fall through */
|
||||
case NET_XMIT_SUCCESS:
|
||||
break;
|
||||
default:
|
||||
kfree_skb(skb);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Reset rt_iif so that inet_iif() will return skb->skb_iif. Setting
|
||||
* this to non-zero causes ipi_ifindex in in_pktinfo to be overwritten,
|
||||
* see ipv4_pktinfo_prepare().
|
||||
*/
|
||||
new_rt = rt_dst_clone(net->loopback_dev, skb_rtable(skb));
|
||||
if (new_rt) {
|
||||
new_rt->rt_iif = 0;
|
||||
skb_dst_drop(skb);
|
||||
skb_dst_set(skb, &new_rt->dst);
|
||||
}
|
||||
|
||||
err = dev_loopback_xmit(net, sk, skb);
|
||||
return (do_cn && err) ? ret : err;
|
||||
}
|
||||
|
||||
int ip_mc_output(struct net *net, struct sock *sk, struct sk_buff *skb)
|
||||
|
@ -197,7 +197,7 @@ static int raw_v4_input(struct sk_buff *skb, const struct iphdr *iph, int hash)
|
||||
}
|
||||
sk = __raw_v4_lookup(net, sk_next(sk), iph->protocol,
|
||||
iph->saddr, iph->daddr,
|
||||
skb->dev->ifindex, sdif);
|
||||
dif, sdif);
|
||||
}
|
||||
out:
|
||||
read_unlock(&raw_v4_hashinfo.lock);
|
||||
|
@ -1648,6 +1648,39 @@ struct rtable *rt_dst_alloc(struct net_device *dev,
|
||||
}
|
||||
EXPORT_SYMBOL(rt_dst_alloc);
|
||||
|
||||
struct rtable *rt_dst_clone(struct net_device *dev, struct rtable *rt)
|
||||
{
|
||||
struct rtable *new_rt;
|
||||
|
||||
new_rt = dst_alloc(&ipv4_dst_ops, dev, 1, DST_OBSOLETE_FORCE_CHK,
|
||||
rt->dst.flags);
|
||||
|
||||
if (new_rt) {
|
||||
new_rt->rt_genid = rt_genid_ipv4(dev_net(dev));
|
||||
new_rt->rt_flags = rt->rt_flags;
|
||||
new_rt->rt_type = rt->rt_type;
|
||||
new_rt->rt_is_input = rt->rt_is_input;
|
||||
new_rt->rt_iif = rt->rt_iif;
|
||||
new_rt->rt_pmtu = rt->rt_pmtu;
|
||||
new_rt->rt_mtu_locked = rt->rt_mtu_locked;
|
||||
new_rt->rt_gw_family = rt->rt_gw_family;
|
||||
if (rt->rt_gw_family == AF_INET)
|
||||
new_rt->rt_gw4 = rt->rt_gw4;
|
||||
else if (rt->rt_gw_family == AF_INET6)
|
||||
new_rt->rt_gw6 = rt->rt_gw6;
|
||||
INIT_LIST_HEAD(&new_rt->rt_uncached);
|
||||
|
||||
new_rt->dst.flags |= DST_HOST;
|
||||
new_rt->dst.input = rt->dst.input;
|
||||
new_rt->dst.output = rt->dst.output;
|
||||
new_rt->dst.error = rt->dst.error;
|
||||
new_rt->dst.lastuse = jiffies;
|
||||
new_rt->dst.lwtstate = lwtstate_get(rt->dst.lwtstate);
|
||||
}
|
||||
return new_rt;
|
||||
}
|
||||
EXPORT_SYMBOL(rt_dst_clone);
|
||||
|
||||
/* called in rcu_read_lock() section */
|
||||
int ip_mc_validate_source(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
||||
u8 tos, struct net_device *dev,
|
||||
|
Reference in New Issue
Block a user