From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60774) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b2rcH-0002iC-FC for qemu-devel@nongnu.org; Tue, 17 May 2016 22:53:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1b2rcC-0004Vm-QR for qemu-devel@nongnu.org; Tue, 17 May 2016 22:53:45 -0400 Received: from mx1.redhat.com ([209.132.183.28]:49863) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b2rcC-0004Vi-H6 for qemu-devel@nongnu.org; Tue, 17 May 2016 22:53:40 -0400 References: <1463124919-10417-1-git-send-email-zhangchen.fnst@cn.fujitsu.com> From: Jason Wang Message-ID: <573BD92E.7030309@redhat.com> Date: Wed, 18 May 2016 10:53:34 +0800 MIME-Version: 1.0 In-Reply-To: <1463124919-10417-1-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 V4] net/net: Add SocketReadState for reuse codes List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Zhang Chen , qemu devel Cc: Li Zhijian , Wen Congyang , "eddie . dong" , "Dr . David Alan Gilbert" On 2016=E5=B9=B405=E6=9C=8813=E6=97=A5 15:35, Zhang Chen wrote: > This function is from net/socket.c, move it to net.c and net.h. > Add SocketReadState to make others reuse net_fill_rstate(). > suggestion from jason. > > v4: > - move 'rs->finalize =3D finalize' to rs_init() > > v3: > - remove SocketReadState init callback > - put finalize callback to net_fill_rstate() > > v2: > - rename ReadState to SocketReadState > - add SocketReadState init and finalize callback > > v1: > - init patch > > Signed-off-by: Zhang Chen > Signed-off-by: Li Zhijian > Signed-off-by: Wen Congyang Applied to -net. Thanks > --- > include/net/net.h | 13 +++++++++ > net/filter-mirror.c | 66 +++++++++++---------------------------------= - > net/net.c | 70 ++++++++++++++++++++++++++++++++++++++++++++= ++++ > net/socket.c | 77 +++++++++++++++-----------------------------= --------- > 4 files changed, 121 insertions(+), 105 deletions(-) > > diff --git a/include/net/net.h b/include/net/net.h > index 73e4c46..c457bd5 100644 > --- a/include/net/net.h > +++ b/include/net/net.h > @@ -57,6 +57,8 @@ typedef void (SetOffload)(NetClientState *, int, int,= int, int, int); > typedef void (SetVnetHdrLen)(NetClientState *, int); > typedef int (SetVnetLE)(NetClientState *, bool); > typedef int (SetVnetBE)(NetClientState *, bool); > +typedef struct SocketReadState SocketReadState; > +typedef void (SocketReadStateFinalize)(SocketReadState *rs); > =20 > typedef struct NetClientInfo { > NetClientOptionsKind type; > @@ -102,6 +104,15 @@ typedef struct NICState { > bool peer_deleted; > } NICState; > =20 > +struct SocketReadState { > + int state; /* 0 =3D getting length, 1 =3D getting data */ > + uint32_t index; > + uint32_t packet_len; > + uint8_t buf[NET_BUFSIZE]; > + SocketReadStateFinalize *finalize; > +}; > + > +int net_fill_rstate(SocketReadState *rs, const uint8_t *buf, int size)= ; > char *qemu_mac_strdup_printf(const uint8_t *macaddr); > NetClientState *qemu_find_netdev(const char *id); > int qemu_find_net_clients_except(const char *id, NetClientState **ncs= , > @@ -160,6 +171,8 @@ ssize_t qemu_deliver_packet_iov(NetClientState *sen= der, > =20 > void print_net_client(Monitor *mon, NetClientState *nc); > void hmp_info_network(Monitor *mon, const QDict *qdict); > +void net_socket_rs_init(SocketReadState *rs, > + SocketReadStateFinalize *finalize); > =20 > /* NIC info */ > =20 > diff --git a/net/filter-mirror.c b/net/filter-mirror.c > index c0c4dc6..35df374 100644 > --- a/net/filter-mirror.c > +++ b/net/filter-mirror.c > @@ -40,10 +40,7 @@ typedef struct MirrorState { > char *outdev; > CharDriverState *chr_in; > CharDriverState *chr_out; > - int state; /* 0 =3D getting length, 1 =3D getting data */ > - unsigned int index; > - unsigned int packet_len; > - uint8_t buf[REDIRECTOR_MAX_LEN]; > + SocketReadState rs; > } MirrorState; > =20 > static int filter_mirror_send(CharDriverState *chr_out, > @@ -108,51 +105,12 @@ static void redirector_chr_read(void *opaque, con= st uint8_t *buf, int size) > { > NetFilterState *nf =3D opaque; > MirrorState *s =3D FILTER_REDIRECTOR(nf); > - unsigned int l; > - > - while (size > 0) { > - /* reassemble a packet from the network */ > - switch (s->state) { /* 0 =3D getting length, 1 =3D getting dat= a */ > - case 0: > - l =3D 4 - s->index; > - if (l > size) { > - l =3D size; > - } > - memcpy(s->buf + s->index, buf, l); > - buf +=3D l; > - size -=3D l; > - s->index +=3D l; > - if (s->index =3D=3D 4) { > - /* got length */ > - s->packet_len =3D ntohl(*(uint32_t *)s->buf); > - s->index =3D 0; > - s->state =3D 1; > - } > - break; > - case 1: > - l =3D s->packet_len - s->index; > - if (l > size) { > - l =3D size; > - } > - if (s->index + l <=3D sizeof(s->buf)) { > - memcpy(s->buf + s->index, buf, l); > - } else { > - error_report("serious error: oversized packet received= ."); > - s->index =3D s->state =3D 0; > - qemu_chr_add_handlers(s->chr_in, NULL, NULL, NULL, NUL= L); > - return; > - } > - > - s->index +=3D l; > - buf +=3D l; > - size -=3D l; > - if (s->index >=3D s->packet_len) { > - s->index =3D 0; > - s->state =3D 0; > - redirector_to_filter(nf, s->buf, s->packet_len); > - } > - break; > - } > + int ret; > + > + ret =3D net_fill_rstate(&s->rs, buf, size); > + > + if (ret =3D=3D -1) { > + qemu_chr_add_handlers(s->chr_in, NULL, NULL, NULL, NULL); > } > } > =20 > @@ -258,6 +216,14 @@ static void filter_mirror_setup(NetFilterState *nf= , Error **errp) > } > } > =20 > +static void redirector_rs_finalize(SocketReadState *rs) > +{ > + MirrorState *s =3D container_of(rs, MirrorState, rs); > + NetFilterState *nf =3D NETFILTER(s); > + > + redirector_to_filter(nf, rs->buf, rs->packet_len); > +} > + > static void filter_redirector_setup(NetFilterState *nf, Error **errp) > { > MirrorState *s =3D FILTER_REDIRECTOR(nf); > @@ -274,7 +240,7 @@ static void filter_redirector_setup(NetFilterState = *nf, Error **errp) > } > } > =20 > - s->state =3D s->index =3D 0; > + net_socket_rs_init(&s->rs, redirector_rs_finalize); > =20 > if (s->indev) { > s->chr_in =3D qemu_chr_find(s->indev); > diff --git a/net/net.c b/net/net.c > index 0ad6217..a8e2e6b 100644 > --- a/net/net.c > +++ b/net/net.c > @@ -1573,3 +1573,73 @@ QemuOptsList qemu_net_opts =3D { > { /* end of list */ } > }, > }; > + > +void net_socket_rs_init(SocketReadState *rs, > + SocketReadStateFinalize *finalize) > +{ > + rs->state =3D 0; > + rs->index =3D 0; > + rs->packet_len =3D 0; > + memset(rs->buf, 0, sizeof(rs->buf)); > + rs->finalize =3D finalize; > +} > + > +/* > + * Returns > + * 0: SocketReadState is not ready > + * 1: SocketReadState is ready > + * otherwise error occurs > + */ > +int net_fill_rstate(SocketReadState *rs, const uint8_t *buf, int size) > +{ > + unsigned int l; > + > + while (size > 0) { > + /* reassemble a packet from the network */ > + switch (rs->state) { /* 0 =3D getting length, 1 =3D getting da= ta */ > + case 0: > + l =3D 4 - rs->index; > + if (l > size) { > + l =3D size; > + } > + memcpy(rs->buf + rs->index, buf, l); > + buf +=3D l; > + size -=3D l; > + rs->index +=3D l; > + if (rs->index =3D=3D 4) { > + /* got length */ > + rs->packet_len =3D ntohl(*(uint32_t *)rs->buf); > + rs->index =3D 0; > + rs->state =3D 1; > + } > + break; > + case 1: > + l =3D rs->packet_len - rs->index; > + if (l > size) { > + l =3D size; > + } > + if (rs->index + l <=3D sizeof(rs->buf)) { > + memcpy(rs->buf + rs->index, buf, l); > + } else { > + fprintf(stderr, "serious error: oversized packet recei= ved," > + "connection terminated.\n"); > + rs->index =3D rs->state =3D 0; > + return -1; > + } > + > + rs->index +=3D l; > + buf +=3D l; > + size -=3D l; > + if (rs->index >=3D rs->packet_len) { > + rs->index =3D 0; > + rs->state =3D 0; > + if (rs->finalize) { > + rs->finalize(rs); > + } > + return 1; > + } > + break; > + } > + } > + return 0; > +} > diff --git a/net/socket.c b/net/socket.c > index 9fa2cd8..333fb9e 100644 > --- a/net/socket.c > +++ b/net/socket.c > @@ -38,11 +38,8 @@ typedef struct NetSocketState { > NetClientState nc; > int listen_fd; > int fd; > - int state; /* 0 =3D getting length, 1 =3D getting data */ > - unsigned int index; > - unsigned int packet_len; > + SocketReadState rs; > unsigned int send_index; /* number of bytes sent (only SOCK_= STREAM) */ > - uint8_t buf[NET_BUFSIZE]; > struct sockaddr_in dgram_dst; /* contains inet host and port dest= ination iff connectionless (SOCK_DGRAM) */ > IOHandler *send_fn; /* differs between SOCK_STREAM/SOCK= _DGRAM */ > bool read_poll; /* waiting to receive data? */ > @@ -143,11 +140,22 @@ static void net_socket_send_completed(NetClientSt= ate *nc, ssize_t len) > } > } > =20 > +static void net_socket_rs_finalize(SocketReadState *rs) > +{ > + NetSocketState *s =3D container_of(rs, NetSocketState, rs); > + > + if (qemu_send_packet_async(&s->nc, rs->buf, > + rs->packet_len, > + net_socket_send_completed) =3D=3D 0) { > + net_socket_read_poll(s, false); > + } > +} > + > static void net_socket_send(void *opaque) > { > NetSocketState *s =3D opaque; > int size; > - unsigned l; > + int ret; > uint8_t buf1[NET_BUFSIZE]; > const uint8_t *buf; > =20 > @@ -166,61 +174,18 @@ static void net_socket_send(void *opaque) > closesocket(s->fd); > =20 > s->fd =3D -1; > - s->state =3D 0; > - s->index =3D 0; > - s->packet_len =3D 0; > + net_socket_rs_init(&s->rs, net_socket_rs_finalize); > s->nc.link_down =3D true; > - memset(s->buf, 0, sizeof(s->buf)); > memset(s->nc.info_str, 0, sizeof(s->nc.info_str)); > =20 > return; > } > buf =3D buf1; > - while (size > 0) { > - /* reassemble a packet from the network */ > - switch(s->state) { > - case 0: > - l =3D 4 - s->index; > - if (l > size) > - l =3D size; > - memcpy(s->buf + s->index, buf, l); > - buf +=3D l; > - size -=3D l; > - s->index +=3D l; > - if (s->index =3D=3D 4) { > - /* got length */ > - s->packet_len =3D ntohl(*(uint32_t *)s->buf); > - s->index =3D 0; > - s->state =3D 1; > - } > - break; > - case 1: > - l =3D s->packet_len - s->index; > - if (l > size) > - l =3D size; > - if (s->index + l <=3D sizeof(s->buf)) { > - memcpy(s->buf + s->index, buf, l); > - } else { > - fprintf(stderr, "serious error: oversized packet recei= ved," > - "connection terminated.\n"); > - s->state =3D 0; > - goto eoc; > - } > =20 > - s->index +=3D l; > - buf +=3D l; > - size -=3D l; > - if (s->index >=3D s->packet_len) { > - s->index =3D 0; > - s->state =3D 0; > - if (qemu_send_packet_async(&s->nc, s->buf, s->packet_l= en, > - net_socket_send_completed) = =3D=3D 0) { > - net_socket_read_poll(s, false); > - break; > - } > - } > - break; > - } > + ret =3D net_fill_rstate(&s->rs, buf, size); > + > + if (ret =3D=3D -1) { > + goto eoc; > } > } > =20 > @@ -229,7 +194,7 @@ static void net_socket_send_dgram(void *opaque) > NetSocketState *s =3D opaque; > int size; > =20 > - size =3D qemu_recv(s->fd, s->buf, sizeof(s->buf), 0); > + size =3D qemu_recv(s->fd, s->rs.buf, sizeof(s->rs.buf), 0); > if (size < 0) > return; > if (size =3D=3D 0) { > @@ -238,7 +203,7 @@ static void net_socket_send_dgram(void *opaque) > net_socket_write_poll(s, false); > return; > } > - if (qemu_send_packet_async(&s->nc, s->buf, size, > + if (qemu_send_packet_async(&s->nc, s->rs.buf, size, > net_socket_send_completed) =3D=3D 0) { > net_socket_read_poll(s, false); > } > @@ -401,6 +366,7 @@ static NetSocketState *net_socket_fd_init_dgram(Net= ClientState *peer, > s->fd =3D fd; > s->listen_fd =3D -1; > s->send_fn =3D net_socket_send_dgram; > + net_socket_rs_init(&s->rs, net_socket_rs_finalize); > net_socket_read_poll(s, true); > =20 > /* mcast: save bound address as dst */ > @@ -451,6 +417,7 @@ static NetSocketState *net_socket_fd_init_stream(Ne= tClientState *peer, > =20 > s->fd =3D fd; > s->listen_fd =3D -1; > + net_socket_rs_init(&s->rs, net_socket_rs_finalize); > =20 > /* Disable Nagle algorithm on TCP sockets to reduce latency */ > socket_set_nodelay(fd);