pkgsrc-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[pkgsrc/trunk]: pkgsrc/net/wide-dhcpv6 Allow dhcp6s to work on an interface w...
details: https://anonhg.NetBSD.org/pkgsrc/rev/82d45d1cc698
branches: trunk
changeset: 411177:82d45d1cc698
user: roy <roy%pkgsrc.org@localhost>
date: Thu Feb 06 22:39:38 2020 +0000
description:
Allow dhcp6s to work on an interface with more than one linklocal address.
This is important for allowing CONFIRM messages to work with the on-link
check.
diffstat:
net/wide-dhcpv6/Makefile | 3 +-
net/wide-dhcpv6/distinfo | 5 ++-
net/wide-dhcpv6/patches/patch-config.h | 29 +++++++++++++++++
net/wide-dhcpv6/patches/patch-dhcp6s.c | 58 ++++++++++++++++++++++++++++++++++
net/wide-dhcpv6/patches/patch-if.c | 55 ++++++++++++++++++++++++++++++++
5 files changed, 148 insertions(+), 2 deletions(-)
diffs (180 lines):
diff -r c8866f0ee7be -r 82d45d1cc698 net/wide-dhcpv6/Makefile
--- a/net/wide-dhcpv6/Makefile Thu Feb 06 22:07:06 2020 +0000
+++ b/net/wide-dhcpv6/Makefile Thu Feb 06 22:39:38 2020 +0000
@@ -1,6 +1,7 @@
-# $NetBSD: Makefile,v 1.9 2020/01/18 23:33:23 rillig Exp $
+# $NetBSD: Makefile,v 1.10 2020/02/06 22:39:38 roy Exp $
DISTNAME= wide-dhcpv6-20080615
+PKGREVISION= 1
CATEGORIES= net
MASTER_SITES= ${MASTER_SITE_SOURCEFORGE:=wide-dhcpv6/}
diff -r c8866f0ee7be -r 82d45d1cc698 net/wide-dhcpv6/distinfo
--- a/net/wide-dhcpv6/distinfo Thu Feb 06 22:07:06 2020 +0000
+++ b/net/wide-dhcpv6/distinfo Thu Feb 06 22:39:38 2020 +0000
@@ -1,6 +1,9 @@
-$NetBSD: distinfo,v 1.4 2015/11/04 00:35:44 agc Exp $
+$NetBSD: distinfo,v 1.5 2020/02/06 22:39:38 roy Exp $
SHA1 (wide-dhcpv6-20080615.tar.gz) = 8829c4c871a74dccc0335839ff0a4e763b6b4f24
RMD160 (wide-dhcpv6-20080615.tar.gz) = 4b7d8115de6c90b8f4878a2bf25a5fd6aceea13a
SHA512 (wide-dhcpv6-20080615.tar.gz) = 2c6d5ca523dbf07fae0e65af86ed24f6582bf5230df394da385e26ff818594fd15d909851723c582792b4649a89d7f2a99999c5d3aac1ea22229348b8afc2d8b
Size (wide-dhcpv6-20080615.tar.gz) = 215354 bytes
+SHA1 (patch-config.h) = 89e97d912a07e9732df071fc4e12694593b9db87
+SHA1 (patch-dhcp6s.c) = 33ac74669efa29ab1e59f979930d75060c393d36
+SHA1 (patch-if.c) = a7e0866d3cb82df21e7d04fb835971fd7b7ef229
diff -r c8866f0ee7be -r 82d45d1cc698 net/wide-dhcpv6/patches/patch-config.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/net/wide-dhcpv6/patches/patch-config.h Thu Feb 06 22:39:38 2020 +0000
@@ -0,0 +1,29 @@
+$NetBSD: patch-config.h,v 1.1 2020/02/06 22:39:38 roy Exp $
+
+Allow CONFIRM to check all addresses on the link.
+
+--- config.h.orig 2008-06-15 07:48:41.000000000 +0000
++++ config.h
+@@ -33,6 +33,12 @@
+ TAILQ_HEAD(ia_conflist, ia_conf);
+ TAILQ_HEAD(pifc_list, prefix_ifconf);
+
++struct if_addr {
++ TAILQ_ENTRY(if_addr) link;
++ struct in6_addr addr;
++};
++TAILQ_HEAD(if_addr_list, if_addr);
++
+ struct dhcp6_poolspec {
+ char* name;
+ u_int32_t pltime;
+@@ -67,8 +73,7 @@ struct dhcp6_if {
+ char *ifname;
+ unsigned int ifid;
+ u_int32_t linkid; /* to send link-local packets */
+- /* multiple global address configuration is not supported now */
+- struct in6_addr addr; /* global address */
++ struct if_addr_list addr_list;
+
+ /* configuration parameters */
+ u_long send_flags;
diff -r c8866f0ee7be -r 82d45d1cc698 net/wide-dhcpv6/patches/patch-dhcp6s.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/net/wide-dhcpv6/patches/patch-dhcp6s.c Thu Feb 06 22:39:38 2020 +0000
@@ -0,0 +1,58 @@
+$NetBSD: patch-dhcp6s.c,v 1.1 2020/02/06 22:39:38 roy Exp $
+
+Allow CONFIRM to check all addresses on the link.
+
+--- dhcp6s.c.orig 2008-06-15 07:51:57.000000000 +0000
++++ dhcp6s.c
+@@ -2237,10 +2237,20 @@ react_confirm(ifp, pi, dh6, len, optinfo
+ iaaddr = TAILQ_NEXT(iaaddr, link)) {
+
+ struct in6_addr *confaddr = &iaaddr->val_statefuladdr6.addr;
+- struct in6_addr *linkaddr;
++ struct in6_addr *linkaddr = NULL;
+ struct sockaddr_in6 *src = (struct sockaddr_in6 *)from;
++ struct if_addr *ia;
+
+- if (!IN6_IS_ADDR_LINKLOCAL(&src->sin6_addr)) {
++ /* CONFIRM should match an interface address */
++ TAILQ_FOREACH(ia, &ifp->addr_list, link) {
++ if (memcmp(&ia->addr, confaddr, 8) == 0) {
++ linkaddr = &ia->addr;
++ break;
++ }
++ }
++
++ if (linkaddr == NULL &&
++ !IN6_IS_ADDR_LINKLOCAL(&src->sin6_addr)) {
+ /* CONFIRM is relayed via a DHCP-relay */
+ struct relayinfo *relayinfo;
+
+@@ -2249,20 +2259,19 @@ react_confirm(ifp, pi, dh6, len, optinfo
+ "no link-addr found");
+ goto fail;
+ }
+- relayinfo = TAILQ_LAST(relayinfohead, relayinfolist);
++ relayinfo = TAILQ_LAST(relayinfohead,
++ relayinfolist);
+
+- /* XXX: link-addr is supposed to be a global address */
+- linkaddr = &relayinfo->linkaddr;
+- } else {
+- /* CONFIRM is directly arrived */
+- linkaddr = &ifp->addr;
++ /* XXX: link-addr is supposed to be a
++ * global address */
++ if (!memcmp(&relayinfo->linkaddr, confaddr, 8))
++ linkaddr = &relayinfo->linkaddr;
+ }
+
+- if (memcmp(linkaddr, confaddr, 8) != 0) {
++ if (linkaddr == NULL) {
+ dprintf(LOG_INFO, FNAME,
+ "%s does not seem to belong to %s's link",
+- in6addr2str(confaddr, 0),
+- in6addr2str(linkaddr, 0));
++ in6addr2str(confaddr, 0), ifp->ifname);
+ stcode = DH6OPT_STCODE_NOTONLINK;
+ goto send_reply;
+ }
diff -r c8866f0ee7be -r 82d45d1cc698 net/wide-dhcpv6/patches/patch-if.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/net/wide-dhcpv6/patches/patch-if.c Thu Feb 06 22:39:38 2020 +0000
@@ -0,0 +1,55 @@
+$NetBSD: patch-if.c,v 1.1 2020/02/06 22:39:38 roy Exp $
+
+Allow CONFIRM to check all addresses on the link.
+
+--- if.c.orig 2008-06-15 07:48:43.000000000 +0000
++++ if.c
+@@ -58,6 +58,7 @@ ifinit(ifname)
+ char *ifname;
+ {
+ struct dhcp6_if *ifp;
++ struct if_addr *ia;
+
+ if ((ifp = find_ifconfbyname(ifname)) != NULL) {
+ dprintf(LOG_NOTICE, FNAME, "duplicated interface: %s", ifname);
+@@ -66,11 +67,12 @@ ifinit(ifname)
+
+ if ((ifp = malloc(sizeof(*ifp))) == NULL) {
+ dprintf(LOG_ERR, FNAME, "malloc failed");
+- goto fail;
++ return (NULL);
+ }
+ memset(ifp, 0, sizeof(*ifp));
+
+ TAILQ_INIT(&ifp->event_list);
++ TAILQ_INIT(&ifp->addr_list);
+
+ if ((ifp->ifname = strdup(ifname)) == NULL) {
+ dprintf(LOG_ERR, FNAME, "failed to copy ifname");
+@@ -109,7 +111,14 @@ ifinit(ifname)
+ if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr))
+ continue;
+
+- ifp->addr = sin6->sin6_addr;
++ ia = malloc(sizeof(*ia));
++ if (ia == NULL) {
++ dprintf(LOG_ERR, FNAME, "malloc failed: %s",
++ strerror(errno));
++ goto fail;
++ }
++ ia->addr = sin6->sin6_addr;
++ TAILQ_INSERT_TAIL(&ifp->addr_list, ia, link);
+ }
+
+ freeifaddrs(ifap);
+@@ -122,6 +131,10 @@ ifinit(ifname)
+ fail:
+ if (ifp->ifname != NULL)
+ free(ifp->ifname);
++ while ((ia = TAILQ_FIRST(&ifp->addr_list)) != NULL) {
++ TAILQ_REMOVE(&ifp->addr_list, ia, link);
++ free(ia);
++ }
+ free(ifp);
+ return (NULL);
+ }
Home |
Main Index |
Thread Index |
Old Index