Commit e40238de authored by Anton Ivanov's avatar Anton Ivanov Committed by Richard Weinberger

Fix vector raw inintialization logic

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: default avatarAnton Ivanov <anton.ivanov@cambridgegreys.com>
Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
parent ce471fdb
...@@ -188,7 +188,7 @@ static int get_transport_options(struct arglist *def) ...@@ -188,7 +188,7 @@ static int get_transport_options(struct arglist *def)
if (strncmp(transport, TRANS_TAP, TRANS_TAP_LEN) == 0) if (strncmp(transport, TRANS_TAP, TRANS_TAP_LEN) == 0)
return (vec_rx | VECTOR_BPF); return (vec_rx | VECTOR_BPF);
if (strncmp(transport, TRANS_RAW, TRANS_RAW_LEN) == 0) 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); return (vec_rx | vec_tx);
} }
...@@ -1230,6 +1230,11 @@ static int vector_net_open(struct net_device *dev) ...@@ -1230,6 +1230,11 @@ static int vector_net_open(struct net_device *dev)
irq_rr = (irq_rr + 1) % VECTOR_IRQ_SPACE; 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) if ((vp->options & VECTOR_BPF) != 0)
vp->bpf = uml_vector_default_bpf(vp->fds->rx_fd, dev->dev_addr); vp->bpf = uml_vector_default_bpf(vp->fds->rx_fd, dev->dev_addr);
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#define VECTOR_RX 1 #define VECTOR_RX 1
#define VECTOR_TX (1 << 1) #define VECTOR_TX (1 << 1)
#define VECTOR_BPF (1 << 2) #define VECTOR_BPF (1 << 2)
#define VECTOR_QDISC_BYPASS (1 << 3)
#define ETH_MAX_PACKET 1500 #define ETH_MAX_PACKET 1500
#define ETH_HEADER_OTHER 32 /* just in case someone decides to go mad on QnQ */ #define ETH_HEADER_OTHER 32 /* just in case someone decides to go mad on QnQ */
......
...@@ -41,7 +41,6 @@ ...@@ -41,7 +41,6 @@
#define TRANS_RAW "raw" #define TRANS_RAW "raw"
#define TRANS_RAW_LEN strlen(TRANS_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 VNET_HDR_FAIL "could not enable vnet headers on fd %d"
#define TUN_GET_F_FAIL "tapraw: TUNGETFEATURES failed: %s" #define TUN_GET_F_FAIL "tapraw: TUNGETFEATURES failed: %s"
#define L2TPV3_BIND_FAIL "l2tpv3_open : could not bind socket err=%i" #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) ...@@ -212,8 +211,6 @@ static struct vector_fds *user_init_raw_fds(struct arglist *ifspec)
int err = -ENOMEM; int err = -ENOMEM;
char *iface; char *iface;
struct vector_fds *result = NULL; struct vector_fds *result = NULL;
int optval = 1;
iface = uml_vector_fetch_arg(ifspec, TOKEN_IFNAME); iface = uml_vector_fetch_arg(ifspec, TOKEN_IFNAME);
if (iface == NULL) if (iface == NULL)
...@@ -256,12 +253,6 @@ static struct vector_fds *user_init_raw_fds(struct arglist *ifspec) ...@@ -256,12 +253,6 @@ static struct vector_fds *user_init_raw_fds(struct arglist *ifspec)
goto cleanup; 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); result = uml_kmalloc(sizeof(struct vector_fds), UM_GFP_KERNEL);
if (result != NULL) { if (result != NULL) {
result->rx_fd = rxfd; result->rx_fd = rxfd;
...@@ -281,6 +272,19 @@ static struct vector_fds *user_init_raw_fds(struct arglist *ifspec) ...@@ -281,6 +272,19 @@ static struct vector_fds *user_init_raw_fds(struct arglist *ifspec)
return NULL; 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) bool uml_raw_enable_vnet_headers(int fd)
{ {
int optval = 1; int optval = 1;
......
...@@ -92,6 +92,7 @@ extern int uml_vector_recvmmsg( ...@@ -92,6 +92,7 @@ extern int uml_vector_recvmmsg(
); );
extern void *uml_vector_default_bpf(int fd, void *mac); extern void *uml_vector_default_bpf(int fd, void *mac);
extern int uml_vector_attach_bpf(int fd, void *bpf, int bpf_len); 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_raw_enable_vnet_headers(int fd);
extern bool uml_tap_enable_vnet_headers(int fd); extern bool uml_tap_enable_vnet_headers(int fd);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment