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