Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions src/ipu/ipu.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,43 @@
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/ether.h>
#include <assert.h>

static int cmdLinklocal(int argc, char* argv[])
{
struct Option options[] = {
{"help", NULL, 0,
"linklocal <mac-address>\n"
" Compute an ipv6 link-local address using EUI-64"
},
{0, 0, 0, 0}
};
int n = parseOptionsOrDie(argc, argv, options);
argc -= n; argv += n;
if (argc < 1)
die("No mac-address\n");
struct ether_addr* mac = ether_aton(*argv);
if (mac == NULL)
die("Invalid MAC [%s]\n", *argv);
mac->ether_addr_octet[0] ^= 0x02; /* flip bit 7 */

struct in6_addr addr = {0};
addr.s6_addr32[0] = htonl(0xfe800000);
addr.s6_addr[8] = mac->ether_addr_octet[0];
addr.s6_addr[9] = mac->ether_addr_octet[1];
addr.s6_addr[10] = mac->ether_addr_octet[2];
addr.s6_addr[11] = 0xff;
addr.s6_addr[12] = 0xfe;
addr.s6_addr[13] = mac->ether_addr_octet[3];
addr.s6_addr[14] = mac->ether_addr_octet[4];
addr.s6_addr[15] = mac->ether_addr_octet[5];
char strbuf[INET6_ADDRSTRLEN+1];
inet_ntop(AF_INET6, &addr, strbuf, sizeof(strbuf));
printf("%s\n", strbuf);
return 0;
}

static int cmdMakeip(int argc, char* argv[])
{
char const* opt_cidr = NULL;
Expand Down Expand Up @@ -305,6 +340,7 @@ static int cmdVersion(int argc, char **argv)
}

__attribute__ ((__constructor__)) static void addCommands(void) {
addCmd("linklocal", cmdLinklocal);
addCmd("makeip", cmdMakeip);
addCmd("contains", cmdContains);
addCmd("version", cmdVersion);
Expand Down
4 changes: 2 additions & 2 deletions src/lib/log.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,11 @@ int logp(const char *fmt, ...)

void logConfigShm(char const* name)
{
logconfig = mapSharedData(name, O_RDWR);
logconfig = mapSharedData(name, O_RDWR, NULL);
if (logconfig != NULL)
return;
createSharedDataOrDie(name, &default_config, sizeof(struct LogConfig));
logconfig = mapSharedDataOrDie(name, O_RDWR);
logconfig = mapSharedDataOrDie(name, O_RDWR, NULL);
}

__attribute__ ((__constructor__)) static void loginit(void) {
Expand Down
24 changes: 24 additions & 0 deletions src/lib/maglevdyn.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,30 @@ void magDataDyn_init(unsigned M, unsigned N, void* mem, unsigned len)
magDataDyn_free(&m);
}

int magDataDyn_validate(void* mem, size_t len)
{
if (len < sizeof(struct MagDataDynInternal))
return -1;
struct MagDataDynInternal* mi = mem;
// M and N may be mutating in shm so copy them ASAP
unsigned M, N;
M = mi->M;
N = mi->N;
if (M < 3)
return -1;
return 0;
if (N == 0)
return -1;
if (N > M)
return -1;
if (M != primeBelow(M))
return -1;
// len may be higher, but this validation is stricter
if (len != magDataDyn_len(M, N))
return -1;
return 0;
}

void magDataDyn_map(struct MagDataDyn* m, void* mem)
{
struct MagDataDynInternal* mi = mem;
Expand Down
11 changes: 11 additions & 0 deletions src/lib/maglevdyn.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
/*
SPDX-License-Identifier: Apache-2.0
Copyright (c) 2021-2022 Nordix Foundation
*/
#pragma once

#include <stddef.h>

struct MagDataDyn {
unsigned M, N;
int *lookup;
Expand All @@ -20,6 +26,11 @@ unsigned magDataDyn_len(unsigned M, unsigned N);
*/
void magDataDyn_init(unsigned M, unsigned N, void* mem, unsigned len);

/*
Validate that a memory area is MagDataDyn compatible
*/
int magDataDyn_validate(void* mem, size_t len);

/*
Map to a memory area that may be in shared mem.
Must call magDataDyn_free() to free allocated memory.
Expand Down
12 changes: 8 additions & 4 deletions src/lib/shmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,16 @@ void createSharedDataOrDie(char const* name, void* data, size_t len)
die("createSharedData: %s\n", strerror(errno));
}
}
void* mapSharedData(char const* name, int mode)
void* mapSharedData(char const* name, int mode, size_t* len)
{
int fd = shm_open(name, mode, (mode == O_RDONLY)?0400:0600);
if (fd < 0)
return NULL;
struct stat statbuf;
if (fstat(fd, &statbuf) != 0)
die("fstat shared mem; %s\n", name);
if (len != NULL)
*len = statbuf.st_size;
void* m = mmap(
NULL, statbuf.st_size,
(mode == O_RDONLY)?PROT_READ:PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
Expand All @@ -43,21 +45,23 @@ void* mapSharedData(char const* name, int mode)
}
return m;
}
void* mapSharedDataOrDie(char const* name, int mode)
void* mapSharedDataOrDie(char const* name, int mode, size_t* len)
{
void* m = mapSharedData(name, mode);
void* m = mapSharedData(name, mode, len);
if (m == NULL)
die("FAILED mapSharedData: %s\n", name);
return m;
}
void* mapSharedDataRead(char const* name, /*out*/int* _fd)
void* mapSharedDataRead(char const* name, /*out*/int* _fd, size_t* len)
{
int fd = shm_open(name, O_RDONLY, 0400);
if (fd < 0)
return NULL;
struct stat statbuf;
if (fstat(fd, &statbuf) != 0)
die("fstat shared mem; %s\n", name);
if (len != NULL)
*len = statbuf.st_size;
void* m = mmap(NULL, statbuf.st_size, PROT_READ, MAP_SHARED, fd, 0);
if (m == MAP_FAILED) {
close(fd);
Expand Down
6 changes: 3 additions & 3 deletions src/lib/shmem.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

int createSharedData(char const* name, void* data, size_t len);
void createSharedDataOrDie(char const* name, void* data, size_t len);
void* mapSharedData(char const* name, int mode);
void* mapSharedDataOrDie(char const* name, int mode);
void* mapSharedDataRead(char const* name, /*out*/int* fd);
void* mapSharedData(char const* name, int mode, size_t* len);
void* mapSharedDataOrDie(char const* name, int mode, size_t* len);
void* mapSharedDataRead(char const* name, /*out*/int* fd, size_t* len);

10 changes: 8 additions & 2 deletions src/nfqlb/cmdConfig.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,10 @@ static int cmdActivate(int argc, char **argv)
argc -= nopt;
argv += nopt;
struct SharedData* s;
s = mapSharedDataOrDie(shm, O_RDWR);
size_t len;
s = mapSharedDataOrDie(shm, O_RDWR, &len);
if (magDataDyn_validate(s->mem, len - sizeof(struct SharedData)) != 0)
die("Shm invalid; %s\n", shm);
struct MagDataDyn magd;
magDataDyn_map(&magd, s->mem);

Expand Down Expand Up @@ -88,7 +91,10 @@ static int cmdDeactivate(int argc, char **argv)
argc -= nopt;
argv += nopt;
struct SharedData* s;
s = mapSharedDataOrDie(shm, O_RDWR);
size_t len;
s = mapSharedDataOrDie(shm, O_RDWR, &len);
if (magDataDyn_validate(s->mem, len - sizeof(struct SharedData)) != 0)
die("Shm invalid; %s\n", shm);
struct MagDataDyn magd;
magDataDyn_map(&magd, s->mem);

Expand Down
2 changes: 1 addition & 1 deletion src/nfqlb/cmdFlowLb-test.c
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ static void initShm(
s->ownFwmark = ownFw;
createSharedDataOrDie(name, s, sizeof(struct SharedData) + len);
free(s);
s = mapSharedDataOrDie(name, O_RDWR);
s = mapSharedDataOrDie(name, O_RDWR, NULL);
magDataDyn_init(m, n, s->mem, len);
}

Expand Down
13 changes: 10 additions & 3 deletions src/nfqlb/cmdFlowLb.c
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@ static int cmdFlowLb(int argc, char **argv)
logTraceServer(trace_address);

if (lbShm != NULL) {
slb = mapSharedDataOrDie(lbShm, O_RDONLY);
slb = mapSharedDataOrDie(lbShm, O_RDONLY, NULL);
magDataDyn_map(&magdlb, slb->mem);
}

Expand All @@ -296,7 +296,7 @@ static int cmdFlowLb(int argc, char **argv)
sft = calloc(1, sizeof(*sft));
createSharedDataOrDie(ftShm, sft, sizeof(*sft));
free(sft);
sft = mapSharedDataOrDie(ftShm, O_RDWR);
sft = mapSharedDataOrDie(ftShm, O_RDWR, NULL);

// Get MTU from the ingress device
int mtu = atoi(mtuOpt);
Expand Down Expand Up @@ -432,12 +432,19 @@ STATIC struct LoadBalancer* loadbalancerFindOrCreate(char const* target)
// Not found, create a new LB
trace(TRACE_TARGET, "Creating LB; %s\n", target);
int fd;
struct SharedData* st = mapSharedDataRead(target, &fd);
size_t len;
struct SharedData* st = mapSharedDataRead(target, &fd, &len);
if (st == NULL) {
UNLOCK(lblistLock);
trace(TRACE_TARGET, "Map shm failed; %s\n", target);
return NULL;
}
if (magDataDyn_validate(st->mem, len - sizeof(struct SharedData)) != 0) {
UNLOCK(lblistLock);
trace(TRACE_TARGET, "Shm invalid; %s\n", target);
return NULL;
}


lb = MALLOC(lb);
lb->target = strdup(target);
Expand Down
2 changes: 1 addition & 1 deletion src/nfqlb/cmdFwmark.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ static int cmdFwmark(int argc, char **argv)

if (shm != NULL) {
struct SharedData* s = NULL;
s = mapSharedDataOrDie(shm, O_RDWR);
s = mapSharedDataOrDie(shm, O_RDWR, NULL);
struct MagDataDyn magd;
magDataDyn_map(&magd, s->mem);
unsigned index = hash % magd.M;
Expand Down
6 changes: 3 additions & 3 deletions src/nfqlb/cmdLb.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,10 +161,10 @@ static int cmdLb(int argc, char **argv)
logConfigShm(TRACE_SHM);
logTraceServer(trace_address);

st = mapSharedDataOrDie(targetShm, O_RDONLY);
st = mapSharedDataOrDie(targetShm, O_RDONLY, NULL);
magDataDyn_map(&magd, st->mem);
if (lbShm != NULL) {
slb = mapSharedDataOrDie(lbShm, O_RDONLY);
slb = mapSharedDataOrDie(lbShm, O_RDONLY, NULL);
magDataDyn_map(&magdlb, slb->mem);
}
notargets_fw = atoi(notargets_fwmark);
Expand All @@ -173,7 +173,7 @@ static int cmdLb(int argc, char **argv)
sft = calloc(1, sizeof(*sft));
createSharedDataOrDie(ftShm, sft, sizeof(*sft));
free(sft);
sft = mapSharedDataOrDie(ftShm, O_RDWR);
sft = mapSharedDataOrDie(ftShm, O_RDWR, NULL);

// Get MTU from the ingress device
int mtu = atoi(mtuOpt);
Expand Down
9 changes: 6 additions & 3 deletions src/nfqlb/cmdShm.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ static void initShm(
s->ownFwmark = ownFw;
createSharedDataOrDie(name, s, sizeof(struct SharedData) + len);
free(s);
s = mapSharedDataOrDie(name, O_RDWR);
s = mapSharedDataOrDie(name, O_RDWR, NULL);
magDataDyn_init(m, n, s->mem, len);
}

Expand Down Expand Up @@ -109,7 +109,10 @@ static int cmdShow(int argc, char **argv)
};
(void)parseOptionsOrDie(argc, argv, options);
struct SharedData* s;
s = mapSharedDataOrDie(shm, O_RDONLY);
size_t len;
s = mapSharedDataOrDie(shm, O_RDONLY, &len);
if (magDataDyn_validate(s->mem, len - sizeof(struct SharedData)) != 0)
die("Shm invalid; %s\n", shm);
if (s == NULL)
die("Failed to open shared mem; %s\n", shm);
printf("Shm: %s\n", shm);
Expand Down Expand Up @@ -144,7 +147,7 @@ static int cmdStats(int argc, char **argv)
{0, 0, 0, 0}
};
(void)parseOptionsOrDie(argc, argv, options);
struct fragStats* sft = mapSharedDataOrDie(ftShm, O_RDONLY);
struct fragStats* sft = mapSharedDataOrDie(ftShm, O_RDONLY, NULL);
fragPrintStats(sft);
return 0;
}
Expand Down