From 40dd2b1a6cc06196cd4f97de3bafa4f4ec821ee6 Mon Sep 17 00:00:00 2001 From: "Joseph C. Lehner" Date: Sat, 28 Jan 2017 10:09:53 +0100 Subject: [PATCH] Add BSD bridge interface detection --- ethsock.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/ethsock.c b/ethsock.c index 230efa6..4e58830 100644 --- a/ethsock.c +++ b/ethsock.c @@ -44,6 +44,13 @@ #endif #endif +#ifdef NMRPFLASH_BSD +#include +#include +#include +#include +#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; -- 2.25.1