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_ENDPOINT_LEARN_SET_INACTIVE_THRESHOLD, gbp_endpoint_learn_set_inactive_threshold) \ 84 _(GBP_VXLAN_TUNNEL_ADD, gbp_vxlan_tunnel_add) \ 85 _(GBP_VXLAN_TUNNEL_DEL, gbp_vxlan_tunnel_del) \ 86 _(GBP_VXLAN_TUNNEL_DUMP, gbp_vxlan_tunnel_dump) 92 #define GBP_MSG_BASE msg_id_base 113 static vl_api_gbp_endpoint_flags_t
116 vl_api_gbp_endpoint_flags_t v = 0;
146 sw_if_index = ntohl (mp->
endpoint.sw_if_index);
161 ip46_address_t tun_src, tun_dst;
167 sw_if_index, ips, &mac,
170 gef, &tun_src, &tun_dst, &handle);
175 sw_if_index, ips, &mac,
186 rmp->
handle = htonl (handle);
194 vl_api_gbp_endpoint_del_reply_t *rmp;
206 vl_api_gbp_endpoint_learn_set_inactive_threshold_reply_t *rmp;
211 REPLY_MACRO (VL_API_GBP_ENDPOINT_LEARN_SET_INACTIVE_THRESHOLD_REPLY +
240 mp->_vl_msg_id = ntohs (VL_API_GBP_ENDPOINT_DETAILS +
GBP_MSG_BASE);
297 vl_api_gbp_endpoint_group_add_reply_t *rmp;
312 vl_api_gbp_endpoint_group_del_reply_t *rmp;
326 a = clib_net_to_host_u32 (a);
337 vl_api_gbp_bridge_domain_add_reply_t *rmp;
343 ntohl (mp->
bd.bvi_sw_if_index),
344 ntohl (mp->
bd.uu_fwd_sw_if_index));
352 vl_api_gbp_bridge_domain_del_reply_t *rmp;
363 vl_api_gbp_route_domain_add_reply_t *rmp;
367 ntohl (mp->
rd.ip4_table_id),
368 ntohl (mp->
rd.ip6_table_id),
369 ntohl (mp->
rd.ip4_uu_sw_if_index),
370 ntohl (mp->
rd.ip6_uu_sw_if_index));
378 vl_api_gbp_route_domain_del_reply_t *rmp;
389 a = clib_net_to_host_u32 (a);
413 vl_api_gbp_subnet_add_del_reply_t *rmp;
437 static vl_api_gbp_subnet_type_t
440 vl_api_gbp_subnet_type_t
a = 0;
458 a = clib_host_to_net_u32 (a);
478 mp->_vl_msg_id = ntohs (VL_API_GBP_SUBNET_DETAILS +
GBP_MSG_BASE);
521 mp->_vl_msg_id = ntohs (VL_API_GBP_ENDPOINT_GROUP_DETAILS +
GBP_MSG_BASE);
563 memset (mp, 0,
sizeof (*mp));
564 mp->_vl_msg_id = ntohs (VL_API_GBP_BRIDGE_DOMAIN_DETAILS +
GBP_MSG_BASE);
604 memset (mp, 0,
sizeof (*mp));
605 mp->_vl_msg_id = ntohs (VL_API_GBP_ROUTE_DOMAIN_DETAILS +
GBP_MSG_BASE);
609 mp->
rd.ip4_uu_sw_if_index =
611 mp->
rd.ip6_uu_sw_if_index =
639 vl_api_gbp_recirc_add_del_reply_t *rmp;
645 goto bad_sw_if_index;
670 mp->_vl_msg_id = ntohs (VL_API_GBP_RECIRC_DETAILS +
GBP_MSG_BASE);
702 vl_api_gbp_ext_itf_add_del_reply_t *rmp;
712 goto bad_sw_if_index;
716 ntohl (ext_itf->
bd_id), ntohl (ext_itf->
rd_id));
737 mp->_vl_msg_id = ntohs (VL_API_GBP_EXT_ITF_DETAILS +
GBP_MSG_BASE);
770 in = clib_net_to_host_u32 (in);
775 *out = GBP_RULE_PERMIT;
778 *out = GBP_RULE_DENY;
781 *out = GBP_RULE_REDIRECT;
791 in = clib_net_to_host_u32 (in);
796 *out = GBP_HASH_MODE_SRC_IP;
799 *out = GBP_HASH_MODE_DST_IP;
802 *out = GBP_HASH_MODE_SYMMETRIC;
819 return (VNET_API_ERROR_BD_NOT_MODIFIABLE);
824 return (VNET_API_ERROR_NO_SUCH_FIB);
850 for (ii = 0; ii < in->n_nhs; ii++)
878 if (GBP_RULE_REDIRECT == action)
887 hash_mode = GBP_HASH_MODE_SRC_IP;
911 for (ii = 0; ii <
n_rules; ii++)
929 vl_api_gbp_contract_add_del_reply_t *rmp;
943 allowed_ethertypes =
NULL;
949 data = (((
u8 *) & mp->
contract.n_ether_types) +
952 et = (
u16 *) (++data);
955 for (ii = 0; ii < n_et; ii++)
958 allowed_ethertypes[ii] = et[ii];
964 rules, allowed_ethertypes);
986 mp->_vl_msg_id = ntohs (VL_API_GBP_CONTRACT_DETAILS +
GBP_MSG_BASE);
1019 mode = clib_net_to_host_u32 (mode);
1024 *l = GBP_VXLAN_TUN_L2;
1027 *l = GBP_VXLAN_TUN_L3;
1048 ntohl (mp->
tunnel.bd_rd_id), &sw_if_index);
1062 vl_api_gbp_vxlan_tunnel_del_reply_t *rmp;
1070 static vl_api_gbp_vxlan_tunnel_mode_t
1077 case GBP_VXLAN_TUN_L2:
1080 case GBP_VXLAN_TUN_L3:
1084 mode = clib_host_to_net_u32 (mode);
1100 memset (mp, 0,
sizeof (*mp));
1101 mp->_vl_msg_id = htons (VL_API_GBP_VXLAN_TUNNEL_DETAILS +
GBP_MSG_BASE);
1137 #define vl_msg_name_crc_list 1139 #undef vl_msg_name_crc_list 1144 #define _(id,n,crc) \ 1145 vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id + GBP_MSG_BASE); 1146 foreach_vl_msg_name_crc_gbp;
1154 vl_msg_api_set_handlers(VL_API_##N + GBP_MSG_BASE, \ 1156 vl_api_##n##_t_handler, \ 1158 vl_api_##n##_t_endian, \ 1159 vl_api_##n##_t_print, \ 1160 sizeof(vl_api_##n##_t), 1); 1190 .version = VPP_BUILD_VER,
1191 .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)
static void vl_api_gbp_endpoint_learn_set_inactive_threshold_t_handler(vl_api_gbp_endpoint_learn_set_inactive_threshold_t *mp)
#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.
void mac_address_encode(const mac_address_t *in, u8 *out)
#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)
A bridge Domain Representation.
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
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)
index_t gg_rd
route-domain/IP-table ID the EPG is in
vl_api_gbp_ext_itf_t ext_itf
int gbp_endpoint_group_add_and_lock(epg_id_t epg_id, u32 bd_id, u32 rd_id, u32 uplink_sw_if_index)
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)
epg_id_t gef_epg_id
Endpoint Group's ID.
static void vl_api_gbp_bridge_domain_add_t_handler(vl_api_gbp_bridge_domain_add_t *mp)
struct gbp_endpoint_loc_t_::@427 tun
Tunnel info for remote endpoints.
int gbp_subnet_add(u32 rd_id, const fib_prefix_t *pfx, gbp_subnet_type_t type, u32 sw_if_index, epg_id_t epg)
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)
void gbp_learn_set_inactive_threshold(u32 threshold)
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)
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.
u16 allowed_ethertypes[n_ether_types]
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)
Set the time throeshold after which an endpoint is considered inative and is aged/reaped by the scann...
static walk_rc_t gbp_endpoint_send_details(index_t gei, void *args)
epg_id_t gr_epg
EPG ID that packets will classify to when they arrive on this recirc.
int gbp_ext_itf_delete(u32 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, epg_id_t epg_id, gbp_endpoint_flags_t flags, const ip46_address_t *tun_src, const ip46_address_t *tun_dst, u32 *handle)
int gbp_endpoint_group_delete(epg_id_t epg_id)
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 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)
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.
vl_api_gbp_next_hop_t nhs[8]
u32 gb_bd_id
Bridge-domain ID.
mac_address_t gek_mac
MAC address of the endpoint.
u32 gel_parent_sw_if_index
int gbp_contract_delete(epg_id_t src_epg, epg_id_t dst_epg)
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
int gbp_vxlan_tunnel_add(u32 vni, gbp_vxlan_tunnel_layer_t layer, u32 bd_rd_id, u32 *sw_if_indexp)
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)
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)
epg_id_t gck_src
source and destination EPGs for which the ACL applies
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
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)
int gbp_contract_update(epg_id_t src_epg, epg_id_t dst_epg, u32 acl_index, index_t *rules, u16 *allowed_ethertypes)
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)
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)
int gbp_recirc_add(u32 sw_if_index, epg_id_t epg_id, u8 is_ext)
GBP VXLAN (template) tunnel.
u32 grd_id
Route-domain ID.
vl_api_gbp_ext_itf_t ext_itf
vl_api_gbp_vxlan_tunnel_mode_t mode
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 walk_rc_t gbp_subnet_send_details(u32 rd_id, const fib_prefix_t *pfx, gbp_subnet_type_t type, u32 sw_if_index, epg_id_t epg, void *args)
static void vl_api_gbp_endpoint_group_del_t_handler(vl_api_gbp_endpoint_group_del_t *mp)
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)