The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/netinet/in_rmx.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright 1994, 1995 Massachusetts Institute of Technology
    3  *
    4  * Permission to use, copy, modify, and distribute this software and
    5  * its documentation for any purpose and without fee is hereby
    6  * granted, provided that both the above copyright notice and this
    7  * permission notice appear in all copies, that both the above
    8  * copyright notice and this permission notice appear in all
    9  * supporting documentation, and that the name of M.I.T. not be used
   10  * in advertising or publicity pertaining to distribution of the
   11  * software without specific, written prior permission.  M.I.T. makes
   12  * no representations about the suitability of this software for any
   13  * purpose.  It is provided "as is" without express or implied
   14  * warranty.
   15  *
   16  * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''.  M.I.T. DISCLAIMS
   17  * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE,
   18  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
   19  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
   20  * SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   23  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   25  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   26  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   27  * SUCH DAMAGE.
   28  */
   29 
   30 #include <sys/cdefs.h>
   31 __FBSDID("$FreeBSD$");
   32 
   33 #include <sys/param.h>
   34 #include <sys/systm.h>
   35 #include <sys/kernel.h>
   36 #include <sys/sysctl.h>
   37 #include <sys/socket.h>
   38 #include <sys/mbuf.h>
   39 
   40 #include <net/if.h>
   41 #include <net/if_var.h>
   42 #include <net/route.h>
   43 #include <net/route/route_ctl.h>
   44 #include <net/route/route_var.h>
   45 #include <net/route/nhop.h>
   46 #include <net/vnet.h>
   47 
   48 #include <netinet/in.h>
   49 #include <netinet/in_var.h>
   50 #include <netinet/ip.h>
   51 #include <netinet/ip_icmp.h>
   52 #include <netinet/ip_var.h>
   53 
   54 static int
   55 rib4_set_nh_pfxflags(u_int fibnum, const struct sockaddr *addr, const struct sockaddr *mask,
   56     struct nhop_object *nh)
   57 {
   58         const struct sockaddr_in *addr4 = (const struct sockaddr_in *)addr;
   59         const struct sockaddr_in *mask4 = (const struct sockaddr_in *)mask;
   60         bool is_broadcast = false;
   61 
   62         if (mask == NULL) {
   63                 nhop_set_pxtype_flag(nh, NHF_HOST);
   64                 /*
   65                  * Backward compatibility:
   66                  * if the destination is broadcast,
   67                  * mark route as broadcast.
   68                  * This behavior was useful when route cloning
   69                  * was in place, so there was an explicit cloned
   70                  * route for every broadcasted address.
   71                  * Currently (2020-04) there is no kernel machinery
   72                  * to do route cloning, though someone might explicitly
   73                  * add these routes to support some cases with active-active
   74                  * load balancing. Given that, retain this support.
   75                  */
   76                 if (in_broadcast(addr4->sin_addr, nh->nh_ifp))
   77                         is_broadcast = true;
   78         } else if (mask4->sin_addr.s_addr == 0)
   79                 nhop_set_pxtype_flag(nh, NHF_DEFAULT);
   80         else
   81                 nhop_set_pxtype_flag(nh, 0);
   82 
   83         nhop_set_broadcast(nh, is_broadcast);
   84 
   85         return (0);
   86 }
   87 
   88 static int
   89 rib4_augment_nh(u_int fibnum, struct nhop_object *nh)
   90 {
   91         /*
   92          * Check route MTU:
   93          * inherit interface MTU if not set or
   94          * check if MTU is too large.
   95          */
   96         if (nh->nh_mtu == 0) {
   97                 nh->nh_mtu = nh->nh_ifp->if_mtu;
   98         } else if (nh->nh_mtu > nh->nh_ifp->if_mtu)
   99                 nh->nh_mtu = nh->nh_ifp->if_mtu;
  100 
  101         /* Set nhop type to basic per-AF nhop */
  102         if (nhop_get_type(nh) == 0) {
  103                 uint16_t nh_type;
  104                 if (nh->nh_flags & NHF_GATEWAY)
  105                         nh_type = NH_TYPE_IPV4_ETHER_NHOP;
  106                 else
  107                         nh_type = NH_TYPE_IPV4_ETHER_RSLV;
  108 
  109                 nhop_set_type(nh, nh_type);
  110         }
  111 
  112         return (0);
  113 }
  114 
  115 /*
  116  * Initialize our routing tree.
  117  */
  118 struct rib_head *
  119 in_inithead(uint32_t fibnum)
  120 {
  121         struct rib_head *rh;
  122 
  123         rh = rt_table_init(32, AF_INET, fibnum);
  124         if (rh == NULL)
  125                 return (NULL);
  126 
  127         rh->rnh_set_nh_pfxflags = rib4_set_nh_pfxflags;
  128         rh->rnh_augment_nh = rib4_augment_nh;
  129 
  130         return (rh);
  131 }
  132 
  133 #ifdef VIMAGE
  134 void
  135 in_detachhead(struct rib_head *rh)
  136 {
  137 
  138         rt_table_destroy(rh);
  139 }
  140 #endif
  141 
  142 /*
  143  * This zaps old routes when the interface goes down or interface
  144  * address is deleted.  In the latter case, it deletes static routes
  145  * that point to this address.  If we don't do this, we may end up
  146  * using the old address in the future.  The ones we always want to
  147  * get rid of are things like ARP entries, since the user might down
  148  * the interface, walk over to a completely different network, and
  149  * plug back in.
  150  */
  151 struct in_ifadown_arg {
  152         struct ifaddr *ifa;
  153         int del;
  154 };
  155 
  156 static int
  157 in_ifadownkill(const struct rtentry *rt, const struct nhop_object *nh,
  158     void *xap)
  159 {
  160         struct in_ifadown_arg *ap = xap;
  161 
  162         if (nh->nh_ifa != ap->ifa)
  163                 return (0);
  164 
  165         if ((nhop_get_rtflags(nh) & RTF_STATIC) != 0 && ap->del == 0)
  166                 return (0);
  167 
  168         return (1);
  169 }
  170 
  171 void
  172 in_ifadown(struct ifaddr *ifa, int delete)
  173 {
  174         struct in_ifadown_arg arg;
  175 
  176         KASSERT(ifa->ifa_addr->sa_family == AF_INET,
  177             ("%s: wrong family", __func__));
  178 
  179         arg.ifa = ifa;
  180         arg.del = delete;
  181 
  182         rib_foreach_table_walk_del(AF_INET, in_ifadownkill, &arg);
  183         ifa->ifa_flags &= ~IFA_ROUTE;           /* XXXlocking? */
  184 }

Cache object: 6eab2fb215ebfea9756a4e04199485fd


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.