From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=42141 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OvGCY-0003ZH-EC for qemu-devel@nongnu.org; Mon, 13 Sep 2010 17:04:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OvGCV-0004st-Hn for qemu-devel@nongnu.org; Mon, 13 Sep 2010 17:04:34 -0400 Received: from smtp5-g21.free.fr ([212.27.42.5]:41267) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OvGCU-0004sB-Vk for qemu-devel@nongnu.org; Mon, 13 Sep 2010 17:04:31 -0400 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Mon, 13 Sep 2010 23:02:42 +0200 Message-Id: <1284411762-3687-1-git-send-email-hpoussin@reactos.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH] [slirp] Make ARP replies at least 64 bytes long List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Herv=C3=A9=20Poussineau?= IEEE 802.3 standard requires Ethernet frames to be at least 64 bytes long= . If it is not the case, they will be considered as runt frames, and may be= ignored by netcard and/or OS Signed-off-by: Herv=C3=A9 Poussineau --- slirp/slirp.c | 12 ++++++++---- 1 files changed, 8 insertions(+), 4 deletions(-) diff --git a/slirp/slirp.c b/slirp/slirp.c index 82fd9b4..2e8c017 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -599,9 +599,12 @@ static void arp_input(Slirp *slirp, const uint8_t *p= kt, int pkt_len) { struct ethhdr *eh =3D (struct ethhdr *)pkt; struct arphdr *ah =3D (struct arphdr *)(pkt + ETH_HLEN); - uint8_t arp_reply[ETH_HLEN + sizeof(struct arphdr)]; - struct ethhdr *reh =3D (struct ethhdr *)arp_reply; - struct arphdr *rah =3D (struct arphdr *)(arp_reply + ETH_HLEN); + union { + uint8_t data[ETH_HLEN + sizeof(struct arphdr)]; + uint8_t payload[64]; /* Minimum Ethernet frame size */ + } arp_reply; + struct ethhdr *reh =3D (struct ethhdr *)arp_reply.data; + struct arphdr *rah =3D (struct arphdr *)(arp_reply.data + ETH_HLEN); int ar_op; struct ex_list *ex_ptr; =20 @@ -619,6 +622,7 @@ static void arp_input(Slirp *slirp, const uint8_t *pk= t, int pkt_len) } return; arp_ok: + memset(&arp_reply, 0, sizeof(arp_reply)); /* XXX: make an ARP request to have the client address */ memcpy(slirp->client_ethaddr, eh->h_source, ETH_ALEN); =20 @@ -637,7 +641,7 @@ static void arp_input(Slirp *slirp, const uint8_t *pk= t, int pkt_len) rah->ar_sip =3D ah->ar_tip; memcpy(rah->ar_tha, ah->ar_sha, ETH_ALEN); rah->ar_tip =3D ah->ar_sip; - slirp_output(slirp->opaque, arp_reply, sizeof(arp_reply)); + slirp_output(slirp->opaque, (const uint8_t *)&arp_reply, siz= eof(arp_reply)); } break; case ARPOP_REPLY: --=20 1.7.1.GIT