summaryrefslogtreecommitdiffstats
path: root/sys/net
diff options
context:
space:
mode:
authorbz <bz@FreeBSD.org>2011-07-03 12:22:02 +0000
committerbz <bz@FreeBSD.org>2011-07-03 12:22:02 +0000
commit9cad5bfef3ce97c030d30e66deb6371458c2281b (patch)
tree84813f5c322ca01ea7d1b10025c5fa8621a31765 /sys/net
parent9cb2f04853640f386dd7db2d61d981a14cd67729 (diff)
downloadFreeBSD-src-9cad5bfef3ce97c030d30e66deb6371458c2281b.zip
FreeBSD-src-9cad5bfef3ce97c030d30e66deb6371458c2281b.tar.gz
Add infrastructure to allow all frames/packets received on an interface
to be assigned to a non-default FIB instance. You may need to recompile world or ports due to the change of struct ifnet. Submitted by: cjsp Submitted by: Alexander V. Chernikov (melifaro ipfw.ru) (original versions) Reviewed by: julian Reviewed by: Alexander V. Chernikov (melifaro ipfw.ru) MFC after: 2 weeks X-MFC: use spare in struct ifnet
Diffstat (limited to 'sys/net')
-rw-r--r--sys/net/if.c16
-rw-r--r--sys/net/if.h2
-rw-r--r--sys/net/if_debug.c1
-rw-r--r--sys/net/if_var.h1
4 files changed, 20 insertions, 0 deletions
diff --git a/sys/net/if.c b/sys/net/if.c
index a5a3a8e..2b7a24a 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -58,6 +58,8 @@
#include <sys/taskqueue.h>
#include <sys/domain.h>
#include <sys/jail.h>
+#include <sys/priv.h>
+
#include <machine/stdarg.h>
#include <vm/uma.h>
@@ -2135,6 +2137,20 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td)
free(odescrbuf, M_IFDESCR);
break;
+ case SIOCGIFFIB:
+ ifr->ifr_fib = ifp->if_fib;
+ break;
+
+ case SIOCSIFFIB:
+ error = priv_check(td, PRIV_NET_SETIFFIB);
+ if (error)
+ return (error);
+ if (ifr->ifr_fib >= rt_numfibs)
+ return (EINVAL);
+
+ ifp->if_fib = ifr->ifr_fib;
+ break;
+
case SIOCSIFFLAGS:
error = priv_check(td, PRIV_NET_SETIFFLAGS);
if (error)
diff --git a/sys/net/if.h b/sys/net/if.h
index 06521cb..d1f3883 100644
--- a/sys/net/if.h
+++ b/sys/net/if.h
@@ -325,6 +325,7 @@ struct ifreq {
int ifru_media;
caddr_t ifru_data;
int ifru_cap[2];
+ u_int ifru_fib;
} ifr_ifru;
#define ifr_addr ifr_ifru.ifru_addr /* address */
#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */
@@ -341,6 +342,7 @@ struct ifreq {
#define ifr_reqcap ifr_ifru.ifru_cap[0] /* requested capabilities */
#define ifr_curcap ifr_ifru.ifru_cap[1] /* current capabilities */
#define ifr_index ifr_ifru.ifru_index /* interface index */
+#define ifr_fib ifr_ifru.ifru_fib /* interface fib */
};
#define _SIZEOF_ADDR_IFREQ(ifr) \
diff --git a/sys/net/if_debug.c b/sys/net/if_debug.c
index dcf504e..e7319374 100644
--- a/sys/net/if_debug.c
+++ b/sys/net/if_debug.c
@@ -86,6 +86,7 @@ if_show_ifnet(struct ifnet *ifp)
IF_DB_PRINTF("%d", if_snd.ifq_drv_maxlen);
IF_DB_PRINTF("%d", if_snd.altq_type);
IF_DB_PRINTF("%x", if_snd.altq_flags);
+ IF_DB_PRINTF("%u", if_fib);
#undef IF_DB_PRINTF
}
diff --git a/sys/net/if_var.h b/sys/net/if_var.h
index b3ecb7d..cb1d39c 100644
--- a/sys/net/if_var.h
+++ b/sys/net/if_var.h
@@ -196,6 +196,7 @@ struct ifnet {
void *if_pf_kif;
void *if_lagg; /* lagg glue */
u_char if_alloctype; /* if_type at time of allocation */
+ u_int if_fib; /* interface FIB */
/*
* Spare fields are added so that we can modify sensitive data
OpenPOWER on IntegriCloud