On Wed, 3 Mar 2021 12:15:38 +0800 Zhang Chen wrote: > From: Zhang Chen > > Add passthrough list for each CompareState. > > Signed-off-by: Zhang Chen > --- > 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; > }; --