Skip to content

Commit 8f364e3

Browse files
AndrewAtDaynixjasowang
authored andcommitted
net: Added SetSteeringEBPF method for NetClientState.
For now, that method supported only by Linux TAP. Linux TAP uses TUNSETSTEERINGEBPF ioctl. Signed-off-by: Andrew Melnychenko <[email protected]> Signed-off-by: Jason Wang <[email protected]>
1 parent 78258de commit 8f364e3

File tree

7 files changed

+40
-0
lines changed

7 files changed

+40
-0
lines changed

include/net/net.h

+2
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ typedef int (SetVnetBE)(NetClientState *, bool);
6161
typedef struct SocketReadState SocketReadState;
6262
typedef void (SocketReadStateFinalize)(SocketReadState *rs);
6363
typedef void (NetAnnounce)(NetClientState *);
64+
typedef bool (SetSteeringEBPF)(NetClientState *, int);
6465

6566
typedef struct NetClientInfo {
6667
NetClientDriver type;
@@ -82,6 +83,7 @@ typedef struct NetClientInfo {
8283
SetVnetLE *set_vnet_le;
8384
SetVnetBE *set_vnet_be;
8485
NetAnnounce *announce;
86+
SetSteeringEBPF *set_steering_ebpf;
8587
} NetClientInfo;
8688

8789
struct NetClientState {

net/tap-bsd.c

+5
Original file line numberDiff line numberDiff line change
@@ -259,3 +259,8 @@ int tap_fd_get_ifname(int fd, char *ifname)
259259
{
260260
return -1;
261261
}
262+
263+
int tap_fd_set_steering_ebpf(int fd, int prog_fd)
264+
{
265+
return -1;
266+
}

net/tap-linux.c

+13
Original file line numberDiff line numberDiff line change
@@ -316,3 +316,16 @@ int tap_fd_get_ifname(int fd, char *ifname)
316316
pstrcpy(ifname, sizeof(ifr.ifr_name), ifr.ifr_name);
317317
return 0;
318318
}
319+
320+
int tap_fd_set_steering_ebpf(int fd, int prog_fd)
321+
{
322+
if (ioctl(fd, TUNSETSTEERINGEBPF, (void *) &prog_fd) != 0) {
323+
error_report("Issue while setting TUNSETSTEERINGEBPF:"
324+
" %s with fd: %d, prog_fd: %d",
325+
strerror(errno), fd, prog_fd);
326+
327+
return -1;
328+
}
329+
330+
return 0;
331+
}

net/tap-solaris.c

+5
Original file line numberDiff line numberDiff line change
@@ -255,3 +255,8 @@ int tap_fd_get_ifname(int fd, char *ifname)
255255
{
256256
return -1;
257257
}
258+
259+
int tap_fd_set_steering_ebpf(int fd, int prog_fd)
260+
{
261+
return -1;
262+
}

net/tap-stub.c

+5
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,8 @@ int tap_fd_get_ifname(int fd, char *ifname)
8585
{
8686
return -1;
8787
}
88+
89+
int tap_fd_set_steering_ebpf(int fd, int prog_fd)
90+
{
91+
return -1;
92+
}

net/tap.c

+9
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,14 @@ static void tap_poll(NetClientState *nc, bool enable)
347347
tap_write_poll(s, enable);
348348
}
349349

350+
static bool tap_set_steering_ebpf(NetClientState *nc, int prog_fd)
351+
{
352+
TAPState *s = DO_UPCAST(TAPState, nc, nc);
353+
assert(nc->info->type == NET_CLIENT_DRIVER_TAP);
354+
355+
return tap_fd_set_steering_ebpf(s->fd, prog_fd) == 0;
356+
}
357+
350358
int tap_get_fd(NetClientState *nc)
351359
{
352360
TAPState *s = DO_UPCAST(TAPState, nc, nc);
@@ -372,6 +380,7 @@ static NetClientInfo net_tap_info = {
372380
.set_vnet_hdr_len = tap_set_vnet_hdr_len,
373381
.set_vnet_le = tap_set_vnet_le,
374382
.set_vnet_be = tap_set_vnet_be,
383+
.set_steering_ebpf = tap_set_steering_ebpf,
375384
};
376385

377386
static TAPState *net_tap_fd_init(NetClientState *peer,

net/tap_int.h

+1
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,6 @@ int tap_fd_set_vnet_be(int fd, int vnet_is_be);
4444
int tap_fd_enable(int fd);
4545
int tap_fd_disable(int fd);
4646
int tap_fd_get_ifname(int fd, char *ifname);
47+
int tap_fd_set_steering_ebpf(int fd, int prog_fd);
4748

4849
#endif /* NET_TAP_INT_H */

0 commit comments

Comments
 (0)