blob: b77a7794a6e3249576f4f91cc62bc376a78f4625 [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. */
Dave Barachba868bb2016-08-08 09:51:21 -040098 u32 *start_node_indices, end_node_index;
Ed Warnickecb9cada2015-12-08 15:45:58 -070099
100 /* Interior feature processing nodes (not including start and end nodes). */
Dave Barachba868bb2016-08-08 09:51:21 -0400101 u32 *node_index_by_feature_index;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700102
Dave Barachde393bb2016-06-23 11:27:51 -0400103 /* vnet_config pool index by user index */
Dave Barachba868bb2016-08-08 09:51:21 -0400104 u32 *config_pool_index_by_user_index;
Dave Barachde393bb2016-06-23 11:27:51 -0400105
Ed Warnickecb9cada2015-12-08 15:45:58 -0700106 /* Temporary vector for holding config strings. Used to avoid continually
107 allocating vectors. */
Dave Barachba868bb2016-08-08 09:51:21 -0400108 u32 *config_string_temp;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700109} vnet_config_main_t;
110
111always_inline void
112vnet_config_free (vnet_config_main_t * cm, vnet_config_t * c)
113{
Dave Barachba868bb2016-08-08 09:51:21 -0400114 vnet_config_feature_t *f;
115 vec_foreach (f, c->features) vnet_config_feature_free (f);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700116 vec_free (c->features);
117 heap_dealloc (cm->config_string_heap, c->config_string_heap_handle);
118 vec_free (c->config_string_vector);
119}
120
121always_inline void *
122vnet_get_config_data (vnet_config_main_t * cm,
Dave Barachba868bb2016-08-08 09:51:21 -0400123 u32 * config_index, u32 * next_index, u32 n_data_bytes)
Ed Warnickecb9cada2015-12-08 15:45:58 -0700124{
Dave Barachba868bb2016-08-08 09:51:21 -0400125 u32 i, n, *d;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700126
127 i = *config_index;
128
129 d = heap_elt_at_index (cm->config_string_heap, i);
130
131 n = round_pow2 (n_data_bytes, sizeof (d[0])) / sizeof (d[0]);
132
133 /* Last 32 bits are next index. */
134 *next_index = d[n];
135
136 /* Advance config index to next config. */
137 *config_index = (i + n + 1);
138
139 /* Return config data to user for this feature. */
140 return (void *) d;
141}
142
143void vnet_config_init (vlib_main_t * vm,
144 vnet_config_main_t * cm,
Dave Barachba868bb2016-08-08 09:51:21 -0400145 char *start_node_names[],
Ed Warnickecb9cada2015-12-08 15:45:58 -0700146 int n_start_node_names,
Dave Barachba868bb2016-08-08 09:51:21 -0400147 char *feature_node_names[], int n_feature_node_names);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700148
149/* Calls to add/delete features from configurations. */
150u32 vnet_config_add_feature (vlib_main_t * vm,
151 vnet_config_main_t * cm,
152 u32 config_id,
153 u32 feature_index,
Dave Barachba868bb2016-08-08 09:51:21 -0400154 void *feature_config,
Ed Warnickecb9cada2015-12-08 15:45:58 -0700155 u32 n_feature_config_bytes);
156
157u32 vnet_config_del_feature (vlib_main_t * vm,
158 vnet_config_main_t * cm,
159 u32 config_id,
160 u32 feature_index,
Dave Barachba868bb2016-08-08 09:51:21 -0400161 void *feature_config,
Ed Warnickecb9cada2015-12-08 15:45:58 -0700162 u32 n_feature_config_bytes);
163
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100164u8 *vnet_config_format_features (vlib_main_t * vm,
165 vnet_config_main_t * cm,
166 u32 config_index, u8 * s);
167
Ed Warnickecb9cada2015-12-08 15:45:58 -0700168#endif /* included_vnet_config_h */
Dave Barachba868bb2016-08-08 09:51:21 -0400169
170/*
171 * fd.io coding-style-patch-verification: ON
172 *
173 * Local Variables:
174 * eval: (c-set-style "gnu")
175 * End:
176 */