blob: 4e032d33458931b6760d2712a8b27bc3d4f6518f [file] [log] [blame]
Neale Ranns0bfe5d82016-08-25 15:29:12 +01001/*
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
Neale Ranns31ed7442018-02-23 05:29:09 -080023/**
24 * Flags present on an MPLS label sourced path-extension
25 */
26typedef 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
37typedef 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 */
57extern u8* format_mpls_label_dpo_flags(u8 *s, va_list *args);
Neale Rannsf363ebd2017-12-06 00:45:33 -080058
59/**
60 * Maximum number of labels in one DPO
61 */
62#define MPLS_LABEL_DPO_MAX_N_LABELS 12
Neale Ranns31ed7442018-02-23 05:29:09 -080063
Neale Ranns0bfe5d82016-08-25 15:29:12 +010064/**
65 * A representation of an MPLS label for imposition in the data-path
66 */
67typedef struct mpls_label_dpo_t
68{
69 /**
Dave Baracheb987d32018-05-03 08:26:39 -040070 * required for pool_get_aligned.
71 * memebers used in the switch path come first!
72 */
73 CLIB_CACHE_LINE_ALIGN_MARK(cacheline0);
74
75 /**
Neale Rannsad422ed2016-11-02 14:20:04 +000076 * The MPLS label header to impose. Outer most label first.
Neale Rannsf363ebd2017-12-06 00:45:33 -080077 * Each DPO will occupy one cache line, stuff that many labels in.
Neale Ranns0bfe5d82016-08-25 15:29:12 +010078 */
Neale Rannsf363ebd2017-12-06 00:45:33 -080079 mpls_unicast_header_t mld_hdr[MPLS_LABEL_DPO_MAX_N_LABELS];
Neale Ranns0bfe5d82016-08-25 15:29:12 +010080
81 /**
82 * Next DPO in the graph
83 */
84 dpo_id_t mld_dpo;
85
86 /**
Neale Rannsad422ed2016-11-02 14:20:04 +000087 * The protocol of the payload/packets that are being encapped
88 */
89 dpo_proto_t mld_payload_proto;
90
91 /**
Neale Ranns31ed7442018-02-23 05:29:09 -080092 * Flags
93 */
94 mpls_label_dpo_flags_t mld_flags;
95
96 /**
Neale Rannsad422ed2016-11-02 14:20:04 +000097 * Size of the label stack
98 */
Neale Ranns31ed7442018-02-23 05:29:09 -080099 u8 mld_n_labels;
Neale Rannsad422ed2016-11-02 14:20:04 +0000100
101 /**
Neale Ranns9ca18c62016-12-10 21:08:09 +0000102 * Cached amount of header bytes to paint
103 */
104 u16 mld_n_hdr_bytes;
105
106 /**
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100107 * Number of locks/users of the label
108 */
109 u16 mld_locks;
110} mpls_label_dpo_t;
111
Neale Rannsad422ed2016-11-02 14:20:04 +0000112/**
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 */
Neale Ranns696e88d2017-03-16 07:34:55 -0400117STATIC_ASSERT((sizeof(mpls_label_dpo_t) <= CLIB_CACHE_LINE_BYTES),
118 "MPLS label DPO is larger than one cache line.");
Neale Rannsad422ed2016-11-02 14:20:04 +0000119
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
Neale Rannsad422ed2016-11-02 14:20:04 +0000125 * @param payload_proto The ptocool of the payload packets that will
126 * be imposed with this label header.
Neale Ranns31ed7442018-02-23 05:29:09 -0800127 * @param parent The parent of the created MPLS label object
128 * @param dpo The MPLS label DPO created
Neale Rannsad422ed2016-11-02 14:20:04 +0000129 */
Neale Ranns31ed7442018-02-23 05:29:09 -0800130extern 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);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100136
137extern u8* format_mpls_label_dpo(u8 *s, va_list *args);
138
139
140/*
141 * Encapsulation violation for fast data-path access
142 */
143extern mpls_label_dpo_t *mpls_label_dpo_pool;
144
145static inline mpls_label_dpo_t *
146mpls_label_dpo_get (index_t index)
147{
148 return (pool_elt_at_index(mpls_label_dpo_pool, index));
149}
150
151extern void mpls_label_dpo_module_init(void);
152
Neale Ranns31ed7442018-02-23 05:29:09 -0800153/*
154 * test function to get the registered DPO type for the flags
155 */
156extern dpo_type_t mpls_label_dpo_get_type(mpls_label_dpo_flags_t flags);
157
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100158#endif