From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52357) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WUO8j-0006SY-R8 for qemu-devel@nongnu.org; Sun, 30 Mar 2014 18:23:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WUO8Y-0002Yz-Fg for qemu-devel@nongnu.org; Sun, 30 Mar 2014 18:23:41 -0400 Received: from toccata.ens-lyon.org ([140.77.166.68]:40616) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WUO8Y-0002Ye-5L for qemu-devel@nongnu.org; Sun, 30 Mar 2014 18:23:30 -0400 From: Samuel Thibault Date: Mon, 31 Mar 2014 00:22:53 +0200 Message-Id: <1396218189-14422-3-git-send-email-samuel.thibault@ens-lyon.org> In-Reply-To: <1396218189-14422-1-git-send-email-samuel.thibault@ens-lyon.org> References: <1396218189-14422-1-git-send-email-samuel.thibault@ens-lyon.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH 02/18] slirp: Generalizing and neutralizing code before adding IPv6 stuff List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Stefan Hajnoczi , Jan Kiszka , Samuel Thibault , Guillaume Subiron Basically, this patch replaces "arp" by "resolution" every time "arp" means "mac resolution" and not specifically ARP. Some indentation problems are solved in functions that will be modified in the next patches (ip_input=E2=80=A6). In if_encap, a switch is added to prepare for the IPv6 case. Some code is factorized. Some #define ETH_* are moved upper in slirp.h to make them accessible to other slirp/*.h Signed-off-by: Guillaume Subiron Signed-off-by: Samuel Thibault --- slirp/if.c | 2 +- slirp/mbuf.c | 2 +- slirp/mbuf.h | 2 +- slirp/slirp.c | 24 ++++++++++++++++++++---- slirp/slirp.h | 12 ++++++------ 5 files changed, 29 insertions(+), 13 deletions(-) diff --git a/slirp/if.c b/slirp/if.c index fb7acf8..e36b9cb 100644 --- a/slirp/if.c +++ b/slirp/if.c @@ -193,7 +193,7 @@ void if_start(Slirp *slirp) =20 /* Try to send packet unless it already expired */ if (ifm->expiration_date >=3D now && !if_encap(slirp, ifm)) { - /* Packet is delayed due to pending ARP resolution */ + /* Packet is delayed due to pending ARP or NDP resolution */ continue; } =20 diff --git a/slirp/mbuf.c b/slirp/mbuf.c index 4fefb04..92c429e 100644 --- a/slirp/mbuf.c +++ b/slirp/mbuf.c @@ -91,7 +91,7 @@ m_get(Slirp *slirp) m->m_len =3D 0; m->m_nextpkt =3D NULL; m->m_prevpkt =3D NULL; - m->arp_requested =3D false; + m->resolution_requested =3D false; m->expiration_date =3D (uint64_t)-1; end_error: DEBUG_ARG("m =3D %lx", (long )m); diff --git a/slirp/mbuf.h b/slirp/mbuf.h index b144f1c..38fedf4 100644 --- a/slirp/mbuf.h +++ b/slirp/mbuf.h @@ -79,7 +79,7 @@ struct mbuf { int m_len; /* Amount of data in this mbuf */ =20 Slirp *slirp; - bool arp_requested; + bool resolution_requested; uint64_t expiration_date; /* start of dynamic buffer area, must be last element */ union { diff --git a/slirp/slirp.c b/slirp/slirp.c index bad8dad..676c86d 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -778,12 +778,14 @@ int if_encap(Slirp *slirp, struct mbuf *ifm) return 1; } =20 + switch (iph->ip_v) { + case IPVERSION: if (!arp_table_search(slirp, iph->ip_dst.s_addr, ethaddr)) { uint8_t arp_req[ETH_HLEN + sizeof(struct arphdr)]; struct ethhdr *reh =3D (struct ethhdr *)arp_req; struct arphdr *rah =3D (struct arphdr *)(arp_req + ETH_HLEN); =20 - if (!ifm->arp_requested) { + if (!ifm->resolution_requested) { /* If the client addr is not known, send an ARP request */ memset(reh->h_dest, 0xff, ETH_ALEN); memcpy(reh->h_source, special_ethaddr, ETH_ALEN - 4); @@ -809,22 +811,36 @@ int if_encap(Slirp *slirp, struct mbuf *ifm) rah->ar_tip =3D iph->ip_dst.s_addr; slirp->client_ipaddr =3D iph->ip_dst; slirp_output(slirp->opaque, arp_req, sizeof(arp_req)); - ifm->arp_requested =3D true; + ifm->resolution_requested =3D true; =20 /* Expire request and drop outgoing packet after 1 second */ ifm->expiration_date =3D qemu_clock_get_ns(QEMU_CLOCK_REALTI= ME) + 1000000000ULL; } return 0; } else { - memcpy(eh->h_dest, ethaddr, ETH_ALEN); memcpy(eh->h_source, special_ethaddr, ETH_ALEN - 4); /* XXX: not correct */ memcpy(&eh->h_source[2], &slirp->vhost_addr, 4); eh->h_proto =3D htons(ETH_P_IP); + break; + } + + default: + /* Do not assert while we don't manage IP6VERSION */ + /* assert(0); */ + break; + } + + memcpy(eh->h_dest, ethaddr, ETH_ALEN); + DEBUG_ARGS((dfd, " src =3D %02x:%02x:%02x:%02x:%02x:%02x\n", + eh->h_source[0], eh->h_source[1], eh->h_source[2], + eh->h_source[3], eh->h_source[4], eh->h_source[5])); + DEBUG_ARGS((dfd, " dst =3D %02x:%02x:%02x:%02x:%02x:%02x\n", + eh->h_dest[0], eh->h_dest[1], eh->h_dest[2], + eh->h_dest[3], eh->h_dest[4], eh->h_dest[5])); memcpy(buf + sizeof(struct ethhdr), ifm->m_data, ifm->m_len); slirp_output(slirp->opaque, buf, ifm->m_len + ETH_HLEN); return 1; - } } =20 /* Drop host forwarding rule, return 0 if found. */ diff --git a/slirp/slirp.h b/slirp/slirp.h index e4a1bd4..cd9f2d0 100644 --- a/slirp/slirp.h +++ b/slirp/slirp.h @@ -136,6 +136,12 @@ void free(void *ptr); #include "qemu/queue.h" #include "qemu/sockets.h" =20 +#define ETH_ALEN 6 +#define ETH_HLEN 14 + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_P_ARP 0x0806 /* Address Resolution packet */ + #include "libslirp.h" #include "ip.h" #include "tcp.h" @@ -158,12 +164,6 @@ void free(void *ptr); #include "bootp.h" #include "tftp.h" =20 -#define ETH_ALEN 6 -#define ETH_HLEN 14 - -#define ETH_P_IP 0x0800 /* Internet Protocol packet */ -#define ETH_P_ARP 0x0806 /* Address Resolution packet */ - #define ARPOP_REQUEST 1 /* ARP request */ #define ARPOP_REPLY 2 /* ARP reply */ =20 --=20 1.9.0