Correct duid generate on FreeBSD
diff --git a/src/bpf.c b/src/bpf.c
index 789c718..2cd9ada 100644
--- a/src/bpf.c
+++ b/src/bpf.c
@@ -108,6 +108,10 @@
return 0; /* need code for Solaris and MacOS*/
#endif
+ /* AF_LINK doesn't exist in Linux, so we can't use it in our API */
+ if (family == AF_LOCAL)
+ family = AF_LINK;
+
if ((fd = socket(PF_INET, SOCK_DGRAM, 0)) == -1)
return 0;
@@ -154,24 +158,6 @@
ifr = (struct ifreq *)ifreq.iov_base;
memcpy(ifr, ptr, len);
-#ifdef HAVE_DHCP6
- if (family == AF_LOCAL)
- {
- unsigned int flags;
- if (ioctl(fd, SIOCGIFFLAGS, ifr) != -1)
- {
- flags = ifr->ifr_flags;
- ifr->ifr_addr.sa_family = AF_LINK;
- if (ioctl(fd, SIOCGIFADDR, ifr) != -1 &&
- !((*callback)((unsigned int)htons(ETHERTYPE_IP),
- flags,
- LLADDR((struct sockaddr_dl *)&ifr->ifr_addr), ETHER_ADDR_LEN, parm)))
- goto err;
- }
- continue;
- }
-#endif
-
if (ifr->ifr_addr.sa_family == family)
{
if (family == AF_INET)
@@ -208,6 +194,15 @@
goto err;
}
#endif
+#ifdef HAVE_DHCP6
+ else if (family == AF_LINK)
+ {
+ /* Assume ethernet again here */
+ struct sockaddr_dl *sdl = (struct sockaddr_dl *)&ifr->ifr_addr;
+ if (sdl->sdl_alen != 0 && !((*callback)(ARPHRD_ETHER, LLADDR(sdl), sdl->sdl_alen, parm)))
+ goto err;
+ }
+#endif
}
}
diff --git a/src/dhcp6.c b/src/dhcp6.c
index 27f22b1..c8fe2ef 100644
--- a/src/dhcp6.c
+++ b/src/dhcp6.c
@@ -34,8 +34,7 @@
static int complete_context6(struct in6_addr *local, int prefix,
int scope, int if_index, int dad, void *vparam);
-static int make_duid1(unsigned int type, unsigned int flags, char *mac,
- size_t maclen, void *parm);
+static int make_duid1(unsigned int type, char *mac, size_t maclen, void *parm);
void dhcp6_init(void)
{
@@ -477,26 +476,23 @@
{
/* rebase epoch to 1/1/2000 */
time_t newnow = now - 946684800;
+
iface_enumerate(AF_LOCAL, &newnow, make_duid1);
-
- if (!daemon->duid)
- die("Cannot create DHCPv6 server DUID", NULL, EC_MISC);
+
+ if(!daemon->duid)
+ die("Cannot create DHCPv6 server DUID: %s", NULL, EC_MISC);
}
-static int make_duid1(unsigned int type, unsigned int flags, char *mac,
- size_t maclen, void *parm)
+static int make_duid1(unsigned int type, char *mac, size_t maclen, void *parm)
{
/* create DUID as specified in RFC3315. We use the MAC of the
first interface we find that isn't loopback or P-to-P */
unsigned char *p;
- if (flags & (IFF_LOOPBACK | IFF_POINTOPOINT))
- return 1;
-
daemon->duid = p = safe_malloc(maclen + 8);
daemon->duid_len = maclen + 8;
-
+
#ifdef HAVE_BROKEN_RTC
PUTSHORT(3, p); /* DUID_LL */
#else
diff --git a/src/lease.c b/src/lease.c
index b5f9926..4fdf226 100644
--- a/src/lease.c
+++ b/src/lease.c
@@ -147,12 +147,6 @@
the startup synthesised SIGHUP. */
lease->flags &= ~(LEASE_NEW | LEASE_CHANGED);
}
-
-#ifdef HAVE_DHCP6
- /* If we're not doing DHCPv6, and there are not v6 leases, don't add the DUID to the database */
- if (!daemon->duid && daemon->dhcp6)
- make_duid(now);
-#endif
#ifdef HAVE_SCRIPT
if (!daemon->lease_stream)
@@ -181,6 +175,16 @@
file_dirty = 0;
lease_prune(NULL, now);
dns_dirty = 1;
+
+#ifdef HAVE_DHCP6
+ /* If we're not doing DHCPv6, and there are not v6 leases, don't add the DUID to the database */
+ if (!daemon->duid && daemon->dhcp6)
+ {
+ file_dirty = 1;
+ make_duid(now);
+ }
+#endif
+
}
void lease_update_from_configs(void)
diff --git a/src/netlink.c b/src/netlink.c
index d6515d4..f4e9402 100644
--- a/src/netlink.c
+++ b/src/netlink.c
@@ -282,9 +282,8 @@
rta = RTA_NEXT(rta, len1);
}
- if (mac && !((*callback)((unsigned int)link->ifi_type,
- (unsigned int)link->ifi_flags,
- mac, maclen, parm)))
+ if (mac && !((link->ifi_flags & (IFF_LOOPBACK | IFF_POINTOPOINT))) &&
+ !((*callback)((unsigned int)link->ifi_type, mac, maclen, parm)))
return 0;
}
#endif