From: David S. Miller Date: Fri, 28 Jun 2019 04:06:39 +0000 (-0700) Subject: Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=d96ff269a04be286989ead13bf8b4be55bdee8ee;p=openwrt%2Fstaging%2Fblogic.git Merge git://git./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 --- d96ff269a04be286989ead13bf8b4be55bdee8ee diff --cc drivers/net/ethernet/aquantia/atlantic/aq_nic.c index 746f85e6de13,41172fbebddd..e1392766e21e --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c @@@ -126,8 -126,7 +126,9 @@@ void aq_nic_cfg_start(struct aq_nic_s * cfg->link_speed_msk &= cfg->aq_hw_caps->link_speed_msk; cfg->features = cfg->aq_hw_caps->hw_features; + cfg->is_vlan_rx_strip = !!(cfg->features & NETIF_F_HW_VLAN_CTAG_RX); + cfg->is_vlan_tx_insert = !!(cfg->features & NETIF_F_HW_VLAN_CTAG_TX); + cfg->is_vlan_force_promisc = true; } static int aq_nic_update_link_status(struct aq_nic_s *self) diff --cc drivers/net/ethernet/aquantia/atlantic/aq_nic.h index 26c72f298684,0f22f5d5691b..255b54a6ae07 --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h @@@ -35,8 -35,7 +35,9 @@@ struct aq_nic_cfg_s u32 flow_control; u32 link_speed_msk; u32 wol; + u8 is_vlan_rx_strip; + u8 is_vlan_tx_insert; + bool is_vlan_force_promisc; u16 is_mc_list_enabled; u16 mc_list_count; bool is_autoneg; diff --cc net/ipv4/ip_output.c index cdd6c3418b9e,8c2ec35b6512..cc7ef0d05bbd --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c @@@ -327,18 -318,27 +327,35 @@@ static int ip_finish_output(struct net static int ip_mc_finish_output(struct net *net, struct sock *sk, struct sk_buff *skb) { - int ret; + struct rtable *new_rt; - int ret; ++ bool do_cn = false; ++ int ret, err; ret = BPF_CGROUP_RUN_PROG_INET_EGRESS(sk, skb); - if (ret) { + 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); + } + - return dev_loopback_xmit(net, sk, skb); ++ 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)