25 #include <vpp/app/version.h> 50 #define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__) 56 #define vl_api_version(n,v) static u32 api_version=(v); 62 #define foreach_gbp_api_msg \ 63 _(GBP_ENDPOINT_ADD, gbp_endpoint_add) \ 64 _(GBP_ENDPOINT_DEL, gbp_endpoint_del) \ 65 _(GBP_ENDPOINT_DUMP, gbp_endpoint_dump) \ 66 _(GBP_SUBNET_ADD_DEL, gbp_subnet_add_del) \ 67 _(GBP_SUBNET_DUMP, gbp_subnet_dump) \ 68 _(GBP_ENDPOINT_GROUP_ADD, gbp_endpoint_group_add) \ 69 _(GBP_ENDPOINT_GROUP_DEL, gbp_endpoint_group_del) \ 70 _(GBP_ENDPOINT_GROUP_DUMP, gbp_endpoint_group_dump) \ 71 _(GBP_BRIDGE_DOMAIN_ADD, gbp_bridge_domain_add) \ 72 _(GBP_BRIDGE_DOMAIN_DEL, gbp_bridge_domain_del) \ 73 _(GBP_BRIDGE_DOMAIN_DUMP, gbp_bridge_domain_dump) \ 74 _(GBP_ROUTE_DOMAIN_ADD, gbp_route_domain_add) \ 75 _(GBP_ROUTE_DOMAIN_DEL, gbp_route_domain_del) \ 76 _(GBP_ROUTE_DOMAIN_DUMP, gbp_route_domain_dump) \ 77 _(GBP_RECIRC_ADD_DEL, gbp_recirc_add_del) \ 78 _(GBP_RECIRC_DUMP, gbp_recirc_dump) \ 79 _(GBP_EXT_ITF_ADD_DEL, gbp_ext_itf_add_del) \ 80 _(GBP_EXT_ITF_DUMP, gbp_ext_itf_dump) \ 81 _(GBP_CONTRACT_ADD_DEL, gbp_contract_add_del) \ 82 _(GBP_CONTRACT_DUMP, gbp_contract_dump) \ 83 _(GBP_VXLAN_TUNNEL_ADD, gbp_vxlan_tunnel_add) \ 84 _(GBP_VXLAN_TUNNEL_DEL, gbp_vxlan_tunnel_del) \ 85 _(GBP_VXLAN_TUNNEL_DUMP, gbp_vxlan_tunnel_dump) 91 #define GBP_MSG_BASE msg_id_base 112 static vl_api_gbp_endpoint_flags_t
115 vl_api_gbp_endpoint_flags_t v = 0;
145 sw_if_index = ntohl (mp->
endpoint.sw_if_index);
160 ip46_address_t tun_src, tun_dst;
166 sw_if_index, ips, &mac,
169 gef, &tun_src, &tun_dst, &handle);
174 sw_if_index, ips, &mac,
185 rmp->
handle = htonl (handle);
193 vl_api_gbp_endpoint_del_reply_t *rmp;
226 mp->_vl_msg_id = ntohs (VL_API_GBP_ENDPOINT_DETAILS +
GBP_MSG_BASE);
290 vl_api_gbp_endpoint_group_add_reply_t *rmp;
310 vl_api_gbp_endpoint_group_del_reply_t *rmp;
324 a = clib_net_to_host_u32 (a);
341 vl_api_gbp_bridge_domain_add_reply_t *rmp;
347 ntohl (mp->
bd.bvi_sw_if_index),
348 ntohl (mp->
bd.uu_fwd_sw_if_index),
349 ntohl (mp->
bd.bm_flood_sw_if_index));
357 vl_api_gbp_bridge_domain_del_reply_t *rmp;
368 vl_api_gbp_route_domain_add_reply_t *rmp;
372 ntohl (mp->
rd.ip4_table_id),
373 ntohl (mp->
rd.ip6_table_id),
374 ntohl (mp->
rd.ip4_uu_sw_if_index),
375 ntohl (mp->
rd.ip6_uu_sw_if_index));
383 vl_api_gbp_route_domain_del_reply_t *rmp;
394 a = clib_net_to_host_u32 (a);
418 vl_api_gbp_subnet_add_del_reply_t *rmp;
442 static vl_api_gbp_subnet_type_t
445 vl_api_gbp_subnet_type_t
a = 0;
463 a = clib_host_to_net_u32 (a);
483 mp->_vl_msg_id = ntohs (VL_API_GBP_SUBNET_DETAILS +
GBP_MSG_BASE);
526 mp->_vl_msg_id = ntohs (VL_API_GBP_ENDPOINT_GROUP_DETAILS +
GBP_MSG_BASE);
569 memset (mp, 0,
sizeof (*mp));
570 mp->_vl_msg_id = ntohs (VL_API_GBP_BRIDGE_DOMAIN_DETAILS +
GBP_MSG_BASE);
611 memset (mp, 0,
sizeof (*mp));
612 mp->_vl_msg_id = ntohs (VL_API_GBP_ROUTE_DOMAIN_DETAILS +
GBP_MSG_BASE);
616 mp->
rd.ip4_uu_sw_if_index =
618 mp->
rd.ip6_uu_sw_if_index =
646 vl_api_gbp_recirc_add_del_reply_t *rmp;
652 goto bad_sw_if_index;
677 mp->_vl_msg_id = ntohs (VL_API_GBP_RECIRC_DETAILS +
GBP_MSG_BASE);
709 vl_api_gbp_ext_itf_add_del_reply_t *rmp;
719 goto bad_sw_if_index;
723 ntohl (ext_itf->
bd_id), ntohl (ext_itf->
rd_id));
744 mp->_vl_msg_id = ntohs (VL_API_GBP_EXT_ITF_DETAILS +
GBP_MSG_BASE);
777 in = clib_net_to_host_u32 (in);
782 *out = GBP_RULE_PERMIT;
785 *out = GBP_RULE_DENY;
788 *out = GBP_RULE_REDIRECT;
798 in = clib_net_to_host_u32 (in);
803 *out = GBP_HASH_MODE_SRC_IP;
806 *out = GBP_HASH_MODE_DST_IP;
809 *out = GBP_HASH_MODE_SYMMETRIC;
826 return (VNET_API_ERROR_BD_NOT_MODIFIABLE);
831 return (VNET_API_ERROR_NO_SUCH_FIB);
857 for (ii = 0; ii < in->n_nhs; ii++)
885 if (GBP_RULE_REDIRECT == action)
894 hash_mode = GBP_HASH_MODE_SRC_IP;
918 for (ii = 0; ii <
n_rules; ii++)
938 u32 stats_index = ~0;
950 allowed_ethertypes =
NULL;
958 for (ii = 0; ii < n_et; ii++)
961 allowed_ethertypes[ii] = mp->
contract.allowed_ethertypes[ii];
967 rules, allowed_ethertypes, &stats_index);
994 mp->_vl_msg_id = ntohs (VL_API_GBP_CONTRACT_DETAILS +
GBP_MSG_BASE);
1027 mode = clib_net_to_host_u32 (mode);
1032 *l = GBP_VXLAN_TUN_L2;
1035 *l = GBP_VXLAN_TUN_L3;
1058 ntohl (mp->
tunnel.bd_rd_id), &src, &sw_if_index);
1072 vl_api_gbp_vxlan_tunnel_del_reply_t *rmp;
1080 static vl_api_gbp_vxlan_tunnel_mode_t
1087 case GBP_VXLAN_TUN_L2:
1090 case GBP_VXLAN_TUN_L3:
1094 mode = clib_host_to_net_u32 (mode);
1110 memset (mp, 0,
sizeof (*mp));
1111 mp->_vl_msg_id = htons (VL_API_GBP_VXLAN_TUNNEL_DETAILS +
GBP_MSG_BASE);
1147 #define vl_msg_name_crc_list 1149 #undef vl_msg_name_crc_list 1154 #define _(id,n,crc) \ 1155 vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id + GBP_MSG_BASE); 1156 foreach_vl_msg_name_crc_gbp;
1164 vl_msg_api_set_handlers(VL_API_##N + GBP_MSG_BASE, \ 1166 vl_api_##n##_t_handler, \ 1168 vl_api_##n##_t_endian, \ 1169 vl_api_##n##_t_print, \ 1170 sizeof(vl_api_##n##_t), 1); 1200 .version = VPP_BUILD_VER,
1201 .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)
struct gbp_endpoint_loc_t_::@437 tun
Tunnel info for remote endpoints.
#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)
int gbp_route_domain_add_and_lock(u32 rd_id, u32 ip4_table_id, u32 ip6_table_id, u32 ip4_uu_sw_if_index, u32 ip6_uu_sw_if_index)
index_t gef_itf
The interface on which the EP is connected.
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.
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)
vl_api_gbp_endpoint_retention_t retention
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)
int gbp_contract_update(sclass_t sclass, sclass_t dclass, u32 acl_index, index_t *rules, u16 *allowed_ethertypes, u32 *stats_index)
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)
Aggregrate type for a prefix.
static void vl_api_gbp_route_domain_del_t_handler(vl_api_gbp_route_domain_del_t *mp)
static void setup_message_id_table(api_main_t *am)
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)
static walk_rc_t gbp_endpoint_send_details(index_t gei, void *args)
int gbp_ext_itf_delete(u32 sw_if_index)
int gbp_bridge_domain_add_and_lock(u32 bd_id, gbp_bridge_domain_flags_t flags, u32 bvi_sw_if_index, u32 uu_fwd_sw_if_index, u32 bm_flood_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)
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)
int gbp_ext_itf_add(u32 sw_if_index, u32 bd_id, u32 rd_id)
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.
sclass_t gef_sclass
Endpoint Group's sclass.
mac_address_t gek_mac
MAC address of the endpoint.
u32 gel_parent_sw_if_index
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.
API main structure, used by both vpp and binary API clients.
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.
#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
u32 gb_bm_flood_sw_if_index
The BD's interface to sned Broadcast and multicast packets.
static void vl_api_gbp_bridge_domain_dump_t_handler(vl_api_gbp_bridge_domain_dump_t *mp)
int gbp_contract_delete(sclass_t sclass, sclass_t dclass)
void gbp_endpoint_walk(gbp_endpoint_cb_t cb, void *ctx)
#define vec_free(V)
Free vector's memory (no header).
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
vl_api_vxlan_gbp_api_tunnel_mode_t mode
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
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 void gbp_api_hookup(vlib_main_t *vm)
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_gbp_subnet_type_t type
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)
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.
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)
void ip4_address_decode(const vl_api_ip4_address_t in, ip4_address_t *out)
vl_api_registration_t * reg
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)
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)
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
index_t gbp_route_domain_find_and_lock(u32 rd_id)
A Group Based Policy Contract.
#define VALIDATE_SW_IF_INDEX(mp)
u16 vl_msg_api_get_msg_ids(const char *name, int n)
void gbp_endpoint_group_walk(gbp_endpoint_group_cb_t cb, void *ctx)
#define foreach_gbp_api_msg
static int gub_subnet_type_from_api(vl_api_gbp_subnet_type_t a, gbp_subnet_type_t *t)