From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51112) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bJuBh-0000A4-Md for qemu-devel@nongnu.org; Sun, 03 Jul 2016 23:04:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bJuBc-0000yk-5p for qemu-devel@nongnu.org; Sun, 03 Jul 2016 23:04:44 -0400 Received: from mx1.redhat.com ([209.132.183.28]:33266) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bJuBb-0000yU-TN for qemu-devel@nongnu.org; Sun, 03 Jul 2016 23:04:40 -0400 References: <1467440540-6630-1-git-send-email-zhangchen.fnst@cn.fujitsu.com> <1467440540-6630-3-git-send-email-zhangchen.fnst@cn.fujitsu.com> From: Jason Wang Message-ID: <5779D240.6080407@redhat.com> Date: Mon, 4 Jul 2016 11:04:32 +0800 MIME-Version: 1.0 In-Reply-To: <1467440540-6630-3-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] [RFC PATCH V2 2/3] 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=8802=E6=97=A5 14:22, 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/filter-rewriter.c | 52 ++++++++++++++++++++++++++++++++++++++++++= +++++++++ > 1 file changed, 52 insertions(+) > > diff --git a/net/filter-rewriter.c b/net/filter-rewriter.c > index 08b015d..c38ab24 100644 > --- a/net/filter-rewriter.c > +++ b/net/filter-rewriter.c > @@ -50,6 +50,20 @@ typedef struct RewriterState { > uint32_t hashtable_size; > } RewriterState; > =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, > @@ -57,11 +71,49 @@ 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)) { > + if (sender =3D=3D nf->netdev) { > + fill_connection_key(pkt, &key, SECONDARY); > + } else { > + fill_connection_key(pkt, &key, PRIMARY); > + } > + > + conn =3D 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_list was never used in this series, and I fail to understand why=20 conn_list is needed? > + conn->processing =3D true; > + } > + > + 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