kea: add fixes from kea-git

Add fixes to kea that are in the kea-git package.
This commit is contained in:
Niclas Rosenvik 2020-01-17 17:59:51 +00:00
parent 8663ef2639
commit 2e4b2b24f9
10 changed files with 267 additions and 14 deletions

View File

@ -5,17 +5,22 @@ RMD160 (kea-1.6.1.tar.gz) = 261b0ea1bca0a70034532112011c64ad809c37ec
SHA512 (kea-1.6.1.tar.gz) = 4220f46fc185f4434ad01886d2d43ba1f9dcca57f5afa33235c8593269220a79e2dcb4ad71298dec868444c29e7cb6febe66a1456fdc116a2d9fd3f019f740d8
Size (kea-1.6.1.tar.gz) = 7155604 bytes
SHA1 (patch-Makefile.am) = 4e4896be44290114160be878666878bb44d71a8e
SHA1 (patch-configure.ac) = 70d7a8235ed6459a23f5404303d5babfdfec14db
SHA1 (patch-configure.ac) = e6ef32f92a70d248749e72e627d8fde11fb50805
SHA1 (patch-src_bin_agent_agent__lexer.ll) = de64c9ad03b1c6812f95f52c8fcd5f6c1aa1ef27
SHA1 (patch-src_bin_d2_d2__lexer.ll) = 400b9f54b5bb9c9eb9c52c1ef23c9a377f29960e
SHA1 (patch-src_bin_dhcp4_dhcp4__lexer.ll) = dfcca8319ca3b6b8902676bb1662ceb9abca74bc
SHA1 (patch-src_bin_dhcp4_tests_parser__unittest.cc) = 6f213d5abd286b57c41b6fad27ada49c9301857a
SHA1 (patch-src_bin_dhcp6_dhcp6__lexer.ll) = 6ebeb6b18dc8d86d0890ce3cfcaeea4c2658e958
SHA1 (patch-src_bin_dhcp6_tests_parser__unittest.cc) = f671c6b5c26a6b6179971f2f10af8e2b1b8b7e6a
SHA1 (patch-src_bin_keactrl_Makefile.am) = 5b6fd816da6011858d1167d297c83eda7947efd7
SHA1 (patch-src_bin_netconf_netconf__lexer.ll) = ec316d436f791470df9dd5c106c76f3026a19b0e
SHA1 (patch-src_lib_dhcp_Makefile.am) = 452036d0100a85f41c52562292931bea2501e396
SHA1 (patch-src_lib_dhcp_iface__mgr__sun.cc) = 7bf79c4a24b3c074f8cf53b79fc83ae8255f63d7
SHA1 (patch-src_lib_dhcp_pkt__filter__inet.cc) = 979ca0bd1d87bdaf3bf54b3e11b18fef72ecc860
SHA1 (patch-src_lib_dhcp_iface__mgr__sun.cc) = ca4330b27adfa12b1ff6c6cc54c8c30f89f9851f
SHA1 (patch-src_lib_dhcp_pkt__filter__inet.cc) = 32f70306483a719a8b400eff613cdbb935fe9cd0
SHA1 (patch-src_lib_dhcp_tests_Makefile.am) = 9ee63ba82b05d02ea88e3a74183a7aa6da7b36c9
SHA1 (patch-src_lib_dhcp_tests_iface__mgr__unittest.cc) = 8e274dbb5d9897ccd1708e4007cbe69ab2db0ef5
SHA1 (patch-src_lib_dhcpsrv_Makefile.am) = bdd2be227d8c7f34b4329092e6de3bcaa7117284
SHA1 (patch-src_lib_dhcpsrv_host__data__source__factory.cc) = a1bc71ec40b9eb5a6c9247360a84ce480521cad2
SHA1 (patch-src_lib_util_encode_base__n.cc) = 61bf8402e4baf0578a7ec9444f396a9b6c69d87d
SHA1 (patch-src_lib_util_signal__set.cc) = f060fcedecb8ccdda997fbef2040dab82c620cb0
SHA1 (patch-src_lib_util_watch__socket.cc) = ab55b5e613bc431dcd92ef68bf3501a7e4aca7de

View File

@ -1,7 +1,7 @@
# $NetBSD$
PKG_OPTIONS_VAR= PKG_OPTIONS.kea
PKG_SUPPORTED_OPTIONS= mysql pgsql
PKG_SUPPORTED_OPTIONS= mysql pgsql tests
PKG_SUGGESTED_OPTIONS= mysql pgsql
PLIST_VARS+= mysql pgsql
@ -22,3 +22,8 @@ PLIST.mysql=yes
CONFIGURE_ARGS+=--with-pgsql=${PGSQL_PREFIX}/bin/pg_config
PLIST.pgsql=yes
.endif
.if !empty(PKG_OPTIONS:Mtests)
. include "../../devel/googletest/buildlink3.mk"
CONFIGURE_ARGS+=--with-gtest=${BUILDLINK_PREFIX.googletest}
.endif

View File

@ -1,9 +1,19 @@
$NetBSD$
* fix typo to find googletest
* fix compatability errors
--- configure.ac.orig 2019-12-30 16:00:16.704565254 +0000
--- configure.ac.orig 2019-11-19 14:50:46.000000000 +0000
+++ configure.ac
@@ -1148,7 +1148,7 @@ if test "x$enable_gtest" = "xyes" ; then
GTEST_FOUND="false"
for dir in $GTEST_PATHS; do
if test -f "$dir/include/gtest/gtest.h"; then
- if ! test -f "$dir/lib/libgtests.a"; then
+ if ! test -f "$dir/lib/libgtest.a"; then
AC_MSG_WARN([Found Google Test include but not the library in $dir.])
continue
fi
@@ -1391,7 +1391,7 @@ if test "x$enable_generate_parser" != "x
AC_MSG_ERROR([Flex is required for enable-generate-parser, but was not found])
fi

View File

@ -0,0 +1,18 @@
$NetBSD$
* put inclusion of asiolink on top so that std::map does not conlict with
map in net/if.h on illumos
--- src/bin/dhcp4/tests/parser_unittest.cc.orig 2020-01-02 23:01:48.000000000 +0000
+++ src/bin/dhcp4/tests/parser_unittest.cc
@@ -6,9 +6,9 @@
#include <config.h>
+#include <dhcpsrv/parsers/simple_parser4.h>
#include <gtest/gtest.h>
#include <dhcp4/parser_context.h>
-#include <dhcpsrv/parsers/simple_parser4.h>
#include <testutils/io_utils.h>
#include <testutils/user_context_utils.h>

View File

@ -0,0 +1,18 @@
$NetBSD$
* put inclusion of asiolonk first so that map from net/if.h on illumos
won't confict with std::map
--- src/bin/dhcp6/tests/parser_unittest.cc.orig 2020-01-02 23:01:48.000000000 +0000
+++ src/bin/dhcp6/tests/parser_unittest.cc
@@ -6,9 +6,9 @@
#include <config.h>
+#include <dhcpsrv/parsers/simple_parser6.h>
#include <gtest/gtest.h>
#include <dhcp6/parser_context.h>
-#include <dhcpsrv/parsers/simple_parser6.h>
#include <testutils/io_utils.h>
#include <testutils/user_context_utils.h>

View File

@ -1,15 +1,115 @@
$NetBSD$
* map conflicts with map from net/if.h, use std::map explicitly
* enable bpf filter
* get the mac adresses the right way on illumos
based on illumos-ims.diff from
https://gitlab.isc.org/isc-projects/kes/issues/631
copyright ISC licensed under mpl-2.0
https://www.mozilla.org/en-US/MPL/2.0/
--- src/lib/dhcp/iface_mgr_sun.cc.orig 2019-11-19 14:50:43.000000000 +0000
--- src/lib/dhcp/iface_mgr_sun.cc.orig 2020-01-02 23:01:48.000000000 +0000
+++ src/lib/dhcp/iface_mgr_sun.cc
@@ -39,7 +39,7 @@ IfaceMgr::detectIfaces() {
@@ -10,6 +10,7 @@
#include <dhcp/iface_mgr.h>
#include <dhcp/iface_mgr_error_handler.h>
+#include <dhcp/pkt_filter_bpf.h>
#include <dhcp/pkt_filter_inet.h>
#include <exceptions/exceptions.h>
@@ -39,7 +40,12 @@ IfaceMgr::detectIfaces() {
isc_throw(Unexpected, "Network interfaces detection failed.");
}
- typedef map<string, IfacePtr> IfaceLst;
+ int sock = socket(PF_INET, SOCK_DGRAM, 0);
+ if (sock < 0) {
+ isc_throw(Unexpected, "Can't get a socket.");
+ }
+
+ typedef std::map<string, IfacePtr> IfaceLst;
IfaceLst::iterator iface_iter;
IfaceLst ifaces;
@@ -51,6 +57,7 @@ IfaceMgr::detectIfaces() {
if (!(ifindex = if_nametoindex(ifname))) {
// Interface name does not have corresponding index ...
freeifaddrs(iflist);
+ close(sock);
isc_throw(Unexpected, "Interface " << ifname << " has no index");
}
@@ -62,9 +69,26 @@ IfaceMgr::detectIfaces() {
IfacePtr iface(new Iface(ifname, ifindex));
iface->setFlags(ifptr->ifa_flags);
ifaces.insert(pair<string, IfacePtr>(ifname, iface));
+
+ // Get the MAC address.
+ struct lifreq lif;
+ memset(&lif, 0, sizeof(lif));
+ if (strlcpy(lif.lifr_name, ifname, LIFNAMSIZ) > LIFNAMSIZ) {
+ freeifaddrs(iflist);
+ close(sock);
+ isc_throw(Unexpected, "ifname to long for lifr_name in iface_mrg_sun");
+ }
+ if (ioctl(sock, SIOCGLIFHWADDR, &lif) < 0) {
+ continue;
+ }
+ struct sockaddr_dl * ldata =
+ reinterpret_cast<struct sockaddr_dl *>(&lif.lifr_addr);
+ const uint8_t * ptr = reinterpret_cast<uint8_t *>(LLADDR(ldata));
+ iface->setHWType(ldata->sdl_type);
+ iface->setMac(ptr, ldata->sdl_alen);
}
- // Second lookup to get MAC and IP addresses
+ // Second lookup to get IP addresses
for (ifptr = iflist; ifptr != 0; ifptr = ifptr->ifa_next) {
iface_iter = ifaces.find(ifptr->ifa_name);
if (iface_iter == ifaces.end()) {
@@ -72,15 +96,7 @@ IfaceMgr::detectIfaces() {
}
// Common byte pointer for following data
const uint8_t * ptr = 0;
- if(ifptr->ifa_addr->sa_family == AF_LINK) {
- // HWAddr
- struct sockaddr_dl * ldata =
- reinterpret_cast<struct sockaddr_dl *>(ifptr->ifa_addr);
- ptr = reinterpret_cast<uint8_t *>(LLADDR(ldata));
-
- iface_iter->second->setHWType(ldata->sdl_type);
- iface_iter->second->setMac(ptr, ldata->sdl_alen);
- } else if(ifptr->ifa_addr->sa_family == AF_INET6) {
+ if(ifptr->ifa_addr->sa_family == AF_INET6) {
// IPv6 Addr
struct sockaddr_in6 * adata =
reinterpret_cast<struct sockaddr_in6 *>(ifptr->ifa_addr);
@@ -100,6 +116,7 @@ IfaceMgr::detectIfaces() {
}
freeifaddrs(iflist);
+ close(sock);
// Interfaces registering
for(IfaceLst::const_iterator iface_iter = ifaces.begin();
@@ -124,10 +141,17 @@ void Iface::setFlags(uint64_t flags) {
}
void
-IfaceMgr::setMatchingPacketFilter(const bool /* direct_response_desired */) {
+IfaceMgr::setMatchingPacketFilter(const bool direct_response_desired) {
// @todo Currently we ignore the preference to use direct traffic
// because it hasn't been implemented for Solaris.
- setPacketFilter(PktFilterPtr(new PktFilterInet()));
+ // Fixed: solaris/illumos now supports bpf
+ if (direct_response_desired) {
+ setPacketFilter(PktFilterPtr(new PktFilterBPF()));
+
+ } else {
+ setPacketFilter(PktFilterPtr(new PktFilterInet()));
+
+ }
}
bool

View File

@ -1,21 +1,35 @@
$NetBSD$
* illumos uses ip_pktinfo just like linux
--- src/lib/dhcp/pkt_filter_inet.cc.orig 2019-11-19 14:50:43.000000000 +0000
--- src/lib/dhcp/pkt_filter_inet.cc.orig 2020-01-02 23:01:48.000000000 +0000
+++ src/lib/dhcp/pkt_filter_inet.cc
@@ -86,9 +86,9 @@ PktFilterInet::openSocket(Iface& iface,
@@ -86,8 +86,8 @@ PktFilterInet::openSocket(Iface& iface,
<< "/port=" << port);
}
- // On Linux systems IP_PKTINFO socket option is supported. This
- // option is used to retrieve destination address of the packet.
-#if defined (IP_PKTINFO) && defined (OS_LINUX)
+ // On Linux and Solaris systems IP_PKTINFO socket option is supported.
+ // This option is used to retrieve destination address of the packet.
+#if defined (IP_PKTINFO) && (defined (OS_LINUX) || defined (OS_SOLARIS))
#if defined (IP_PKTINFO) && defined (OS_LINUX)
int flag = 1;
if (setsockopt(sock, IPPROTO_IP, IP_PKTINFO, &flag, sizeof(flag)) != 0) {
close(sock);
@@ -167,7 +167,7 @@ PktFilterInet::receive(Iface& iface, con
@@ -95,6 +95,13 @@ PktFilterInet::openSocket(Iface& iface,
isc_throw(SocketConfigError, "setsockopt: IP_PKTINFO: failed.");
}
+#elif defined (IP_RECVPKTINFO) && defined (OS_SOLARIS)
+ int flag = 1;
+ if (setsockopt(sock, IPPROTO_IP, IP_RECVPKTINFO, &flag, sizeof(flag)) != 0) {
+ close(sock);
+ isc_throw(SocketConfigError, "setsockopt: IP_RECVPKTINFO: failed.");
+ }
+
// On BSD systems IP_RECVDSTADDR is used instead of IP_PKTINFO.
#elif defined (IP_RECVDSTADDR) && defined (OS_BSD)
int flag = 1;
@@ -167,7 +174,7 @@ PktFilterInet::receive(Iface& iface, con
// Linux systems support IP_PKTINFO option which is used to retrieve the
// destination address of the received packet. On BSD systems IP_RECVDSTADDR
// is used instead.
@ -24,7 +38,7 @@ $NetBSD$
struct in_pktinfo* pktinfo;
struct cmsghdr* cmsg = CMSG_FIRSTHDR(&m);
@@ -243,7 +243,7 @@ PktFilterInet::send(const Iface&, uint16
@@ -243,7 +250,7 @@ PktFilterInet::send(const Iface&, uint16
// In the future the OS-specific code may be abstracted to a different
// file but for now we keep it here because there is no code yet, which
// is specific to non-Linux systems.

View File

@ -0,0 +1,17 @@
$NetBSD$
* illumos uses bpf
--- src/lib/dhcp/tests/Makefile.am.orig 2020-01-02 23:01:48.000000000 +0000
+++ src/lib/dhcp/tests/Makefile.am
@@ -97,6 +97,10 @@ if OS_BSD
libdhcp___unittests_SOURCES += pkt_filter_bpf_unittest.cc
endif
+if OS_SOLARIS
+libdhcp___unittests_SOURCES += pkt_filter_bpf_unittest.cc
+endif
+
libdhcp___unittests_SOURCES += protocol_util_unittest.cc
libdhcp___unittests_SOURCES += duid_unittest.cc

View File

@ -0,0 +1,34 @@
$NetBSD$
* enable test on illumos
* use ifru_addr_sa that is available both on illumos and linux
--- src/lib/dhcp/tests/iface_mgr_unittest.cc.orig 2020-01-02 23:01:48.000000000 +0000
+++ src/lib/dhcp/tests/iface_mgr_unittest.cc
@@ -1569,7 +1569,7 @@ TEST_F(IfaceMgrTest, setPacketFilter6) {
}
-#if defined OS_LINUX || OS_BSD
+#if defined OS_LINUX || OS_BSD || OS_SOLARIS
// This test is only supported on Linux and BSD systems. It checks
// if it is possible to use the IfaceMgr to select the packet filter
@@ -2600,7 +2600,7 @@ checkIfFlags(const Iface & iface,
bool
checkIfAddrs(const Iface & iface, struct ifaddrs *& ifptr) {
const unsigned char * p = 0;
-#if defined(OS_LINUX)
+#if defined(OS_LINUX) || defined(OS_SOLARIS)
// Workaround for Linux ...
if(ifptr->ifa_data != 0) {
// We avoid localhost as it has no MAC Address
@@ -2624,7 +2624,7 @@ checkIfAddrs(const Iface & iface, struct
}
const uint8_t * p =
- reinterpret_cast<uint8_t *>(ifr.ifr_ifru.ifru_hwaddr.sa_data);
+ reinterpret_cast<uint8_t *>(ifr.ifr_ifru.ifru_addr.sa_data);
close(s);

View File

@ -0,0 +1,32 @@
$NetBSD$
* setting SIG_IGN on SIGCHLD removes the result from the child that triggered
the signal on solaris/illumos
--- src/lib/util/signal_set.cc.orig 2020-01-10 08:19:15.723309083 +0000
+++ src/lib/util/signal_set.cc
@@ -118,11 +118,22 @@ SignalSet::invokeOnReceiptHandler(int si
struct sigaction sa;
struct sigaction prev_sa;
memset(&sa, 0, sizeof(sa));
- sa.sa_handler = SIG_IGN;
+
+ if (sig == SIGCHLD) {
+ sa.sa_handler = SIG_DFL;
+ } else {
+ sa.sa_handler = SIG_IGN;
+ }
if (sigaction(sig, &sa, &prev_sa) < 0) {
// Highly unlikely we can get here.
+ std::string sig_type;
+ if (sa.sa_handler == SIG_DFL) {
+ sig_type = "SIG_DFL";
+ } else {
+ sig_type = "SIG_IGN";
+ }
const char* errmsg = strerror(errno);
- isc_throw(SignalSetError, "failed to set SIG_IGN for signal "
+ isc_throw(SignalSetError, "failed to set " << sig_type << " for signal "
<< sig << ": " << errmsg);
}