diff options
author | ae <ae@FreeBSD.org> | 2015-06-06 13:37:11 +0000 |
---|---|---|
committer | ae <ae@FreeBSD.org> | 2015-06-06 13:37:11 +0000 |
commit | 49fd76c05c1937d6c5bf27f823249d3605121fe0 (patch) | |
tree | 3d06542ff82c49ec0e8aa645752292c78b063d37 /sys/net | |
parent | ad4eef6e15d2ae1de604f25c34a649a49fab352b (diff) | |
download | FreeBSD-src-49fd76c05c1937d6c5bf27f823249d3605121fe0.zip FreeBSD-src-49fd76c05c1937d6c5bf27f823249d3605121fe0.tar.gz |
MFC r282809:
Add new socket ioctls SIOC[SG]TUNFIB to set FIB number of encapsulated
packets on tunnel interfaces. Add support of these ioctls to gre(4),
gif(4) and me(4) interfaces. For incoming packets M_SETFIB() should use
if_fib value from ifnet structure, use proper value in gre(4) and me(4).
Differential Revision: https://reviews.freebsd.org/D2462
Diffstat (limited to 'sys/net')
-rw-r--r-- | sys/net/if_gif.c | 12 | ||||
-rw-r--r-- | sys/net/if_gre.c | 17 | ||||
-rw-r--r-- | sys/net/if_me.c | 14 |
3 files changed, 39 insertions, 4 deletions
diff --git a/sys/net/if_gif.c b/sys/net/if_gif.c index 919825e..66669ca 100644 --- a/sys/net/if_gif.c +++ b/sys/net/if_gif.c @@ -919,6 +919,17 @@ gif_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) #endif } break; + case SIOCGTUNFIB: + ifr->ifr_fib = sc->gif_fibnum; + break; + case SIOCSTUNFIB: + if ((error = priv_check(curthread, PRIV_NET_GIF)) != 0) + break; + if (ifr->ifr_fib >= rt_numfibs) + error = EINVAL; + else + sc->gif_fibnum = ifr->ifr_fib; + break; case GIFGOPTS: options = sc->gif_options; error = copyout(&options, ifr->ifr_data, sizeof(options)); @@ -934,7 +945,6 @@ gif_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) else sc->gif_options = options; break; - default: error = EINVAL; break; diff --git a/sys/net/if_gre.c b/sys/net/if_gre.c index 9b31356..3b22f43 100644 --- a/sys/net/if_gre.c +++ b/sys/net/if_gre.c @@ -64,6 +64,7 @@ __FBSDID("$FreeBSD$"); #include <net/if_types.h> #include <net/netisr.h> #include <net/vnet.h> +#include <net/route.h> #include <netinet/in.h> #ifdef INET @@ -441,6 +442,17 @@ gre_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) #endif } break; + case SIOCGTUNFIB: + ifr->ifr_fib = sc->gre_fibnum; + break; + case SIOCSTUNFIB: + if ((error = priv_check(curthread, PRIV_NET_GRE)) != 0) + break; + if (ifr->ifr_fib >= rt_numfibs) + error = EINVAL; + else + sc->gre_fibnum = ifr->ifr_fib; + break; case GRESKEY: if ((error = priv_check(curthread, PRIV_NET_GRE)) != 0) break; @@ -454,7 +466,8 @@ gre_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) } break; case GREGKEY: - error = copyout(&sc->gre_key, ifr->ifr_data, sizeof(sc->gre_key)); + error = copyout(&sc->gre_key, ifr->ifr_data, + sizeof(sc->gre_key)); break; case GRESOPTS: if ((error = priv_check(curthread, PRIV_NET_GRE)) != 0) @@ -725,7 +738,7 @@ gre_input(struct mbuf **mp, int *offp, int proto) m_adj(m, *offp + hlen); m_clrprotoflags(m); m->m_pkthdr.rcvif = ifp; - M_SETFIB(m, sc->gre_fibnum); + M_SETFIB(m, ifp->if_fib); #ifdef MAC mac_ifnet_create_mbuf(ifp, m); #endif diff --git a/sys/net/if_me.c b/sys/net/if_me.c index a61e1db..1e927a8 100644 --- a/sys/net/if_me.c +++ b/sys/net/if_me.c @@ -54,6 +54,7 @@ __FBSDID("$FreeBSD$"); #include <net/if_types.h> #include <net/netisr.h> #include <net/vnet.h> +#include <net/route.h> #include <netinet/in.h> #include <netinet/in_systm.h> @@ -298,6 +299,17 @@ me_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) if (error != 0) memset(src, 0, sizeof(*src)); break; + case SIOCGTUNFIB: + ifr->ifr_fib = sc->me_fibnum; + break; + case SIOCSTUNFIB: + if ((error = priv_check(curthread, PRIV_NET_GRE)) != 0) + break; + if (ifr->ifr_fib >= rt_numfibs) + error = EINVAL; + else + sc->me_fibnum = ifr->ifr_fib; + break; default: error = EINVAL; break; @@ -463,7 +475,7 @@ me_input(struct mbuf **mp, int *offp, int proto) m_clrprotoflags(m); m->m_pkthdr.rcvif = ifp; m->m_pkthdr.csum_flags |= (CSUM_IP_CHECKED | CSUM_IP_VALID); - M_SETFIB(m, sc->me_fibnum); + M_SETFIB(m, ifp->if_fib); hlen = AF_INET; BPF_MTAP2(ifp, &hlen, sizeof(hlen), m); if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1); |