Fix vector raw inintialization logic
authorAnton Ivanov <anton.ivanov@cambridgegreys.com>
Mon, 5 Mar 2018 13:29:05 +0000 (13:29 +0000)
committerRichard Weinberger <richard@nod.at>
Thu, 29 Mar 2018 20:18:02 +0000 (22:18 +0200)
Vector RAW in UML needs to BPF filter its own MAC only
if QDISC_BYPASS has failed. If QDISC_BYPASS is successful, the
frames originated locally are not visible to readers on the
raw socket.

Signed-off-by: Anton Ivanov <anton.ivanov@cambridgegreys.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
arch/um/drivers/vector_kern.c
arch/um/drivers/vector_kern.h
arch/um/drivers/vector_user.c
arch/um/drivers/vector_user.h

index 3c76483..02168fe 100644 (file)
@@ -188,7 +188,7 @@ static int get_transport_options(struct arglist *def)
        if (strncmp(transport, TRANS_TAP, TRANS_TAP_LEN) == 0)
                return (vec_rx | VECTOR_BPF);
        if (strncmp(transport, TRANS_RAW, TRANS_RAW_LEN) == 0)
-               return (vec_rx | vec_tx | VECTOR_BPF);
+               return (vec_rx | vec_tx);
        return (vec_rx | vec_tx);
 }
 
@@ -1230,6 +1230,11 @@ static int vector_net_open(struct net_device *dev)
                irq_rr = (irq_rr + 1) % VECTOR_IRQ_SPACE;
        }
 
+       if ((vp->options & VECTOR_QDISC_BYPASS) != 0) {
+               if (!uml_raw_enable_qdisc_bypass(vp->fds->rx_fd))
+                       vp->options = vp->options | VECTOR_BPF;
+       }
+
        if ((vp->options & VECTOR_BPF) != 0)
                vp->bpf = uml_vector_default_bpf(vp->fds->rx_fd, dev->dev_addr);
 
index 699696d..0b0a767 100644 (file)
@@ -28,6 +28,7 @@
 #define VECTOR_RX 1
 #define VECTOR_TX (1 << 1)
 #define VECTOR_BPF (1 << 2)
+#define VECTOR_QDISC_BYPASS (1 << 3)
 
 #define ETH_MAX_PACKET 1500
 #define ETH_HEADER_OTHER 32 /* just in case someone decides to go mad on QnQ */
index 4291f1a..4d6a78e 100644 (file)
@@ -41,7 +41,6 @@
 #define TRANS_RAW "raw"
 #define TRANS_RAW_LEN strlen(TRANS_RAW)
 
-#define QDISC_FAIL "user_init_raw: could not disable qdisc on interface"
 #define VNET_HDR_FAIL "could not enable vnet headers on fd %d"
 #define TUN_GET_F_FAIL "tapraw: TUNGETFEATURES failed: %s"
 #define L2TPV3_BIND_FAIL "l2tpv3_open : could not bind socket err=%i"
@@ -212,8 +211,6 @@ static struct vector_fds *user_init_raw_fds(struct arglist *ifspec)
        int err = -ENOMEM;
        char *iface;
        struct vector_fds *result = NULL;
-       int optval = 1;
-
 
        iface = uml_vector_fetch_arg(ifspec, TOKEN_IFNAME);
        if (iface == NULL)
@@ -256,12 +253,6 @@ static struct vector_fds *user_init_raw_fds(struct arglist *ifspec)
                goto cleanup;
        }
 
-       if (setsockopt(txfd,
-               SOL_PACKET, PACKET_QDISC_BYPASS,
-               &optval, sizeof(optval)) != 0) {
-               printk(UM_KERN_INFO QDISC_FAIL);
-       }
-
        result = uml_kmalloc(sizeof(struct vector_fds), UM_GFP_KERNEL);
        if (result != NULL) {
                result->rx_fd = rxfd;
@@ -281,6 +272,19 @@ cleanup:
        return NULL;
 }
 
+
+bool uml_raw_enable_qdisc_bypass(int fd)
+{
+       int optval = 1;
+
+       if (setsockopt(fd,
+               SOL_PACKET, PACKET_QDISC_BYPASS,
+               &optval, sizeof(optval)) != 0) {
+               return false;
+       }
+       return true;
+}
+
 bool uml_raw_enable_vnet_headers(int fd)
 {
        int optval = 1;
index 421092c..d7cbff7 100644 (file)
@@ -92,6 +92,7 @@ extern int uml_vector_recvmmsg(
 );
 extern void *uml_vector_default_bpf(int fd, void *mac);
 extern int uml_vector_attach_bpf(int fd, void *bpf, int bpf_len);
+extern bool uml_raw_enable_qdisc_bypass(int fd);
 extern bool uml_raw_enable_vnet_headers(int fd);
 extern bool uml_tap_enable_vnet_headers(int fd);