I received an error for if_ethersubr.c and if_pppoe.c. The rest of the patches were successful.
router$ patch < pppoe_rx.patch Hmm... Looks like a unified diff to me... The text leading up to this was: -------------------------- |Index: if_ethersubr.c |=================================================================== |RCS file: /cvs/src/sys/net/if_ethersubr.c,v |diff -u -p -r1.293 if_ethersubr.c |--- if_ethersubr.c 14 Feb 2024 22:41:48 -0000 1.293 |+++ if_ethersubr.c 30 Nov 2024 06:29:47 -0000 -------------------------- File to patch: ./sys/net/if_ethersubr.c Patching file ./sys/net/if_ethersubr.c using Plan A... Hunk #1 failed at 561. 1 out of 1 hunks failed--saving rejects to ./sys/net/if_ethersubr.c.rej Hmm... The next patch looks like a unified diff to me... The text leading up to this was: -------------------------- |Index: if_pppoe.c |=================================================================== |RCS file: /cvs/src/sys/net/if_pppoe.c,v |diff -u -p -r1.84 if_pppoe.c |--- if_pppoe.c 26 Jun 2024 01:40:49 -0000 1.84 |+++ if_pppoe.c 30 Nov 2024 06:29:47 -0000 -------------------------- File to patch: ./sys/net/if_pppoe.c Patching file ./sys/net/if_pppoe.c using Plan A... Hunk #1 succeeded at 42. Hunk #2 failed at 126. Hunk #3 succeeded at 179 with fuzz 1. Hunk #4 failed at 214. Hunk #5 failed at 245. Hunk #6 failed at 260. Hunk #7 failed at 294. Hunk #8 failed at 310. Hunk #9 succeeded at 341 with fuzz 1. Hunk #10 failed at 648. Hunk #11 failed at 661. Hunk #12 failed at 684. Hunk #13 succeeded at 726 with fuzz 1. Hunk #14 failed at 882. Hunk #15 failed at 1078. Hunk #16 failed at 1116. Hunk #17 failed at 1288. Hunk #18 failed at 1331. Hunk #19 failed at 1363. Hunk #20 failed at 1391. Hunk #21 failed at 1537. Hunk #22 failed at 1569. 18 out of 22 hunks failed--saving rejects to ./sys/net/if_pppoe.c.rej Hmm... The next patch looks like a unified diff to me... The text leading up to this was: -------------------------- |Index: if_pppoe.h |=================================================================== |RCS file: /cvs/src/sys/net/if_pppoe.h,v |diff -u -p -r1.8 if_pppoe.h |--- if_pppoe.h 29 Jun 2022 09:08:07 -0000 1.8 |+++ if_pppoe.h 30 Nov 2024 06:29:47 -0000 -------------------------- File to patch: ./sys/net/if_pppoe.h Patching file ./sys/net/if_pppoe.h using Plan A... Hunk #1 succeeded at 69. Hmm... The next patch looks like a unified diff to me... The text leading up to this was: -------------------------- |Index: if_sppp.h |=================================================================== |RCS file: /cvs/src/sys/net/if_sppp.h,v |diff -u -p -r1.30 if_sppp.h |--- if_sppp.h 17 Nov 2021 18:00:24 -0000 1.30 |+++ if_sppp.h 30 Nov 2024 06:29:47 -0000 -------------------------- File to patch: ./sys/net/if_sppp.h Patching file ./sys/net/if_sppp.h using Plan A... Hunk #1 succeeded at 232. Hmm... The next patch looks like a unified diff to me... The text leading up to this was: -------------------------- |Index: if_spppsubr.c |=================================================================== |RCS file: /cvs/src/sys/net/if_spppsubr.c,v |diff -u -p -r1.194 if_spppsubr.c |--- if_spppsubr.c 22 Jun 2024 10:22:29 -0000 1.194 |+++ if_spppsubr.c 30 Nov 2024 06:29:47 -0000 -------------------------- File to patch: ./sys/net/if_spppsubr.c Patching file ./sys/net/if_spppsubr.c using Plan A... Hunk #1 succeeded at 415. done On Mon, 2 Dec 2024 at 11:24, Brodey Dover <dover...@gmail.com> wrote: > Thank you very much. > > I'll look at applying the diff but it's been a while since I've done it. > > Brodey > > On Sun, 1 Dec 2024 at 17:48, David Gwynne <da...@gwynne.id.au> wrote: > >> On Wed, Nov 27, 2024 at 09:14:19AM -0500, Brodey Dover wrote: >> > Thanks. The MTU is auto negotiated to 1492. max-mss is 1440 in pf. >> > >> > I don't think OpenBSD has netisr or an equivalent since I don't see >> > anything in the sysctl list, but it was implemented in FreeBSD and has >> > allowed a number of people to fully saturate the mutli-gig symmetrical >> > connections offered by newer ISPs using PPPoE. I should add *ON >> > mutli-core/slower speed CPUs". >> >> the diff below might improve pppoe rx performance. >> >> > On Wed, 27 Nov 2024 at 03:03, Christer Solskogen < >> > christer.solsko...@gmail.com> wrote: >> > >> > > On Tue, Nov 26, 2024 at 10:59???PM Brodey Dover <dover...@gmail.com> >> wrote: >> > > > >> > > > So my modem is too buggy to do any DMZ work, thank you ISP. >> > > > >> > > > But the modem does pull 2375/2375. That???s down/up, which is why I >> was >> > > thinking there was a serious bottleneck on the OBSD side. >> > > > >> > > >> > > It's at least 20 years since I used PPPoE, but I seem to remember that >> > > I had to lower the MTU to get the full speed. 1492 if I remember >> > > correctly. >> > > >> > > -- >> > > chs >> >> Index: if_ethersubr.c >> =================================================================== >> RCS file: /cvs/src/sys/net/if_ethersubr.c,v >> diff -u -p -r1.293 if_ethersubr.c >> --- if_ethersubr.c 14 Feb 2024 22:41:48 -0000 1.293 >> +++ if_ethersubr.c 30 Nov 2024 06:29:47 -0000 >> @@ -561,7 +561,8 @@ ether_input(struct ifnet *ifp, struct mb >> if (mq_enqueue(&pppoediscinq, m) == 0) >> schednetisr(NETISR_PPPOE); >> } else { >> - if (mq_enqueue(&pppoeinq, m) == 0) >> + m = pppoe_vinput(ifp, m); >> + if (m != NULL && mq_enqueue(&pppoeinq, m) == 0) >> schednetisr(NETISR_PPPOE); >> } >> return; >> Index: if_pppoe.c >> =================================================================== >> RCS file: /cvs/src/sys/net/if_pppoe.c,v >> diff -u -p -r1.84 if_pppoe.c >> --- if_pppoe.c 26 Jun 2024 01:40:49 -0000 1.84 >> +++ if_pppoe.c 30 Nov 2024 06:29:47 -0000 >> @@ -42,6 +42,8 @@ >> #include <sys/socket.h> >> #include <sys/syslog.h> >> #include <sys/ioctl.h> >> +#include <sys/smr.h> >> +#include <sys/percpu.h> >> #include <net/if.h> >> #include <net/if_var.h> >> #include <net/if_types.h> >> @@ -124,7 +126,9 @@ struct pppoe_softc { >> struct sppp sc_sppp; /* contains a struct ifnet as >> first element */ >> LIST_ENTRY(pppoe_softc) sc_list;/* [K] */ >> unsigned int sc_eth_ifidx; /* [K] */ >> + caddr_t sc_bpf; >> >> + SMR_LIST_ENTRY(pppoe_softc) sc_session_entry; /* [K] */ >> int sc_state; /* [K] discovery phase or session >> connected */ >> struct ether_addr sc_dest; /* [K] hardware address of >> concentrator */ >> u_int16_t sc_session; /* [K] PPPoE session id */ >> @@ -175,6 +179,7 @@ static struct pppoe_softc *pppoe_find_so >> static struct mbuf *pppoe_get_mbuf(size_t len); >> >> LIST_HEAD(pppoe_softc_head, pppoe_softc) pppoe_softc_list; >> +SMR_LIST_HEAD(pppoe_softc_sessions, pppoe_softc) pppoe_sessions; /* [K] >> */ >> >> /* interface cloning */ >> int pppoe_clone_create(struct if_clone *, int); >> @@ -209,9 +214,19 @@ void >> pppoeattach(int count) >> { >> LIST_INIT(&pppoe_softc_list); >> + SMR_LIST_INIT(&pppoe_sessions); >> if_clone_attach(&pppoe_cloner); >> } >> >> +static void >> +pppoe_set_state(struct pppoe_softc *sc, int state) >> +{ >> + KERNEL_ASSERT_LOCKED(); >> + if (sc->sc_state == PPPOE_STATE_SESSION) >> + SMR_LIST_REMOVE_LOCKED(sc, sc_session_entry); >> + sc->sc_state = state; >> +} >> + >> /* Create a new interface. */ >> int >> pppoe_clone_create(struct if_clone *ifc, int unit) >> @@ -230,6 +245,8 @@ pppoe_clone_create(struct if_clone *ifc, >> sc->sc_sppp.pp_if.if_hdrlen = sizeof(struct ether_header) + >> PPPOE_HEADERLEN; >> sc->sc_sppp.pp_flags |= PP_KEEPALIVE; /* use LCP >> keepalive */ >> sc->sc_sppp.pp_framebytes = PPPOE_HEADERLEN; /* framing added >> to ppp packets */ >> + sc->sc_sppp.pp_if.if_input = p2p_input; >> + sc->sc_sppp.pp_if.if_bpf_mtap = p2p_bpf_mtap; >> sc->sc_sppp.pp_if.if_ioctl = pppoe_ioctl; >> sc->sc_sppp.pp_if.if_start = pppoe_start; >> sc->sc_sppp.pp_if.if_rtrequest = p2p_rtrequest; >> @@ -243,11 +260,14 @@ pppoe_clone_create(struct if_clone *ifc, >> /* init timer for interface watchdog */ >> timeout_set_proc(&sc->sc_timeout, pppoe_timeout, sc); >> >> + if_counters_alloc(&sc->sc_sppp.pp_if); >> if_attach(&sc->sc_sppp.pp_if); >> if_alloc_sadl(&sc->sc_sppp.pp_if); >> sppp_attach(&sc->sc_sppp.pp_if); >> #if NBPFILTER > 0 >> - bpfattach(&sc->sc_sppp.pp_if.if_bpf, &sc->sc_sppp.pp_if, >> DLT_PPP_ETHER, 0); >> + bpfattach(&sc->sc_bpf, &sc->sc_sppp.pp_if, DLT_PPP_ETHER, 0); >> + bpfattach(&sc->sc_sppp.pp_if.if_bpf, &sc->sc_sppp.pp_if, >> + DLT_LOOP, sizeof(uint32_t)); >> #endif >> >> NET_LOCK(); >> @@ -274,6 +294,7 @@ pppoe_clone_destroy(struct ifnet *ifp) >> NET_UNLOCK(); >> >> timeout_del(&sc->sc_timeout); >> + pppoe_set_state(sc, PPPOE_STATE_INITIAL); >> >> sppp_detach(&sc->sc_sppp.pp_if); >> if_detach(ifp); >> @@ -289,6 +310,8 @@ pppoe_clone_destroy(struct ifnet *ifp) >> if (sc->sc_relay_sid) >> free(sc->sc_relay_sid, M_DEVBUF, sc->sc_relay_sid_len); >> >> + smr_barrier(); >> + >> free(sc, M_DEVBUF, sizeof(*sc)); >> >> return (0); >> @@ -318,6 +341,28 @@ pppoe_find_softc_by_session(u_int sessio >> return (NULL); >> } >> >> +static struct pppoe_softc * >> +pppoe_smr_find_by_session(u_int session, u_int ifidx) >> +{ >> + struct pppoe_softc *sc; >> + >> + if (session == 0) >> + return (NULL); >> + >> + smr_read_enter(); >> + SMR_LIST_FOREACH(sc, &pppoe_sessions, sc_session_entry) { >> + if (sc->sc_session == session && >> + sc->sc_eth_ifidx == ifidx) { >> + /* XXX if_ref() */ >> + refcnt_take(&sc->sc_sppp.pp_if.if_refcnt); >> + break; >> + } >> + } >> + smr_read_leave(); >> + >> + return (sc); >> +} >> + >> /* >> * Check host unique token passed and return appropriate softc pointer, >> * or NULL if token is bogus. >> @@ -603,7 +648,7 @@ breakbreak: >> >> memcpy(&sc->sc_dest, eh->ether_shost, >> sizeof(sc->sc_dest)); >> sc->sc_padr_retried = 0; >> - sc->sc_state = PPPOE_STATE_PADR_SENT; >> + pppoe_set_state(sc, PPPOE_STATE_PADR_SENT); >> if ((err = pppoe_send_padr(sc)) != 0) { >> PPPOEDEBUG(("%s: failed to send PADR, error=%d\n", >> sc->sc_sppp.pp_if.if_xname, err)); >> @@ -616,12 +661,16 @@ breakbreak: >> if (sc == NULL) >> goto done; >> >> + KERNEL_ASSERT_LOCKED(); >> + >> sc->sc_session = session; >> timeout_del(&sc->sc_timeout); >> PPPOEDEBUG(("%s: session 0x%x connected\n", >> sc->sc_sppp.pp_if.if_xname, session)); >> sc->sc_state = PPPOE_STATE_SESSION; >> getmicrouptime(&sc->sc_session_time); >> + SMR_LIST_INSERT_HEAD_LOCKED(&pppoe_sessions, sc, >> + sc_session_entry); >> sc->sc_sppp.pp_up(&sc->sc_sppp); /* notify upper >> layers */ >> >> break; >> @@ -635,7 +684,7 @@ breakbreak: >> sc->sc_sppp.pp_if.if_xname, session)); >> >> /* clean up softc */ >> - sc->sc_state = PPPOE_STATE_INITIAL; >> + pppoe_set_state(sc, PPPOE_STATE_PADR_SENT); >> memcpy(&sc->sc_dest, etherbroadcastaddr, >> sizeof(sc->sc_dest)); >> if (sc->sc_ac_cookie) { >> free(sc->sc_ac_cookie, M_DEVBUF, >> @@ -677,6 +726,108 @@ pppoe_disc_input(struct mbuf *m) >> m_freem(m); >> } >> >> +struct mbuf * >> +pppoe_vinput(struct ifnet *ifp0, struct mbuf *m) >> +{ >> + struct pppoe_softc *sc; >> + struct ifnet *ifp; >> + struct ether_header *eh; >> + struct pppoehdr *ph; >> + uint16_t proto; >> + int hlen = sizeof(*eh) + sizeof(*ph); >> + int phlen; >> + int plen; >> + int af = AF_UNSPEC; >> +#if NBPFILTER > 0 >> + caddr_t if_bpf; >> +#endif >> + time_t now; >> + >> + smr_read_enter(); >> + sc = SMR_LIST_FIRST(&pppoe_sessions); >> + smr_read_leave(); >> + if (sc == NULL) >> + return (m); >> + >> + if (m->m_pkthdr.len < hlen) >> + return (m); >> + if (m->m_len < hlen) { >> + m = m_pullup(m, hlen); >> + if (m == NULL) >> + return (NULL); >> + } >> + >> + eh = mtod(m, struct ether_header *); >> + ph = (struct pppoehdr *)(eh + 1); >> + if (ph->vertype != PPPOE_VERTYPE) >> + return (m); >> + if (ph->code != 0) >> + return (m); >> + >> + sc = pppoe_smr_find_by_session(ntohs(ph->session), >> ifp0->if_index); >> + if (sc == NULL) { >> + /* no session, don't waste any more time */ >> + m_freem(m); >> + return (NULL); >> + } >> + >> + ifp = &sc->sc_sppp.pp_if; >> + >> + plen = ntohs(ph->plen); >> + if (plen < sizeof(proto)) >> + goto drop; >> + >> + phlen = hlen + sizeof(proto); >> + if (m->m_pkthdr.len < phlen) >> + goto drop; >> + if (m->m_len < phlen) { >> + m = m_pullup(m, phlen); >> + if (m == NULL) >> + goto put; >> + } >> + >> + proto = *(uint16_t *)(mtod(m, caddr_t) + hlen); >> + af = sppp_proto_up(ifp, proto); >> + if (af == AF_UNSPEC) >> + goto put; >> + >> +#if NBPFILTER > 0 >> + if_bpf = sc->sc_bpf; >> + if (if_bpf) { >> + m_adj(m, sizeof(*eh)); >> + bpf_mtap(sc->sc_bpf, m, BPF_DIRECTION_IN); >> + m_adj(m, phlen - sizeof(*eh)); >> + } else >> +#endif >> + m_adj(m, phlen); >> + >> + plen -= sizeof(proto); >> + if (m->m_pkthdr.len < plen) { >> + counters_inc(ifp->if_counters, ifc_ierrors); >> + goto drop; >> + } >> + >> + if (m->m_pkthdr.len > plen) >> + m_adj(m, plen - m->m_pkthdr.len); >> + >> + /* XXX not 64bit or MP safe */ >> + now = getuptime(); >> + if (sc->sc_sppp.pp_last_activity < now) >> + sc->sc_sppp.pp_last_activity = now; >> + >> + m->m_pkthdr.ph_family = af; >> + if_vinput(ifp, m); >> +done: >> + m = NULL; >> +put: >> + if_put(ifp); >> + >> + return (m); >> +drop: >> + m_freem(m); >> + goto done; >> +} >> + >> /* Input function for data packets */ >> void >> pppoe_data_input(struct mbuf *m) >> @@ -731,8 +882,8 @@ pppoe_data_input(struct mbuf *m) >> plen = ntohs(ph->plen); >> >> #if NBPFILTER > 0 >> - if(sc->sc_sppp.pp_if.if_bpf) >> - bpf_mtap(sc->sc_sppp.pp_if.if_bpf, m, BPF_DIRECTION_IN); >> + if (sc->sc_bpf) >> + bpf_mtap(sc->sc_bpf, m, BPF_DIRECTION_IN); >> #endif >> >> m_adj(m, PPPOE_HEADERLEN); >> @@ -927,7 +1078,7 @@ pppoe_ioctl(struct ifnet *ifp, unsigned >> && sc->sc_state >= PPPOE_STATE_PADI_SENT >> && sc->sc_state < PPPOE_STATE_SESSION) { >> timeout_del(&sc->sc_timeout); >> - sc->sc_state = PPPOE_STATE_INITIAL; >> + pppoe_set_state(sc, PPPOE_STATE_INITIAL); >> sc->sc_padi_retried = 0; >> sc->sc_padr_retried = 0; >> memcpy(&sc->sc_dest, etherbroadcastaddr, >> @@ -965,7 +1116,8 @@ pppoe_ioctl(struct ifnet *ifp, unsigned >> if (sc->sc_state >= PPPOE_STATE_PADI_SENT >> && >> sc->sc_state < PPPOE_STATE_SESSION) { >> timeout_del(&sc->sc_timeout); >> - sc->sc_state = >> PPPOE_STATE_INITIAL; >> + pppoe_set_state(sc, >> + PPPOE_STATE_INITIAL); >> sc->sc_padi_retried = 0; >> sc->sc_padr_retried = 0; >> memcpy(&sc->sc_dest, >> @@ -1136,7 +1288,7 @@ pppoe_timeout(void *arg) >> if (sc->sc_padr_retried >= PPPOE_DISC_MAXPADR) { >> memcpy(&sc->sc_dest, etherbroadcastaddr, >> sizeof(sc->sc_dest)); >> - sc->sc_state = PPPOE_STATE_PADI_SENT; >> + pppoe_set_state(sc, PPPOE_STATE_PADI_SENT); >> sc->sc_padr_retried = 0; >> if ((err = pppoe_send_padi(sc)) != 0) { >> PPPOEDEBUG(("%s: failed to send PADI, >> error=%d\n", >> @@ -1179,7 +1331,7 @@ pppoe_connect(struct pppoe_softc *sc) >> x = splnet(); >> >> /* save state, in case we fail to send PADI */ >> - sc->sc_state = PPPOE_STATE_PADI_SENT; >> + pppoe_set_state(sc, PPPOE_STATE_PADI_SENT); >> sc->sc_padr_retried = 0; >> err = pppoe_send_padi(sc); >> if (err != 0) >> @@ -1211,7 +1363,7 @@ pppoe_disconnect(struct pppoe_softc *sc) >> } >> >> /* cleanup softc */ >> - sc->sc_state = PPPOE_STATE_INITIAL; >> + pppoe_set_state(sc, PPPOE_STATE_INITIAL); >> memcpy(&sc->sc_dest, etherbroadcastaddr, sizeof(sc->sc_dest)); >> if (sc->sc_ac_cookie) { >> free(sc->sc_ac_cookie, M_DEVBUF, sc->sc_ac_cookie_len); >> @@ -1239,14 +1391,14 @@ pppoe_abort_connect(struct pppoe_softc * >> { >> printf("%s: could not establish connection\n", >> sc->sc_sppp.pp_if.if_xname); >> - sc->sc_state = PPPOE_STATE_CLOSING; >> + pppoe_set_state(sc, PPPOE_STATE_CLOSING); >> >> /* notify upper layer */ >> sc->sc_sppp.pp_down(&sc->sc_sppp); >> >> /* clear connection state */ >> memcpy(&sc->sc_dest, etherbroadcastaddr, sizeof(sc->sc_dest)); >> - sc->sc_state = PPPOE_STATE_INITIAL; >> + pppoe_set_state(sc, PPPOE_STATE_INITIAL); >> } >> >> /* Send a PADR packet */ >> @@ -1385,7 +1537,7 @@ pppoe_tlf(struct sppp *sp) >> * machine gets confused by this. We must return from this >> * function and defer disconnecting to the timeout handler. >> */ >> - sc->sc_state = PPPOE_STATE_CLOSING; >> + pppoe_set_state(sc, PPPOE_STATE_CLOSING); >> timeout_add_msec(&sc->sc_timeout, 20); >> } >> >> @@ -1417,9 +1569,8 @@ pppoe_start(struct ifnet *ifp) >> PPPOE_ADD_HEADER(p, 0, sc->sc_session, len); >> >> #if NBPFILTER > 0 >> - if(sc->sc_sppp.pp_if.if_bpf) >> - bpf_mtap(sc->sc_sppp.pp_if.if_bpf, m, >> - BPF_DIRECTION_OUT); >> + if (sc->sc_bpf) >> + bpf_mtap(sc->sc_bpf, m, BPF_DIRECTION_OUT); >> #endif >> >> pppoe_output(sc, m); >> Index: if_pppoe.h >> =================================================================== >> RCS file: /cvs/src/sys/net/if_pppoe.h,v >> diff -u -p -r1.8 if_pppoe.h >> --- if_pppoe.h 29 Jun 2022 09:08:07 -0000 1.8 >> +++ if_pppoe.h 30 Nov 2024 06:29:47 -0000 >> @@ -69,5 +69,8 @@ struct pppoeconnectionstate { >> extern struct mbuf_queue pppoediscinq; >> extern struct mbuf_queue pppoeinq; >> >> +int pppoe_if_exists(void); >> +struct mbuf *pppoe_vinput(struct ifnet *, struct mbuf *); >> + >> #endif /* _KERNEL */ >> #endif /* _NET_IF_PPPOE_H_ */ >> Index: if_sppp.h >> =================================================================== >> RCS file: /cvs/src/sys/net/if_sppp.h,v >> diff -u -p -r1.30 if_sppp.h >> --- if_sppp.h 17 Nov 2021 18:00:24 -0000 1.30 >> +++ if_sppp.h 30 Nov 2024 06:29:47 -0000 >> @@ -232,6 +232,7 @@ struct sppp { >> void sppp_attach (struct ifnet *ifp); >> void sppp_detach (struct ifnet *ifp); >> void sppp_input (struct ifnet *ifp, struct mbuf *m); >> +int sppp_proto_up(struct ifnet *ifp, uint16_t); >> >> /* Workaround */ >> void spppattach (struct ifnet *ifp); >> Index: if_spppsubr.c >> =================================================================== >> RCS file: /cvs/src/sys/net/if_spppsubr.c,v >> diff -u -p -r1.194 if_spppsubr.c >> --- if_spppsubr.c 22 Jun 2024 10:22:29 -0000 1.194 >> +++ if_spppsubr.c 30 Nov 2024 06:29:47 -0000 >> @@ -415,6 +415,30 @@ spppattach(struct ifnet *ifp) >> { >> } >> >> +int >> +sppp_proto_up(struct ifnet *ifp, uint16_t proto) >> +{ >> + struct sppp *sp = (struct sppp *)ifp; >> + int af = AF_UNSPEC; >> + >> + switch (ntohs(proto)) { >> + case PPP_IP: >> + if (sp->state[IDX_IPCP] == STATE_OPENED) >> + af = AF_INET; >> + break; >> +#ifdef INET6 >> + case PPP_IPV6: >> + if (sp->state[IDX_IPV6CP] == STATE_OPENED) >> + af = AF_INET6; >> + break; >> +#endif >> + default: >> + break; >> + } >> + >> + return (af); >> +} >> + >> /* >> * Process the received packet. >> */ >> >