ofs | hex dump | ascii |
---|
0000 | 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 01 00 28 00 01 00 00 00 00 00 00 00 00 00 00 00 | .ELF..............(............. |
0020 | 3c fa 00 00 00 00 00 05 34 00 00 00 00 00 28 00 28 00 25 00 2d e9 f3 47 1c 46 20 4d 82 46 dd f8 | <.......4.....(.(.%.-..G.F.M.F.. |
0040 | 28 90 88 46 7d 44 2d 68 17 46 00 26 2b 68 c9 f8 00 60 01 93 da f8 00 00 00 21 01 22 ff f7 fe ff | (..F}D-h.F.&+h...`.......!.".... |
0060 | 03 1e 20 db 4f f0 ff 31 40 46 0a 46 ff f7 fe ff 00 28 02 dc 4f f0 ff 30 16 e0 40 46 39 46 22 46 | ....O..1@F.F.....(..O..0..@F9F"F |
0080 | 6b 46 ff f7 fe ff 51 28 e4 d0 68 b9 00 9b 9c 42 03 d1 26 44 c9 f8 00 60 06 e0 00 2b ea d0 e4 1a | kF....Q(..h....B..&D...`...+.... |
00a0 | 1f 44 1e 44 d6 e7 1c 20 01 9a 2b 68 9a 42 01 d0 ff f7 fe ff 02 b0 bd e8 f0 87 00 bf 74 00 00 00 | .D.D......+h.B..............t... |
00c0 | 00 00 00 00 b0 ae 01 80 2d e9 f0 4f e1 b0 bb 4d 92 46 6a 9f 0e 46 7d 44 2d 68 05 90 07 eb 83 03 | ........-..O...M.Fj..F}D-h...... |
00e0 | 00 21 2a 68 3c 68 9d f8 ac 91 5f 92 01 22 20 46 d3 f8 54 81 ff f7 fe ff 07 95 00 28 06 da b0 49 | .!*h<h...._..".F..T........(...I |
0100 | 20 46 79 44 ff f7 fe ff 1c 20 4d e1 00 21 40 46 ff f7 fe ff ab 49 1d ad 53 46 20 46 79 44 32 46 | .FyD......M..!@F.....I..SF.FyD2F |
0120 | ff f7 fe ff 04 23 85 f8 03 a0 2b 70 01 23 6b 70 4f ea 2a 23 ab 70 b9 f1 00 0f 50 d1 0d f1 28 0b | .....#....+p.#kpO.*#.p....P...(. |
0140 | 38 46 31 46 52 46 5b 46 ff f7 fe ff 01 30 44 d0 db f8 00 30 3b b9 9c 49 20 46 32 46 79 44 ff f7 | 8F1FRF[F.....0D....0;..I.F2FyD.. |
0160 | fe ff 06 20 20 e1 d3 f8 00 b0 bb f1 00 0f f2 d0 0d ab 58 46 40 22 0d f1 2c 0a 19 46 06 93 ff f7 | ..................XF@"..,..F.... |
0180 | fe ff 92 49 0c ab 52 46 00 93 79 44 0d f1 32 03 06 98 01 93 0d f1 2e 03 ff f7 fe ff 8c 49 06 9a | ...I..RF..yD..2..............I.. |
01a0 | 79 44 04 28 20 46 09 bf ba f8 00 30 cb 46 2b 71 ba f8 02 30 01 bf 6b 71 ba f8 04 30 ab 71 ba f8 | yD.(.F.....0.F+q...0..kq...0.q.. |
01c0 | 06 30 08 bf eb 71 ff f7 fe ff 20 46 0a 99 ff f7 fe ff bb f1 00 0f 02 d1 bd e7 05 20 e4 e0 1d ad | .0...q.....F.................... |
01e0 | 00 23 2b 72 05 9b 73 b1 18 46 ff f7 fe ff fd 28 02 46 03 d9 77 49 20 46 79 44 5b e0 1f a8 05 99 | .#+r..s..F.....(.F..wI.FyD[..... |
0200 | 01 32 ff f7 fe ff 1f a8 ff f7 fe ff 00 f1 09 0a b9 f1 00 0f 02 d1 4f f0 00 0c 18 e0 30 46 00 23 | .2....................O.....0F.# |
0220 | 2b 71 6b 71 ab 71 01 23 eb 71 ff f7 fe ff 00 f1 01 0c 0a eb 0c 03 b3 f5 83 7f ec dc 05 eb 0a 00 | +qkq.q.#.q...................... |
0240 | 31 46 cd f8 14 c0 ff f7 fe ff dd f8 14 c0 e2 44 0d f1 28 0b 38 46 cd f8 00 b0 41 46 2a 46 53 46 | 1F.............D..(.8F....AF*FSF |
0260 | cd f8 14 c0 ff f7 fe ff 28 b9 db f8 00 30 dd f8 14 c0 53 45 03 d0 58 49 20 46 79 44 1a e0 b9 f1 | ........(....0....SE..XI.FyD.... |
0280 | 00 0f 1a d0 bc f1 00 0f 17 d1 30 46 ff f7 fe ff cd f8 00 b0 41 46 32 46 00 f1 01 0a 38 46 53 46 | ..........0F........AF2F....8FSF |
02a0 | ff f7 fe ff 18 b9 db f8 00 30 53 45 05 d0 4b 49 20 46 79 44 ff f7 fe ff 75 e0 09 ae 38 46 00 96 | .........0SE..KI.FyD....u...8F.. |
02c0 | 41 46 2a 46 08 23 ff f7 fe ff 10 b9 33 68 08 2b 03 d0 43 49 20 46 79 44 ec e7 2b 78 1b b1 41 49 | AF*F.#......3h.+..CI.FyD..+x..AI |
02e0 | 20 46 79 44 e6 e7 68 78 a0 f1 5a 03 03 2b 49 d8 df e8 03 f0 02 15 26 37 b9 f1 00 0f 02 d1 3a 4a | .FyD..hx..Z..+I.......&7......:J |
0300 | 7a 44 01 e0 39 4a 7a 44 39 49 20 46 79 44 ff f7 fe ff 40 46 01 21 ff f7 fe ff 00 20 44 e0 a9 79 | zD..9JzD9I.FyD....@F.!......D..y |
0320 | 2a 79 6b 79 00 91 e9 79 01 91 28 7a 69 7a 41 ea 00 21 02 91 5b 21 03 91 2e 49 20 46 79 44 30 e0 | *yky...y..(zizA..!..[!...I.FyD0. |
0340 | a9 79 2a 79 6b 79 00 91 e9 79 01 91 28 7a 69 7a 41 ea 00 21 02 91 5c 21 03 91 27 49 20 46 79 44 | .y*yky...y..(zizA..!..\!..'I.FyD |
0360 | 1f e0 a9 79 2a 79 6b 79 00 91 e9 79 01 91 28 7a 69 7a 41 ea 00 21 02 91 5d 21 03 91 1f 49 20 46 | ...y*yky...y..(zizA..!..]!...I.F |
0380 | 79 44 0e e0 a9 79 2a 79 6b 79 00 91 e9 79 01 91 2e 7a 69 7a 03 90 20 46 41 ea 06 21 02 91 18 49 | yD...y*yky...y...ziz...FA..!...I |
03a0 | 79 44 ff f7 fe ff 07 20 07 9b 5f 9a 1b 68 9a 42 01 d0 ff f7 fe ff 61 b0 bd e8 f0 8f e2 02 00 00 | yD........_..h.B......a......... |
03c0 | ba 02 00 00 a4 02 00 00 68 02 00 00 3e 02 00 00 2c 02 00 00 d8 01 00 00 5a 01 00 00 26 01 00 00 | ........h...>...,.......Z...&... |
03e0 | 06 01 00 00 fe 00 00 00 e4 00 00 00 e2 00 00 00 e0 00 00 00 b4 00 00 00 96 00 00 00 78 00 00 00 | ............................x... |
0400 | 5c 00 00 00 00 00 00 00 af 3f 20 80 2d e9 f0 4f ad f5 31 7d df f8 20 85 81 46 12 93 10 46 f8 44 | \........?..-..O..1}.....F...F.D |
0420 | d8 f8 00 80 bb 9d 8a 46 93 46 d8 f8 00 30 2c 68 af 93 ba 9b 05 eb 83 03 d3 f8 54 61 ff f7 fe ff | .......F.F...0,h..........Ta.... |
0440 | d5 f8 38 31 cd f8 50 80 05 2b 07 46 08 d0 ff 28 08 d9 df f8 e8 14 20 46 3a 46 79 44 ff f7 fe ff | ..81..P..+.F...(.......F:FyD.... |
0460 | 01 23 00 e0 00 23 20 46 00 21 01 22 11 93 ff f7 fe ff 03 1e 13 93 04 da df f8 c4 14 20 46 79 44 | .#...#.F.!.".................FyD |
0480 | 16 e0 01 21 30 46 ff f7 fe ff 4f f0 ff 30 01 46 32 46 13 9b ff f7 fe ff 41 1c 04 d1 df f8 a4 14 | ...!0F....O..0.F2F......A....... |
04a0 | 28 68 79 44 32 e2 38 b9 df f8 9c 14 28 68 79 44 ff f7 fe ff 1c 20 33 e2 10 f0 04 01 04 d0 df f8 | (hyD2.8.....(hyD......3......... |
04c0 | 8c 14 28 68 79 44 21 e2 0d f1 64 08 b9 f1 00 0f 30 46 4f f0 05 03 88 f8 02 10 88 f8 00 30 14 bf | ..(hyD!...d.....0FO..........0.. |
04e0 | 02 23 01 23 88 f8 01 30 02 23 88 f8 03 30 ff f7 fe ff 98 f8 01 30 0d f1 5c 0c 28 46 cd f8 00 c0 | .#.#...0.#...0.......0..\.(F.... |
0500 | 31 46 42 46 02 33 cd f8 54 c0 ff f7 fe ff 40 b9 dd f8 54 c0 98 f8 01 30 dc f8 00 20 02 33 9a 42 | 1FBF.3..T.....@...T....0.....3.B |
0520 | 04 d0 df f8 2c 14 20 46 79 44 ef e1 01 21 30 46 ff f7 fe ff 4f f0 ff 31 0a 46 30 46 13 9b ff f7 | ....,..FyD...!0F....O..1.F0F.... |
0540 | fe ff 42 1c 04 d1 df f8 0c 14 28 68 79 44 dd e1 20 b9 df f8 04 14 28 68 79 44 a9 e7 10 f0 04 01 | ..B.......(hyD........(hyD...... |
0560 | 06 d0 fe 49 28 68 79 44 ff f7 fe ff 38 20 d7 e1 30 46 ff f7 fe ff 0d f1 58 0c 28 46 cd f8 00 c0 | ...I(hyD....8...0F......X.(F.... |
0580 | 31 46 42 46 02 23 cd f8 4c c0 ff f7 fe ff 28 b9 dd f8 4c c0 dc f8 00 30 02 2b 03 d0 f0 49 20 46 | 1FBF.#..L.....(...L....0.+...I.F |
05a0 | 79 44 b3 e1 98 f8 00 30 05 2b 03 d0 ed 49 20 46 79 44 ab e1 98 f8 01 30 00 2b 00 f0 85 80 02 2b | yD.....0.+...I.FyD.....0.+.....+ |
05c0 | 6b d1 b9 f1 00 0f 0b d0 ba f1 00 0f 0b d0 48 46 ff f7 fe ff 80 46 50 46 ff f7 fe ff 03 46 04 e0 | k.............HF.....FPF.....F.. |
05e0 | 4b 46 c8 46 01 e0 53 46 d0 46 01 21 8d f8 65 80 8d f8 64 10 b9 f1 00 0f 0a d0 b8 f1 00 0f 07 d0 | KF.F..SF.F.!..e...d............. |
0600 | 0d f1 66 00 49 46 42 46 13 93 ff f7 fe ff 13 9b 08 f1 02 02 19 a8 08 f1 03 08 83 54 ba f1 00 0f | ..f.IFBF...................T.... |
0620 | 07 d0 33 b1 1a 46 40 44 51 46 13 93 ff f7 fe ff 13 9b 98 44 0d f1 64 09 0d f1 5c 0a 28 46 cd f8 | ..3..F@DQF.........D..d...\.(F.. |
0640 | 00 a0 31 46 4a 46 43 46 ff f7 fe ff 18 b9 da f8 00 30 98 45 03 d0 c4 49 20 46 79 44 56 e1 0d f1 | ..1FJFCF.........0.E...I.FyDV... |
0660 | 58 08 28 46 cd f8 00 80 31 46 4a 46 02 23 ff f7 fe ff 18 b9 d8 f8 00 30 02 2b 03 d0 bb 49 20 46 | X.(F....1FJF.#.........0.+...I.F |
0680 | 79 44 43 e1 99 f8 01 30 f3 b1 b9 49 20 46 99 f8 00 20 79 44 ff f7 fe ff 41 e1 01 2b 20 46 02 d1 | yDC....0...I.F....yD....A..+.F.. |
06a0 | b4 49 79 44 32 e1 ff 2b 0b d1 b9 f1 00 0f 02 d0 99 f8 00 30 13 b9 b0 49 79 44 27 e1 af 49 79 44 | .IyD2..+...........0...IyD'..IyD |
06c0 | 24 e1 af 49 79 44 21 e1 0d f1 64 08 05 23 4f f0 01 0a 4f f0 00 09 88 f8 00 30 11 9b 88 f8 01 a0 | $..IyD!...d..#O...O......0...... |
06e0 | 88 f8 02 90 6b b9 0d f1 69 00 59 46 3a 46 03 23 88 f8 04 70 07 f1 05 09 88 f8 03 30 ff f7 fe ff | ....k...i.YF:F.#...p.......0.... |
0700 | 43 e0 18 af 28 46 59 46 12 9a 3b 46 ff f7 fe ff 43 1c 38 d0 01 28 36 d0 3b 68 33 b9 99 49 20 46 | C...(FYF..;F....C.8..(6.;h3..I.F |
0720 | 5a 46 79 44 ff f7 fe ff 2d e0 1f 68 00 2f f5 d0 7b 68 02 2b 1e d1 88 f8 03 a0 0d f1 67 03 ba 69 | ZFyD....-..h./..{h.+........g..i |
0740 | df f8 44 c2 02 f1 03 0a 02 f1 07 09 fc 44 1a f8 01 2f 61 46 20 46 cd f8 44 c0 03 f8 01 2f 13 93 | ..D..........D.../aF.F..D..../.. |
0760 | ff f7 fe ff ca 45 dd f8 44 c0 13 9b ef d1 4f f0 08 09 02 e0 4f 46 4f f0 03 09 20 46 18 99 ff f7 | .....E..D.....O.....OFO....F.... |
0780 | fe ff 17 b9 ca e7 06 20 ca e0 12 9b 09 f1 02 07 28 46 31 46 42 46 1b 12 08 f8 09 30 9d f8 48 30 | ................(F1FBF.....0..H0 |
07a0 | c1 44 89 f8 01 30 0d f1 5c 09 3b 46 cd f8 00 90 ff f7 fe ff 18 b9 d9 f8 00 30 9f 42 03 d0 73 49 | .D...0..\.;F.............0.B..sI |
07c0 | 20 46 79 44 a2 e0 0d f1 58 09 28 46 cd f8 00 90 31 46 42 46 0a 23 ff f7 fe ff 18 b9 d9 f8 00 30 | .FyD....X.(F....1FBF.#.........0 |
07e0 | 0a 2b 03 d0 6a 49 20 46 79 44 8f e0 98 f8 00 30 05 2b 03 d0 67 49 20 46 79 44 87 e0 98 f8 01 10 | .+..jI.FyD.....0.+..gI.FyD...... |
0800 | 98 f8 03 30 00 29 63 d0 01 2b 17 d1 98 f8 06 00 98 f8 04 20 98 f8 05 30 00 90 98 f8 07 00 01 90 | ...0.)c..+.............0........ |
0820 | 98 f8 08 50 98 f8 09 00 03 91 5b 49 40 ea 05 20 02 90 20 46 79 44 ff f7 fe ff 70 e0 03 2b 0d d1 | .../*
* Copyright (c) 2015 Cisco and/or its affiliates.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* config.c: feature configuration
*
* Copyright (c) 2008 Eliot Dresselhaus
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <vnet/vnet.h>
static vnet_config_feature_t *
duplicate_feature_vector (vnet_config_feature_t * feature_vector)
{
vnet_config_feature_t *result, *f;
result = vec_dup (feature_vector);
vec_foreach (f, result) f->feature_config = vec_dup (f->feature_config);
return result;
}
static void
free_feature_vector (vnet_config_feature_t * feature_vector)
{
vnet_config_feature_t *f;
vec_foreach (f, feature_vector) vnet_config_feature_free (f);
vec_free (feature_vector);
}
static u32
add_next (vlib_main_t * vm,
vnet_config_main_t * cm, u32 last_node_index, u32 this_node_index)
{
u32 i, ni = ~0;
if (last_node_index != ~0)
return vlib_node_add_next (vm, last_node_index, this_node_index);
for (i = 0; i < vec_len (cm->start_node_indices); i++)
{
u32 tmp;
tmp =
vlib_node_add_next (vm, cm->start_node_indices[i], this_node_index);
if (ni == ~0)
ni = tmp;
/* Start nodes to first must agree on next indices. */
ASSERT (ni == tmp);
}
return ni;
}
static vnet_config_t *
find_config_with_features (vlib_main_t * vm,
vnet_config_main_t * cm,
vnet_config_feature_t * feature_vector,
u32 end_node_index)
{
u32 last_node_index = ~0;
vnet_config_feature_t *f;
u32 *config_string;
uword *p;
vnet_config_t *c;
config_string = cm->config_string_temp;
cm->config_string_temp = 0;
if (config_string)
_vec_len (config_string) = 0;
vec_foreach (f, feature_vector)
{
/* Connect node graph. */
f->next_index = add_next (vm, cm, last_node_index, f->node_index);
last_node_index = f->node_index;
/* Store next index in config string. */
vec_add1 (config_string, f->next_index);
/* Store feature config. */
vec_add (config_string, f->feature_config, vec_len (f->feature_config));
}
/* Terminate config string with next for end node. */
if (last_node_index == ~0 || last_node_index != end_node_index)
{
u32 next_index = add_next (vm, cm, last_node_index, end_node_index);
vec_add1 (config_string, next_index);
}
/* See if config string is unique. */
p = hash_get_mem (cm->config_string_hash, config_string);
if (p)
{
/* Not unique. Share existing config. */
cm->config_string_temp = config_string; /* we'll use it again later. */
free_feature_vector (feature_vector);
c = pool_elt_at_index (cm->config_pool, p[0]);
}
else
{
u32 *d;
pool_get (cm->config_pool, c);
c->index = c - cm->config_pool;
c->features = feature_vector;
c->config_string_vector = config_string;
/* Allocate copy of config string in heap.
VLIB buffers will maintain pointers to heap as they read out
configuration data. */
c->config_string_heap_index
= heap_alloc (cm->config_string_heap, vec_len (config_string) + 1,
c->config_string_heap_handle);
/* First element in heap points back to pool index. */
d =
vec_elt_at_index (cm->config_string_heap,
c->config_string_heap_index);
d[0] = c->index;
clib_memcpy (d + 1, config_string, vec_bytes (config_string));
hash_set_mem (cm->config_string_hash, config_string, c->index);
c->reference_count = 0; /* will be incremented by caller. */
vec_validate_init_empty (cm->end_node_indices_by_user_index,
c->config_string_heap_index + 1,
cm->default_end_node_index);
cm->end_node_indices_by_user_index[c->config_string_heap_index + 1]
= end_node_index;
}
return c;
}
void
vnet_config_init (vlib_main_t * vm,
vnet_config_main_t * cm,
char *start_node_names[],
int n_start_node_names,
char *feature_node_names[], int n_feature_node_names)
{
vlib_node_t *n;
u32 i;
clib_memset (cm, 0, sizeof (cm[0]));
cm->config_string_hash =
hash_create_vec (0,
STRUCT_SIZE_OF (vnet_config_t, config_string_vector[0]),
sizeof (uword));
ASSERT (n_feature_node_names >= 1);
vec_resize (cm->start_node_indices, n_start_node_names);
for (i = 0; i < n_start_node_names; i++)
{
n = vlib_get_node_by_name (vm, (u8 *) start_node_names[i]);
/* Given node name must exist. */
ASSERT (n != 0);
cm->start_node_indices[i] = n->index;
}
vec_resize (cm->node_index_by_feature_index, n_feature_node_names);
for (i = 0; i < n_feature_node_names; i++)
{
if (!feature_node_names[i])
cm->node_index_by_feature_index[i] = ~0;
else
{
n = vlib_get_node_by_name (vm, (u8 *) feature_node_names[i]);
/* Given node may exist in plug-in library which is not present */
if (n)
{
if (i + 1 == n_feature_node_names)
cm->default_end_node_index = n->index;
cm->node_index_by_feature_index[i] = n->index;
}
else
cm->node_index_by_feature_index[i] = ~0;
}
}
}
static void
remove_reference (vnet_config_main_t * cm, vnet_config_t * c)
{
ASSERT (c->reference_count > 0);
c->reference_count -= 1;
if (c->reference_count == 0)
{
hash_unset (cm->config_string_hash, c->config_string_vector);
vnet_config_free (cm, c);
pool_put (cm->config_pool, c);
}
}
static int
feature_cmp (void *a1, void *a2)
{
vnet_config_feature_t *f1 = a1;
vnet_config_feature_t *f2 = a2;
return (int) f1->feature_index - f2->feature_index;
}
always_inline u32 *
vnet_get_config_heap (vnet_config_main_t * cm, u32 ci)
{
return heap_elt_at_index (cm->config_string_heap, ci);
}
u32
vnet_config_modify_end_node (vlib_main_t * vm,
vnet_config_main_t * cm,
u32 config_string_heap_index, u32 end_node_index)
{
vnet_config_feature_t *new_features;
vnet_config_t *old, *new;
if (end_node_index == ~0) // feature node does not exist
return ~0;
if (config_string_heap_index == ~0)
{
old = 0;
new_features = 0;
}
else
{
u32 *p = vnet_get_config_heap (cm, config_string_heap_index);
old = pool_elt_at_index (cm->config_pool, p[-1]);
new_features = old->features;
if (new_features)
new_features = duplicate_feature_vector (new_features);
}
if (vec_len (new_features))
{
/* is the last feature the cuurent end node */
u32 last = vec_len (new_features) - 1;
if (new_features[last].node_index == cm->default_end_node_index)
{
vec_free (new_features->feature_config);
_vec_len (new_features) = last;
}
}
if (old)
remove_reference (cm, old);
new = find_config_with_features (vm, cm, new_features, end_node_index);
new->reference_count += 1;
/*
* User gets pointer to config string first element
* (which defines the pool index
* this config string comes from).
*/
vec_validate (cm->config_pool_index_by_user_index,
new->config_string_heap_index + 1);
cm->config_pool_index_by_user_index[new->config_string_heap_index + 1]
= new - cm->config_pool;
return new->config_string_heap_index + 1;
}
u32
vnet_config_add_feature (vlib_main_t * vm,
vnet_config_main_t * cm,
u32 config_string_heap_index,
u32 feature_index,
void *feature_config, u32 n_feature_config_bytes)
{
vnet_config_t *old, *new;
vnet_config_feature_t *new_features, *f;
u32 n_feature_config_u32s, end_node_index;
u32 node_index = vec_elt (cm->node_index_by_feature_index, feature_index);
if (node_index == ~0) // feature node does not exist
return ~0;
if (config_string_heap_index == ~0)
{
old = 0;
new_features = 0;
end_node_index = cm->default_end_node_index;
}
else
{
u32 *p = vnet_get_config_heap (cm, config_string_heap_index);
old = pool_elt_at_index (cm->config_pool, p[-1]);
new_features = old->features;
end_node_index =
cm->end_node_indices_by_user_index[config_string_heap_index];
if (new_features)
new_features = duplicate_feature_vector (new_features);
}
vec_add2 (new_features, f, 1);
f->feature_index = feature_index;
f->node_index = node_index;
n_feature_config_u32s =
round_pow2 (n_feature_config_bytes,
sizeof (f->feature_config[0])) /
sizeof (f->feature_config[0]);
vec_add (f->feature_config, feature_config, n_feature_config_u32s);
/* Sort (prioritize) features. */
if (vec_len (new_features) > 1)
vec_sort_with_function (new_features, feature_cmp);
if (old)
remove_reference (cm, old);
new = find_config_with_features (vm, cm, new_features, end_node_index);
new->reference_count += 1;
/*
* User gets pointer to config string first element
* (which defines the pool index
* this config string comes from).
*/
vec_validate (cm->config_pool_index_by_user_index,
new->config_string_heap_index + 1);
cm->config_pool_index_by_user_index[new->config_string_heap_index + 1]
= new - cm->config_pool;
return new->config_string_heap_index + 1;
}
u32
vnet_config_del_feature (vlib_main_t * vm,
vnet_config_main_t * cm,
u32 config_string_heap_index,
u32 feature_index,
void *feature_config, u32 n_feature_config_bytes)
{
vnet_config_t *old, *new;
vnet_config_feature_t *new_features, *f;
u32 n_feature_config_u32s;
{
u32 *p = vnet_get_config_heap (cm, config_string_heap_index);
old = pool_elt_at_index (cm->config_pool, p[-1]);
}
n_feature_config_u32s =
round_pow2 (n_feature_config_bytes,
sizeof (f->feature_config[0])) /
sizeof (f->feature_config[0]);
/* Find feature with same index and opaque data. */
vec_foreach (f, old->features)
{
if (f->feature_index == feature_index
&& vec_len (f->feature_config) == n_feature_config_u32s
&& (n_feature_config_u32s == 0
|| !memcmp (f->feature_config, feature_config,
n_feature_config_bytes)))
break;
}
/* Feature not found. */
if (f >= vec_end (old->features))
return ~0;
new_features = duplicate_feature_vector (old->features);
f = new_features + (f - old->features);
vnet_config_feature_free (f);
vec_delete (new_features, 1, f - new_features);
/* must remove old from config_pool now as it may be expanded and change
memory location if the following function find_config_with_features()
adds a new config because none of existing config's has matching features
and so can be reused */
remove_reference (cm, old);
new = find_config_with_features (vm, cm, new_features,
cm->end_node_indices_by_user_index
[config_string_heap_index]);
new->reference_count += 1;
vec_validate (cm->config_pool_index_by_user_index,
new->config_string_heap_index + 1);
cm->config_pool_index_by_user_index[new->config_string_heap_index + 1]
= new - cm->config_pool;
return new->config_string_heap_index + 1;
}
/*
* fd.io coding-style-patch-verification: ON
*
* Local Variables:
* eval: (c-set-style "gnu")
* End:
*/
|