net/gnrc/eth: enable filtering of L2 addresses
This commit is contained in:
parent
145e4761c1
commit
31dfe382a3
@ -144,7 +144,8 @@ static int _set(netdev_t *dev, netopt_t opt, void *value, size_t value_len)
|
|||||||
_set_promiscous(dev, ((bool *)value)[0]);
|
_set_promiscous(dev, ((bool *)value)[0]);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return -ENOTSUP;
|
res = netdev_eth_set(dev, opt, value, value_len);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
|
|||||||
@ -87,6 +87,15 @@ int netdev_eth_get(netdev_t *dev, netopt_t opt, void *value, size_t max_len)
|
|||||||
res = sizeof(uintptr_t);
|
res = sizeof(uintptr_t);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef MODULE_L2FILTER
|
||||||
|
case NETOPT_L2FILTER:
|
||||||
|
{
|
||||||
|
assert(max_len >= sizeof(l2filter_t **));
|
||||||
|
*((l2filter_t **)value) = dev->filter;
|
||||||
|
res = sizeof(l2filter_t **);
|
||||||
|
break;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
@ -100,15 +109,27 @@ int netdev_eth_get(netdev_t *dev, netopt_t opt, void *value, size_t max_len)
|
|||||||
|
|
||||||
int netdev_eth_set(netdev_t *dev, netopt_t opt, void *value, size_t value_len)
|
int netdev_eth_set(netdev_t *dev, netopt_t opt, void *value, size_t value_len)
|
||||||
{
|
{
|
||||||
|
#ifndef MODULE_L2FILTER
|
||||||
(void)dev;
|
(void)dev;
|
||||||
|
#endif
|
||||||
(void)value;
|
(void)value;
|
||||||
(void)value_len;
|
(void)value_len;
|
||||||
|
|
||||||
int res = 0;
|
int res = 0;
|
||||||
|
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
|
|
||||||
|
#ifdef MODULE_L2FILTER
|
||||||
|
case NETOPT_L2FILTER:
|
||||||
|
res = l2filter_add(dev->filter, value, value_len);
|
||||||
|
break;
|
||||||
|
case NETOPT_L2FILTER_RM:
|
||||||
|
res = l2filter_rm(dev->filter, value, value_len);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
return -ENOTSUP;
|
res = -ENOTSUP;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
|
|||||||
@ -72,6 +72,13 @@ static gnrc_pktsnip_t *_recv(gnrc_netdev_t *gnrc_netdev)
|
|||||||
|
|
||||||
ethernet_hdr_t *hdr = (ethernet_hdr_t *)eth_hdr->data;
|
ethernet_hdr_t *hdr = (ethernet_hdr_t *)eth_hdr->data;
|
||||||
|
|
||||||
|
#ifdef MODULE_L2FILTER
|
||||||
|
if (!l2filter_pass(dev->filter, hdr->src, ETHERNET_ADDR_LEN)) {
|
||||||
|
DEBUG("gnrc_netdev_eth: incoming packet filtered by l2filter\n");
|
||||||
|
goto safe_out;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* set payload type from ethertype */
|
/* set payload type from ethertype */
|
||||||
pkt->type = gnrc_nettype_from_ethertype(byteorder_ntohs(hdr->type));
|
pkt->type = gnrc_nettype_from_ethertype(byteorder_ntohs(hdr->type));
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user