X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Flb%2Fapi.c;h=c392123c79285914cf848f65582ffea58d7267e6;hb=6a4375e0;hp=9e3bcd651a0f95469d9b688fbff156c4f5cd9b6d;hpb=b614d08368cc0b04e01c5222d4c11a88845394e5;p=vpp.git diff --git a/src/plugins/lb/api.c b/src/plugins/lb/api.c index 9e3bcd651a0..c392123c792 100644 --- a/src/plugins/lb/api.c +++ b/src/plugins/lb/api.c @@ -19,7 +19,7 @@ #include #include #include -#include + #define vl_msg_id(n,h) n, typedef enum { @@ -107,26 +107,60 @@ vl_api_lb_add_del_vip_t_handler lb_main_t *lbm = &lb_main; vl_api_lb_conf_reply_t * rmp; int rv = 0; - ip46_address_t prefix; - memcpy(&prefix.ip6, mp->ip_prefix, sizeof(prefix.ip6)); + lb_vip_add_args_t args; + + if((mp->protocol != IP_PROTOCOL_TCP) + && (mp->protocol != IP_PROTOCOL_UDP)) + { + mp->protocol = ~0; + mp->port = 0; + } + + memcpy (&(args.prefix.ip6), mp->ip_prefix, sizeof(args.prefix.ip6)); if (mp->is_del) { u32 vip_index; - if (!(rv = lb_vip_find_index(&prefix, mp->prefix_length, &vip_index))) + if (!(rv = lb_vip_find_index(&(args.prefix), mp->prefix_length, + mp->protocol, mp->port, &vip_index))) rv = lb_vip_del(vip_index); } else { u32 vip_index; - lb_vip_type_t type; - if (ip46_prefix_is_ip4(&prefix, mp->prefix_length)) { - type = mp->is_gre4?LB_VIP_TYPE_IP4_GRE4:LB_VIP_TYPE_IP4_GRE6; + lb_vip_type_t type = 0; + + if (ip46_prefix_is_ip4(&(args.prefix), mp->prefix_length)) { + if (mp->encap == LB_ENCAP_TYPE_GRE4) + type = LB_VIP_TYPE_IP4_GRE4; + else if (mp->encap == LB_ENCAP_TYPE_GRE6) + type = LB_VIP_TYPE_IP4_GRE6; + else if (mp->encap == LB_ENCAP_TYPE_L3DSR) + type = LB_VIP_TYPE_IP4_L3DSR; + else if (mp->encap == LB_ENCAP_TYPE_NAT4) + type = LB_VIP_TYPE_IP4_NAT4; } else { - type = mp->is_gre4?LB_VIP_TYPE_IP6_GRE4:LB_VIP_TYPE_IP6_GRE6; + if (mp->encap == LB_ENCAP_TYPE_GRE4) + type = LB_VIP_TYPE_IP6_GRE4; + else if (mp->encap == LB_ENCAP_TYPE_GRE6) + type = LB_VIP_TYPE_IP6_GRE6; + else if (mp->encap == LB_ENCAP_TYPE_NAT6) + type = LB_VIP_TYPE_IP6_NAT6; } - rv = lb_vip_add(&prefix, mp->prefix_length, type, - mp->new_flows_table_length, &vip_index); + args.plen = mp->prefix_length; + args.type = type; + args.new_length = ntohl(mp->new_flows_table_length); + + if (mp->encap == LB_ENCAP_TYPE_L3DSR) { + args.encap_args.dscp = (u8)(mp->dscp & 0x3F); + } + else if ((mp->encap == LB_ENCAP_TYPE_NAT4) + ||(mp->encap == LB_ENCAP_TYPE_NAT6)) { + args.encap_args.srv_type = mp->type; + args.encap_args.target_port = ntohs(mp->target_port); + } + + rv = lb_vip_add(args, &vip_index); } - REPLY_MACRO (VL_API_LB_CONF_REPLY); + REPLY_MACRO (VL_API_LB_ADD_DEL_VIP_REPLY); } static void *vl_api_lb_add_del_vip_t_print @@ -136,7 +170,26 @@ static void *vl_api_lb_add_del_vip_t_print s = format (0, "SCRIPT: lb_add_del_vip "); s = format (s, "%U ", format_ip46_prefix, (ip46_address_t *)mp->ip_prefix, mp->prefix_length, IP46_TYPE_ANY); - s = format (s, "%s ", mp->is_gre4?"gre4":"gre6"); + + s = format (s, "%s ", (mp->encap == LB_ENCAP_TYPE_GRE4)? "gre4" + : (mp->encap == LB_ENCAP_TYPE_GRE6)? "gre6" + : (mp->encap == LB_ENCAP_TYPE_NAT4)? "nat4" + : (mp->encap == LB_ENCAP_TYPE_NAT6)? "nat6" + : "l3dsr"); + + if (mp->encap==LB_ENCAP_TYPE_L3DSR) + { + s = format (s, "dscp %u ", mp->dscp); + } + + if ((mp->encap==LB_ENCAP_TYPE_NAT4) + || (mp->encap==LB_ENCAP_TYPE_NAT6)) + { + s = format (s, "type %u ", mp->type); + s = format (s, "port %u ", mp->port); + s = format (s, "target_port %u ", mp->target_port); + } + s = format (s, "%u ", mp->new_flows_table_length); s = format (s, "%s ", mp->is_del?"del":"add"); FINISH; @@ -150,17 +203,27 @@ vl_api_lb_add_del_as_t_handler vl_api_lb_conf_reply_t * rmp; int rv = 0; u32 vip_index; - if ((rv = lb_vip_find_index((ip46_address_t *)mp->vip_ip_prefix, - mp->vip_prefix_length, &vip_index))) + ip46_address_t vip_ip_prefix; + + memcpy(&vip_ip_prefix.ip6, mp->vip_ip_prefix, + sizeof(vip_ip_prefix.ip6)); + + ip46_address_t as_address; + + memcpy(&as_address.ip6, mp->as_address, + sizeof(as_address.ip6)); + + if ((rv = lb_vip_find_index(&vip_ip_prefix, mp->vip_prefix_length, + mp->protocol, mp->port, &vip_index))) goto done; if (mp->is_del) - rv = lb_vip_del_ass(vip_index, (ip46_address_t *)mp->as_address, 1); + rv = lb_vip_del_ass(vip_index, &as_address, 1, mp->is_flush); else - rv = lb_vip_add_ass(vip_index, (ip46_address_t *)mp->as_address, 1); + rv = lb_vip_add_ass(vip_index, &as_address, 1); done: - REPLY_MACRO (VL_API_LB_CONF_REPLY); + REPLY_MACRO (VL_API_LB_ADD_DEL_AS_REPLY); } static void *vl_api_lb_add_del_as_t_print @@ -176,11 +239,54 @@ static void *vl_api_lb_add_del_as_t_print FINISH; } +static void +vl_api_lb_flush_vip_t_handler +(vl_api_lb_flush_vip_t * mp) +{ + lb_main_t *lbm = &lb_main; + int rv = 0; + ip46_address_t vip_prefix; + u8 vip_plen; + u32 vip_index; + vl_api_lb_flush_vip_reply_t * rmp; + + if (mp->port == 0) + { + mp->protocol = ~0; + } + + memcpy (&(vip_prefix.ip6), mp->ip_prefix, sizeof(vip_prefix.ip6)); + + vip_plen = mp->prefix_length; + + rv = lb_vip_find_index(&vip_prefix, vip_plen, mp->protocol, + (u16)mp->port, &vip_index); + + rv = lb_flush_vip_as(vip_index, ~0); + + REPLY_MACRO (VL_API_LB_FLUSH_VIP_REPLY); +} + +static void *vl_api_lb_flush_vip_t_print +(vl_api_lb_flush_vip_t *mp, void * handle) +{ + u8 * s; + s = format (0, "SCRIPT: lb_add_del_vip "); + s = format (s, "%U ", format_ip46_prefix, + (ip46_address_t *)mp->ip_prefix, mp->prefix_length, IP46_TYPE_ANY); + + s = format (s, "protocol %u ", mp->protocol); + s = format (s, "port %u ", mp->port); + + FINISH; +} + /* List of message types that this plugin understands */ #define foreach_lb_plugin_api_msg \ _(LB_CONF, lb_conf) \ _(LB_ADD_DEL_VIP, lb_add_del_vip) \ -_(LB_ADD_DEL_AS, lb_add_del_as) +_(LB_ADD_DEL_AS, lb_add_del_as) \ +_(LB_FLUSH_VIP, lb_flush_vip) static clib_error_t * lb_api_init (vlib_main_t * vm) {