qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Ping: [PATCH v3] net/vmnet: Pad short Ethernet frames


From: William Hooper
Subject: Ping: [PATCH v3] net/vmnet: Pad short Ethernet frames
Date: Sat, 16 Nov 2024 18:08:48 -0800

On Sat, Nov 2, 2024 at 1:56 PM William Hooper <wsh@wshooper.org> wrote:
> 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 <wsh@wshooper.org>
> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2058
> Reviewed-by: Phil Dennis-Jordan <phil@philjordan.eu>
> ---
>  net/vmnet-common.m | 23 ++++++++++++++++++++---
>  1 file changed, 20 insertions(+), 3 deletions(-)
>
> diff --git a/net/vmnet-common.m b/net/vmnet-common.m
> index 30c4e53c13..4b7e330c05 100644
> --- a/net/vmnet-common.m
> +++ b/net/vmnet-common.m
> @@ -18,6 +18,7 @@
>  #include "qemu/error-report.h"
>  #include "qapi/error.h"
>  #include "sysemu/runstate.h"
> +#include "net/eth.h"
>
>  #include <vmnet/vmnet.h>
>  #include <dispatch/dispatch.h>
> @@ -147,10 +148,26 @@ static int vmnet_read_packets(VmnetState *s)
>   */
>  static void vmnet_write_packets_to_qemu(VmnetState *s)
>  {
> +    uint8_t *pkt;
> +    size_t pktsz;
> +    uint8_t min_pkt[ETH_ZLEN];
> +    size_t min_pktsz;
> +    ssize_t size;
> +
>      while (s->packets_send_current_pos < s->packets_send_end_pos) {
> -        ssize_t size = qemu_send_packet_async(&s->nc,
> -                                      
> s->iov_buf[s->packets_send_current_pos].iov_base,
> -                                      
> s->packets_buf[s->packets_send_current_pos].vm_pkt_size,
> +        pkt = s->iov_buf[s->packets_send_current_pos].iov_base;
> +        pktsz = s->packets_buf[s->packets_send_current_pos].vm_pkt_size;
> +
> +        if (net_peer_needs_padding(&s->nc)) {
> +            min_pktsz = sizeof(min_pkt);
> +
> +            if (eth_pad_short_frame(min_pkt, &min_pktsz, pkt, pktsz)) {
> +                pkt = min_pkt;
> +                pktsz = min_pktsz;
> +            }
> +        }
> +
> +        size = qemu_send_packet_async(&s->nc, pkt, pktsz,
>                                        vmnet_send_completed);
>
>          if (size == 0) {

Ping?

20241102205653.30476-1-wsh@wshooper.org/">https://patchew.org/QEMU/20241102205653.30476-1-wsh@wshooper.org/



reply via email to

[Prev in Thread] Current Thread [Next in Thread]