We use colo-base.h to track connection and parse packet Signed-off-by: Zhang Chen <zhangchen.f...@cn.fujitsu.com> Signed-off-by: Li Zhijian <lizhij...@cn.fujitsu.com> Signed-off-by: Wen Congyang <we...@cn.fujitsu.com> --- net/filter-rewriter.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+)
diff --git a/net/filter-rewriter.c b/net/filter-rewriter.c index 08b015d..12f88c5 100644 --- a/net/filter-rewriter.c +++ b/net/filter-rewriter.c @@ -50,6 +50,20 @@ typedef struct RewriterState { uint32_t hashtable_size; } RewriterState; +/* + * Return 1 on success, if return 0 means the pkt + * is not TCP packet + */ +static int is_tcp_packet(Packet *pkt) +{ + if (!parse_packet_early(pkt) && + pkt->ip->ip_p == IPPROTO_TCP) { + return 1; + } else { + return 0; + } +} + static ssize_t colo_rewriter_receive_iov(NetFilterState *nf, NetClientState *sender, unsigned flags, @@ -57,11 +71,50 @@ static ssize_t colo_rewriter_receive_iov(NetFilterState *nf, int iovcnt, NetPacketSent *sent_cb) { + RewriterState *s = FILTER_COLO_REWRITER(nf); + Connection *conn; + ConnectionKey key = {{ 0 } }; + Packet *pkt; + ssize_t size = iov_size(iov, iovcnt); + char *buf = g_malloc0(size); + + iov_to_buf(iov, iovcnt, 0, buf, size); + pkt = packet_new(buf, size); + /* * if we get tcp packet * we will rewrite it to make secondary guest's * connection established successfully */ + if (is_tcp_packet(pkt)) { + if (sender == nf->netdev) { + fill_connection_key(pkt, &key, SECONDARY); + } else { + fill_connection_key(pkt, &key, PRIMARY); + } + + conn = connection_get(s->connection_track_table, + &key, + &s->hashtable_size); + if (!conn->processing) { + qemu_mutex_lock(&s->conn_list_lock); + g_queue_push_tail(&s->conn_list, conn); + qemu_mutex_unlock(&s->conn_list_lock); + conn->processing = true; + } + + if (sender == nf->netdev) { + /* This packet is sent by netdev itself */ + /* NET_FILTER_DIRECTION_TX */ + /* handle_primary_tcp_pkt */ + } else { + /* NET_FILTER_DIRECTION_RX */ + /* handle_secondary_tcp_pkt */ + } + } + + packet_destroy(pkt, NULL); + pkt = NULL; return 0; } -- 2.7.4