summaryrefslogtreecommitdiff
path: root/sys/kern/uipc_socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/uipc_socket.c')
-rw-r--r--sys/kern/uipc_socket.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
index b93cb2f88df6..c9b60766ae38 100644
--- a/sys/kern/uipc_socket.c
+++ b/sys/kern/uipc_socket.c
@@ -122,6 +122,7 @@ __FBSDID("$FreeBSD$");
#include <sys/socket.h>
#include <sys/socketvar.h>
#include <sys/resourcevar.h>
+#include <net/route.h>
#include <sys/signalvar.h>
#include <sys/stat.h>
#include <sys/sx.h>
@@ -360,6 +361,11 @@ socreate(int dom, struct socket **aso, int type, int proto,
TAILQ_INIT(&so->so_comp);
so->so_type = type;
so->so_cred = crhold(cred);
+ if ((prp->pr_domain->dom_family == PF_INET) ||
+ (prp->pr_domain->dom_family == PF_ROUTE))
+ so->so_fibnum = td->td_proc->p_fibnum;
+ else
+ so->so_fibnum = 0;
so->so_proto = prp;
#ifdef MAC
mac_socket_create(cred, so);
@@ -2027,6 +2033,20 @@ sosetopt(struct socket *so, struct sockopt *sopt)
SOCK_UNLOCK(so);
break;
+ case SO_SETFIB:
+ error = sooptcopyin(sopt, &optval, sizeof optval,
+ sizeof optval);
+ if (optval < 1 || optval > rt_numfibs) {
+ error = EINVAL;
+ goto bad;
+ }
+ if ((so->so_proto->pr_domain->dom_family == PF_INET) ||
+ (so->so_proto->pr_domain->dom_family == PF_ROUTE)) {
+ so->so_fibnum = optval;
+ } else {
+ so->so_fibnum = 0;
+ }
+ break;
case SO_SNDBUF:
case SO_RCVBUF:
case SO_SNDLOWAT: