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_DISP_DPO_H__ 17 : #define __MPLS_DISP_DPO_H__ 18 : 19 : #include <vnet/vnet.h> 20 : #include <vnet/mpls/packet.h> 21 : #include <vnet/dpo/dpo.h> 22 : #include <vnet/mfib/mfib_types.h> 23 : 24 : /** 25 : * A representation of an MPLS label for imposition in the data-path 26 : */ 27 : typedef struct mpls_disp_dpo_t 28 : { 29 : /** 30 : * required for pool_get_aligned. 31 : * memebers used in the switch path come first! 32 : */ 33 : CLIB_CACHE_LINE_ALIGN_MARK(cacheline0); 34 : 35 : /** 36 : * Next DPO in the graph 37 : */ 38 : dpo_id_t mdd_dpo; 39 : 40 : /** 41 : * The protocol of the payload/packets that are being encapped 42 : */ 43 : dpo_proto_t mdd_payload_proto; 44 : 45 : /** 46 : * RPF-ID (if this is an mcast disposition) 47 : */ 48 : fib_rpf_id_t mdd_rpf_id; 49 : 50 : /** 51 : * Number of locks/users of the label 52 : */ 53 : u16 mdd_locks; 54 : 55 : /** 56 : * LSP mode 57 : */ 58 : fib_mpls_lsp_mode_t mdd_mode; 59 : } mpls_disp_dpo_t; 60 : 61 : /** 62 : * @brief Assert that the MPLS label object is less than a cache line in size. 63 : * Should this get any bigger then we will need to reconsider how many labels 64 : * can be pushed in one object. 65 : */ 66 : _Static_assert((sizeof(mpls_disp_dpo_t) <= CLIB_CACHE_LINE_BYTES), 67 : "MPLS Disposition DPO is larger than one cache line."); 68 : 69 : /** 70 : * @brief Create an MPLS label object 71 : * 72 : * @param payload_proto The ptocool of the payload packets that will 73 : * be imposed with this label header. 74 : * @param rpf_id The RPF ID the packet will aquire - only for mcast 75 : * @param mode The LSP mode; pipe or uniform 76 : * @param dpo The parent of the created MPLS label object 77 : */ 78 : extern void mpls_disp_dpo_create(dpo_proto_t payload_proto, 79 : fib_rpf_id_t rpf_id, 80 : fib_mpls_lsp_mode_t mode, 81 : const dpo_id_t *parent, 82 : dpo_id_t *dpo); 83 : 84 : extern u8* format_mpls_disp_dpo(u8 *s, va_list *args); 85 : 86 : 87 : /* 88 : * Encapsulation violation for fast data-path access 89 : */ 90 : extern mpls_disp_dpo_t *mpls_disp_dpo_pool; 91 : 92 : static inline mpls_disp_dpo_t * 93 7864 : mpls_disp_dpo_get (index_t index) 94 : { 95 7864 : return (pool_elt_at_index(mpls_disp_dpo_pool, index)); 96 : } 97 : 98 : extern void mpls_disp_dpo_module_init(void); 99 : 100 : #endif