All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
Cc: Li Zhijian <lizhijian@cn.fujitsu.com>,
	Gui jianfeng <guijianfeng@cn.fujitsu.com>,
	Jason Wang <jasowang@redhat.com>,
	"eddie.dong" <eddie.dong@intel.com>,
	qemu devel <qemu-devel@nongnu.org>,
	Huang peng <peter.huangpeng@huawei.com>,
	Gong lei <arei.gonglei@huawei.com>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	jan.kiszka@siemens.com,
	zhanghailiang <zhang.zhanghailiang@huawei.com>
Subject: Re: [Qemu-devel] [RFC PATCH 6/9] net/colo-proxy: add packet forward function
Date: Tue, 1 Dec 2015 15:50:15 +0000	[thread overview]
Message-ID: <20151201155014.GD26419@work-vm> (raw)
In-Reply-To: <1448627251-11186-7-git-send-email-zhangchen.fnst@cn.fujitsu.com>

* Zhang Chen (zhangchen.fnst@cn.fujitsu.com) wrote:
> From: zhangchen <zhangchen.fnst@cn.fujitsu.com>
> 
> The packet recv by primary forward to secondary
> The packet send by secondary forward to primary
> 
> Signed-off-by: zhangchen <zhangchen.fnst@cn.fujitsu.com>
> ---
>  net/colo-proxy.c | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 114 insertions(+), 4 deletions(-)
> 
> diff --git a/net/colo-proxy.c b/net/colo-proxy.c
> index ece5661..08a852f 100644
> --- a/net/colo-proxy.c
> +++ b/net/colo-proxy.c
> @@ -26,6 +26,110 @@ static char *mode;
>  static bool colo_do_checkpoint;
>  
>  /*
> + * Packets to be sent by colo forward to
> + * another colo
> + * return:          >= 0        success
> + *                  < 0        failed
> + */
> +static ssize_t colo_forward2another(NetFilterState *nf,
> +                                         NetClientState *sender,
> +                                         unsigned flags,
> +                                         const struct iovec *iov,
> +                                         int iovcnt,
> +                                         NetPacketSent *sent_cb,
> +                                         mode_type mode)
> +{
> +    ColoProxyState *s = FILTER_COLO_PROXY(nf);
> +    ssize_t ret = 0;
> +    ssize_t size = 0;
> +    struct iovec sizeiov = {
> +        .iov_base = &size,
> +        .iov_len = 8
> +    };

If you always want 'size' to be 8 bytes then use an int64_t
(or uint64_t probably if you are sending a length).

> +    size = iov_size(iov, iovcnt);
> +    if (!size) {
> +        return 0;
> +    }
> +
> +    if (mode == COLO_PRIMARY_MODE) {
> +        qemu_net_queue_send_iov(s->incoming_queue, sender, flags,
> +                           iov, iovcnt, NULL);
> +    }
> +    ret = iov_send(s->sockfd, &sizeiov, 8, 0, 8);
> +    if (ret < 0) {
> +        return ret;
> +    }
> +    ret = iov_send(s->sockfd, iov, iovcnt, 0, size);
> +    return ret;
> +}
> +
> +/*
> + * recv and handle colo secondary
> + * forward packets in colo primary
> + */
> +static void colo_proxy_primary_forward_handler(NetFilterState *nf)
> +{
> +    ColoProxyState *s = FILTER_COLO_PROXY(nf);
> +    ssize_t len = 0;
> +    ssize_t ret = 0;
> +    struct iovec sizeiov = {
> +        .iov_base = &len,
> +        .iov_len = 8
> +    };
> +    if (s->sockfd < 0) {
> +        printf("secondary forward disconnected\n");
> +        return;
> +    }
> +    iov_recv(s->sockfd, &sizeiov, 8, 0, 8);

Check the return value of iov_recv.

> +    DEBUG("primary_forward_handler recv lensbuf lens=%zu\n", len);
> +
> +    if (len > 0) {
> +        char *recvbuf;
> +        recvbuf = g_malloc0(len);

You should check the value of 'len' received off the wire - if things
go wrong the value could be massive and try and allocate a huge amount
of memory - checking it would also be a good check for something going
wrong.

> +        struct iovec iov = {
> +            .iov_base = recvbuf,
> +            .iov_len = len
> +        };
> +        iov_recv(s->sockfd, &iov, len, 0, len);
> +        DEBUG("primary_forward_handler primary recvbuf=%s\n", recvbuf);
> +        ret = colo_enqueue_secondary_packet(nf, recvbuf, len);
> +        if (ret) {
> +            DEBUG("colo_enqueue_secondary_packet succese\n");
> +        } else {
> +            DEBUG("colo_enqueue_secondary_packet failed\n");
> +        }
> +        g_free(recvbuf);
> +    }
> +}
> +
> +/*
> + * recv and handle colo primary
> + * forward packets in colo secondary
> + */
> +static void colo_proxy_secondary_forward_handler(NetFilterState *nf)
> +{
> +    ColoProxyState *s = FILTER_COLO_PROXY(nf);
> +    ssize_t len = 0;
> +    struct iovec sizeiov = {
> +        .iov_base = &len,
> +        .iov_len = 8
> +    };
> +    iov_recv(s->sockfd, &sizeiov, 8, 0, 8);
> +    if (len > 0) {
> +        char *buf;
> +        buf = g_malloc0(len);
> +        struct iovec iov = {
> +            .iov_base = buf,
> +            .iov_len = len
> +        };
> +        iov_recv(s->sockfd, &iov, len, 0, len);

This code is very similar - factor it out and share it with the primary?

Dave

> +        qemu_net_queue_send(s->incoming_queue, nf->netdev,
> +                    0, (const uint8_t *)buf, len, NULL);
> +        g_free(buf);
> +    }
> +}
> +
> +/*
>   * colo primary handle host's normal send and
>   * recv packets to primary guest
>   * return:          >= 0      success
> @@ -63,7 +167,8 @@ static ssize_t colo_proxy_primary_handler(NetFilterState *nf,
>      if (direction == NET_FILTER_DIRECTION_RX) {
>          /* TODO: enqueue_primary_packet */
>      } else {
> -        /* TODO: forward packets to another */
> +        ret = colo_forward2another(nf, sender, flags, iov, iovcnt,
> +                    sent_cb, COLO_PRIMARY_MODE);
>      }
>  
>      return ret;
> @@ -107,7 +212,8 @@ static ssize_t colo_proxy_secondary_handler(NetFilterState *nf,
>                              iovcnt, NULL);
>              return 1;
>          } else {
> -        /* TODO: forward packets to another */
> +            ret = colo_forward2another(nf, sender, flags, iov, iovcnt,
> +                        sent_cb, COLO_SECONDARY_MODE);
>          }
>  
>      } else {
> @@ -178,7 +284,9 @@ static void colo_accept_incoming(ColoProxyState *s)
>          return;
>      }
>      s->sockfd = acceptsock;
> -    /* TODO: handle the packets that primary forward */
> +    qemu_set_fd_handler(s->sockfd,
> +                (IOHandler *)colo_proxy_secondary_forward_handler, NULL,
> +                (void *)s);
>      return;
>  }
>  
> @@ -211,7 +319,9 @@ static ssize_t colo_proxy_primary_setup(NetFilterState *nf)
>      }
>      DEBUG("colo proxy connect success\n");
>      s->sockfd = sock;
> -   /* TODO: handle the packets that secondary forward */
> +    qemu_set_fd_handler(s->sockfd,
> +                (IOHandler *)colo_proxy_primary_forward_handler,
> +                NULL, (void *)s);
>      g_free(s->addr);
>      return 1;
>  }
> -- 
> 1.9.1
> 
> 
> 
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK

  reply	other threads:[~2015-12-01 15:50 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-27 12:27 [Qemu-devel] [RFC PATCH 0/9] Add colo-proxy based on netfilter Zhang Chen
2015-11-27 12:27 ` [Qemu-devel] [RFC PATCH 1/9] Init colo-proxy object " Zhang Chen
2015-11-30  2:50   ` Wen Congyang
2015-11-30  5:38     ` Zhang Chen
2015-11-27 12:27 ` [Qemu-devel] [RFC PATCH 2/9] jhash: add linux kernel jhashtable in qemu Zhang Chen
2015-12-01 11:23   ` Dr. David Alan Gilbert
2015-12-03  3:40     ` Zhang Chen
2015-11-27 12:27 ` [Qemu-devel] [RFC PATCH 3/9] colo-proxy: add colo-proxy framework Zhang Chen
2015-11-28  2:46   ` Hailiang Zhang
2015-11-30  2:25     ` Zhang Chen
2015-11-30  3:10   ` Wen Congyang
2015-11-30  5:44     ` Zhang Chen
2015-11-27 12:27 ` [Qemu-devel] [RFC PATCH 4/9] colo-proxy: add colo-proxy setup work Zhang Chen
2015-11-28  3:02   ` Hailiang Zhang
2015-11-30  2:35     ` Zhang Chen
2015-12-01 15:35   ` Dr. David Alan Gilbert
2015-12-03  3:49     ` Zhang Chen
2015-11-27 12:27 ` [Qemu-devel] [RFC PATCH 5/9] net/colo-proxy: add colo packet handler Zhang Chen
2015-11-28  3:17   ` Hailiang Zhang
2015-11-30  5:37     ` Zhang Chen
2015-11-27 12:27 ` [Qemu-devel] [RFC PATCH 6/9] net/colo-proxy: add packet forward function Zhang Chen
2015-12-01 15:50   ` Dr. David Alan Gilbert [this message]
2015-12-03  6:17     ` Zhang Chen
2015-11-27 12:27 ` [Qemu-devel] [RFC PATCH 7/9] net/colo-proxy: add packet enqueue and handle function Zhang Chen
2015-12-01 16:12   ` Dr. David Alan Gilbert
2015-12-03  6:35     ` Zhang Chen
2015-12-03  9:09       ` Dr. David Alan Gilbert
2015-12-04  3:21         ` Zhang Chen
2015-12-04  9:14           ` Dr. David Alan Gilbert
2015-11-27 12:27 ` [Qemu-devel] [RFC PATCH 8/9] net/colo-proxy: enqueue primary and secondary packet Zhang Chen
2015-11-27 12:27 ` [Qemu-devel] [RFC PATCH 9/9] net/colo-proxy: add packet compare and notify checkpoint Zhang Chen
2015-12-01 16:37   ` Dr. David Alan Gilbert
2015-12-03  7:10     ` Zhang Chen
2015-12-01 16:44 ` [Qemu-devel] [RFC PATCH 0/9] Add colo-proxy based on netfilter Dr. David Alan Gilbert
2015-12-03  7:33   ` Zhang Chen

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=20151201155014.GD26419@work-vm \
    --to=dgilbert@redhat.com \
    --cc=arei.gonglei@huawei.com \
    --cc=eddie.dong@intel.com \
    --cc=guijianfeng@cn.fujitsu.com \
    --cc=jan.kiszka@siemens.com \
    --cc=jasowang@redhat.com \
    --cc=lizhijian@cn.fujitsu.com \
    --cc=peter.huangpeng@huawei.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    --cc=zhang.zhanghailiang@huawei.com \
    --cc=zhangchen.fnst@cn.fujitsu.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.