8494d26b49586b5b754b4f8a5d4bd3ea27990a22
[vpp.git] / src / vnet / dpo / mpls_label_dpo.h
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 /**
25  * Maximum number of labels in one DPO
26  */
27 #define MPLS_LABEL_DPO_MAX_N_LABELS 12
28 /**
29  * A representation of an MPLS label for imposition in the data-path
30  */
31 typedef struct mpls_label_dpo_t
32 {
33     /**
34      * The MPLS label header to impose. Outer most label first.
35      * Each DPO will occupy one cache line, stuff that many labels in.
36      */
37     mpls_unicast_header_t mld_hdr[MPLS_LABEL_DPO_MAX_N_LABELS];
38
39     /**
40      * Next DPO in the graph
41      */
42     dpo_id_t mld_dpo;
43
44     /**
45      * The protocol of the payload/packets that are being encapped
46      */
47     dpo_proto_t mld_payload_proto;
48
49     /**
50      * Size of the label stack
51      */
52     u16 mld_n_labels;
53
54     /**
55      * Cached amount of header bytes to paint
56      */
57     u16 mld_n_hdr_bytes;
58
59     /**
60      * Number of locks/users of the label
61      */
62     u16 mld_locks;
63 } mpls_label_dpo_t;
64
65 /**
66  * @brief Assert that the MPLS label object is less than a cache line in size.
67  * Should this get any bigger then we will need to reconsider how many labels
68  * can be pushed in one object.
69  */
70 STATIC_ASSERT((sizeof(mpls_label_dpo_t) <= CLIB_CACHE_LINE_BYTES),
71               "MPLS label DPO is larger than one cache line.");
72
73 /**
74  * @brief Create an MPLS label object
75  *
76  * @param label_stack The stack if labels to impose, outer most label first
77  * @param eos The inner most label's EOS bit
78  * @param ttl The inner most label's TTL bit
79  * @param exp The inner most label's EXP bit
80  * @param payload_proto The ptocool of the payload packets that will
81  *                      be imposed with this label header.
82  * @param dpo The parent of the created MPLS label object
83  */
84 extern index_t mpls_label_dpo_create(mpls_label_t *label_stack,
85                                      mpls_eos_bit_t eos,
86                                      u8 ttl,
87                                      u8 exp,
88                                      dpo_proto_t payload_proto,
89                                      const dpo_id_t *dpo);
90
91 extern u8* format_mpls_label_dpo(u8 *s, va_list *args);
92
93
94 /*
95  * Encapsulation violation for fast data-path access
96  */
97 extern mpls_label_dpo_t *mpls_label_dpo_pool;
98
99 static inline mpls_label_dpo_t *
100 mpls_label_dpo_get (index_t index)
101 {
102     return (pool_elt_at_index(mpls_label_dpo_pool, index));
103 }
104
105 extern void mpls_label_dpo_module_init(void);
106
107 #endif