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

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2016 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 Definitions for punt infrastructure.
      19             :  */
      20             : #ifndef included_punt_h
      21             : #define included_punt_h
      22             : 
      23             : #include <linux/un.h>
      24             : #include <stdbool.h>
      25             : #include <vnet/ip/ip.h>
      26             : 
      27             : /* Punting reason flags bitfield
      28             :  * (position, length, value, name, string)
      29             :  */
      30             : #define foreach_vnet_punt_reason_flag                                         \
      31             :   _ (0, 1, 0, IP4_PACKET, "ip4-packet")                                       \
      32             :   _ (0, 1, 1, IP6_PACKET, "ip6-packet")
      33             : 
      34             : typedef enum vnet_punt_reason_flag_t_
      35             : {
      36             : #define _(pos, len, value, name, str)                                         \
      37             :   VNET_PUNT_REASON_F_##name = ((value) << (pos)),
      38             :   foreach_vnet_punt_reason_flag
      39             : #undef _
      40             : } __clib_packed vnet_punt_reason_flag_t;
      41             : 
      42             : enum vnet_punt_reason_flag_mask_t_
      43             : {
      44             : #define _(pos, len, value, name, str)                                         \
      45             :   VNET_PUNT_REASON_F_MASK_##name = (((1 << (len)) - 1) << (pos)),
      46             :   foreach_vnet_punt_reason_flag
      47             : #undef _
      48             : };
      49             : 
      50             : /* predicates associated with vlib_punt_reason_flag_t*/
      51             : #define _(pos, len, value, name, str)                                         \
      52             :   static_always_inline int vnet_punt_reason_flag_is_##name (                  \
      53             :     vnet_punt_reason_flag_t f)                                                \
      54             :   {                                                                           \
      55             :     return (f & VNET_PUNT_REASON_F_MASK_##name) == VNET_PUNT_REASON_F_##name; \
      56             :   }
      57        3442 : foreach_vnet_punt_reason_flag
      58             : #undef _
      59             : 
      60             : #define foreach_punt_type                       \
      61             :   _(L4, "l4")                                   \
      62             :   _(EXCEPTION, "exception")                     \
      63             :   _(IP_PROTO, "ip-proto")
      64             : 
      65             :   typedef enum punt_type_t_ {
      66             : #define _(v, s) PUNT_TYPE_##v,
      67             :     foreach_punt_type
      68             : #undef _
      69             :   } punt_type_t;
      70             : 
      71             : typedef struct punt_l4_t_
      72             : {
      73             :   ip_address_family_t af;
      74             :   ip_protocol_t protocol;
      75             :   u16 port;
      76             : } punt_l4_t;
      77             : 
      78             : typedef struct punt_ip_proto_t_
      79             : {
      80             :   ip_address_family_t af;
      81             :   ip_protocol_t protocol;
      82             : } punt_ip_proto_t;
      83             : 
      84             : typedef struct punt_exception_t_
      85             : {
      86             :   vlib_punt_reason_t reason;
      87             : } punt_exception_t;
      88             : 
      89             : typedef struct punt_union_t_
      90             : {
      91             :   punt_exception_t exception;
      92             :   punt_l4_t l4;
      93             :   punt_ip_proto_t ip_proto;
      94             : } punt_union_t;
      95             : 
      96             : typedef struct punt_reg_t_
      97             : {
      98             :   punt_type_t type;
      99             :   punt_union_t punt;
     100             : } punt_reg_t;
     101             : 
     102             : 
     103             : clib_error_t *vnet_punt_add_del (vlib_main_t * vm,
     104             :                                  const punt_reg_t * pr, bool is_add);
     105             : clib_error_t *vnet_punt_socket_add (vlib_main_t * vm,
     106             :                                     u32 header_version,
     107             :                                     const punt_reg_t * pr,
     108             :                                     char *client_pathname);
     109             : clib_error_t *vnet_punt_socket_del (vlib_main_t * vm, const punt_reg_t * pr);
     110             : char *vnet_punt_get_server_pathname (void);
     111             : 
     112             : enum punt_action_e
     113             : {
     114             :   PUNT_L2 = 0,
     115             :   PUNT_IP4_ROUTED,
     116             :   PUNT_IP6_ROUTED,
     117             : };
     118             : 
     119             : /*
     120             :  * Packet descriptor header. Version 1
     121             :  * If this header changes, the version must also change to notify clients.
     122             :  */
     123             : #define PUNT_PACKETDESC_VERSION 1
     124             : typedef struct __attribute__ ((packed))
     125             : {
     126             :   u32 sw_if_index;              /* RX or TX interface */
     127             :   enum punt_action_e action;
     128             : } punt_packetdesc_t;
     129             : 
     130             : /*
     131             :  * Client registration
     132             :  */
     133             : typedef struct
     134             : {
     135             :   punt_reg_t reg;
     136             :   struct sockaddr_un caddr;
     137             : } punt_client_t;
     138             : 
     139             : typedef struct punt_client_db_t_
     140             : {
     141             :   void *clients_by_l4_port;
     142             :   u32 *clients_by_exception;
     143             :   void *clients_by_ip_proto;
     144             : } punt_client_db_t;
     145             : 
     146             : typedef struct punt_thread_data_t_
     147             : {
     148             :   struct iovec *iovecs;
     149             : } punt_thread_data_t;
     150             : 
     151             : typedef struct
     152             : {
     153             :   int socket_fd;
     154             :   char sun_path[sizeof (struct sockaddr_un)];
     155             :   punt_client_db_t db;
     156             :   punt_client_t *punt_client_pool;
     157             :   u32 clib_file_index;
     158             :   bool is_configured;
     159             :   vlib_node_t *interface_output_node;
     160             :   u32 *ready_fds;
     161             :   u32 *rx_buffers;
     162             :   punt_thread_data_t *thread_data;
     163             :   vlib_punt_hdl_t hdl;
     164             :   u16 msg_id_base;
     165             : } punt_main_t;
     166             : 
     167             : extern punt_main_t punt_main;
     168             : 
     169             : typedef walk_rc_t (*punt_client_walk_cb_t) (const punt_client_t * pc,
     170             :                                             void *ctx);
     171             : extern void punt_client_walk (punt_type_t pt,
     172             :                               punt_client_walk_cb_t cb, void *ctx);
     173             : 
     174             : extern u8 *format_vnet_punt_reason_flags (u8 *s, va_list *args);
     175             : 
     176             : /*
     177             :  * inlines for the data-plane
     178             :  */
     179             : static_always_inline u32
     180         117 : punt_client_l4_mk_key (ip_address_family_t af, u16 port)
     181             : {
     182         117 :   return (af << BITS (port) | port);
     183             : }
     184             : 
     185             : static_always_inline punt_client_t *
     186          64 : punt_client_l4_get (ip_address_family_t af, u16 port)
     187             : {
     188          64 :   punt_main_t *pm = &punt_main;
     189             :   uword *p;
     190             : 
     191          64 :   p = hash_get (pm->db.clients_by_l4_port, punt_client_l4_mk_key (af, port));
     192             : 
     193          64 :   if (p)
     194          38 :     return (pool_elt_at_index (pm->punt_client_pool, p[0]));
     195             : 
     196          26 :   return (NULL);
     197             : }
     198             : 
     199             : static_always_inline u32
     200          19 : punt_client_ip_proto_mk_key (ip_address_family_t af, ip_protocol_t proto)
     201             : {
     202          19 :   return (af << 16 | proto);
     203             : }
     204             : 
     205             : static_always_inline punt_client_t *
     206          11 : punt_client_ip_proto_get (ip_address_family_t af, ip_protocol_t proto)
     207             : {
     208          11 :   punt_main_t *pm = &punt_main;
     209             :   uword *p;
     210             : 
     211             :   p =
     212          11 :     hash_get (pm->db.clients_by_ip_proto,
     213             :               punt_client_ip_proto_mk_key (af, proto));
     214             : 
     215          11 :   if (p)
     216           7 :     return (pool_elt_at_index (pm->punt_client_pool, p[0]));
     217             : 
     218           4 :   return (NULL);
     219             : }
     220             : 
     221             : static_always_inline punt_client_t *
     222          12 : punt_client_exception_get (vlib_punt_reason_t reason)
     223             : {
     224          12 :   punt_main_t *pm = &punt_main;
     225             :   u32 pci;
     226             : 
     227          12 :   if (reason >= vec_len (pm->db.clients_by_exception))
     228           3 :     return (NULL);
     229             : 
     230           9 :   pci = pm->db.clients_by_exception[reason];
     231             : 
     232           9 :   if (~0 != pci)
     233           7 :     return (pool_elt_at_index (pm->punt_client_pool, pci));
     234             : 
     235           2 :   return (NULL);
     236             : }
     237             : 
     238             : extern vlib_node_registration_t udp4_punt_node;
     239             : extern vlib_node_registration_t udp6_punt_node;
     240             : extern vlib_node_registration_t udp4_punt_socket_node;
     241             : extern vlib_node_registration_t udp6_punt_socket_node;
     242             : extern vlib_node_registration_t icmp6_punt_socket_node;
     243             : extern vlib_node_registration_t ip4_proto_punt_socket_node;
     244             : extern vlib_node_registration_t ip6_proto_punt_socket_node;
     245             : extern vlib_node_registration_t punt_socket_rx_node;
     246             : 
     247             : #endif
     248             : 
     249             : /*
     250             :  * fd.io coding-style-patch-verification: ON
     251             :  *
     252             :  * Local Variables:
     253             :  * eval: (c-set-style "gnu")
     254             :  * End:
     255             :  */

Generated by: LCOV version 1.14