25 #include <vpp/app/version.h> 40 #include <gbp/gbp.api_enum.h> 41 #include <gbp/gbp.api_types.h> 44 #define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__) 50 #define GBP_MSG_BASE msg_id_base 71 static vl_api_gbp_endpoint_flags_t
74 vl_api_gbp_endpoint_flags_t v = 0;
106 sw_if_index = ntohl (mp->
endpoint.sw_if_index);
121 ip46_address_t tun_src, tun_dst;
127 sw_if_index, ips, &mac,
130 gef, &tun_src, &tun_dst, &handle);
135 sw_if_index, ips, &mac,
138 gef, NULL, NULL, &handle);
146 rmp->
handle = htonl (handle);
154 vl_api_gbp_endpoint_del_reply_t *rmp;
254 vl_api_gbp_endpoint_group_add_reply_t *rmp;
262 ntohl (mp->
epg.bd_id),
263 ntohl (mp->
epg.rd_id),
264 ntohl (mp->
epg.uplink_sw_if_index),
274 vl_api_gbp_endpoint_group_del_reply_t *rmp;
288 a = clib_net_to_host_u32 (a);
305 vl_api_gbp_bridge_domain_add_reply_t *rmp;
309 ntohl (mp->
bd.rd_id),
312 ntohl (mp->
bd.bvi_sw_if_index),
313 ntohl (mp->
bd.uu_fwd_sw_if_index),
314 ntohl (mp->
bd.bm_flood_sw_if_index));
322 vl_api_gbp_bridge_domain_del_reply_t *rmp;
333 vl_api_gbp_route_domain_add_reply_t *rmp;
338 ntohl (mp->
rd.ip4_table_id),
339 ntohl (mp->
rd.ip6_table_id),
340 ntohl (mp->
rd.ip4_uu_sw_if_index),
341 ntohl (mp->
rd.ip6_uu_sw_if_index));
349 vl_api_gbp_route_domain_del_reply_t *rmp;
360 a = clib_net_to_host_u32 (a);
387 vl_api_gbp_subnet_add_del_reply_t *rmp;
402 ntohl (mp->
subnet.sw_if_index),
411 static vl_api_gbp_subnet_type_t
414 vl_api_gbp_subnet_type_t
a = 0;
435 a = clib_host_to_net_u32 (a);
459 mp->
subnet.sw_if_index = ntohl (sw_if_index);
461 mp->
subnet.rd_id = ntohl (rd_id);
542 memset (mp, 0,
sizeof (*mp));
552 mp->
bd.bm_flood_sw_if_index =
588 memset (mp, 0,
sizeof (*mp));
593 mp->
rd.ip4_uu_sw_if_index =
595 mp->
rd.ip6_uu_sw_if_index =
623 vl_api_gbp_recirc_add_del_reply_t *rmp;
627 sw_if_index = ntohl (mp->
recirc.sw_if_index);
629 goto bad_sw_if_index;
686 vl_api_gbp_ext_itf_add_del_reply_t *rmp;
688 vl_api_gbp_ext_itf_t *ext_itf;
693 sw_if_index = ntohl (ext_itf->sw_if_index);
696 goto bad_sw_if_index;
700 ntohl (ext_itf->bd_id), ntohl (ext_itf->rd_id),
701 ntohl (ext_itf->flags));
756 in = clib_net_to_host_u32 (in);
761 *out = GBP_RULE_PERMIT;
764 *out = GBP_RULE_DENY;
767 *out = GBP_RULE_REDIRECT;
777 in = clib_net_to_host_u32 (in);
782 *out = GBP_HASH_MODE_SRC_IP;
785 *out = GBP_HASH_MODE_DST_IP;
788 *out = GBP_HASH_MODE_SYMMETRIC;
805 return (VNET_API_ERROR_BD_NOT_MODIFIABLE);
810 return (VNET_API_ERROR_NO_SUCH_FIB);
836 for (ii = 0; ii < in->n_nhs; ii++)
864 if (GBP_RULE_REDIRECT == action)
873 hash_mode = GBP_HASH_MODE_SRC_IP;
897 for (ii = 0; ii <
n_rules; ii++)
931 allowed_ethertypes = NULL;
939 for (ii = 0; ii < n_et; ii++)
942 allowed_ethertypes[ii] = mp->
contract.allowed_ethertypes[ii];
949 rules, allowed_ethertypes, &stats_index);
1011 mode = clib_net_to_host_u32 (mode);
1016 *l = GBP_VXLAN_TUN_L2;
1019 *l = GBP_VXLAN_TUN_L3;
1042 ntohl (mp->
tunnel.bd_rd_id), &src, &sw_if_index);
1056 vl_api_gbp_vxlan_tunnel_del_reply_t *rmp;
1064 static vl_api_gbp_vxlan_tunnel_mode_t
1071 case GBP_VXLAN_TUN_L2:
1074 case GBP_VXLAN_TUN_L3:
1078 mode = clib_host_to_net_u32 (mode);
1094 memset (mp, 0,
sizeof (*mp));
1095 mp->_vl_msg_id = htons (VL_API_GBP_VXLAN_TUNNEL_DETAILS +
GBP_MSG_BASE);
1124 #include <gbp/gbp.api.c> 1142 .version = VPP_BUILD_VER,
1143 .description =
"Group Based Policy (GBP)",
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
void gbp_bridge_domain_walk(gbp_bridge_domain_cb_t cb, void *ctx)
sclass_t gr_sclass
EPG ID that packets will classify to when they arrive on this recirc.
#define vec_foreach_index(var, v)
Iterate over vector indices.
u32 gb_uu_fwd_sw_if_index
The BD's MAC spine-proxy interface (optional)
static void vl_api_gbp_vxlan_tunnel_dump_t_handler(vl_api_gbp_vxlan_tunnel_dump_t *mp)
void gbp_subnet_walk(gbp_subnet_cb_t cb, void *ctx)
int gbp_endpoint_is_remote(const gbp_endpoint_t *ge)
static gbp_endpoint_t * gbp_endpoint_get(index_t gbpei)
Get the endpoint from a port/interface.
f64 ge_last_time
The last time a packet from seen from this end point.
static int gbp_contract_send_details(gbp_contract_t *gbpc, void *args)
A Group Based Policy Endpoint.
static int gbp_contract_rules_decode(u8 n_rules, const vl_api_gbp_rule_t *rules, index_t **out)
fib_prefix_t * gek_ips
A vector of ip addresses that belong to the endpoint.
static void vl_api_gbp_endpoint_add_t_handler(vl_api_gbp_endpoint_add_t *mp)
vl_api_gbp_endpoint_group_t epg
gbp_contract_key_t gc_key
source and destination EPGs
vl_api_gbp_endpoint_t endpoint
static gbp_endpoint_flags_t gbp_endpoint_flags_decode(vl_api_gbp_endpoint_flags_t v)
static gbp_bridge_domain_flags_t gbp_bridge_domain_flags_from_api(vl_api_gbp_bridge_domain_flags_t a)
vl_api_gbp_subnet_t subnet
void gbp_endpoint_unlock(gbp_endpoint_src_t src, index_t gei)
void ip_prefix_decode(const vl_api_prefix_t *in, fib_prefix_t *out)
Information about the location of the endpoint provided by a source of endpoints. ...
gbp_endpoint_fwd_t ge_fwd
gbp_endpoint_key_t ge_key
The key/ID of this EP.
int gbp_recirc_add(u32 sw_if_index, sclass_t sclass, u8 is_ext)
void mac_address_encode(const mac_address_t *in, u8 *out)
int gbp_bridge_domain_add_and_lock(u32 bd_id, u32 rd_id, gbp_bridge_domain_flags_t flags, u32 bvi_sw_if_index, u32 uu_fwd_sw_if_index, u32 bm_flood_sw_if_index)
#define REPLY_MACRO2(t, body)
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
gbp_endpoint_flags_t gef_flags
static f64 vlib_time_now(vlib_main_t *vm)
static void vl_api_gbp_recirc_dump_t_handler(vl_api_gbp_recirc_dump_t *mp)
static void vl_api_send_msg(vl_api_registration_t *rp, u8 *elem)
static void gbp_retention_decode(const vl_api_gbp_endpoint_retention_t *in, gbp_endpoint_retention_t *out)
A bridge Domain Representation.
int gbp_vxlan_tunnel_add(u32 vni, gbp_vxlan_tunnel_layer_t layer, u32 bd_rd_id, const ip4_address_t *src, u32 *sw_if_indexp)
int gbp_endpoint_group_delete(sclass_t sclass)
u32 index_t
A Data-Path Object is an object that represents actions that are applied to packets are they are swit...
vl_api_gbp_vxlan_tunnel_t tunnel
static void vl_api_gbp_vxlan_tunnel_del_t_handler(vl_api_gbp_vxlan_tunnel_add_t *mp)
void gbp_vxlan_walk(gbp_vxlan_cb_t cb, void *ctx)
vl_api_gbp_vxlan_tunnel_t tunnel
index_t gg_rd
route-domain/IP-table ID the EPG is in
Endpoint Retnetion Policy.
gbp_itf_hdl_t gx_itf
The interface.
vl_api_gbp_ext_itf_t ext_itf
void * vl_msg_api_alloc(int nbytes)
static int gbp_endpoint_group_send_details(gbp_endpoint_group_t *gg, void *args)
gbp_endpoint_src_t gel_src
The source providing this location information.
static void vl_api_gbp_contract_add_del_t_handler(vl_api_gbp_contract_add_del_t *mp)
int gbp_subnet_del(u32 rd_id, const fib_prefix_t *pfx)
static void vl_api_gbp_bridge_domain_add_t_handler(vl_api_gbp_bridge_domain_add_t *mp)
u32 gbp_itf_get_sw_if_index(gbp_itf_hdl_t hdl)
static int gbp_contract_rule_action_deocde(vl_api_gbp_rule_action_t in, gbp_rule_action_t *out)
enum walk_rc_t_ walk_rc_t
Walk return code.
static void vl_api_gbp_vxlan_tunnel_add_t_handler(vl_api_gbp_vxlan_tunnel_add_t *mp)
u8 gr_is_ext
Is the interface for packets post-NAT translation (i.e.
vl_api_gbp_bridge_domain_t bd
enum gbp_bridge_domain_flags_t_ gbp_bridge_domain_flags_t
Bridge Domain Flags.
static int gbp_route_domain_send_details(gbp_route_domain_t *grd, void *args)
int gbp_subnet_add(u32 rd_id, const fib_prefix_t *pfx, gbp_subnet_type_t type, u32 sw_if_index, sclass_t sclass)
static vl_api_gbp_subnet_type_t gub_subnet_type_to_api(gbp_subnet_type_t t)
void gbp_route_domain_walk(gbp_route_domain_cb_t cb, void *ctx)
Aggregate type for a prefix.
static void vl_api_gbp_route_domain_del_t_handler(vl_api_gbp_route_domain_del_t *mp)
A GBP recirculation interface representation Thes interfaces join Bridge domains that are internal to...
index_t gx_bd
The BD this external interface is a member of.
static vl_api_gbp_endpoint_flags_t gbp_endpoint_flags_encode(gbp_endpoint_flags_t f)
ip46_type_t ip_address_decode(const vl_api_address_t *in, ip46_address_t *out)
Decode/Encode for struct/union types.
vl_api_fib_path_type_t type
static walk_rc_t gbp_endpoint_send_details(index_t gei, void *args)
int gbp_ext_itf_delete(u32 sw_if_index)
enum gbp_subnet_type_t_ gbp_subnet_type_t
ip46_address_t fp_addr
The address type is not deriveable from the fp_addr member.
static walk_rc_t gbp_subnet_send_details(u32 rd_id, const fib_prefix_t *pfx, gbp_subnet_type_t type, u32 sw_if_index, sclass_t sclass, void *args)
static void vl_api_gbp_endpoint_group_add_t_handler(vl_api_gbp_endpoint_group_add_t *mp)
static void vl_api_gbp_contract_dump_t_handler(vl_api_gbp_contract_dump_t *mp)
int gbp_route_domain_delete(u32 rd_id)
int gbp_contract_delete(gbp_scope_t scope, sclass_t sclass, sclass_t dclass)
sclass_t gck_src
source and destination EPGs for which the ACL applies
int gbp_endpoint_group_add_and_lock(vnid_t vnid, u16 sclass, u32 bd_id, u32 rd_id, u32 uplink_sw_if_index, const gbp_endpoint_retention_t *retention)
static vl_api_gbp_vxlan_tunnel_mode_t gbp_vxlan_tunnel_layer_2_mode(gbp_vxlan_tunnel_layer_t layer)
u32 grd_uu_sw_if_index[FIB_PROTOCOL_IP_MAX]
The interfaces on which to send packets to unnknown EPs.
u32 remote_ep_timeout
Aging timeout for remote endpoints.
vl_api_gbp_next_hop_t nhs[8]
u32 gb_bd_id
Bridge-domain ID.
u32 gb_rdi
Index of the Route-domain this BD is associated with.
sclass_t gef_sclass
Endpoint Group's sclass.
mac_address_t gek_mac
MAC address of the endpoint.
u32 gel_parent_sw_if_index
vl_api_tunnel_mode_t mode
int gbp_endpoint_update_and_lock(gbp_endpoint_src_t src, u32 sw_if_index, const ip46_address_t *ips, const mac_address_t *mac, index_t gbdi, index_t grdi, sclass_t sclass, gbp_endpoint_flags_t flags, const ip46_address_t *tun_src, const ip46_address_t *tun_dst, u32 *handle)
enum gbp_hash_mode_t_ gbp_hash_mode_t
An external interface maps directly to an oflex L3ExternalInterface.
An Endpoint Group representation.
int gbp_route_domain_add_and_lock(u32 rd_id, gbp_scope_t scope, u32 ip4_table_id, u32 ip6_table_id, u32 ip4_uu_sw_if_index, u32 ip6_uu_sw_if_index)
vl_api_gbp_bridge_domain_t bd
static void vl_api_gbp_recirc_add_del_t_handler(vl_api_gbp_recirc_add_del_t *mp)
An API client registration, only in vpp/vlib.
static void setup_message_id_table(api_main_t *am)
#define BAD_SW_IF_INDEX_LABEL
static uword vnet_sw_if_index_is_api_valid(u32 sw_if_index)
enum gbp_vxlan_tunnel_layer_t_ gbp_vxlan_tunnel_layer_t
static void vl_api_gbp_bridge_domain_dump_t_handler(vl_api_gbp_bridge_domain_dump_t *mp)
int gbp_contract_update(gbp_scope_t scope, sclass_t sclass, sclass_t dclass, u32 acl_index, index_t *rules, u16 *allowed_ethertypes, u32 *stats_index)
void gbp_endpoint_walk(gbp_endpoint_cb_t cb, void *ctx)
#define vec_free(V)
Free vector's memory (no header).
vl_api_gbp_endpoint_retention_t retention
static void vl_api_gbp_ext_itf_add_del_t_handler(vl_api_gbp_ext_itf_add_del_t *mp)
static walk_rc_t gbp_vxlan_tunnel_send_details(gbp_vxlan_tunnel_t *gt, void *args)
static void vl_api_gbp_subnet_add_del_t_handler(vl_api_gbp_subnet_add_del_t *mp)
int gbp_vxlan_tunnel_del(u32 vni)
static vl_api_registration_t * vl_api_client_index_to_registration(u32 index)
vl_api_gbp_endpoint_group_t epg
static void vl_api_gbp_route_domain_dump_t_handler(vl_api_gbp_route_domain_dump_t *mp)
vl_api_gbp_subnet_t subnet
index_t gx_rd
The RD this external interface is a member of.
index_t gbp_bridge_domain_find_and_lock(u32 bd_id)
vl_api_gbp_rule_t rules[n_rules]
static void vl_api_gbp_endpoint_dump_t_handler(vl_api_gbp_endpoint_dump_t *mp)
vl_api_gbp_contract_t contract
enum gbp_endpoint_flags_t_ gbp_endpoint_flags_t
gbp_vxlan_tunnel_layer_t gt_layer
gbp_route_domain_t * gbp_route_domain_get(index_t i)
static void vl_api_gbp_endpoint_group_dump_t_handler(vl_api_gbp_endpoint_group_dump_t *mp)
u32 gb_bvi_sw_if_index
The BD's BVI interface (obligatory)
vl_api_gbp_recirc_t recirc
static clib_error_t * gbp_init(vlib_main_t *vm)
index_t gbp_rule_alloc(gbp_rule_action_t action, gbp_hash_mode_t hash_mode, index_t *nhs)
static f64 clib_host_to_net_f64(f64 x)
static void vl_api_gbp_ext_itf_dump_t_handler(vl_api_gbp_ext_itf_dump_t *mp)
static void vl_api_gbp_subnet_dump_t_handler(vl_api_gbp_subnet_dump_t *mp)
int gbp_bridge_domain_delete(u32 bd_id)
vl_api_gbp_contract_t contract
static vlib_main_t * vlib_get_main(void)
enum gbp_rule_action_t_ gbp_rule_action_t
void gbp_recirc_walk(gbp_recirc_cb_t cb, void *ctx)
vl_api_interface_index_t sw_if_index
void ip_prefix_encode(const fib_prefix_t *in, vl_api_prefix_t *out)
static void vl_api_gbp_endpoint_del_t_handler(vl_api_gbp_endpoint_del_t *mp)
static void vl_api_gbp_route_domain_add_t_handler(vl_api_gbp_route_domain_add_t *mp)
gbp_itf_hdl_t gef_itf
The interface on which the EP is connected.
static int gbp_next_hop_set_decode(const vl_api_gbp_next_hop_set_t *in, gbp_hash_mode_t *hash_mode, index_t **out)
And endpoints current forwarding state.
gbp_itf_hdl_t gb_bm_flood_itf
The BD's interface to sned Broadcast and multicast packets.
vl_api_mac_event_action_t action
vl_api_gbp_endpoint_t endpoint
static walk_rc_t gbp_recirc_send_details(gbp_recirc_t *gr, void *args)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
A route Domain Representation.
u32 gg_uplink_sw_if_index
the uplink interface dedicated to the EPG
static int gbp_next_hop_decode(const vl_api_gbp_next_hop_t *in, index_t *gnhi)
#define INDEX_INVALID
Invalid index - used when no index is known blazoned capitals INVALID speak volumes where ~0 does not...
u32 gbp_route_domain_get_rd_id(index_t grdi)
struct gbp_endpoint_loc_t_::@643 tun
Tunnel info for remote endpoints.
void ip4_address_decode(const vl_api_ip4_address_t in, ip4_address_t *out)
vl_api_registration_t * reg
u32 gx_flags
The associated flags.
void gbp_ext_itf_walk(gbp_ext_itf_cb_t cb, void *ctx)
static int gbp_bridge_domain_send_details(gbp_bridge_domain_t *gb, void *args)
static walk_rc_t gbp_ext_itf_send_details(gbp_ext_itf_t *gx, void *args)
Group Base Policy (GBP) defines:
void ip_address_encode(const ip46_address_t *in, ip46_type_t type, vl_api_address_t *out)
int gbp_recirc_delete(u32 sw_if_index)
GBP VXLAN (template) tunnel.
u32 grd_id
Route-domain ID.
vl_api_gbp_ext_itf_t ext_itf
vl_api_gbp_route_domain_t rd
vl_api_address_t ips[n_ips]
u32 gbp_endpoint_group_get_bd_id(const gbp_endpoint_group_t *gg)
#define vec_foreach(var, vec)
Vector iterator.
static void vl_api_gbp_bridge_domain_del_t_handler(vl_api_gbp_bridge_domain_del_t *mp)
static void vl_api_gbp_endpoint_group_del_t_handler(vl_api_gbp_endpoint_group_del_t *mp)
u16 allowed_ethertypes[16]
u32 gt_bd_rd_id
The BD or RD value (depending on the layer) that the tunnel is bound to.
VLIB_API_INIT_FUNCTION(gbp_init)
gbp_endpoint_loc_t * ge_locs
Location information provided by the various sources.
vl_api_gbp_route_domain_t rd
void gbp_contract_walk(gbp_contract_cb_t cb, void *ctx)
struct gbp_walk_ctx_t_ gbp_walk_ctx_t
static int gbp_contract_rule_decode(const vl_api_gbp_rule_t *in, index_t *gui)
u32 gbp_bridge_domain_get_bd_id(index_t gbdi)
int gbp_ext_itf_add(u32 sw_if_index, u32 bd_id, u32 rd_id, u32 flags)
void mac_address_decode(const u8 *in, mac_address_t *out)
Conversion functions to/from (decode/encode) API types to VPP internal types.
static int gbp_hash_mode_decode(vl_api_gbp_hash_mode_t in, gbp_hash_mode_t *out)
static int gbp_vxlan_tunnel_mode_2_layer(vl_api_gbp_vxlan_tunnel_mode_t mode, gbp_vxlan_tunnel_layer_t *l)
index_t gbp_next_hop_alloc(const ip46_address_t *ip, index_t grd, const mac_address_t *mac, index_t gbd)
vl_api_gbp_recirc_t recirc
vl_api_interface_index_t sw_if_index
index_t gbp_route_domain_find_and_lock(u32 rd_id)
A Group Based Policy Contract.
#define VALIDATE_SW_IF_INDEX(mp)
void gbp_rule_free(index_t gui)
void gbp_endpoint_group_walk(gbp_endpoint_group_cb_t cb, void *ctx)
static int gub_subnet_type_from_api(vl_api_gbp_subnet_type_t a, gbp_subnet_type_t *t)