* [PATCH v7 1/9] hw/net: e1000: Remove the logic of padding short frames in the receive path
2023-06-25 1:53 [PATCH v7 0/9] net: Pad short frames for network backends Bin Meng
@ 2023-06-25 1:53 ` Bin Meng
2023-06-25 1:53 ` [PATCH v7 2/9] hw/net: vmxnet3: " Bin Meng
` (8 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Bin Meng @ 2023-06-25 1:53 UTC (permalink / raw)
To: Jason Wang, Philippe Mathieu-Daudé, Peter Maydell,
qemu-devel
Now that we have implemented unified short frames padding in the
QEMU networking codes, remove the same logic in the NIC codes.
This actually reverts commit 78aeb23eded2d0b765bf9145c71f80025b568acd.
Signed-off-by: Bin Meng <bmeng@tinylab.org>
---
(no changes since v1)
hw/net/e1000.c | 11 +----------
1 file changed, 1 insertion(+), 10 deletions(-)
diff --git a/hw/net/e1000.c b/hw/net/e1000.c
index aae5f0bdc0..093c2d4531 100644
--- a/hw/net/e1000.c
+++ b/hw/net/e1000.c
@@ -888,7 +888,6 @@ e1000_receive_iov(NetClientState *nc, const struct iovec *iov, int iovcnt)
uint16_t vlan_special = 0;
uint8_t vlan_status = 0;
uint8_t min_buf[ETH_ZLEN];
- struct iovec min_iov;
uint8_t *filter_buf = iov->iov_base;
size_t size = iov_size(iov, iovcnt);
size_t iov_ofs = 0;
@@ -905,15 +904,7 @@ e1000_receive_iov(NetClientState *nc, const struct iovec *iov, int iovcnt)
return 0;
}
- /* Pad to minimum Ethernet frame length */
- if (size < sizeof(min_buf)) {
- iov_to_buf(iov, iovcnt, 0, min_buf, size);
- memset(&min_buf[size], 0, sizeof(min_buf) - size);
- min_iov.iov_base = filter_buf = min_buf;
- min_iov.iov_len = size = sizeof(min_buf);
- iovcnt = 1;
- iov = &min_iov;
- } else if (iov->iov_len < MAXIMUM_ETHERNET_HDR_LEN) {
+ if (iov->iov_len < MAXIMUM_ETHERNET_HDR_LEN) {
/* This is very unlikely, but may happen. */
iov_to_buf(iov, iovcnt, 0, min_buf, MAXIMUM_ETHERNET_HDR_LEN);
filter_buf = min_buf;
--
2.34.1
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH v7 2/9] hw/net: vmxnet3: Remove the logic of padding short frames in the receive path
2023-06-25 1:53 [PATCH v7 0/9] net: Pad short frames for network backends Bin Meng
2023-06-25 1:53 ` [PATCH v7 1/9] hw/net: e1000: Remove the logic of padding short frames in the receive path Bin Meng
@ 2023-06-25 1:53 ` Bin Meng
2023-06-25 1:53 ` [PATCH v7 3/9] hw/net: i82596: " Bin Meng
` (7 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Bin Meng @ 2023-06-25 1:53 UTC (permalink / raw)
To: Jason Wang, Philippe Mathieu-Daudé, Peter Maydell,
qemu-devel
Cc: Dmitry Fleytman
Now that we have implemented unified short frames padding in the
QEMU networking codes, remove the same logic in the NIC codes.
This actually reverts commit 40a87c6c9b11ef9c14e0301f76abf0eb2582f08e.
Signed-off-by: Bin Meng <bmeng@tinylab.org>
---
(no changes since v1)
hw/net/vmxnet3.c | 10 ----------
1 file changed, 10 deletions(-)
diff --git a/hw/net/vmxnet3.c b/hw/net/vmxnet3.c
index 18b9edfdb2..5dfacb1098 100644
--- a/hw/net/vmxnet3.c
+++ b/hw/net/vmxnet3.c
@@ -40,7 +40,6 @@
#define PCI_DEVICE_ID_VMWARE_VMXNET3_REVISION 0x1
#define VMXNET3_MSIX_BAR_SIZE 0x2000
-#define MIN_BUF_SIZE 60
/* Compatibility flags for migration */
#define VMXNET3_COMPAT_FLAG_OLD_MSI_OFFSETS_BIT 0
@@ -1977,7 +1976,6 @@ vmxnet3_receive(NetClientState *nc, const uint8_t *buf, size_t size)
{
VMXNET3State *s = qemu_get_nic_opaque(nc);
size_t bytes_indicated;
- uint8_t min_buf[MIN_BUF_SIZE];
if (!vmxnet3_can_receive(nc)) {
VMW_PKPRN("Cannot receive now");
@@ -1990,14 +1988,6 @@ vmxnet3_receive(NetClientState *nc, const uint8_t *buf, size_t size)
size -= sizeof(struct virtio_net_hdr);
}
- /* Pad to minimum Ethernet frame length */
- if (size < sizeof(min_buf)) {
- memcpy(min_buf, buf, size);
- memset(&min_buf[size], 0, sizeof(min_buf) - size);
- buf = min_buf;
- size = sizeof(min_buf);
- }
-
net_rx_pkt_set_packet_type(s->rx_pkt,
get_eth_packet_type(PKT_GET_ETH_HDR(buf)));
--
2.34.1
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH v7 3/9] hw/net: i82596: Remove the logic of padding short frames in the receive path
2023-06-25 1:53 [PATCH v7 0/9] net: Pad short frames for network backends Bin Meng
2023-06-25 1:53 ` [PATCH v7 1/9] hw/net: e1000: Remove the logic of padding short frames in the receive path Bin Meng
2023-06-25 1:53 ` [PATCH v7 2/9] hw/net: vmxnet3: " Bin Meng
@ 2023-06-25 1:53 ` Bin Meng
2023-06-25 1:53 ` [PATCH v7 4/9] hw/net: ne2000: " Bin Meng
` (6 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Bin Meng @ 2023-06-25 1:53 UTC (permalink / raw)
To: Jason Wang, Philippe Mathieu-Daudé, Peter Maydell,
qemu-devel
Cc: Helge Deller, Richard Henderson
Now that we have implemented unified short frames padding in the
QEMU networking codes, remove the same logic in the NIC codes.
Signed-off-by: Bin Meng <bmeng@tinylab.org>
---
(no changes since v1)
hw/net/i82596.c | 18 ------------------
1 file changed, 18 deletions(-)
diff --git a/hw/net/i82596.c b/hw/net/i82596.c
index ec21e2699a..ab26f8bea1 100644
--- a/hw/net/i82596.c
+++ b/hw/net/i82596.c
@@ -72,10 +72,6 @@ enum commands {
#define I596_EOF 0x8000
#define SIZE_MASK 0x3fff
-#define ETHER_TYPE_LEN 2
-#define VLAN_TCI_LEN 2
-#define VLAN_HLEN (ETHER_TYPE_LEN + VLAN_TCI_LEN)
-
/* various flags in the chip config registers */
#define I596_PREFETCH (s->config[0] & 0x80)
#define I596_PROMISC (s->config[8] & 0x01)
@@ -488,8 +484,6 @@ bool i82596_can_receive(NetClientState *nc)
return true;
}
-#define MIN_BUF_SIZE 60
-
ssize_t i82596_receive(NetClientState *nc, const uint8_t *buf, size_t sz)
{
I82596State *s = qemu_get_nic_opaque(nc);
@@ -500,7 +494,6 @@ ssize_t i82596_receive(NetClientState *nc, const uint8_t *buf, size_t sz)
size_t bufsz = sz; /* length of data in buf */
uint32_t crc;
uint8_t *crc_ptr;
- uint8_t buf1[MIN_BUF_SIZE + VLAN_HLEN];
static const uint8_t broadcast_macaddr[6] = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
@@ -583,17 +576,6 @@ ssize_t i82596_receive(NetClientState *nc, const uint8_t *buf, size_t sz)
}
}
- /* if too small buffer, then expand it */
- if (len < MIN_BUF_SIZE + VLAN_HLEN) {
- memcpy(buf1, buf, len);
- memset(buf1 + len, 0, MIN_BUF_SIZE + VLAN_HLEN - len);
- buf = buf1;
- if (len < MIN_BUF_SIZE) {
- len = MIN_BUF_SIZE;
- }
- bufsz = len;
- }
-
/* Calculate the ethernet checksum (4 bytes) */
len += 4;
crc = cpu_to_be32(crc32(~0, buf, sz));
--
2.34.1
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH v7 4/9] hw/net: ne2000: Remove the logic of padding short frames in the receive path
2023-06-25 1:53 [PATCH v7 0/9] net: Pad short frames for network backends Bin Meng
` (2 preceding siblings ...)
2023-06-25 1:53 ` [PATCH v7 3/9] hw/net: i82596: " Bin Meng
@ 2023-06-25 1:53 ` Bin Meng
2023-06-25 1:53 ` [PATCH v7 5/9] hw/net: pcnet: " Bin Meng
` (5 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Bin Meng @ 2023-06-25 1:53 UTC (permalink / raw)
To: Jason Wang, Philippe Mathieu-Daudé, Peter Maydell,
qemu-devel
Now that we have implemented unified short frames padding in the
QEMU networking codes, remove the same logic in the NIC codes.
Signed-off-by: Bin Meng <bmeng@tinylab.org>
---
(no changes since v1)
hw/net/ne2000.c | 12 ------------
1 file changed, 12 deletions(-)
diff --git a/hw/net/ne2000.c b/hw/net/ne2000.c
index 3f31d04efb..d79c884d50 100644
--- a/hw/net/ne2000.c
+++ b/hw/net/ne2000.c
@@ -167,15 +167,12 @@ static int ne2000_buffer_full(NE2000State *s)
return 0;
}
-#define MIN_BUF_SIZE 60
-
ssize_t ne2000_receive(NetClientState *nc, const uint8_t *buf, size_t size_)
{
NE2000State *s = qemu_get_nic_opaque(nc);
size_t size = size_;
uint8_t *p;
unsigned int total_len, next, avail, len, index, mcast_idx;
- uint8_t buf1[60];
static const uint8_t broadcast_macaddr[6] =
{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
@@ -213,15 +210,6 @@ ssize_t ne2000_receive(NetClientState *nc, const uint8_t *buf, size_t size_)
}
}
-
- /* if too small buffer, then expand it */
- if (size < MIN_BUF_SIZE) {
- memcpy(buf1, buf, size);
- memset(buf1 + size, 0, MIN_BUF_SIZE - size);
- buf = buf1;
- size = MIN_BUF_SIZE;
- }
-
index = s->curpag << 8;
if (index >= NE2000_PMEM_END) {
index = s->start;
--
2.34.1
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH v7 5/9] hw/net: pcnet: Remove the logic of padding short frames in the receive path
2023-06-25 1:53 [PATCH v7 0/9] net: Pad short frames for network backends Bin Meng
` (3 preceding siblings ...)
2023-06-25 1:53 ` [PATCH v7 4/9] hw/net: ne2000: " Bin Meng
@ 2023-06-25 1:53 ` Bin Meng
2023-06-25 1:53 ` [PATCH v7 6/9] hw/net: rtl8139: " Bin Meng
` (4 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Bin Meng @ 2023-06-25 1:53 UTC (permalink / raw)
To: Jason Wang, Philippe Mathieu-Daudé, Peter Maydell,
qemu-devel
Now that we have implemented unified short frames padding in the
QEMU networking codes, remove the same logic in the NIC codes.
Signed-off-by: Bin Meng <bmeng@tinylab.org>
---
(no changes since v1)
hw/net/pcnet.c | 9 ---------
1 file changed, 9 deletions(-)
diff --git a/hw/net/pcnet.c b/hw/net/pcnet.c
index d456094575..02828ae716 100644
--- a/hw/net/pcnet.c
+++ b/hw/net/pcnet.c
@@ -987,7 +987,6 @@ ssize_t pcnet_receive(NetClientState *nc, const uint8_t *buf, size_t size_)
{
PCNetState *s = qemu_get_nic_opaque(nc);
int is_padr = 0, is_bcast = 0, is_ladr = 0;
- uint8_t buf1[60];
int remaining;
int crc_err = 0;
size_t size = size_;
@@ -1000,14 +999,6 @@ ssize_t pcnet_receive(NetClientState *nc, const uint8_t *buf, size_t size_)
printf("pcnet_receive size=%zu\n", size);
#endif
- /* if too small buffer, then expand it */
- if (size < MIN_BUF_SIZE) {
- memcpy(buf1, buf, size);
- memset(buf1 + size, 0, MIN_BUF_SIZE - size);
- buf = buf1;
- size = MIN_BUF_SIZE;
- }
-
if (CSR_PROM(s)
|| (is_padr=padr_match(s, buf, size))
|| (is_bcast=padr_bcast(s, buf, size))
--
2.34.1
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH v7 6/9] hw/net: rtl8139: Remove the logic of padding short frames in the receive path
2023-06-25 1:53 [PATCH v7 0/9] net: Pad short frames for network backends Bin Meng
` (4 preceding siblings ...)
2023-06-25 1:53 ` [PATCH v7 5/9] hw/net: pcnet: " Bin Meng
@ 2023-06-25 1:53 ` Bin Meng
2023-06-25 1:53 ` [PATCH v7 7/9] hw/net: sungem: " Bin Meng
` (3 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Bin Meng @ 2023-06-25 1:53 UTC (permalink / raw)
To: Jason Wang, Philippe Mathieu-Daudé, Peter Maydell,
qemu-devel
Now that we have implemented unified short frames padding in the
QEMU networking codes, remove the same logic in the NIC codes.
Signed-off-by: Bin Meng <bmeng@tinylab.org>
---
(no changes since v1)
hw/net/rtl8139.c | 12 ------------
1 file changed, 12 deletions(-)
diff --git a/hw/net/rtl8139.c b/hw/net/rtl8139.c
index 5f1a4d359b..b4df75b2c9 100644
--- a/hw/net/rtl8139.c
+++ b/hw/net/rtl8139.c
@@ -826,7 +826,6 @@ static ssize_t rtl8139_do_receive(NetClientState *nc, const uint8_t *buf, size_t
uint32_t packet_header = 0;
- uint8_t buf1[MIN_BUF_SIZE + VLAN_HLEN];
static const uint8_t broadcast_macaddr[6] =
{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
@@ -938,17 +937,6 @@ static ssize_t rtl8139_do_receive(NetClientState *nc, const uint8_t *buf, size_t
}
}
- /* if too small buffer, then expand it
- * Include some tailroom in case a vlan tag is later removed. */
- if (size < MIN_BUF_SIZE + VLAN_HLEN) {
- memcpy(buf1, buf, size);
- memset(buf1 + size, 0, MIN_BUF_SIZE + VLAN_HLEN - size);
- buf = buf1;
- if (size < MIN_BUF_SIZE) {
- size = MIN_BUF_SIZE;
- }
- }
-
if (rtl8139_cp_receiver_enabled(s))
{
if (!rtl8139_cp_rx_valid(s)) {
--
2.34.1
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH v7 7/9] hw/net: sungem: Remove the logic of padding short frames in the receive path
2023-06-25 1:53 [PATCH v7 0/9] net: Pad short frames for network backends Bin Meng
` (5 preceding siblings ...)
2023-06-25 1:53 ` [PATCH v7 6/9] hw/net: rtl8139: " Bin Meng
@ 2023-06-25 1:53 ` Bin Meng
2023-06-25 1:53 ` [PATCH v7 8/9] hw/net: sunhme: " Bin Meng
` (2 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Bin Meng @ 2023-06-25 1:53 UTC (permalink / raw)
To: Jason Wang, Philippe Mathieu-Daudé, Peter Maydell,
qemu-devel
Now that we have implemented unified short frames padding in the
QEMU networking codes, remove the same logic in the NIC codes.
Signed-off-by: Bin Meng <bmeng@tinylab.org>
---
(no changes since v1)
hw/net/sungem.c | 14 --------------
1 file changed, 14 deletions(-)
diff --git a/hw/net/sungem.c b/hw/net/sungem.c
index eb01520790..103376c133 100644
--- a/hw/net/sungem.c
+++ b/hw/net/sungem.c
@@ -550,7 +550,6 @@ static ssize_t sungem_receive(NetClientState *nc, const uint8_t *buf,
PCIDevice *d = PCI_DEVICE(s);
uint32_t mac_crc, done, kick, max_fsize;
uint32_t fcs_size, ints, rxdma_cfg, rxmac_cfg, csum, coff;
- uint8_t smallbuf[60];
struct gem_rxd desc;
uint64_t dbase, baddr;
unsigned int rx_cond;
@@ -584,19 +583,6 @@ static ssize_t sungem_receive(NetClientState *nc, const uint8_t *buf,
return size;
}
- /* We don't drop too small frames since we get them in qemu, we pad
- * them instead. We should probably use the min frame size register
- * but I don't want to use a variable size staging buffer and I
- * know both MacOS and Linux use the default 64 anyway. We use 60
- * here to account for the non-existent FCS.
- */
- if (size < 60) {
- memcpy(smallbuf, buf, size);
- memset(&smallbuf[size], 0, 60 - size);
- buf = smallbuf;
- size = 60;
- }
-
/* Get MAC crc */
mac_crc = net_crc32_le(buf, ETH_ALEN);
--
2.34.1
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH v7 8/9] hw/net: sunhme: Remove the logic of padding short frames in the receive path
2023-06-25 1:53 [PATCH v7 0/9] net: Pad short frames for network backends Bin Meng
` (6 preceding siblings ...)
2023-06-25 1:53 ` [PATCH v7 7/9] hw/net: sungem: " Bin Meng
@ 2023-06-25 1:53 ` Bin Meng
2023-06-25 1:53 ` [PATCH v7 9/9] hw/net: ftgmac100: Drop the small packet check " Bin Meng
2023-07-02 1:35 ` [PATCH v7 0/9] net: Pad short frames for network backends Bin Meng
9 siblings, 0 replies; 13+ messages in thread
From: Bin Meng @ 2023-06-25 1:53 UTC (permalink / raw)
To: Jason Wang, Philippe Mathieu-Daudé, Peter Maydell,
qemu-devel
Now that we have implemented unified short frames padding in the
QEMU networking codes, remove the same logic in the NIC codes.
Signed-off-by: Bin Meng <bmeng@tinylab.org>
---
(no changes since v1)
hw/net/sunhme.c | 11 -----------
1 file changed, 11 deletions(-)
diff --git a/hw/net/sunhme.c b/hw/net/sunhme.c
index 1f3d8011ae..391d26fb82 100644
--- a/hw/net/sunhme.c
+++ b/hw/net/sunhme.c
@@ -714,8 +714,6 @@ static inline void sunhme_set_rx_ring_nr(SunHMEState *s, int i)
s->erxregs[HME_ERXI_RING >> 2] = ring;
}
-#define MIN_BUF_SIZE 60
-
static ssize_t sunhme_receive(NetClientState *nc, const uint8_t *buf,
size_t size)
{
@@ -724,7 +722,6 @@ static ssize_t sunhme_receive(NetClientState *nc, const uint8_t *buf,
dma_addr_t rb, addr;
uint32_t intstatus, status, buffer, buffersize, sum;
uint16_t csum;
- uint8_t buf1[60];
int nr, cr, len, rxoffset, csum_offset;
trace_sunhme_rx_incoming(size);
@@ -775,14 +772,6 @@ static ssize_t sunhme_receive(NetClientState *nc, const uint8_t *buf,
trace_sunhme_rx_filter_accept();
- /* If too small buffer, then expand it */
- if (size < MIN_BUF_SIZE) {
- memcpy(buf1, buf, size);
- memset(buf1 + size, 0, MIN_BUF_SIZE - size);
- buf = buf1;
- size = MIN_BUF_SIZE;
- }
-
rb = s->erxregs[HME_ERXI_RING >> 2] & HME_ERXI_RING_ADDR;
nr = sunhme_get_rx_ring_count(s);
cr = sunhme_get_rx_ring_nr(s);
--
2.34.1
^ permalink raw reply related [flat|nested] 13+ messages in thread* [PATCH v7 9/9] hw/net: ftgmac100: Drop the small packet check in the receive path
2023-06-25 1:53 [PATCH v7 0/9] net: Pad short frames for network backends Bin Meng
` (7 preceding siblings ...)
2023-06-25 1:53 ` [PATCH v7 8/9] hw/net: sunhme: " Bin Meng
@ 2023-06-25 1:53 ` Bin Meng
2023-06-26 6:20 ` Cédric Le Goater
2023-07-02 1:35 ` [PATCH v7 0/9] net: Pad short frames for network backends Bin Meng
9 siblings, 1 reply; 13+ messages in thread
From: Bin Meng @ 2023-06-25 1:53 UTC (permalink / raw)
To: Jason Wang, Philippe Mathieu-Daudé, Peter Maydell,
qemu-devel
Cc: Cédric Le Goater, Andrew Jeffery, Joel Stanley, qemu-arm
Now that we have implemented unified short frames padding in the
QEMU networking codes, the small packet check logic in the receive
path is no longer needed.
Suggested-by: Cédric Le Goater <clg@kaod.org>
Signed-off-by: Bin Meng <bmeng@tinylab.org>
---
Changes in v7:
- new patch: "hw/net: ftgmac100: Drop the small packet check in the receive path"
hw/net/ftgmac100.c | 8 --------
1 file changed, 8 deletions(-)
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
index d3bf14be53..702b001be2 100644
--- a/hw/net/ftgmac100.c
+++ b/hw/net/ftgmac100.c
@@ -968,14 +968,6 @@ static ssize_t ftgmac100_receive(NetClientState *nc, const uint8_t *buf,
return -1;
}
- /* TODO : Pad to minimum Ethernet frame length */
- /* handle small packets. */
- if (size < 10) {
- qemu_log_mask(LOG_GUEST_ERROR, "%s: dropped frame of %zd bytes\n",
- __func__, size);
- return size;
- }
-
if (!ftgmac100_filter(s, buf, size)) {
return size;
}
--
2.34.1
^ permalink raw reply related [flat|nested] 13+ messages in thread* Re: [PATCH v7 9/9] hw/net: ftgmac100: Drop the small packet check in the receive path
2023-06-25 1:53 ` [PATCH v7 9/9] hw/net: ftgmac100: Drop the small packet check " Bin Meng
@ 2023-06-26 6:20 ` Cédric Le Goater
0 siblings, 0 replies; 13+ messages in thread
From: Cédric Le Goater @ 2023-06-26 6:20 UTC (permalink / raw)
To: Bin Meng, Jason Wang, Philippe Mathieu-Daudé, Peter Maydell,
qemu-devel
Cc: Andrew Jeffery, Joel Stanley, qemu-arm
On 6/25/23 03:53, Bin Meng wrote:
> Now that we have implemented unified short frames padding in the
> QEMU networking codes, the small packet check logic in the receive
> path is no longer needed.
>
> Suggested-by: Cédric Le Goater <clg@kaod.org>
> Signed-off-by: Bin Meng <bmeng@tinylab.org>
Reviewed-by: Cédric Le Goater <clg@kaod.org>
Thanks Bin,
C.
>
> ---
>
> Changes in v7:
> - new patch: "hw/net: ftgmac100: Drop the small packet check in the receive path"
>
> hw/net/ftgmac100.c | 8 --------
> 1 file changed, 8 deletions(-)
>
> diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
> index d3bf14be53..702b001be2 100644
> --- a/hw/net/ftgmac100.c
> +++ b/hw/net/ftgmac100.c
> @@ -968,14 +968,6 @@ static ssize_t ftgmac100_receive(NetClientState *nc, const uint8_t *buf,
> return -1;
> }
>
> - /* TODO : Pad to minimum Ethernet frame length */
> - /* handle small packets. */
> - if (size < 10) {
> - qemu_log_mask(LOG_GUEST_ERROR, "%s: dropped frame of %zd bytes\n",
> - __func__, size);
> - return size;
> - }
> -
> if (!ftgmac100_filter(s, buf, size)) {
> return size;
> }
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v7 0/9] net: Pad short frames for network backends
2023-06-25 1:53 [PATCH v7 0/9] net: Pad short frames for network backends Bin Meng
` (8 preceding siblings ...)
2023-06-25 1:53 ` [PATCH v7 9/9] hw/net: ftgmac100: Drop the small packet check " Bin Meng
@ 2023-07-02 1:35 ` Bin Meng
2023-07-03 6:24 ` Jason Wang
9 siblings, 1 reply; 13+ messages in thread
From: Bin Meng @ 2023-07-02 1:35 UTC (permalink / raw)
To: Bin Meng
Cc: Jason Wang, Philippe Mathieu-Daudé, Peter Maydell,
qemu-devel, Andrew Jeffery, Cédric Le Goater,
Dmitry Fleytman, Helge Deller, Joel Stanley, Richard Henderson,
qemu-arm
On Sun, Jun 25, 2023 at 9:59 AM Bin Meng <bmeng@tinylab.org> wrote:
>
> The minimum Ethernet frame length is 60 bytes. For short frames with
> smaller length like ARP packets (only 42 bytes), on a real world NIC
> it can choose either padding its length to the minimum required 60
> bytes, or sending it out directly to the wire. Such behavior can be
> hardcoded or controled by a register bit. Similarly on the receive
> path, NICs can choose either dropping such short frames directly or
> handing them over to software to handle.
>
> On the other hand, for the network backends like SLiRP/TAP, they
> don't expose a way to control the short frame behavior. As of today
> they just send/receive data from/to the other end connected to them,
> which means any sized packet is acceptable. So they can send and
> receive short frames without any problem. It is observed that ARP
> packets sent from SLiRP/TAP are 42 bytes, and SLiRP/TAP just send
> these ARP packets to the other end which might be a NIC model that
> does not allow short frames to pass through.
>
> To provide better compatibility, for packets sent from QEMU network
> backends like SLiRP/TAP, we change to pad short frames before sending
> it out to the other end, if the other end does not forbid it via the
> nc->do_not_pad flag. This ensures a backend as an Ethernet sender
> does not violate the spec. But with this change, the behavior of
> dropping short frames from SLiRP/TAP interfaces in the NIC model
> cannot be emulated because it always receives a packet that is spec
> complaint. The capability of sending short frames from NIC models is
> still supported and short frames can still pass through SLiRP/TAP.
>
> This series should be able to fix the issue as reported with some
> NIC models before, that ARP requests get dropped, preventing the
> guest from becoming visible on the network. It was workarounded in
> these NIC models on the receive path, that when a short frame is
> received, it is padded up to 60 bytes.
>
> Only the first 4 patches of the v5 series [1] were applied in QEMU 6.0,
> and the reset was said to be queued for 6.1 but for some reason they
> never landed in QEMU mainline.
>
> Hopefully this series will make it for QEMU 8.1.
>
> [1] https://lore.kernel.org/qemu-devel/859cd26a-feb2-ed62-98d5-764841a468cf@redhat.com/
>
> Changes in v7:
> - new patch: "hw/net: ftgmac100: Drop the small packet check in the receive path"
>
Ping?
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: [PATCH v7 0/9] net: Pad short frames for network backends
2023-07-02 1:35 ` [PATCH v7 0/9] net: Pad short frames for network backends Bin Meng
@ 2023-07-03 6:24 ` Jason Wang
0 siblings, 0 replies; 13+ messages in thread
From: Jason Wang @ 2023-07-03 6:24 UTC (permalink / raw)
To: Bin Meng
Cc: Bin Meng, Philippe Mathieu-Daudé, Peter Maydell, qemu-devel,
Andrew Jeffery, Cédric Le Goater, Dmitry Fleytman,
Helge Deller, Joel Stanley, Richard Henderson, qemu-arm
On Sun, Jul 2, 2023 at 9:35 AM Bin Meng <bmeng.cn@gmail.com> wrote:
>
> On Sun, Jun 25, 2023 at 9:59 AM Bin Meng <bmeng@tinylab.org> wrote:
> >
> > The minimum Ethernet frame length is 60 bytes. For short frames with
> > smaller length like ARP packets (only 42 bytes), on a real world NIC
> > it can choose either padding its length to the minimum required 60
> > bytes, or sending it out directly to the wire. Such behavior can be
> > hardcoded or controled by a register bit. Similarly on the receive
> > path, NICs can choose either dropping such short frames directly or
> > handing them over to software to handle.
> >
> > On the other hand, for the network backends like SLiRP/TAP, they
> > don't expose a way to control the short frame behavior. As of today
> > they just send/receive data from/to the other end connected to them,
> > which means any sized packet is acceptable. So they can send and
> > receive short frames without any problem. It is observed that ARP
> > packets sent from SLiRP/TAP are 42 bytes, and SLiRP/TAP just send
> > these ARP packets to the other end which might be a NIC model that
> > does not allow short frames to pass through.
> >
> > To provide better compatibility, for packets sent from QEMU network
> > backends like SLiRP/TAP, we change to pad short frames before sending
> > it out to the other end, if the other end does not forbid it via the
> > nc->do_not_pad flag. This ensures a backend as an Ethernet sender
> > does not violate the spec. But with this change, the behavior of
> > dropping short frames from SLiRP/TAP interfaces in the NIC model
> > cannot be emulated because it always receives a packet that is spec
> > complaint. The capability of sending short frames from NIC models is
> > still supported and short frames can still pass through SLiRP/TAP.
> >
> > This series should be able to fix the issue as reported with some
> > NIC models before, that ARP requests get dropped, preventing the
> > guest from becoming visible on the network. It was workarounded in
> > these NIC models on the receive path, that when a short frame is
> > received, it is padded up to 60 bytes.
> >
> > Only the first 4 patches of the v5 series [1] were applied in QEMU 6.0,
> > and the reset was said to be queued for 6.1 but for some reason they
> > never landed in QEMU mainline.
> >
> > Hopefully this series will make it for QEMU 8.1.
> >
> > [1] https://lore.kernel.org/qemu-devel/859cd26a-feb2-ed62-98d5-764841a468cf@redhat.com/
> >
> > Changes in v7:
> > - new patch: "hw/net: ftgmac100: Drop the small packet check in the receive path"
> >
>
> Ping?
I've queued this series.
Thanks
>
^ permalink raw reply [flat|nested] 13+ messages in thread