Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 3 Feb 2012 11:00:53 +0000 (UTC)
From:      "Bjoern A. Zeeb" <bz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r230938 - in projects/multi-fibv6/head/sys: kern netinet6
Message-ID:  <201202031100.q13B0rw2084359@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bz
Date: Fri Feb  3 11:00:53 2012
New Revision: 230938
URL: http://svn.freebsd.org/changeset/base/230938

Log:
  Add SO_SETFIB option support on PF_INET6 sockets and allow inheriting the
  FIB number from the process, as set by setfib(2), on socket creation.
  
  Sponsored by:	Cisco Systems, Inc.

Modified:
  projects/multi-fibv6/head/sys/kern/uipc_socket.c
  projects/multi-fibv6/head/sys/netinet6/ip6_output.c
  projects/multi-fibv6/head/sys/netinet6/raw_ip6.c

Modified: projects/multi-fibv6/head/sys/kern/uipc_socket.c
==============================================================================
--- projects/multi-fibv6/head/sys/kern/uipc_socket.c	Fri Feb  3 10:17:34 2012	(r230937)
+++ projects/multi-fibv6/head/sys/kern/uipc_socket.c	Fri Feb  3 11:00:53 2012	(r230938)
@@ -392,6 +392,7 @@ socreate(int dom, struct socket **aso, i
 	so->so_type = type;
 	so->so_cred = crhold(cred);
 	if ((prp->pr_domain->dom_family == PF_INET) ||
+	    (prp->pr_domain->dom_family == PF_INET6) ||
 	    (prp->pr_domain->dom_family == PF_ROUTE))
 		so->so_fibnum = td->td_proc->p_fibnum;
 	else
@@ -2498,12 +2499,13 @@ sosetopt(struct socket *so, struct socko
 		case SO_SETFIB:
 			error = sooptcopyin(sopt, &optval, sizeof optval,
 					    sizeof optval);
-			if (optval < 0 || optval > rt_numfibs) {
+			if (optval < 0 || optval >= rt_numfibs) {
 				error = EINVAL;
 				goto bad;
 			}
 			if (so->so_proto != NULL &&
 			   ((so->so_proto->pr_domain->dom_family == PF_INET) ||
+			   (so->so_proto->pr_domain->dom_family == PF_INET6) ||
 			   (so->so_proto->pr_domain->dom_family == PF_ROUTE))) {
 				so->so_fibnum = optval;
 				/* Note: ignore error */

Modified: projects/multi-fibv6/head/sys/netinet6/ip6_output.c
==============================================================================
--- projects/multi-fibv6/head/sys/netinet6/ip6_output.c	Fri Feb  3 10:17:34 2012	(r230937)
+++ projects/multi-fibv6/head/sys/netinet6/ip6_output.c	Fri Feb  3 11:00:53 2012	(r230938)
@@ -1448,6 +1448,12 @@ ip6_ctloutput(struct socket *so, struct 
 				INP_WUNLOCK(in6p);
 				error = 0;
 				break;
+			case SO_SETFIB:
+				INP_WLOCK(in6p);
+				in6p->inp_inc.inc_fibnum = so->so_fibnum;
+				INP_WUNLOCK(in6p);
+				error = 0;
+				break;
 			default:
 				break;
 			}

Modified: projects/multi-fibv6/head/sys/netinet6/raw_ip6.c
==============================================================================
--- projects/multi-fibv6/head/sys/netinet6/raw_ip6.c	Fri Feb  3 10:17:34 2012	(r230937)
+++ projects/multi-fibv6/head/sys/netinet6/raw_ip6.c	Fri Feb  3 11:00:53 2012	(r230938)
@@ -582,6 +582,7 @@ rip6_output(m, va_alist)
 int
 rip6_ctloutput(struct socket *so, struct sockopt *sopt)
 {
+	struct inpcb *inp;
 	int error;
 
 	if (sopt->sopt_level == IPPROTO_ICMPV6)
@@ -590,8 +591,17 @@ rip6_ctloutput(struct socket *so, struct
 		 * from protosw?
 		 */
 		return (icmp6_ctloutput(so, sopt));
-	else if (sopt->sopt_level != IPPROTO_IPV6)
+	else if (sopt->sopt_level != IPPROTO_IPV6) {
+		if (sopt->sopt_level == SOL_SOCKET &&
+		    sopt->sopt_name == SO_SETFIB) {
+			inp = sotoinpcb(so);
+			INP_WLOCK(inp);
+			inp->inp_inc.inc_fibnum = so->so_fibnum;
+			INP_WUNLOCK(inp);
+			return (0);
+		}
 		return (EINVAL);
+	}
 
 	error = 0;
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201202031100.q13B0rw2084359>