[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 09/50] e1000e: Always copy ethernet header
|
From: |
Jason Wang |
|
Subject: |
[PULL 09/50] e1000e: Always copy ethernet header |
|
Date: |
Tue, 23 May 2023 15:31:57 +0800 |
From: Akihiko Odaki <akihiko.odaki@daynix.com>
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>
Signed-off-by: Jason Wang <jasowang@redhat.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 c2d864a..14b94db 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.7.4
- [PULL 00/50] Net patches, Jason Wang, 2023/05/23
- [PULL 02/50] hw/net/net_tx_pkt: Decouple implementation from PCI, Jason Wang, 2023/05/23
- [PULL 01/50] e1000e: Fix tx/rx counters, Jason Wang, 2023/05/23
- [PULL 05/50] igb: Fix Rx packet type encoding, Jason Wang, 2023/05/23
- [PULL 03/50] hw/net/net_tx_pkt: Decouple interface from PCI, Jason Wang, 2023/05/23
- [PULL 04/50] e1000x: Fix BPRC and MPRC, Jason Wang, 2023/05/23
- [PULL 06/50] igb: Do not require CTRL.VME for tx VLAN tagging, Jason Wang, 2023/05/23
- [PULL 07/50] igb: Clear IMS bits when committing ICR access, Jason Wang, 2023/05/23
- [PULL 08/50] net/net_rx_pkt: Use iovec for net_rx_pkt_set_protocols(), Jason Wang, 2023/05/23
- [PULL 09/50] e1000e: Always copy ethernet header,
Jason Wang <=
- [PULL 10/50] igb: Always copy ethernet header, Jason Wang, 2023/05/23
- [PULL 11/50] Fix references to igb Avocado test, Jason Wang, 2023/05/23
- [PULL 12/50] tests/avocado: Remove unused imports, Jason Wang, 2023/05/23
- [PULL 13/50] tests/avocado: Remove test_igb_nomsi_kvm, Jason Wang, 2023/05/23
- [PULL 14/50] hw/net/net_tx_pkt: Remove net_rx_pkt_get_l4_info, Jason Wang, 2023/05/23
- [PULL 15/50] net/eth: Rename eth_setup_vlan_headers_ex, Jason Wang, 2023/05/23
- [PULL 16/50] e1000x: Share more Rx filtering logic, Jason Wang, 2023/05/23
- [PULL 17/50] e1000x: Take CRC into consideration for size check, Jason Wang, 2023/05/23
- [PULL 18/50] e1000x: Rename TcpIpv6 into TcpIpv6Ex, Jason Wang, 2023/05/23
- [PULL 19/50] e1000e: Always log status after building rx metadata, Jason Wang, 2023/05/23