From: Vincent Bernat Date: Fri, 28 Dec 2012 16:48:22 +0000 (+0100) Subject: Add NetBSD support. X-Git-Tag: 0.7.0~32 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8dab5698245074d5ab30278b74959ea6f0d66be8;p=thirdparty%2Flldpd.git Add NetBSD support. Only aggregation support was really different. --- diff --git a/configure.ac b/configure.ac index 11fa363d..32b26ff2 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/m4/os.m4 b/m4/os.m4 index 0f3dbb17..1732dccf 100644 --- 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) diff --git a/src/client/display.c b/src/client/display.c index 6ba10819..74b0d35e 100644 --- a/src/client/display.c +++ b/src/client/display.c @@ -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; diff --git a/src/daemon/Makefile.am b/src/daemon/Makefile.am index 7c269e37..8d028633 100644 --- a/src/daemon/Makefile.am +++ b/src/daemon/Makefile.am @@ -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 diff --git a/src/daemon/interfaces-bsd.c b/src/daemon/interfaces-bsd.c index d60fc573..336c78f8 100644 --- a/src/daemon/interfaces-bsd.c +++ b/src/daemon/interfaces-bsd.c @@ -19,20 +19,26 @@ #include #include +#include #include #include #include #include #include #include -#include #include #if defined HOST_OS_FREEBSD +#include # include # include #elif defined HOST_OS_OPENBSD +#include # include # include +#elif defined HOST_OS_NETBSD +#include +# include +# include #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); diff --git a/src/daemon/lldpd.c b/src/daemon/lldpd.c index a3bcede9..dd9124d7 100644 --- a/src/daemon/lldpd.c +++ b/src/daemon/lldpd.c @@ -37,7 +37,7 @@ #include #include #include -#if defined HOST_OS_FREEBSD || defined HOST_OS_OPENBSD +#if defined HOST_OS_FREEBSD || defined HOST_OS_OPENBSD || defined HOST_OS_NETBSD # include # include #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, diff --git a/src/daemon/priv.c b/src/daemon/priv.c index b63000d6..73608aa3 100644 --- a/src/daemon/priv.c +++ b/src/daemon/priv.c @@ -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]);