LCOV - code coverage report
Current view: top level - plugins/nat/pnat - pnat.h (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 8 8 100.0 %
Date: 2023-07-05 22:20:52 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2021 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             : #ifndef included_pnat_h
      17             : #define included_pnat_h
      18             : 
      19             : #include <stdbool.h>
      20             : #include <vnet/ip/ip4_packet.h>
      21             : #include <vppinfra/bihash_16_8.h>
      22             : 
      23             : #define PNAT_FLOW_HASH_BUCKETS 256
      24             : 
      25             : /* Definitions from pnat.api */
      26             : #include <pnat/pnat.api_types.h>
      27             : typedef vl_api_pnat_match_tuple_t pnat_match_tuple_t;
      28             : typedef vl_api_pnat_rewrite_tuple_t pnat_rewrite_tuple_t;
      29             : typedef vl_api_pnat_mask_t pnat_mask_t;
      30             : typedef vl_api_pnat_attachment_point_t pnat_attachment_point_t;
      31             : 
      32             : /* Rewrite instructions */
      33             : typedef enum {
      34             :     PNAT_INSTR_NONE = 1 << 0,
      35             :     PNAT_INSTR_SOURCE_ADDRESS = 1 << 1,
      36             :     PNAT_INSTR_SOURCE_PORT = 1 << 2,
      37             :     PNAT_INSTR_DESTINATION_ADDRESS = 1 << 3,
      38             :     PNAT_INSTR_DESTINATION_PORT = 1 << 4,
      39             :     PNAT_INSTR_COPY_BYTE = 1 << 5,
      40             :     PNAT_INSTR_CLEAR_BYTE = 1 << 6,
      41             : } pnat_instructions_t;
      42             : 
      43             : typedef struct {
      44             :     u64 as_u64[2];
      45             : } pnat_mask_fast_t;
      46             : 
      47             : /* Session cache entries */
      48             : typedef struct {
      49             :     /* What to translate to */
      50             :     pnat_instructions_t instructions;
      51             : 
      52             :     /* Stored in network byte order */
      53             :     ip4_address_t post_sa;
      54             :     ip4_address_t post_da;
      55             :     u16 post_sp;
      56             :     u16 post_dp;
      57             : 
      58             :     /* Byte copy inside of packet */
      59             :     u8 from_offset;
      60             :     u8 to_offset;
      61             : 
      62             :     u8 clear_offset; /* Clear byte */
      63             : 
      64             :     /* Used for trace/show commands */
      65             :     pnat_match_tuple_t match;
      66             :     pnat_rewrite_tuple_t rewrite;
      67             : } pnat_translation_t;
      68             : 
      69             : /* Interface object */
      70             : typedef struct {
      71             :     u32 sw_if_index;
      72             :     pnat_mask_t lookup_mask[PNAT_ATTACHMENT_POINT_MAX];
      73             :     pnat_mask_fast_t lookup_mask_fast[PNAT_ATTACHMENT_POINT_MAX];
      74             : 
      75             :     /* Feature chain enabled on interface */
      76             :     bool enabled[PNAT_ATTACHMENT_POINT_MAX];
      77             : 
      78             :     u32 refcount;
      79             : } pnat_interface_t;
      80             : 
      81             : /* Globals */
      82             : typedef struct {
      83             :     bool enabled;
      84             : 
      85             :     clib_bihash_16_8_t flowhash; /* Bi-directional */
      86             : 
      87             :     /* Interface pool */
      88             :     pnat_interface_t *interfaces;
      89             :     u32 *interface_by_sw_if_index;
      90             : 
      91             :     /* Translations pool */
      92             :     pnat_translation_t *translations;
      93             : 
      94             :     u16 msg_id_base;
      95             : } pnat_main_t;
      96             : extern pnat_main_t pnat_main;
      97             : 
      98             : pnat_interface_t *pnat_interface_by_sw_if_index(u32 sw_if_index);
      99             : 
     100             : /* Packet trace information */
     101             : typedef struct {
     102             :     u32 pool_index;
     103             :     pnat_match_tuple_t match;
     104             :     pnat_rewrite_tuple_t rewrite;
     105             : } pnat_trace_t;
     106             : 
     107             : int pnat_binding_add(pnat_match_tuple_t *match, pnat_rewrite_tuple_t *rewrite,
     108             :                      u32 *binding_index);
     109             : int pnat_binding_del(u32 binding_index);
     110             : int pnat_binding_attach(u32 sw_if_index, pnat_attachment_point_t attachment,
     111             :                         u32 binding_index);
     112             : int pnat_binding_detach(u32 sw_if_index, pnat_attachment_point_t attachment,
     113             :                         u32 binding_index);
     114             : u32 pnat_flow_lookup(u32 sw_if_index, pnat_attachment_point_t attachment,
     115             :                      pnat_match_tuple_t *match);
     116             : 
     117             : static inline void
     118          37 : pnat_calc_key(u32 sw_if_index, pnat_attachment_point_t attachment,
     119             :               ip4_address_t src, ip4_address_t dst, u8 protocol, u16 sport,
     120             :               u16 dport, pnat_mask_fast_t mask, clib_bihash_kv_16_8_t *kv) {
     121          37 :     kv->key[0] = (u64)src.as_u32 << 32 | dst.as_u32;
     122          37 :     kv->key[0] &= mask.as_u64[0];
     123          37 :     kv->key[1] =
     124          37 :         (u64)protocol << 56 | (u64)sw_if_index << 36 | (u64)attachment << 32;
     125          37 :     kv->key[1] |= (u32)sport << 16 | dport;
     126          37 :     kv->key[1] &= mask.as_u64[1];
     127          37 : }
     128             : 
     129             : #endif

Generated by: LCOV version 1.14