]> git.ipfire.org Git - thirdparty/lldpd.git/commitdiff
Add NetBSD support.
authorVincent Bernat <vincent.bernat@dailymotion.com>
Fri, 28 Dec 2012 16:48:22 +0000 (17:48 +0100)
committerVincent Bernat <vincent.bernat@dailymotion.com>
Fri, 28 Dec 2012 16:48:22 +0000 (17:48 +0100)
Only aggregation support was really different.

configure.ac
m4/os.m4
src/client/display.c
src/daemon/Makefile.am
src/daemon/interfaces-bsd.c
src/daemon/lldpd.c
src/daemon/priv.c

index 11fa363ddd4a18c524d5f871edc06eb0760f8670..32b26ff244d4eb7fdcafbb115088aeb8198de6a2 100644 (file)
@@ -90,6 +90,7 @@ AC_CONFIG_LIBOBJ_DIR([src/compat])
 AC_FUNC_MALLOC
 AC_FUNC_REALLOC
 AC_REPLACE_FUNCS([strlcpy])
+AC_CHECK_FUNCS([setresuid setresgid])
 AC_CACHE_SAVE
 
 ## Unit tests wich check
index 0f3dbb1776d5a37493be483b77b03e30ba651112..1732dccf5c1efa1b5faccd691e7136f9dad4a6a1 100644 (file)
--- a/m4/os.m4
+++ b/m4/os.m4
@@ -20,6 +20,7 @@ AC_DEFUN([lldp_CHECK_OS], [
   lldp_DEFINE_OS(linux*, Linux, LINUX)
   lldp_DEFINE_OS(freebsd*|kfreebsd*, FreeBSD, FREEBSD)
   lldp_DEFINE_OS(openbsd*, OpenBSD, OPENBSD)
+  lldp_DEFINE_OS(netbsd*, NetBSD, NETBSD)
 
   if test x$os = x; then
      AC_MSG_RESULT(no)
index 6ba108192bc3dc49bdb24545e7766021fe176957..74b0d35e38c7194c9ab4b8f754119d8ec0dfd552 100644 (file)
@@ -66,7 +66,7 @@ totag(const char *value)
        for (i = 0; i < strlen(value); i++) {
                switch (value[i]) {
                case ' ': result[i] = '-'; break;
-               default: result[i] = tolower(value[i]); break;
+               default: result[i] = tolower((int)value[i]); break;
                }
        }
        return result;
index 7c269e3790ad2436701f70b317df3cc990cb09cf..8d028633cfb44cba62a83cd79bbfee1ec3cb942c 100644 (file)
@@ -33,6 +33,9 @@ endif
 if HOST_OS_OPENBSD
 liblldpd_la_SOURCES += interfaces-bsd.c
 endif
+if HOST_OS_NETBSD
+liblldpd_la_SOURCES += interfaces-bsd.c
+endif
 
 # Add SNMP support if needed
 if USE_SNMP
index d60fc573d79f7267cf483ddcedb4db9313333272..336c78f8f5085a3beb14b5e2a7050456615cf14a 100644 (file)
 
 #include <unistd.h>
 #include <ifaddrs.h>
+#include <errno.h>
 #include <sys/param.h>
 #include <sys/sysctl.h>
 #include <sys/ioctl.h>
 #include <net/bpf.h>
 #include <net/if_types.h>
 #include <net/if_media.h>
-#include <net/if_vlan_var.h>
 #include <net/if_dl.h>
 #if defined HOST_OS_FREEBSD
+#include <net/if_vlan_var.h>
 # include <net/if_bridgevar.h>
 # include <net/if_lagg.h>
 #elif defined HOST_OS_OPENBSD
+#include <net/if_vlan_var.h>
 # include <net/if_bridge.h>
 # include <net/if_trunk.h>
+#elif defined HOST_OS_NETBSD
+#include <net/if_vlanvar.h>
+# include <net/if_bridgevar.h>
+# include <net/agr/if_agrioctl.h>
 #endif
 
 #ifndef IFDESCRSIZE
@@ -64,7 +70,7 @@ ifbsd_check_bridge(struct lldpd *cfg,
                .ifbic_req = req
        };
 
-#if defined HOST_OS_FREEBSD
+#if defined HOST_OS_FREEBSD || defined HOST_OS_NETBSD
        struct ifdrv ifd = {
                .ifd_cmd = BRDGGIFS,
                .ifd_len = sizeof(bifc),
@@ -123,6 +129,7 @@ ifbsd_check_bond(struct lldpd *cfg,
 # define SIOCGLAGG SIOCGTRUNK
 # define LAGG_MAX_PORTS TRUNK_MAX_PORTS
 #endif
+#if defined HOST_OS_OPENBSD || defined HOST_OS_FREEBSD
        struct lagg_reqport rpbuf[LAGG_MAX_PORTS];
        struct lagg_reqall ra = {
                .ra_size = sizeof(rpbuf),
@@ -152,6 +159,53 @@ ifbsd_check_bond(struct lldpd *cfg,
                slave->upper = master;
        }
        master->type |= IFACE_BOND_T;
+#elif defined HOST_OS_NETBSD
+       /* No max, we consider a maximum of 24 ports */
+       char buf[sizeof(struct agrportinfo)*24] = {};
+       size_t buflen = sizeof(buf);
+       struct agrreq ar = {
+               .ar_version = AGRREQ_VERSION,
+               .ar_cmd = AGRCMD_PORTLIST,
+               .ar_buf = buf,
+               .ar_buflen = buflen
+       };
+       struct ifreq ifr = {
+               .ifr_data = &ar
+       };
+       struct agrportlist *apl = (void *)buf;
+       struct agrportinfo *api = (void *)(apl + 1);
+       strlcpy(ifr.ifr_name, master->name, sizeof(ifr.ifr_name));
+       if (ioctl(cfg->g_sock, SIOCGETAGR, &ifr) == -1) {
+               if (errno == E2BIG) {
+                       log_warnx("interfaces",
+                           "%s is a too big aggregate. Please, report the problem",
+                           master->name);
+               } else {
+                       log_debug("interfaces",
+                           "%s is not an aggregate", master->name);
+               }
+               return;
+       }
+       for (int i = 0; i < apl->apl_nports; i++) {
+               struct interfaces_device *slave;
+               slave = interfaces_nametointerface(interfaces,
+                   api->api_ifname);
+               if (slave == NULL) {
+                       log_warnx("interfaces",
+                           "%s should be enslaved to %s but we don't know %s",
+                           api->api_ifname, master->name, api->api_ifname);
+                       continue;
+               }
+               log_debug("interfaces",
+                   "%s is enslaved to bond %s",
+                   slave->name, master->name);
+               slave->upper = master;
+               api++;
+       }
+       master->type |= IFACE_BOND_T;
+#else
+# error Unsupported OS
+#endif
 }
 
 static void
@@ -243,6 +297,7 @@ ifbsd_extract_device(struct lldpd *cfg,
                memcpy(iface->address, LLADDR(saddrdl), ETHER_ADDR_LEN);
 
        /* Grab description */
+#ifndef HOST_OS_NETBSD
        iface->alias = malloc(IFDESCRSIZE);
        if (iface->alias) {
 #ifdef HOST_OS_FREEBSD
@@ -261,6 +316,7 @@ ifbsd_extract_device(struct lldpd *cfg,
                        iface->alias = NULL;
                }
        }
+#endif /* HOST_OS_NETBSD */
 
        if (ifbsd_check_wireless(cfg, ifaddr, iface) == -1) {
                interfaces_free_device(iface);
@@ -527,14 +583,9 @@ ifbsd_phys_init(struct lldpd *cfg,
                goto end;
        }
 
-#ifdef HOST_OS_FREEBSD
-       /* We only want to receive incoming packets */
-       enable = BPF_D_IN;
-       if (ioctl(fd, BIOCSDIRECTION, (caddr_t)&enable) < 0) {
-#else
-       enable = BPF_DIRECTION_IN;
-       if (ioctl(fd, BIOCSDIRFILT, (caddr_t)&enable) < 0) {
-#endif
+       /* Don't see sent packets */
+       enable = 0;
+       if (ioctl(fd, BIOCSSEESENT, (caddr_t)&enable) < 0) {
                log_warn("interfaces",
                    "unable to set packet direction for BPF filter on %s",
                    hardware->h_ifname);
@@ -547,11 +598,13 @@ ifbsd_phys_init(struct lldpd *cfg,
                    hardware->h_ifname);
                goto end;
        }
+#ifdef BIOCSETWF
        /* Install write filter (optional) */
        if (ioctl(fd, BIOCSETWF, (caddr_t)&fprog) < 0) {
                log_info("interfaces", "unable to setup write BPF filter for %s",
                    hardware->h_ifname);
        }
+#endif
 
        /* Setup multicast */
        interfaces_setup_multicast(cfg, hardware->h_ifname, 0);
index a3bcede9f3a48e81e7f2641bd7b70e90f063e48f..dd9124d710a61ed1fbeb179e502cdc82e2418b22 100644 (file)
@@ -37,7 +37,7 @@
 #include <netinet/if_ether.h>
 #include <pwd.h>
 #include <grp.h>
-#if defined HOST_OS_FREEBSD  || defined HOST_OS_OPENBSD
+#if defined HOST_OS_FREEBSD  || defined HOST_OS_OPENBSD || defined HOST_OS_NETBSD
 # include <sys/param.h>
 # include <sys/sysctl.h>
 #endif
@@ -853,7 +853,7 @@ lldpd_update_localchassis(struct lldpd *cfg)
                        LOCAL_CHASSIS(cfg)->c_cap_enabled &= ~LLDP_CAP_ROUTER;
                close(f);
        }
-#elif defined HOST_OS_FREEBSD || defined HOST_OS_OPENBSD
+#elif defined HOST_OS_FREEBSD || defined HOST_OS_OPENBSD || defined HOST_OS_NETBSD
        int n, mib[4] = {
                CTL_NET,
                PF_INET,
index b63000d647692e8d26946047f072d33fd2a1854e..73608aa378492b35f66dd6a46a01d086cf8968b8 100644 (file)
@@ -345,7 +345,9 @@ asroot_iface_init()
        must_write(remote, &rc, sizeof(rc));
        send_fd(remote, s);
        close(s);
-#elif defined HOST_OS_FREEBSD || defined HOST_OS_OPENBSD
+#elif defined HOST_OS_FREEBSD || \
+      defined HOST_OS_OPENBSD || \
+      defined HOST_OS_NETBSD
        int fd = -1, rc = 0, n = 0;
        char dev[20];
        int ifindex;
@@ -391,7 +393,7 @@ asroot_iface_multicast()
        dlp->sdl_alen = ETHER_ADDR_LEN;
        dlp->sdl_slen = 0;
        must_read(remote, LLADDR(dlp), ETHER_ADDR_LEN);
-#elif defined HOST_OS_OPENBSD
+#elif defined HOST_OS_OPENBSD || defined HOST_OS_NETBSD
        struct sockaddr *sap = (struct sockaddr *)&ifr.ifr_addr;
        sap->sa_len = sizeof(struct sockaddr);
        sap->sa_family = AF_UNSPEC;
@@ -543,12 +545,22 @@ priv_init(char *chrootdir, int ctl, uid_t uid, gid_t gid)
                        if (chdir("/") != 0)
                                fatal("privsep", "unable to chdir");
                        gidset[0] = gid;
+#ifdef HAVE_SETRESGID
                        if (setresgid(gid, gid, gid) == -1)
                                fatal("privsep", "setresgid() failed");
+#else
+                       if (setregid(gid, gid) == -1)
+                               fatal("privsep", "setregid() failed");
+#endif
                        if (setgroups(1, gidset) == -1)
                                fatal("privsep", "setgroups() failed");
+#ifdef HAVE_SETRESUID
                        if (setresuid(uid, uid, uid) == -1)
                                fatal("privsep", "setresuid() failed");
+#else
+                       if (setreuid(uid, uid) == -1)
+                               fatal("privsep", "setreuid() failed");
+#endif
                }
                remote = pair[0];
                close(pair[1]);