[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v4 08/48] e1000e: Always copy ethernet header
From: |
Akihiko Odaki |
Subject: |
[PATCH v4 08/48] e1000e: Always copy ethernet header |
Date: |
Wed, 26 Apr 2023 19:36:36 +0900 |
e1000e_receive_internal() used to check the iov length to determine
copy the iovs to a contiguous buffer, but the check is flawed in two
ways:
- It does not ensure that iovcnt > 0.
- It does not take virtio-net header into consideration.
The size of this copy is just 18 octets, which can be even less than
the code size required for checks. This (wrong) optimization is probably
not worth so just remove it.
Fixes: 6f3fbe4ed0 ("net: Introduce e1000e device emulation")
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
---
hw/net/e1000e_core.c | 26 ++++++++++----------------
1 file changed, 10 insertions(+), 16 deletions(-)
diff --git a/hw/net/e1000e_core.c b/hw/net/e1000e_core.c
index c2d864a504..14b94db59c 100644
--- a/hw/net/e1000e_core.c
+++ b/hw/net/e1000e_core.c
@@ -1686,12 +1686,9 @@ static ssize_t
e1000e_receive_internal(E1000ECore *core, const struct iovec *iov, int iovcnt,
bool has_vnet)
{
- static const int maximum_ethernet_hdr_len = (ETH_HLEN + 4);
-
uint32_t n = 0;
- uint8_t min_buf[ETH_ZLEN];
+ uint8_t buf[ETH_ZLEN];
struct iovec min_iov;
- uint8_t *filter_buf;
size_t size, orig_size;
size_t iov_ofs = 0;
E1000E_RxRing rxr;
@@ -1714,24 +1711,21 @@ e1000e_receive_internal(E1000ECore *core, const struct
iovec *iov, int iovcnt,
net_rx_pkt_unset_vhdr(core->rx_pkt);
}
- filter_buf = iov->iov_base + iov_ofs;
orig_size = iov_size(iov, iovcnt);
size = orig_size - iov_ofs;
/* Pad to minimum Ethernet frame length */
- if (size < sizeof(min_buf)) {
- iov_to_buf(iov, iovcnt, iov_ofs, min_buf, size);
- memset(&min_buf[size], 0, sizeof(min_buf) - size);
+ if (size < sizeof(buf)) {
+ iov_to_buf(iov, iovcnt, iov_ofs, buf, size);
+ memset(&buf[size], 0, sizeof(buf) - size);
e1000x_inc_reg_if_not_full(core->mac, RUC);
- min_iov.iov_base = filter_buf = min_buf;
- min_iov.iov_len = size = sizeof(min_buf);
+ min_iov.iov_base = buf;
+ min_iov.iov_len = size = sizeof(buf);
iovcnt = 1;
iov = &min_iov;
iov_ofs = 0;
- } else if (iov->iov_len < maximum_ethernet_hdr_len) {
- /* This is very unlikely, but may happen. */
- iov_to_buf(iov, iovcnt, iov_ofs, min_buf, maximum_ethernet_hdr_len);
- filter_buf = min_buf;
+ } else {
+ iov_to_buf(iov, iovcnt, iov_ofs, buf, ETH_HLEN + 4);
}
/* Discard oversized packets if !LPE and !SBP. */
@@ -1740,9 +1734,9 @@ e1000e_receive_internal(E1000ECore *core, const struct
iovec *iov, int iovcnt,
}
net_rx_pkt_set_packet_type(core->rx_pkt,
- get_eth_packet_type(PKT_GET_ETH_HDR(filter_buf)));
+ get_eth_packet_type(PKT_GET_ETH_HDR(buf)));
- if (!e1000e_receive_filter(core, filter_buf, size)) {
+ if (!e1000e_receive_filter(core, buf, size)) {
trace_e1000e_rx_flt_dropped();
return orig_size;
}
--
2.40.0
- [PATCH v4 00/48] igb: Fix for DPDK, Akihiko Odaki, 2023/04/26
- [PATCH v4 01/48] hw/net/net_tx_pkt: Decouple implementation from PCI, Akihiko Odaki, 2023/04/26
- [PATCH v4 02/48] hw/net/net_tx_pkt: Decouple interface from PCI, Akihiko Odaki, 2023/04/26
- [PATCH v4 03/48] e1000x: Fix BPRC and MPRC, Akihiko Odaki, 2023/04/26
- [PATCH v4 04/48] igb: Fix Rx packet type encoding, Akihiko Odaki, 2023/04/26
- [PATCH v4 05/48] igb: Do not require CTRL.VME for tx VLAN tagging, Akihiko Odaki, 2023/04/26
- [PATCH v4 06/48] igb: Clear IMS bits when committing ICR access, Akihiko Odaki, 2023/04/26
- [PATCH v4 07/48] net/net_rx_pkt: Use iovec for net_rx_pkt_set_protocols(), Akihiko Odaki, 2023/04/26
- [PATCH v4 08/48] e1000e: Always copy ethernet header,
Akihiko Odaki <=
- [PATCH v4 09/48] igb: Always copy ethernet header, Akihiko Odaki, 2023/04/26
- [PATCH v4 10/48] Fix references to igb Avocado test, Akihiko Odaki, 2023/04/26
- [PATCH v4 11/48] tests/avocado: Remove unused imports, Akihiko Odaki, 2023/04/26
- [PATCH v4 12/48] tests/avocado: Remove test_igb_nomsi_kvm, Akihiko Odaki, 2023/04/26
- [PATCH v4 13/48] hw/net/net_tx_pkt: Remove net_rx_pkt_get_l4_info, Akihiko Odaki, 2023/04/26
- [PATCH v4 14/48] net/eth: Rename eth_setup_vlan_headers_ex, Akihiko Odaki, 2023/04/26
- [PATCH v4 15/48] e1000x: Share more Rx filtering logic, Akihiko Odaki, 2023/04/26
- [PATCH v4 16/48] e1000x: Take CRC into consideration for size check, Akihiko Odaki, 2023/04/26
- [PATCH v4 17/48] e1000x: Rename TcpIpv6 into TcpIpv6Ex, Akihiko Odaki, 2023/04/26
- [PATCH v4 18/48] e1000e: Always log status after building rx metadata, Akihiko Odaki, 2023/04/26