Re: gif(4) cleanup

2015-09-26 Thread David Gwynne

> 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

2015-09-25 Thread mxb

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

2015-09-25 Thread Martin Pieuchot
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(