Message ID | 20201119111305.485202-2-andrew@daynix.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | eBPF RSS support for virtio-net | expand |
On 2020/11/19 下午7:13, Andrew Melnychenko wrote: > From: Andrew <andrew@daynix.com> > > For now, that method supported only by Linux TAP. > Linux TAP uses TUNSETSTEERINGEBPF ioctl. > > Signed-off-by: Andrew Melnychenko <andrew@daynix.com> > --- > include/net/net.h | 2 ++ > net/tap-bsd.c | 5 +++++ > net/tap-linux.c | 13 +++++++++++++ > net/tap-linux.h | 1 + > net/tap-solaris.c | 5 +++++ > net/tap-stub.c | 5 +++++ > net/tap.c | 9 +++++++++ > net/tap_int.h | 1 + > 8 files changed, 41 insertions(+) > > diff --git a/include/net/net.h b/include/net/net.h > index 897b2d7595..d8a41fb010 100644 > --- a/include/net/net.h > +++ b/include/net/net.h > @@ -60,6 +60,7 @@ typedef int (SetVnetBE)(NetClientState *, bool); > typedef struct SocketReadState SocketReadState; > typedef void (SocketReadStateFinalize)(SocketReadState *rs); > typedef void (NetAnnounce)(NetClientState *); > +typedef bool (SetSteeringEBPF)(NetClientState *, int); > > typedef struct NetClientInfo { > NetClientDriver type; > @@ -81,6 +82,7 @@ typedef struct NetClientInfo { > SetVnetLE *set_vnet_le; > SetVnetBE *set_vnet_be; > NetAnnounce *announce; > + SetSteeringEBPF *set_steering_ebpf; > } NetClientInfo; > > struct NetClientState { > diff --git a/net/tap-bsd.c b/net/tap-bsd.c > index 77aaf674b1..4f64f31e98 100644 > --- a/net/tap-bsd.c > +++ b/net/tap-bsd.c > @@ -259,3 +259,8 @@ int tap_fd_get_ifname(int fd, char *ifname) > { > return -1; > } > + > +int tap_fd_set_steering_ebpf(int fd, int prog_fd) > +{ > + return -1; > +} > diff --git a/net/tap-linux.c b/net/tap-linux.c > index b0635e9e32..9584769740 100644 > --- a/net/tap-linux.c > +++ b/net/tap-linux.c > @@ -316,3 +316,16 @@ int tap_fd_get_ifname(int fd, char *ifname) > pstrcpy(ifname, sizeof(ifr.ifr_name), ifr.ifr_name); > return 0; > } > + > +int tap_fd_set_steering_ebpf(int fd, int prog_fd) > +{ > + if (ioctl(fd, TUNSETSTEERINGEBPF, (void *) &prog_fd) != 0) { > + error_report("Issue while setting TUNSETSTEERINGEBPF:" > + " %s with fd: %d, prog_fd: %d", > + strerror(errno), fd, prog_fd); > + > + return -1; > + } > + > + return 0; > +} > diff --git a/net/tap-linux.h b/net/tap-linux.h > index 2f36d100fc..1d06fe0de6 100644 > --- a/net/tap-linux.h > +++ b/net/tap-linux.h > @@ -31,6 +31,7 @@ > #define TUNSETQUEUE _IOW('T', 217, int) > #define TUNSETVNETLE _IOW('T', 220, int) > #define TUNSETVNETBE _IOW('T', 222, int) > +#define TUNSETSTEERINGEBPF _IOR('T', 224, int) Let's do this in another patch. Thanks
diff --git a/include/net/net.h b/include/net/net.h index 897b2d7595..d8a41fb010 100644 --- a/include/net/net.h +++ b/include/net/net.h @@ -60,6 +60,7 @@ typedef int (SetVnetBE)(NetClientState *, bool); typedef struct SocketReadState SocketReadState; typedef void (SocketReadStateFinalize)(SocketReadState *rs); typedef void (NetAnnounce)(NetClientState *); +typedef bool (SetSteeringEBPF)(NetClientState *, int); typedef struct NetClientInfo { NetClientDriver type; @@ -81,6 +82,7 @@ typedef struct NetClientInfo { SetVnetLE *set_vnet_le; SetVnetBE *set_vnet_be; NetAnnounce *announce; + SetSteeringEBPF *set_steering_ebpf; } NetClientInfo; struct NetClientState { diff --git a/net/tap-bsd.c b/net/tap-bsd.c index 77aaf674b1..4f64f31e98 100644 --- a/net/tap-bsd.c +++ b/net/tap-bsd.c @@ -259,3 +259,8 @@ int tap_fd_get_ifname(int fd, char *ifname) { return -1; } + +int tap_fd_set_steering_ebpf(int fd, int prog_fd) +{ + return -1; +} diff --git a/net/tap-linux.c b/net/tap-linux.c index b0635e9e32..9584769740 100644 --- a/net/tap-linux.c +++ b/net/tap-linux.c @@ -316,3 +316,16 @@ int tap_fd_get_ifname(int fd, char *ifname) pstrcpy(ifname, sizeof(ifr.ifr_name), ifr.ifr_name); return 0; } + +int tap_fd_set_steering_ebpf(int fd, int prog_fd) +{ + if (ioctl(fd, TUNSETSTEERINGEBPF, (void *) &prog_fd) != 0) { + error_report("Issue while setting TUNSETSTEERINGEBPF:" + " %s with fd: %d, prog_fd: %d", + strerror(errno), fd, prog_fd); + + return -1; + } + + return 0; +} diff --git a/net/tap-linux.h b/net/tap-linux.h index 2f36d100fc..1d06fe0de6 100644 --- a/net/tap-linux.h +++ b/net/tap-linux.h @@ -31,6 +31,7 @@ #define TUNSETQUEUE _IOW('T', 217, int) #define TUNSETVNETLE _IOW('T', 220, int) #define TUNSETVNETBE _IOW('T', 222, int) +#define TUNSETSTEERINGEBPF _IOR('T', 224, int) #endif diff --git a/net/tap-solaris.c b/net/tap-solaris.c index 0475a58207..d85224242b 100644 --- a/net/tap-solaris.c +++ b/net/tap-solaris.c @@ -255,3 +255,8 @@ int tap_fd_get_ifname(int fd, char *ifname) { return -1; } + +int tap_fd_set_steering_ebpf(int fd, int prog_fd) +{ + return -1; +} diff --git a/net/tap-stub.c b/net/tap-stub.c index de525a2e69..a0fa25804b 100644 --- a/net/tap-stub.c +++ b/net/tap-stub.c @@ -85,3 +85,8 @@ int tap_fd_get_ifname(int fd, char *ifname) { return -1; } + +int tap_fd_set_steering_ebpf(int fd, int prog_fd) +{ + return -1; +} diff --git a/net/tap.c b/net/tap.c index c46ff66184..81f50017bd 100644 --- a/net/tap.c +++ b/net/tap.c @@ -337,6 +337,14 @@ static void tap_poll(NetClientState *nc, bool enable) tap_write_poll(s, enable); } +static bool tap_set_steering_ebpf(NetClientState *nc, int prog_fd) +{ + TAPState *s = DO_UPCAST(TAPState, nc, nc); + assert(nc->info->type == NET_CLIENT_DRIVER_TAP); + + return tap_fd_set_steering_ebpf(s->fd, prog_fd) == 0; +} + int tap_get_fd(NetClientState *nc) { TAPState *s = DO_UPCAST(TAPState, nc, nc); @@ -362,6 +370,7 @@ static NetClientInfo net_tap_info = { .set_vnet_hdr_len = tap_set_vnet_hdr_len, .set_vnet_le = tap_set_vnet_le, .set_vnet_be = tap_set_vnet_be, + .set_steering_ebpf = tap_set_steering_ebpf, }; static TAPState *net_tap_fd_init(NetClientState *peer, diff --git a/net/tap_int.h b/net/tap_int.h index 225a49ea48..547f8a5a28 100644 --- a/net/tap_int.h +++ b/net/tap_int.h @@ -44,5 +44,6 @@ int tap_fd_set_vnet_be(int fd, int vnet_is_be); int tap_fd_enable(int fd); int tap_fd_disable(int fd); int tap_fd_get_ifname(int fd, char *ifname); +int tap_fd_set_steering_ebpf(int fd, int prog_fd); #endif /* NET_TAP_INT_H */