From: Thomas Huth <thuth@redhat.com>
To: Samuel Thibault <samuel.thibault@ens-lyon.org>, qemu-devel@nongnu.org
Cc: zhanghailiang <zhang.zhanghailiang@huawei.com>,
Li Zhijian <lizhijian@cn.fujitsu.com>,
Stefan Hajnoczi <stefanha@gmail.com>,
Jason Wang <jasowang@redhat.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] [PATCHv7 7/9] slirp: Handle IPv6 in TCP functions
Date: Wed, 17 Feb 2016 10:18:20 +0100 [thread overview]
Message-ID: <56C43ADC.3060406@redhat.com> (raw)
In-Reply-To: <8013f08a2724d618b8dcb98e35fbe68bd597df42.1455471945.git.samuel.thibault@ens-lyon.org>
On 14.02.2016 18:47, Samuel Thibault wrote:
> From: Guillaume Subiron <maethor@subiron.org>
>
> This patch adds IPv6 case in TCP functions refactored by the last
> patches.
> This also adds IPv6 pseudo-header in tcpiphdr structure.
> Finally, tcp_input() is called by ip6_input().
>
> Signed-off-by: Guillaume Subiron <maethor@subiron.org>
> Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
> ---
...
> diff --git a/slirp/tcp_input.c b/slirp/tcp_input.c
> index fac2a24..7aad1bc 100644
> --- a/slirp/tcp_input.c
> +++ b/slirp/tcp_input.c
> @@ -216,7 +216,8 @@ present:
> void
> tcp_input(struct mbuf *m, int iphlen, struct socket *inso, unsigned short af)
> {
> - struct ip save_ip, *ip;
> + struct ip save_ip, *ip;
> + struct ip6 save_ip6, *ip6;
> register struct tcpiphdr *ti;
> caddr_t optp = NULL;
> int optlen = 0;
> @@ -230,6 +231,7 @@ tcp_input(struct mbuf *m, int iphlen, struct socket *inso, unsigned short af)
> int ret;
> struct sockaddr_storage lhost, fhost;
> struct sockaddr_in *lhost4, *fhost4;
> + struct sockaddr_in6 *lhost6, *fhost6;
> struct ex_list *ex_ptr;
> Slirp *slirp;
>
> @@ -256,21 +258,18 @@ tcp_input(struct mbuf *m, int iphlen, struct socket *inso, unsigned short af)
> }
> slirp = m->slirp;
>
> + ip = mtod(m, struct ip *);
> + ip6 = mtod(m, struct ip6 *);
> +
> switch (af) {
> case AF_INET:
> + save_ip = *ip;
> if (iphlen > sizeof(struct ip)) {
> ip_stripoptions(m, (struct mbuf *)0);
> iphlen = sizeof(struct ip);
> }
> /* XXX Check if too short */
>
> -
> - /*
> - * Save a copy of the IP header in case we want restore it
> - * for sending an ICMP error message in response.
> - */
> - ip = mtod(m, struct ip *);
> - save_ip = *ip;
I think you could also leave the "save_ip = *ip" here instead of moving
it to the beginning of this case statement.
> save_ip.ip_len += iphlen;
>
> /*
> @@ -295,16 +294,36 @@ tcp_input(struct mbuf *m, int iphlen, struct socket *inso, unsigned short af)
> ti->ti_dst = save_ip.ip_dst;
> ti->ti_pr = save_ip.ip_p;
> ti->ti_len = htons((uint16_t)tlen);
> - len = ((sizeof(struct tcpiphdr) - sizeof(struct tcphdr)) + tlen);
> - if (cksum(m, len)) {
> - goto drop;
> - }
> + break;
> +
> + case AF_INET6:
> + save_ip6 = *ip6;
> + m->m_data -= sizeof(struct tcpiphdr) - (sizeof(struct ip6)
> + + sizeof(struct tcphdr));
> + m->m_len += sizeof(struct tcpiphdr) - (sizeof(struct ip6)
> + + sizeof(struct tcphdr));
> + ti = mtod(m, struct tcpiphdr *);
> +
> + tlen = ip6->ip_pl;
> + tcpiphdr2qlink(ti)->next = tcpiphdr2qlink(ti)->prev = NULL;
> + memset(&ti->ih_mbuf, 0 , sizeof(struct mbuf_ptr));
> + memset(&ti->ti, 0, sizeof(ti->ti));
> + ti->ti_x0 = 0;
> + ti->ti_src6 = save_ip6.ip_src;
> + ti->ti_dst6 = save_ip6.ip_dst;
> + ti->ti_nh6 = save_ip6.ip_nh;
> + ti->ti_len = htons((uint16_t)tlen);
> break;
>
> default:
> g_assert_not_reached();
> }
>
> + len = ((sizeof(struct tcpiphdr) - sizeof(struct tcphdr)) + tlen);
> + if (cksum(m, len)) {
> + goto drop;
> + }
> +
...
> diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c
> index c16b29d..6991b21 100644
> --- a/slirp/tcp_subr.c
> +++ b/slirp/tcp_subr.c
> @@ -88,6 +88,15 @@ tcp_template(struct tcpcb *tp)
> n->ti_dport = so->so_lport;
> break;
>
> + case AF_INET6:
> + n->ti_nh6 = IPPROTO_TCP;
> + n->ti_len = htons(sizeof(struct tcphdr));
> + n->ti_src6 = so->so_faddr6;
> + n->ti_dst6 = so->so_laddr6;
> + n->ti_sport = so->so_fport6;
> + n->ti_dport = so->so_lport6;
> + break;
> +
> default:
> g_assert_not_reached();
> }
> @@ -156,6 +165,10 @@ tcp_respond(struct tcpcb *tp, struct tcpiphdr *ti, struct mbuf *m,
> xchg(ti->ti_dst.s_addr, ti->ti_src.s_addr, uint32_t);
> xchg(ti->ti_dport, ti->ti_sport, uint16_t);
> break;
> + case AF_INET6:
> + xchg(ti->ti_dst6, ti->ti_src6, struct in6_addr);
> + xchg(ti->ti_dport, ti->ti_sport, uint16_t);
> + break;
> default:
> g_assert_not_reached();
> }
> @@ -182,6 +195,7 @@ tcp_respond(struct tcpcb *tp, struct tcpiphdr *ti, struct mbuf *m,
>
> struct tcpiphdr tcpiph_save = *(mtod(m, struct tcpiphdr *));
> struct ip *ip;
> + struct ip6 *ip6;
>
> switch (af) {
> case AF_INET:
> @@ -204,6 +218,20 @@ tcp_respond(struct tcpcb *tp, struct tcpiphdr *ti, struct mbuf *m,
> (void) ip_output((struct socket *)0, m);
> break;
>
> + case AF_INET6:
> + m->m_data += sizeof(struct tcpiphdr) - sizeof(struct tcphdr)
> + - sizeof(struct ip6);
> + m->m_len -= sizeof(struct tcpiphdr) - sizeof(struct tcphdr)
> + - sizeof(struct ip6);
> + ip6 = mtod(m, struct ip6 *);
> + ip6->ip_pl = tlen;
> + ip6->ip_dst = tcpiph_save.ti_dst6;
> + ip6->ip_src = tcpiph_save.ti_src6;
> + ip6->ip_nh = tcpiph_save.ti_nh6;
> +
> + (void) ip6_output((struct socket *)0, m, 0);
Is that "(void)" really necessary here? Also, I think you could simply
use "NULL" instead of "(struct socket *)0".
> + break;
> +
> default:
> g_assert_not_reached();
> }
...
Just some cosmetic nits, patch generally looks fine to me, so:
Reviewed-by: Thomas Huth <thuth@redhat.com>
next prev parent reply other threads:[~2016-02-17 9:18 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-14 17:47 [Qemu-devel] [PATCHv8 0/9] slirp: Adding IPv6 support to Qemu -net user mode Samuel Thibault
2016-02-14 17:47 ` [Qemu-devel] [PATCHv7 1/9] slirp: Adding IPv6, ICMPv6 Echo and NDP autoconfiguration Samuel Thibault
2016-02-16 11:36 ` Thomas Huth
2016-02-19 13:57 ` Thomas Huth
2016-02-14 17:47 ` [Qemu-devel] [PATCHv7 2/9] slirp: Adding ICMPv6 error sending Samuel Thibault
2016-02-16 12:21 ` Thomas Huth
2016-02-14 17:47 ` [Qemu-devel] [PATCHv7 3/9] slirp: Adding IPv6 UDP support Samuel Thibault
2016-02-16 12:28 ` Thomas Huth
2016-02-14 17:47 ` [Qemu-devel] [PATCHv7 4/9] slirp: Factorizing tcpiphdr structure with an union Samuel Thibault
2016-02-19 0:36 ` Samuel Thibault
2016-02-19 13:44 ` Thomas Huth
2016-02-22 1:48 ` Samuel Thibault
2016-02-22 7:56 ` Thomas Huth
2016-02-22 10:20 ` Samuel Thibault
2016-02-14 17:47 ` [Qemu-devel] [PATCHv7 5/9] slirp: Generalizing and neutralizing various TCP functions before adding IPv6 stuff Samuel Thibault
2016-02-17 8:25 ` Thomas Huth
2016-02-14 17:47 ` [Qemu-devel] [PATCHv7 6/9] slirp: Reindent after refactoring Samuel Thibault
2016-02-17 9:03 ` Thomas Huth
2016-02-14 17:47 ` [Qemu-devel] [PATCHv7 7/9] slirp: Handle IPv6 in TCP functions Samuel Thibault
2016-02-17 9:18 ` Thomas Huth [this message]
2016-02-17 9:30 ` Samuel Thibault
2016-02-14 17:47 ` [Qemu-devel] [PATCHv7 8/9] slirp: Adding IPv6 address for DNS relay Samuel Thibault
2016-02-17 9:28 ` Thomas Huth
2016-02-17 9:36 ` Samuel Thibault
2016-02-19 0:26 ` Samuel Thibault
2016-02-14 17:47 ` [Qemu-devel] [PATCHv7 9/9] qapi-schema, qemu-options & slirp: Adding Qemu options for IPv6 addresses Samuel Thibault
2016-02-17 11:59 ` Thomas Huth
2016-02-19 0:35 ` Samuel Thibault
2016-02-16 8:47 ` [Qemu-devel] [PATCH] slirp: Add IPv6 support to the TFTP code Thomas Huth
2016-02-16 10:30 ` Samuel Thibault
2016-02-16 12:09 ` Thomas Huth
2016-02-17 8:40 ` [Qemu-devel] [PATCH v2] " Thomas Huth
2016-02-17 8:42 ` Samuel Thibault
-- strict thread matches above, loose matches on Subject: below --
2016-02-08 10:28 [Qemu-devel] [PATCHv7 0/9] slirp: Adding IPv6 support to Qemu -net user mode Samuel Thibault
2016-02-08 10:28 ` [Qemu-devel] [PATCHv7 7/9] slirp: Handle IPv6 in TCP functions Samuel Thibault
2016-02-10 10:47 ` Thomas Huth
2016-02-10 12:30 ` Samuel Thibault
2016-02-10 12:41 ` Thomas Huth
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=56C43ADC.3060406@redhat.com \
--to=thuth@redhat.com \
--cc=arei.gonglei@huawei.com \
--cc=dgilbert@redhat.com \
--cc=jan.kiszka@siemens.com \
--cc=jasowang@redhat.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=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.