From: Jason Wang <jasowang@redhat.com>
To: Samuel Thibault <samuel.thibault@ens-lyon.org>, qemu-devel@nongnu.org
Cc: Thomas Huth <thuth@redhat.com>,
zhanghailiang <zhang.zhanghailiang@huawei.com>,
Li Zhijian <lizhijian@cn.fujitsu.com>,
Stefan Hajnoczi <stefanha@gmail.com>,
Dave Gilbert <dgilbert@redhat.com>,
Vasiliy Tolstov <v.tolstov@selfip.ru>,
Huangpeng <peter.huangpeng@huawei.com>,
Gonglei <arei.gonglei@huawei.com>,
Jan Kiszka <jan.kiszka@siemens.com>,
Guillaume Subiron <maethor@subiron.org>
Subject: Re: [Qemu-devel] [PATCHv9 03/10] slirp: Adding IPv6 UDP support
Date: Mon, 7 Mar 2016 14:57:11 +0800 [thread overview]
Message-ID: <56DD2647.7060003@redhat.com> (raw)
In-Reply-To: <a1587e7e751bb5370c19f0af22e7f93a2c61ee49.1456168872.git.samuel.thibault@ens-lyon.org>
On 02/23/2016 03:28 AM, Samuel Thibault wrote:
> From: Guillaume Subiron <maethor@subiron.org>
>
> This adds the sin6 case in the fhost and lhost unions and related macros.
> It adds udp6_input() and udp6_output().
> It adds the IPv6 case in sorecvfrom().
> Finally, udp_input() is called by ip6_input().
>
> Signed-off-by: Guillaume Subiron <maethor@subiron.org>
> Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
> Reviewed-by: Thomas Huth <thuth@redhat.com>
> ---
> slirp/Makefile.objs | 2 +-
> slirp/ip6_input.c | 2 +-
> slirp/socket.c | 5 ++
> slirp/socket.h | 6 ++
> slirp/udp.h | 5 ++
> slirp/udp6.c | 157 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> 6 files changed, 175 insertions(+), 2 deletions(-)
> create mode 100644 slirp/udp6.c
>
> diff --git a/slirp/Makefile.objs b/slirp/Makefile.objs
> index 4e3a289..6748e4f 100644
> --- a/slirp/Makefile.objs
> +++ b/slirp/Makefile.objs
> @@ -1,5 +1,5 @@
> common-obj-y = cksum.o if.o ip_icmp.o ip6_icmp.o ip6_input.o ip6_output.o \
> ip_input.o ip_output.o dnssearch.o
> common-obj-y += slirp.o mbuf.o misc.o sbuf.o socket.o tcp_input.o tcp_output.o
> -common-obj-y += tcp_subr.o tcp_timer.o udp.o bootp.o tftp.o arp_table.o \
> +common-obj-y += tcp_subr.o tcp_timer.o udp.o udp6.o bootp.o tftp.o arp_table.o \
> ndp_table.o
> diff --git a/slirp/ip6_input.c b/slirp/ip6_input.c
> index b6a438d..9ca6d32 100644
> --- a/slirp/ip6_input.c
> +++ b/slirp/ip6_input.c
> @@ -58,7 +58,7 @@ void ip6_input(struct mbuf *m)
> icmp6_send_error(m, ICMP6_UNREACH, ICMP6_UNREACH_NO_ROUTE);
> break;
> case IPPROTO_UDP:
> - icmp6_send_error(m, ICMP6_UNREACH, ICMP6_UNREACH_NO_ROUTE);
> + udp6_input(m);
> break;
> case IPPROTO_ICMPV6:
> icmp6_input(m);
> diff --git a/slirp/socket.c b/slirp/socket.c
> index 32b1ba3..b79ddec 100644
> --- a/slirp/socket.c
> +++ b/slirp/socket.c
> @@ -541,7 +541,12 @@ sorecvfrom(struct socket *so)
> (struct sockaddr_in *) &daddr,
> so->so_iptos);
> break;
> + case AF_INET6:
> + udp6_output(so, m, (struct sockaddr_in6 *) &saddr,
> + (struct sockaddr_in6 *) &daddr);
> + break;
> default:
> + g_assert_not_reached();
> break;
> }
> } /* rx error */
> diff --git a/slirp/socket.h b/slirp/socket.h
> index bcebce1..e9c9b05 100644
> --- a/slirp/socket.h
> +++ b/slirp/socket.h
> @@ -34,17 +34,23 @@ struct socket {
> union { /* foreign host */
> struct sockaddr_storage ss;
> struct sockaddr_in sin;
> + struct sockaddr_in6 sin6;
> } fhost;
> #define so_faddr fhost.sin.sin_addr
> #define so_fport fhost.sin.sin_port
> +#define so_faddr6 fhost.sin6.sin6_addr
> +#define so_fport6 fhost.sin6.sin6_port
> #define so_ffamily fhost.ss.ss_family
>
> union { /* local host */
> struct sockaddr_storage ss;
> struct sockaddr_in sin;
> + struct sockaddr_in6 sin6;
> } lhost;
> #define so_laddr lhost.sin.sin_addr
> #define so_lport lhost.sin.sin_port
> +#define so_laddr6 lhost.sin6.sin6_addr
> +#define so_lport6 lhost.sin6.sin6_port
> #define so_lfamily lhost.ss.ss_family
>
> uint8_t so_iptos; /* Type of service */
> diff --git a/slirp/udp.h b/slirp/udp.h
> index 2f9de38..10cc780 100644
> --- a/slirp/udp.h
> +++ b/slirp/udp.h
> @@ -83,4 +83,9 @@ struct socket * udp_listen(Slirp *, uint32_t, u_int, uint32_t, u_int,
> int udp_output(struct socket *so, struct mbuf *m,
> struct sockaddr_in *saddr, struct sockaddr_in *daddr,
> int iptos);
> +
> +void udp6_input(register struct mbuf *);
> +int udp6_output(struct socket *so, struct mbuf *m,
> + struct sockaddr_in6 *saddr, struct sockaddr_in6 *daddr);
> +
> #endif
> diff --git a/slirp/udp6.c b/slirp/udp6.c
> new file mode 100644
> index 0000000..8952de2
> --- /dev/null
> +++ b/slirp/udp6.c
> @@ -0,0 +1,157 @@
> +/*
> + * Copyright (c) 2013
> + * Guillaume Subiron
> + */
> +
> +#include "slirp.h"
> +#include "qemu/osdep.h"
> +#include "udp.h"
> +
> +void udp6_input(struct mbuf *m)
> +{
> + Slirp *slirp = m->slirp;
> + struct ip6 *ip, save_ip;
> + struct udphdr *uh;
> + int hlen = sizeof(struct ip6);
> + int len;
> + struct socket *so;
> + struct sockaddr_in6 lhost;
> +
> + DEBUG_CALL("udp6_input");
> + DEBUG_ARG("m = %lx", (long)m);
> +
> + if (slirp->restricted) {
> + goto bad;
> + }
> +
> + ip = mtod(m, struct ip6 *);
> + m->m_len -= hlen;
> + m->m_data += hlen;
> + uh = mtod(m, struct udphdr *);
> + m->m_len += hlen;
> + m->m_data -= hlen;
> +
> + if (ip6_cksum(m)) {
> + goto bad;
> + }
> +
> + len = ntohs((uint16_t)uh->uh_ulen);
> +
> + /*
> + * Make mbuf data length reflect UDP length.
> + * If not enough data to reflect UDP length, drop.
> + */
> + if (ntohs(ip->ip_pl) != len) {
> + if (len > ntohs(ip->ip_pl)) {
> + goto bad;
> + }
> + m_adj(m, len - ntohs(ip->ip_pl));
> + ip->ip_pl = htons(len);
> + }
> +
> + /*
> + * Save a copy of the IP header in case we want restore it
> + * for sending an ICMP error message in response.
> + */
> + save_ip = *ip;
> +
> + /* TODO handle DHCP/BOOTP */
> + /* TODO handle TFTP */
> +
> + /* Locate pcb for datagram. */
> + lhost.sin6_family = AF_INET6;
> + lhost.sin6_addr = ip->ip_src;
> + lhost.sin6_port = uh->uh_sport;
> +
> + so = solookup(&slirp->udp_last_so, &slirp->udb,
> + (struct sockaddr_storage *) &lhost, NULL);
> +
> + if (so == NULL) {
> + /* If there's no socket for this packet, create one. */
> + so = socreate(slirp);
> + if (!so) {
> + goto bad;
> + }
> + if (udp_attach(so, AF_INET6) == -1) {
> + DEBUG_MISC((dfd, " udp6_attach errno = %d-%s\n",
> + errno, strerror(errno)));
> + sofree(so);
> + goto bad;
> + }
> +
> + /* Setup fields */
> + so->so_lfamily = AF_INET6;
> + so->so_laddr6 = ip->ip_src;
> + so->so_lport6 = uh->uh_sport;
> + }
> +
> + so->so_ffamily = AF_INET6;
> + so->so_faddr6 = ip->ip_dst; /* XXX */
> + so->so_fport6 = uh->uh_dport; /* XXX */
> +
> + hlen += sizeof(struct udphdr);
> + m->m_len -= hlen;
> + m->m_data += hlen;
> +
> + /*
> + * Now we sendto() the packet.
> + */
> + if (sosendto(so, m) == -1) {
> + m->m_len += hlen;
> + m->m_data -= hlen;
> + *ip = save_ip;
> + DEBUG_MISC((dfd, "udp tx errno = %d-%s\n", errno, strerror(errno)));
> + /* TODO: ICMPv6 error */
> + /*icmp_error(m, ICMP_UNREACH,ICMP_UNREACH_NET, 0,strerror(errno));*/
> + goto bad;
> + }
> +
> + m_free(so->so_m); /* used for ICMP if error on sorecvfrom */
> +
> + /* restore the orig mbuf packet */
> + m->m_len += hlen;
> + m->m_data -= hlen;
> + *ip = save_ip;
> + so->so_m = m;
> +
> + return;
> +bad:
> + m_free(m);
> +}
Part of the codes looks duplicated with ipv4 version. Any chances to
merge them like tcp?
next prev parent reply other threads:[~2016-03-07 6:57 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-22 19:28 [Qemu-devel] [PATCHv9 0/10] slirp: Adding IPv6 support to Qemu -net user mode Samuel Thibault
2016-02-22 19:28 ` [Qemu-devel] [PATCHv9 01/10] slirp: Adding IPv6, ICMPv6 Echo and NDP autoconfiguration Samuel Thibault
2016-03-07 6:53 ` Jason Wang
2016-03-07 11:24 ` Samuel Thibault
2016-03-08 1:39 ` Jason Wang
2016-02-22 19:28 ` [Qemu-devel] [PATCHv9 02/10] slirp: Adding ICMPv6 error sending Samuel Thibault
2016-03-07 6:55 ` Jason Wang
2016-03-07 13:34 ` Samuel Thibault
2016-02-22 19:28 ` [Qemu-devel] [PATCHv9 03/10] slirp: Adding IPv6 UDP support Samuel Thibault
2016-03-07 6:57 ` Jason Wang [this message]
2016-03-07 11:36 ` Samuel Thibault
2016-03-08 1:40 ` Jason Wang
2016-02-22 19:28 ` [Qemu-devel] [PATCHv9 04/10] slirp: Factorizing tcpiphdr structure with an union Samuel Thibault
2016-02-23 8:07 ` Thomas Huth
2016-02-22 19:28 ` [Qemu-devel] [PATCHv9 05/10] slirp: Generalizing and neutralizing various TCP functions before adding IPv6 stuff Samuel Thibault
2016-02-22 19:28 ` [Qemu-devel] [PATCHv9 06/10] slirp: Reindent after refactoring Samuel Thibault
2016-03-07 7:02 ` Jason Wang
2016-03-07 11:38 ` Samuel Thibault
2016-03-08 1:43 ` Jason Wang
2016-02-22 19:28 ` [Qemu-devel] [PATCHv9 07/10] slirp: Handle IPv6 in TCP functions Samuel Thibault
2016-02-22 19:28 ` [Qemu-devel] [PATCHv9 08/10] slirp: Adding IPv6 address for DNS relay Samuel Thibault
2016-02-23 8:12 ` Thomas Huth
2016-02-22 19:28 ` [Qemu-devel] [PATCHv9 09/10] qapi-schema, qemu-options & slirp: Adding Qemu options for IPv6 addresses Samuel Thibault
2016-02-23 8:27 ` Thomas Huth
2016-03-07 7:05 ` Jason Wang
2016-03-07 11:39 ` Samuel Thibault
2016-03-07 11:41 ` Samuel Thibault
2016-03-07 16:05 ` Eric Blake
2016-02-22 19:28 ` [Qemu-devel] [PATCHv9 10/10] slirp: Add IPv6 support to the TFTP code Samuel Thibault
2016-03-04 8:41 ` [Qemu-devel] [PATCHv9 0/10] slirp: Adding IPv6 support to Qemu -net user mode Thomas Huth
2016-03-04 15:50 ` Jan Kiszka
2016-03-06 16:59 ` Samuel Thibault
2016-03-07 5:03 ` Jason Wang
2016-03-07 11:09 ` Samuel Thibault
2016-03-07 12:06 ` Jan Kiszka
2016-03-07 12:11 ` Samuel Thibault
2016-03-07 12:14 ` Thomas Huth
2016-03-07 12:16 ` Jan Kiszka
2016-03-08 2:50 ` Jason Wang
2016-03-08 1:37 ` Jason Wang
2016-03-07 6:48 ` Jason Wang
2016-03-07 11:19 ` Samuel Thibault
2016-03-07 12:00 ` Thomas Huth
2016-03-07 13:37 ` Samuel Thibault
2016-03-08 2:48 ` Jason Wang
2016-03-08 8:53 ` Samuel Thibault
2016-03-07 11:55 ` Samuel Thibault
2016-03-07 15:37 ` Thomas Huth
2016-03-07 16:49 ` Samuel Thibault
2016-03-08 2:15 ` Jason Wang
2016-03-08 9:12 ` Samuel Thibault
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=56DD2647.7060003@redhat.com \
--to=jasowang@redhat.com \
--cc=arei.gonglei@huawei.com \
--cc=dgilbert@redhat.com \
--cc=jan.kiszka@siemens.com \
--cc=lizhijian@cn.fujitsu.com \
--cc=maethor@subiron.org \
--cc=peter.huangpeng@huawei.com \
--cc=qemu-devel@nongnu.org \
--cc=samuel.thibault@ens-lyon.org \
--cc=stefanha@gmail.com \
--cc=thuth@redhat.com \
--cc=v.tolstov@selfip.ru \
--cc=zhang.zhanghailiang@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.