pmlag

Poor man's link aggregation
git clone git://git.finwo.net/app/pmlag
Log | Files | Refs | README | LICENSE

commit 497f10a2cdf89b3375ec6b91da8a5e81e392e7f9
parent 38f6a4ec1c2888f48ff98df7fb52846c8ffef1d7
Author: Yersa Nordman <yersa@finwo.nl>
Date:   Wed, 15 Feb 2023 18:59:13 +0100

Successful sending from tap interface

Diffstat:
Msrc/main.c | 75++++++++++++++++++++++++++++++++++++---------------------------------------
Msrc/socket.c | 2+-
Mtest.ini | 2+-
3 files changed, 38 insertions(+), 41 deletions(-)

diff --git a/src/main.c b/src/main.c @@ -36,11 +36,11 @@ void * thread_iface(void *arg) { /* return NULL; */ /* } */ - /* // Reserve receive buffer, support 64k packets just in case */ - /* int buflen; */ - /* unsigned char *buffer = (unsigned char *) malloc(RCVBUFSIZ); */ - /* struct sockaddr saddr; */ - /* int saddr_len = sizeof(saddr); */ + // Reserve receive buffer, support 64k packets just in case + int buflen; + unsigned char *buffer = (unsigned char *) malloc(RCVBUFSIZ); + struct sockaddr saddr; + int saddr_len = sizeof(saddr); printf("Thread started for iface: %s->%s(%d)\n", iface->bond->name, iface->name, iface->sockfd); @@ -48,47 +48,44 @@ void * thread_iface(void *arg) { /* pthread_mutex_lock(&(iface->bond->mtx_rt)); */ /* pthread_mutex_unlock(&(iface->bond->mtx_rt)); */ - /* // Bail if the bond's socket could not be opened */ - /* if (!iface->bond->sockfd) { */ - /* pthread_exit(NULL); */ - /* return NULL; */ - /* } */ + // Find bond socket iface_idx + int send_len; - /* // Find bond socket iface_idx */ - /* int send_len; */ + while(1) { - /* while(1) { */ + // Zero out buffer, to prevent pollution, & receive packet + memset(buffer, 0, RCVBUFSIZ); + buflen = recvfrom(iface->sockfd, buffer, RCVBUFSIZ, 0, &saddr, (socklen_t *)&saddr_len); + if (buflen < 0) { + perror("recvfrom"); + pthread_exit(NULL); + return NULL; + } - /* // Zero out buffer, to prevent pollution, & receive packet */ - /* memset(buffer, 0, RCVBUFSIZ); */ - /* buflen = recvfrom(iface->sockfd, buffer, RCVBUFSIZ, 0, &saddr, (socklen_t *)&saddr_len); */ - /* if (buflen < 0) { */ - /* perror("recvfrom"); */ - /* pthread_exit(NULL); */ - /* return NULL; */ - /* } */ + // TODO: track received proto=0x0666 packet to update routing table - /* // TODO: track received proto=0x0666 packet to update routing table */ + printf("\n"); + printf("Got packet: %d bytes\n", buflen); + printf("\n"); - /* printf("\n"); */ - /* printf("Got packet: %d bytes\n", buflen); */ - /* printf("\n"); */ + printf("Ethernet header\n"); + printf("\t|- DST %.2X-%.2X-%.2X-%.2X-%.2X-%.2X\n",buffer[0],buffer[1],buffer[2],buffer[3],buffer[ 4],buffer[ 5]); + printf("\t|- SRC %.2X-%.2X-%.2X-%.2X-%.2X-%.2X\n",buffer[6],buffer[7],buffer[8],buffer[9],buffer[10],buffer[11]); + printf("\t|- PROTO %.4X\n", ((int)((char)buffer[12]) << 8) + buffer[13]); + printf("\n"); - /* printf("Ethernet header\n"); */ - /* printf("\t|- DST %.2X-%.2X-%.2X-%.2X-%.2X-%.2X\n",buffer[0],buffer[1],buffer[2],buffer[3],buffer[ 4],buffer[ 5]); */ - /* printf("\t|- SRC %.2X-%.2X-%.2X-%.2X-%.2X-%.2X\n",buffer[6],buffer[7],buffer[8],buffer[9],buffer[10],buffer[11]); */ - /* printf("\t|- PROTO %.4X\n", ((int)((char)buffer[12]) << 8) + buffer[13]); */ - /* printf("\n"); */ + /* memset(buffer + 16, 0, buflen - 16); */ - /* // Redirect packet to bond socket as-is */ - /* printf("Bond iface: %d\n\n", iface->bond->sockfd); */ - /* send_len = write(iface->bond->sockfd, buffer, buflen); */ - /* if (buflen != send_len) { */ - /* perror("write(bond)"); */ - /* pthread_exit(NULL); */ - /* return NULL; */ - /* } */ - /* } */ + // Redirect packet to bond socket as-is + printf("Bond iface: %d\n\n", iface->bond->sockfd); + send_len = write(iface->bond->sockfd, buffer, buflen); + printf("Got %d, sent %d\n\n", buflen, send_len); + if (buflen != send_len) { + perror("write(bond)"); + /* pthread_exit(NULL); */ + /* return NULL; */ + } + } /* sleep(3); */ pthread_exit(NULL); diff --git a/src/socket.c b/src/socket.c @@ -75,7 +75,7 @@ int tap_alloc(char * ifname) { * * IFF_NO_PI - Do not provide packet information */ - ifr.ifr_flags = IFF_TAP | IFF_NO_PI; + ifr.ifr_flags = IFF_TAP | IFF_NAPI | IFF_MULTI_QUEUE | IFF_UP; if( *ifname ) { strncpy(ifr.ifr_name, ifname, IFNAMSIZ); } diff --git a/test.ini b/test.ini @@ -3,7 +3,7 @@ ; eth0 = backup, eth1 = primary [bond0] mode=active-backup -interface=enp0s13f0u1c2 +interface=wlp170s0 weight=10 ; ; broadcast everything on all interfaces