blob: 98c88f7d812a4cfd7e425ce4978d2bcd3c3e3da5 [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 /**
Neale Rannsad422ed2016-11-02 14:20:04 +000070 * The MPLS label header to impose. Outer most label first.
Neale Rannsf363ebd2017-12-06 00:45:33 -080071 * Each DPO will occupy one cache line, stuff that many labels in.
Neale Ranns0bfe5d82016-08-25 15:29:12 +010072 */
Neale Rannsf363ebd2017-12-06 00:45:33 -080073 mpls_unicast_header_t mld_hdr[MPLS_LABEL_DPO_MAX_N_LABELS];
Neale Ranns0bfe5d82016-08-25 15:29:12 +010074
75 /**
76 * Next DPO in the graph
77 */
78 dpo_id_t mld_dpo;
79
80 /**
Neale Rannsad422ed2016-11-02 14:20:04 +000081 * The protocol of the payload/packets that are being encapped
82 */
83 dpo_proto_t mld_payload_proto;
84
85 /**
Neale Ranns31ed7442018-02-23 05:29:09 -080086 * Flags
87 */
88 mpls_label_dpo_flags_t mld_flags;
89
90 /**
Neale Rannsad422ed2016-11-02 14:20:04 +000091 * Size of the label stack
92 */
Neale Ranns31ed7442018-02-23 05:29:09 -080093 u8 mld_n_labels;
Neale Rannsad422ed2016-11-02 14:20:04 +000094
95 /**
Neale Ranns9ca18c62016-12-10 21:08:09 +000096 * Cached amount of header bytes to paint
97 */
98 u16 mld_n_hdr_bytes;
99
100 /**
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100101 * Number of locks/users of the label
102 */
103 u16 mld_locks;
104} mpls_label_dpo_t;
105
Neale Rannsad422ed2016-11-02 14:20:04 +0000106/**
107 * @brief Assert that the MPLS label object is less than a cache line in size.
108 * Should this get any bigger then we will need to reconsider how many labels
109 * can be pushed in one object.
110 */
Neale Ranns696e88d2017-03-16 07:34:55 -0400111STATIC_ASSERT((sizeof(mpls_label_dpo_t) <= CLIB_CACHE_LINE_BYTES),
112 "MPLS label DPO is larger than one cache line.");
Neale Rannsad422ed2016-11-02 14:20:04 +0000113
114/**
115 * @brief Create an MPLS label object
116 *
117 * @param label_stack The stack if labels to impose, outer most label first
118 * @param eos The inner most label's EOS bit
Neale Rannsad422ed2016-11-02 14:20:04 +0000119 * @param payload_proto The ptocool of the payload packets that will
120 * be imposed with this label header.
Neale Ranns31ed7442018-02-23 05:29:09 -0800121 * @param parent The parent of the created MPLS label object
122 * @param dpo The MPLS label DPO created
Neale Rannsad422ed2016-11-02 14:20:04 +0000123 */
Neale Ranns31ed7442018-02-23 05:29:09 -0800124extern void mpls_label_dpo_create(fib_mpls_label_t *label_stack,
125 mpls_eos_bit_t eos,
126 dpo_proto_t payload_proto,
127 mpls_label_dpo_flags_t flags,
128 const dpo_id_t *paremt,
129 dpo_id_t *dpo);
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100130
131extern u8* format_mpls_label_dpo(u8 *s, va_list *args);
132
133
134/*
135 * Encapsulation violation for fast data-path access
136 */
137extern mpls_label_dpo_t *mpls_label_dpo_pool;
138
139static inline mpls_label_dpo_t *
140mpls_label_dpo_get (index_t index)
141{
142 return (pool_elt_at_index(mpls_label_dpo_pool, index));
143}
144
145extern void mpls_label_dpo_module_init(void);
146
Neale Ranns31ed7442018-02-23 05:29:09 -0800147/*
148 * test function to get the registered DPO type for the flags
149 */
150extern dpo_type_t mpls_label_dpo_get_type(mpls_label_dpo_flags_t flags);
151
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100152#endif