qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
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

  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
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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).