mirror of https://github.com/xemu-project/xemu.git
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 <andrew@daynix.com> Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
parent
78258debe0
commit
8f364e344c
|
@ -61,6 +61,7 @@ typedef int (SetVnetBE)(NetClientState *, bool);
|
||||||
typedef struct SocketReadState SocketReadState;
|
typedef struct SocketReadState SocketReadState;
|
||||||
typedef void (SocketReadStateFinalize)(SocketReadState *rs);
|
typedef void (SocketReadStateFinalize)(SocketReadState *rs);
|
||||||
typedef void (NetAnnounce)(NetClientState *);
|
typedef void (NetAnnounce)(NetClientState *);
|
||||||
|
typedef bool (SetSteeringEBPF)(NetClientState *, int);
|
||||||
|
|
||||||
typedef struct NetClientInfo {
|
typedef struct NetClientInfo {
|
||||||
NetClientDriver type;
|
NetClientDriver type;
|
||||||
|
@ -82,6 +83,7 @@ typedef struct NetClientInfo {
|
||||||
SetVnetLE *set_vnet_le;
|
SetVnetLE *set_vnet_le;
|
||||||
SetVnetBE *set_vnet_be;
|
SetVnetBE *set_vnet_be;
|
||||||
NetAnnounce *announce;
|
NetAnnounce *announce;
|
||||||
|
SetSteeringEBPF *set_steering_ebpf;
|
||||||
} NetClientInfo;
|
} NetClientInfo;
|
||||||
|
|
||||||
struct NetClientState {
|
struct NetClientState {
|
||||||
|
|
|
@ -259,3 +259,8 @@ int tap_fd_get_ifname(int fd, char *ifname)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int tap_fd_set_steering_ebpf(int fd, int prog_fd)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
|
@ -316,3 +316,16 @@ int tap_fd_get_ifname(int fd, char *ifname)
|
||||||
pstrcpy(ifname, sizeof(ifr.ifr_name), ifr.ifr_name);
|
pstrcpy(ifname, sizeof(ifr.ifr_name), ifr.ifr_name);
|
||||||
return 0;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -255,3 +255,8 @@ int tap_fd_get_ifname(int fd, char *ifname)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int tap_fd_set_steering_ebpf(int fd, int prog_fd)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
|
@ -85,3 +85,8 @@ int tap_fd_get_ifname(int fd, char *ifname)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int tap_fd_set_steering_ebpf(int fd, int prog_fd)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
|
@ -347,6 +347,14 @@ static void tap_poll(NetClientState *nc, bool enable)
|
||||||
tap_write_poll(s, 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)
|
int tap_get_fd(NetClientState *nc)
|
||||||
{
|
{
|
||||||
TAPState *s = DO_UPCAST(TAPState, nc, nc);
|
TAPState *s = DO_UPCAST(TAPState, nc, nc);
|
||||||
|
@ -372,6 +380,7 @@ static NetClientInfo net_tap_info = {
|
||||||
.set_vnet_hdr_len = tap_set_vnet_hdr_len,
|
.set_vnet_hdr_len = tap_set_vnet_hdr_len,
|
||||||
.set_vnet_le = tap_set_vnet_le,
|
.set_vnet_le = tap_set_vnet_le,
|
||||||
.set_vnet_be = tap_set_vnet_be,
|
.set_vnet_be = tap_set_vnet_be,
|
||||||
|
.set_steering_ebpf = tap_set_steering_ebpf,
|
||||||
};
|
};
|
||||||
|
|
||||||
static TAPState *net_tap_fd_init(NetClientState *peer,
|
static TAPState *net_tap_fd_init(NetClientState *peer,
|
||||||
|
|
|
@ -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_enable(int fd);
|
||||||
int tap_fd_disable(int fd);
|
int tap_fd_disable(int fd);
|
||||||
int tap_fd_get_ifname(int fd, char *ifname);
|
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 */
|
#endif /* NET_TAP_INT_H */
|
||||||
|
|
Loading…
Reference in New Issue