FD.io VPP  v21.01.1
Vector Packet Processing
gbp_policy_dpo.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2018 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 #ifndef __GBP_POLICY_DPO_H__
17 #define __GBP_POLICY_DPO_H__
18 
19 #include <vnet/dpo/dpo.h>
20 #include <vnet/dpo/load_balance.h>
21 #include <vnet/fib/ip4_fib.h>
22 #include <vnet/fib/ip6_fib.h>
23 
24 /**
25  * @brief
26  * The GBP FWD DPO. Used in the L3 path to select the correct EPG uplink
27  * based on the source EPG.
28  */
29 typedef struct gbp_policy_dpo_t_
30 {
31  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
32 
33  /**
34  * The protocol of packets using this DPO
35  */
37 
38  /**
39  * SClass
40  */
42 
43  /**
44  * sclass scope
45  */
47 
48  /**
49  * output sw_if_index
50  */
52 
53  /**
54  * number of locks.
55  */
57 
58  /**
59  * Stacked DPO on DVR/ADJ of output interface
60  */
63 
64 extern void gbp_policy_dpo_add_or_lock (dpo_proto_t dproto,
67  u32 sw_if_index, dpo_id_t * dpo);
68 
70 
74 
75 /**
76  * Types exposed for the Data-plane
77  */
80 
83 {
84  return (pool_elt_at_index (gbp_policy_dpo_pool, index));
85 }
86 
88 gbp_classify_get_gpd (const ip4_address_t * ip4, const ip6_address_t * ip6,
89  const u32 fib_index)
90 {
91  const gbp_policy_dpo_t *gpd;
92  const dpo_id_t *dpo;
93  const load_balance_t *lb;
94  u32 lbi;
95 
96  if (ip4)
97  lbi = ip4_fib_forwarding_lookup (fib_index, ip4);
98  else if (ip6)
99  lbi = ip6_fib_table_fwding_lookup (fib_index, ip6);
100  else
101  return 0;
102 
103  lb = load_balance_get (lbi);
104  dpo = load_balance_get_bucket_i (lb, 0);
105 
106  if (dpo->dpoi_type != gbp_policy_dpo_type)
107  return 0;
108 
109  gpd = gbp_policy_dpo_get (dpo->dpoi_index);
110  return gpd;
111 }
112 
113 /*
114  * fd.io coding-style-patch-verification: ON
115  *
116  * Local Variables:
117  * eval: (c-set-style "gnu")
118  * End:
119  */
120 
121 #endif
u16 sclass_t
Definition: gbp_types.h:25
static u32 ip6_fib_table_fwding_lookup(u32 fib_index, const ip6_address_t *dst)
Definition: ip6_fib.h:115
void gbp_policy_dpo_add_or_lock(dpo_proto_t dproto, gbp_scope_t scope, sclass_t sclass, u32 sw_if_index, dpo_id_t *dpo)
gbp_policy_dpo_t * gbp_policy_dpo_pool
DPO pool.
struct gbp_policy_dpo_t_ gbp_policy_dpo_t
The GBP FWD DPO.
u32 index_t
A Data-Path Object is an object that represents actions that are applied to packets are they are swit...
Definition: dpo.h:41
vlib_node_registration_t gbp_policy_port_node
(constructor) VLIB_REGISTER_NODE (gbp_policy_port_node)
#define static_always_inline
Definition: clib.h:109
enum dpo_type_t_ dpo_type_t
Common types of data-path objects New types can be dynamically added using dpo_register_new_type() ...
vl_api_ip6_address_t ip6
Definition: one.api:424
u16 gbp_scope_t
Definition: gbp_types.h:24
unsigned int u32
Definition: types.h:88
u32 gpd_sw_if_index
output sw_if_index
enum dpo_proto_t_ dpo_proto_t
Data path protocol.
The identity of a DPO is a combination of its type and its instance number/index of objects of that t...
Definition: dpo.h:170
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:546
The GBP FWD DPO.
dpo_type_t dpoi_type
the type
Definition: dpo.h:176
static const dpo_id_t * load_balance_get_bucket_i(const load_balance_t *lb, u32 bucket)
Definition: load_balance.h:229
unsigned short u16
Definition: types.h:57
u16 sclass
Definition: gbp.api:131
vlib_node_registration_t ip4_gbp_policy_dpo_node
(constructor) VLIB_REGISTER_NODE (ip4_gbp_policy_dpo_node)
The FIB DPO provieds;.
Definition: load_balance.h:106
#define always_inline
Definition: ipsec.h:28
vl_api_ip4_address_t ip4
Definition: one.api:376
vlib_node_registration_t ip6_gbp_policy_dpo_node
(constructor) VLIB_REGISTER_NODE (ip6_gbp_policy_dpo_node)
gbp_scope_t gpd_scope
sclass scope
static_always_inline const gbp_policy_dpo_t * gbp_classify_get_gpd(const ip4_address_t *ip4, const ip6_address_t *ip6, const u32 fib_index)
dpo_type_t gbp_policy_dpo_get_type(void)
sclass_t gpd_sclass
SClass.
static gbp_policy_dpo_t * gbp_policy_dpo_get(index_t index)
static load_balance_t * load_balance_get(index_t lbi)
Definition: load_balance.h:220
u16 gpd_locks
number of locks.
static index_t ip4_fib_forwarding_lookup(u32 fib_index, const ip4_address_t *addr)
Definition: ip4_fib.h:160
dpo_type_t gbp_policy_dpo_type
Types exposed for the Data-plane.
struct _vlib_node_registration vlib_node_registration_t
index_t dpoi_index
the index of objects of that type
Definition: dpo.h:188
dpo_id_t gpd_dpo
Stacked DPO on DVR/ADJ of output interface.
u32 index
Definition: flow_types.api:221
CLIB_CACHE_LINE_ALIGN_MARK(cacheline0)
dpo_proto_t gpd_proto
The protocol of packets using this DPO.
vl_api_gbp_scope_t scope
Definition: gbp.api:78
vl_api_interface_index_t sw_if_index
Definition: wireguard.api:34