All of lore.kernel.org
 help / color / mirror / Atom feed
From: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
To: Hailiang Zhang <zhang.zhanghailiang@huawei.com>,
	qemu devel <qemu-devel@nongnu.org>,
	Jason Wang <jasowang@redhat.com>,
	Stefan Hajnoczi <stefanha@redhat.com>
Cc: Li Zhijian <lizhijian@cn.fujitsu.com>,
	Gui jianfeng <guijianfeng@cn.fujitsu.com>,
	"eddie.dong" <eddie.dong@intel.com>,
	peter.huangpeng@huawei.com,
	"Dr. David Alan Gilbert" <dgilbert@redhat.com>,
	Gong lei <arei.gonglei@huawei.com>,
	jan.kiszka@siemens.com, hongyang.yang@easystack.cn
Subject: Re: [Qemu-devel] [RFC PATCH 4/9] colo-proxy: add colo-proxy setup work
Date: Mon, 30 Nov 2015 10:35:51 +0800	[thread overview]
Message-ID: <565BB607.2010100@cn.fujitsu.com> (raw)
In-Reply-To: <5659194F.5090401@huawei.com>



On 11/28/2015 11:02 AM, Hailiang Zhang wrote:
> On 2015/11/27 20:27, Zhang Chen wrote:
>> From: zhangchen <zhangchen.fnst@cn.fujitsu.com>
>>
>> Secondary setup socket server for colo-forward
>> primary setup connect to secondary for colo-forward
>> add data structure will be uesed
>>
>> Signed-off-by: zhangchen <zhangchen.fnst@cn.fujitsu.com>
>> ---
>>   net/colo-proxy.c | 87 
>> +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>>   net/colo-proxy.h | 61 +++++++++++++++++++++++++++++++++++++++
>>   2 files changed, 147 insertions(+), 1 deletion(-)
>>
>> diff --git a/net/colo-proxy.c b/net/colo-proxy.c
>> index 98c2699..89d9616 100644
>> --- a/net/colo-proxy.c
>> +++ b/net/colo-proxy.c
>> @@ -22,6 +22,8 @@
>>   #define DEBUG(format, ...)
>>   #endif
>>
>
>> +static char *mode;
>> +static bool colo_do_checkpoint;
>>
>
>>   static ssize_t colo_proxy_receive_iov(NetFilterState *nf,
>>                                            NetClientState *sender,
>> @@ -46,13 +48,84 @@ static ssize_t 
>> colo_proxy_receive_iov(NetFilterState *nf,
>>
>>   static void colo_proxy_cleanup(NetFilterState *nf)
>>   {
>> -     /* cleanup */
>> +    ColoProxyState *s = FILTER_COLO_PROXY(nf);
>> +    close(s->sockfd);
>> +    s->sockfd = -1;
>> +    g_free(mode);
>> +    g_free(s->addr);
>>   }
>>
>
> Please move the above codes to the previous patch~
>

ok

thanks for review
zhangchen

>> +static void colo_accept_incoming(ColoProxyState *s)
>> +{
>> +    DEBUG("into colo_accept_incoming\n");
>> +    struct sockaddr_in addr;
>> +    socklen_t addrlen = sizeof(addr);
>> +    int acceptsock, err;
>> +
>> +    do {
>> +        acceptsock = qemu_accept(s->sockfd, (struct sockaddr 
>> *)&addr, &addrlen);
>> +        err = socket_error();
>> +    } while (acceptsock < 0 && err == EINTR);
>> +    qemu_set_fd_handler(s->sockfd, NULL, NULL, NULL);
>> +    closesocket(s->sockfd);
>> +
>> +    DEBUG("accept colo proxy\n");
>> +
>
> It's better to use trace instead of DEBUG~

ok,i will fix it in next version

>
>> +    if (acceptsock < 0) {
>> +        printf("could not accept colo connection (%s)\n",
>> +                     strerror(err));
>
> /printf/error_report/g

fix

>
>> +        return;
>> +    }
>> +    s->sockfd = acceptsock;
>> +    /* TODO: handle the packets that primary forward */
>> +    return;
>> +}
>> +
>> +/* Return 1 on success, or return -1 if failed */
>> +static ssize_t colo_start_incoming(ColoProxyState *s)
>> +{
>> +    int serversock;
>
> Space~

fix

>
>> +    serversock = inet_listen(s->addr, NULL, 256, SOCK_STREAM, 0, NULL);
>> +    if (serversock < 0) {
>> +        g_free(s->addr);
>> +        return -1;
>> +    }
>> +    s->sockfd = serversock;
>> +    qemu_set_fd_handler(serversock, (IOHandler 
>> *)colo_accept_incoming, NULL,
>> +                        (void *)s);
>> +    g_free(s->addr);
>
> Double free ? I noticed you also free this in colo_proxy_cleanup(), 
> we'd better do this in
> the cleanup function.

fix,thanks

>
>> +    return 1;
>
> Odd, it's better to return 0 to indicate success.
>

will fix in next version

>> +}
>> +
>> +/* Return 1 on success, or return -1 if setup failed */
>> +static ssize_t colo_proxy_primary_setup(NetFilterState *nf)
>> +{
>> +    ColoProxyState *s = FILTER_COLO_PROXY(nf);
>> +    int sock;
>
>> +    sock = inet_connect(s->addr, NULL);
>> +    if (sock < 0) {
>> +        printf("colo proxy connect failed\n");
>> +        g_free(s->addr);
>
>> +        return -1;
>> +    }
>> +    DEBUG("colo proxy connect success\n");
>> +    s->sockfd = sock;
>> +   /* TODO: handle the packets that secondary forward */
>> +    g_free(s->addr);
>
> As above comment.
>
>> +    return 1;
>
>> +}
>> +
>> +/* Return 1 on success, or return -1 if setup failed */
>> +static ssize_t colo_proxy_secondary_setup(NetFilterState *nf)
>> +{
>> +    ColoProxyState *s = FILTER_COLO_PROXY(nf);
>
> Space~
>

fix

>> +    return colo_start_incoming(s);
>> +}
>>
>>   static void colo_proxy_setup(NetFilterState *nf, Error **errp)
>>   {
>>       ColoProxyState *s = FILTER_COLO_PROXY(nf);
>> +    ssize_t ret = 0;
>
> Space~
>

fix

>>       if (!s->addr) {
>>           error_setg(errp, "filter colo_proxy needs 'addr' \
>>                        property set!");
>> @@ -68,17 +141,29 @@ static void colo_proxy_setup(NetFilterState *nf, 
>> Error **errp)
>>       s->sockfd = -1;
>>       s->has_failover = false;
>>       colo_do_checkpoint = false;
>> +    s->incoming_queue = 
>> qemu_new_net_queue(qemu_netfilter_pass_to_next, nf);
>> +    s->unprocessed_packets = g_hash_table_new_full(connection_key_hash,
>> + connection_key_equal,
>> +                                                       g_free,
>> + connection_destroy);
>>       g_queue_init(&s->unprocessed_connections);
>>
>>       if (!strcmp(mode, PRIMARY_MODE)) {
>>           s->colo_mode = COLO_PRIMARY_MODE;
>> +        ret = colo_proxy_primary_setup(nf);
>>       } else if (!strcmp(mode, SECONDARY_MODE)) {
>>           s->colo_mode = COLO_SECONDARY_MODE;
>> +        ret = colo_proxy_secondary_setup(nf);
>>       } else {
>>           error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "mode",
>>                       "primary or secondary");
>>           return;
>>       }
>> +    if (ret) {
>> +        DEBUG("colo_proxy_setup success\n");
>> +    } else {
>> +        DEBUG("colo_proxy_setup failed\n");
>> +    }
>>   }
>>
>>   static void colo_proxy_class_init(ObjectClass *oc, void *data)
>> diff --git a/net/colo-proxy.h b/net/colo-proxy.h
>> index 94afbc7..f77db2f 100644
>> --- a/net/colo-proxy.h
>> +++ b/net/colo-proxy.h
>> @@ -60,4 +60,65 @@ typedef struct ColoProxyState {
>>       Coroutine *co;
>>   } ColoProxyState;
>>
>> +struct ip {
>> +#ifdef HOST_WORDS_BIGENDIAN
>> +    uint8_t  ip_v:4,                 /* version */
>> +             ip_hl:4;                /* header length */
>> +#else
>> +    uint8_t  ip_hl:4,                /* header length */
>> +             ip_v:4;                 /* version */
>> +#endif
>> +    uint8_t  ip_tos;                 /* type of service */
>> +    uint16_t ip_len;                 /* total length */
>> +    uint16_t ip_id;                  /* identification */
>> +    uint16_t ip_off;                 /* fragment offset field */
>> +#define    IP_DF 0x4000              /* don't fragment flag */
>> +#define    IP_MF 0x2000              /* more fragments flag */
>> +#define    IP_OFFMASK 0x1fff
>> +/* mask for fragmenting bits */
>> +    uint8_t  ip_ttl;                 /* time to live */
>> +    uint8_t  ip_p;                   /* protocol */
>> +    uint16_t ip_sum;                 /* checksum */
>> +    uint32_t ip_src, ip_dst;         /* source and dest address */
>> +} QEMU_PACKED;
>> +
>> +typedef struct Packet {
>> +    void *data;
>> +    union {
>> +        uint8_t *network_layer;
>> +        struct ip *ip;
>> +    };
>> +    uint8_t *transport_layer;
>> +    int size;
>> +    ColoProxyState *s;
>> +    bool should_be_sent;
>> +    NetClientState *sender;
>> +} Packet;
>> +
>> +typedef struct Connection_key {
>> +    /* (src, dst) must be grouped, in the same way than in IP header */
>> +    uint32_t src;
>> +    uint32_t dst;
>> +    union {
>> +        uint32_t ports;
>> +        uint16_t port16[2];
>> +    };
>> +    uint8_t ip_proto;
>> +} QEMU_PACKED Connection_key;
>> +
>> +typedef struct Connection {
>> +    /* connection primary send queue */
>> +    GQueue primary_list;
>> +    /* connection secondary send queue */
>> +    GQueue secondary_list;
>> +     /* flag to enqueue unprocessed_connections */
>> +    bool processing;
>> +} Connection;
>> +
>> +typedef enum {
>> +    PRIMARY_OUTPUT,           /* primary output packet queue */
>> +    PRIMARY_INPUT,            /* primary input packet queue */
>> +    SECONDARY_OUTPUT,         /* secondary output packet queue */
>> +} packet_type;
>> +
>>   #endif /* QEMU_COLO_PROXY_H */
>>
>
>
>
>
> .
>

  reply	other threads:[~2015-11-30  2:34 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 [this message]
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
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=565BB607.2010100@cn.fujitsu.com \
    --to=zhangchen.fnst@cn.fujitsu.com \
    --cc=arei.gonglei@huawei.com \
    --cc=dgilbert@redhat.com \
    --cc=eddie.dong@intel.com \
    --cc=guijianfeng@cn.fujitsu.com \
    --cc=hongyang.yang@easystack.cn \
    --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 \
    /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.