blob: ccbbbf433e2a840f8154c29c37f46e5cc3a1243b [file] [log] [blame]
Ed Warnickecb9cada2015-12-08 15:45:58 -07001/*
2 * Copyright (c) 2015 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 * config.h: feature configuration
17 *
18 * Copyright (c) 2008 Eliot Dresselhaus
19 *
20 * Permission is hereby granted, free of charge, to any person obtaining
21 * a copy of this software and associated documentation files (the
22 * "Software"), to deal in the Software without restriction, including
23 * without limitation the rights to use, copy, modify, merge, publish,
24 * distribute, sublicense, and/or sell copies of the Software, and to
25 * permit persons to whom the Software is furnished to do so, subject to
26 * the following conditions:
27 *
28 * The above copyright notice and this permission notice shall be
29 * included in all copies or substantial portions of the Software.
30 *
31 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
32 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
33 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
34 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
35 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
36 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
37 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
38 */
39
40#ifndef included_vnet_config_h
41#define included_vnet_config_h
42
43#include <vlib/vlib.h>
44#include <vppinfra/heap.h>
45
Dave Barachba868bb2016-08-08 09:51:21 -040046typedef struct
47{
Ed Warnickecb9cada2015-12-08 15:45:58 -070048 /* Features are prioritized by index. Smaller indices get
49 performed first. */
50 u32 feature_index;
51
52 /* VLIB node which performs feature. */
53 u32 node_index;
54
55 /* Next index relative to previous node or main node. */
56 u32 next_index;
57
58 /* Opaque per feature configuration data. */
Dave Barachba868bb2016-08-08 09:51:21 -040059 u32 *feature_config;
Ed Warnickecb9cada2015-12-08 15:45:58 -070060} vnet_config_feature_t;
61
62always_inline void
63vnet_config_feature_free (vnet_config_feature_t * f)
Dave Barachba868bb2016-08-08 09:51:21 -040064{
65 vec_free (f->feature_config);
66}
Ed Warnickecb9cada2015-12-08 15:45:58 -070067
Dave Barachba868bb2016-08-08 09:51:21 -040068typedef struct
69{
Ed Warnickecb9cada2015-12-08 15:45:58 -070070 /* Sorted vector of features for this configuration. */
Dave Barachba868bb2016-08-08 09:51:21 -040071 vnet_config_feature_t *features;
Ed Warnickecb9cada2015-12-08 15:45:58 -070072
73 /* Config string as vector for hashing. */
Dave Barachba868bb2016-08-08 09:51:21 -040074 u32 *config_string_vector;
Ed Warnickecb9cada2015-12-08 15:45:58 -070075
76 /* Config string including all next indices and feature data as a vector. */
77 u32 config_string_heap_index, config_string_heap_handle;
78
79 /* Index in main pool. */
80 u32 index;
81
82 /* Number of interfaces/traffic classes that reference this config. */
83 u32 reference_count;
84} vnet_config_t;
85
Dave Barachba868bb2016-08-08 09:51:21 -040086typedef struct
87{
Ed Warnickecb9cada2015-12-08 15:45:58 -070088 /* Pool of configs. Index 0 is always null config and is never deleted. */
Dave Barachba868bb2016-08-08 09:51:21 -040089 vnet_config_t *config_pool;
Ed Warnickecb9cada2015-12-08 15:45:58 -070090
91 /* Hash table mapping vector config string to config pool index. */
Dave Barachba868bb2016-08-08 09:51:21 -040092 uword *config_string_hash;
Ed Warnickecb9cada2015-12-08 15:45:58 -070093
Dave Barachba868bb2016-08-08 09:51:21 -040094 /* Global heap of configuration data. */
95 u32 *config_string_heap;
Ed Warnickecb9cada2015-12-08 15:45:58 -070096
97 /* Node index which starts/ends feature processing. */
Neale Ranns5d0136f2020-05-12 08:51:02 +000098 u32 *start_node_indices, *end_node_indices_by_user_index,
99 default_end_node_index;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700100
101 /* Interior feature processing nodes (not including start and end nodes). */
Dave Barachba868bb2016-08-08 09:51:21 -0400102 u32 *node_index_by_feature_index;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700103
Dave Barachde393bb2016-06-23 11:27:51 -0400104 /* vnet_config pool index by user index */
Dave Barachba868bb2016-08-08 09:51:21 -0400105 u32 *config_pool_index_by_user_index;
Dave Barachde393bb2016-06-23 11:27:51 -0400106
Ed Warnickecb9cada2015-12-08 15:45:58 -0700107 /* Temporary vector for holding config strings. Used to avoid continually
108 allocating vectors. */
Dave Barachba868bb2016-08-08 09:51:21 -0400109 u32 *config_string_temp;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700110} vnet_config_main_t;
111
112always_inline void
113vnet_config_free (vnet_config_main_t * cm, vnet_config_t * c)
114{
Dave Barachba868bb2016-08-08 09:51:21 -0400115 vnet_config_feature_t *f;
116 vec_foreach (f, c->features) vnet_config_feature_free (f);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700117 vec_free (c->features);
118 heap_dealloc (cm->config_string_heap, c->config_string_heap_handle);
119 vec_free (c->config_string_vector);
120}
121
122always_inline void *
123vnet_get_config_data (vnet_config_main_t * cm,
Dave Barachba868bb2016-08-08 09:51:21 -0400124 u32 * config_index, u32 * next_index, u32 n_data_bytes)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700125{
Dave Barachba868bb2016-08-08 09:51:21 -0400126 u32 i, n, *d;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700127
128 i = *config_index;
129
130 d = heap_elt_at_index (cm->config_string_heap, i);
131
132 n = round_pow2 (n_data_bytes, sizeof (d[0])) / sizeof (d[0]);
133
134 /* Last 32 bits are next index. */
135 *next_index = d[n];
136
137 /* Advance config index to next config. */
138 *config_index = (i + n + 1);
139
140 /* Return config data to user for this feature. */
141 return (void *) d;
142}
143
144void vnet_config_init (vlib_main_t * vm,
145 vnet_config_main_t * cm,
Dave Barachba868bb2016-08-08 09:51:21 -0400146 char *start_node_names[],
Ed Warnickecb9cada2015-12-08 15:45:58 -0700147 int n_start_node_names,
Dave Barachba868bb2016-08-08 09:51:21 -0400148 char *feature_node_names[], int n_feature_node_names);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700149
BenoƮt Ganne6178bda2020-11-04 10:02:03 +0100150void vnet_config_del (vnet_config_main_t * cm, u32 config_id);
151
Ed Warnickecb9cada2015-12-08 15:45:58 -0700152/* Calls to add/delete features from configurations. */
153u32 vnet_config_add_feature (vlib_main_t * vm,
154 vnet_config_main_t * cm,
155 u32 config_id,
156 u32 feature_index,
Dave Barachba868bb2016-08-08 09:51:21 -0400157 void *feature_config,
Ed Warnickecb9cada2015-12-08 15:45:58 -0700158 u32 n_feature_config_bytes);
159
160u32 vnet_config_del_feature (vlib_main_t * vm,
161 vnet_config_main_t * cm,
162 u32 config_id,
163 u32 feature_index,
Dave Barachba868bb2016-08-08 09:51:21 -0400164 void *feature_config,
Ed Warnickecb9cada2015-12-08 15:45:58 -0700165 u32 n_feature_config_bytes);
166
Neale Ranns4ec36c52020-03-31 09:21:29 -0400167u32 vnet_config_modify_end_node (vlib_main_t * vm,
168 vnet_config_main_t * cm,
169 u32 config_string_heap_index,
170 u32 end_node_index);
171
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100172u8 *vnet_config_format_features (vlib_main_t * vm,
173 vnet_config_main_t * cm,
174 u32 config_index, u8 * s);
175
Ed Warnickecb9cada2015-12-08 15:45:58 -0700176#endif /* included_vnet_config_h */
Dave Barachba868bb2016-08-08 09:51:21 -0400177
178/*
179 * fd.io coding-style-patch-verification: ON
180 *
181 * Local Variables:
182 * eval: (c-set-style "gnu")
183 * End:
184 */