From: Joseph C. Lehner Date: Sat, 28 Jan 2017 09:09:53 +0000 (+0100) Subject: Add BSD bridge interface detection X-Git-Tag: v0.9.10~1 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=40dd2b1a6cc06196cd4f97de3bafa4f4ec821ee6;p=oweals%2Fnmrpflash.git Add BSD bridge interface detection --- 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;