--- zzzz-none-000/linux-4.19.183/net/core/dev.c 2021-03-24 10:07:39.000000000 +0000 +++ bcm63-7530ax-756/linux-4.19.183/net/core/dev.c 2023-06-28 08:54:21.000000000 +0000 @@ -101,6 +101,7 @@ #include #include #include +#include #include #include #include @@ -166,6 +167,11 @@ struct netdev_notifier_info *info); static struct napi_struct *napi_by_id(unsigned int napi_id); +#if 1 /* AVM */ +static int (*avm_recvhook)(struct sk_buff *skb); +static int (*avm_early_recvhook)(struct sk_buff *skb); +#endif + /* * The @dev_base_head list is protected by @dev_base_lock and the rtnl * semaphore. @@ -367,6 +373,20 @@ *******************************************************************************/ +#if 1 /* AVM */ +void set_avm_recvhook(int (*recvhook)(struct sk_buff *skb)) +{ + avm_recvhook = recvhook; +} +EXPORT_SYMBOL(set_avm_recvhook); + +void set_avm_early_recvhook(int (*recvhook)(struct sk_buff *skb)) +{ + avm_early_recvhook = recvhook; +} +EXPORT_SYMBOL(set_avm_early_recvhook); +#endif + /* * Add a protocol ID to the list. Now that the input handler is * smarter we can dispense with all the messy stuff that used to be @@ -3248,6 +3268,11 @@ unsigned int len; int rc; + /* At this point all offload features are handled and the skb is + * optimized for the driver. + */ + avm_pa_dev_snoop_transmit(AVM_PA_DEVINFO(dev), skb); + if (!list_empty(&ptype_all) || !list_empty(&dev->ptype_all)) dev_queue_xmit_nit(skb, dev); @@ -3491,6 +3516,7 @@ qdisc_run_end(q); rc = NET_XMIT_SUCCESS; } else { + avm_pa_mark_shaped(skb); rc = q->enqueue(skb, q, &to_free) & NET_XMIT_MASK; if (qdisc_run_begin(q)) { if (unlikely(contended)) { @@ -4465,6 +4491,9 @@ net_timestamp_check(netdev_tstamp_prequeue, skb); +#if defined(CONFIG_BCM_KF_SKB_EXT) + bcm_skbuff_handle_netif_rx_internal(skb); +#endif trace_netif_rx(skb); #ifdef CONFIG_RPS @@ -4785,6 +4814,9 @@ net_timestamp_check(!netdev_tstamp_prequeue, skb); +#if defined(CONFIG_BCM_KF_SKB_EXT) + bcm_skbuff_handle_netif_receive_skb_core(skb); +#endif trace_netif_receive_skb(skb); orig_dev = skb->dev; @@ -4797,6 +4829,12 @@ pt_prev = NULL; another_round: + +#if IS_ENABLED(CONFIG_AVM_NET_SKB_INPUT_DEV) + if (!skb->input_dev) + skb->input_dev = skb->dev; +#endif + skb->skb_iif = skb->dev->ifindex; __this_cpu_inc(softnet_data.processed); @@ -4856,6 +4894,25 @@ if (pfmemalloc && !skb_pfmemalloc_protocol(skb)) goto drop; +#ifdef CONFIG_AVM_NET_DEBUG_SKBUFF_LEAK + skb_track_funccall(skb, avm_pa_dev_receive); +#endif + + if (avm_pa_dev_receive(AVM_PA_DEVINFO(skb->dev), skb) == 0) { + ret = NET_RX_SUCCESS; + goto out; + } + +#if 1 /* AVM */ + if (avm_early_recvhook && (*avm_early_recvhook)(skb)) { + /* + * paket consumed by hook + */ + ret = NET_RX_SUCCESS; + goto out; + } +#endif + if (skb_vlan_tag_present(skb)) { if (pt_prev) { ret = deliver_skb(skb, pt_prev, orig_dev); @@ -4900,6 +4957,16 @@ type = skb->protocol; +#if 1 /* AVM */ + if (skb && avm_recvhook && (*avm_recvhook)(skb)) { + /* + * paket consumed by hook + */ + ret = NET_RX_SUCCESS; + goto out; + } +#endif + /* deliver only exact match when indicated */ if (likely(!deliver_exact)) { deliver_ptype_list_skb(skb, &pt_prev, orig_dev, type, @@ -6472,6 +6539,28 @@ } EXPORT_SYMBOL(netdev_master_upper_dev_get); +#if defined(CONFIG_BCM_KF_NETDEV_EXT) +/** + * netdev_master_upper_dev_get_nolock - Get master upper device without holding rtnl_lock + * @dev: device + * + * Find a master upper device and return pointer to it or NULL in case + * it's not there. It may return old value, when master is being updated + */ +struct net_device *bcm_netdev_master_upper_dev_get_nolock(struct net_device *dev) +{ + struct netdev_adjacent *upper; + if (list_empty(&dev->adj_list.upper)) + return NULL; + upper = list_first_entry(&dev->adj_list.upper, + struct netdev_adjacent, list); + if (likely(upper->master)) + return upper->dev; + return NULL; +} +EXPORT_SYMBOL(bcm_netdev_master_upper_dev_get_nolock); +#endif /* CONFIG_BCM_KF_NETDEV_EXT */ + /** * netdev_has_any_lower_dev - Check if device is linked to some device * @dev: device @@ -7644,7 +7733,11 @@ dev->flags = (flags & (IFF_DEBUG | IFF_NOTRAILERS | IFF_NOARP | IFF_DYNAMIC | IFF_MULTICAST | IFF_PORTSEL | +#if !defined(CONFIG_BCM_KF_MPTCP) || !defined(CONFIG_BCM_MPTCP) IFF_AUTOMEDIA)) | +#else + IFF_AUTOMEDIA | IFF_NOMULTIPATH | IFF_MPBACKUP)) | +#endif (dev->flags & (IFF_UP | IFF_VOLATILE | IFF_PROMISC | IFF_ALLMULTI)); @@ -8978,6 +9071,7 @@ dev->reg_state = NETREG_UNREGISTERED; netdev_wait_allrefs(dev); + avm_pa_dev_unregister_sync(AVM_PA_DEVINFO(dev)); /* paranoia */ BUG_ON(netdev_refcnt_read(dev)); @@ -9059,6 +9153,10 @@ storage->rx_dropped += (unsigned long)atomic_long_read(&dev->rx_dropped); storage->tx_dropped += (unsigned long)atomic_long_read(&dev->tx_dropped); storage->rx_nohandler += (unsigned long)atomic_long_read(&dev->rx_nohandler); + +#if defined(CONFIG_BCM_KF_BLOG) && defined(CONFIG_BLOG) + blog_add_dev_accelerated_stats(dev, storage); +#endif return storage; } EXPORT_SYMBOL(dev_get_stats); @@ -9177,6 +9275,7 @@ hash_init(dev->qdisc_hash); #endif dev->priv_flags = IFF_XMIT_DST_RELEASE | IFF_XMIT_DST_RELEASE_PERM; + avm_pa_dev_init(AVM_PA_DEVINFO(dev)); setup(dev); if (!dev->tx_queue_len) {