All of lore.kernel.org
 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] [PATCH 3/9] slirp: Adding address family switch for incoming frames
Date: Mon, 14 Dec 2015 18:50:49 +0100	[thread overview]
Message-ID: <566F0179.50209@redhat.com> (raw)
In-Reply-To: <1450101088-14575-3-git-send-email-samuel.thibault@ens-lyon.org>

On 14/12/15 14:51, Samuel Thibault wrote:
> From: Guillaume Subiron <maethor@subiron.org>
> 
> In if_encap, a switch is added to prepare for the IPv6 case. Some code
> is factorized.
> 
> This prepares for IPv6 support.
> 
> Signed-off-by: Guillaume Subiron <maethor@subiron.org>
> Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
> ---
>  slirp/slirp.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++-------------
>  1 file changed, 48 insertions(+), 13 deletions(-)
> 
> diff --git a/slirp/slirp.c b/slirp/slirp.c
> index 1d5d172..f8dc505 100644
> --- a/slirp/slirp.c
> +++ b/slirp/slirp.c
> @@ -762,20 +762,15 @@ void slirp_input(Slirp *slirp, const uint8_t *pkt, int pkt_len)
>      }
>  }
>  
> -/* Output the IP packet to the ethernet device. Returns 0 if the packet must be
> - * re-queued.
> +/* Prepare the IPv4 packet to be sent to the ethernet device. Returns 1 if no
> + * packet should be sent, 0 if the packet must be re-queued, 2 if the packet
> + * is ready to go.
>   */
> -int if_encap(Slirp *slirp, struct mbuf *ifm)
> +static int if_encap4(Slirp *slirp, struct mbuf *ifm, struct ethhdr *eh,
> +        uint8_t ethaddr[ETH_ALEN])
>  {
> -    uint8_t buf[1600];
> -    struct ethhdr *eh = (struct ethhdr *)buf;
> -    uint8_t ethaddr[ETH_ALEN];
>      const struct ip *iph = (const struct ip *)ifm->m_data;
>  
> -    if (ifm->m_len + ETH_HLEN > sizeof(buf)) {
> -        return 1;
> -    }
> -
>      if (iph->ip_dst.s_addr == 0) {
>          /* 0.0.0.0 can not be a destination address, something went wrong,
>           * avoid making it worse */
> @@ -819,15 +814,55 @@ int if_encap(Slirp *slirp, struct mbuf *ifm)
>          }
>          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 = htons(ETH_P_IP);
> -        memcpy(buf + sizeof(struct ethhdr), ifm->m_data, ifm->m_len);
> -        slirp_output(slirp->opaque, buf, ifm->m_len + ETH_HLEN);
> +
> +        /* Send this */
> +        return 2;
> +    }
> +}
> +
> +/* Output the IP packet to the ethernet device. Returns 0 if the packet must be
> + * re-queued.
> + */
> +int if_encap(Slirp *slirp, struct mbuf *ifm)
> +{
> +    uint8_t buf[1600];
> +    struct ethhdr *eh = (struct ethhdr *)buf;
> +    uint8_t ethaddr[ETH_ALEN];
> +    const struct ip *iph = (const struct ip *)ifm->m_data;
> +    int ret;
> +
> +    if (ifm->m_len + ETH_HLEN > sizeof(buf)) {
>          return 1;
>      }
> +
> +    switch (iph->ip_v) {
> +    case IPVERSION:
> +        ret = if_encap4(slirp, ifm, eh, ethaddr);
> +        if (ret < 2) {
> +            return ret;
> +        }
> +        break;
> +
> +    default:
> +        /* Do not assert while we don't manage IP6VERSION */
> +        /* assert(0); */

Not sure if we ever want to have an assert() here - since I assume this
could be triggered by the guest? In that case, it would be better to use
a qemu_log_mask(LOG_UNIMP, ...) or something similar in a later patch
instead and simply "return 1" afterwards.

> +        break;
> +    }
> +
> +    memcpy(eh->h_dest, ethaddr, ETH_ALEN);
> +    DEBUG_ARGS((dfd, " src = %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 = %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;
>  }
>  
>  /* Drop host forwarding rule, return 0 if found. */

The patch now looks IMHO much nicer than the last version, thanks for
reworking it!

Reviewed-by: Thomas Huth <thuth@redhat.com>

  reply	other threads:[~2015-12-14 17:51 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-14 13:49 [Qemu-devel] [PATCHv6 0/9] slirp: Adding IPv6 support to Qemu -net user mode Samuel Thibault
2015-12-14 13:51 ` [Qemu-devel] [PATCH 1/9] slirp: goto bad in udp_input if sosendto fails Samuel Thibault
2015-12-14 13:51   ` [Qemu-devel] [PATCH 2/9] slirp: Generalizing and neutralizing ARP code Samuel Thibault
2015-12-14 14:24     ` Thomas Huth
2015-12-14 13:51   ` [Qemu-devel] [PATCH 3/9] slirp: Adding address family switch for incoming frames Samuel Thibault
2015-12-14 17:50     ` Thomas Huth [this message]
2015-12-14 22:06       ` Samuel Thibault
2015-12-14 22:07         ` Samuel Thibault
2015-12-15  6:47         ` Thomas Huth
2015-12-14 13:51   ` [Qemu-devel] [PATCH 4/9] slirp: Make Socket structure IPv6 compatible Samuel Thibault
2015-12-14 19:31     ` Thomas Huth
2015-12-14 13:51   ` [Qemu-devel] [PATCH 5/9] slirp: Factorizing address translation Samuel Thibault
2015-12-14 13:51   ` [Qemu-devel] [PATCH 6/9] slirp: Factorizing and cleaning solookup() Samuel Thibault
2015-12-14 20:05     ` Thomas Huth
2015-12-14 13:51   ` [Qemu-devel] [PATCH 7/9] slirp: Add sockaddr_equal, make solookup family-agnostic Samuel Thibault
2015-12-14 20:17     ` Thomas Huth
2015-12-14 22:24       ` Samuel Thibault
2015-12-14 13:51   ` [Qemu-devel] [PATCH 8/9] slirp: Make udp_attach IPv6 compatible Samuel Thibault
2015-12-14 13:51   ` [Qemu-devel] [PATCH 9/9] slirp: Adding family argument to tcp_fconnect() 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=566F0179.50209@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.