sys/shell/netif: enable setting of L2 addr filters

master
Hauke Petersen 6 years ago
parent 31dfe382a3
commit 359a89f28b

@ -27,6 +27,7 @@
#include "thread.h"
#include "net/netstats.h"
#include "net/l2filter.h"
#include "net/ipv6/addr.h"
#include "net/gnrc/ipv6/netif.h"
#include "net/gnrc/netif.h"
@ -499,6 +500,30 @@ static void _netif_list(kernel_pid_t dev)
}
#endif
#ifdef MODULE_L2FILTER
l2filter_t *filter = NULL;
res = gnrc_netapi_get(dev, NETOPT_L2FILTER, 0, &filter, sizeof(filter));
if (res > 0) {
#ifdef MODULE_L2FILTER_WHITELIST
puts("\n White-listed link layer addresses:");
#else
puts("\n Black-listed link layer addresses:");
#endif
int count = 0;
for (unsigned i = 0; i < L2FILTER_LISTSIZE; i++) {
if (filter[i].addr_len > 0) {
char hwaddr_str[filter[i].addr_len * 3];
gnrc_netif_addr_to_str(hwaddr_str, sizeof(hwaddr_str),
filter[i].addr, filter[i].addr_len);
printf(" %2i: %s\n", count++, hwaddr_str);
}
}
if (count == 0) {
puts(" --- none ---");
}
}
#endif
#ifdef MODULE_NETSTATS_L2
puts("");
_netif_stats(dev, NETSTATS_LAYER2, false);
@ -771,6 +796,40 @@ static int _netif_set_encrypt_key(kernel_pid_t dev, netopt_t opt, char *key_str)
return 0;
}
#ifdef MODULE_L2FILTER
static int _netif_addrm_l2filter(kernel_pid_t dev, char *val, bool add)
{
uint8_t addr[MAX_ADDR_LEN];
size_t addr_len = gnrc_netif_addr_from_str(addr, sizeof(addr), val);
if ((addr_len == 0) || (addr_len > L2FILTER_ADDR_MAXLEN)) {
puts("error: given address is invalid");
return 1;
}
if (add) {
if (gnrc_netapi_set(dev, NETOPT_L2FILTER, 0, addr, addr_len) < 0) {
puts("unable to add link layer address to filter");
return 1;
}
puts("successfully added address to filter");
}
else {
if (gnrc_netapi_set(dev, NETOPT_L2FILTER_RM, 0, addr, addr_len) < 0) {
puts("unable to remove link layer address from filter");
return 1;
}
puts("successfully removed address to filter");
}
return 0;
}
static void _l2filter_usage(const char *cmd)
{
printf("usage: %s <if_id> l2filter {add|del} <addr>\n", cmd);
}
#endif
static int _netif_set(char *cmd_name, kernel_pid_t dev, char *key, char *value)
{
if ((strcmp("addr", key) == 0) || (strcmp("addr_short", key) == 0)) {
@ -1153,6 +1212,23 @@ int _netif_config(int argc, char **argv)
return _netif_mtu((kernel_pid_t)dev, argv[3]);
}
#ifdef MODULE_L2FILTER
else if (strcmp(argv[2], "l2filter") == 0) {
if (argc < 5) {
_l2filter_usage(argv[2]);
}
else if (strcmp(argv[3], "add") == 0) {
return _netif_addrm_l2filter(dev, argv[4], true);
}
else if (strcmp(argv[3], "del") == 0) {
return _netif_addrm_l2filter(dev, argv[4], false);
}
else {
_l2filter_usage(argv[2]);
}
return 1;
}
#endif
#ifdef MODULE_NETSTATS
else if (strcmp(argv[2], "stats") == 0) {
uint8_t module;
@ -1230,6 +1306,9 @@ int _netif_config(int argc, char **argv)
_flag_usage(argv[0]);
_add_usage(argv[0]);
_del_usage(argv[0]);
#ifdef MODULE_L2FILTER
_l2filter_usage(argv[0]);
#endif
#ifdef MODULE_NETSTATS
_stats_usage(argv[0]);
#endif

Loading…
Cancel
Save