LCOV - code coverage report
Current view: top level - vnet/ip - ip4.h (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 6 13 46.2 %
Date: 2023-10-26 01:39:38 Functions: 2 3 66.7 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2015 Cisco and/or its affiliates.
       3             :  * Licensed under the Apache License, Version 2.0 (the "License");
       4             :  * you may not use this file except in compliance with the License.
       5             :  * You may obtain a copy of the License at:
       6             :  *
       7             :  *     http://www.apache.org/licenses/LICENSE-2.0
       8             :  *
       9             :  * Unless required by applicable law or agreed to in writing, software
      10             :  * distributed under the License is distributed on an "AS IS" BASIS,
      11             :  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      12             :  * See the License for the specific language governing permissions and
      13             :  * limitations under the License.
      14             :  */
      15             : /*
      16             :  * ip/ip4.h: ip4 main include file
      17             :  *
      18             :  * Copyright (c) 2008 Eliot Dresselhaus
      19             :  *
      20             :  * Permission is hereby granted, free of charge, to any person obtaining
      21             :  * a copy of this software and associated documentation files (the
      22             :  * "Software"), to deal in the Software without restriction, including
      23             :  * without limitation the rights to use, copy, modify, merge, publish,
      24             :  * distribute, sublicense, and/or sell copies of the Software, and to
      25             :  * permit persons to whom the Software is furnished to do so, subject to
      26             :  * the following conditions:
      27             :  *
      28             :  * The above copyright notice and this permission notice shall be
      29             :  * included in all copies or substantial portions of the Software.
      30             :  *
      31             :  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
      32             :  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
      33             :  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
      34             :  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
      35             :  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
      36             :  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
      37             :  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
      38             :  */
      39             : 
      40             : #ifndef included_ip_ip4_h
      41             : #define included_ip_ip4_h
      42             : 
      43             : #include <vnet/ip/ip4_packet.h>
      44             : #include <vnet/ip/ip_flow_hash.h>
      45             : 
      46             : #include <vnet/ip/lookup.h>
      47             : #include <vnet/ip/ip_interface.h>
      48             : #include <vnet/buffer.h>
      49             : #include <vnet/feature/feature.h>
      50             : #include <vnet/ip/icmp46_packet.h>
      51             : 
      52             : typedef struct ip4_mfib_t
      53             : {
      54             :   /* Hash table for each prefix length mapping. */
      55             :   uword *fib_entry_by_dst_address[65];
      56             : 
      57             :   /* Table ID (hash key) for this FIB. */
      58             :   u32 table_id;
      59             : 
      60             :   /* Index into FIB vector. */
      61             :   u32 index;
      62             : } ip4_mfib_t;
      63             : 
      64             : struct ip4_main_t;
      65             : 
      66             : typedef void (ip4_add_del_interface_address_function_t)
      67             :   (struct ip4_main_t * im,
      68             :    uword opaque,
      69             :    u32 sw_if_index,
      70             :    ip4_address_t * address,
      71             :    u32 address_length, u32 if_address_index, u32 is_del);
      72             : 
      73             : typedef struct
      74             : {
      75             :   ip4_add_del_interface_address_function_t *function;
      76             :   uword function_opaque;
      77             : } ip4_add_del_interface_address_callback_t;
      78             : 
      79             : typedef void (ip4_enable_disable_interface_function_t)
      80             :   (struct ip4_main_t * im, uword opaque, u32 sw_if_index, u32 is_enable);
      81             : 
      82             : typedef struct
      83             : {
      84             :   ip4_enable_disable_interface_function_t *function;
      85             :   uword function_opaque;
      86             : } ip4_enable_disable_interface_callback_t;
      87             : 
      88             : typedef void (ip4_table_bind_function_t)
      89             :   (struct ip4_main_t * im,
      90             :    uword opaque, u32 sw_if_index, u32 new_fib_index, u32 old_fib_index);
      91             : 
      92             : typedef struct
      93             : {
      94             :   ip4_table_bind_function_t *function;
      95             :   uword function_opaque;
      96             : } ip4_table_bind_callback_t;
      97             : 
      98             : /**
      99             :  * @brief IPv4 main type.
     100             :  *
     101             :  * State of IPv4 VPP processing including:
     102             :  * - FIBs
     103             :  * - Feature indices used in feature topological sort
     104             :  * - Feature node run time references
     105             :  */
     106             : 
     107             : typedef struct ip4_main_t
     108             : {
     109             :   ip_lookup_main_t lookup_main;
     110             : 
     111             :   /** Vector of FIBs. */
     112             :   struct fib_table_t_ *fibs;
     113             : 
     114             :   /** Vector of MFIBs. */
     115             :   struct mfib_table_t_ *mfibs;
     116             : 
     117             :   u32 fib_masks[33];
     118             : 
     119             :   /** Table index indexed by software interface. */
     120             :   u32 *fib_index_by_sw_if_index;
     121             : 
     122             :   /** Table index indexed by software interface. */
     123             :   u32 *mfib_index_by_sw_if_index;
     124             : 
     125             :   /* IP4 enabled count by software interface */
     126             :   u8 *ip_enabled_by_sw_if_index;
     127             : 
     128             :   /** Hash table mapping table id to fib index.
     129             :      ID space is not necessarily dense; index space is dense. */
     130             :   uword *fib_index_by_table_id;
     131             : 
     132             :   /** Hash table mapping table id to multicast fib index.
     133             :      ID space is not necessarily dense; index space is dense. */
     134             :   uword *mfib_index_by_table_id;
     135             : 
     136             :   /** Functions to call when interface address changes. */
     137             :     ip4_add_del_interface_address_callback_t
     138             :     * add_del_interface_address_callbacks;
     139             : 
     140             :   /** Functions to call when interface becomes IPv4 enabled/disable. */
     141             :     ip4_enable_disable_interface_callback_t
     142             :     * enable_disable_interface_callbacks;
     143             : 
     144             :   /** Functions to call when interface to table biding changes. */
     145             :   ip4_table_bind_callback_t *table_bind_callbacks;
     146             : 
     147             :   /** Template used to generate IP4 ARP packets. */
     148             :   vlib_packet_template_t ip4_arp_request_packet_template;
     149             : 
     150             :   /** Seed for Jenkins hash used to compute ip4 flow hash. */
     151             :   u32 flow_hash_seed;
     152             : 
     153             :   /** @brief Template information for VPP generated packets */
     154             :   struct
     155             :   {
     156             :     /** TTL to use for host generated packets. */
     157             :     u8 ttl;
     158             : 
     159             :     /** TOS byte to use for host generated packets. */
     160             :     u8 tos;
     161             : 
     162             :     u8 pad[2];
     163             :   } host_config;
     164             : 
     165             :   u16 msg_id_base;
     166             : } ip4_main_t;
     167             : 
     168             : #define ARP_THROTTLE_BITS       (512)
     169             : 
     170             : /** Global ip4 main structure. */
     171             : extern ip4_main_t ip4_main;
     172             : 
     173             : /** Global ip4 input node.  Errors get attached to ip4 input node. */
     174             : extern vlib_node_registration_t ip4_input_node;
     175             : extern vlib_node_registration_t ip4_lookup_node;
     176             : extern vlib_node_registration_t ip4_local_node;
     177             : extern vlib_node_registration_t ip4_rewrite_node;
     178             : extern vlib_node_registration_t ip4_rewrite_mcast_node;
     179             : extern vlib_node_registration_t ip4_rewrite_local_node;
     180             : extern vlib_node_registration_t ip4_arp_node;
     181             : extern vlib_node_registration_t ip4_glean_node;
     182             : extern vlib_node_registration_t ip4_midchain_node;
     183             : extern vlib_node_registration_t ip4_punt_node;
     184             : 
     185             : always_inline uword
     186      160858 : ip4_destination_matches_route (const ip4_main_t * im,
     187             :                                const ip4_address_t * key,
     188             :                                const ip4_address_t * dest, uword dest_length)
     189             : {
     190      160858 :   return 0 == ((key->data_u32 ^ dest->data_u32) & im->fib_masks[dest_length]);
     191             : }
     192             : 
     193             : always_inline uword
     194             : ip4_destination_matches_interface (ip4_main_t * im,
     195             :                                    ip4_address_t * key,
     196             :                                    ip_interface_address_t * ia)
     197             : {
     198             :   ip4_address_t *a = ip_interface_address_get_address (&im->lookup_main, ia);
     199             :   return ip4_destination_matches_route (im, key, a, ia->address_length);
     200             : }
     201             : 
     202             : /* Find interface address which matches destination. */
     203             : always_inline ip4_address_t *
     204           0 : ip4_interface_address_matching_destination (ip4_main_t * im,
     205             :                                             const ip4_address_t * dst,
     206             :                                             u32 sw_if_index,
     207             :                                             ip_interface_address_t **
     208             :                                             result_ia)
     209             : {
     210           0 :   ip_lookup_main_t *lm = &im->lookup_main;
     211             :   ip_interface_address_t *ia;
     212           0 :   ip4_address_t *result = 0;
     213             : 
     214             :   /* *INDENT-OFF* */
     215           0 :   foreach_ip_interface_address (lm, ia, sw_if_index,
     216             :                                 1 /* honor unnumbered */,
     217             :   ({
     218             :     ip4_address_t * a = ip_interface_address_get_address (lm, ia);
     219             :     if (ip4_destination_matches_route (im, dst, a, ia->address_length))
     220             :       {
     221             :         result = a;
     222             :         break;
     223             :       }
     224             :   }));
     225             :   /* *INDENT-ON* */
     226           0 :   if (result_ia)
     227           0 :     *result_ia = result ? ia : 0;
     228           0 :   return result;
     229             : }
     230             : 
     231             : ip4_address_t *ip4_interface_first_address (ip4_main_t * im, u32 sw_if_index,
     232             :                                             ip_interface_address_t **
     233             :                                             result_ia);
     234             : 
     235             : clib_error_t *ip4_add_del_interface_address (vlib_main_t * vm,
     236             :                                              u32 sw_if_index,
     237             :                                              ip4_address_t * address,
     238             :                                              u32 address_length, u32 is_del);
     239             : 
     240             : void ip4_directed_broadcast (u32 sw_if_index, u8 enable);
     241             : 
     242             : void ip4_sw_interface_enable_disable (u32 sw_if_index, u32 is_enable);
     243             : 
     244             : int ip4_address_compare (ip4_address_t * a1, ip4_address_t * a2);
     245             : 
     246             : uword
     247             : ip4_udp_register_listener (vlib_main_t * vm,
     248             :                            u16 dst_port, u32 next_node_index);
     249             : 
     250             : u16 ip4_tcp_udp_compute_checksum (vlib_main_t * vm, vlib_buffer_t * p0,
     251             :                                   ip4_header_t * ip0);
     252             : 
     253             : void ip4_register_protocol (u32 protocol, u32 node_index);
     254             : void ip4_unregister_protocol (u32 protocolx);
     255             : 
     256             : serialize_function_t serialize_vnet_ip4_main, unserialize_vnet_ip4_main;
     257             : 
     258             : int vnet_set_ip4_classify_intfc (vlib_main_t * vm, u32 sw_if_index,
     259             :                                  u32 table_index);
     260             : 
     261             : void ip4_punt_policer_add_del (u8 is_add, u32 policer_index);
     262             : 
     263             : void ip4_punt_redirect_add_paths (u32 rx_sw_if_index,
     264             :                                   const fib_route_path_t *paths);
     265             : 
     266             : void ip4_punt_redirect_del (u32 rx_sw_if_index);
     267             : 
     268             : 
     269             : void
     270             : ip4_forward_next_trace (vlib_main_t * vm,
     271             :                         vlib_node_runtime_t * node,
     272             :                         vlib_frame_t * frame,
     273             :                         vlib_rx_or_tx_t which_adj_index);
     274             : 
     275             : u8 *format_ip4_forward_next_trace (u8 * s, va_list * args);
     276             : 
     277             : u32 ip4_tcp_udp_validate_checksum (vlib_main_t * vm, vlib_buffer_t * p0);
     278             : 
     279             : always_inline u32
     280          53 : vlib_buffer_get_ip4_fib_index (vlib_buffer_t * b)
     281             : {
     282             :   u32 fib_index, sw_if_index;
     283          53 :   sw_if_index = vnet_buffer (b)->sw_if_index[VLIB_RX];
     284          53 :   fib_index = vnet_buffer (b)->sw_if_index[VLIB_TX];
     285             :   return (fib_index == (u32) ~ 0) ?
     286          53 :     vec_elt (ip4_main.fib_index_by_sw_if_index, sw_if_index) : fib_index;
     287             : }
     288             : 
     289             : #endif /* included_ip_ip4_h */
     290             : 
     291             : /*
     292             :  * fd.io coding-style-patch-verification: ON
     293             :  *
     294             :  * Local Variables:
     295             :  * eval: (c-set-style "gnu")
     296             :  * End:
     297             :  */

Generated by: LCOV version 1.14