Message ID | 20210303041539.1032415-7-chen.zhang@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Bypass specific network traffic in COLO | expand |
On Wed, 3 Mar 2021 12:15:38 +0800 Zhang Chen <chen.zhang@intel.com > wrote: > From: Zhang Chen <chen.zhang@intel.com> > > Add passthrough list for each CompareState. > > Signed-off-by: Zhang Chen <chen.zhang@intel.com> > --- > net/colo-compare.c | 25 +++++++++++++++++++++++++ > net/colo-compare.h | 10 ++++++++++ > 2 files changed, 35 insertions(+) > > diff --git a/net/colo-compare.c b/net/colo-compare.c > index a803f8b888..80cea32c20 100644 > --- a/net/colo-compare.c > +++ b/net/colo-compare.c > @@ -141,6 +141,7 @@ static int packet_enqueue(CompareState *s, int mode, Connection **con) > ConnectionKey key; > Packet *pkt = NULL; > Connection *conn; > + PassthroughEntry *bypass, *next; > int ret; > > if (mode == PRIMARY_IN) { > @@ -160,6 +161,29 @@ static int packet_enqueue(CompareState *s, int mode, Connection **con) > } > fill_connection_key(pkt, &key); > > + /* Check COLO passthrough connenction */ > + if (!QLIST_EMPTY(&s->passthroughlist)) { > + QLIST_FOREACH_SAFE(bypass, &s->passthroughlist, node, next) { > + if (((key.ip_proto == IPPROTO_TCP) && (bypass->l4_protocol == 0)) || > + ((key.ip_proto == IPPROTO_UDP) && (bypass->l4_protocol == 1))) { > + if (bypass->src_port == 0 || bypass->src_port == key.dst_port) { > + if (bypass->src_ip.s_addr == 0 || > + bypass->src_ip.s_addr == key.src.s_addr) { > + if (bypass->dst_port == 0 || > + bypass->dst_port == key.src_port) { > + if (bypass->dst_ip.s_addr == 0 || > + bypass->dst_ip.s_addr == key.dst.s_addr) { > + packet_destroy(pkt, NULL); > + pkt = NULL; > + return -1; > + } > + } > + } > + } > + } > + } > + } > + Hi, Access to s->passthroughlist still needs to be protected by a lock. Regards, Lukas Straub > conn = connection_get(s->connection_track_table, > &key, > &s->conn_list); > @@ -1224,6 +1248,7 @@ static void colo_compare_complete(UserCreatable *uc, Error **errp) > } > > g_queue_init(&s->conn_list); > + QLIST_INIT(&s->passthroughlist); > > s->connection_track_table = g_hash_table_new_full(connection_key_hash, > connection_key_equal, > diff --git a/net/colo-compare.h b/net/colo-compare.h > index 2a9dcac0a7..31644f145b 100644 > --- a/net/colo-compare.h > +++ b/net/colo-compare.h > @@ -54,6 +54,15 @@ typedef struct SendEntry { > uint8_t *buf; > } SendEntry; > > +typedef struct PassthroughEntry { > + int l4_protocol; > + int src_port; > + int dst_port; > + struct in_addr src_ip; > + struct in_addr dst_ip; > + QLIST_ENTRY(PassthroughEntry) node; > +} PassthroughEntry; > + > /* > * + CompareState ++ > * | | > @@ -110,6 +119,7 @@ struct CompareState { > > QEMUBH *event_bh; > enum colo_event event; > + QLIST_HEAD(, PassthroughEntry) passthroughlist; > > QTAILQ_ENTRY(CompareState) next; > }; --
> -----Original Message----- > From: Lukas Straub <lukasstraub2@web.de> > Sent: Thursday, March 18, 2021 5:16 AM > To: Zhang, Chen <chen.zhang@intel.com> > Cc: Jason Wang <jasowang@redhat.com>; qemu-dev <qemu- > devel@nongnu.org>; Eric Blake <eblake@redhat.com>; Dr. David Alan > Gilbert <dgilbert@redhat.com>; Markus Armbruster <armbru@redhat.com>; > Zhang Chen <zhangckid@gmail.com> > Subject: Re: [PATCH V2 6/7] net/colo-compare: Add passthrough list to > CompareState > > On Wed, 3 Mar 2021 12:15:38 +0800 > Zhang Chen <chen.zhang@intel.com > wrote: > > > From: Zhang Chen <chen.zhang@intel.com> > > > > Add passthrough list for each CompareState. > > > > Signed-off-by: Zhang Chen <chen.zhang@intel.com> > > --- > > net/colo-compare.c | 25 +++++++++++++++++++++++++ net/colo- > compare.h > > | 10 ++++++++++ > > 2 files changed, 35 insertions(+) > > > > diff --git a/net/colo-compare.c b/net/colo-compare.c index > > a803f8b888..80cea32c20 100644 > > --- a/net/colo-compare.c > > +++ b/net/colo-compare.c > > @@ -141,6 +141,7 @@ static int packet_enqueue(CompareState *s, int > mode, Connection **con) > > ConnectionKey key; > > Packet *pkt = NULL; > > Connection *conn; > > + PassthroughEntry *bypass, *next; > > int ret; > > > > if (mode == PRIMARY_IN) { > > @@ -160,6 +161,29 @@ static int packet_enqueue(CompareState *s, int > mode, Connection **con) > > } > > fill_connection_key(pkt, &key); > > > > + /* Check COLO passthrough connenction */ > > + if (!QLIST_EMPTY(&s->passthroughlist)) { > > + QLIST_FOREACH_SAFE(bypass, &s->passthroughlist, node, next) { > > + if (((key.ip_proto == IPPROTO_TCP) && (bypass->l4_protocol == 0)) > || > > + ((key.ip_proto == IPPROTO_UDP) && (bypass->l4_protocol == 1))) > { > > + if (bypass->src_port == 0 || bypass->src_port == key.dst_port) { > > + if (bypass->src_ip.s_addr == 0 || > > + bypass->src_ip.s_addr == key.src.s_addr) { > > + if (bypass->dst_port == 0 || > > + bypass->dst_port == key.src_port) { > > + if (bypass->dst_ip.s_addr == 0 || > > + bypass->dst_ip.s_addr == key.dst.s_addr) { > > + packet_destroy(pkt, NULL); > > + pkt = NULL; > > + return -1; > > + } > > + } > > + } > > + } > > + } > > + } > > + } > > + > > Hi, > Access to s->passthroughlist still needs to be protected by a lock. > OK, will fix it in next version. Thanks Chen > Regards, > Lukas Straub > > > conn = connection_get(s->connection_track_table, > > &key, > > &s->conn_list); @@ -1224,6 +1248,7 @@ > > static void colo_compare_complete(UserCreatable *uc, Error **errp) > > } > > > > g_queue_init(&s->conn_list); > > + QLIST_INIT(&s->passthroughlist); > > > > s->connection_track_table = > g_hash_table_new_full(connection_key_hash, > > > > connection_key_equal, diff --git a/net/colo-compare.h > > b/net/colo-compare.h index 2a9dcac0a7..31644f145b 100644 > > --- a/net/colo-compare.h > > +++ b/net/colo-compare.h > > @@ -54,6 +54,15 @@ typedef struct SendEntry { > > uint8_t *buf; > > } SendEntry; > > > > +typedef struct PassthroughEntry { > > + int l4_protocol; > > + int src_port; > > + int dst_port; > > + struct in_addr src_ip; > > + struct in_addr dst_ip; > > + QLIST_ENTRY(PassthroughEntry) node; } PassthroughEntry; > > + > > /* > > * + CompareState ++ > > * | | > > @@ -110,6 +119,7 @@ struct CompareState { > > > > QEMUBH *event_bh; > > enum colo_event event; > > + QLIST_HEAD(, PassthroughEntry) passthroughlist; > > > > QTAILQ_ENTRY(CompareState) next; > > }; > > > > --
diff --git a/net/colo-compare.c b/net/colo-compare.c index a803f8b888..80cea32c20 100644 --- a/net/colo-compare.c +++ b/net/colo-compare.c @@ -141,6 +141,7 @@ static int packet_enqueue(CompareState *s, int mode, Connection **con) ConnectionKey key; Packet *pkt = NULL; Connection *conn; + PassthroughEntry *bypass, *next; int ret; if (mode == PRIMARY_IN) { @@ -160,6 +161,29 @@ static int packet_enqueue(CompareState *s, int mode, Connection **con) } fill_connection_key(pkt, &key); + /* Check COLO passthrough connenction */ + if (!QLIST_EMPTY(&s->passthroughlist)) { + QLIST_FOREACH_SAFE(bypass, &s->passthroughlist, node, next) { + if (((key.ip_proto == IPPROTO_TCP) && (bypass->l4_protocol == 0)) || + ((key.ip_proto == IPPROTO_UDP) && (bypass->l4_protocol == 1))) { + if (bypass->src_port == 0 || bypass->src_port == key.dst_port) { + if (bypass->src_ip.s_addr == 0 || + bypass->src_ip.s_addr == key.src.s_addr) { + if (bypass->dst_port == 0 || + bypass->dst_port == key.src_port) { + if (bypass->dst_ip.s_addr == 0 || + bypass->dst_ip.s_addr == key.dst.s_addr) { + packet_destroy(pkt, NULL); + pkt = NULL; + return -1; + } + } + } + } + } + } + } + conn = connection_get(s->connection_track_table, &key, &s->conn_list); @@ -1224,6 +1248,7 @@ static void colo_compare_complete(UserCreatable *uc, Error **errp) } g_queue_init(&s->conn_list); + QLIST_INIT(&s->passthroughlist); s->connection_track_table = g_hash_table_new_full(connection_key_hash, connection_key_equal, diff --git a/net/colo-compare.h b/net/colo-compare.h index 2a9dcac0a7..31644f145b 100644 --- a/net/colo-compare.h +++ b/net/colo-compare.h @@ -54,6 +54,15 @@ typedef struct SendEntry { uint8_t *buf; } SendEntry; +typedef struct PassthroughEntry { + int l4_protocol; + int src_port; + int dst_port; + struct in_addr src_ip; + struct in_addr dst_ip; + QLIST_ENTRY(PassthroughEntry) node; +} PassthroughEntry; + /* * + CompareState ++ * | | @@ -110,6 +119,7 @@ struct CompareState { QEMUBH *event_bh; enum colo_event event; + QLIST_HEAD(, PassthroughEntry) passthroughlist; QTAILQ_ENTRY(CompareState) next; };