diff options
author | Hajimu UMEMOTO <ume@FreeBSD.org> | 2006-11-11 15:02:04 +0000 |
---|---|---|
committer | Hajimu UMEMOTO <ume@FreeBSD.org> | 2006-11-11 15:02:04 +0000 |
commit | 9f3b75b7b4eaf13bdcbf2f1d9262ac5265289934 (patch) | |
tree | d08d60736ad415f0da01d8344936991b717c3d05 /sys/net/if_ppp.c | |
parent | d8efa3cc8c1122ea54fc85e54652ffbf27b2861f (diff) | |
download | src-9f3b75b7b4eaf13bdcbf2f1d9262ac5265289934.tar.gz src-9f3b75b7b4eaf13bdcbf2f1d9262ac5265289934.zip |
Teach an IPv6 to ppp(4).
Obtained from: NetBSD
MFC after: 1 week
Notes
Notes:
svn path=/head/; revision=164180
Diffstat (limited to 'sys/net/if_ppp.c')
-rw-r--r-- | sys/net/if_ppp.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/sys/net/if_ppp.c b/sys/net/if_ppp.c index d01ed8f4aaed..394aa8d84206 100644 --- a/sys/net/if_ppp.c +++ b/sys/net/if_ppp.c @@ -76,6 +76,7 @@ /* from NetBSD: if_ppp.c,v 1.15.2.2 1994/07/28 05:17:58 cgd Exp */ #include "opt_inet.h" +#include "opt_inet6.h" #include "opt_ipx.h" #include "opt_mac.h" #include "opt_ppp.h" @@ -567,6 +568,9 @@ pppioctl(sc, cmd, data, flag, td) case PPP_IP: npx = NP_IP; break; + case PPP_IPV6: + npx = NP_IPV6; + break; default: error = EINVAL; } @@ -675,6 +679,10 @@ pppsioctl(ifp, cmd, data) case AF_INET: break; #endif +#ifdef INET6 + case AF_INET6: + break; +#endif #ifdef IPX case AF_IPX: break; @@ -691,6 +699,10 @@ pppsioctl(ifp, cmd, data) case AF_INET: break; #endif +#ifdef INET6 + case AF_INET6: + break; +#endif #ifdef IPX case AF_IPX: break; @@ -732,6 +744,10 @@ pppsioctl(ifp, cmd, data) case AF_INET: break; #endif +#ifdef INET6 + case AF_INET6: + break; +#endif default: error = EAFNOSUPPORT; break; @@ -829,6 +845,24 @@ pppoutput(ifp, m0, dst, rtp) m0->m_flags |= M_HIGHPRI; break; #endif +#ifdef INET6 + case AF_INET6: + address = PPP_ALLSTATIONS; /*XXX*/ + control = PPP_UI; /*XXX*/ + protocol = PPP_IPV6; + mode = sc->sc_npmode[NP_IPV6]; + +#if 0 /* XXX flowinfo/traffic class, maybe? */ + /* + * If this packet has the "low delay" bit set in the IP header, + * put it on the fastq instead. + */ + ip = mtod(m0, struct ip *); + if (ip->ip_tos & IPTOS_LOWDELAY) + m0->m_flags |= M_HIGHPRI; +#endif + break; +#endif #ifdef IPX case AF_IPX: /* @@ -985,6 +1019,9 @@ ppp_requeue(sc) case PPP_IP: mode = sc->sc_npmode[NP_IP]; break; + case PPP_IPV6: + mode = sc->sc_npmode[NP_IPV6]; + break; default: mode = NPMODE_PASS; } @@ -1587,6 +1624,23 @@ ppp_inproc(sc, m) isr = NETISR_IP; break; #endif +#ifdef INET6 + case PPP_IPV6: + /* + * IPv6 packet - take off the ppp header and pass it up to IPv6. + */ + if ((ifp->if_flags & IFF_UP) == 0 + || sc->sc_npmode[NP_IPV6] != NPMODE_PASS) { + /* interface is down - drop the packet. */ + m_freem(m); + return; + } + m->m_pkthdr.len -= PPP_HDRLEN; + m->m_data += PPP_HDRLEN; + m->m_len -= PPP_HDRLEN; + isr = NETISR_IPV6; + break; +#endif #ifdef IPX case PPP_IPX: /* |