gluon-radv-filterd: Use existing type ether_addr for mac addresses

Signed-off-by: Sven Eckelmann <sven@narfation.org>
This commit is contained in:
Sven Eckelmann 2017-12-20 11:43:51 +01:00 committed by Jan-Philipp Litza
parent 9d194c3f7f
commit 86c3fa879a
No known key found for this signature in database
GPG Key ID: 1FB658053CE27196
3 changed files with 29 additions and 17 deletions

View File

@ -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));

View File

@ -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)

View File

@ -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] = "";