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

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2020 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             : /**
      17             :  * @file
      18             :  * @brief IP prefix management on interfaces
      19             :  */
      20             : 
      21             : #ifndef included_ip_interface_h
      22             : #define included_ip_interface_h
      23             : 
      24             : #include <vnet/ip/lookup.h>
      25             : 
      26             : clib_error_t *ip_interface_address_add (ip_lookup_main_t * lm,
      27             :                                         u32 sw_if_index,
      28             :                                         void *address,
      29             :                                         u32 address_length,
      30             :                                         u32 * result_index);
      31             : clib_error_t *ip_interface_address_del (ip_lookup_main_t * lm,
      32             :                                         vnet_main_t * vnm,
      33             :                                         u32 addr_index, void *address,
      34             :                                         u32 address_length, u32 sw_if_index);
      35             : void *ip_interface_get_first_ip (u32 sw_if_index, u8 is_ip4);
      36             : void ip_interface_address_mark (void);
      37             : void ip_interface_address_sweep (void);
      38             : u32 ip_interface_address_find (ip_lookup_main_t * lm,
      39             :                                void *addr_fib, u32 address_length);
      40             : u8 ip_interface_has_address (u32 sw_if_index, ip46_address_t * ip, u8 is_ip4);
      41             : walk_rc_t ip_interface_address_mark_one_interface (vnet_main_t *vnm,
      42             :                                                    vnet_sw_interface_t *si,
      43             :                                                    void *ctx);
      44             : 
      45             : always_inline void *
      46       23947 : ip_interface_address_get_address (ip_lookup_main_t * lm,
      47             :                                   ip_interface_address_t * a)
      48             : {
      49       23947 :   return mhash_key_to_mem (&lm->address_to_if_address_index, a->address_key);
      50             : }
      51             : 
      52             : always_inline ip_interface_prefix_t *
      53        9053 : ip_get_interface_prefix (ip_lookup_main_t * lm, ip_interface_prefix_key_t * k)
      54             : {
      55        9053 :   uword *p = mhash_get (&lm->prefix_to_if_prefix_index, k);
      56        9053 :   return p ? pool_elt_at_index (lm->if_prefix_pool, p[0]) : 0;
      57             : }
      58             : 
      59             : /* *INDENT-OFF* */
      60             : #define foreach_ip_interface_address(lm,a,sw_if_index,loop,body)        \
      61             : do {                                                                    \
      62             :     vnet_main_t *_vnm = vnet_get_main();                                \
      63             :     u32 _sw_if_index = sw_if_index;                                     \
      64             :     vnet_sw_interface_t *_swif;                                         \
      65             :     _swif = vnet_get_sw_interface (_vnm, _sw_if_index);                 \
      66             :                                                                         \
      67             :     /*                                                                  \
      68             :      * Loop => honor unnumbered interface addressing.                   \
      69             :      */                                                                 \
      70             :     if (_swif->flags & VNET_SW_INTERFACE_FLAG_UNNUMBERED)               \
      71             :       {                                                                 \
      72             :         if (loop)                                                       \
      73             :           _sw_if_index = _swif->unnumbered_sw_if_index;                 \
      74             :         else                                                            \
      75             :           /* the interface is unnumbered, by the caller does not want   \
      76             :            * unnumbered interfaces considered/honoured */               \
      77             :           break;                                                        \
      78             :       }                                                                 \
      79             :     u32 _ia = ((vec_len((lm)->if_address_pool_index_by_sw_if_index)     \
      80             :                 > (_sw_if_index)) ?                                     \
      81             :                vec_elt ((lm)->if_address_pool_index_by_sw_if_index,     \
      82             :                         (_sw_if_index)) :                               \
      83             :                (u32)~0);                                                \
      84             :     ip_interface_address_t * _a;                                        \
      85             :     while (_ia != ~0)                                                   \
      86             :     {                                                                   \
      87             :         _a = pool_elt_at_index ((lm)->if_address_pool, _ia);            \
      88             :         _ia = _a->next_this_sw_interface;                               \
      89             :         (a) = _a;                                                       \
      90             :         body;                                                           \
      91             :     }                                                                   \
      92             : } while (0)
      93             : /* *INDENT-ON* */
      94             : 
      95             : #endif /* included_ip_interface_h */
      96             : 
      97             : /*
      98             :  * fd.io coding-style-patch-verification: ON
      99             :  *
     100             :  * Local Variables:
     101             :  * eval: (c-set-style "gnu")
     102             :  * End:
     103             :  */

Generated by: LCOV version 1.14