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)
 
  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;
        }
 -      return dev_loopback_xmit(net, sk, skb);
+ 
+       /* 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)