Add BSD bridge interface detection
authorJoseph C. Lehner <joseph.c.lehner@gmail.com>
Sat, 28 Jan 2017 09:09:53 +0000 (10:09 +0100)
committerJoseph C. Lehner <joseph.c.lehner@gmail.com>
Sat, 28 Jan 2017 09:09:53 +0000 (10:09 +0100)
ethsock.c

index 230efa61530b45240e117f1345c0cb56e6a58925..4e5883065c0ce3560f6e21ade86b0b08dbd71dd1 100644 (file)
--- a/ethsock.c
+++ b/ethsock.c
 #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;