From owner-svn-src-projects@FreeBSD.ORG Fri Feb 3 11:00:54 2012 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 39A1C106566C; Fri, 3 Feb 2012 11:00:54 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 1A0448FC0A; Fri, 3 Feb 2012 11:00:54 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q13B0rDo084363; Fri, 3 Feb 2012 11:00:53 GMT (envelope-from bz@svn.freebsd.org) Received: (from bz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q13B0rw2084359; Fri, 3 Feb 2012 11:00:53 GMT (envelope-from bz@svn.freebsd.org) Message-Id: <201202031100.q13B0rw2084359@svn.freebsd.org> From: "Bjoern A. Zeeb" Date: Fri, 3 Feb 2012 11:00:53 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r230938 - in projects/multi-fibv6/head/sys: kern netinet6 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Feb 2012 11:00:54 -0000 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;