blob: f9b10333f43da8e5acb5aff9a98ef2a579558acc [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
Dave Barach97d8dc22016-08-15 15:31:15 -040030/* *INDENT-OFF* */
Pierre Pfisterd6f5b962016-03-21 16:17:52 +000031typedef CLIB_PACKED(struct _l2_rw_entry {
32 u16 skip_n_vectors;
33 u16 rewrite_n_vectors;
34 u64 hit_count;
35 u32x4 *mask;
36 u32x4 *value;
37}) l2_rw_entry_t;
Dave Barach97d8dc22016-08-15 15:31:15 -040038/* *INDENT-ON* */
Pierre Pfisterd6f5b962016-03-21 16:17:52 +000039
Dave Barach97d8dc22016-08-15 15:31:15 -040040/* l2_rw configuration for one interface */
41/* *INDENT-OFF* */
Pierre Pfisterd6f5b962016-03-21 16:17:52 +000042typedef CLIB_PACKED(struct _l2_rw_config {
Dave Barach97d8dc22016-08-15 15:31:15 -040043 u32 table_index; /* Which classify table to use */
44 u32 miss_index; /* Rewrite entry to use if table does not match */
Pierre Pfisterd6f5b962016-03-21 16:17:52 +000045}) l2_rw_config_t;
Dave Barach97d8dc22016-08-15 15:31:15 -040046/* *INDENT-ON* */
Pierre Pfisterd6f5b962016-03-21 16:17:52 +000047
Dave Barach97d8dc22016-08-15 15:31:15 -040048typedef struct
49{
Pierre Pfisterd6f5b962016-03-21 16:17:52 +000050 /* Next feature node indexes */
51 u32 feat_next_node_index[32];
52
53 /* A pool of entries */
54 l2_rw_entry_t *entries;
55
56 /* Config vector indexed by sw_if_index */
57 l2_rw_config_t *configs;
58 uword *configs_bitmap;
59} l2_rw_main_t;
60
61extern l2_rw_main_t l2_rw_main;
62
63/*
64 * Specifies which classify table and miss_index should be used
65 * with the given interface.
66 * Use special values ~0 in order to un-set table_index
67 * or miss_index.
68 * l2_rw feature is automatically enabled for the interface
69 * when table_index or miss_index is not ~0.
70 * returns 0 on success and something else on error.
71 */
Dave Barach97d8dc22016-08-15 15:31:15 -040072int l2_rw_interface_set_table (u32 sw_if_index,
73 u32 table_index, u32 miss_index);
Pierre Pfisterd6f5b962016-03-21 16:17:52 +000074
75/*
76 * Creates, modifies or delete a rewrite entry.
77 * If *index != ~0, modifies an existing entry (or simply
78 * deletes it if is_del is set).
79 * If *index == ~0, creates a new entry and the created
80 * entry index is stored in *index (Does nothing if is_del
81 * is set).
82 * returns 0 on success and something else on error.
83 */
Dave Barach97d8dc22016-08-15 15:31:15 -040084int l2_rw_mod_entry (u32 * index,
85 u8 * mask, u8 * value, u32 len, u32 skip, u8 is_del);
Pierre Pfisterd6f5b962016-03-21 16:17:52 +000086
Filip Tehlar44f0f712019-03-11 04:26:37 -070087extern vlib_node_registration_t l2_rw_node;
88
Pierre Pfisterd6f5b962016-03-21 16:17:52 +000089#endif /* L2_FW_H_ */
Dave Barach97d8dc22016-08-15 15:31:15 -040090
91/*
92 * fd.io coding-style-patch-verification: ON
93 *
94 * Local Variables:
95 * eval: (c-set-style "gnu")
96 * End:
97 */