#include <vlibapi/api.h>
#include <vlibapi/api.h>
#include <vlibmemory/api.h>
-#include <vlibsocket/api.h>
+
#define vl_msg_id(n,h) n,
typedef enum {
#include <lb/lb.api.h>
#undef vl_msg_name_crc_list
+
+#define REPLY_MSG_ID_BASE lbm->msg_id_base
+#include <vlibapi/api_helper_macros.h>
+
static void
setup_message_id_table (lb_main_t * lbm, api_main_t * am)
{
vec_free (s); \
return handle;
-/*
- * A handy macro to set up a message reply.
- * Assumes that the following variables are available:
- * mp - pointer to request message
- * rmp - pointer to reply message type
- * rv - return value
- */
-
-#define REPLY_MACRO(t) \
-do { \
- unix_shared_memory_queue_t * q = \
- vl_api_client_index_to_input_queue (mp->client_index); \
- if (!q) \
- return; \
- \
- rmp = vl_msg_api_alloc (sizeof (*rmp)); \
- rmp->_vl_msg_id = ntohs((t)+lbm->msg_id_base); \
- rmp->context = mp->context; \
- rmp->retval = ntohl(rv); \
- \
- vl_msg_api_send_shmem (q, (u8 *)&rmp); \
-} while(0);
-
static void
vl_api_lb_conf_t_handler
(vl_api_lb_conf_t * mp)
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
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;
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
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)
{