Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: pass net_device argument to the eth_get_headlen

Update all users of eth_get_headlen to pass network device, fetch
network namespace from it and pass it down to the flow dissector.
This commit is a noop until administrator inserts BPF flow dissector
program.

Cc: Maxim Krasnyansky <maxk@qti.qualcomm.com>
Cc: Saeed Mahameed <saeedm@mellanox.com>
Cc: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Cc: intel-wired-lan@lists.osuosl.org
Cc: Yisen Zhuang <yisen.zhuang@huawei.com>
Cc: Salil Mehta <salil.mehta@huawei.com>
Cc: Michael Chan <michael.chan@broadcom.com>
Cc: Igor Russkikh <igor.russkikh@aquantia.com>
Signed-off-by: Stanislav Fomichev <sdf@google.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>

authored by

Stanislav Fomichev and committed by
Daniel Borkmann
c43f1255 9b52e3f2

+22 -17
+2 -1
drivers/net/ethernet/aquantia/atlantic/aq_ring.c
··· 354 354 355 355 hdr_len = buff->len; 356 356 if (hdr_len > AQ_CFG_RX_HDR_SIZE) 357 - hdr_len = eth_get_headlen(aq_buf_vaddr(&buff->rxdata), 357 + hdr_len = eth_get_headlen(skb->dev, 358 + aq_buf_vaddr(&buff->rxdata), 358 359 AQ_CFG_RX_HDR_SIZE); 359 360 360 361 memcpy(__skb_put(skb, hdr_len), aq_buf_vaddr(&buff->rxdata),
+1 -1
drivers/net/ethernet/broadcom/bnxt/bnxt.c
··· 899 899 DMA_ATTR_WEAK_ORDERING); 900 900 901 901 if (unlikely(!payload)) 902 - payload = eth_get_headlen(data_ptr, len); 902 + payload = eth_get_headlen(bp->dev, data_ptr, len); 903 903 904 904 skb = napi_alloc_skb(&rxr->bnapi->napi, payload); 905 905 if (!skb) {
+1 -1
drivers/net/ethernet/hisilicon/hns/hns_enet.c
··· 598 598 } else { 599 599 ring->stats.seg_pkt_cnt++; 600 600 601 - pull_len = eth_get_headlen(va, HNS_RX_HEAD_SIZE); 601 + pull_len = eth_get_headlen(ndev, va, HNS_RX_HEAD_SIZE); 602 602 memcpy(__skb_put(skb, pull_len), va, 603 603 ALIGN(pull_len, sizeof(long))); 604 604
+1 -1
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
··· 2580 2580 ring->stats.seg_pkt_cnt++; 2581 2581 u64_stats_update_end(&ring->syncp); 2582 2582 2583 - ring->pull_len = eth_get_headlen(va, HNS3_RX_HEAD_SIZE); 2583 + ring->pull_len = eth_get_headlen(netdev, va, HNS3_RX_HEAD_SIZE); 2584 2584 __skb_put(skb, ring->pull_len); 2585 2585 hns3_nic_reuse_page(skb, ring->frag_num++, ring, ring->pull_len, 2586 2586 desc_cb);
+1 -1
drivers/net/ethernet/intel/fm10k/fm10k_main.c
··· 280 280 /* we need the header to contain the greater of either ETH_HLEN or 281 281 * 60 bytes if the skb->len is less than 60 for skb_pad. 282 282 */ 283 - pull_len = eth_get_headlen(va, FM10K_RX_HDR_LEN); 283 + pull_len = eth_get_headlen(skb->dev, va, FM10K_RX_HDR_LEN); 284 284 285 285 /* align pull length to size of long to optimize memcpy performance */ 286 286 memcpy(__skb_put(skb, pull_len), va, ALIGN(pull_len, sizeof(long)));
+2 -1
drivers/net/ethernet/intel/i40e/i40e_txrx.c
··· 2035 2035 /* Determine available headroom for copy */ 2036 2036 headlen = size; 2037 2037 if (headlen > I40E_RX_HDR_SIZE) 2038 - headlen = eth_get_headlen(xdp->data, I40E_RX_HDR_SIZE); 2038 + headlen = eth_get_headlen(skb->dev, xdp->data, 2039 + I40E_RX_HDR_SIZE); 2039 2040 2040 2041 /* align pull length to size of long to optimize memcpy performance */ 2041 2042 memcpy(__skb_put(skb, headlen), xdp->data,
+1 -1
drivers/net/ethernet/intel/iavf/iavf_txrx.c
··· 1315 1315 /* Determine available headroom for copy */ 1316 1316 headlen = size; 1317 1317 if (headlen > IAVF_RX_HDR_SIZE) 1318 - headlen = eth_get_headlen(va, IAVF_RX_HDR_SIZE); 1318 + headlen = eth_get_headlen(skb->dev, va, IAVF_RX_HDR_SIZE); 1319 1319 1320 1320 /* align pull length to size of long to optimize memcpy performance */ 1321 1321 memcpy(__skb_put(skb, headlen), va, ALIGN(headlen, sizeof(long)));
+1 -1
drivers/net/ethernet/intel/ice/ice_txrx.c
··· 699 699 /* Determine available headroom for copy */ 700 700 headlen = size; 701 701 if (headlen > ICE_RX_HDR_SIZE) 702 - headlen = eth_get_headlen(va, ICE_RX_HDR_SIZE); 702 + headlen = eth_get_headlen(skb->dev, va, ICE_RX_HDR_SIZE); 703 703 704 704 /* align pull length to size of long to optimize memcpy performance */ 705 705 memcpy(__skb_put(skb, headlen), va, ALIGN(headlen, sizeof(long)));
+1 -1
drivers/net/ethernet/intel/igb/igb_main.c
··· 8051 8051 /* Determine available headroom for copy */ 8052 8052 headlen = size; 8053 8053 if (headlen > IGB_RX_HDR_LEN) 8054 - headlen = eth_get_headlen(va, IGB_RX_HDR_LEN); 8054 + headlen = eth_get_headlen(skb->dev, va, IGB_RX_HDR_LEN); 8055 8055 8056 8056 /* align pull length to size of long to optimize memcpy performance */ 8057 8057 memcpy(__skb_put(skb, headlen), va, ALIGN(headlen, sizeof(long)));
+1 -1
drivers/net/ethernet/intel/igc/igc_main.c
··· 1199 1199 /* Determine available headroom for copy */ 1200 1200 headlen = size; 1201 1201 if (headlen > IGC_RX_HDR_LEN) 1202 - headlen = eth_get_headlen(va, IGC_RX_HDR_LEN); 1202 + headlen = eth_get_headlen(skb->dev, va, IGC_RX_HDR_LEN); 1203 1203 1204 1204 /* align pull length to size of long to optimize memcpy performance */ 1205 1205 memcpy(__skb_put(skb, headlen), va, ALIGN(headlen, sizeof(long)));
+1 -1
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
··· 1800 1800 * we need the header to contain the greater of either ETH_HLEN or 1801 1801 * 60 bytes if the skb->len is less than 60 for skb_pad. 1802 1802 */ 1803 - pull_len = eth_get_headlen(va, IXGBE_RX_HDR_SIZE); 1803 + pull_len = eth_get_headlen(skb->dev, va, IXGBE_RX_HDR_SIZE); 1804 1804 1805 1805 /* align pull length to size of long to optimize memcpy performance */ 1806 1806 skb_copy_to_linear_data(skb, va, ALIGN(pull_len, sizeof(long)));
+2 -1
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
··· 895 895 /* Determine available headroom for copy */ 896 896 headlen = size; 897 897 if (headlen > IXGBEVF_RX_HDR_SIZE) 898 - headlen = eth_get_headlen(xdp->data, IXGBEVF_RX_HDR_SIZE); 898 + headlen = eth_get_headlen(skb->dev, xdp->data, 899 + IXGBEVF_RX_HDR_SIZE); 899 900 900 901 /* align pull length to size of long to optimize memcpy performance */ 901 902 memcpy(__skb_put(skb, headlen), xdp->data,
+1 -1
drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
··· 163 163 case MLX5_INLINE_MODE_NONE: 164 164 return 0; 165 165 case MLX5_INLINE_MODE_TCP_UDP: 166 - hlen = eth_get_headlen(skb->data, skb_headlen(skb)); 166 + hlen = eth_get_headlen(skb->dev, skb->data, skb_headlen(skb)); 167 167 if (hlen == ETH_HLEN && !skb_vlan_tag_present(skb)) 168 168 hlen += VLAN_HLEN; 169 169 break;
+2 -1
drivers/net/tun.c
··· 1965 1965 1966 1966 if (frags) { 1967 1967 /* Exercise flow dissector code path. */ 1968 - u32 headlen = eth_get_headlen(skb->data, skb_headlen(skb)); 1968 + u32 headlen = eth_get_headlen(tun->dev, skb->data, 1969 + skb_headlen(skb)); 1969 1970 1970 1971 if (unlikely(headlen > skb_headlen(skb))) { 1971 1972 this_cpu_inc(tun->pcpu_stats->rx_dropped);
+1 -1
include/linux/etherdevice.h
··· 33 33 int eth_platform_get_mac_address(struct device *dev, u8 *mac_addr); 34 34 unsigned char *arch_get_platform_mac_address(void); 35 35 int nvmem_get_mac_address(struct device *dev, void *addrbuf); 36 - u32 eth_get_headlen(void *data, unsigned int max_len); 36 + u32 eth_get_headlen(const struct net_device *dev, void *data, unsigned int len); 37 37 __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev); 38 38 extern const struct header_ops eth_header_ops; 39 39
+3 -2
net/ethernet/eth.c
··· 119 119 120 120 /** 121 121 * eth_get_headlen - determine the length of header for an ethernet frame 122 + * @dev: pointer to network device 122 123 * @data: pointer to start of frame 123 124 * @len: total length of frame 124 125 * 125 126 * Make a best effort attempt to pull the length for all of the headers for 126 127 * a given frame in a linear buffer. 127 128 */ 128 - u32 eth_get_headlen(void *data, unsigned int len) 129 + u32 eth_get_headlen(const struct net_device *dev, void *data, unsigned int len) 129 130 { 130 131 const unsigned int flags = FLOW_DISSECTOR_F_PARSE_1ST_FRAG; 131 132 const struct ethhdr *eth = (const struct ethhdr *)data; ··· 137 136 return len; 138 137 139 138 /* parse any remaining L2/L3 headers, check for L4 */ 140 - if (!skb_flow_dissect_flow_keys_basic(NULL, NULL, &keys, data, 139 + if (!skb_flow_dissect_flow_keys_basic(dev_net(dev), NULL, &keys, data, 141 140 eth->h_proto, sizeof(*eth), 142 141 len, flags)) 143 142 return max_t(u32, keys.control.thoff, sizeof(*eth));