summaryrefslogtreecommitdiffstats
path: root/sys/net
diff options
context:
space:
mode:
authorae <ae@FreeBSD.org>2015-06-06 13:37:11 +0000
committerae <ae@FreeBSD.org>2015-06-06 13:37:11 +0000
commit49fd76c05c1937d6c5bf27f823249d3605121fe0 (patch)
tree3d06542ff82c49ec0e8aa645752292c78b063d37 /sys/net
parentad4eef6e15d2ae1de604f25c34a649a49fab352b (diff)
downloadFreeBSD-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.c12
-rw-r--r--sys/net/if_gre.c17
-rw-r--r--sys/net/if_me.c14
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);
OpenPOWER on IntegriCloud