|
From: | Jason Wang |
Subject: | Re: [Qemu-devel] [PATCH 1/3] Unified Datagram Socket Transport |
Date: | Wed, 19 Jul 2017 14:07:00 +0800 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 |
On 2017年07月19日 13:48, Anton Ivanov wrote:
On 19/07/17 06:39, Jason Wang wrote:On 2017年07月19日 01:08, address@hidden wrote:From: Anton Ivanov <address@hidden> 1. Creates a common backend for socket transports using recvmmsg(). 2. Migrates L2TPv3 to the new backendIt would be better if you could further split out 2 from this patch.Signed-off-by: Anton Ivanov <address@hidden> --- configure | 10 +- net/Makefile.objs | 2 +-net/l2tpv3.c | 531 +++++++++---------------------------------------------net/net.c | 4 +- net/unified.c | 406 +++++++++++++++++++++++++++++++++++++++++ net/unified.h | 118 ++++++++++++ 6 files changed, 613 insertions(+), 458 deletions(-) create mode 100644 net/unified.c create mode 100644 net/unified.h diff --git a/configure b/configure index a3f0522e8f..99a60b723c 100755 --- a/configure +++ b/configure @@ -1862,7 +1862,7 @@ if ! compile_object -Werror ; then fi ########################################## -# L2TPV3 probe +# UNIFIED probe cat > $TMPC <<EOF #include <sys/socket.h> @@ -1870,9 +1870,9 @@ cat > $TMPC <<EOF int main(void) { return sizeof(struct mmsghdr); } EOF if compile_prog "" "" ; then - l2tpv3=yes + unified=yes else - l2tpv3=no + unified=no fi ########################################## @@ -5458,8 +5458,8 @@ fi if test "$netmap" = "yes" ; then echo "CONFIG_NETMAP=y" >> $config_host_mak fi -if test "$l2tpv3" = "yes" ; then - echo "CONFIG_L2TPV3=y" >> $config_host_mak +if test "$unified" = "yes" ; then + echo "CONFIG_UNIFIED=y" >> $config_host_mak fiCould we keep l2tpv3 option?The l2tpv3 test is actually a test for recvmmsg. If you can do one recvmmsg transport you can do all of them.
Yes, but I wonder whether or not the check for recvmmsg is too simple. We probably want something like what AV_VSOCK did, test the support of each transport through socket().
if test "$cap_ng" = "yes" ; then echo "CONFIG_LIBCAP=y" >> $config_host_mak diff --git a/net/Makefile.objs b/net/Makefile.objs index 67ba5e26fb..8026ad778a 100644 --- a/net/Makefile.objs +++ b/net/Makefile.objs @@ -2,7 +2,7 @@ common-obj-y = net.o queue.o checksum.o util.o hub.o common-obj-y += socket.o common-obj-y += dump.o common-obj-y += eth.o -common-obj-$(CONFIG_L2TPV3) += l2tpv3.o +common-obj-$(CONFIG_UNIFIED) += l2tpv3.o unified.o common-obj-$(CONFIG_POSIX) += vhost-user.o common-obj-$(CONFIG_SLIRP) += slirp.o common-obj-$(CONFIG_VDE) += vde.o
[...]
- s = DO_UPCAST(NetL2TPV3State, nc, nc); + s->params = p; + s->form_header = &l2tpv3_form_header; + s->verify_header = &l2tpv3_verify_header; s->queue_head = 0; s->queue_tail = 0; s->header_mismatch = false;Why not move all above into qemu_new_unified_net()?Only queue head/tail assignment can move.raw which uses same backend does not use header_mismatch. Form/verify header are different for each sub-transport. F.e. for gre you need the gre one, for raw you need the raw one, etc.
Right, I mean pass function pointer to qemu_new_unified_net().
@@ -549,9 +188,9 @@ int net_init_l2tpv3(const Netdev *netdev, l2tpv3 = &netdev->u.l2tpv3; if (l2tpv3->has_ipv6 && l2tpv3->ipv6) { - s->ipv6 = l2tpv3->ipv6; + p->ipv6 = l2tpv3->ipv6; } else { - s->ipv6 = false; + p->ipv6 = false;
[...]
diff --git a/net/unified.c b/net/unified.cNot a native speaker, but I think we need a better name here e.g udst which is short for Unified Datagram Socket Transport?I am not a native speaker either :)I am OK - let's call it udst as this is more descriptive and this clearly delineates that you cannotmigrate tcp/socket to it.
Ok.
[...]
+ +static ssize_t net_unified_receive_dgram_iov(NetClientState *nc, + const struct iovec *iov, + int iovcnt) +{ + NetUnifiedState *s = DO_UPCAST(NetUnifiedState, nc, nc); + + struct msghdr message; + int ret; + + if (iovcnt > MAX_UNIFIED_IOVCNT - 1) { + error_report( + "iovec too long %d > %d, change unified.h", + iovcnt, MAX_UNIFIED_IOVCNT + ); + return -1; + } + if (s->offset > 0) {net_l2tpv3_receive_dgram_iov() does not have this check. I guess it s->offset=0 will be used by other transport. Maybe it's better to delay this change until is has a real user or add a comment here.The real user is in patch No 2. Raw.
Ok. Thanks.
[Prev in Thread] | Current Thread | [Next in Thread] |