diff options
author | Zhang Chen | 2016-09-27 04:22:33 +0200 |
---|---|---|
committer | Jason Wang | 2016-09-27 11:54:22 +0200 |
commit | afe461240940077e7ea8313e9c547a4898263cd2 (patch) | |
tree | 39934b9a6a266b4434bd12c232f4fabadc6bedce /net/filter-rewriter.c | |
parent | filter-rewriter: introduce filter-rewriter initialization (diff) | |
download | qemu-afe461240940077e7ea8313e9c547a4898263cd2.tar.gz qemu-afe461240940077e7ea8313e9c547a4898263cd2.tar.xz qemu-afe461240940077e7ea8313e9c547a4898263cd2.zip |
filter-rewriter: track connection and parse packet
We use net/colo.h to track connection and parse packet
Signed-off-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
Signed-off-by: Li Zhijian <lizhijian@cn.fujitsu.com>
Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
Diffstat (limited to 'net/filter-rewriter.c')
-rw-r--r-- | net/filter-rewriter.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/net/filter-rewriter.c b/net/filter-rewriter.c index de29f07cb6..9bf80d3955 100644 --- a/net/filter-rewriter.c +++ b/net/filter-rewriter.c @@ -44,6 +44,20 @@ static void filter_rewriter_flush(NetFilterState *nf) } } +/* + * 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, @@ -51,11 +65,47 @@ static ssize_t colo_rewriter_receive_iov(NetFilterState *nf, int iovcnt, NetPacketSent *sent_cb) { + RewriterState *s = FILTER_COLO_REWRITER(nf); + Connection *conn; + ConnectionKey key; + 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 (pkt && is_tcp_packet(pkt)) { + + fill_connection_key(pkt, &key); + + if (sender == nf->netdev) { + /* + * We need make tcp TX and RX packet + * into one connection. + */ + reverse_connection_key(&key); + } + conn = connection_get(s->connection_track_table, + &key, + NULL); + + if (sender == nf->netdev) { + /* 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; } |