--- zzzz-none-000/linux-4.4.60/net/ethernet/eth.c 2017-04-08 07:53:53.000000000 +0000 +++ scorpion-7490-727/linux-4.4.60/net/ethernet/eth.c 2021-02-04 17:41:59.000000000 +0000 @@ -140,6 +140,18 @@ } EXPORT_SYMBOL(eth_get_headlen); +static inline bool +eth_check_local_mask(const void *addr1, const void *addr2, const void *mask) +{ + const u16 *a1 = addr1; + const u16 *a2 = addr2; + const u16 *m = mask; + + return (((a1[0] ^ a2[0]) & ~m[0]) | + ((a1[1] ^ a2[1]) & ~m[1]) | + ((a1[2] ^ a2[2]) & ~m[2])); +} + /** * eth_type_trans - determine the packet's protocol ID. * @skb: received socket data @@ -156,6 +168,12 @@ const struct ethhdr *eth; skb->dev = dev; + +#ifdef CONFIG_ETHERNET_PACKET_MANGLE + if (dev->eth_mangle_rx) + dev->eth_mangle_rx(dev, skb); +#endif + skb_reset_mac_header(skb); eth = (struct ethhdr *)skb->data; @@ -168,8 +186,12 @@ skb->pkt_type = PACKET_MULTICAST; } else if (unlikely(!ether_addr_equal_64bits(eth->h_dest, - dev->dev_addr))) + dev->dev_addr))) { skb->pkt_type = PACKET_OTHERHOST; + if (eth_check_local_mask(eth->h_dest, dev->dev_addr, + dev->local_addr_mask)) + skb->gro_skip = 1; + } /* * Some variants of DSA tagging don't have an ethertype field @@ -478,8 +500,13 @@ }, }; +void (*ssdk_update_rmon_cnt_hook) + (struct avm_hw_rmon_counter *res, u32 devid, u32 port) = NULL; +EXPORT_SYMBOL(ssdk_update_rmon_cnt_hook); + static int __init eth_offload_init(void) { + ssdk_update_rmon_cnt_hook = NULL; dev_add_offload(ð_packet_offload); return 0;