Author: bz
Date: Fri Feb 10 06:43:16 2012
New Revision: 231348
URL: http://svn.freebsd.org/changeset/base/231348

Log:
  MFC r223735:
  
   Add infrastructure to allow all frames/packets received on an interface
   to be assigned to a non-default FIB instance.
  
   Submitted by:  cjsp
   Submitted by:  Alexander V. Chernikov (melifaro ipfw.ru)
                  (original versions)
   Reviewed by:   julian
   Reviewed by:   Alexander V. Chernikov (melifaro ipfw.ru)
  
  Reviewed by:  melifaro

Added:
  stable/7/sbin/ifconfig/iffib.c
     - copied unchanged from r223735, head/sbin/ifconfig/iffib.c
Modified:
  stable/7/sbin/ifconfig/Makefile
  stable/7/sbin/ifconfig/ifconfig.8
  stable/7/share/man/man9/ifnet.9
  stable/7/sys/net/if.c
  stable/7/sys/net/if.h
  stable/7/sys/net/if_var.h
  stable/7/sys/sys/priv.h
  stable/7/sys/sys/sockio.h
Directory Properties:
  stable/7/sbin/ifconfig/   (props changed)
  stable/7/share/man/man9/   (props changed)
  stable/7/sys/   (props changed)

Modified: stable/7/sbin/ifconfig/Makefile
==============================================================================
--- stable/7/sbin/ifconfig/Makefile     Fri Feb 10 06:42:50 2012        
(r231347)
+++ stable/7/sbin/ifconfig/Makefile     Fri Feb 10 06:43:16 2012        
(r231348)
@@ -22,6 +22,7 @@ SRCS+=        af_atalk.c              # AppleTalk support
 SRCS+= ifclone.c               # clone device support
 SRCS+= ifmac.c                 # MAC support
 SRCS+= ifmedia.c               # SIOC[GS]IFMEDIA support
+SRCS+= iffib.c                 # non-default FIB support
 SRCS+= ifvlan.c                # SIOC[GS]ETVLAN support
 SRCS+= ifieee80211.c           # SIOC[GS]IEEE80211 support
 SRCS+= ifgre.c                 # GRE keys etc

Modified: stable/7/sbin/ifconfig/ifconfig.8
==============================================================================
--- stable/7/sbin/ifconfig/ifconfig.8   Fri Feb 10 06:42:50 2012        
(r231347)
+++ stable/7/sbin/ifconfig/ifconfig.8   Fri Feb 10 06:43:16 2012        
(r231348)
@@ -288,6 +288,19 @@ Remove the interface from the given
 Fill interface index
 (lowermost 64bit of an IPv6 address)
 automatically.
+.It Cm fib Ar fib_number
+Specify interface FIB.
+A FIB
+.Ar fib_number
+is assigned to all frames or packets received on that interface.
+The FIB is not inherited, e.g. vlans or other sub-interfaces will use
+the default FIB (0) irrespective of the parent interface's FIB.
+The kernel needs to be tuned to support more than the default FIB
+using the
+.Va ROUTETABLES
+kernel configuration option, or the
+.Va net.fibs
+tunable.
 .It Cm ipdst
 This is used to specify an Internet host who is willing to receive
 IP packets encapsulating IPX packets bound for a remote network.

Copied: stable/7/sbin/ifconfig/iffib.c (from r223735, 
head/sbin/ifconfig/iffib.c)
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ stable/7/sbin/ifconfig/iffib.c      Fri Feb 10 06:43:16 2012        
(r231348, copy of r223735, head/sbin/ifconfig/iffib.c)
@@ -0,0 +1,103 @@
+/*-
+ * Copyright (c) 2011 Alexander V. Chernikov
+ * Copyright (c) 2011 Christian S.J. Peron
+ * Copyright (c) 2011 Bjoern A. Zeeb
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/param.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/sockio.h>
+
+#include <net/if.h>
+#include <net/route.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <err.h>
+
+#include "ifconfig.h"
+
+static void
+fib_status(int s)
+{
+       struct ifreq ifr;
+
+       memset(&ifr, 0, sizeof(ifr));
+       strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
+
+       if (ioctl(s, SIOCGIFFIB, (caddr_t)&ifr) < 0)
+               return;
+
+       /* Ignore if it is the default. */
+       if (ifr.ifr_fib == 0)
+               return;
+
+       printf("\tfib: %u\n", ifr.ifr_fib);
+}
+
+static void
+setiffib(const char *val, int dummy __unused, int s,
+    const struct afswtch *afp)
+{
+       unsigned long fib;
+       char *ep;
+
+       fib = strtoul(val, &ep, 0);
+       if (*ep != '\0' || fib > UINT_MAX) {
+               warn("fib %s not valid", val);
+               return;
+       }
+
+       strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
+       ifr.ifr_fib = fib;
+       if (ioctl(s, SIOCSIFFIB, (caddr_t)&ifr) < 0)
+               warn("ioctl (SIOCSIFFIB)");
+}
+
+static struct cmd fib_cmds[] = {
+       DEF_CMD_ARG("fib", setiffib),
+};
+
+static struct afswtch af_fib = {
+       .af_name        = "af_fib",
+       .af_af          = AF_UNSPEC,
+       .af_other_status = fib_status,
+};
+
+static __constructor void
+fib_ctor(void)
+{
+#define        N(a)    (sizeof(a) / sizeof(a[0]))
+       size_t i;
+
+       for (i = 0; i < N(fib_cmds);  i++)
+               cmd_register(&fib_cmds[i]);
+       af_register(&af_fib);
+#undef N
+}

Modified: stable/7/share/man/man9/ifnet.9
==============================================================================
--- stable/7/share/man/man9/ifnet.9     Fri Feb 10 06:42:50 2012        
(r231347)
+++ stable/7/share/man/man9/ifnet.9     Fri Feb 10 06:43:16 2012        
(r231348)
@@ -28,8 +28,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd March 14, 2007
-.Os
+.Dd July 3, 2011
 .Dt IFNET 9
 .Sh NAME
 .Nm ifnet ,
@@ -1129,11 +1128,12 @@ list.
 Caller must have appropriate privilege.
 (No call-down to driver.)
 .It Dv SIOCGIFCAP
+.It Dv SIOCGIFFIB
 .It Dv SIOCGIFFLAGS
 .It Dv SIOCGIFMETRIC
 .It Dv SIOCGIFMTU
 .It Dv SIOCGIFPHYS
-Get interface capabilities, flags, metric, MTU, medium selection.
+Get interface capabilities, FIB, flags, metric, MTU, medium selection.
 (No call-down to driver.)
 .Pp
 .It Dv SIOCSIFCAP
@@ -1152,6 +1152,12 @@ and
 .Va if_data.ifi_hwassist
 appropriately.
 .Pp
+.It Dv SIOCSIFFIB
+Sets interface FIB.
+Caller must have appropriate privilege.
+FIB values start at 0 and values greater or equals than
+.Va net.fibs
+are considered invalid.
 .It Dv SIOCSIFFLAGS
 Change interface flags.
 Caller must have appropriate privilege.

Modified: stable/7/sys/net/if.c
==============================================================================
--- stable/7/sys/net/if.c       Fri Feb 10 06:42:50 2012        (r231347)
+++ stable/7/sys/net/if.c       Fri Feb 10 06:43:16 2012        (r231348)
@@ -56,6 +56,8 @@
 #include <sys/taskqueue.h>
 #include <sys/domain.h>
 #include <sys/jail.h>
+#include <sys/priv.h>
+
 #include <machine/stdarg.h>
 
 #include <net/if.h>
@@ -1683,6 +1685,20 @@ ifhwioctl(u_long cmd, struct ifnet *ifp,
                ifr->ifr_phys = ifp->if_physical;
                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)

Modified: stable/7/sys/net/if.h
==============================================================================
--- stable/7/sys/net/if.h       Fri Feb 10 06:42:50 2012        (r231347)
+++ stable/7/sys/net/if.h       Fri Feb 10 06:43:16 2012        (r231348)
@@ -303,6 +303,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 */
@@ -317,6 +318,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) \

Modified: stable/7/sys/net/if_var.h
==============================================================================
--- stable/7/sys/net/if_var.h   Fri Feb 10 06:42:50 2012        (r231347)
+++ stable/7/sys/net/if_var.h   Fri Feb 10 06:43:16 2012        (r231348)
@@ -187,7 +187,8 @@ struct ifnet {
        void    *if_pf_kif;
        void    *if_lagg;               /* lagg glue */
        void    *if_pspare[10];         /* multiq/TOE 3; vimage 3; general use 
4 */
-       int     if_ispare[2];           /* general use 2 */
+       int     if_ispare[1];           /* general use */
+       u_int   if_fib;                 /* interface FIB */
 };
 
 typedef void if_init_f_t(void *);

Modified: stable/7/sys/sys/priv.h
==============================================================================
--- stable/7/sys/sys/priv.h     Fri Feb 10 06:42:50 2012        (r231347)
+++ stable/7/sys/sys/priv.h     Fri Feb 10 06:43:16 2012        (r231348)
@@ -328,6 +328,7 @@
 #define        PRIV_NET_DELIFADDR      414     /* Delete protocol addr on 
interface. */
 #define        PRIV_NET_LAGG           415     /* Administer lagg interface. */
 #define        PRIV_NET_GIF            416     /* Administer gif interface. */
+#define        PRIV_NET_SETIFFIB       419     /* Set interface fib. */
 
 /*
  * 802.11-related privileges.

Modified: stable/7/sys/sys/sockio.h
==============================================================================
--- stable/7/sys/sys/sockio.h   Fri Feb 10 06:42:50 2012        (r231347)
+++ stable/7/sys/sys/sockio.h   Fri Feb 10 06:43:16 2012        (r231348)
@@ -108,6 +108,9 @@
 #define        SIOCGPRIVATE_0  _IOWR('i', 80, struct ifreq)    /* device 
private 0 */
 #define        SIOCGPRIVATE_1  _IOWR('i', 81, struct ifreq)    /* device 
private 1 */
 
+#define        SIOCGIFFIB      _IOWR('i', 92, struct ifreq)    /* get IF fib */
+#define        SIOCSIFFIB       _IOW('i', 93, struct ifreq)    /* set IF fib */
+
 #define        SIOCSDRVSPEC    _IOW('i', 123, struct ifdrv)    /* set 
driver-specific
                                                                  parameters */
 #define        SIOCGDRVSPEC    _IOWR('i', 123, struct ifdrv)   /* get 
driver-specific
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to