tap: Increase amount of tap receive buffers to 128

...boom. To make it slightly more reasonable, shrink struct tap_msg
down a bit, and move the main message array away from the stack of
tap_handler_passt().

Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
Stefano Brivio 2021-07-27 00:48:06 +02:00
parent 8af961b85b
commit d372c42460
2 changed files with 13 additions and 12 deletions

View file

@ -11,8 +11,8 @@
struct tap_msg { struct tap_msg {
char *start; char *start;
char *l4h; char *l4h;
size_t len; uint16_t len;
size_t l4_len; uint16_t l4_len;
}; };
union epoll_ref; union epoll_ref;
@ -45,7 +45,7 @@ union epoll_ref {
uint64_t u64; uint64_t u64;
}; };
#define TAP_BUF_BYTES (ETH_MAX_MTU * 3) #define TAP_BUF_BYTES (ETH_MAX_MTU * 128)
#define TAP_BUF_FILL (TAP_BUF_BYTES - ETH_MAX_MTU - sizeof(uint32_t)) #define TAP_BUF_FILL (TAP_BUF_BYTES - ETH_MAX_MTU - sizeof(uint32_t))
#define TAP_MSGS (TAP_BUF_BYTES / sizeof(struct ethhdr) + 1) #define TAP_MSGS (TAP_BUF_BYTES / sizeof(struct ethhdr) + 1)

19
tap.c
View file

@ -50,6 +50,8 @@
#include "dhcpv6.h" #include "dhcpv6.h"
#include "pcap.h" #include "pcap.h"
static struct tap_msg tap_msgs[TAP_MSGS];
/** /**
* tap_send() - Send frame, with qemu socket header if needed * tap_send() - Send frame, with qemu socket header if needed
* @c: Execution context * @c: Execution context
@ -442,7 +444,6 @@ static int tap6_handler(struct ctx *c, struct tap_msg *msg, size_t count,
static int tap_handler_passt(struct ctx *c, struct timespec *now) static int tap_handler_passt(struct ctx *c, struct timespec *now)
{ {
int msg_count = 0, same, i = 0, first_v4 = 1, first_v6 = 1; int msg_count = 0, same, i = 0, first_v4 = 1, first_v6 = 1;
struct tap_msg msg[TAP_MSGS];
struct ethhdr *eh; struct ethhdr *eh;
char *p = pkt_buf; char *p = pkt_buf;
ssize_t n, rem; ssize_t n, rem;
@ -476,15 +477,15 @@ static int tap_handler_passt(struct ctx *c, struct timespec *now)
pcap(p, len); pcap(p, len);
msg[msg_count].start = p; tap_msgs[msg_count].start = p;
msg[msg_count++].len = len; tap_msgs[msg_count++].len = len;
n -= len; n -= len;
p += len; p += len;
} }
while (i < msg_count) { while (i < msg_count) {
eh = (struct ethhdr *)msg[i].start; eh = (struct ethhdr *)tap_msgs[i].start;
if (memcmp(c->mac_guest, eh->h_source, ETH_ALEN)) { if (memcmp(c->mac_guest, eh->h_source, ETH_ALEN)) {
memcpy(c->mac_guest, eh->h_source, ETH_ALEN); memcpy(c->mac_guest, eh->h_source, ETH_ALEN);
@ -493,33 +494,33 @@ static int tap_handler_passt(struct ctx *c, struct timespec *now)
switch (ntohs(eh->h_proto)) { switch (ntohs(eh->h_proto)) {
case ETH_P_ARP: case ETH_P_ARP:
tap4_handler(c, msg + i, 1, now, 1); tap4_handler(c, tap_msgs + i, 1, now, 1);
i++; i++;
break; break;
case ETH_P_IP: case ETH_P_IP:
for (same = 1; i + same < msg_count && for (same = 1; i + same < msg_count &&
same < UIO_MAXIOV; same++) { same < UIO_MAXIOV; same++) {
struct tap_msg *next = &msg[i + same]; struct tap_msg *next = &tap_msgs[i + same];
eh = (struct ethhdr *)next->start; eh = (struct ethhdr *)next->start;
if (ntohs(eh->h_proto) != ETH_P_IP) if (ntohs(eh->h_proto) != ETH_P_IP)
break; break;
} }
i += tap4_handler(c, msg + i, same, now, first_v4); i += tap4_handler(c, tap_msgs + i, same, now, first_v4);
first_v4 = 0; first_v4 = 0;
break; break;
case ETH_P_IPV6: case ETH_P_IPV6:
for (same = 1; i + same < msg_count && for (same = 1; i + same < msg_count &&
same < UIO_MAXIOV; same++) { same < UIO_MAXIOV; same++) {
struct tap_msg *next = &msg[i + same]; struct tap_msg *next = &tap_msgs[i + same];
eh = (struct ethhdr *)next->start; eh = (struct ethhdr *)next->start;
if (ntohs(eh->h_proto) != ETH_P_IPV6) if (ntohs(eh->h_proto) != ETH_P_IPV6)
break; break;
} }
i += tap6_handler(c, msg + i, same, now, first_v6); i += tap6_handler(c, tap_msgs + i, same, now, first_v6);
first_v6 = 0; first_v6 = 0;
break; break;
default: default: