From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59599) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bUUzh-00039Z-H7 for qemu-devel@nongnu.org; Tue, 02 Aug 2016 04:24:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bUUzc-00013j-Do for qemu-devel@nongnu.org; Tue, 02 Aug 2016 04:24:08 -0400 Received: from mx1.redhat.com ([209.132.183.28]:42692) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bUUzc-00013W-5E for qemu-devel@nongnu.org; Tue, 02 Aug 2016 04:24:04 -0400 References: <1469700748-19754-1-git-send-email-zhangchen.fnst@cn.fujitsu.com> <1469700748-19754-9-git-send-email-zhangchen.fnst@cn.fujitsu.com> From: Jason Wang Message-ID: Date: Tue, 2 Aug 2016 16:23:57 +0800 MIME-Version: 1.0 In-Reply-To: <1469700748-19754-9-git-send-email-zhangchen.fnst@cn.fujitsu.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH V11 8/9] filter-rewriter: track connection and parse packet List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Zhang Chen , qemu devel Cc: Li Zhijian , "eddie . dong" , "Dr . David Alan Gilbert" , zhanghailiang On 2016=E5=B9=B407=E6=9C=8828=E6=97=A5 18:12, Zhang Chen wrote: > We use colo-base.h to track connection and parse packet > > Signed-off-by: Zhang Chen > Signed-off-by: Li Zhijian > Signed-off-by: Wen Congyang > --- > net/colo-base.c | 14 ++++++++++++++ > net/colo-base.h | 1 + > net/filter-rewriter.c | 50 ++++++++++++++++++++++++++++++++++++++++++= ++++++++ > 3 files changed, 65 insertions(+) > > diff --git a/net/colo-base.c b/net/colo-base.c > index eb1b631..20797b5 100644 > --- a/net/colo-base.c > +++ b/net/colo-base.c > @@ -103,6 +103,20 @@ void fill_connection_key(Packet *pkt, ConnectionKe= y *key) > } > } > =20 > +void reverse_connection_key(ConnectionKey *key) > +{ > + struct in_addr tmp_ip; > + uint16_t tmp_port; > + > + tmp_ip =3D key->src; > + key->src =3D key->dst; > + key->dst =3D tmp_ip; > + > + tmp_port =3D key->src_port; > + key->src_port =3D key->dst_port; > + key->dst_port =3D tmp_port; > +} > + > Connection *connection_new(ConnectionKey *key) > { > Connection *conn =3D g_slice_new(Connection); > diff --git a/net/colo-base.h b/net/colo-base.h > index 860a148..8d402a3 100644 > --- a/net/colo-base.h > +++ b/net/colo-base.h > @@ -56,6 +56,7 @@ uint32_t connection_key_hash(const void *opaque); > int connection_key_equal(const void *opaque1, const void *opaque2); > int parse_packet_early(Packet *pkt); > void fill_connection_key(Packet *pkt, ConnectionKey *key); > +void reverse_connection_key(ConnectionKey *key); > Connection *connection_new(ConnectionKey *key); > void connection_destroy(void *opaque); > Connection *connection_get(GHashTable *connection_track_table, > diff --git a/net/filter-rewriter.c b/net/filter-rewriter.c > index 3a39f52..6350080 100644 > --- a/net/filter-rewriter.c > +++ b/net/filter-rewriter.c > @@ -51,6 +51,20 @@ static void filter_rewriter_flush(NetFilterState *nf= ) > } > } > =20 > +/* > + * 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 =3D=3D IPPROTO_TCP) { > + return 1; > + } else { > + return 0; > + } > +} > + > static ssize_t colo_rewriter_receive_iov(NetFilterState *nf, > NetClientState *sender, > unsigned flags, > @@ -58,11 +72,47 @@ static ssize_t colo_rewriter_receive_iov(NetFilterS= tate *nf, > int iovcnt, > NetPacketSent *sent_cb) > { > + RewriterState *s =3D FILTER_COLO_REWRITER(nf); > + Connection *conn; > + ConnectionKey key =3D {{ 0 } }; > + Packet *pkt; > + ssize_t size =3D iov_size(iov, iovcnt); > + char *buf =3D g_malloc0(size); > + > + iov_to_buf(iov, iovcnt, 0, buf, size); > + pkt =3D 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)) { > + > + fill_connection_key(pkt, &key); > + > + if (sender =3D=3D nf->netdev) { > + /* > + * We need make tcp TX and RX packet > + * into one connection. > + */ > + reverse_connection_key(&key); Why not simply do the comparing and swap in fill_connection_key()? > + } > + conn =3D connection_get(s->connection_track_table, > + &key, > + &s->hashtable_size); > + > + if (sender =3D=3D nf->netdev) { > + /* NET_FILTER_DIRECTION_TX */ > + /* handle_primary_tcp_pkt */ > + } else { > + /* NET_FILTER_DIRECTION_RX */ > + /* handle_secondary_tcp_pkt */ > + } > + } > + > + packet_destroy(pkt, NULL); > + pkt =3D NULL; > return 0; > } > =20