Add BSD bridge interface detection

This commit is contained in:
Joseph C. Lehner 2017-01-28 10:09:53 +01:00
parent 00a5ca6022
commit 40dd2b1a6c

View file

@ -44,6 +44,13 @@
#endif
#endif
#ifdef NMRPFLASH_BSD
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <netinet/if_ether.h>
#include <net/if_bridgevar.h>
#endif
struct ethsock
{
const char *intf;
@ -155,6 +162,33 @@ static bool set_stp_enabled(const char *intf, bool enabled)
return ret;
}
#else
static bool is_bridge(const char *intf)
{
#ifdef NMRPFLASH_BSD
struct ifdrv ifd;
struct ifbropreq ifbop;
int err, fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0) {
return false;
}
strncpy(ifd.ifd_name, intf, sizeof(ifd.ifd_name));
ifd.ifd_cmd = BRDGPARAM;
ifd.ifd_data = &ifbop;
ifd.ifd_len = sizeof(ifbop);
err = ioctl(fd, SIOCGDRVSPEC, &ifd);
if (err && verbosity) {
xperror("ioctl(SIOCGDRVSPEC)");
}
close(fd);
return !err;
#else
return false;
#endif
}
#endif
static bool get_intf_info(const char *intf, uint8_t *hwaddr, void *dummy)
@ -425,6 +459,11 @@ struct ethsock *ethsock_create(const char *intf, uint16_t protocol)
fprintf(stderr, "Warning: failed to disable STP on %s.\n", intf);
}
}
#else
if (is_bridge(intf)) {
fprintf(stderr, "Warning: bridge interfaces are not fully "
"supported on this platform.\n");
}
#endif
return sock;