Module Name:    src
Committed By:   yamaguchi
Date:           Wed Nov 25 10:30:51 UTC 2020

Modified Files:
        src/sys/net: if_sppp.h if_spppsubr.c if_spppvar.h

Log Message:
Add commands to refer params of control protocols in if_spppsubr.c

reviewed by knakahara@n.o.


To generate a diff of this commit:
cvs rdiff -u -r1.28 -r1.29 src/sys/net/if_sppp.h
cvs rdiff -u -r1.212 -r1.213 src/sys/net/if_spppsubr.c
cvs rdiff -u -r1.31 -r1.32 src/sys/net/if_spppvar.h

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

Modified files:

Index: src/sys/net/if_sppp.h
diff -u src/sys/net/if_sppp.h:1.28 src/sys/net/if_sppp.h:1.29
--- src/sys/net/if_sppp.h:1.28	Sun Sep  6 06:01:01 2015
+++ src/sys/net/if_sppp.h	Wed Nov 25 10:30:51 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_sppp.h,v 1.28 2015/09/06 06:01:01 dholland Exp $	*/
+/*	$NetBSD: if_sppp.h,v 1.29 2020/11/25 10:30:51 yamaguchi Exp $	*/
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -165,5 +165,72 @@ struct spppkeepalivesettings50 {
 
 /* 134 already used! */
 
+/* states are named and numbered according to RFC 1661 */
+#define SPPP_STATE_INITIAL	0
+#define SPPP_STATE_STARTING	1
+#define SPPP_STATE_CLOSED	2
+#define SPPP_STATE_STOPPED	3
+#define SPPP_STATE_CLOSING	4
+#define SPPP_STATE_STOPPING	5
+#define SPPP_STATE_REQ_SENT	6
+#define SPPP_STATE_ACK_RCVD	7
+#define SPPP_STATE_ACK_SENT	8
+#define SPPP_STATE_OPENED	9
+
+#define SPPP_LCP_OPT_MRU		__BIT(1)
+#define SPPP_LCP_OPT_ASYNC_MAP		__BIT(2)
+#define SPPP_LCP_OPT_AUTH_PROTO		__BIT(3)
+#define SPPP_LCP_OPT_QUAL_PROTO		__BIT(4)
+#define SPPP_LCP_OPT_MAGIC		__BIT(5)
+#define SPPP_LCP_OPT_RESERVED		__BIT(6)
+#define SPPP_LCP_OPT_PROTO_COMP		__BIT(7)
+#define SPPP_LCP_OPT_ADDR_COMP		__BIT(8)
+#define SPPP_LCP_OPT_FCS_ALTS		__BIT(9)
+#define SPPP_LCP_OPT_SELF_DESC_PAD	__BIT(10)
+#define SPPP_LCP_OPT_CALL_BACK		__BIT(13)
+#define SPPP_LCP_OPT_COMPOUND_FRMS	__BIT(15)
+#define SPPP_LCP_OPT_MP_MRRU		__BIT(17)
+#define SPPP_LCP_OPT_MP_SSNHF		__BIT(18)
+#define SPPP_LCP_OPT_MP_EID		__BIT(19)
+
+/* #define SPPP_OPT_ADDRESSES	__BIT(0) */
+#define SPPP_IPCP_OPT_COMPRESSION	__BIT(1)
+#define SPPP_IPCP_OPT_ADDRESS		__BIT(2)
+#define SPPP_IPCP_OPT_PRIMDNS		__BIT(3)
+#define SPPP_IPCP_OPT_SECDNS		__BIT(4)
+
+#define SPPP_IPV6CP_OPT_IFID		__BIT(1)
+#define SPPP_IPV6CP_OPT_COMPRESSION	__BIT(2)
+
+struct sppplcpstatus {
+	char	ifname[IFNAMSIZ];
+	int	state;
+	int	timeout;
+	u_long	opts;
+	u_long	magic;
+	u_long	mru;
+};
+
+#define SPPPGETLCPSTATUS	_IOWR('i', 135, struct sppplcpstatus)
+
+struct spppipcpstatus {
+	char		ifname[IFNAMSIZ];
+	int		state;
+	u_long		opts;
+	u_int32_t	myaddr;
+};
+
+#define SPPPGETIPCPSTATUS	_IOWR('i', 136, struct spppipcpstatus)
+
+struct spppipv6cpstatus {
+	char		ifname[IFNAMSIZ];
+	int		state;
+	u_long		opts;
+	u_int8_t	my_ifid[8];
+	u_int8_t	his_ifid[8];
+};
+
+#define SPPPGETIPV6CPSTATUS	_IOWR('i', 137, struct spppipv6cpstatus)
+
 #endif /* !_NET_IF_SPPP_H_ */
 

Index: src/sys/net/if_spppsubr.c
diff -u src/sys/net/if_spppsubr.c:1.212 src/sys/net/if_spppsubr.c:1.213
--- src/sys/net/if_spppsubr.c:1.212	Wed Nov 25 10:27:18 2020
+++ src/sys/net/if_spppsubr.c	Wed Nov 25 10:30:51 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_spppsubr.c,v 1.212 2020/11/25 10:27:18 yamaguchi Exp $	 */
+/*	$NetBSD: if_spppsubr.c,v 1.213 2020/11/25 10:30:51 yamaguchi Exp $	 */
 
 /*
  * Synchronous PPP/Cisco link level subroutines.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_spppsubr.c,v 1.212 2020/11/25 10:27:18 yamaguchi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_spppsubr.c,v 1.213 2020/11/25 10:30:51 yamaguchi Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_inet.h"
@@ -185,17 +185,18 @@ __KERNEL_RCSID(0, "$NetBSD: if_spppsubr.
 #define CISCO_ADDR_REPLY	1	/* Cisco address reply */
 #define CISCO_KEEPALIVE_REQ	2	/* Cisco keepalive request */
 
-/* states are named and numbered according to RFC 1661 */
-#define STATE_INITIAL	0
-#define STATE_STARTING	1
-#define STATE_CLOSED	2
-#define STATE_STOPPED	3
-#define STATE_CLOSING	4
-#define STATE_STOPPING	5
-#define STATE_REQ_SENT	6
-#define STATE_ACK_RCVD	7
-#define STATE_ACK_SENT	8
-#define STATE_OPENED	9
+enum {
+	STATE_INITIAL = SPPP_STATE_INITIAL,
+	STATE_STARTING = SPPP_STATE_STARTING,
+	STATE_CLOSED = SPPP_STATE_CLOSED,
+	STATE_STOPPED = SPPP_STATE_STOPPED,
+	STATE_CLOSING = SPPP_STATE_CLOSING,
+	STATE_STOPPING = SPPP_STATE_STOPPING,
+	STATE_REQ_SENT = SPPP_STATE_REQ_SENT,
+	STATE_ACK_RCVD = SPPP_STATE_ACK_RCVD,
+	STATE_ACK_SENT = SPPP_STATE_ACK_SENT,
+	STATE_OPENED = SPPP_STATE_OPENED,
+};
 
 enum cp_rcr_type {
 	CP_RCR_NONE = 0,	/* initial value */
@@ -1268,6 +1269,9 @@ sppp_ioctl(struct ifnet *ifp, u_long cmd
 	case __SPPPGETIDLETO50:
 	case __SPPPGETKEEPALIVE50:
 #endif /* COMPAT_50 || MODULAR */
+	case SPPPGETLCPSTATUS:
+	case SPPPGETIPCPSTATUS:
+	case SPPPGETIPV6CPSTATUS:
 		error = sppp_params(sp, cmd, data);
 		break;
 
@@ -2420,7 +2424,7 @@ sppp_lcp_init(struct sppp *sp)
 
 	sppp_cp_init(&lcp, sp);
 
-	sp->lcp.opts = (1 << LCP_OPT_MAGIC);
+	SET(sp->lcp.opts, SPPP_LCP_OPT_MAGIC);
 	sp->lcp.magic = 0;
 	sp->lcp.protos = 0;
 	sp->lcp.max_terminate = 2;
@@ -2537,7 +2541,7 @@ sppp_lcp_open(struct sppp *sp, void *xcp
 
 	if (sp->pp_if.if_mtu < PP_MTU) {
 		sp->lcp.mru = sp->pp_if.if_mtu;
-		sp->lcp.opts |= (1 << LCP_OPT_MRU);
+		SET(sp->lcp.opts, SPPP_LCP_OPT_MRU);
 	} else
 		sp->lcp.mru = PP_MTU;
 	sp->lcp.their_mru = PP_MTU;
@@ -2546,9 +2550,9 @@ sppp_lcp_open(struct sppp *sp, void *xcp
 	 * If we are authenticator, negotiate LCP_AUTH
 	 */
 	if (sp->hisauth.proto != 0)
-		sp->lcp.opts |= (1 << LCP_OPT_AUTH_PROTO);
+		SET(sp->lcp.opts, SPPP_LCP_OPT_AUTH_PROTO);
 	else
-		sp->lcp.opts &= ~(1 << LCP_OPT_AUTH_PROTO);
+		CLR(sp->lcp.opts, SPPP_LCP_OPT_AUTH_PROTO);
 	sp->pp_flags &= ~PP_NEEDAUTH;
 	sppp_open_event(sp, xcp);
 }
@@ -2925,7 +2929,7 @@ sppp_lcp_confrej(struct sppp *sp, struct
 		switch (p[0]) {
 		case LCP_OPT_MAGIC:
 			/* Magic number -- can't use it, use 0 */
-			sp->lcp.opts &= ~(1 << LCP_OPT_MAGIC);
+			CLR(sp->lcp.opts, SPPP_LCP_OPT_MAGIC);
 			sp->lcp.magic = 0;
 			break;
 		case LCP_OPT_MRU:
@@ -2940,7 +2944,7 @@ sppp_lcp_confrej(struct sppp *sp, struct
 				    "%ld bytes. Defaulting to %d bytes\n",
 				    ifp->if_xname, sp->lcp.mru, PP_MTU);
 			}
-			sp->lcp.opts &= ~(1 << LCP_OPT_MRU);
+			CLR(sp->lcp.opts, SPPP_LCP_OPT_MRU);
 			sp->lcp.mru = PP_MTU;
 			break;
 		case LCP_OPT_AUTH_PROTO:
@@ -2954,7 +2958,7 @@ sppp_lcp_confrej(struct sppp *sp, struct
 				if (debug)
 					addlog(" [don't insist on auth "
 					       "for callout]");
-				sp->lcp.opts &= ~(1 << LCP_OPT_AUTH_PROTO);
+				CLR(sp->lcp.opts, SPPP_LCP_OPT_AUTH_PROTO);
 				break;
 			}
 			if (debug)
@@ -3007,7 +3011,7 @@ sppp_lcp_confnak(struct sppp *sp, struct
 		switch (p[0]) {
 		case LCP_OPT_MAGIC:
 			/* Magic number -- renegotiate */
-			if ((sp->lcp.opts & (1 << LCP_OPT_MAGIC)) &&
+			if (ISSET(sp->lcp.opts, SPPP_LCP_OPT_MAGIC) &&
 			    len >= 6 && l == 6) {
 				magic = (uint32_t)p[2] << 24 |
 					(uint32_t)p[3] << 16 | p[4] << 8 | p[5];
@@ -3040,7 +3044,7 @@ sppp_lcp_confnak(struct sppp *sp, struct
 				if (mru < PPP_MINMRU || mru > sp->pp_if.if_mtu)
 					mru = sp->pp_if.if_mtu;
 				sp->lcp.mru = mru;
-				sp->lcp.opts |= (1 << LCP_OPT_MRU);
+				SET(sp->lcp.opts, SPPP_LCP_OPT_MRU);
 			}
 			break;
 		case LCP_OPT_AUTH_PROTO:
@@ -3077,7 +3081,7 @@ sppp_lcp_tlu(struct sppp *sp)
 		SPPP_LOCK(sp, RW_WRITER);
 	}
 
-	if ((sp->lcp.opts & (1 << LCP_OPT_AUTH_PROTO)) != 0 ||
+	if (ISSET(sp->lcp.opts, SPPP_LCP_OPT_AUTH_PROTO) ||
 	    (sp->pp_flags & PP_NEEDAUTH) != 0)
 		sppp_change_phase(sp, SPPP_PHASE_AUTHENTICATE);
 	else
@@ -3195,7 +3199,7 @@ sppp_lcp_scr(struct sppp *sp)
 
 	KASSERT(SPPP_WLOCKED(sp));
 
-	if (sp->lcp.opts & (1 << LCP_OPT_MAGIC)) {
+	if (ISSET(sp->lcp.opts, SPPP_LCP_OPT_MAGIC)) {
 		if (! sp->lcp.magic)
 			sp->lcp.magic = cprng_fast32();
 		opt[i++] = LCP_OPT_MAGIC;
@@ -3206,14 +3210,14 @@ sppp_lcp_scr(struct sppp *sp)
 		opt[i++] = sp->lcp.magic;
 	}
 
-	if (sp->lcp.opts & (1 << LCP_OPT_MRU)) {
+	if (ISSET(sp->lcp.opts,SPPP_LCP_OPT_MRU)) {
 		opt[i++] = LCP_OPT_MRU;
 		opt[i++] = 4;
 		opt[i++] = sp->lcp.mru >> 8;
 		opt[i++] = sp->lcp.mru;
 	}
 
-	if (sp->lcp.opts & (1 << LCP_OPT_AUTH_PROTO)) {
+	if (ISSET(sp->lcp.opts, SPPP_LCP_OPT_AUTH_PROTO)) {
 		authproto = sp->hisauth.proto;
 		opt[i++] = LCP_OPT_AUTH_PROTO;
 		opt[i++] = authproto == PPP_CHAP? 5: 4;
@@ -3327,7 +3331,7 @@ sppp_ipcp_open(struct sppp *sp, void *xc
 		 * negotiate my address.
 		 */
 		sp->ipcp.flags |= IPCP_MYADDR_DYN;
-		sp->ipcp.opts |= (1 << IPCP_OPT_ADDRESS);
+		SET(sp->ipcp.opts, SPPP_IPCP_OPT_ADDRESS);
 	}
 	if (hisaddr == 1) {
 		/*
@@ -3336,6 +3340,18 @@ sppp_ipcp_open(struct sppp *sp, void *xc
 		 */
 		sp->ipcp.flags |= IPCP_HISADDR_DYN;
 	}
+
+	if (sp->query_dns & 1) {
+		SET(sp->ipcp.opts, SPPP_IPCP_OPT_PRIMDNS);
+	} else {
+		CLR(sp->ipcp.opts, SPPP_IPCP_OPT_PRIMDNS);
+	}
+
+	if (sp->query_dns & 2) {
+		SET(sp->ipcp.opts, SPPP_IPCP_OPT_SECDNS);
+	} else {
+		CLR(sp->ipcp.opts, SPPP_IPCP_OPT_SECDNS);
+	}
 	sppp_open_event(sp, xcp);
 }
 
@@ -3624,13 +3640,20 @@ sppp_ipcp_confrej(struct sppp *sp, struc
 			 * Peer doesn't grok address option.  This is
 			 * bad.  XXX  Should we better give up here?
 			 */
-			sp->ipcp.opts &= ~(1 << IPCP_OPT_ADDRESS);
+			CLR(sp->ipcp.opts, SPPP_IPCP_OPT_ADDRESS);
 			break;
 #ifdef notyet
 		case IPCP_OPT_COMPRESS:
-			sp->ipcp.opts &= ~(1 << IPCP_OPT_COMPRESS);
+			CLR(sp->ipcp.opts, SPPP_IPCP_OPT_COMPRESS);
 			break;
 #endif
+		case IPCP_OPT_PRIMDNS:
+			CLR(sp->ipcp.opts, SPPP_IPCP_OPT_PRIMDNS);
+			break;
+
+		case IPCP_OPT_SECDNS:
+			CLR(sp->ipcp.opts, SPPP_IPCP_OPT_SECDNS);
+			break;
 		}
 	}
 	if (debug)
@@ -3684,7 +3707,7 @@ sppp_ipcp_confnak(struct sppp *sp, struc
 			if (len >= 6 && l == 6) {
 				wantaddr = p[2] << 24 | p[3] << 16 |
 					p[4] << 8 | p[5];
-				sp->ipcp.opts |= (1 << IPCP_OPT_ADDRESS);
+				SET(sp->ipcp.opts, SPPP_IPCP_OPT_ADDRESS);
 				if (debug)
 					addlog(" [wantaddr %s]",
 					       sppp_dotted_quad(wantaddr));
@@ -3704,14 +3727,16 @@ sppp_ipcp_confnak(struct sppp *sp, struc
 			break;
 
 		case IPCP_OPT_PRIMDNS:
-			if (len >= 6 && l == 6) {
+			if (ISSET(sp->ipcp.opts, SPPP_IPCP_OPT_PRIMDNS) &&
+			    len >= 6 && l == 6) {
 				sp->dns_addrs[0] = p[2] << 24 | p[3] << 16 |
 					p[4] << 8 | p[5];
 			}
 			break;
 
 		case IPCP_OPT_SECDNS:
-			if (len >= 6 && l == 6) {
+			if (ISSET(sp->ipcp.opts, SPPP_IPCP_OPT_SECDNS) &&
+			    len >= 6 && l == 6) {
 				sp->dns_addrs[1] = p[2] << 24 | p[3] << 16 |
 					p[4] << 8 | p[5];
 			}
@@ -3751,7 +3776,7 @@ sppp_ipcp_scr(struct sppp *sp)
 	KASSERT(SPPP_WLOCKED(sp));
 
 #ifdef notyet
-	if (sp->ipcp.opts & (1 << IPCP_OPT_COMPRESSION)) {
+	if (ISSET(sp->ipcp.opts,SPPP_IPCP_OPT_COMPRESSION)) {
 		opt[i++] = IPCP_OPT_COMPRESSION;
 		opt[i++] = 6;
 		opt[i++] = 0;	/* VJ header compression */
@@ -3762,7 +3787,7 @@ sppp_ipcp_scr(struct sppp *sp)
 #endif
 
 #ifdef INET
-	if (sp->ipcp.opts & (1 << IPCP_OPT_ADDRESS)) {
+	if (ISSET(sp->ipcp.opts, SPPP_IPCP_OPT_ADDRESS)) {
 		if (sp->ipcp.flags & IPCP_MYADDR_SEEN)
 			ouraddr = sp->ipcp.req_myaddr;	/* not sure if this can ever happen */
 		else
@@ -3776,7 +3801,7 @@ sppp_ipcp_scr(struct sppp *sp)
 	}
 #endif
 
-	if (sp->query_dns & 1) {
+	if (ISSET(sp->ipcp.opts, SPPP_IPCP_OPT_PRIMDNS)) {
 		opt[i++] = IPCP_OPT_PRIMDNS;
 		opt[i++] = 6;
 		opt[i++] = sp->dns_addrs[0] >> 24;
@@ -3784,7 +3809,7 @@ sppp_ipcp_scr(struct sppp *sp)
 		opt[i++] = sp->dns_addrs[0] >> 8;
 		opt[i++] = sp->dns_addrs[0];
 	}
-	if (sp->query_dns & 2) {
+	if (ISSET(sp->ipcp.opts, SPPP_IPCP_OPT_SECDNS)) {
 		opt[i++] = IPCP_OPT_SECDNS;
 		opt[i++] = 6;
 		opt[i++] = sp->dns_addrs[1] >> 24;
@@ -3848,7 +3873,7 @@ sppp_ipv6cp_open(struct sppp *sp, void *
 	}
 
 	sp->ipv6cp.flags |= IPV6CP_MYIFID_SEEN;
-	sp->ipv6cp.opts |= (1 << IPV6CP_OPT_IFID);
+	SET(sp->ipv6cp.opts, SPPP_IPV6CP_OPT_IFID);
 	sppp_open_event(sp, xcp);
 }
 
@@ -3991,6 +4016,11 @@ sppp_ipv6cp_confreq(struct sppp *sp, str
 			if (!collision && !nohisaddr) {
 				/* no collision, hisaddr known - Conf-Ack */
 				type = CP_RCR_ACK;
+				memcpy(sp->ipv6cp.my_ifid, &myaddr.s6_addr[8],
+				    sizeof(sp->ipv6cp.my_ifid));
+				memcpy(sp->ipv6cp.his_ifid,
+				    &desiredaddr.s6_addr[8],
+				    sizeof(sp->ipv6cp.my_ifid));
 
 				if (debug) {
 					addlog(" %s [%s]",
@@ -4112,11 +4142,11 @@ sppp_ipv6cp_confrej(struct sppp *sp, str
 			 * Peer doesn't grok address option.  This is
 			 * bad.  XXX  Should we better give up here?
 			 */
-			sp->ipv6cp.opts &= ~(1 << IPV6CP_OPT_IFID);
+			CLR(sp->ipv6cp.opts, SPPP_IPV6CP_OPT_IFID);
 			break;
 #ifdef notyet
 		case IPV6CP_OPT_COMPRESS:
-			sp->ipv6cp.opts &= ~(1 << IPV6CP_OPT_COMPRESS);
+			CLR(sp->ipv6cp.opts, SPPP_IPV6CP_OPT_COMPRESS);
 			break;
 #endif
 		}
@@ -4179,7 +4209,7 @@ sppp_ipv6cp_confnak(struct sppp *sp, str
 			(void)in6_setscope(&suggestaddr, &sp->pp_if, NULL);
 			memcpy(&suggestaddr.s6_addr[8], &p[2], 8);
 
-			sp->ipv6cp.opts |= (1 << IPV6CP_OPT_IFID);
+			SET(sp->ipv6cp.opts, SPPP_IPV6CP_OPT_IFID);
 			if (debug)
 				addlog(" [suggestaddr %s]",
 				       IN6_PRINT(ip6buf, &suggestaddr));
@@ -4255,7 +4285,7 @@ sppp_ipv6cp_scr(struct sppp *sp)
 
 	KASSERT(SPPP_WLOCKED(sp));
 
-	if (sp->ipv6cp.opts & (1 << IPV6CP_OPT_IFID)) {
+	if (ISSET(sp->ipv6cp.opts, SPPP_IPV6CP_OPT_IFID)) {
 		sppp_get_ip6_addrs(sp, &ouraddr, 0, 0);
 		opt[i++] = IPV6CP_OPT_IFID;
 		opt[i++] = 10;
@@ -4264,7 +4294,7 @@ sppp_ipv6cp_scr(struct sppp *sp)
 	}
 
 #ifdef notyet
-	if (sp->ipv6cp.opts & (1 << IPV6CP_OPT_COMPRESSION)) {
+	if (ISSET(sp->ipv6cp.opts, SPPP_IPV6CP_OPT_COMPRESSION)) {
 		opt[i++] = IPV6CP_OPT_COMPRESSION;
 		opt[i++] = 4;
 		opt[i++] = 0;	/* TBD */
@@ -5145,7 +5175,7 @@ sppp_auth_role(const struct cp *cp, stru
 	role = SPPP_AUTH_NOROLE;
 
 	if (sp->hisauth.proto == cp->proto &&
-	    (sp->lcp.opts & (1 << LCP_OPT_AUTH_PROTO)) != 0)
+	    ISSET(sp->lcp.opts, SPPP_LCP_OPT_AUTH_PROTO))
 		SET(role, SPPP_AUTH_SERV);
 
 	if (sp->myauth.proto == cp->proto)
@@ -5846,9 +5876,9 @@ sppp_params(struct sppp *sp, u_long cmd,
 		    sp->hisauth.proto = (cfg->hisauth == SPPP_AUTHPROTO_PAP) ? PPP_PAP : PPP_CHAP;
 		sp->pp_auth_failures = 0;
 		if (sp->hisauth.proto != 0)
-		    sp->lcp.opts |= (1 << LCP_OPT_AUTH_PROTO);
+			SET(sp->lcp.opts, SPPP_LCP_OPT_AUTH_PROTO);
 		else
-		    sp->lcp.opts &= ~(1 << LCP_OPT_AUTH_PROTO);
+			CLR(sp->lcp.opts, SPPP_LCP_OPT_AUTH_PROTO);
 
 		SPPP_UNLOCK(sp);
 	    }
@@ -5978,6 +6008,51 @@ sppp_params(struct sppp *sp, u_long cmd,
 		SPPP_UNLOCK(sp);
 	    }
 	    break;
+	case SPPPGETLCPSTATUS:
+	    {
+		struct sppplcpstatus *status =
+		    (struct sppplcpstatus *)data;
+
+		SPPP_LOCK(sp, RW_READER);
+		status->state = sp->scp[IDX_LCP].state;
+		status->opts = sp->lcp.opts;
+		status->magic = sp->lcp.magic;
+		status->mru = sp->lcp.mru;
+		SPPP_UNLOCK(sp);
+	    }
+	    break;
+	case SPPPGETIPCPSTATUS:
+	    {
+		struct spppipcpstatus *status =
+		    (struct spppipcpstatus *)data;
+		u_int32_t myaddr;
+
+		SPPP_LOCK(sp, RW_READER);
+		status->state = sp->scp[IDX_IPCP].state;
+		status->opts = sp->ipcp.opts;
+#ifdef INET
+		sppp_get_ip_addrs(sp, &myaddr, 0, 0);
+#else
+		myaddr = 0;
+#endif
+		status->myaddr = ntohl(myaddr);
+		SPPP_UNLOCK(sp);
+	    }
+	    break;
+	case SPPPGETIPV6CPSTATUS:
+	    {
+		struct spppipv6cpstatus *status =
+		    (struct spppipv6cpstatus *)data;
+
+		SPPP_LOCK(sp, RW_READER);
+		status->state = sp->scp[IDX_IPV6CP].state;
+		memcpy(status->my_ifid, sp->ipv6cp.my_ifid,
+		    sizeof(status->my_ifid));
+		memcpy(status->his_ifid, sp->ipv6cp.his_ifid,
+		    sizeof(status->his_ifid));
+		SPPP_UNLOCK(sp);
+	    }
+	    break;
 	default:
 	    {
 		int ret;

Index: src/sys/net/if_spppvar.h
diff -u src/sys/net/if_spppvar.h:1.31 src/sys/net/if_spppvar.h:1.32
--- src/sys/net/if_spppvar.h:1.31	Wed Nov 25 10:27:18 2020
+++ src/sys/net/if_spppvar.h	Wed Nov 25 10:30:51 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_spppvar.h,v 1.31 2020/11/25 10:27:18 yamaguchi Exp $	*/
+/*	$NetBSD: if_spppvar.h,v 1.32 2020/11/25 10:30:51 yamaguchi Exp $	*/
 
 #ifndef _NET_IF_SPPPVAR_H_
 #define _NET_IF_SPPPVAR_H_
@@ -78,6 +78,9 @@ struct sipcp {
 	uint32_t saved_hisaddr;/* if hisaddr (IPv4) is dynamic, save original one here, in network byte order */
 	uint32_t req_hisaddr;	/* remote address requested */
 	uint32_t req_myaddr;	/* local address requested */
+
+	uint8_t my_ifid[8];	/* IPv6CP my ifid*/
+	uint8_t his_ifid[8];	/* IPv6CP his ifid*/
 };
 
 struct sauth {

Reply via email to