selftests/bpf: Remove a lot of ifobject casting
Instead of passing void * all over the place, let us pass the actual type (ifobject) and remove the void-ptr-to-type-ptr casting. Signed-off-by: Björn Töpel <bjorn.topel@intel.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Link: https://lore.kernel.org/bpf/20210122154725.22140-2-bjorn.topel@gmail.com
This commit is contained in:
parent
78ed404591
commit
7140ef1400
|
@ -224,14 +224,14 @@ static inline u16 udp_csum(u32 saddr, u32 daddr, u32 len, u8 proto, u16 *udp_pkt
|
||||||
return csum_tcpudp_magic(saddr, daddr, len, proto, csum);
|
return csum_tcpudp_magic(saddr, daddr, len, proto, csum);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gen_eth_hdr(void *data, struct ethhdr *eth_hdr)
|
static void gen_eth_hdr(struct ifobject *ifobject, struct ethhdr *eth_hdr)
|
||||||
{
|
{
|
||||||
memcpy(eth_hdr->h_dest, ((struct ifobject *)data)->dst_mac, ETH_ALEN);
|
memcpy(eth_hdr->h_dest, ifobject->dst_mac, ETH_ALEN);
|
||||||
memcpy(eth_hdr->h_source, ((struct ifobject *)data)->src_mac, ETH_ALEN);
|
memcpy(eth_hdr->h_source, ifobject->src_mac, ETH_ALEN);
|
||||||
eth_hdr->h_proto = htons(ETH_P_IP);
|
eth_hdr->h_proto = htons(ETH_P_IP);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gen_ip_hdr(void *data, struct iphdr *ip_hdr)
|
static void gen_ip_hdr(struct ifobject *ifobject, struct iphdr *ip_hdr)
|
||||||
{
|
{
|
||||||
ip_hdr->version = IP_PKT_VER;
|
ip_hdr->version = IP_PKT_VER;
|
||||||
ip_hdr->ihl = 0x5;
|
ip_hdr->ihl = 0x5;
|
||||||
|
@ -241,15 +241,15 @@ static void gen_ip_hdr(void *data, struct iphdr *ip_hdr)
|
||||||
ip_hdr->frag_off = 0;
|
ip_hdr->frag_off = 0;
|
||||||
ip_hdr->ttl = IPDEFTTL;
|
ip_hdr->ttl = IPDEFTTL;
|
||||||
ip_hdr->protocol = IPPROTO_UDP;
|
ip_hdr->protocol = IPPROTO_UDP;
|
||||||
ip_hdr->saddr = ((struct ifobject *)data)->src_ip;
|
ip_hdr->saddr = ifobject->src_ip;
|
||||||
ip_hdr->daddr = ((struct ifobject *)data)->dst_ip;
|
ip_hdr->daddr = ifobject->dst_ip;
|
||||||
ip_hdr->check = 0;
|
ip_hdr->check = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gen_udp_hdr(void *data, void *arg, struct udphdr *udp_hdr)
|
static void gen_udp_hdr(void *data, struct ifobject *ifobject, struct udphdr *udp_hdr)
|
||||||
{
|
{
|
||||||
udp_hdr->source = htons(((struct ifobject *)arg)->src_port);
|
udp_hdr->source = htons(ifobject->src_port);
|
||||||
udp_hdr->dest = htons(((struct ifobject *)arg)->dst_port);
|
udp_hdr->dest = htons(ifobject->dst_port);
|
||||||
udp_hdr->len = htons(UDP_PKT_SIZE);
|
udp_hdr->len = htons(UDP_PKT_SIZE);
|
||||||
memset32_htonl(pkt_data + PKT_HDR_SIZE,
|
memset32_htonl(pkt_data + PKT_HDR_SIZE,
|
||||||
htonl(((struct generic_data *)data)->seqnum), UDP_PKT_DATA_SIZE);
|
htonl(((struct generic_data *)data)->seqnum), UDP_PKT_DATA_SIZE);
|
||||||
|
@ -628,28 +628,27 @@ static inline int get_batch_size(int pkt_cnt)
|
||||||
return opt_pkt_count - pkt_cnt;
|
return opt_pkt_count - pkt_cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void complete_tx_only_all(void *arg)
|
static void complete_tx_only_all(struct ifobject *ifobject)
|
||||||
{
|
{
|
||||||
bool pending;
|
bool pending;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
pending = false;
|
pending = false;
|
||||||
if (((struct ifobject *)arg)->xsk->outstanding_tx) {
|
if (ifobject->xsk->outstanding_tx) {
|
||||||
complete_tx_only(((struct ifobject *)
|
complete_tx_only(ifobject->xsk, BATCH_SIZE);
|
||||||
arg)->xsk, BATCH_SIZE);
|
pending = !!ifobject->xsk->outstanding_tx;
|
||||||
pending = !!((struct ifobject *)arg)->xsk->outstanding_tx;
|
|
||||||
}
|
}
|
||||||
} while (pending);
|
} while (pending);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tx_only_all(void *arg)
|
static void tx_only_all(struct ifobject *ifobject)
|
||||||
{
|
{
|
||||||
struct pollfd fds[MAX_SOCKS] = { };
|
struct pollfd fds[MAX_SOCKS] = { };
|
||||||
u32 frame_nb = 0;
|
u32 frame_nb = 0;
|
||||||
int pkt_cnt = 0;
|
int pkt_cnt = 0;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
fds[0].fd = xsk_socket__fd(((struct ifobject *)arg)->xsk->xsk);
|
fds[0].fd = xsk_socket__fd(ifobject->xsk->xsk);
|
||||||
fds[0].events = POLLOUT;
|
fds[0].events = POLLOUT;
|
||||||
|
|
||||||
while ((opt_pkt_count && pkt_cnt < opt_pkt_count) || !opt_pkt_count) {
|
while ((opt_pkt_count && pkt_cnt < opt_pkt_count) || !opt_pkt_count) {
|
||||||
|
@ -664,12 +663,12 @@ static void tx_only_all(void *arg)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
tx_only(((struct ifobject *)arg)->xsk, &frame_nb, batch_size);
|
tx_only(ifobject->xsk, &frame_nb, batch_size);
|
||||||
pkt_cnt += batch_size;
|
pkt_cnt += batch_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opt_pkt_count)
|
if (opt_pkt_count)
|
||||||
complete_tx_only_all(arg);
|
complete_tx_only_all(ifobject);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void worker_pkt_dump(void)
|
static void worker_pkt_dump(void)
|
||||||
|
@ -780,14 +779,14 @@ static void worker_pkt_validate(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void thread_common_ops(void *arg, void *bufs, pthread_mutex_t *mutexptr,
|
static void thread_common_ops(struct ifobject *ifobject, void *bufs, pthread_mutex_t *mutexptr,
|
||||||
atomic_int *spinningptr)
|
atomic_int *spinningptr)
|
||||||
{
|
{
|
||||||
int ctr = 0;
|
int ctr = 0;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
xsk_configure_umem((struct ifobject *)arg, bufs, num_frames * XSK_UMEM__DEFAULT_FRAME_SIZE);
|
xsk_configure_umem(ifobject, bufs, num_frames * XSK_UMEM__DEFAULT_FRAME_SIZE);
|
||||||
ret = xsk_configure_socket((struct ifobject *)arg);
|
ret = xsk_configure_socket(ifobject);
|
||||||
|
|
||||||
/* Retry Create Socket if it fails as xsk_socket__create()
|
/* Retry Create Socket if it fails as xsk_socket__create()
|
||||||
* is asynchronous
|
* is asynchronous
|
||||||
|
@ -798,9 +797,8 @@ static void thread_common_ops(void *arg, void *bufs, pthread_mutex_t *mutexptr,
|
||||||
pthread_mutex_lock(mutexptr);
|
pthread_mutex_lock(mutexptr);
|
||||||
while (ret && ctr < SOCK_RECONF_CTR) {
|
while (ret && ctr < SOCK_RECONF_CTR) {
|
||||||
atomic_store(spinningptr, 1);
|
atomic_store(spinningptr, 1);
|
||||||
xsk_configure_umem((struct ifobject *)arg,
|
xsk_configure_umem(ifobject, bufs, num_frames * XSK_UMEM__DEFAULT_FRAME_SIZE);
|
||||||
bufs, num_frames * XSK_UMEM__DEFAULT_FRAME_SIZE);
|
ret = xsk_configure_socket(ifobject);
|
||||||
ret = xsk_configure_socket((struct ifobject *)arg);
|
|
||||||
usleep(USLEEP_MAX);
|
usleep(USLEEP_MAX);
|
||||||
ctr++;
|
ctr++;
|
||||||
}
|
}
|
||||||
|
@ -818,6 +816,7 @@ static void *worker_testapp_validate(void *arg)
|
||||||
struct generic_data *data = (struct generic_data *)malloc(sizeof(struct generic_data));
|
struct generic_data *data = (struct generic_data *)malloc(sizeof(struct generic_data));
|
||||||
struct iphdr *ip_hdr = (struct iphdr *)(pkt_data + sizeof(struct ethhdr));
|
struct iphdr *ip_hdr = (struct iphdr *)(pkt_data + sizeof(struct ethhdr));
|
||||||
struct ethhdr *eth_hdr = (struct ethhdr *)pkt_data;
|
struct ethhdr *eth_hdr = (struct ethhdr *)pkt_data;
|
||||||
|
struct ifobject *ifobject = (struct ifobject *)arg;
|
||||||
void *bufs = NULL;
|
void *bufs = NULL;
|
||||||
|
|
||||||
pthread_attr_setstacksize(&attr, THREAD_STACK);
|
pthread_attr_setstacksize(&attr, THREAD_STACK);
|
||||||
|
@ -828,49 +827,48 @@ static void *worker_testapp_validate(void *arg)
|
||||||
if (bufs == MAP_FAILED)
|
if (bufs == MAP_FAILED)
|
||||||
exit_with_error(errno);
|
exit_with_error(errno);
|
||||||
|
|
||||||
if (strcmp(((struct ifobject *)arg)->nsname, ""))
|
if (strcmp(ifobject->nsname, ""))
|
||||||
switch_namespace(((struct ifobject *)arg)->ifdict_index);
|
switch_namespace(ifobject->ifdict_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((struct ifobject *)arg)->fv.vector == tx) {
|
if (ifobject->fv.vector == tx) {
|
||||||
int spinningrxctr = 0;
|
int spinningrxctr = 0;
|
||||||
|
|
||||||
if (!bidi_pass)
|
if (!bidi_pass)
|
||||||
thread_common_ops(arg, bufs, &sync_mutex_tx, &spinning_tx);
|
thread_common_ops(ifobject, bufs, &sync_mutex_tx, &spinning_tx);
|
||||||
|
|
||||||
while (atomic_load(&spinning_rx) && spinningrxctr < SOCK_RECONF_CTR) {
|
while (atomic_load(&spinning_rx) && spinningrxctr < SOCK_RECONF_CTR) {
|
||||||
spinningrxctr++;
|
spinningrxctr++;
|
||||||
usleep(USLEEP_MAX);
|
usleep(USLEEP_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
ksft_print_msg("Interface [%s] vector [Tx]\n", ((struct ifobject *)arg)->ifname);
|
ksft_print_msg("Interface [%s] vector [Tx]\n", ifobject->ifname);
|
||||||
for (int i = 0; i < num_frames; i++) {
|
for (int i = 0; i < num_frames; i++) {
|
||||||
/*send EOT frame */
|
/*send EOT frame */
|
||||||
if (i == (num_frames - 1))
|
if (i == (num_frames - 1))
|
||||||
data->seqnum = -1;
|
data->seqnum = -1;
|
||||||
else
|
else
|
||||||
data->seqnum = i;
|
data->seqnum = i;
|
||||||
gen_udp_hdr((void *)data, (void *)arg, udp_hdr);
|
gen_udp_hdr((void *)data, ifobject, udp_hdr);
|
||||||
gen_ip_hdr((void *)arg, ip_hdr);
|
gen_ip_hdr(ifobject, ip_hdr);
|
||||||
gen_udp_csum(udp_hdr, ip_hdr);
|
gen_udp_csum(udp_hdr, ip_hdr);
|
||||||
gen_eth_hdr((void *)arg, eth_hdr);
|
gen_eth_hdr(ifobject, eth_hdr);
|
||||||
gen_eth_frame(((struct ifobject *)arg)->umem,
|
gen_eth_frame(ifobject->umem, i * XSK_UMEM__DEFAULT_FRAME_SIZE);
|
||||||
i * XSK_UMEM__DEFAULT_FRAME_SIZE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
free(data);
|
free(data);
|
||||||
ksft_print_msg("Sending %d packets on interface %s\n",
|
ksft_print_msg("Sending %d packets on interface %s\n",
|
||||||
(opt_pkt_count - 1), ((struct ifobject *)arg)->ifname);
|
(opt_pkt_count - 1), ifobject->ifname);
|
||||||
tx_only_all(arg);
|
tx_only_all(ifobject);
|
||||||
} else if (((struct ifobject *)arg)->fv.vector == rx) {
|
} else if (ifobject->fv.vector == rx) {
|
||||||
struct pollfd fds[MAX_SOCKS] = { };
|
struct pollfd fds[MAX_SOCKS] = { };
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!bidi_pass)
|
if (!bidi_pass)
|
||||||
thread_common_ops(arg, bufs, &sync_mutex_tx, &spinning_rx);
|
thread_common_ops(ifobject, bufs, &sync_mutex_tx, &spinning_rx);
|
||||||
|
|
||||||
ksft_print_msg("Interface [%s] vector [Rx]\n", ((struct ifobject *)arg)->ifname);
|
ksft_print_msg("Interface [%s] vector [Rx]\n", ifobject->ifname);
|
||||||
xsk_populate_fill_ring(((struct ifobject *)arg)->umem);
|
xsk_populate_fill_ring(ifobject->umem);
|
||||||
|
|
||||||
TAILQ_INIT(&head);
|
TAILQ_INIT(&head);
|
||||||
if (debug_pkt_dump) {
|
if (debug_pkt_dump) {
|
||||||
|
@ -879,7 +877,7 @@ static void *worker_testapp_validate(void *arg)
|
||||||
exit_with_error(errno);
|
exit_with_error(errno);
|
||||||
}
|
}
|
||||||
|
|
||||||
fds[0].fd = xsk_socket__fd(((struct ifobject *)arg)->xsk->xsk);
|
fds[0].fd = xsk_socket__fd(ifobject->xsk->xsk);
|
||||||
fds[0].events = POLLIN;
|
fds[0].events = POLLIN;
|
||||||
|
|
||||||
pthread_mutex_lock(&sync_mutex);
|
pthread_mutex_lock(&sync_mutex);
|
||||||
|
@ -892,7 +890,7 @@ static void *worker_testapp_validate(void *arg)
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
rx_pkt(((struct ifobject *)arg)->xsk, fds);
|
rx_pkt(ifobject->xsk, fds);
|
||||||
worker_pkt_validate();
|
worker_pkt_validate();
|
||||||
|
|
||||||
if (sigvar)
|
if (sigvar)
|
||||||
|
@ -900,15 +898,15 @@ static void *worker_testapp_validate(void *arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
ksft_print_msg("Received %d packets on interface %s\n",
|
ksft_print_msg("Received %d packets on interface %s\n",
|
||||||
pkt_counter, ((struct ifobject *)arg)->ifname);
|
pkt_counter, ifobject->ifname);
|
||||||
|
|
||||||
if (opt_teardown)
|
if (opt_teardown)
|
||||||
ksft_print_msg("Destroying socket\n");
|
ksft_print_msg("Destroying socket\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!opt_bidi || (opt_bidi && bidi_pass)) {
|
if (!opt_bidi || (opt_bidi && bidi_pass)) {
|
||||||
xsk_socket__delete(((struct ifobject *)arg)->xsk->xsk);
|
xsk_socket__delete(ifobject->xsk->xsk);
|
||||||
(void)xsk_umem__delete(((struct ifobject *)arg)->umem->umem);
|
(void)xsk_umem__delete(ifobject->umem->umem);
|
||||||
}
|
}
|
||||||
pthread_exit(NULL);
|
pthread_exit(NULL);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue