LCOV - code coverage report
Current view: top level - vnet/dpo - mpls_label_dpo.h (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 2 2 100.0 %
Date: 2023-07-05 22:20:52 Functions: 1 1 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             : #ifndef __MPLS_LABEL_DPO_H__
      17             : #define __MPLS_LABEL_DPO_H__
      18             : 
      19             : #include <vnet/vnet.h>
      20             : #include <vnet/mpls/packet.h>
      21             : #include <vnet/dpo/dpo.h>
      22             : 
      23             : /**
      24             :  * Flags present on an MPLS label sourced path-extension
      25             :  */
      26             : typedef enum mpls_label_dpo_attr_t_
      27             : {
      28             :     /**
      29             :      * Do not decrement the TTL of IP packet during imposition
      30             :      */
      31             :     MPLS_LABEL_DPO_ATTR_NO_IP_TTL_DECR,
      32             :     MPLS_LABEL_DPO_ATTR_UNIFORM_MODE,
      33             : } mpls_label_dpo_attr_t;
      34             : 
      35             : #define MPLS_LABEL_DPO_ATTR_MAX (MPLS_LABEL_DPO_ATTR_UNIFORM_MODE+1)
      36             : 
      37             : typedef enum mpls_label_dpo_flags_t_
      38             : {
      39             :     MPLS_LABEL_DPO_FLAG_NONE = 0,
      40             :     MPLS_LABEL_DPO_FLAG_NO_IP_TTL_DECR = (1 << MPLS_LABEL_DPO_ATTR_NO_IP_TTL_DECR),
      41             :     MPLS_LABEL_DPO_FLAG_UNIFORM_MODE = (1 << MPLS_LABEL_DPO_ATTR_UNIFORM_MODE),
      42             : } __attribute__ ((packed)) mpls_label_dpo_flags_t;
      43             : 
      44             : #define MPLS_LABEL_DPO_ATTR_NAMES {                               \
      45             :     [MPLS_LABEL_DPO_ATTR_NO_IP_TTL_DECR] = "no-ip-tll-decr",      \
      46             :     [MPLS_LABEL_DPO_ATTR_UNIFORM_MODE]   = "uniform-mode",        \
      47             : }
      48             : 
      49             : #define FOR_EACH_MPLS_LABEL_DPO_ATTR(_item)                \
      50             :     for (_item = MPLS_LABEL_DPO_ATTR_NO_IP_TTL_DECR;       \
      51             :          _item <= MPLS_LABEL_DPO_ATTR_UNIFORM_MODE;        \
      52             :          _item++)
      53             : 
      54             : /**
      55             :  * Format the flags variable
      56             :  */
      57             : extern u8* format_mpls_label_dpo_flags(u8 *s, va_list *args);
      58             : 
      59             : /**
      60             :  * Maximum number of labels in one DPO
      61             :  */
      62             : #define MPLS_LABEL_DPO_MAX_N_LABELS 12
      63             : 
      64             : /**
      65             :  * A representation of an MPLS label for imposition in the data-path
      66             :  */
      67             : typedef struct mpls_label_dpo_t
      68             : {
      69             :     /**
      70             :      * required for pool_get_aligned.
      71             :      *  memebers used in the switch path come first!
      72             :      */
      73             :     CLIB_CACHE_LINE_ALIGN_MARK(cacheline0);
      74             : 
      75             :     /**
      76             :      * The MPLS label header to impose. Outer most label first.
      77             :      * Each DPO will occupy one cache line, stuff that many labels in.
      78             :      */
      79             :     mpls_unicast_header_t mld_hdr[MPLS_LABEL_DPO_MAX_N_LABELS];
      80             : 
      81             :     /**
      82             :      * Next DPO in the graph
      83             :      */
      84             :     dpo_id_t mld_dpo;
      85             : 
      86             :     /**
      87             :      * The protocol of the payload/packets that are being encapped
      88             :      */
      89             :     dpo_proto_t mld_payload_proto;
      90             : 
      91             :     /**
      92             :      * Flags
      93             :      */
      94             :     mpls_label_dpo_flags_t mld_flags;
      95             : 
      96             :     /**
      97             :      * Size of the label stack
      98             :      */
      99             :     u8 mld_n_labels;
     100             : 
     101             :     /**
     102             :      * Cached amount of header bytes to paint
     103             :      */
     104             :     u16 mld_n_hdr_bytes;
     105             : 
     106             :     /**
     107             :      * Number of locks/users of the label
     108             :      */
     109             :     u16 mld_locks;
     110             : } mpls_label_dpo_t;
     111             : 
     112             : /**
     113             :  * @brief Assert that the MPLS label object is less than a cache line in size.
     114             :  * Should this get any bigger then we will need to reconsider how many labels
     115             :  * can be pushed in one object.
     116             :  */
     117             : STATIC_ASSERT((sizeof(mpls_label_dpo_t) <= CLIB_CACHE_LINE_BYTES),
     118             :               "MPLS label DPO is larger than one cache line.");
     119             : 
     120             : /**
     121             :  * @brief Create an MPLS label object
     122             :  *
     123             :  * @param label_stack The stack if labels to impose, outer most label first
     124             :  * @param eos The inner most label's EOS bit
     125             :  * @param payload_proto The ptocool of the payload packets that will
     126             :  *                      be imposed with this label header.
     127             :  * @param parent The parent of the created MPLS label object
     128             :  * @param dpo The MPLS label DPO created
     129             :  */
     130             : extern void mpls_label_dpo_create(fib_mpls_label_t *label_stack,
     131             :                                   mpls_eos_bit_t eos,
     132             :                                   dpo_proto_t payload_proto,
     133             :                                   mpls_label_dpo_flags_t flags,
     134             :                                   const dpo_id_t *paremt,
     135             :                                   dpo_id_t *dpo);
     136             : 
     137             : extern u8* format_mpls_label_dpo(u8 *s, va_list *args);
     138             : 
     139             : 
     140             : /*
     141             :  * Encapsulation violation for fast data-path access
     142             :  */
     143             : extern mpls_label_dpo_t *mpls_label_dpo_pool;
     144             : 
     145             : static inline mpls_label_dpo_t *
     146       32096 : mpls_label_dpo_get (index_t index)
     147             : {
     148       32096 :     return (pool_elt_at_index(mpls_label_dpo_pool, index));
     149             : }
     150             : 
     151             : extern void mpls_label_dpo_module_init(void);
     152             : 
     153             : /*
     154             :  * test function to get the registered DPO type for the flags
     155             :  */
     156             : extern dpo_type_t mpls_label_dpo_get_type(mpls_label_dpo_flags_t flags);
     157             : 
     158             : #endif

Generated by: LCOV version 1.14