"Fossies" - the Fresh Open Source Software Archive

Member "dhcpcd-9.4.1/src/route.h" (22 Oct 2021, 4850 Bytes) of package /linux/misc/dhcpcd-9.4.1.tar.xz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "route.h" see the Fossies "Dox" file reference documentation and the latest Fossies "Diffs" side-by-side code changes report: 9.4.0_vs_9.4.1.

    1 /* SPDX-License-Identifier: BSD-2-Clause */
    2 /*
    3  * dhcpcd - route management
    4  * Copyright (c) 2006-2021 Roy Marples <roy@marples.name>
    5  * All rights reserved
    6 
    7  * rEDISTRIBUTION AND USE IN SOURCE AND BINARY FORMS, WITH OR WITHOUT
    8  * modification, are permitted provided that the following conditions
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  *
   16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   26  * SUCH DAMAGE.
   27  */
   28 
   29 #ifndef ROUTE_H
   30 #define ROUTE_H
   31 
   32 #ifdef HAVE_SYS_RBTREE_H
   33 #include <sys/rbtree.h>
   34 #endif
   35 
   36 #include <sys/socket.h>
   37 #include <net/route.h>
   38 
   39 #include <stdbool.h>
   40 
   41 #include "dhcpcd.h"
   42 #include "sa.h"
   43 
   44 /*
   45  * Enable the route free list by default as
   46  * memory usage is still reported as low/unchanged even
   47  * when dealing with millions of routes.
   48  */
   49 #if !defined(RT_FREE_ROUTE_TABLE)
   50 #define RT_FREE_ROUTE_TABLE 1
   51 #elif RT_FREE_ROUTE_TABLE == 0
   52 #undef  RT_FREE_ROUTE_TABLE
   53 #endif
   54 
   55 /* Some systems have route metrics.
   56  * OpenBSD route priority is not this. */
   57 #ifndef HAVE_ROUTE_METRIC
   58 # if defined(__linux__)
   59 #  define HAVE_ROUTE_METRIC 1
   60 # endif
   61 #endif
   62 
   63 #ifdef __linux__
   64 # include <linux/version.h> /* RTA_PREF is only an enum.... */
   65 # if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)
   66 #  define HAVE_ROUTE_PREF
   67 # endif
   68 #endif
   69 
   70 #if defined(__OpenBSD__) || defined (__sun)
   71 #  define ROUTE_PER_GATEWAY
   72 /* XXX dhcpcd doesn't really support this yet.
   73  * But that's generally OK if only dhcpcd is managing routes. */
   74 #endif
   75 
   76 /* OpenBSD defines this as a "convienience" ..... we work around it. */
   77 #ifdef __OpenBSD__
   78 #undef rt_mtu
   79 #endif
   80 
   81 struct rt {
   82     union sa_ss     rt_ss_dest;
   83 #define rt_dest         rt_ss_dest.sa
   84     union sa_ss     rt_ss_netmask;
   85 #define rt_netmask      rt_ss_netmask.sa
   86     union sa_ss     rt_ss_gateway;
   87 #define rt_gateway      rt_ss_gateway.sa
   88     struct interface    *rt_ifp;
   89     union sa_ss     rt_ss_ifa;
   90 #define rt_ifa          rt_ss_ifa.sa
   91     unsigned int        rt_flags;
   92     unsigned int        rt_mtu;
   93 #ifdef HAVE_ROUTE_METRIC
   94     unsigned int        rt_metric;
   95 #endif
   96 /* Maximum interface index is generally USHORT_MAX or 65535.
   97  * Add some padding for other stuff and we get offsets for the
   98  * below that should work automatically.
   99  * This is only an issue if the user defines higher metrics in
  100  * their configuration, but then they might wish to override also. */
  101 #define RTMETRIC_BASE          1000U
  102 #define RTMETRIC_WIRELESS      2000U
  103 #define RTMETRIC_IPV4LL     1000000U
  104 #define RTMETRIC_ROAM       2000000U
  105 #ifdef HAVE_ROUTE_PREF
  106     int         rt_pref;
  107 #endif
  108 #define RTPREF_HIGH 1
  109 #define RTPREF_MEDIUM   0   /* has to be zero */
  110 #define RTPREF_LOW  (-1)
  111 #define RTPREF_RESERVED (-2)
  112 #define RTPREF_INVALID  (-3)    /* internal */
  113     unsigned int        rt_dflags;
  114 #define RTDF_IFA_ROUTE      0x01        /* Address generated route */
  115 #define RTDF_FAKE       0x02        /* Maybe us on lease reboot */
  116 #define RTDF_IPV4LL     0x04        /* IPv4LL route */
  117 #define RTDF_RA         0x08        /* Router Advertisement */
  118 #define RTDF_DHCP       0x10        /* DHCP route */
  119 #define RTDF_STATIC     0x20        /* Configured in dhcpcd */
  120 #define RTDF_GATELINK       0x40        /* Gateway is on link */
  121     size_t          rt_order;
  122     rb_node_t       rt_tree;
  123 };
  124 
  125 extern const rb_tree_ops_t rt_compare_list_ops;
  126 extern const rb_tree_ops_t rt_compare_proto_ops;
  127 
  128 void rt_init(struct dhcpcd_ctx *);
  129 void rt_dispose(struct dhcpcd_ctx *);
  130 void rt_free(struct rt *);
  131 void rt_freeif(struct interface *);
  132 bool rt_is_default(const struct rt *);
  133 void rt_headclear0(struct dhcpcd_ctx *, rb_tree_t *, int);
  134 void rt_headclear(rb_tree_t *, int);
  135 void rt_headfreeif(rb_tree_t *);
  136 struct rt * rt_new0(struct dhcpcd_ctx *);
  137 void rt_setif(struct rt *, struct interface *);
  138 struct rt * rt_new(struct interface *);
  139 struct rt * rt_proto_add_ctx(rb_tree_t *, struct rt *, struct dhcpcd_ctx *);
  140 struct rt * rt_proto_add(rb_tree_t *, struct rt *);
  141 int rt_cmp_dest(const struct rt *, const struct rt *);
  142 void rt_recvrt(int, const struct rt *, pid_t);
  143 void rt_build(struct dhcpcd_ctx *, int);
  144 
  145 #endif