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 {