> On 25 Sep 2015, at 7:38 pm, Martin Pieuchot <m...@openbsd.org> 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/files        10 Sep 2015 18:39:57 -0000      1.602
> +++ conf/files        25 Sep 2015 09:01:56 -0000
> @@ -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.c                      gif & inet6
> file netinet6/in6_pcb.c                       inet6
> file netinet6/in6.c                   inet6
> 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.c      11 Sep 2015 08:17:06 -0000      1.79
> +++ net/if_gif.c      25 Sep 2015 09:01:56 -0000
> @@ -41,26 +41,36 @@
> #include <net/if_var.h>
> #include <net/if_types.h>
> #include <net/route.h>
> -#include <net/bpf.h>
> 
> #include <netinet/in.h>
> #include <netinet/in_var.h>
> -#include <netinet/in_gif.h>
> #include <netinet/ip.h>
> #include <netinet/ip_ether.h>
> #include <netinet/ip_var.h>
> +#include <netinet/ip_ipsp.h>
> 
> #ifdef INET6
> #include <netinet6/in6_var.h>
> #include <netinet/ip6.h>
> #include <netinet6/ip6_var.h>
> -#include <netinet6/in6_gif.h>
> #endif /* INET6 */
> 
> #include <net/if_gif.h>
> 
> #include "bpfilter.h"
> +#if NBPFILTER > 0
> +#include <net/bpf.h>
> +#endif
> +
> #include "bridge.h"
> +#if NBRIDGE > 0 || defined(MPLS)
> +#include <netinet/ip_ether.h>
> +#endif
> +
> +#include "pf.h"
> +#if NPF > 0
> +#include <net/pfvar.h>
> +#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, &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(m);
> +#endif
> +     return 0;
> +}
> +
> +void
> +in_gif_input(struct mbuf *m, ...)
> +{
> +     int off;
> +     struct gif_softc *sc;
> +     struct ifnet *gifp = NULL;
> +     struct ip *ip;
> +     va_list ap;
> +
> +     va_start(ap, m);
> +     off = va_arg(ap, int);
> +     va_end(ap);
> +
> +     /* IP-in-IP header is caused by tunnel mode, so skip gif lookup */
> +     if (m->m_flags & M_TUNNEL) {
> +             m->m_flags &= ~M_TUNNEL;
> +             goto inject;
> +     }
> +
> +     ip = mtod(m, struct ip *);
> +
> +     /* this code will be soon improved. */
> +     LIST_FOREACH(sc, &gif_softc_list, gif_list) {
> +             if (sc->gif_psrc == NULL || sc->gif_pdst == NULL ||
> +                 sc->gif_psrc->sa_family != AF_INET ||
> +                 sc->gif_pdst->sa_family != AF_INET ||
> +                 rtable_l2(sc->gif_rtableid) !=
> +                 rtable_l2(m->m_pkthdr.ph_rtableid)) {
> +                     continue;
> +             }
> +
> +             if ((sc->gif_if.if_flags & IFF_UP) == 0)
> +                     continue;
> +
> +             if (in_hosteq(satosin(sc->gif_psrc)->sin_addr, ip->ip_dst) &&
> +                 in_hosteq(satosin(sc->gif_pdst)->sin_addr, ip->ip_src)) {
> +                     gifp = &sc->gif_if;
> +                     break;
> +             }
> +     }
> +
> +     if (gifp) {
> +             m->m_pkthdr.ph_ifidx = gifp->if_index;
> +             m->m_pkthdr.ph_rtableid = gifp->if_rdomain;
> +             gifp->if_ipackets++;
> +             gifp->if_ibytes += m->m_pkthdr.len;
> +             /* We have a configured GIF */
> +             ipip_input(m, off, gifp, ip->ip_p);
> +             return;
> +     }
> +
> +inject:
> +     ip4_input(m, off); /* No GIF interface was configured */
> +     return;
> +}
> +
> +#ifdef INET6
> +int
> +in6_gif_output(struct ifnet *ifp, int family, struct mbuf **m0)
> +{
> +     struct gif_softc *sc = (struct gif_softc*)ifp;
> +     struct sockaddr_in6 *sin6_src = satosin6(sc->gif_psrc);
> +     struct sockaddr_in6 *sin6_dst = satosin6(sc->gif_pdst);
> +     struct tdb tdb;
> +     struct xformsw xfs;
> +     int error;
> +     struct mbuf *m = *m0;
> +
> +     if (sin6_src == NULL || sin6_dst == NULL ||
> +         sin6_src->sin6_family != AF_INET6 ||
> +         sin6_dst->sin6_family != AF_INET6) {
> +             m_freem(m);
> +             return EAFNOSUPPORT;
> +     }
> +
> +     /* setup dummy tdb.  it highly depends on ipip_output() code. */
> +     bzero(&tdb, sizeof(tdb));
> +     bzero(&xfs, sizeof(xfs));
> +     tdb.tdb_src.sin6.sin6_family = AF_INET6;
> +     tdb.tdb_src.sin6.sin6_len = sizeof(struct sockaddr_in6);
> +     tdb.tdb_src.sin6.sin6_addr = sin6_src->sin6_addr;
> +     tdb.tdb_dst.sin6.sin6_family = AF_INET6;
> +     tdb.tdb_dst.sin6.sin6_len = sizeof(struct sockaddr_in6);
> +     tdb.tdb_dst.sin6.sin6_addr = sin6_dst->sin6_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
> +#ifdef 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 IPv6 packet */
> +     *m0 = NULL;
> +#if NBRIDGE > 0
> +     if (family == AF_LINK)
> +             error = etherip_output(m, &tdb, m0, IPPROTO_ETHERIP);
> +     else
> +#endif /* NBRIDGE */
> +#if 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;
> +
> +#if NPF > 0
> +     pf_pkt_addr_changed(m);
> +#endif
> +     return 0;
> +}
> +
> +int in6_gif_input(struct mbuf **mp, int *offp, int proto)
> +{
> +     struct mbuf *m = *mp;
> +     struct gif_softc *sc;
> +     struct ifnet *gifp = NULL;
> +     struct ip6_hdr *ip6;
> +
> +     /* XXX What if we run transport-mode IPsec to protect gif tunnel ? */
> +     if (m->m_flags & (M_AUTH | M_CONF))
> +             goto inject;
> +
> +     ip6 = mtod(m, struct ip6_hdr *);
> +
> +#define satoin6(sa)  (satosin6(sa)->sin6_addr)
> +     LIST_FOREACH(sc, &gif_softc_list, gif_list) {
> +             if (sc->gif_psrc == NULL || sc->gif_pdst == NULL ||
> +                 sc->gif_psrc->sa_family != AF_INET6 ||
> +                 sc->gif_pdst->sa_family != AF_INET6) {
> +                     continue;
> +             }
> +
> +             if ((sc->gif_if.if_flags & IFF_UP) == 0)
> +                     continue;
> +
> +             if (IN6_ARE_ADDR_EQUAL(&satoin6(sc->gif_psrc), &ip6->ip6_dst) &&
> +                 IN6_ARE_ADDR_EQUAL(&satoin6(sc->gif_pdst), &ip6->ip6_src)) {
> +                     gifp = &sc->gif_if;
> +                     break;
> +             }
> +     }
> +
> +     if (gifp) {
> +             m->m_pkthdr.ph_ifidx = gifp->if_index;
> +             gifp->if_ipackets++;
> +             gifp->if_ibytes += m->m_pkthdr.len;
> +             ipip_input(m, *offp, gifp, proto);
> +             return IPPROTO_DONE;
> +     }
> +
> +inject:
> +     /* No GIF tunnel configured */
> +     ip4_input6(&m, offp, proto);
> +     return IPPROTO_DONE;
> +}
> +#endif /* INET6 */
> Index: net/if_gif.h
> ===================================================================
> RCS file: /cvs/src/sys/net/if_gif.h,v
> retrieving revision 1.13
> diff -u -p -r1.13 if_gif.h
> --- net/if_gif.h      17 Jul 2015 18:05:59 -0000      1.13
> +++ net/if_gif.h      25 Sep 2015 09:01:56 -0000
> @@ -49,4 +49,7 @@ extern LIST_HEAD(gif_softc_head, gif_sof
> 
> int gif_encap(struct ifnet *, struct mbuf **, sa_family_t);
> 
> +void in_gif_input(struct mbuf *, ...);
> +int in6_gif_input(struct mbuf **, int *, int);
> +
> #endif /* _NET_IF_GIF_H_ */
> Index: netinet/in_gif.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/in_gif.c,v
> retrieving revision 1.46
> diff -u -p -r1.46 in_gif.c
> --- netinet/in_gif.c  14 Aug 2015 18:07:28 -0000      1.46
> +++ netinet/in_gif.c  25 Sep 2015 09:01:56 -0000
> @@ -1,205 +0,0 @@
> -/*   $OpenBSD: in_gif.c,v 1.46 2015/08/14 18:07:28 bluhm Exp $       */
> -/*   $KAME: in_gif.c,v 1.50 2001/01/22 07:27:16 itojun Exp $ */
> -
> -/*
> - * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
> - * All rights reserved.
> - *
> - * Redistribution and use in source and binary forms, with or without
> - * modification, are permitted provided that the following conditions
> - * are met:
> - * 1. Redistributions of source code must retain the above copyright
> - *    notice, this list of conditions and the following disclaimer.
> - * 2. Redistributions in binary form must reproduce the above copyright
> - *    notice, this list of conditions and the following disclaimer in the
> - *    documentation and/or other materials provided with the distribution.
> - * 3. Neither the name of the project nor the names of its contributors
> - *    may be used to endorse or promote products derived from this software
> - *    without specific prior written permission.
> - *
> - * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
> - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> - * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
> - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> - * SUCH DAMAGE.
> - */
> -
> -#include "pf.h"
> -
> -#include <sys/param.h>
> -#include <sys/systm.h>
> -#include <sys/socket.h>
> -#include <sys/mbuf.h>
> -
> -#include <net/if.h>
> -#include <net/if_var.h>
> -#include <net/route.h>
> -#include <net/if_gif.h>
> -
> -#include <netinet/in.h>
> -#include <netinet/ip.h>
> -#include <netinet/ip_var.h>
> -#include <netinet/in_gif.h>
> -#include <netinet/ip_ipsp.h>
> -
> -#include "gif.h"
> -#include "bridge.h"
> -#if NBRIDGE > 0 || defined(MPLS)
> -#include <netinet/ip_ether.h>
> -#endif
> -
> -#if NPF > 0
> -#include <net/pfvar.h>
> -#endif
> -
> -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("in_gif_output: warning: unknown family %d passed\n",
> -                     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(m);
> -#endif
> -     return 0;
> -}
> -
> -void
> -in_gif_input(struct mbuf *m, ...)
> -{
> -     int off;
> -     struct gif_softc *sc;
> -     struct ifnet *gifp = NULL;
> -     struct ip *ip;
> -     va_list ap;
> -
> -     va_start(ap, m);
> -     off = va_arg(ap, int);
> -     va_end(ap);
> -
> -     /* IP-in-IP header is caused by tunnel mode, so skip gif lookup */
> -     if (m->m_flags & M_TUNNEL) {
> -             m->m_flags &= ~M_TUNNEL;
> -             goto inject;
> -     }
> -
> -     ip = mtod(m, struct ip *);
> -
> -     /* this code will be soon improved. */
> -     LIST_FOREACH(sc, &gif_softc_list, gif_list) {
> -             if (sc->gif_psrc == NULL || sc->gif_pdst == NULL ||
> -                 sc->gif_psrc->sa_family != AF_INET ||
> -                 sc->gif_pdst->sa_family != AF_INET ||
> -                 rtable_l2(sc->gif_rtableid) !=
> -                 rtable_l2(m->m_pkthdr.ph_rtableid)) {
> -                     continue;
> -             }
> -
> -             if ((sc->gif_if.if_flags & IFF_UP) == 0)
> -                     continue;
> -
> -             if (in_hosteq(satosin(sc->gif_psrc)->sin_addr, ip->ip_dst) &&
> -                 in_hosteq(satosin(sc->gif_pdst)->sin_addr, ip->ip_src)) {
> -                     gifp = &sc->gif_if;
> -                     break;
> -             }
> -     }
> -
> -     if (gifp) {
> -             m->m_pkthdr.ph_ifidx = gifp->if_index;
> -             m->m_pkthdr.ph_rtableid = gifp->if_rdomain;
> -             gifp->if_ipackets++;
> -             gifp->if_ibytes += m->m_pkthdr.len;
> -             /* We have a configured GIF */
> -             ipip_input(m, off, gifp, ip->ip_p);
> -             return;
> -     }
> -
> -inject:
> -     ip4_input(m, off); /* No GIF interface was configured */
> -     return;
> -}
> Index: netinet/in_gif.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/in_gif.h,v
> retrieving revision 1.6
> diff -u -p -r1.6 in_gif.h
> --- netinet/in_gif.h  11 May 2010 09:36:07 -0000      1.6
> +++ netinet/in_gif.h  25 Sep 2015 09:01:56 -0000
> @@ -1,39 +0,0 @@
> -/*   $OpenBSD: in_gif.h,v 1.6 2010/05/11 09:36:07 claudio Exp $      */
> -/*   $KAME: in_gif.h,v 1.5 2000/04/14 08:36:02 itojun Exp $  */
> -
> -/*
> - * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
> - * All rights reserved.
> - *
> - * Redistribution and use in source and binary forms, with or without
> - * modification, are permitted provided that the following conditions
> - * are met:
> - * 1. Redistributions of source code must retain the above copyright
> - *    notice, this list of conditions and the following disclaimer.
> - * 2. Redistributions in binary form must reproduce the above copyright
> - *    notice, this list of conditions and the following disclaimer in the
> - *    documentation and/or other materials provided with the distribution.
> - * 3. Neither the name of the project nor the names of its contributors
> - *    may be used to endorse or promote products derived from this software
> - *    without specific prior written permission.
> - *
> - * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
> - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> - * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
> - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> - * SUCH DAMAGE.
> - */
> -
> -#ifndef _NETINET_IN_GIF_H_
> -#define _NETINET_IN_GIF_H_
> -
> -void in_gif_input(struct mbuf *, ...);
> -int in_gif_output(struct ifnet *, int, struct mbuf **);
> -
> -#endif /*_NETINET_IN_GIF_H_*/
> Index: netinet/in_proto.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/in_proto.c,v
> retrieving revision 1.66
> diff -u -p -r1.66 in_proto.c
> --- netinet/in_proto.c        4 Sep 2015 08:43:39 -0000       1.66
> +++ netinet/in_proto.c        25 Sep 2015 09:01:56 -0000
> @@ -134,7 +134,7 @@
> 
> #include "gif.h"
> #if NGIF > 0
> -#include <netinet/in_gif.h>
> +#include <net/if_gif.h>
> #endif
> 
> #ifdef INET6
> Index: netinet6/in6_gif.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/in6_gif.c,v
> retrieving revision 1.40
> diff -u -p -r1.40 in6_gif.c
> --- netinet6/in6_gif.c        16 Jun 2015 11:09:40 -0000      1.40
> +++ netinet6/in6_gif.c        25 Sep 2015 09:01:56 -0000
> @@ -1,193 +0,0 @@
> -/*   $OpenBSD: in6_gif.c,v 1.40 2015/06/16 11:09:40 mpi Exp $        */
> -/*   $KAME: in6_gif.c,v 1.43 2001/01/22 07:27:17 itojun Exp $        */
> -
> -/*
> - * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
> - * All rights reserved.
> - *
> - * Redistribution and use in source and binary forms, with or without
> - * modification, are permitted provided that the following conditions
> - * are met:
> - * 1. Redistributions of source code must retain the above copyright
> - *    notice, this list of conditions and the following disclaimer.
> - * 2. Redistributions in binary form must reproduce the above copyright
> - *    notice, this list of conditions and the following disclaimer in the
> - *    documentation and/or other materials provided with the distribution.
> - * 3. Neither the name of the project nor the names of its contributors
> - *    may be used to endorse or promote products derived from this software
> - *    without specific prior written permission.
> - *
> - * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
> - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> - * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
> - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> - * SUCH DAMAGE.
> - */
> -
> -#include "pf.h"
> -
> -#include <sys/param.h>
> -#include <sys/systm.h>
> -#include <sys/socket.h>
> -#include <sys/sockio.h>
> -#include <sys/mbuf.h>
> -#include <sys/errno.h>
> -#include <sys/ioctl.h>
> -#include <sys/protosw.h>
> -
> -#include <net/if.h>
> -#include <net/if_var.h>
> -
> -#include <netinet/in.h>
> -#include <netinet/ip_ipsp.h>
> -
> -#if NPF > 0
> -#include <net/pfvar.h>
> -#endif
> -
> -#include <netinet/ip6.h>
> -#include <netinet6/ip6_var.h>
> -#include <netinet6/in6_gif.h>
> -
> -#include <netinet/ip_ecn.h>
> -
> -#include <net/if_gif.h>
> -
> -#include "bridge.h"
> -#if NBRIDGE > 0 || defined(MPLS)
> -#include <netinet/ip_ether.h>
> -#endif
> -
> -/*
> - * family - family of the packet to be encapsulate.
> - */
> -int
> -in6_gif_output(struct ifnet *ifp, int family, struct mbuf **m0)
> -{
> -     struct gif_softc *sc = (struct gif_softc*)ifp;
> -     struct sockaddr_in6 *sin6_src = satosin6(sc->gif_psrc);
> -     struct sockaddr_in6 *sin6_dst = satosin6(sc->gif_pdst);
> -     struct tdb tdb;
> -     struct xformsw xfs;
> -     int error;
> -     struct mbuf *m = *m0;
> -
> -     if (sin6_src == NULL || sin6_dst == NULL ||
> -         sin6_src->sin6_family != AF_INET6 ||
> -         sin6_dst->sin6_family != AF_INET6) {
> -             m_freem(m);
> -             return EAFNOSUPPORT;
> -     }
> -
> -     /* setup dummy tdb.  it highly depends on ipip_output() code. */
> -     bzero(&tdb, sizeof(tdb));
> -     bzero(&xfs, sizeof(xfs));
> -     tdb.tdb_src.sin6.sin6_family = AF_INET6;
> -     tdb.tdb_src.sin6.sin6_len = sizeof(struct sockaddr_in6);
> -     tdb.tdb_src.sin6.sin6_addr = sin6_src->sin6_addr;
> -     tdb.tdb_dst.sin6.sin6_family = AF_INET6;
> -     tdb.tdb_dst.sin6.sin6_len = sizeof(struct sockaddr_in6);
> -     tdb.tdb_dst.sin6.sin6_addr = sin6_dst->sin6_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
> -#ifdef MPLS
> -     case AF_MPLS:
> -             break;
> -#endif
> -     default:
> -#ifdef DEBUG
> -             printf("in6_gif_output: warning: unknown family %d passed\n",
> -                     family);
> -#endif
> -             m_freem(m);
> -             return EAFNOSUPPORT;
> -     }
> -
> -     /* encapsulate into IPv6 packet */
> -     *m0 = NULL;
> -#if NBRIDGE > 0
> -     if (family == AF_LINK)
> -             error = etherip_output(m, &tdb, m0, IPPROTO_ETHERIP);
> -     else
> -#endif /* NBRIDGE */
> -#if 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;
> -
> -#if NPF > 0
> -     pf_pkt_addr_changed(m);
> -#endif
> -     return 0;
> -}
> -
> -int in6_gif_input(struct mbuf **mp, int *offp, int proto)
> -{
> -     struct mbuf *m = *mp;
> -     struct gif_softc *sc;
> -     struct ifnet *gifp = NULL;
> -     struct ip6_hdr *ip6;
> -
> -     /* XXX What if we run transport-mode IPsec to protect gif tunnel ? */
> -     if (m->m_flags & (M_AUTH | M_CONF))
> -             goto inject;
> -
> -     ip6 = mtod(m, struct ip6_hdr *);
> -
> -#define satoin6(sa)  (satosin6(sa)->sin6_addr)
> -     LIST_FOREACH(sc, &gif_softc_list, gif_list) {
> -             if (sc->gif_psrc == NULL || sc->gif_pdst == NULL ||
> -                 sc->gif_psrc->sa_family != AF_INET6 ||
> -                 sc->gif_pdst->sa_family != AF_INET6) {
> -                     continue;
> -             }
> -
> -             if ((sc->gif_if.if_flags & IFF_UP) == 0)
> -                     continue;
> -
> -             if (IN6_ARE_ADDR_EQUAL(&satoin6(sc->gif_psrc), &ip6->ip6_dst) &&
> -                 IN6_ARE_ADDR_EQUAL(&satoin6(sc->gif_pdst), &ip6->ip6_src)) {
> -                     gifp = &sc->gif_if;
> -                     break;
> -             }
> -     }
> -
> -     if (gifp) {
> -             m->m_pkthdr.ph_ifidx = gifp->if_index;
> -             gifp->if_ipackets++;
> -             gifp->if_ibytes += m->m_pkthdr.len;
> -             ipip_input(m, *offp, gifp, proto);
> -             return IPPROTO_DONE;
> -     }
> -
> -inject:
> -     /* No GIF tunnel configured */
> -     ip4_input6(&m, offp, proto);
> -     return IPPROTO_DONE;
> -}
> Index: netinet6/in6_gif.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/in6_gif.h,v
> retrieving revision 1.6
> diff -u -p -r1.6 in6_gif.h
> --- netinet6/in6_gif.h        11 May 2010 09:36:07 -0000      1.6
> +++ netinet6/in6_gif.h        25 Sep 2015 09:01:56 -0000
> @@ -1,39 +0,0 @@
> -/*   $OpenBSD: in6_gif.h,v 1.6 2010/05/11 09:36:07 claudio Exp $     */
> -/*   $KAME: in6_gif.h,v 1.5 2000/04/14 08:36:03 itojun Exp $ */
> -
> -/*
> - * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
> - * All rights reserved.
> - *
> - * Redistribution and use in source and binary forms, with or without
> - * modification, are permitted provided that the following conditions
> - * are met:
> - * 1. Redistributions of source code must retain the above copyright
> - *    notice, this list of conditions and the following disclaimer.
> - * 2. Redistributions in binary form must reproduce the above copyright
> - *    notice, this list of conditions and the following disclaimer in the
> - *    documentation and/or other materials provided with the distribution.
> - * 3. Neither the name of the project nor the names of its contributors
> - *    may be used to endorse or promote products derived from this software
> - *    without specific prior written permission.
> - *
> - * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
> - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> - * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
> - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> - * SUCH DAMAGE.
> - */
> -
> -#ifndef _NETINET6_IN6_GIF_H_
> -#define _NETINET6_IN6_GIF_H_
> -
> -int in6_gif_output(struct ifnet *, int, struct mbuf **);
> -int in6_gif_input(struct mbuf **, int *, int);
> -
> -#endif /*_NETINET6_IN6_GIF_H_*/
> Index: netinet6/in6_proto.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/in6_proto.c,v
> retrieving revision 1.80
> diff -u -p -r1.80 in6_proto.c
> --- netinet6/in6_proto.c      4 Sep 2015 08:43:39 -0000       1.80
> +++ netinet6/in6_proto.c      25 Sep 2015 09:01:56 -0000
> @@ -102,7 +102,7 @@
> #include "gif.h"
> #if NGIF > 0
> #include <netinet/ip_ether.h>
> -#include <netinet6/in6_gif.h>
> +#include <net/if_gif.h>
> #endif
> 
> #include "carp.h"
> 


Reply via email to