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: releng/11.1/sys/netinet/in_rmx.c 295529 2016-02-11 17:07:19Z dteske $");
   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_var.h>
   44 #include <net/vnet.h>
   45 
   46 #include <netinet/in.h>
   47 #include <netinet/in_var.h>
   48 #include <netinet/ip.h>
   49 #include <netinet/ip_icmp.h>
   50 #include <netinet/ip_var.h>
   51 
   52 extern int      in_inithead(void **head, int off);
   53 #ifdef VIMAGE
   54 extern int      in_detachhead(void **head, int off);
   55 #endif
   56 
   57 /*
   58  * Do what we need to do when inserting a route.
   59  */
   60 static struct radix_node *
   61 in_addroute(void *v_arg, void *n_arg, struct radix_head *head,
   62     struct radix_node *treenodes)
   63 {
   64         struct rtentry *rt = (struct rtentry *)treenodes;
   65         struct sockaddr_in *sin = (struct sockaddr_in *)rt_key(rt);
   66 
   67         /*
   68          * A little bit of help for both IP output and input:
   69          *   For host routes, we make sure that RTF_BROADCAST
   70          *   is set for anything that looks like a broadcast address.
   71          *   This way, we can avoid an expensive call to in_broadcast()
   72          *   in ip_output() most of the time (because the route passed
   73          *   to ip_output() is almost always a host route).
   74          *
   75          *   We also do the same for local addresses, with the thought
   76          *   that this might one day be used to speed up ip_input().
   77          *
   78          * We also mark routes to multicast addresses as such, because
   79          * it's easy to do and might be useful (but this is much more
   80          * dubious since it's so easy to inspect the address).
   81          */
   82         if (rt->rt_flags & RTF_HOST) {
   83                 if (in_broadcast(sin->sin_addr, rt->rt_ifp)) {
   84                         rt->rt_flags |= RTF_BROADCAST;
   85                 } else if (satosin(rt->rt_ifa->ifa_addr)->sin_addr.s_addr ==
   86                     sin->sin_addr.s_addr) {
   87                         rt->rt_flags |= RTF_LOCAL;
   88                 }
   89         }
   90         if (IN_MULTICAST(ntohl(sin->sin_addr.s_addr)))
   91                 rt->rt_flags |= RTF_MULTICAST;
   92 
   93         if (rt->rt_ifp != NULL) {
   94 
   95                 /*
   96                  * Check route MTU:
   97                  * inherit interface MTU if not set or
   98                  * check if MTU is too large.
   99                  */
  100                 if (rt->rt_mtu == 0) {
  101                         rt->rt_mtu = rt->rt_ifp->if_mtu;
  102                 } else if (rt->rt_mtu > rt->rt_ifp->if_mtu)
  103                         rt->rt_mtu = rt->rt_ifp->if_mtu;
  104         }
  105 
  106         return (rn_addroute(v_arg, n_arg, head, treenodes));
  107 }
  108 
  109 static int _in_rt_was_here;
  110 /*
  111  * Initialize our routing tree.
  112  */
  113 int
  114 in_inithead(void **head, int off)
  115 {
  116         struct rib_head *rh;
  117 
  118         rh = rt_table_init(32);
  119         if (rh == NULL)
  120                 return (0);
  121 
  122         rh->rnh_addaddr = in_addroute;
  123         *head = (void *)rh;
  124 
  125         if (_in_rt_was_here == 0 ) {
  126                 _in_rt_was_here = 1;
  127         }
  128         return 1;
  129 }
  130 
  131 #ifdef VIMAGE
  132 int
  133 in_detachhead(void **head, int off)
  134 {
  135 
  136         rt_table_destroy((struct rib_head *)(*head));
  137         return (1);
  138 }
  139 #endif
  140 
  141 /*
  142  * This zaps old routes when the interface goes down or interface
  143  * address is deleted.  In the latter case, it deletes static routes
  144  * that point to this address.  If we don't do this, we may end up
  145  * using the old address in the future.  The ones we always want to
  146  * get rid of are things like ARP entries, since the user might down
  147  * the interface, walk over to a completely different network, and
  148  * plug back in.
  149  */
  150 struct in_ifadown_arg {
  151         struct ifaddr *ifa;
  152         int del;
  153 };
  154 
  155 static int
  156 in_ifadownkill(const struct rtentry *rt, void *xap)
  157 {
  158         struct in_ifadown_arg *ap = xap;
  159 
  160         if (rt->rt_ifa != ap->ifa)
  161                 return (0);
  162 
  163         if ((rt->rt_flags & RTF_STATIC) != 0 && ap->del == 0)
  164                 return (0);
  165 
  166         return (1);
  167 }
  168 
  169 void
  170 in_ifadown(struct ifaddr *ifa, int delete)
  171 {
  172         struct in_ifadown_arg arg;
  173 
  174         KASSERT(ifa->ifa_addr->sa_family == AF_INET,
  175             ("%s: wrong family", __func__));
  176 
  177         arg.ifa = ifa;
  178         arg.del = delete;
  179 
  180         rt_foreach_fib_walk_del(AF_INET, in_ifadownkill, &arg);
  181         ifa->ifa_flags &= ~IFA_ROUTE;           /* XXXlocking? */
  182 }
  183 
  184 /*
  185  * inet versions of rt functions. These have fib extensions and 
  186  * for now will just reference the _fib variants.
  187  * eventually this order will be reversed,
  188  */
  189 void
  190 in_rtalloc_ign(struct route *ro, u_long ignflags, u_int fibnum)
  191 {
  192         rtalloc_ign_fib(ro, ignflags, fibnum);
  193 }
  194 
  195 void
  196 in_rtredirect(struct sockaddr *dst,
  197         struct sockaddr *gateway,
  198         struct sockaddr *netmask,
  199         int flags,
  200         struct sockaddr *src,
  201         u_int fibnum)
  202 {
  203         rtredirect_fib(dst, gateway, netmask, flags, src, fibnum);
  204 }
  205  

Cache object: edfab891997e3cadd86fe55b0780ac83


[ 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.