Re: gif(4) cleanup
> On 25 Sep 2015, at 7:38 pm, Martin Pieuchot wrote: > > As discussed in Calgary I don't think we need 6 different files for > gif(4). None of them are standalone. Since all our other pseudo- > drivers are self-contained, let's do the same! This will prevent > new pseud-drivers to copy this pattern and add yet another 6 files! > > This merge the following files into net/if_gif.{c,h}: > > netinet/in_gif.c > netinet/in_gif.h > netinet6/in6_gif.c > netinet6/in6_gif.h > > Tested with an etherip + ipsec setup, ok? ok > > Index: conf/files > === > RCS file: /cvs/src/sys/conf/files,v > retrieving revision 1.602 > diff -u -p -r1.602 files > --- conf/files10 Sep 2015 18:39:57 - 1.602 > +++ conf/files25 Sep 2015 09:01:56 - > @@ -937,8 +937,6 @@ file uvm/uvm_vnode.c > # IPv6 > file net/if_gif.c gif needs-count > file netinet/ip_ecn.c > -file netinet/in_gif.cgif > -file netinet6/in6_gif.c gif & inet6 > file netinet6/in6_pcb.c inet6 > file netinet6/in6.c inet6 > file netinet6/ip6_divert.cinet6 & pf > Index: net/if_gif.c > === > RCS file: /cvs/src/sys/net/if_gif.c,v > retrieving revision 1.79 > diff -u -p -r1.79 if_gif.c > --- net/if_gif.c 11 Sep 2015 08:17:06 - 1.79 > +++ net/if_gif.c 25 Sep 2015 09:01:56 - > @@ -41,26 +41,36 @@ > #include > #include > #include > -#include > > #include > #include > -#include > #include > #include > #include > +#include > > #ifdef INET6 > #include > #include > #include > -#include > #endif /* INET6 */ > > #include > > #include "bpfilter.h" > +#if NBPFILTER > 0 > +#include > +#endif > + > #include "bridge.h" > +#if NBRIDGE > 0 || defined(MPLS) > +#include > +#endif > + > +#include "pf.h" > +#if NPF > 0 > +#include > +#endif > > #define GIF_MTU (1280) /* Default MTU */ > #define GIF_MTU_MIN (1280) /* Minimum MTU */ > @@ -75,6 +85,9 @@ int gif_ioctl(struct ifnet *, u_long, ca > int gif_output(struct ifnet *, struct mbuf *, struct sockaddr *, > struct rtentry *); > > +int in_gif_output(struct ifnet *, int, struct mbuf **); > +int in6_gif_output(struct ifnet *, int, struct mbuf **); > + > /* > * gif global variable definitions > */ > @@ -628,3 +641,276 @@ gif_checkloop(struct ifnet *ifp, struct > m_tag_prepend(m, mtag); > return 0; > } > + > +int > +in_gif_output(struct ifnet *ifp, int family, struct mbuf **m0) > +{ > + struct gif_softc *sc = (struct gif_softc*)ifp; > + struct sockaddr_in *sin_src = satosin(sc->gif_psrc); > + struct sockaddr_in *sin_dst = satosin(sc->gif_pdst); > + struct tdb tdb; > + struct xformsw xfs; > + int error; > + struct mbuf *m = *m0; > + > + if (sin_src == NULL || sin_dst == NULL || > + sin_src->sin_family != AF_INET || > + sin_dst->sin_family != AF_INET) { > + m_freem(m); > + return EAFNOSUPPORT; > + } > + > +#ifdef DIAGNOSTIC > + if (ifp->if_rdomain != rtable_l2(m->m_pkthdr.ph_rtableid)) { > + printf("%s: trying to send packet on wrong domain. " > + "if %d vs. mbuf %d, AF %d\n", ifp->if_xname, > + ifp->if_rdomain, rtable_l2(m->m_pkthdr.ph_rtableid), > + family); > + } > +#endif > + > + /* setup dummy tdb. it highly depends on ipip_output() code. */ > + bzero(&tdb, sizeof(tdb)); > + bzero(&xfs, sizeof(xfs)); > + tdb.tdb_src.sin.sin_family = AF_INET; > + tdb.tdb_src.sin.sin_len = sizeof(struct sockaddr_in); > + tdb.tdb_src.sin.sin_addr = sin_src->sin_addr; > + tdb.tdb_dst.sin.sin_family = AF_INET; > + tdb.tdb_dst.sin.sin_len = sizeof(struct sockaddr_in); > + tdb.tdb_dst.sin.sin_addr = sin_dst->sin_addr; > + tdb.tdb_xform = &xfs; > + xfs.xf_type = -1; /* not XF_IP4 */ > + > + switch (family) { > + case AF_INET: > + break; > +#ifdef INET6 > + case AF_INET6: > + break; > +#endif > +#if NBRIDGE > 0 > + case AF_LINK: > + break; > +#endif > +#if MPLS > + case AF_MPLS: > + break; > +#endif > + default: > +#ifdef DEBUG > + printf("%s: warning: unknown family %d passed\n", __func__, > + family); > +#endif > + m_freem(m); > + return EAFNOSUPPORT; > + } > + > + /* encapsulate into IPv4 packet */ > + *m0 = NULL; > +#if NBRIDGE > 0 > + if (family == AF_LINK) > + error = etherip_output(m, &tdb, m0, IPPROTO_ETHERIP); > + else > +#endif /* NBRIDGE */ > +#ifdef MPLS > + if (family == AF_MPLS) > + error = etherip_output(m, &tdb, m0, IPPROTO_MPLS); > + else > +#endif > + error = ipip_output(m,
Re: gif(4) cleanup
My tunnels are working as well. //mxb > On 25 sep. 2015, at 11:38, Martin Pieuchot wrote: > > As discussed in Calgary I don't think we need 6 different files for > gif(4). None of them are standalone. Since all our other pseudo- > drivers are self-contained, let's do the same! This will prevent > new pseud-drivers to copy this pattern and add yet another 6 files! > > This merge the following files into net/if_gif.{c,h}: > > netinet/in_gif.c > netinet/in_gif.h > netinet6/in6_gif.c > netinet6/in6_gif.h > > Tested with an etherip + ipsec setup, ok? > > Index: conf/files > === > RCS file: /cvs/src/sys/conf/files,v > retrieving revision 1.602 > diff -u -p -r1.602 files > --- conf/files10 Sep 2015 18:39:57 - 1.602 > +++ conf/files25 Sep 2015 09:01:56 - > @@ -937,8 +937,6 @@ file uvm/uvm_vnode.c > # IPv6 > file net/if_gif.c gif needs-count > file netinet/ip_ecn.c > -file netinet/in_gif.cgif > -file netinet6/in6_gif.c gif & inet6 > file netinet6/in6_pcb.c inet6 > file netinet6/in6.c inet6 > file netinet6/ip6_divert.cinet6 & pf > Index: net/if_gif.c > === > RCS file: /cvs/src/sys/net/if_gif.c,v > retrieving revision 1.79 > diff -u -p -r1.79 if_gif.c > --- net/if_gif.c 11 Sep 2015 08:17:06 - 1.79 > +++ net/if_gif.c 25 Sep 2015 09:01:56 - > @@ -41,26 +41,36 @@ > #include > #include > #include > -#include > > #include > #include > -#include > #include > #include > #include > +#include > > #ifdef INET6 > #include > #include > #include > -#include > #endif /* INET6 */ > > #include > > #include "bpfilter.h" > +#if NBPFILTER > 0 > +#include > +#endif > + > #include "bridge.h" > +#if NBRIDGE > 0 || defined(MPLS) > +#include > +#endif > + > +#include "pf.h" > +#if NPF > 0 > +#include > +#endif > > #define GIF_MTU (1280) /* Default MTU */ > #define GIF_MTU_MIN (1280) /* Minimum MTU */ > @@ -75,6 +85,9 @@ int gif_ioctl(struct ifnet *, u_long, ca > int gif_output(struct ifnet *, struct mbuf *, struct sockaddr *, > struct rtentry *); > > +int in_gif_output(struct ifnet *, int, struct mbuf **); > +int in6_gif_output(struct ifnet *, int, struct mbuf **); > + > /* > * gif global variable definitions > */ > @@ -628,3 +641,276 @@ gif_checkloop(struct ifnet *ifp, struct > m_tag_prepend(m, mtag); > return 0; > } > + > +int > +in_gif_output(struct ifnet *ifp, int family, struct mbuf **m0) > +{ > + struct gif_softc *sc = (struct gif_softc*)ifp; > + struct sockaddr_in *sin_src = satosin(sc->gif_psrc); > + struct sockaddr_in *sin_dst = satosin(sc->gif_pdst); > + struct tdb tdb; > + struct xformsw xfs; > + int error; > + struct mbuf *m = *m0; > + > + if (sin_src == NULL || sin_dst == NULL || > + sin_src->sin_family != AF_INET || > + sin_dst->sin_family != AF_INET) { > + m_freem(m); > + return EAFNOSUPPORT; > + } > + > +#ifdef DIAGNOSTIC > + if (ifp->if_rdomain != rtable_l2(m->m_pkthdr.ph_rtableid)) { > + printf("%s: trying to send packet on wrong domain. " > + "if %d vs. mbuf %d, AF %d\n", ifp->if_xname, > + ifp->if_rdomain, rtable_l2(m->m_pkthdr.ph_rtableid), > + family); > + } > +#endif > + > + /* setup dummy tdb. it highly depends on ipip_output() code. */ > + bzero(&tdb, sizeof(tdb)); > + bzero(&xfs, sizeof(xfs)); > + tdb.tdb_src.sin.sin_family = AF_INET; > + tdb.tdb_src.sin.sin_len = sizeof(struct sockaddr_in); > + tdb.tdb_src.sin.sin_addr = sin_src->sin_addr; > + tdb.tdb_dst.sin.sin_family = AF_INET; > + tdb.tdb_dst.sin.sin_len = sizeof(struct sockaddr_in); > + tdb.tdb_dst.sin.sin_addr = sin_dst->sin_addr; > + tdb.tdb_xform = &xfs; > + xfs.xf_type = -1; /* not XF_IP4 */ > + > + switch (family) { > + case AF_INET: > + break; > +#ifdef INET6 > + case AF_INET6: > + break; > +#endif > +#if NBRIDGE > 0 > + case AF_LINK: > + break; > +#endif > +#if MPLS > + case AF_MPLS: > + break; > +#endif > + default: > +#ifdef DEBUG > + printf("%s: warning: unknown family %d passed\n", __func__, > + family); > +#endif > + m_freem(m); > + return EAFNOSUPPORT; > + } > + > + /* encapsulate into IPv4 packet */ > + *m0 = NULL; > +#if NBRIDGE > 0 > + if (family == AF_LINK) > + error = etherip_output(m, &tdb, m0, IPPROTO_ETHERIP); > + else > +#endif /* NBRIDGE */ > +#ifdef MPLS > + if (family == AF_MPLS) > + error = etherip_output(m, &tdb, m0, IPPROTO_MPLS); > + else > +#end
gif(4) cleanup
As discussed in Calgary I don't think we need 6 different files for gif(4). None of them are standalone. Since all our other pseudo- drivers are self-contained, let's do the same! This will prevent new pseud-drivers to copy this pattern and add yet another 6 files! This merge the following files into net/if_gif.{c,h}: netinet/in_gif.c netinet/in_gif.h netinet6/in6_gif.c netinet6/in6_gif.h Tested with an etherip + ipsec setup, ok? Index: conf/files === RCS file: /cvs/src/sys/conf/files,v retrieving revision 1.602 diff -u -p -r1.602 files --- conf/files 10 Sep 2015 18:39:57 - 1.602 +++ conf/files 25 Sep 2015 09:01:56 - @@ -937,8 +937,6 @@ file uvm/uvm_vnode.c # IPv6 file net/if_gif.c gif needs-count file netinet/ip_ecn.c -file netinet/in_gif.c gif -file netinet6/in6_gif.cgif & inet6 file netinet6/in6_pcb.cinet6 file netinet6/in6.cinet6 file netinet6/ip6_divert.c inet6 & pf Index: net/if_gif.c === RCS file: /cvs/src/sys/net/if_gif.c,v retrieving revision 1.79 diff -u -p -r1.79 if_gif.c --- net/if_gif.c11 Sep 2015 08:17:06 - 1.79 +++ net/if_gif.c25 Sep 2015 09:01:56 - @@ -41,26 +41,36 @@ #include #include #include -#include #include #include -#include #include #include #include +#include #ifdef INET6 #include #include #include -#include #endif /* INET6 */ #include #include "bpfilter.h" +#if NBPFILTER > 0 +#include +#endif + #include "bridge.h" +#if NBRIDGE > 0 || defined(MPLS) +#include +#endif + +#include "pf.h" +#if NPF > 0 +#include +#endif #define GIF_MTU(1280) /* Default MTU */ #define GIF_MTU_MIN(1280) /* Minimum MTU */ @@ -75,6 +85,9 @@ int gif_ioctl(struct ifnet *, u_long, ca intgif_output(struct ifnet *, struct mbuf *, struct sockaddr *, struct rtentry *); +intin_gif_output(struct ifnet *, int, struct mbuf **); +intin6_gif_output(struct ifnet *, int, struct mbuf **); + /* * gif global variable definitions */ @@ -628,3 +641,276 @@ gif_checkloop(struct ifnet *ifp, struct m_tag_prepend(m, mtag); return 0; } + +int +in_gif_output(struct ifnet *ifp, int family, struct mbuf **m0) +{ + struct gif_softc *sc = (struct gif_softc*)ifp; + struct sockaddr_in *sin_src = satosin(sc->gif_psrc); + struct sockaddr_in *sin_dst = satosin(sc->gif_pdst); + struct tdb tdb; + struct xformsw xfs; + int error; + struct mbuf *m = *m0; + + if (sin_src == NULL || sin_dst == NULL || + sin_src->sin_family != AF_INET || + sin_dst->sin_family != AF_INET) { + m_freem(m); + return EAFNOSUPPORT; + } + +#ifdef DIAGNOSTIC + if (ifp->if_rdomain != rtable_l2(m->m_pkthdr.ph_rtableid)) { + printf("%s: trying to send packet on wrong domain. " + "if %d vs. mbuf %d, AF %d\n", ifp->if_xname, + ifp->if_rdomain, rtable_l2(m->m_pkthdr.ph_rtableid), + family); + } +#endif + + /* setup dummy tdb. it highly depends on ipip_output() code. */ + bzero(&tdb, sizeof(tdb)); + bzero(&xfs, sizeof(xfs)); + tdb.tdb_src.sin.sin_family = AF_INET; + tdb.tdb_src.sin.sin_len = sizeof(struct sockaddr_in); + tdb.tdb_src.sin.sin_addr = sin_src->sin_addr; + tdb.tdb_dst.sin.sin_family = AF_INET; + tdb.tdb_dst.sin.sin_len = sizeof(struct sockaddr_in); + tdb.tdb_dst.sin.sin_addr = sin_dst->sin_addr; + tdb.tdb_xform = &xfs; + xfs.xf_type = -1; /* not XF_IP4 */ + + switch (family) { + case AF_INET: + break; +#ifdef INET6 + case AF_INET6: + break; +#endif +#if NBRIDGE > 0 + case AF_LINK: + break; +#endif +#if MPLS + case AF_MPLS: + break; +#endif + default: +#ifdef DEBUG + printf("%s: warning: unknown family %d passed\n", __func__, + family); +#endif + m_freem(m); + return EAFNOSUPPORT; + } + + /* encapsulate into IPv4 packet */ + *m0 = NULL; +#if NBRIDGE > 0 + if (family == AF_LINK) + error = etherip_output(m, &tdb, m0, IPPROTO_ETHERIP); + else +#endif /* NBRIDGE */ +#ifdef MPLS + if (family == AF_MPLS) + error = etherip_output(m, &tdb, m0, IPPROTO_MPLS); + else +#endif + error = ipip_output(m, &tdb, m0, 0, 0); + if (error) + return error; + else if (*m0 == NULL) + return EFAULT; + + m = *m0; + + m->m_pkthdr.ph_rtableid = sc->gif_rtableid; +#if NPF > 0 + pf_pkt_addr_changed(