gluon-radv-filterd: Use existing type ether_addr for mac addresses
Signed-off-by: Sven Eckelmann <sven@narfation.org>
This commit is contained in:
parent
9d194c3f7f
commit
86c3fa879a
@ -40,6 +40,7 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
|
|
||||||
|
#include <net/ethernet.h>
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
|
|
||||||
#include <linux/filter.h>
|
#include <linux/filter.h>
|
||||||
@ -99,9 +100,9 @@
|
|||||||
|
|
||||||
struct router {
|
struct router {
|
||||||
struct router *next;
|
struct router *next;
|
||||||
macaddr_t src;
|
struct ether_addr src;
|
||||||
time_t eol;
|
time_t eol;
|
||||||
macaddr_t originator;
|
struct ether_addr originator;
|
||||||
uint16_t tq;
|
uint16_t tq;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -265,6 +266,7 @@ static void parse_cmdline(int argc, char *argv[]) {
|
|||||||
|
|
||||||
static void handle_ra(int sock) {
|
static void handle_ra(int sock) {
|
||||||
struct sockaddr_ll src;
|
struct sockaddr_ll src;
|
||||||
|
struct ether_addr mac;
|
||||||
unsigned int addr_size = sizeof(src);
|
unsigned int addr_size = sizeof(src);
|
||||||
size_t len;
|
size_t len;
|
||||||
struct {
|
struct {
|
||||||
@ -278,18 +280,19 @@ static void handle_ra(int sock) {
|
|||||||
CHECK(len >= sizeof(pkt));
|
CHECK(len >= sizeof(pkt));
|
||||||
CHECK(ntohs(pkt.ip6.ip6_plen) + sizeof(struct ip6_hdr) >= sizeof(pkt));
|
CHECK(ntohs(pkt.ip6.ip6_plen) + sizeof(struct ip6_hdr) >= sizeof(pkt));
|
||||||
|
|
||||||
DEBUG_MSG("received valid RA from " F_MAC, F_MAC_VAR(src.sll_addr));
|
memcpy(&mac, src.sll_addr, sizeof(mac));
|
||||||
|
DEBUG_MSG("received valid RA from " F_MAC, F_MAC_VAR(mac));
|
||||||
|
|
||||||
// update list of known routers
|
// update list of known routers
|
||||||
struct router *router;
|
struct router *router;
|
||||||
foreach(router, G.routers) {
|
foreach(router, G.routers) {
|
||||||
if (!memcmp(router->src, src.sll_addr, sizeof(macaddr_t))) {
|
if (!memcmp(&router->src, src.sll_addr, sizeof(struct ether_addr))) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!router) {
|
if (!router) {
|
||||||
router = malloc(sizeof(struct router));
|
router = malloc(sizeof(struct router));
|
||||||
memcpy(router->src, src.sll_addr, sizeof(router->src));
|
memcpy(&router->src, src.sll_addr, sizeof(router->src));
|
||||||
router->next = G.routers;
|
router->next = G.routers;
|
||||||
G.routers = router;
|
G.routers = router;
|
||||||
}
|
}
|
||||||
@ -326,13 +329,14 @@ static void update_tqs(void) {
|
|||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
uint8_t tq;
|
uint8_t tq;
|
||||||
bool update_originators = false;
|
bool update_originators = false;
|
||||||
macaddr_t mac_a, mac_b;
|
struct ether_addr mac_a, mac_b;
|
||||||
macaddr_t unspec = {};
|
struct ether_addr unspec;
|
||||||
|
|
||||||
// reset TQs
|
// reset TQs
|
||||||
|
memset(&unspec, 0, sizeof(unspec));
|
||||||
foreach(router, G.routers) {
|
foreach(router, G.routers) {
|
||||||
router->tq = 0;
|
router->tq = 0;
|
||||||
if (!memcmp(router->originator, unspec, sizeof(unspec)))
|
if (ether_addr_equal(router->originator, unspec))
|
||||||
update_originators = true;
|
update_originators = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -353,9 +357,9 @@ static void update_tqs(void) {
|
|||||||
F_MAC_VAR_REF(mac_a), F_MAC_VAR_REF(mac_b)) == 12) {
|
F_MAC_VAR_REF(mac_a), F_MAC_VAR_REF(mac_b)) == 12) {
|
||||||
|
|
||||||
foreach(router, G.routers) {
|
foreach(router, G.routers) {
|
||||||
if (!memcmp(router->src, mac_a, sizeof(macaddr_t))) {
|
if (ether_addr_equal(router->src, mac_a)) {
|
||||||
DEBUG_MSG("Found originator for " F_MAC ", it's " F_MAC, F_MAC_VAR(router->src), F_MAC_VAR(mac_b));
|
DEBUG_MSG("Found originator for " F_MAC ", it's " F_MAC, F_MAC_VAR(router->src), F_MAC_VAR(mac_b));
|
||||||
memcpy(router->originator, mac_b, sizeof(macaddr_t));
|
router->originator = mac_b;
|
||||||
break; // foreach
|
break; // foreach
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -378,7 +382,7 @@ static void update_tqs(void) {
|
|||||||
F_MAC_VAR_REF(mac_a), &tq) == 7) {
|
F_MAC_VAR_REF(mac_a), &tq) == 7) {
|
||||||
|
|
||||||
foreach(router, G.routers) {
|
foreach(router, G.routers) {
|
||||||
if (!memcmp(router->originator, mac_a, sizeof(macaddr_t))) {
|
if (ether_addr_equal(router->originator, mac_a)) {
|
||||||
DEBUG_MSG("Found TQ for router " F_MAC " (originator " F_MAC "), it's %d", F_MAC_VAR(router->src), F_MAC_VAR(router->originator), tq);
|
DEBUG_MSG("Found TQ for router " F_MAC " (originator " F_MAC "), it's %d", F_MAC_VAR(router->src), F_MAC_VAR(router->originator), tq);
|
||||||
router->tq = tq;
|
router->tq = tq;
|
||||||
if (tq > G.max_tq)
|
if (tq > G.max_tq)
|
||||||
@ -407,7 +411,7 @@ static void update_tqs(void) {
|
|||||||
while (fgetc(f) != '\n');
|
while (fgetc(f) != '\n');
|
||||||
while (fscanf(f, " * " F_MAC " [%*5s] %*f", F_MAC_VAR_REF(mac_a)) == 6) {
|
while (fscanf(f, " * " F_MAC " [%*5s] %*f", F_MAC_VAR_REF(mac_a)) == 6) {
|
||||||
foreach(router, G.routers) {
|
foreach(router, G.routers) {
|
||||||
if (!memcmp(router->src, mac_a, sizeof(macaddr_t))) {
|
if (ether_addr_equal(router->src, mac_a)) {
|
||||||
DEBUG_MSG("Found router " F_MAC " in transtable_local, assigning TQ %d", F_MAC_VAR(router->src), LOCAL_TQ);
|
DEBUG_MSG("Found router " F_MAC " in transtable_local, assigning TQ %d", F_MAC_VAR(router->src), LOCAL_TQ);
|
||||||
router->tq = LOCAL_TQ;
|
router->tq = LOCAL_TQ;
|
||||||
G.max_tq = LOCAL_TQ;
|
G.max_tq = LOCAL_TQ;
|
||||||
@ -424,7 +428,7 @@ static void update_tqs(void) {
|
|||||||
|
|
||||||
foreach(router, G.routers) {
|
foreach(router, G.routers) {
|
||||||
if (router->tq == 0) {
|
if (router->tq == 0) {
|
||||||
if (!memcmp(router->originator, unspec, sizeof(unspec)))
|
if (ether_addr_equal(router->originator, unspec))
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Unable to find router " F_MAC " in transtable_{global,local}\n",
|
"Unable to find router " F_MAC " in transtable_{global,local}\n",
|
||||||
F_MAC_VAR(router->src));
|
F_MAC_VAR(router->src));
|
||||||
|
@ -4,7 +4,14 @@
|
|||||||
#define F_MAC "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx"
|
#define F_MAC "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx"
|
||||||
#define F_MAC_LEN 17
|
#define F_MAC_LEN 17
|
||||||
#define F_MAC_IGN "%*2x:%*2x:%*2x:%*2x:%*2x:%*2x"
|
#define F_MAC_IGN "%*2x:%*2x:%*2x:%*2x:%*2x:%*2x"
|
||||||
#define F_MAC_VAR(var) (var)[0], (var)[1], (var)[2], (var)[3], (var)[4], (var)[5]
|
#define F_MAC_VAR(var) \
|
||||||
#define F_MAC_VAR_REF(var) &(var)[0], &(var)[1], &(var)[2], &(var)[3], &(var)[4], &(var)[5]
|
(var).ether_addr_octet[0], (var).ether_addr_octet[1], \
|
||||||
|
(var).ether_addr_octet[2], (var).ether_addr_octet[3], \
|
||||||
|
(var).ether_addr_octet[4], (var).ether_addr_octet[5]
|
||||||
|
#define F_MAC_VAR_REF(var) \
|
||||||
|
&(var).ether_addr_octet[0], &(var).ether_addr_octet[1], \
|
||||||
|
&(var).ether_addr_octet[2], &(var).ether_addr_octet[3], \
|
||||||
|
&(var).ether_addr_octet[4], &(var).ether_addr_octet[5]
|
||||||
|
|
||||||
typedef uint8_t macaddr_t[ETH_ALEN];
|
#define ether_addr_equal(_a, _b) (memcmp((_a).ether_addr_octet, \
|
||||||
|
(_b).ether_addr_octet, ETH_ALEN) == 0)
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <json-c/json.h>
|
#include <json-c/json.h>
|
||||||
#include <libgluonutil.h>
|
#include <libgluonutil.h>
|
||||||
|
#include <net/ethernet.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "mac.h"
|
#include "mac.h"
|
||||||
@ -10,7 +11,7 @@ static struct json_object * get_radv_filter() {
|
|||||||
FILE *f = popen("exec ebtables -L RADV_FILTER", "r");
|
FILE *f = popen("exec ebtables -L RADV_FILTER", "r");
|
||||||
char *line = NULL;
|
char *line = NULL;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
macaddr_t mac = {};
|
struct ether_addr mac = {};
|
||||||
struct json_object *ret = NULL;
|
struct json_object *ret = NULL;
|
||||||
char macstr[F_MAC_LEN + 1] = "";
|
char macstr[F_MAC_LEN + 1] = "";
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user