LCOV - code coverage report
Current view: top level - plugins/gre - gre.h (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 31 31 100.0 %
Date: 2023-10-26 01:39:38 Functions: 6 6 100.0 %

          Line data    Source code
       1             : /*
       2             :  * gre.h: types/functions for gre.
       3             :  *
       4             :  * Copyright (c) 2012 Cisco and/or its affiliates.
       5             :  * Licensed under the Apache License, Version 2.0 (the "License");
       6             :  * you may not use this file except in compliance with the License.
       7             :  * You may obtain a copy of the License at:
       8             :  *
       9             :  *     http://www.apache.org/licenses/LICENSE-2.0
      10             :  *
      11             :  * Unless required by applicable law or agreed to in writing, software
      12             :  * distributed under the License is distributed on an "AS IS" BASIS,
      13             :  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      14             :  * See the License for the specific language governing permissions and
      15             :  * limitations under the License.
      16             :  */
      17             : 
      18             : #ifndef included_gre_h
      19             : #define included_gre_h
      20             : 
      21             : #include <vnet/vnet.h>
      22             : #include <vnet/gre/packet.h>
      23             : #include <vnet/ip/ip.h>
      24             : #include <vnet/ip/format.h>
      25             : #include <vnet/adj/adj_types.h>
      26             : #include <vnet/tunnel/tunnel.h>
      27             : #include <vnet/teib/teib.h>
      28             : 
      29             : extern vnet_hw_interface_class_t gre_hw_interface_class;
      30             : extern vnet_hw_interface_class_t mgre_hw_interface_class;
      31             : 
      32             : typedef enum
      33             : {
      34             : #define gre_error(n,s) GRE_ERROR_##n,
      35             : #include <gre/error.def>
      36             : #undef gre_error
      37             :   GRE_N_ERROR,
      38             : } gre_error_t;
      39             : 
      40             : /**
      41             :  * L3: GRE (i.e. this tunnel is in L3 mode)
      42             :  * TEB: Transparent Ethernet Bridging - the tunnel is in L2 mode
      43             :  * ERSPAN: type 2 - the tunnel is for port mirror SPAN output. Each tunnel is
      44             :  *         associated with a session ID and expected to be used for encap
      45             :  *         and output of mirrored packet from a L2 network only. There is
      46             :  *         no support for receiving ERSPAN packets from a GRE ERSPAN tunnel
      47             :  */
      48             : #define foreach_gre_tunnel_type \
      49             :   _(L3, "L3")                   \
      50             :   _(TEB, "TEB")                 \
      51             :   _(ERSPAN, "ERSPAN")           \
      52             : 
      53             : /**
      54             :  * @brief The GRE tunnel type
      55             :  */
      56             : typedef enum gre_tunnel_type_t_
      57             : {
      58             : #define _(n, s) GRE_TUNNEL_TYPE_##n,
      59             :   foreach_gre_tunnel_type
      60             : #undef _
      61             : } __clib_packed gre_tunnel_type_t;
      62             : 
      63             : extern u8 *format_gre_tunnel_type (u8 * s, va_list * args);
      64             : 
      65             : 
      66             : /**
      67             :  * A GRE payload protocol registration
      68             :  */
      69             : typedef struct
      70             : {
      71             :   /** Name (a c string). */
      72             :   char *name;
      73             : 
      74             :   /** GRE protocol type in host byte order. */
      75             :   gre_protocol_t protocol;
      76             : 
      77             :   /** GRE tunnel type */
      78             :   gre_tunnel_type_t tunnel_type;
      79             : 
      80             :   /** Node which handles this type. */
      81             :   u32 node_index;
      82             : 
      83             :   /** Next index for this type. */
      84             :   u32 next_index;
      85             : } gre_protocol_info_t;
      86             : 
      87             : /**
      88             :  * Elements of the GRE key that are common for v6 and v6 addresses
      89             :  */
      90             : typedef struct gre_tunnel_key_common_t_
      91             : {
      92             :   union
      93             :   {
      94             :     struct
      95             :     {
      96             :       u32 fib_index;
      97             :       u16 session_id;
      98             :       gre_tunnel_type_t type;
      99             :       tunnel_mode_t mode;
     100             :     };
     101             :     u64 as_u64;
     102             :   };
     103             : } gre_tunnel_key_common_t;
     104             : 
     105             : STATIC_ASSERT_SIZEOF (gre_tunnel_key_common_t, sizeof (u64));
     106             : 
     107             : /**
     108             :  * @brief Key for a IPv4 GRE Tunnel
     109             :  */
     110             : typedef struct gre_tunnel_key4_t_
     111             : {
     112             :   /**
     113             :    * Source and destination IP addresses
     114             :    */
     115             :   union
     116             :   {
     117             :     struct
     118             :     {
     119             :       ip4_address_t gtk_src;
     120             :       ip4_address_t gtk_dst;
     121             :     };
     122             :     u64 gtk_as_u64;
     123             :   };
     124             : 
     125             :   /** address independent attributes */
     126             :   gre_tunnel_key_common_t gtk_common;
     127             : } __attribute__ ((packed)) gre_tunnel_key4_t;
     128             : 
     129             : STATIC_ASSERT_SIZEOF (gre_tunnel_key4_t, 2 * sizeof (u64));
     130             : 
     131             : /**
     132             :  * @brief Key for a IPv6 GRE Tunnel
     133             :  * We use a different type so that the V4 key hash is as small as possible
     134             :  */
     135             : typedef struct gre_tunnel_key6_t_
     136             : {
     137             :   /**
     138             :    * Source and destination IP addresses
     139             :    */
     140             :   ip6_address_t gtk_src;
     141             :   ip6_address_t gtk_dst;
     142             : 
     143             :   /** address independent attributes */
     144             :   gre_tunnel_key_common_t gtk_common;
     145             : } __attribute__ ((packed)) gre_tunnel_key6_t;
     146             : 
     147             : STATIC_ASSERT_SIZEOF (gre_tunnel_key6_t, 5 * sizeof (u64));
     148             : 
     149             : /**
     150             :  * Union of the two possible key types
     151             :  */
     152             : typedef union gre_tunnel_key_t_
     153             : {
     154             :   gre_tunnel_key4_t gtk_v4;
     155             :   gre_tunnel_key6_t gtk_v6;
     156             : } gre_tunnel_key_t;
     157             : 
     158             : /**
     159             :  * The session ID is only a 10 bit value
     160             :  */
     161             : #define GTK_SESSION_ID_MAX (0x3ff)
     162             : 
     163             : /**
     164             :  * Used for GRE header seq number generation for ERSPAN encap
     165             :  */
     166             : typedef struct
     167             : {
     168             :   u32 seq_num;
     169             :   u32 ref_count;
     170             : } gre_sn_t;
     171             : 
     172             : /**
     173             :  * Hash key for GRE header seq number generation for ERSPAN encap
     174             :  */
     175             : typedef struct
     176             : {
     177             :   ip46_address_t src;
     178             :   ip46_address_t dst;
     179             :   u32 fib_index;
     180             : } gre_sn_key_t;
     181             : 
     182             : /**
     183             :  * @brief A representation of a GRE tunnel
     184             :  */
     185             : typedef struct
     186             : {
     187             :   /**
     188             :    * Required for pool_get_aligned
     189             :    */
     190             :   CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
     191             : 
     192             :   /**
     193             :    * The tunnel's source/local address
     194             :    */
     195             :   ip46_address_t tunnel_src;
     196             :   /**
     197             :    * The tunnel's destination/remote address
     198             :    */
     199             :   fib_prefix_t tunnel_dst;
     200             :   /**
     201             :    * The FIB in which the src.dst address are present
     202             :    */
     203             :   u32 outer_fib_index;
     204             :   u32 hw_if_index;
     205             :   u32 sw_if_index;
     206             :   gre_tunnel_type_t type;
     207             :   tunnel_mode_t mode;
     208             :   tunnel_encap_decap_flags_t flags;
     209             : 
     210             :   /**
     211             :    * an L2 tunnel always rquires an L2 midchain. cache here for DP.
     212             :    */
     213             :   adj_index_t l2_adj_index;
     214             : 
     215             :   /**
     216             :    * ERSPAN type 2 session ID, least significant 10 bits of u16
     217             :    */
     218             :   u16 session_id;
     219             : 
     220             :   /**
     221             :    * GRE header sequence number (SN) used for ERSPAN type 2 header, must be
     222             :    * bumped automically to be thread safe. As multiple GRE tunnels are created
     223             :    * for the same fib-idx/DIP/SIP with different ERSPAN session number, they all
     224             :    * share the same SN which is kept per FIB/DIP/SIP, as specified by RFC2890.
     225             :    */
     226             :   gre_sn_t *gre_sn;
     227             : 
     228             : 
     229             :   u32 dev_instance;             /* Real device instance in tunnel vector */
     230             :   u32 user_instance;            /* Instance name being shown to user */
     231             : } gre_tunnel_t;
     232             : 
     233             : typedef struct
     234             : {
     235             :   u8 next_index;
     236             :   u8 tunnel_type;
     237             : } next_info_t;
     238             : 
     239             : /**
     240             :  * @brief GRE related global data
     241             :  */
     242             : typedef struct
     243             : {
     244             :   /**
     245             :    * pool of tunnel instances
     246             :    */
     247             :   gre_tunnel_t *tunnels;
     248             : 
     249             :   /**
     250             :    * GRE payload protocol registrations
     251             :    */
     252             :   gre_protocol_info_t *protocol_infos;
     253             : 
     254             :   /**
     255             :    *  Hash tables mapping name/protocol to protocol info index.
     256             :    */
     257             :   uword *protocol_info_by_name, *protocol_info_by_protocol;
     258             : 
     259             :   /**
     260             :    * Hash mapping to tunnels with ipv4 src/dst addr
     261             :    */
     262             :   uword *tunnel_by_key4;
     263             : 
     264             :   /**
     265             :    * Hash mapping to tunnels with ipv6 src/dst addr
     266             :    */
     267             :   uword *tunnel_by_key6;
     268             : 
     269             :   /**
     270             :    * Hash mapping tunnel src/dst addr and fib-idx to sequence number
     271             :    */
     272             :   uword *seq_num_by_key;
     273             : 
     274             :   /**
     275             :    * Mapping from sw_if_index to tunnel index
     276             :    */
     277             :   u32 *tunnel_index_by_sw_if_index;
     278             : 
     279             :   /* Sparse vector mapping gre protocol in network byte order
     280             :      to next index. */
     281             :   next_info_t *next_by_protocol;
     282             : 
     283             :   /* convenience */
     284             :   vlib_main_t *vlib_main;
     285             :   vnet_main_t *vnet_main;
     286             : 
     287             :   /* Record used instances */
     288             :   uword *instance_used;
     289             : 
     290             :   u16 msg_id_base;
     291             : } gre_main_t;
     292             : 
     293             : /**
     294             :  * @brief IPv4 and GRE header.
     295             :  */
     296             : /* *INDENT-OFF* */
     297             : typedef CLIB_PACKED (struct {
     298             :   ip4_header_t ip4;
     299             :   gre_header_t gre;
     300             : }) ip4_and_gre_header_t;
     301             : /* *INDENT-ON* */
     302             : 
     303             : /**
     304             :  * @brief IPv6 and GRE header.
     305             :  */
     306             : /* *INDENT-OFF* */
     307             : typedef CLIB_PACKED (struct {
     308             :   ip6_header_t ip6;
     309             :   gre_header_t gre;
     310             : }) ip6_and_gre_header_t;
     311             : /* *INDENT-ON* */
     312             : 
     313             : always_inline gre_protocol_info_t *
     314       18827 : gre_get_protocol_info (gre_main_t * em, gre_protocol_t protocol)
     315             : {
     316       18827 :   uword *p = hash_get (em->protocol_info_by_protocol, protocol);
     317       18827 :   return p ? vec_elt_at_index (em->protocol_infos, p[0]) : 0;
     318             : }
     319             : 
     320             : extern gre_main_t gre_main;
     321             : 
     322             : extern clib_error_t *gre_interface_admin_up_down (vnet_main_t * vnm,
     323             :                                                   u32 hw_if_index, u32 flags);
     324             : 
     325             : extern void gre_tunnel_stack (adj_index_t ai);
     326             : extern void gre_update_adj (vnet_main_t * vnm,
     327             :                             u32 sw_if_index, adj_index_t ai);
     328             : 
     329             : typedef struct mgre_walk_ctx_t_
     330             : {
     331             :   const gre_tunnel_t *t;
     332             :   const teib_entry_t *ne;
     333             : } mgre_walk_ctx_t;
     334             : 
     335             : adj_walk_rc_t mgre_mk_complete_walk (adj_index_t ai, void *data);
     336             : adj_walk_rc_t mgre_mk_incomplete_walk (adj_index_t ai, void *data);
     337             : 
     338             : format_function_t format_gre_protocol;
     339             : format_function_t format_gre_header;
     340             : format_function_t format_gre_header_with_length;
     341             : 
     342             : extern vlib_node_registration_t gre4_input_node;
     343             : extern vlib_node_registration_t gre6_input_node;
     344             : extern vlib_node_registration_t gre_erspan_encap_node;
     345             : extern vlib_node_registration_t gre_teb_encap_node;
     346             : extern vnet_device_class_t gre_device_class;
     347             : 
     348             : /* Parse gre protocol as 0xXXXX or protocol name.
     349             :    In either host or network byte order. */
     350             : unformat_function_t unformat_gre_protocol_host_byte_order;
     351             : unformat_function_t unformat_gre_protocol_net_byte_order;
     352             : 
     353             : /* Parse gre header. */
     354             : unformat_function_t unformat_gre_header;
     355             : unformat_function_t unformat_pg_gre_header;
     356             : 
     357             : void
     358             : gre_register_input_protocol (vlib_main_t * vm, gre_protocol_t protocol,
     359             :                              u32 node_index, gre_tunnel_type_t tunnel_type);
     360             : 
     361             : /* manually added to the interface output node in gre.c */
     362             : #define GRE_OUTPUT_NEXT_LOOKUP  1
     363             : 
     364             : typedef struct
     365             : {
     366             :   u8 is_add;
     367             :   gre_tunnel_type_t type;
     368             :   tunnel_mode_t mode;
     369             :   u8 is_ipv6;
     370             :   u32 instance;
     371             :   ip46_address_t src, dst;
     372             :   u32 outer_table_id;
     373             :   u16 session_id;
     374             :   tunnel_encap_decap_flags_t flags;
     375             : } vnet_gre_tunnel_add_del_args_t;
     376             : 
     377             : extern int vnet_gre_tunnel_add_del (vnet_gre_tunnel_add_del_args_t * a,
     378             :                                     u32 * sw_if_indexp);
     379             : 
     380             : static inline void
     381        9165 : gre_mk_key4 (ip4_address_t src,
     382             :              ip4_address_t dst,
     383             :              u32 fib_index,
     384             :              gre_tunnel_type_t ttype,
     385             :              tunnel_mode_t tmode, u16 session_id, gre_tunnel_key4_t * key)
     386             : {
     387        9165 :   key->gtk_src = src;
     388        9165 :   key->gtk_dst = dst;
     389        9165 :   key->gtk_common.type = ttype;
     390        9165 :   key->gtk_common.mode = tmode;
     391        9165 :   key->gtk_common.fib_index = fib_index;
     392        9165 :   key->gtk_common.session_id = session_id;
     393        9165 : }
     394             : 
     395             : static inline int
     396        8996 : gre_match_key4 (const gre_tunnel_key4_t * key1,
     397             :                 const gre_tunnel_key4_t * key2)
     398             : {
     399       16343 :   return ((key1->gtk_as_u64 == key2->gtk_as_u64) &&
     400        7347 :           (key1->gtk_common.as_u64 == key2->gtk_common.as_u64));
     401             : }
     402             : 
     403             : static inline void
     404        3689 : gre_mk_key6 (const ip6_address_t * src,
     405             :              const ip6_address_t * dst,
     406             :              u32 fib_index,
     407             :              gre_tunnel_type_t ttype,
     408             :              tunnel_mode_t tmode, u16 session_id, gre_tunnel_key6_t * key)
     409             : {
     410        3689 :   key->gtk_src = *src;
     411        3689 :   key->gtk_dst = *dst;
     412        3689 :   key->gtk_common.type = ttype;
     413        3689 :   key->gtk_common.mode = tmode;
     414        3689 :   key->gtk_common.fib_index = fib_index;
     415        3689 :   key->gtk_common.session_id = session_id;
     416        3689 : }
     417             : 
     418             : static inline int
     419        3617 : gre_match_key6 (const gre_tunnel_key6_t * key1,
     420             :                 const gre_tunnel_key6_t * key2)
     421             : {
     422        7187 :   return (ip6_address_is_equal (&key1->gtk_src, &key2->gtk_src) &&
     423        7187 :           ip6_address_is_equal (&key1->gtk_dst, &key2->gtk_dst) &&
     424        3570 :           (key1->gtk_common.as_u64 == key2->gtk_common.as_u64));
     425             : }
     426             : 
     427             : static inline void
     428           2 : gre_mk_sn_key (const gre_tunnel_t * gt, gre_sn_key_t * key)
     429             : {
     430           2 :   key->src = gt->tunnel_src;
     431           2 :   key->dst = gt->tunnel_dst.fp_addr;
     432           2 :   key->fib_index = gt->outer_fib_index;
     433           2 : }
     434             : 
     435             : #endif /* included_gre_h */
     436             : 
     437             : /*
     438             :  * fd.io coding-style-patch-verification: ON
     439             :  *
     440             :  * Local Variables:
     441             :  * eval: (c-set-style "gnu")
     442             :  * End:
     443             :  */

Generated by: LCOV version 1.14