blob: 6d12a21fe5575e276c64d9d2f441b40cd6a6dd5a [file] [log] [blame]
Pierre Pfisterd6f5b962016-03-21 16:17:52 +00001/*
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/*
17 * l2_rw is based on vnet classifier and provides a way
18 * to modify packets matching a given table.
19 *
20 * Tables must be created using vnet's classify features.
21 * Entries contained within these tables must have their
22 * opaque index set to the rewrite entry created with l2_rw_mod_entry.
23 */
24
25#ifndef L2_RW_H_
26#define L2_RW_H_
27
28#include <vnet/l2/l2_input.h>
29
30typedef CLIB_PACKED(struct _l2_rw_entry {
31 u16 skip_n_vectors;
32 u16 rewrite_n_vectors;
33 u64 hit_count;
34 u32x4 *mask;
35 u32x4 *value;
36}) l2_rw_entry_t;
37
Dave Barach97d8dc22016-08-15 15:31:15 -040038/* l2_rw configuration for one interface */
Pierre Pfisterd6f5b962016-03-21 16:17:52 +000039typedef CLIB_PACKED(struct _l2_rw_config {
Dave Barach97d8dc22016-08-15 15:31:15 -040040 u32 table_index; /* Which classify table to use */
41 u32 miss_index; /* Rewrite entry to use if table does not match */
Pierre Pfisterd6f5b962016-03-21 16:17:52 +000042}) l2_rw_config_t;
43
Dave Barach97d8dc22016-08-15 15:31:15 -040044typedef struct
45{
Pierre Pfisterd6f5b962016-03-21 16:17:52 +000046 /* Next feature node indexes */
47 u32 feat_next_node_index[32];
48
49 /* A pool of entries */
50 l2_rw_entry_t *entries;
51
52 /* Config vector indexed by sw_if_index */
53 l2_rw_config_t *configs;
54 uword *configs_bitmap;
55} l2_rw_main_t;
56
57extern l2_rw_main_t l2_rw_main;
58
59/*
60 * Specifies which classify table and miss_index should be used
61 * with the given interface.
62 * Use special values ~0 in order to un-set table_index
63 * or miss_index.
64 * l2_rw feature is automatically enabled for the interface
65 * when table_index or miss_index is not ~0.
66 * returns 0 on success and something else on error.
67 */
Dave Barach97d8dc22016-08-15 15:31:15 -040068int l2_rw_interface_set_table (u32 sw_if_index,
69 u32 table_index, u32 miss_index);
Pierre Pfisterd6f5b962016-03-21 16:17:52 +000070
71/*
72 * Creates, modifies or delete a rewrite entry.
73 * If *index != ~0, modifies an existing entry (or simply
74 * deletes it if is_del is set).
75 * If *index == ~0, creates a new entry and the created
76 * entry index is stored in *index (Does nothing if is_del
77 * is set).
78 * returns 0 on success and something else on error.
79 */
Dave Barach97d8dc22016-08-15 15:31:15 -040080int l2_rw_mod_entry (u32 * index,
81 u8 * mask, u8 * value, u32 len, u32 skip, u8 is_del);
Pierre Pfisterd6f5b962016-03-21 16:17:52 +000082
Filip Tehlar44f0f712019-03-11 04:26:37 -070083extern vlib_node_registration_t l2_rw_node;
84
Pierre Pfisterd6f5b962016-03-21 16:17:52 +000085#endif /* L2_FW_H_ */
Dave Barach97d8dc22016-08-15 15:31:15 -040086
87/*
88 * fd.io coding-style-patch-verification: ON
89 *
90 * Local Variables:
91 * eval: (c-set-style "gnu")
92 * End:
93 */