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>,
Yang Hongyang <yanghy@cn.fujitsu.com>,
Guillaume Subiron <maethor@subiron.org>
Subject: Re: [Qemu-devel] [PATCHv7 5/9] slirp: Generalizing and neutralizing various TCP functions before adding IPv6 stuff
Date: Wed, 10 Feb 2016 09:35:31 +0100 [thread overview]
Message-ID: <56BAF653.2040507@redhat.com> (raw)
In-Reply-To: <145e7741b4d6eeac3d69ea9cf40110229167db0c.1454927009.git.samuel.thibault@ens-lyon.org>
On 08.02.2016 11:28, Samuel Thibault wrote:
> From: Guillaume Subiron <maethor@subiron.org>
>
> Basically, this patch adds some switch in various TCP functions to
> prepare them for the IPv6 case.
>
> To have something to "switch" in tcp_input() and tcp_respond(), a new
> argument is used to give them the sa_family of the addresses they are
> working on.
>
> This patch does not include the entailed reindentation, to make proofread
> easier. Reindentation is adressed in the following no-op patch.
>
> Signed-off-by: Guillaume Subiron <maethor@subiron.org>
> Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
> ---
> slirp/ip_input.c | 2 +-
> slirp/slirp.c | 6 ++++--
> slirp/slirp.h | 5 +++--
> slirp/tcp_input.c | 52 ++++++++++++++++++++++++++++++++++++++++++++--------
> slirp/tcp_output.c | 14 +++++++++++---
> slirp/tcp_subr.c | 37 +++++++++++++++++++++++++++++--------
> slirp/tcp_timer.c | 3 ++-
> 7 files changed, 94 insertions(+), 25 deletions(-)
...
> diff --git a/slirp/tcp_input.c b/slirp/tcp_input.c
> index 26b0c8b..0cc279b 100644
> --- a/slirp/tcp_input.c
> +++ b/slirp/tcp_input.c
> @@ -214,7 +214,7 @@ present:
> * protocol specification dated September, 1981 very closely.
> */
> void
> -tcp_input(struct mbuf *m, int iphlen, struct socket *inso)
> +tcp_input(struct mbuf *m, int iphlen, struct socket *inso, unsigned short af)
> {
> struct ip save_ip, *ip;
> register struct tcpiphdr *ti;
> @@ -256,6 +256,8 @@ tcp_input(struct mbuf *m, int iphlen, struct socket *inso)
> }
> slirp = m->slirp;
>
> + switch (af) {
> + case AF_INET:
> if (iphlen > sizeof(struct ip )) {
> ip_stripoptions(m, (struct mbuf *)0);
> iphlen=sizeof(struct ip );
> @@ -297,6 +299,11 @@ tcp_input(struct mbuf *m, int iphlen, struct socket *inso)
> if(cksum(m, len)) {
> goto drop;
> }
> + break;
> +
> + default:
> + goto drop;
> + }
>
> /*
> * Check that TCP offset makes sense,
> @@ -332,14 +339,20 @@ tcp_input(struct mbuf *m, int iphlen, struct socket *inso)
> * Locate pcb for segment.
> */
> findso:
> - lhost.ss_family = AF_INET;
> + lhost.ss_family = af;
> + fhost.ss_family = af;
> + switch (af) {
> + case AF_INET:
> lhost4 = (struct sockaddr_in *) &lhost;
> lhost4->sin_addr = ti->ti_src;
> lhost4->sin_port = ti->ti_sport;
> - fhost.ss_family = AF_INET;
> fhost4 = (struct sockaddr_in *) &fhost;
> fhost4->sin_addr = ti->ti_dst;
> fhost4->sin_port = ti->ti_dport;
> + break;
> + default:
> + goto drop;
> + }
>
> so = solookup(&slirp->tcp_last_so, &slirp->tcb, &lhost, &fhost);
>
> @@ -389,8 +402,17 @@ findso:
> so->lhost.ss = lhost;
> so->fhost.ss = fhost;
>
> - if ((so->so_iptos = tcp_tos(so)) == 0)
> + so->so_iptos = tcp_tos(so);
> + if (so->so_iptos == 0) {
> + switch (af) {
> + case AF_INET:
> so->so_iptos = ((struct ip *)ti)->ip_tos;
I think you could also indent this here immediately ... it's only one
line, so indenting immediately should not hurt readability here.
> + break;
> + default:
> + goto drop;
> + break;
> + }
> + }
>
> tp = sototcpcb(so);
> tp->t_state = TCPS_LISTEN;
> @@ -569,7 +591,8 @@ findso:
> * If this is destined for the control address, then flag to
> * tcp_ctl once connected, otherwise connect
> */
> - if ((so->so_faddr.s_addr & slirp->vnetwork_mask.s_addr) ==
> + if (af == AF_INET &&
> + (so->so_faddr.s_addr & slirp->vnetwork_mask.s_addr) ==
> slirp->vnetwork_addr.s_addr) {
> if (so->so_faddr.s_addr != slirp->vhost_addr.s_addr &&
> so->so_faddr.s_addr != slirp->vnameserver_addr.s_addr) {
> @@ -607,7 +630,7 @@ findso:
> if(errno == ECONNREFUSED) {
> /* ACK the SYN, send RST to refuse the connection */
> tcp_respond(tp, ti, m, ti->ti_seq+1, (tcp_seq)0,
> - TH_RST|TH_ACK);
> + TH_RST|TH_ACK, af);
> } else {
> if(errno == EHOSTUNREACH) code=ICMP_UNREACH_HOST;
> HTONL(ti->ti_seq); /* restore tcp header */
> @@ -616,7 +639,13 @@ findso:
> HTONS(ti->ti_urp);
> m->m_data -= sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
> m->m_len += sizeof(struct tcpiphdr)+off-sizeof(struct tcphdr);
> + switch (af) {
> + case AF_INET:
> *ip=save_ip;
Could also be indented immediately.
> + break;
> + default:
> + goto drop;
> + }
> icmp_send_error(m, ICMP_UNREACH, code, 0, strerror(errno));
> }
> tcp_close(tp);
> @@ -1289,11 +1318,11 @@ dropafterack:
> dropwithreset:
> /* reuses m if m!=NULL, m_free() unnecessary */
> if (tiflags & TH_ACK)
> - tcp_respond(tp, ti, m, (tcp_seq)0, ti->ti_ack, TH_RST);
> + tcp_respond(tp, ti, m, (tcp_seq)0, ti->ti_ack, TH_RST, af);
> else {
> if (tiflags & TH_SYN) ti->ti_len++;
> tcp_respond(tp, ti, m, ti->ti_seq+ti->ti_len, (tcp_seq)0,
> - TH_RST|TH_ACK);
> + TH_RST|TH_ACK, af);
> }
>
> return;
> @@ -1484,7 +1513,14 @@ tcp_mss(struct tcpcb *tp, u_int offer)
> DEBUG_ARG("tp = %p", tp);
> DEBUG_ARG("offer = %d", offer);
>
> + switch (so->so_ffamily) {
> + case AF_INET:
> mss = min(IF_MTU, IF_MRU) - sizeof(struct tcphdr) + sizeof(struct ip);
dito, indent immediately.
> + break;
> + default:
> + break;
> + }
> +
> if (offer)
> mss = min(mss, offer);
> mss = max(mss, 32);
> diff --git a/slirp/tcp_output.c b/slirp/tcp_output.c
> index 7fc6a87..62ab1e5 100644
> --- a/slirp/tcp_output.c
> +++ b/slirp/tcp_output.c
> @@ -61,7 +61,8 @@ tcp_output(struct tcpcb *tp)
> register long len, win;
> int off, flags, error;
> register struct mbuf *m;
> - register struct tcpiphdr *ti;
> + register struct tcpiphdr *ti, tcpiph_save;
> + struct ip *ip;
> u_char opt[MAX_TCPOPTLEN];
> unsigned optlen, hdrlen;
> int idle, sendalot;
> @@ -447,13 +448,15 @@ send:
> * the template, but need a way to checksum without them.
> */
> m->m_len = hdrlen + len; /* XXX Needed? m_len should be correct */
> + tcpiph_save = *(mtod(m, struct tcpiphdr *));
>
> - struct tcpiphdr tcpiph_save = *(mtod(m, struct tcpiphdr *));
> + switch (so->so_ffamily) {
> + case AF_INET:
> m->m_data += sizeof(struct tcpiphdr) - sizeof(struct tcphdr)
> - sizeof(struct ip);
> m->m_len -= sizeof(struct tcpiphdr) - sizeof(struct tcphdr)
> - sizeof(struct ip);
> - struct ip *ip = mtod(m, struct ip *);
> + ip = mtod(m, struct ip *);
>
> ip->ip_len = m->m_len;
> ip->ip_dst = tcpiph_save.ti_dst;
> @@ -464,6 +467,11 @@ send:
> ip->ip_tos = so->so_iptos;
>
> error = ip_output(so, m);
> + break;
> +
> + default:
> + goto out;
Hmm, this jumps to a "return (error)" statement ... but as far as I can
see, error has never been initialized in this case? So I think you
either should set the error variable explicitely here, or simply "return
1" immediately instead of doing the goto.
> + }
>
> if (error) {
> out:
Thomas
next prev parent reply other threads:[~2016-02-10 8:35 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
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 1/9] slirp: Adding IPv6, ICMPv6 Echo and NDP autoconfiguration Samuel Thibault
2016-02-09 16:14 ` Thomas Huth
2016-02-09 16:31 ` Samuel Thibault
2016-02-09 19:32 ` Thomas Huth
2016-02-09 20:16 ` Samuel Thibault
2016-02-09 16:31 ` Eric Blake
2016-02-09 16:35 ` Samuel Thibault
2016-02-09 19:56 ` Samuel Thibault
2016-02-09 20:49 ` Thomas Huth
2016-02-09 20:31 ` Samuel Thibault
2016-02-08 10:28 ` [Qemu-devel] [PATCHv7 2/9] slirp: Adding ICMPv6 error sending Samuel Thibault
2016-02-09 19:48 ` Thomas Huth
2016-02-08 10:28 ` [Qemu-devel] [PATCHv7 3/9] slirp: Adding IPv6 UDP support Samuel Thibault
2016-02-09 20:44 ` Thomas Huth
2016-02-09 21:13 ` Samuel Thibault
2016-02-09 21:19 ` Samuel Thibault
2016-02-10 7:18 ` Thomas Huth
2016-02-10 7:37 ` Samuel Thibault
2016-02-08 10:28 ` [Qemu-devel] [PATCHv7 4/9] slirp: Factorizing tcpiphdr structure with an union Samuel Thibault
2016-02-10 8:05 ` Thomas Huth
2016-02-10 9:28 ` Samuel Thibault
2016-02-10 10:08 ` Thomas Huth
2016-02-10 12:20 ` Samuel Thibault
2016-02-08 10:28 ` [Qemu-devel] [PATCHv7 5/9] slirp: Generalizing and neutralizing various TCP functions before adding IPv6 stuff Samuel Thibault
2016-02-10 8:35 ` Thomas Huth [this message]
2016-02-10 9:17 ` Samuel Thibault
2016-02-08 10:28 ` [Qemu-devel] [PATCHv7 6/9] slirp: Reindent after refactoring Samuel Thibault
2016-02-10 8:42 ` Thomas Huth
2016-02-10 9:20 ` Samuel Thibault
2016-02-11 17:56 ` Eric Blake
2016-02-11 18:15 ` 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
2016-02-08 10:28 ` [Qemu-devel] [PATCHv7 8/9] slirp: Adding IPv6 address for DNS relay Samuel Thibault
2016-02-08 10:28 ` [Qemu-devel] [PATCHv7 9/9] qapi-schema, qemu-options & slirp: Adding Qemu options for IPv6 addresses Samuel Thibault
2016-02-08 22:12 ` Eric Blake
2016-02-10 11:39 ` Thomas Huth
2016-02-10 12:45 ` Samuel Thibault
2016-02-10 13:08 ` Daniel P. Berrange
2016-02-11 20:30 ` Thomas Huth
-- strict thread matches above, loose matches on Subject: below --
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 5/9] slirp: Generalizing and neutralizing various TCP functions before adding IPv6 stuff Samuel Thibault
2016-02-17 8:25 ` 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=56BAF653.2040507@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=yanghy@cn.fujitsu.com \
--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.