epoll: Use different epoll types for passt and pasta tap fds
Currently we have a single epoll event type for the "tap" fd, which could be either a handle on a /dev/net/tun device (pasta) or a connected Unix socket (passt). However for the two modes we call different handler functions. Simplify this a little by using different epoll types and dispatching directly to the correct handler function. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
parent
eda4f1997e
commit
ae5f6c8e1b
4 changed files with 30 additions and 30 deletions
10
passt.c
10
passt.c
|
@ -63,7 +63,8 @@ char *epoll_type_str[EPOLL_TYPE_MAX + 1] = {
|
||||||
[EPOLL_TYPE_ICMP] = "ICMP socket",
|
[EPOLL_TYPE_ICMP] = "ICMP socket",
|
||||||
[EPOLL_TYPE_ICMPV6] = "ICMPv6 socket",
|
[EPOLL_TYPE_ICMPV6] = "ICMPv6 socket",
|
||||||
[EPOLL_TYPE_NSQUIT] = "namespace inotify",
|
[EPOLL_TYPE_NSQUIT] = "namespace inotify",
|
||||||
[EPOLL_TYPE_TAP] = "tap device",
|
[EPOLL_TYPE_TAP_PASTA] = "/dev/net/tun device",
|
||||||
|
[EPOLL_TYPE_TAP_PASST] = "connected qemu socket",
|
||||||
[EPOLL_TYPE_TAP_LISTEN] = "listening qemu socket",
|
[EPOLL_TYPE_TAP_LISTEN] = "listening qemu socket",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -317,8 +318,11 @@ loop:
|
||||||
EPOLL_TYPE_STR(ref.type), ref.fd, eventmask);
|
EPOLL_TYPE_STR(ref.type), ref.fd, eventmask);
|
||||||
|
|
||||||
switch (ref.type) {
|
switch (ref.type) {
|
||||||
case EPOLL_TYPE_TAP:
|
case EPOLL_TYPE_TAP_PASTA:
|
||||||
tap_handler(&c, events[i].events, &now);
|
tap_handler_pasta(&c, eventmask, &now);
|
||||||
|
break;
|
||||||
|
case EPOLL_TYPE_TAP_PASST:
|
||||||
|
tap_handler_passt(&c, eventmask, &now);
|
||||||
break;
|
break;
|
||||||
case EPOLL_TYPE_TAP_LISTEN:
|
case EPOLL_TYPE_TAP_LISTEN:
|
||||||
tap_listen_handler(&c, eventmask);
|
tap_listen_handler(&c, eventmask);
|
||||||
|
|
6
passt.h
6
passt.h
|
@ -61,8 +61,10 @@ enum epoll_type {
|
||||||
EPOLL_TYPE_ICMPV6,
|
EPOLL_TYPE_ICMPV6,
|
||||||
/* inotify fd watching for end of netns (pasta) */
|
/* inotify fd watching for end of netns (pasta) */
|
||||||
EPOLL_TYPE_NSQUIT,
|
EPOLL_TYPE_NSQUIT,
|
||||||
/* tap char device, or connected qemu socket fd */
|
/* tuntap character device */
|
||||||
EPOLL_TYPE_TAP,
|
EPOLL_TYPE_TAP_PASTA,
|
||||||
|
/* socket connected to qemu */
|
||||||
|
EPOLL_TYPE_TAP_PASST,
|
||||||
/* socket listening for qemu socket connections */
|
/* socket listening for qemu socket connections */
|
||||||
EPOLL_TYPE_TAP_LISTEN,
|
EPOLL_TYPE_TAP_LISTEN,
|
||||||
|
|
||||||
|
|
35
tap.c
35
tap.c
|
@ -914,7 +914,7 @@ static void tap_sock_reset(struct ctx *c)
|
||||||
* @events: epoll events
|
* @events: epoll events
|
||||||
* @now: Current timestamp
|
* @now: Current timestamp
|
||||||
*/
|
*/
|
||||||
static void tap_handler_passt(struct ctx *c, uint32_t events,
|
void tap_handler_passt(struct ctx *c, uint32_t events,
|
||||||
const struct timespec *now)
|
const struct timespec *now)
|
||||||
{
|
{
|
||||||
struct ethhdr *eh;
|
struct ethhdr *eh;
|
||||||
|
@ -996,12 +996,12 @@ next:
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* tap_handler_pasta() - Packet handler for tuntap file descriptor
|
* tap_handler_pasta() - Packet handler for /dev/net/tun file descriptor
|
||||||
* @c: Execution context
|
* @c: Execution context
|
||||||
* @events: epoll events
|
* @events: epoll events
|
||||||
* @now: Current timestamp
|
* @now: Current timestamp
|
||||||
*/
|
*/
|
||||||
static void tap_handler_pasta(struct ctx *c, uint32_t events,
|
void tap_handler_pasta(struct ctx *c, uint32_t events,
|
||||||
const struct timespec *now)
|
const struct timespec *now)
|
||||||
{
|
{
|
||||||
ssize_t n, len;
|
ssize_t n, len;
|
||||||
|
@ -1143,7 +1143,7 @@ static void tap_sock_unix_init(struct ctx *c)
|
||||||
*/
|
*/
|
||||||
void tap_listen_handler(struct ctx *c, uint32_t events)
|
void tap_listen_handler(struct ctx *c, uint32_t events)
|
||||||
{
|
{
|
||||||
union epoll_ref ref = { .type = EPOLL_TYPE_TAP };
|
union epoll_ref ref = { .type = EPOLL_TYPE_TAP_PASST };
|
||||||
struct epoll_event ev = { 0 };
|
struct epoll_event ev = { 0 };
|
||||||
int v = INT_MAX / 2;
|
int v = INT_MAX / 2;
|
||||||
struct ucred ucred;
|
struct ucred ucred;
|
||||||
|
@ -1225,12 +1225,12 @@ static int tap_ns_tun(void *arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* tap_sock_init_tun() - Set up tuntap file descriptor
|
* tap_sock_tun_init() - Set up /dev/net/tun file descriptor
|
||||||
* @c: Execution context
|
* @c: Execution context
|
||||||
*/
|
*/
|
||||||
static void tap_sock_tun_init(struct ctx *c)
|
static void tap_sock_tun_init(struct ctx *c)
|
||||||
{
|
{
|
||||||
union epoll_ref ref = { .type = EPOLL_TYPE_TAP };
|
union epoll_ref ref = { .type = EPOLL_TYPE_TAP_PASTA };
|
||||||
struct epoll_event ev = { 0 };
|
struct epoll_event ev = { 0 };
|
||||||
|
|
||||||
NS_CALL(tap_ns_tun, c);
|
NS_CALL(tap_ns_tun, c);
|
||||||
|
@ -1263,11 +1263,16 @@ void tap_sock_init(struct ctx *c)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c->fd_tap != -1) { /* Passed as --fd */
|
if (c->fd_tap != -1) { /* Passed as --fd */
|
||||||
union epoll_ref ref = { .type = EPOLL_TYPE_TAP };
|
|
||||||
struct epoll_event ev = { 0 };
|
struct epoll_event ev = { 0 };
|
||||||
ASSERT(c->one_off);
|
union epoll_ref ref;
|
||||||
|
|
||||||
|
ASSERT(c->one_off);
|
||||||
ref.fd = c->fd_tap;
|
ref.fd = c->fd_tap;
|
||||||
|
if (c->mode == MODE_PASST)
|
||||||
|
ref.type = EPOLL_TYPE_TAP_PASST;
|
||||||
|
else
|
||||||
|
ref.type = EPOLL_TYPE_TAP_PASTA;
|
||||||
|
|
||||||
ev.events = EPOLLIN | EPOLLET | EPOLLRDHUP;
|
ev.events = EPOLLIN | EPOLLET | EPOLLRDHUP;
|
||||||
ev.data.u64 = ref.u64;
|
ev.data.u64 = ref.u64;
|
||||||
epoll_ctl(c->epollfd, EPOLL_CTL_ADD, c->fd_tap, &ev);
|
epoll_ctl(c->epollfd, EPOLL_CTL_ADD, c->fd_tap, &ev);
|
||||||
|
@ -1281,17 +1286,3 @@ void tap_sock_init(struct ctx *c)
|
||||||
tap_sock_tun_init(c);
|
tap_sock_tun_init(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* tap_handler() - Packet handler for AF_UNIX or tuntap file descriptor
|
|
||||||
* @c: Execution context
|
|
||||||
* @events: epoll events
|
|
||||||
* @now: Current timestamp, can be NULL on EPOLLERR
|
|
||||||
*/
|
|
||||||
void tap_handler(struct ctx *c, uint32_t events, const struct timespec *now)
|
|
||||||
{
|
|
||||||
if (c->mode == MODE_PASST)
|
|
||||||
tap_handler_passt(c, events, now);
|
|
||||||
else if (c->mode == MODE_PASTA)
|
|
||||||
tap_handler_pasta(c, events, now);
|
|
||||||
}
|
|
||||||
|
|
5
tap.h
5
tap.h
|
@ -77,7 +77,10 @@ void tap_send_frames(struct ctx *c, const struct iovec *iov, size_t n);
|
||||||
void tap_update_mac(struct tap_hdr *taph,
|
void tap_update_mac(struct tap_hdr *taph,
|
||||||
const unsigned char *eth_d, const unsigned char *eth_s);
|
const unsigned char *eth_d, const unsigned char *eth_s);
|
||||||
void tap_listen_handler(struct ctx *c, uint32_t events);
|
void tap_listen_handler(struct ctx *c, uint32_t events);
|
||||||
void tap_handler(struct ctx *c, uint32_t events, const struct timespec *now);
|
void tap_handler_pasta(struct ctx *c, uint32_t events,
|
||||||
|
const struct timespec *now);
|
||||||
|
void tap_handler_passt(struct ctx *c, uint32_t events,
|
||||||
|
const struct timespec *now);
|
||||||
void tap_sock_init(struct ctx *c);
|
void tap_sock_init(struct ctx *c);
|
||||||
|
|
||||||
#endif /* TAP_H */
|
#endif /* TAP_H */
|
||||||
|
|
Loading…
Reference in a new issue