diff options
author | bz <bz@FreeBSD.org> | 2011-07-03 12:22:02 +0000 |
---|---|---|
committer | bz <bz@FreeBSD.org> | 2011-07-03 12:22:02 +0000 |
commit | 9cad5bfef3ce97c030d30e66deb6371458c2281b (patch) | |
tree | 84813f5c322ca01ea7d1b10025c5fa8621a31765 /sys/net | |
parent | 9cb2f04853640f386dd7db2d61d981a14cd67729 (diff) | |
download | FreeBSD-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.c | 16 | ||||
-rw-r--r-- | sys/net/if.h | 2 | ||||
-rw-r--r-- | sys/net/if_debug.c | 1 | ||||
-rw-r--r-- | sys/net/if_var.h | 1 |
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 |