diff options
| author | Stanislav Fomichev <sdf@google.com> | 2019-04-22 11:55:48 -0400 |
|---|---|---|
| committer | Daniel Borkmann <daniel@iogearbox.net> | 2019-04-23 12:36:34 -0400 |
| commit | c43f1255b866b423d2381f77eaa2cbc64a9c49aa (patch) | |
| tree | 9bac3c053cce8c9a6ff3091f19cbd0af608adfca | |
| parent | 9b52e3f267a6835efd50ed9002d530666d16a411 (diff) | |
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>
| -rw-r--r-- | drivers/net/ethernet/aquantia/atlantic/aq_ring.c | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/hisilicon/hns/hns_enet.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/fm10k/fm10k_main.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_txrx.c | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/iavf/iavf_txrx.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_txrx.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igc/igc_main.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en_tx.c | 2 | ||||
| -rw-r--r-- | drivers/net/tun.c | 3 | ||||
| -rw-r--r-- | include/linux/etherdevice.h | 2 | ||||
| -rw-r--r-- | net/ethernet/eth.c | 5 |
16 files changed, 22 insertions, 17 deletions
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c index c64e2fb5a4f1..350e385528fd 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c | |||
| @@ -354,7 +354,8 @@ int aq_ring_rx_clean(struct aq_ring_s *self, | |||
| 354 | 354 | ||
| 355 | hdr_len = buff->len; | 355 | hdr_len = buff->len; |
| 356 | if (hdr_len > AQ_CFG_RX_HDR_SIZE) | 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 | AQ_CFG_RX_HDR_SIZE); | 359 | AQ_CFG_RX_HDR_SIZE); |
| 359 | 360 | ||
| 360 | memcpy(__skb_put(skb, hdr_len), aq_buf_vaddr(&buff->rxdata), | 361 | memcpy(__skb_put(skb, hdr_len), aq_buf_vaddr(&buff->rxdata), |
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 6528a597367b..526f36dcb204 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c | |||
| @@ -899,7 +899,7 @@ static struct sk_buff *bnxt_rx_page_skb(struct bnxt *bp, | |||
| 899 | DMA_ATTR_WEAK_ORDERING); | 899 | DMA_ATTR_WEAK_ORDERING); |
| 900 | 900 | ||
| 901 | if (unlikely(!payload)) | 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 | skb = napi_alloc_skb(&rxr->bnapi->napi, payload); | 904 | skb = napi_alloc_skb(&rxr->bnapi->napi, payload); |
| 905 | if (!skb) { | 905 | if (!skb) { |
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c index 297b95c1b3c1..65b985acae38 100644 --- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c +++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c | |||
| @@ -598,7 +598,7 @@ static int hns_nic_poll_rx_skb(struct hns_nic_ring_data *ring_data, | |||
| 598 | } else { | 598 | } else { |
| 599 | ring->stats.seg_pkt_cnt++; | 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 | memcpy(__skb_put(skb, pull_len), va, | 602 | memcpy(__skb_put(skb, pull_len), va, |
| 603 | ALIGN(pull_len, sizeof(long))); | 603 | ALIGN(pull_len, sizeof(long))); |
| 604 | 604 | ||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c index 176d4b965709..5f7b51c6ee91 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | |||
| @@ -2580,7 +2580,7 @@ static int hns3_alloc_skb(struct hns3_enet_ring *ring, int length, | |||
| 2580 | ring->stats.seg_pkt_cnt++; | 2580 | ring->stats.seg_pkt_cnt++; |
| 2581 | u64_stats_update_end(&ring->syncp); | 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 | __skb_put(skb, ring->pull_len); | 2584 | __skb_put(skb, ring->pull_len); |
| 2585 | hns3_nic_reuse_page(skb, ring->frag_num++, ring, ring->pull_len, | 2585 | hns3_nic_reuse_page(skb, ring->frag_num++, ring, ring->pull_len, |
| 2586 | desc_cb); | 2586 | desc_cb); |
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_main.c b/drivers/net/ethernet/intel/fm10k/fm10k_main.c index 2325cee76211..b4d970e44163 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k_main.c +++ b/drivers/net/ethernet/intel/fm10k/fm10k_main.c | |||
| @@ -280,7 +280,7 @@ static bool fm10k_add_rx_frag(struct fm10k_rx_buffer *rx_buffer, | |||
| 280 | /* we need the header to contain the greater of either ETH_HLEN or | 280 | /* we need the header to contain the greater of either ETH_HLEN or |
| 281 | * 60 bytes if the skb->len is less than 60 for skb_pad. | 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 | /* align pull length to size of long to optimize memcpy performance */ | 285 | /* align pull length to size of long to optimize memcpy performance */ |
| 286 | memcpy(__skb_put(skb, pull_len), va, ALIGN(pull_len, sizeof(long))); | 286 | memcpy(__skb_put(skb, pull_len), va, ALIGN(pull_len, sizeof(long))); |
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c index 1a95223c9f99..e1931701cd7e 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c | |||
| @@ -2035,7 +2035,8 @@ static struct sk_buff *i40e_construct_skb(struct i40e_ring *rx_ring, | |||
| 2035 | /* Determine available headroom for copy */ | 2035 | /* Determine available headroom for copy */ |
| 2036 | headlen = size; | 2036 | headlen = size; |
| 2037 | if (headlen > I40E_RX_HDR_SIZE) | 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 | /* align pull length to size of long to optimize memcpy performance */ | 2041 | /* align pull length to size of long to optimize memcpy performance */ |
| 2041 | memcpy(__skb_put(skb, headlen), xdp->data, | 2042 | memcpy(__skb_put(skb, headlen), xdp->data, |
diff --git a/drivers/net/ethernet/intel/iavf/iavf_txrx.c b/drivers/net/ethernet/intel/iavf/iavf_txrx.c index b64187753ad6..cf8be63a8a4f 100644 --- a/drivers/net/ethernet/intel/iavf/iavf_txrx.c +++ b/drivers/net/ethernet/intel/iavf/iavf_txrx.c | |||
| @@ -1315,7 +1315,7 @@ static struct sk_buff *iavf_construct_skb(struct iavf_ring *rx_ring, | |||
| 1315 | /* Determine available headroom for copy */ | 1315 | /* Determine available headroom for copy */ |
| 1316 | headlen = size; | 1316 | headlen = size; |
| 1317 | if (headlen > IAVF_RX_HDR_SIZE) | 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 | /* align pull length to size of long to optimize memcpy performance */ | 1320 | /* align pull length to size of long to optimize memcpy performance */ |
| 1321 | memcpy(__skb_put(skb, headlen), va, ALIGN(headlen, sizeof(long))); | 1321 | memcpy(__skb_put(skb, headlen), va, ALIGN(headlen, sizeof(long))); |
diff --git a/drivers/net/ethernet/intel/ice/ice_txrx.c b/drivers/net/ethernet/intel/ice/ice_txrx.c index 79043fec0187..259f118c7d8b 100644 --- a/drivers/net/ethernet/intel/ice/ice_txrx.c +++ b/drivers/net/ethernet/intel/ice/ice_txrx.c | |||
| @@ -699,7 +699,7 @@ ice_construct_skb(struct ice_ring *rx_ring, struct ice_rx_buf *rx_buf, | |||
| 699 | /* Determine available headroom for copy */ | 699 | /* Determine available headroom for copy */ |
| 700 | headlen = size; | 700 | headlen = size; |
| 701 | if (headlen > ICE_RX_HDR_SIZE) | 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 | /* align pull length to size of long to optimize memcpy performance */ | 704 | /* align pull length to size of long to optimize memcpy performance */ |
| 705 | memcpy(__skb_put(skb, headlen), va, ALIGN(headlen, sizeof(long))); | 705 | memcpy(__skb_put(skb, headlen), va, ALIGN(headlen, sizeof(long))); |
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index acbb5b4f333d..9b8a4bb25327 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c | |||
| @@ -8051,7 +8051,7 @@ static struct sk_buff *igb_construct_skb(struct igb_ring *rx_ring, | |||
| 8051 | /* Determine available headroom for copy */ | 8051 | /* Determine available headroom for copy */ |
| 8052 | headlen = size; | 8052 | headlen = size; |
| 8053 | if (headlen > IGB_RX_HDR_LEN) | 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 | /* align pull length to size of long to optimize memcpy performance */ | 8056 | /* align pull length to size of long to optimize memcpy performance */ |
| 8057 | memcpy(__skb_put(skb, headlen), va, ALIGN(headlen, sizeof(long))); | 8057 | memcpy(__skb_put(skb, headlen), va, ALIGN(headlen, sizeof(long))); |
diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c index f79728381e8a..e58a6e0dc4d9 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c | |||
| @@ -1199,7 +1199,7 @@ static struct sk_buff *igc_construct_skb(struct igc_ring *rx_ring, | |||
| 1199 | /* Determine available headroom for copy */ | 1199 | /* Determine available headroom for copy */ |
| 1200 | headlen = size; | 1200 | headlen = size; |
| 1201 | if (headlen > IGC_RX_HDR_LEN) | 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 | /* align pull length to size of long to optimize memcpy performance */ | 1204 | /* align pull length to size of long to optimize memcpy performance */ |
| 1205 | memcpy(__skb_put(skb, headlen), va, ALIGN(headlen, sizeof(long))); | 1205 | memcpy(__skb_put(skb, headlen), va, ALIGN(headlen, sizeof(long))); |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 60cec3540dd7..7b903206b534 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | |||
| @@ -1800,7 +1800,7 @@ static void ixgbe_pull_tail(struct ixgbe_ring *rx_ring, | |||
| 1800 | * we need the header to contain the greater of either ETH_HLEN or | 1800 | * we need the header to contain the greater of either ETH_HLEN or |
| 1801 | * 60 bytes if the skb->len is less than 60 for skb_pad. | 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 | /* align pull length to size of long to optimize memcpy performance */ | 1805 | /* align pull length to size of long to optimize memcpy performance */ |
| 1806 | skb_copy_to_linear_data(skb, va, ALIGN(pull_len, sizeof(long))); | 1806 | skb_copy_to_linear_data(skb, va, ALIGN(pull_len, sizeof(long))); |
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c index 49e23afa05a2..d189ed247665 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | |||
| @@ -895,7 +895,8 @@ struct sk_buff *ixgbevf_construct_skb(struct ixgbevf_ring *rx_ring, | |||
| 895 | /* Determine available headroom for copy */ | 895 | /* Determine available headroom for copy */ |
| 896 | headlen = size; | 896 | headlen = size; |
| 897 | if (headlen > IXGBEVF_RX_HDR_SIZE) | 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 | /* align pull length to size of long to optimize memcpy performance */ | 901 | /* align pull length to size of long to optimize memcpy performance */ |
| 901 | memcpy(__skb_put(skb, headlen), xdp->data, | 902 | memcpy(__skb_put(skb, headlen), xdp->data, |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c index 40f3f98aa279..7b61126fcec9 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c | |||
| @@ -163,7 +163,7 @@ static inline u16 mlx5e_calc_min_inline(enum mlx5_inline_modes mode, | |||
| 163 | case MLX5_INLINE_MODE_NONE: | 163 | case MLX5_INLINE_MODE_NONE: |
| 164 | return 0; | 164 | return 0; |
| 165 | case MLX5_INLINE_MODE_TCP_UDP: | 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 | if (hlen == ETH_HLEN && !skb_vlan_tag_present(skb)) | 167 | if (hlen == ETH_HLEN && !skb_vlan_tag_present(skb)) |
| 168 | hlen += VLAN_HLEN; | 168 | hlen += VLAN_HLEN; |
| 169 | break; | 169 | break; |
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 24d0220b9ba0..9d72f8c76c15 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
| @@ -1965,7 +1965,8 @@ drop: | |||
| 1965 | 1965 | ||
| 1966 | if (frags) { | 1966 | if (frags) { |
| 1967 | /* Exercise flow dissector code path. */ | 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 | if (unlikely(headlen > skb_headlen(skb))) { | 1971 | if (unlikely(headlen > skb_headlen(skb))) { |
| 1971 | this_cpu_inc(tun->pcpu_stats->rx_dropped); | 1972 | this_cpu_inc(tun->pcpu_stats->rx_dropped); |
diff --git a/include/linux/etherdevice.h b/include/linux/etherdevice.h index e2f3b21cd72a..c6c1930e28a0 100644 --- a/include/linux/etherdevice.h +++ b/include/linux/etherdevice.h | |||
| @@ -33,7 +33,7 @@ struct device; | |||
| 33 | int eth_platform_get_mac_address(struct device *dev, u8 *mac_addr); | 33 | int eth_platform_get_mac_address(struct device *dev, u8 *mac_addr); |
| 34 | unsigned char *arch_get_platform_mac_address(void); | 34 | unsigned char *arch_get_platform_mac_address(void); |
| 35 | int nvmem_get_mac_address(struct device *dev, void *addrbuf); | 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 | __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev); | 37 | __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev); |
| 38 | extern const struct header_ops eth_header_ops; | 38 | extern const struct header_ops eth_header_ops; |
| 39 | 39 | ||
diff --git a/net/ethernet/eth.c b/net/ethernet/eth.c index 1e439549c419..0f9863dc4d44 100644 --- a/net/ethernet/eth.c +++ b/net/ethernet/eth.c | |||
| @@ -119,13 +119,14 @@ EXPORT_SYMBOL(eth_header); | |||
| 119 | 119 | ||
| 120 | /** | 120 | /** |
| 121 | * eth_get_headlen - determine the length of header for an ethernet frame | 121 | * eth_get_headlen - determine the length of header for an ethernet frame |
| 122 | * @dev: pointer to network device | ||
| 122 | * @data: pointer to start of frame | 123 | * @data: pointer to start of frame |
| 123 | * @len: total length of frame | 124 | * @len: total length of frame |
| 124 | * | 125 | * |
| 125 | * Make a best effort attempt to pull the length for all of the headers for | 126 | * Make a best effort attempt to pull the length for all of the headers for |
| 126 | * a given frame in a linear buffer. | 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 | const unsigned int flags = FLOW_DISSECTOR_F_PARSE_1ST_FRAG; | 131 | const unsigned int flags = FLOW_DISSECTOR_F_PARSE_1ST_FRAG; |
| 131 | const struct ethhdr *eth = (const struct ethhdr *)data; | 132 | const struct ethhdr *eth = (const struct ethhdr *)data; |
| @@ -136,7 +137,7 @@ u32 eth_get_headlen(void *data, unsigned int len) | |||
| 136 | return len; | 137 | return len; |
| 137 | 138 | ||
| 138 | /* parse any remaining L2/L3 headers, check for L4 */ | 139 | /* parse any remaining L2/L3 headers, check for L4 */ |
| 139 | if (!skb_flow_dissect_flow_keys_basic(NULL, NULL, &keys, data, | 140 | if (!skb_flow_dissect_flow_keys_basic(dev_net(dev), NULL, &keys, data, |
| 140 | eth->h_proto, sizeof(*eth), | 141 | eth->h_proto, sizeof(*eth), |
| 141 | len, flags)) | 142 | len, flags)) |
| 142 | return max_t(u32, keys.control.thoff, sizeof(*eth)); | 143 | return max_t(u32, keys.control.thoff, sizeof(*eth)); |
