summaryrefslogtreecommitdiffstats
path: root/src/plugins/gbp/gbp_classify.c
blob: 255db2528717fb5d63641b0232b2f37cf40f35e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/*
 * gbp.h : Group Based Policy
 *
 * Copyright (c) 2018 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.
 */

#include <plugins/gbp/gbp.h>
#include <plugins/gbp/gbp_classify.h>
#include <vnet/l2/l2_input.h>

gbp_src_classify_main_t gbp_src_classify_main;

static clib_error_t *
gbp_src_classify_init (vlib_main_t * vm)
{
  gbp_src_classify_main_t *em = &gbp_src_classify_main;

  vlib_node_t *node = vlib_get_node_by_name (vm, (u8 *) "gbp-src-classify");

  /* Initialize the feature next-node indexes */
  feat_bitmap_init_next_nodes (vm,
			       node->index,
			       L2INPUT_N_FEAT,
			       l2input_get_feat_names (),
			       em->l2_input_feat_next[GBP_SRC_CLASSIFY_NULL]);

  node = vlib_get_node_by_name (vm, (u8 *) "gbp-null-classify");
  feat_bitmap_init_next_nodes (vm,
			       node->index,
			       L2INPUT_N_FEAT,
			       l2input_get_feat_names (),
			       em->l2_input_feat_next[GBP_SRC_CLASSIFY_PORT]);

  node = vlib_get_node_by_name (vm, (u8 *) "l2-gbp-lpm-classify");
  feat_bitmap_init_next_nodes (vm,
			       node->index,
			       L2INPUT_N_FEAT,
			       l2input_get_feat_names (),
			       em->l2_input_feat_next[GBP_SRC_CLASSIFY_LPM]);

  node = vlib_get_node_by_name (vm, (u8 *) "l2-gbp-lpm-anon-classify");
  feat_bitmap_init_next_nodes (vm,
			       node->index,
			       L2INPUT_N_FEAT,
			       l2input_get_feat_names (),
			       em->l2_input_feat_next
			       [GBP_SRC_CLASSIFY_LPM_ANON]);

  return 0;
}

VLIB_INIT_FUNCTION (gbp_src_classify_init);

/*
 * fd.io coding-style-patch-verification: ON
 *
 * Local Variables:
 * eval: (c-set-style "gnu")
 * End:
 */
> enum { MEMIF_INTERFACE_MODE_ETHERNET = 0, MEMIF_INTERFACE_MODE_IP = 1, MEMIF_INTERFACE_MODE_PUNT_INJECT = 2, } memif_interface_mode_t; typedef uint16_t memif_region_index_t; typedef uint32_t memif_region_offset_t; typedef uint64_t memif_region_size_t; typedef uint16_t memif_ring_index_t; typedef uint32_t memif_interface_id_t; typedef uint16_t memif_version_t; typedef uint8_t memif_log2_ring_size_t; /* * Socket messages */ typedef struct __attribute__ ((packed)) { uint8_t name[32]; memif_version_t min_version; memif_version_t max_version; memif_region_index_t max_region; memif_ring_index_t max_m2s_ring; memif_ring_index_t max_s2m_ring; memif_log2_ring_size_t max_log2_ring_size; } memif_msg_hello_t; typedef struct __attribute__ ((packed)) { memif_version_t version; memif_interface_id_t id; memif_interface_mode_t mode:8; uint8_t secret[24]; uint8_t name[32]; } memif_msg_init_t; typedef struct __attribute__ ((packed)) { memif_region_index_t index; memif_region_size_t size; } memif_msg_add_region_t; typedef struct __attribute__ ((packed)) { uint16_t flags; #define MEMIF_MSG_ADD_RING_FLAG_S2M (1 << 0) memif_ring_index_t index; memif_region_index_t region; memif_region_offset_t offset; memif_log2_ring_size_t log2_ring_size; uint16_t private_hdr_size; /* used for private metadata */ } memif_msg_add_ring_t; typedef struct __attribute__ ((packed)) { uint8_t if_name[32]; } memif_msg_connect_t; typedef struct __attribute__ ((packed)) { uint8_t if_name[32]; } memif_msg_connected_t; typedef struct __attribute__ ((packed)) { uint32_t code; uint8_t string[96]; } memif_msg_disconnect_t; typedef struct __attribute__ ((packed, aligned (128))) { memif_msg_type_t type:16; union { memif_msg_hello_t hello; memif_msg_init_t init; memif_msg_add_region_t add_region; memif_msg_add_ring_t add_ring; memif_msg_connect_t connect; memif_msg_connected_t connected; memif_msg_disconnect_t disconnect; }; } memif_msg_t; _Static_assert (sizeof (memif_msg_t) == 128, "Size of memif_msg_t must be 128"); /* * Ring and Descriptor Layout */ typedef struct __attribute__ ((packed)) { uint16_t flags; #define MEMIF_DESC_FLAG_NEXT (1 << 0) memif_region_index_t region; uint32_t length; memif_region_offset_t offset; uint32_t metadata; } memif_desc_t; _Static_assert (sizeof (memif_desc_t) == 16, "Size of memif_dsct_t must be 16 bytes"); #define MEMIF_CACHELINE_ALIGN_MARK(mark) \ uint8_t mark[0] __attribute__((aligned(MEMIF_CACHELINE_SIZE))) typedef struct { MEMIF_CACHELINE_ALIGN_MARK (cacheline0); uint32_t cookie; uint16_t flags; #define MEMIF_RING_FLAG_MASK_INT 1 volatile uint16_t head; MEMIF_CACHELINE_ALIGN_MARK (cacheline1); volatile uint16_t tail; MEMIF_CACHELINE_ALIGN_MARK (cacheline2); memif_desc_t desc[0]; } memif_ring_t; #endif /* _MEMIF_H_ */ /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */