|
@@ -1685,12 +1685,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;
|
|
@@ -1713,24 +1710,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. */
|
|
@@ -1739,9 +1733,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;
|
|
|
}
|