From: Zhang Chen <chen.zh...@intel.com> Add passthrough list for each CompareState.
Signed-off-by: Zhang Chen <chen.zh...@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; + } + } + } + } + } + } + } + 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; }; -- 2.25.1