Module Name:    src
Committed By:   christos
Date:           Tue Oct  1 20:59:51 UTC 2024

Modified Files:
        src/external/bsd/ntp/dist/include: ntp.h ntp_lists.h ntpd.h
        src/external/bsd/ntp/dist/ntpd: ntp_control.c ntp_request.c
            ntp_restrict.c

Log Message:
Don't play pointer tricks to save memory, just declare a struct for v4 and
one for v6... Fixes alignment issues on machines that have strict alignment
requirements (eg. sparc64)


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/external/bsd/ntp/dist/include/ntp.h \
    src/external/bsd/ntp/dist/include/ntpd.h
cvs rdiff -u -r1.7 -r1.8 src/external/bsd/ntp/dist/include/ntp_lists.h
cvs rdiff -u -r1.24 -r1.25 src/external/bsd/ntp/dist/ntpd/ntp_control.c
cvs rdiff -u -r1.19 -r1.20 src/external/bsd/ntp/dist/ntpd/ntp_request.c
cvs rdiff -u -r1.12 -r1.13 src/external/bsd/ntp/dist/ntpd/ntp_restrict.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/bsd/ntp/dist/include/ntp.h
diff -u src/external/bsd/ntp/dist/include/ntp.h:1.13 src/external/bsd/ntp/dist/include/ntp.h:1.14
--- src/external/bsd/ntp/dist/include/ntp.h:1.13	Sun Aug 18 16:46:50 2024
+++ src/external/bsd/ntp/dist/include/ntp.h	Tue Oct  1 16:59:51 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: ntp.h,v 1.13 2024/08/18 20:46:50 christos Exp $	*/
+/*	$NetBSD: ntp.h,v 1.14 2024/10/01 20:59:51 christos Exp $	*/
 
 /*
  * ntp.h - NTP definitions for the masses
@@ -854,23 +854,25 @@ typedef struct res_addr6_tag {
 	struct in6_addr mask;		/* IPv6 mask (net order) */
 } res_addr6;
 
-typedef struct restrict_u_tag	restrict_u;
-struct restrict_u_tag {
-	restrict_u *	link;		/* link to next entry */
+struct restrict_info {
 	u_int32		count;		/* number of packets matched */
 	u_int32		expire;		/* valid until current_time */
-	u_short		rflags;		/* restrict (accesslist) flags */
 	u_int32		mflags;		/* match flags */
+	u_short		rflags;		/* restrict (accesslist) flags */
 	short		ippeerlimit;	/* limit of associations matching */
-	union {				/* variant starting here */
-		res_addr4 v4;
-		res_addr6 v6;
-	} u;
 };
-#define	V4_SIZEOF_RESTRICT_U	(offsetof(restrict_u, u)	\
-				 + sizeof(res_addr4))
-#define	V6_SIZEOF_RESTRICT_U	(offsetof(restrict_u, u)	\
-				 + sizeof(res_addr6))
+
+struct restrict_4 {
+	struct restrict_4 *link;	/* link to next entry */
+	struct restrict_info ri;
+	res_addr4 v4;
+};
+
+struct restrict_6 {
+	struct restrict_6 *link;	/* link to next entry */
+	struct restrict_info ri;
+	res_addr6 v6;
+};
 
 /* restrictions for (4) a given address */
 typedef struct r4addr_tag	r4addr;
Index: src/external/bsd/ntp/dist/include/ntpd.h
diff -u src/external/bsd/ntp/dist/include/ntpd.h:1.13 src/external/bsd/ntp/dist/include/ntpd.h:1.14
--- src/external/bsd/ntp/dist/include/ntpd.h:1.13	Sun Aug 18 16:46:50 2024
+++ src/external/bsd/ntp/dist/include/ntpd.h	Tue Oct  1 16:59:51 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: ntpd.h,v 1.13 2024/08/18 20:46:50 christos Exp $	*/
+/*	$NetBSD: ntpd.h,v 1.14 2024/10/01 20:59:51 christos Exp $	*/
 
 /*
  * ntpd.h - Prototypes and external variables for ntpd.
@@ -567,8 +567,8 @@ extern keyid_t	info_auth_keyid;	/* keyid
 extern u_long	auth_timereset;
 
 /* ntp_restrict.c */
-extern restrict_u *	restrictlist4;	/* IPv4 restriction list */
-extern restrict_u *	restrictlist6;	/* IPv6 restriction list */
+extern struct restrict_4 *	restrictlist4;	/* IPv4 restriction list */
+extern struct restrict_6 *	restrictlist6;	/* IPv6 restriction list */
 extern int		ntp_minpkt;
 extern u_char		ntp_minpoll;
 

Index: src/external/bsd/ntp/dist/include/ntp_lists.h
diff -u src/external/bsd/ntp/dist/include/ntp_lists.h:1.7 src/external/bsd/ntp/dist/include/ntp_lists.h:1.8
--- src/external/bsd/ntp/dist/include/ntp_lists.h:1.7	Sun Aug 18 16:46:50 2024
+++ src/external/bsd/ntp/dist/include/ntp_lists.h	Tue Oct  1 16:59:51 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: ntp_lists.h,v 1.7 2024/08/18 20:46:50 christos Exp $	*/
+/*	$NetBSD: ntp_lists.h,v 1.8 2024/10/01 20:59:51 christos Exp $	*/
 
 /*
  * ntp_lists.h - linked lists common code
@@ -155,7 +155,7 @@ do {								\
 								\
 	ppentry = &(listhead);					\
 	while (TRUE) {						\
-		if (NULL == *ppentry || (beforecur)) {		\
+		if (beforecur) {				\
 			(pentry)->nextlink = *ppentry;		\
 			*ppentry = (pentry);			\
 			break;					\

Index: src/external/bsd/ntp/dist/ntpd/ntp_control.c
diff -u src/external/bsd/ntp/dist/ntpd/ntp_control.c:1.24 src/external/bsd/ntp/dist/ntpd/ntp_control.c:1.25
--- src/external/bsd/ntp/dist/ntpd/ntp_control.c:1.24	Sun Aug 18 16:47:17 2024
+++ src/external/bsd/ntp/dist/ntpd/ntp_control.c	Tue Oct  1 16:59:51 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: ntp_control.c,v 1.24 2024/08/18 20:47:17 christos Exp $	*/
+/*	$NetBSD: ntp_control.c,v 1.25 2024/10/01 20:59:51 christos Exp $	*/
 
 /*
  * ntp_control.c - respond to mode 6 control messages and send async
@@ -99,10 +99,16 @@ static	void	send_random_tag_value(int);
 static	void	read_mru_list	(struct recvbuf *, int);
 static	void	send_ifstats_entry(endpt *, u_int);
 static	void	read_ifstats	(struct recvbuf *);
-static	void	sockaddrs_from_restrict_u(sockaddr_u *,	sockaddr_u *,
-					  restrict_u *, int);
-static	void	send_restrict_entry(restrict_u *, int, u_int);
-static	void	send_restrict_list(restrict_u *, int, u_int *);
+static	void	sockaddrs_from_struct_restrict_4(sockaddr_u *,	sockaddr_u *,
+					  struct restrict_4 *);
+static	void	sockaddrs_from_struct_restrict_6(sockaddr_u *,	sockaddr_u *,
+					  struct restrict_6 *);
+static	void	send_restrict_entry(struct restrict_info *, sockaddr_u *,
+					  sockaddr_u *, u_int);
+static	void	send_restrict4_entry(struct restrict_4 *, u_int);
+static	void	send_restrict6_entry(struct restrict_6 *, u_int);
+static	void	send_restrict4_list(struct restrict_4 *, u_int *);
+static	void	send_restrict6_list(struct restrict_6 *, u_int *);
 static	void	read_addr_restrictions(struct recvbuf *);
 static	void	read_ordlist	(struct recvbuf *, int);
 static	u_int32	derive_nonce	(sockaddr_u *, u_int32, u_int32);
@@ -4372,30 +4378,36 @@ read_ifstats(
 }
 
 static void
-sockaddrs_from_restrict_u(
+sockaddrs_from_struct_restrict_4(
 	sockaddr_u *	psaA,
 	sockaddr_u *	psaM,
-	restrict_u *	pres,
-	int		ipv6
+	struct restrict_4 *	pres
 	)
 {
 	ZERO(*psaA);
 	ZERO(*psaM);
-	if (!ipv6) {
-		psaA->sa.sa_family = AF_INET;
-		psaA->sa4.sin_addr.s_addr = htonl(pres->u.v4.addr);
-		psaM->sa.sa_family = AF_INET;
-		psaM->sa4.sin_addr.s_addr = htonl(pres->u.v4.mask);
-	} else {
-		psaA->sa.sa_family = AF_INET6;
-		memcpy(&psaA->sa6.sin6_addr, &pres->u.v6.addr,
-		       sizeof(psaA->sa6.sin6_addr));
-		psaM->sa.sa_family = AF_INET6;
-		memcpy(&psaM->sa6.sin6_addr, &pres->u.v6.mask,
-		       sizeof(psaA->sa6.sin6_addr));
-	}
+	psaA->sa.sa_family = AF_INET;
+	psaA->sa4.sin_addr.s_addr = htonl(pres->v4.addr);
+	psaM->sa.sa_family = AF_INET;
+	psaM->sa4.sin_addr.s_addr = htonl(pres->v4.mask);
 }
 
+static void
+sockaddrs_from_struct_restrict_6(
+	sockaddr_u *	psaA,
+	sockaddr_u *	psaM,
+	struct restrict_6 *	pres
+	)
+{
+	ZERO(*psaA);
+	ZERO(*psaM);
+	psaA->sa.sa_family = AF_INET6;
+	memcpy(&psaA->sa6.sin6_addr, &pres->v6.addr,
+	       sizeof(psaA->sa6.sin6_addr));
+	psaM->sa.sa_family = AF_INET6;
+	memcpy(&psaM->sa6.sin6_addr, &pres->v6.mask,
+	       sizeof(psaA->sa6.sin6_addr));
+}
 
 /*
  * Send a restrict entry in response to a "ntpq -c reslist" request.
@@ -4407,8 +4419,9 @@ sockaddrs_from_restrict_u(
  */
 static void
 send_restrict_entry(
-	restrict_u *	pres,
-	int		ipv6,
+	struct restrict_info *ri,
+	sockaddr_u *addr,
+	sockaddr_u *mask,
 	u_int		idx
 	)
 {
@@ -4422,14 +4435,11 @@ send_restrict_entry(
 	u_int32		noise;
 	u_int		which;
 	u_int		remaining;
-	sockaddr_u	addr;
-	sockaddr_u	mask;
 	const char *	pch;
 	char *		buf;
 	const char *	match_str;
 	const char *	access_str;
 
-	sockaddrs_from_restrict_u(&addr, &mask, pres, ipv6);
 	remaining = COUNTOF(sent);
 	ZERO(sent);
 	noise = 0;
@@ -4451,25 +4461,25 @@ send_restrict_entry(
 
 		case 0:
 			snprintf(tag, sizeof(tag), addr_fmtu, idx);
-			pch = stoa(&addr);
+			pch = stoa(addr);
 			ctl_putunqstr(tag, pch, strlen(pch));
 			break;
 
 		case 1:
 			snprintf(tag, sizeof(tag), mask_fmtu, idx);
-			pch = stoa(&mask);
+			pch = stoa(mask);
 			ctl_putunqstr(tag, pch, strlen(pch));
 			break;
 
 		case 2:
 			snprintf(tag, sizeof(tag), hits_fmt, idx);
-			ctl_putuint(tag, pres->count);
+			ctl_putuint(tag, ri->count);
 			break;
 
 		case 3:
 			snprintf(tag, sizeof(tag), flags_fmt, idx);
-			match_str = res_match_flags(pres->mflags);
-			access_str = res_access_flags(pres->rflags);
+			match_str = res_match_flags(ri->mflags);
+			access_str = res_access_flags(ri->rflags);
 			if ('\0' == match_str[0]) {
 				pch = access_str;
 			} else {
@@ -4487,20 +4497,51 @@ send_restrict_entry(
 	send_random_tag_value((int)idx);
 }
 
+static void
+send_restrict4_entry(
+	struct restrict_4 *	pres,
+	u_int 		pidx)
+{
+	sockaddr_u	addr;
+	sockaddr_u	mask;
+	sockaddrs_from_struct_restrict_4(&addr, &mask, pres);
+	send_restrict_entry(&pres->ri, &addr, &mask, pidx);
+}
+
+static void
+send_restrict6_entry(
+	struct restrict_6 *	pres,
+	u_int 		pidx)
+{
+	sockaddr_u	addr;
+	sockaddr_u	mask;
+	sockaddrs_from_struct_restrict_6(&addr, &mask, pres);
+	send_restrict_entry(&pres->ri, &addr, &mask, pidx);
+}
 
 static void
-send_restrict_list(
-	restrict_u *	pres,
-	int		ipv6,
+send_restrict4_list(
+	struct restrict_4 *	pres,
 	u_int *		pidx
 	)
 {
 	for ( ; pres != NULL; pres = pres->link) {
-		send_restrict_entry(pres, ipv6, *pidx);
+		send_restrict4_entry(pres, *pidx);
 		(*pidx)++;
 	}
 }
 
+static void
+send_restrict6_list(
+	struct restrict_6 *	pres,
+	u_int *		pidx
+	)
+{
+	for ( ; pres != NULL; pres = pres->link) {
+		send_restrict6_entry(pres, *pidx);
+		(*pidx)++;
+	}
+}
 
 /*
  * read_addr_restrictions - returns IPv4 and IPv6 access control lists
@@ -4513,8 +4554,8 @@ read_addr_restrictions(
 	u_int idx;
 
 	idx = 0;
-	send_restrict_list(restrictlist4, FALSE, &idx);
-	send_restrict_list(restrictlist6, TRUE, &idx);
+	send_restrict4_list(restrictlist4, &idx);
+	send_restrict6_list(restrictlist6, &idx);
 	ctl_flushpkt(0);
 }
 

Index: src/external/bsd/ntp/dist/ntpd/ntp_request.c
diff -u src/external/bsd/ntp/dist/ntpd/ntp_request.c:1.19 src/external/bsd/ntp/dist/ntpd/ntp_request.c:1.20
--- src/external/bsd/ntp/dist/ntpd/ntp_request.c:1.19	Sun Aug 18 16:47:18 2024
+++ src/external/bsd/ntp/dist/ntpd/ntp_request.c	Tue Oct  1 16:59:51 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: ntp_request.c,v 1.19 2024/08/18 20:47:18 christos Exp $	*/
+/*	$NetBSD: ntp_request.c,v 1.20 2024/10/01 20:59:51 christos Exp $	*/
 
 /*
  * ntp_request.c - respond to information requests
@@ -83,8 +83,8 @@ static	void	do_unconf	(sockaddr_u *, end
 static	void	set_sys_flag	(sockaddr_u *, endpt *, struct req_pkt *);
 static	void	clr_sys_flag	(sockaddr_u *, endpt *, struct req_pkt *);
 static	void	setclr_flags	(sockaddr_u *, endpt *, struct req_pkt *, u_long);
-static	void	list_restrict4	(const restrict_u *, struct info_restrict **);
-static	void	list_restrict6	(const restrict_u *, struct info_restrict **);
+static	void	list_restrict4	(const struct restrict_4 *, struct info_restrict **);
+static	void	list_restrict6	(const struct restrict_6 *, struct info_restrict **);
 static	void	list_restrict	(sockaddr_u *, endpt *, struct req_pkt *);
 static	void	do_resaddflags	(sockaddr_u *, endpt *, struct req_pkt *);
 static	void	do_ressubflags	(sockaddr_u *, endpt *, struct req_pkt *);
@@ -1569,16 +1569,16 @@ setclr_flags(
  * To avoid this trouble the list reversal is done iteratively using a
  * scratch pad.
  */
-typedef struct RestrictStack RestrictStackT;
-struct RestrictStack {
-	RestrictStackT   *link;
+typedef struct RestrictStack4 RestrictStack4T;
+struct RestrictStack4 {
+	RestrictStack4T   *link;
 	size_t            fcnt;
-	const restrict_u *pres[63];
+	const struct restrict_4 *pres[63];
 };
 
 static size_t
-getStackSheetSize(
-	RestrictStackT *sp
+getStackSheetSize4(
+	RestrictStack4T *sp
 	)
 {
 	if (sp)
@@ -1587,18 +1587,18 @@ getStackSheetSize(
 }
 
 static int/*BOOL*/
-pushRestriction(
-	RestrictStackT  **spp,
-	const restrict_u *ptr
+pushRestriction4(
+	RestrictStack4T  **spp,
+	const struct restrict_4 *ptr
 	)
 {
-	RestrictStackT *sp;
+	RestrictStack4T *sp;
 
 	if (NULL == (sp = *spp) || 0 == sp->fcnt) {
 		/* need another sheet in the scratch pad */
 		sp = emalloc(sizeof(*sp));
 		sp->link = *spp;
-		sp->fcnt = getStackSheetSize(sp);
+		sp->fcnt = getStackSheetSize4(sp);
 		*spp = sp;
 	}
 	sp->pres[--sp->fcnt] = ptr;
@@ -1606,18 +1606,18 @@ pushRestriction(
 }
 
 static int/*BOOL*/
-popRestriction(
-	RestrictStackT   **spp,
-	const restrict_u **opp
+popRestriction4(
+	RestrictStack4T   **spp,
+	const struct restrict_4 **opp
 	)
 {
-	RestrictStackT *sp;
+	RestrictStack4T *sp;
 
-	if (NULL == (sp = *spp) || sp->fcnt >= getStackSheetSize(sp))
+	if (NULL == (sp = *spp) || sp->fcnt >= getStackSheetSize4(sp))
 		return FALSE;
 	
 	*opp = sp->pres[sp->fcnt++];
-	if (sp->fcnt >= getStackSheetSize(sp)) {
+	if (sp->fcnt >= getStackSheetSize4(sp)) {
 		/* discard sheet from scratch pad */
 		*spp = sp->link;
 		free(sp);
@@ -1626,11 +1626,11 @@ popRestriction(
 }
 
 static void
-flushRestrictionStack(
-	RestrictStackT **spp
+flushRestrictionStack4(
+	RestrictStack4T **spp
 	)
 {
-	RestrictStackT *sp;
+	RestrictStack4T *sp;
 
 	while (NULL != (sp = *spp)) {
 		*spp = sp->link;
@@ -1644,60 +1644,129 @@ flushRestrictionStack(
  */
 static void
 list_restrict4(
-	const restrict_u *	res,
+	const struct restrict_4 *	res,
 	struct info_restrict **	ppir
 	)
 {
-	RestrictStackT *	rpad;
+	RestrictStack4T *	rpad;
 	struct info_restrict *	pir;
 
 	pir = *ppir;
 	for (rpad = NULL; res; res = res->link)
-		if (!pushRestriction(&rpad, res))
+		if (!pushRestriction4(&rpad, res))
 			break;
 	
-	while (pir && popRestriction(&rpad, &res)) {
-		pir->addr = htonl(res->u.v4.addr);
+	while (pir && popRestriction4(&rpad, &res)) {
+		pir->addr = htonl(res->v4.addr);
 		if (client_v6_capable) 
 			pir->v6_flag = 0;
-		pir->mask = htonl(res->u.v4.mask);
-		pir->count = htonl(res->count);
-		pir->rflags = htons(res->rflags);
-		pir->mflags = htons(res->mflags);
+		pir->mask = htonl(res->v4.mask);
+		pir->count = htonl(res->ri.count);
+		pir->rflags = htons(res->ri.rflags);
+		pir->mflags = htons(res->ri.mflags);
 		pir = (struct info_restrict *)more_pkt();
 	}
-	flushRestrictionStack(&rpad);
+	flushRestrictionStack4(&rpad);
 	*ppir = pir;
 }
 
+typedef struct RestrictStack6 RestrictStack6T;
+struct RestrictStack6 {
+	RestrictStack6T   *link;
+	size_t            fcnt;
+	const struct restrict_6 *pres[63];
+};
+
+static size_t
+getStackSheetSize6(
+	RestrictStack6T *sp
+	)
+{
+	if (sp)
+		return sizeof(sp->pres)/sizeof(sp->pres[0]);
+	return 0u;
+}
+
+static int/*BOOL*/
+pushRestriction6(
+	RestrictStack6T  **spp,
+	const struct restrict_6 *ptr
+	)
+{
+	RestrictStack6T *sp;
+
+	if (NULL == (sp = *spp) || 0 == sp->fcnt) {
+		/* need another sheet in the scratch pad */
+		sp = emalloc(sizeof(*sp));
+		sp->link = *spp;
+		sp->fcnt = getStackSheetSize6(sp);
+		*spp = sp;
+	}
+	sp->pres[--sp->fcnt] = ptr;
+	return TRUE;
+}
+
+static int/*BOOL*/
+popRestriction6(
+	RestrictStack6T   **spp,
+	const struct restrict_6 **opp
+	)
+{
+	RestrictStack6T *sp;
+
+	if (NULL == (sp = *spp) || sp->fcnt >= getStackSheetSize6(sp))
+		return FALSE;
+	
+	*opp = sp->pres[sp->fcnt++];
+	if (sp->fcnt >= getStackSheetSize6(sp)) {
+		/* discard sheet from scratch pad */
+		*spp = sp->link;
+		free(sp);
+	}
+	return TRUE;
+}
+
+static void
+flushRestrictionStack6(
+	RestrictStack6T **spp
+	)
+{
+	RestrictStack6T *sp;
+
+	while (NULL != (sp = *spp)) {
+		*spp = sp->link;
+		free(sp);
+	}
+}
+
 /*
  * list_restrict6 - iterative helper for list_restrict dumps IPv6
  *		    restriction list in reverse order.
  */
 static void
 list_restrict6(
-	const restrict_u *	res,
+	const struct restrict_6 *	res,
 	struct info_restrict **	ppir
 	)
 {
-	RestrictStackT *	rpad;
+	RestrictStack6T *	rpad;
 	struct info_restrict *	pir;
 
 	pir = *ppir;
 	for (rpad = NULL; res; res = res->link)
-		if (!pushRestriction(&rpad, res))
+		if (!pushRestriction6(&rpad, res))
 			break;
 
-	while (pir && popRestriction(&rpad, &res)) {
-		pir->addr6 = res->u.v6.addr; 
-		pir->mask6 = res->u.v6.mask;
+	while (pir && popRestriction6(&rpad, &res)) {
+		pir->addr6 = res->v6.addr; 
+		pir->mask6 = res->v6.mask;
 		pir->v6_flag = 1;
-		pir->count = htonl(res->count);
-		pir->rflags = htons(res->rflags);
-		pir->mflags = htons(res->mflags);
+		pir->count = htonl(res->ri.count);
+		pir->rflags = htons(res->ri.rflags);
+		pir->mflags = htons(res->ri.mflags);
 		pir = (struct info_restrict *)more_pkt();
 	}
-	flushRestrictionStack(&rpad);
+	flushRestrictionStack6(&rpad);
 	*ppir = pir;
 }
 

Index: src/external/bsd/ntp/dist/ntpd/ntp_restrict.c
diff -u src/external/bsd/ntp/dist/ntpd/ntp_restrict.c:1.12 src/external/bsd/ntp/dist/ntpd/ntp_restrict.c:1.13
--- src/external/bsd/ntp/dist/ntpd/ntp_restrict.c:1.12	Sun Aug 18 16:47:18 2024
+++ src/external/bsd/ntp/dist/ntpd/ntp_restrict.c	Tue Oct  1 16:59:51 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: ntp_restrict.c,v 1.12 2024/08/18 20:47:18 christos Exp $	*/
+/*	$NetBSD: ntp_restrict.c,v 1.13 2024/10/01 20:59:51 christos Exp $	*/
 
 /*
  * ntp_restrict.c - determine host restrictions
@@ -45,22 +45,22 @@
  * Auto-tune these to be just less than 1KB (leaving at least 32 bytes
  * for allocator overhead).
  */
-#define	INC_RESLIST4	((1024 - 32) / V4_SIZEOF_RESTRICT_U)
-#define	INC_RESLIST6	((1024 - 32) / V6_SIZEOF_RESTRICT_U)
+#define	INC_RESLIST4	((1024 - 32) / sizeof(struct restrict_4))
+#define	INC_RESLIST6	((1024 - 32) / sizeof(struct restrict_6))
 
 /*
  * The restriction list
  */
-restrict_u *restrictlist4;
-restrict_u *restrictlist6;
-static int restrictcount;	/* count in the restrict lists */
+struct restrict_4 *restrictlist4;
+struct restrict_6 *restrictlist6;
+static size_t restrictcount;	/* count in the restrict lists */
 
 /*
  * The free list and associated counters.  Also some uninteresting
  * stat counters.
  */
-static restrict_u *resfree4;	/* available entries (free list) */
-static restrict_u *resfree6;
+static struct restrict_4 *resfree4;	/* available entries (free list) */
+static struct restrict_6 *resfree6;
 
 static u_long res_calls;
 static u_long res_found;
@@ -77,8 +77,8 @@ static	u_long res_limited_refcnt;
  *
  * We can make this cleaner with c99 support: see init_restrict().
  */
-static	restrict_u	restrict_def4;
-static	restrict_u	restrict_def6;
+static	struct restrict_4	restrict_def4;
+static	struct restrict_6	restrict_def6;
 
 /*
  * "restrict source ..." enabled knob and restriction bits.
@@ -91,59 +91,69 @@ static	short		restrict_source_ippeerlimi
 /*
  * private functions
  */
-static	restrict_u *	alloc_res4(void);
-static	restrict_u *	alloc_res6(void);
-static	void		free_res(restrict_u *, int);
+static	struct restrict_4 *	alloc_res4(void);
+static	struct restrict_6 *	alloc_res6(void);
+static	void		free_res4(struct restrict_4 *);
+static	void		free_res6(struct restrict_6 *);
 static	inline void	inc_res_limited(void);
 static	inline void	dec_res_limited(void);
-static	restrict_u *	match_restrict4_addr(u_int32, u_short);
-static	restrict_u *	match_restrict6_addr(const struct in6_addr *,
+static	struct restrict_4 *	match_restrict4_addr(u_int32, u_short);
+static	struct restrict_6 *	match_restrict6_addr(const struct in6_addr *,
 					     u_short);
-static	restrict_u *	match_restrict_entry(const restrict_u *, int);
 static inline int/*BOOL*/	mflags_sorts_before(u_short, u_short);
-static	int/*BOOL*/	res_sorts_before4(restrict_u *, restrict_u *);
-static	int/*BOOL*/	res_sorts_before6(restrict_u *, restrict_u *);
+static	int/*BOOL*/	res_sorts_before4(struct restrict_4 *, 
+					struct restrict_4 *);
+static	int/*BOOL*/	res_sorts_before6(struct restrict_6 *, 
+					struct restrict_6 *);
 
-typedef int (*res_sort_fn)(restrict_u *, restrict_u *);
-
-
-/* dump_restrict() & dump_restricts() are DEBUG-only */
 #ifdef DEBUG	
-static void		dump_restrict(restrict_u *, int);
+/* dump_restrict() & dump_restricts() are DEBUG-only */
 
+static void
+dump_restrict(const struct restrict_info *ri, const char *as, const char *ms)
+{
+	printf("%s/%s: hits %u ippeerlimit %hd mflags %s rflags %s",
+		as, ms, ri->count, ri->ippeerlimit,
+		mflags_str(ri->mflags),
+		rflags_str(ri->rflags));
+	if (ri->expire > 0) {
+		printf(" expire %u\n", ri->expire);
+	} else {
+		printf("\n");
+	}
+}
 
 /*
  * dump_restrict - spit out a single restriction entry
  */
 static void
-dump_restrict(
-	restrict_u *	res,
-	int		is_ipv6
-)
+dump_restrict4(
+	struct restrict_4 *	res)
 {
 	char as[INET6_ADDRSTRLEN];
 	char ms[INET6_ADDRSTRLEN];
 
-	if (is_ipv6) {
-		inet_ntop(AF_INET6, &res->u.v6.addr, as, sizeof as);
-		inet_ntop(AF_INET6, &res->u.v6.mask, ms, sizeof ms);
-	} else {
-		struct in_addr	sia, sim;
+	struct in_addr	sia, sim;
 
-		sia.s_addr = htonl(res->u.v4.addr);
-		sim.s_addr = htonl(res->u.v4.addr);
-		inet_ntop(AF_INET, &sia, as, sizeof as);
-		inet_ntop(AF_INET, &sim, ms, sizeof ms);
-	}
-	printf("%s/%s: hits %u ippeerlimit %hd mflags %s rflags %s",
-		as, ms, res->count, res->ippeerlimit,
-		mflags_str(res->mflags),
-		rflags_str(res->rflags));
-	if (res->expire > 0) {
-		printf(" expire %u\n", res->expire);
-	} else {
-		printf("\n");
-	}
+	sia.s_addr = htonl(res->v4.addr);
+	sim.s_addr = htonl(res->v4.addr);
+	inet_ntop(AF_INET, &sia, as, sizeof as);
+	inet_ntop(AF_INET, &sim, ms, sizeof ms);
+
+	dump_restrict(&res->ri, as, ms);
+}
+
+static void
+dump_restrict6(
+	struct restrict_6 *	res)
+{
+	char as[INET6_ADDRSTRLEN];
+	char ms[INET6_ADDRSTRLEN];
+
+	inet_ntop(AF_INET6, &res->v6.addr, as, sizeof as);
+	inet_ntop(AF_INET6, &res->v6.mask, ms, sizeof ms);
+
+	dump_restrict(&res->ri, as, ms);
 }
 
 
@@ -153,18 +163,19 @@ dump_restrict(
 void
 dump_restricts(void)
 {
-	restrict_u *	res;
+	struct restrict_4 *	res4;
+	struct restrict_6 *	res6;
 
 	/* Spit out the IPv4 list */
 	printf("dump_restricts: restrictlist4: %p\n", restrictlist4);
-	for (res = restrictlist4; res != NULL; res = res->link) {
-		dump_restrict(res, 0);
+	for (res4 = restrictlist4; res4 != NULL; res4 = res4->link) {
+		dump_restrict4(res4);
 	}
 
 	/* Spit out the IPv6 list */
 	printf("dump_restricts: restrictlist6: %p\n", restrictlist6);
-	for (res = restrictlist6; res != NULL; res = res->link) {
-		dump_restrict(res, 1);
+	for (res6 = restrictlist6; res6 != NULL; res6 = res6->link) {
+		dump_restrict6(res6);
 	}
 }
 #endif /* DEBUG - dump_restrict() / dump_restricts() */
@@ -214,8 +225,8 @@ init_restrict(void)
 	 * remaining.
 	 */
 
-	restrict_def4.ippeerlimit = -1;		/* Cleaner if we have C99 */
-	restrict_def6.ippeerlimit = -1;		/* Cleaner if we have C99 */
+	restrict_def4.ri.ippeerlimit = -1;	/* Cleaner if we have C99 */
+	restrict_def6.ri.ippeerlimit = -1;	/* Cleaner if we have C99 */
 
 	LINK_SLIST(restrictlist4, &restrict_def4, link);
 	LINK_SLIST(restrictlist6, &restrict_def6, link);
@@ -223,13 +234,13 @@ init_restrict(void)
 }
 
 
-static restrict_u *
+static struct restrict_4 *
 alloc_res4(void)
 {
-	const size_t	cb = V4_SIZEOF_RESTRICT_U;
 	const size_t	count = INC_RESLIST4;
-	restrict_u*	rl;
-	restrict_u*	res;
+	struct restrict_4*	rl;
+	struct restrict_4*	res;
+	const size_t	cb = sizeof(*rl);
 	size_t		i;
 
 	UNLINK_HEAD_SLIST(res, resfree4, link);
@@ -249,13 +260,13 @@ alloc_res4(void)
 }
 
 
-static restrict_u *
+static struct restrict_6 *
 alloc_res6(void)
 {
-	const size_t	cb = V6_SIZEOF_RESTRICT_U;
 	const size_t	count = INC_RESLIST6;
-	restrict_u *	rl;
-	restrict_u *	res;
+	struct restrict_6 *	rl;
+	struct restrict_6 *	res;
+	const size_t	cb = sizeof(*rl);
 	size_t		i;
 
 	UNLINK_HEAD_SLIST(res, resfree6, link);
@@ -276,35 +287,34 @@ alloc_res6(void)
 
 
 static void
-free_res(
-	restrict_u *	res,
-	int		v6
-	)
+free_res6(struct restrict_6 *	res)
 {
-	restrict_u **	rlisthead_ptr;
-	restrict_u **	flisthead_ptr;
-	restrict_u *	unlinked;
-	size_t		sz;
+	struct restrict_6 *	unlinked;
 
 	restrictcount--;
-	if (RES_LIMITED & res->rflags) {
+	if (RES_LIMITED & res->ri.rflags) {
 		dec_res_limited();
 	}
-	if (v6) {
-		rlisthead_ptr = &restrictlist6;
-		flisthead_ptr = &resfree6;
-		sz = V6_SIZEOF_RESTRICT_U;
-	} else {
-		rlisthead_ptr = &restrictlist4;
-		flisthead_ptr = &resfree4;
-		sz = V4_SIZEOF_RESTRICT_U;
-	}
-	UNLINK_SLIST(unlinked, *rlisthead_ptr, res, link, restrict_u);
+	UNLINK_SLIST(unlinked, restrictlist6, res, link, struct restrict_6);
 	INSIST(unlinked == res);
-	zero_mem(res, sz);
-	LINK_SLIST(*flisthead_ptr, res, link);
+	zero_mem(res, sizeof(*res));
+	LINK_SLIST(resfree6, res, link);
 }
 
+static void
+free_res4(struct restrict_4 *	res)
+{
+	struct restrict_4 *	unlinked;
+
+	restrictcount--;
+	if (RES_LIMITED & res->ri.rflags) {
+		dec_res_limited();
+	}
+	UNLINK_SLIST(unlinked, restrictlist4, res, link, struct restrict_4);
+	INSIST(unlinked == res);
+	zero_mem(res, sizeof(*res));
+	LINK_SLIST(resfree4, res, link);
+}
 
 static inline void
 inc_res_limited(void)
@@ -326,23 +336,22 @@ dec_res_limited(void)
 }
 
 
-static restrict_u *
+static struct restrict_4 *
 match_restrict4_addr(
 	u_int32	addr,
 	u_short	port
 	)
 {
-	const int	v6 = FALSE;
-	restrict_u *	res;
-	restrict_u *	next;
+	struct restrict_4 *	res;
+	struct restrict_4 *	next;
 
 	for (res = restrictlist4; res != NULL; res = next) {
 		next = res->link;
-		if (res->expire && res->expire <= current_time) {
-			free_res(res, v6);	/* zeroes the contents */
+		if (res->ri.expire && res->ri.expire <= current_time) {
+			free_res4(res);	/* zeroes the contents */
 		}
-		if (   res->u.v4.addr == (addr & res->u.v4.mask)
-		    && (   !(RESM_NTPONLY & res->mflags)
+		if (   res->v4.addr == (addr & res->v4.mask)
+		    && (   !(RESM_NTPONLY & res->ri.mflags)
 			|| NTP_PORT == port)) {
 
 			break;
@@ -352,25 +361,24 @@ match_restrict4_addr(
 }
 
 
-static restrict_u *
+static struct restrict_6 *
 match_restrict6_addr(
 	const struct in6_addr *	addr,
 	u_short			port
 	)
 {
-	const int	v6 = TRUE;
-	restrict_u *	res;
-	restrict_u *	next;
+	struct restrict_6 *	res;
+	struct restrict_6 *	next;
 	struct in6_addr	masked;
 
 	for (res = restrictlist6; res != NULL; res = next) {
 		next = res->link;
-		if (res->expire && res->expire <= current_time) {
-			free_res(res, v6);
+		if (res->ri.expire && res->ri.expire <= current_time) {
+			free_res6(res);
 		}
-		MASK_IPV6_ADDR(&masked, addr, &res->u.v6.mask);
-		if (ADDR6_EQ(&masked, &res->u.v6.addr)
-		    && (   !(RESM_NTPONLY & res->mflags)
+		MASK_IPV6_ADDR(&masked, addr, &res->v6.mask);
+		if (ADDR6_EQ(&masked, &res->v6.addr)
+		    && (   !(RESM_NTPONLY & res->ri.mflags)
 			|| NTP_PORT == (int)port)) {
 
 			break;
@@ -385,37 +393,39 @@ match_restrict6_addr(
  *
  * Exact match is addr, mask, and mflags all equal.
  * In order to use more common code for IPv4 and IPv6, this routine
- * requires the caller to populate a restrict_u with mflags and either
+ * requires the caller to populate a restrict_[46] with mflags and either
  * the v4 or v6 address and mask as appropriate.  Other fields in the
  * input restrict_u are ignored.
  */
-static restrict_u *
-match_restrict_entry(
-	const restrict_u *	pmatch,
-	int			v6
-	)
+static struct restrict_4 *
+match_restrict4_entry(
+	const struct restrict_4 *	pmatch)
 {
-	restrict_u *res;
-	restrict_u *rlist;
-	size_t cb;
-
-	if (v6) {
-		rlist = restrictlist6;
-		cb = sizeof(pmatch->u.v6);
-	} else {
-		rlist = restrictlist4;
-		cb = sizeof(pmatch->u.v4);
-	}
+	struct restrict_4 *res;
 
-	for (res = rlist; res != NULL; res = res->link) {
-		if (res->mflags == pmatch->mflags &&
-		    !memcmp(&res->u, &pmatch->u, cb)) {
+	for (res = restrictlist4; res != NULL; res = res->link) {
+		if (res->ri.mflags == pmatch->ri.mflags &&
+		    !memcmp(&res->v4, &pmatch->v4, sizeof(res->v4))) {
 			break;
 		}
 	}
 	return res;
 }
 
+static struct restrict_6 *
+match_restrict6_entry(
+	const struct restrict_6 *	pmatch)
+{
+	struct restrict_6 *res;
+
+	for (res = restrictlist6; res != NULL; res = res->link) {
+		if (res->ri.mflags == pmatch->ri.mflags &&
+		    !memcmp(&res->v6, &pmatch->v6, sizeof(res->v6))) {
+			break;
+		}
+	}
+	return res;
+}
 
 /*
  * mflags_sorts_before - common mflags sorting code
@@ -449,22 +459,22 @@ mflags_sorts_before(
  */
 static int/*BOOL*/
 res_sorts_before4(
-	restrict_u *r1,
-	restrict_u *r2
+	struct restrict_4 *r1,
+	struct restrict_4 *r2
 	)
 {
 	int r1_before_r2;
 
-	if (r1->u.v4.addr > r2->u.v4.addr) {
+	if (r1->v4.addr > r2->v4.addr) {
 		r1_before_r2 = TRUE;
-	} else if (r1->u.v4.addr < r2->u.v4.addr) {
+	} else if (r1->v4.addr < r2->v4.addr) {
 		r1_before_r2 = FALSE;
-	} else if (r1->u.v4.mask > r2->u.v4.mask) {
+	} else if (r1->v4.mask > r2->v4.mask) {
 		r1_before_r2 = TRUE;
-	} else if (r1->u.v4.mask < r2->u.v4.mask) {
+	} else if (r1->v4.mask < r2->v4.mask) {
 		r1_before_r2 = FALSE;
 	} else {
-		r1_before_r2 = mflags_sorts_before(r1->mflags, r2->mflags);
+		r1_before_r2 = mflags_sorts_before(r1->ri.mflags, r2->ri.mflags);
 	}
 
 	return r1_before_r2;
@@ -480,27 +490,27 @@ res_sorts_before4(
  */
 static int/*BOOL*/
 res_sorts_before6(
-	restrict_u* r1,
-	restrict_u* r2
+	struct restrict_6* r1,
+	struct restrict_6* r2
 )
 {
 	int r1_before_r2;
 	int cmp;
 
-	cmp = ADDR6_CMP(&r1->u.v6.addr, &r2->u.v6.addr);
+	cmp = ADDR6_CMP(&r1->v6.addr, &r2->v6.addr);
 	if (cmp > 0) {		/* r1->addr > r2->addr */
 		r1_before_r2 = TRUE;
 	} else if (cmp < 0) {	/* r2->addr > r1->addr */
 		r1_before_r2 = FALSE;
 	} else {
-		cmp = ADDR6_CMP(&r1->u.v6.mask, &r2->u.v6.mask);
+		cmp = ADDR6_CMP(&r1->v6.mask, &r2->v6.mask);
 		if (cmp > 0) {		/* r1->mask > r2->mask*/
 			r1_before_r2 = TRUE;
 		} else if (cmp < 0) {	/* r2->mask > r1->mask */
 			r1_before_r2 = FALSE;
 		} else {
-			r1_before_r2 = mflags_sorts_before(r1->mflags,
-							   r2->mflags);
+			r1_before_r2 = mflags_sorts_before(r1->ri.mflags,
+							   r2->ri.mflags);
 		}
 	}
 
@@ -517,7 +527,6 @@ restrictions(
 	r4addr *r4a
 	)
 {
-	restrict_u *match;
 	struct in6_addr *pin6;
 
 	DEBUG_REQUIRE(NULL != r4a);
@@ -525,6 +534,7 @@ restrictions(
 	res_calls++;
 
 	if (IS_IPV4(srcadr)) {
+		struct restrict_4 *match;
 		/*
 		 * Ignore any packets with a multicast source address
 		 * (this should be done early in the receive process,
@@ -537,7 +547,7 @@ restrictions(
 		match = match_restrict4_addr(SRCADR(srcadr),
 					     SRCPORT(srcadr));
 		DEBUG_INSIST(match != NULL);
-		match->count++;
+		match->ri.count++;
 		/*
 		 * res_not_found counts only use of the final default
 		 * entry, not any "restrict default ntpport ...", which
@@ -547,9 +557,10 @@ restrictions(
 			res_not_found++;
 		else
 			res_found++;
-		r4a->rflags = match->rflags;
-		r4a->ippeerlimit = match->ippeerlimit;
+		r4a->rflags = match->ri.rflags;
+		r4a->ippeerlimit = match->ri.ippeerlimit;
 	} else {
+		struct restrict_6 *match;
 		DEBUG_REQUIRE(IS_IPV6(srcadr));
 
 		pin6 = PSOCK_ADDR6(srcadr);
@@ -564,13 +575,13 @@ restrictions(
 		}
 		match = match_restrict6_addr(pin6, SRCPORT(srcadr));
 		DEBUG_INSIST(match != NULL);
-		match->count++;
+		match->ri.count++;
 		if (&restrict_def6 == match)
 			res_not_found++;
 		else
 			res_found++;
-		r4a->rflags = match->rflags;
-		r4a->ippeerlimit = match->ippeerlimit;
+		r4a->rflags = match->ri.rflags;
+		r4a->ippeerlimit = match->ri.ippeerlimit;
 	}
 
 	return;
@@ -612,12 +623,10 @@ hack_restrict(
 	u_int32		expire
 	)
 {
-	int		v6;
 	int		bump_res_limited = FALSE;
-	restrict_u	match;
-	restrict_u *	res;
-	restrict_u **	plisthead;
-	res_sort_fn	pfn_sort;
+	struct restrict_4	match4, *res4 = NULL;
+	struct restrict_6	match6, *res6 = NULL;
+	struct restrict_info *ri;
 
 #ifdef DEBUG
 	if (debug > 0) {
@@ -649,33 +658,36 @@ hack_restrict(
 		return TRUE;
 	}
 
-	ZERO(match);
 
 	if (IS_IPV4(resaddr)) {
 		DEBUG_INVARIANT(IS_IPV4(resmask));
-		v6 = FALSE;
 		/*
 		 * Get address and mask in host byte order for easy
 		 * comparison as u_int32
 		 */
-		match.u.v4.addr = SRCADR(resaddr);
-		match.u.v4.mask = SRCADR(resmask);
-		match.u.v4.addr &= match.u.v4.mask;
+		ZERO(match4);
+		match4.v4.addr = SRCADR(resaddr);
+		match4.v4.mask = SRCADR(resmask);
+		match4.v4.addr &= match4.v4.mask;
+		match4.ri.mflags = mflags;
+		res4 = match_restrict4_entry(&match4);
+		ri = res4 ? &res4->ri : NULL;
 	} else {
 		DEBUG_INVARIANT(IS_IPV6(resaddr));
 		DEBUG_INVARIANT(IS_IPV6(resmask));
-		v6 = TRUE;
 		/*
 		 * Get address and mask in network byte order for easy
 		 * comparison as byte sequences (e.g. memcmp())
 		 */
-		match.u.v6.mask = SOCK_ADDR6(resmask);
-		MASK_IPV6_ADDR(&match.u.v6.addr, PSOCK_ADDR6(resaddr),
-			       &match.u.v6.mask);
+		ZERO(match6);
+		match6.v6.mask = SOCK_ADDR6(resmask);
+		MASK_IPV6_ADDR(&match6.v6.addr, PSOCK_ADDR6(resaddr),
+			       &match6.v6.mask);
+		match6.ri.mflags = mflags;
+		res6 = match_restrict6_entry(&match6);
+		ri = res6 ? &res6->ri : NULL;
 	}
 
-	match.mflags = mflags;
-	res = match_restrict_entry(&match, v6);
 
 	switch (op) {
 
@@ -684,33 +696,36 @@ hack_restrict(
 		 * Here we add bits to the rflags. If we already have
 		 * this restriction modify it.
 		 */
-		if (NULL != res) {
+		if (NULL != ri) {
 			if (    (RES_LIMITED & rflags)
-			    && !(RES_LIMITED & res->rflags)) {
+			    && !(RES_LIMITED & ri->rflags)) {
 
 				bump_res_limited = TRUE;
 			}
-			res->rflags |= rflags;
-			res->expire = expire;
+			ri->rflags |= rflags;
+			ri->expire = expire;
 		} else {
-			match.rflags = rflags;
-			match.expire = expire;
-			match.ippeerlimit = ippeerlimit;
-			if (v6) {
-				res = alloc_res6();
-				memcpy(res, &match, V6_SIZEOF_RESTRICT_U);
-				plisthead = &restrictlist6;
-				pfn_sort = &res_sorts_before6;
+			if (IS_IPV4(resaddr)) {
+				match4.ri.rflags = rflags;
+				match4.ri.expire = expire;
+				match4.ri.ippeerlimit = ippeerlimit;
+				res4 = alloc_res4();
+				memcpy(res4, &match4, sizeof(*res4));
+				LINK_SORT_SLIST(
+				    restrictlist4, res4,
+				    res_sorts_before4(res4, L_S_S_CUR()),
+				    link, struct restrict_4);
 			} else {
-				res = alloc_res4();
-				memcpy(res, &match, V4_SIZEOF_RESTRICT_U);
-				plisthead = &restrictlist4;
-				pfn_sort = &res_sorts_before4;
+				match6.ri.rflags = rflags;
+				match6.ri.expire = expire;
+				match6.ri.ippeerlimit = ippeerlimit;
+				res6 = alloc_res6();
+				memcpy(res6, &match6, sizeof(*res6));
+				LINK_SORT_SLIST(
+				    restrictlist6, res6,
+				    res_sorts_before6(res6, L_S_S_CUR()),
+				    link, struct restrict_6);
 			}
-			LINK_SORT_SLIST(
-				*plisthead, res,
-				(*pfn_sort)(res, L_S_S_CUR()),
-				link, restrict_u);
 			restrictcount++;
 			if (RES_LIMITED & rflags) {
 				bump_res_limited = TRUE;
@@ -726,17 +741,17 @@ hack_restrict(
 		 * Remove some bits from the rflags. If we didn't
 		 * find this one, just return.
 		 */
-		if (NULL == res) {
+		if (NULL == ri) {
 			DPRINTF(1, ("No match for %s %s removing rflags %s\n",
 				    stoa(resaddr), stoa(resmask),
 				    rflags_str(rflags)));
 			return FALSE;
 		}
-		if (   (RES_LIMITED & res->rflags)
+		if (   (RES_LIMITED & ri->rflags)
 		    && (RES_LIMITED & rflags)) {
 			dec_res_limited();
 		}
-		res->rflags &= ~rflags;
+		ri->rflags &= ~rflags;
 		return TRUE;
 
 	case RESTRICT_REMOVE:
@@ -746,14 +761,17 @@ hack_restrict(
 		 * found one. Don't remove the default entry and
 		 * don't remove an interface entry unless asked.
 		 */
-		if (   res != NULL
+		if (   ri != NULL
 		    && (   RESTRICT_REMOVEIF == op
-			|| !(RESM_INTERFACE & res->mflags))
-		    && res != &restrict_def4
-		    && res != &restrict_def6) {
-
-			free_res(res, v6);
-			return TRUE;
+			|| !(RESM_INTERFACE & ri->mflags))) {
+			if (res4 && res4 != &restrict_def4) {
+				free_res4(res4);
+				return TRUE;
+			}
+			if (res6 && res6 != &restrict_def6) {
+				free_res6(res6);
+				return TRUE;
+			}
 		}
 		DPRINTF(1, ("No match removing %s %s restriction\n",
 			    stoa(resaddr), stoa(resmask)));

Reply via email to