Skip to content

Commit 79b6a98

Browse files
WSHooperphilmd
authored andcommitted
net/vmnet: Pad short Ethernet frames
At least on macOS 12.7.2, vmnet doesn't pad Ethernet frames, such as the host's ARP replies, to the minimum size (60 bytes before the frame check sequence) defined in IEEE Std 802.3-2022, so guests' Ethernet device drivers may drop them with "frame too short" errors. This patch calls eth_pad_short_frame() to add padding, as in net/tap.c and net/slirp.c. Thanks to Bin Meng, Philippe Mathieu-Daudé, and Phil Dennis-Jordan for reviewing earlier versions. Signed-off-by: William Hooper <[email protected]> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2058 Reviewed-by: Phil Dennis-Jordan <[email protected]> Message-ID: <[email protected]> Signed-off-by: Philippe Mathieu-Daudé <[email protected]>
1 parent 67e908c commit 79b6a98

File tree

1 file changed

+20
-3
lines changed

1 file changed

+20
-3
lines changed

net/vmnet-common.m

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "qemu/error-report.h"
1919
#include "qapi/error.h"
2020
#include "system/runstate.h"
21+
#include "net/eth.h"
2122

2223
#include <vmnet/vmnet.h>
2324
#include <dispatch/dispatch.h>
@@ -147,10 +148,26 @@ static int vmnet_read_packets(VmnetState *s)
147148
*/
148149
static void vmnet_write_packets_to_qemu(VmnetState *s)
149150
{
151+
uint8_t *pkt;
152+
size_t pktsz;
153+
uint8_t min_pkt[ETH_ZLEN];
154+
size_t min_pktsz;
155+
ssize_t size;
156+
150157
while (s->packets_send_current_pos < s->packets_send_end_pos) {
151-
ssize_t size = qemu_send_packet_async(&s->nc,
152-
s->iov_buf[s->packets_send_current_pos].iov_base,
153-
s->packets_buf[s->packets_send_current_pos].vm_pkt_size,
158+
pkt = s->iov_buf[s->packets_send_current_pos].iov_base;
159+
pktsz = s->packets_buf[s->packets_send_current_pos].vm_pkt_size;
160+
161+
if (net_peer_needs_padding(&s->nc)) {
162+
min_pktsz = sizeof(min_pkt);
163+
164+
if (eth_pad_short_frame(min_pkt, &min_pktsz, pkt, pktsz)) {
165+
pkt = min_pkt;
166+
pktsz = min_pktsz;
167+
}
168+
}
169+
170+
size = qemu_send_packet_async(&s->nc, pkt, pktsz,
154171
vmnet_send_completed);
155172

156173
if (size == 0) {

0 commit comments

Comments
 (0)