summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatus Fabian <matfabia@cisco.com>2016-05-06 15:14:13 +0200
committerDave Barach <openvpp@barachs.net>2016-05-10 11:10:37 +0000
commit8a95a482cfaf05e89a9383f0446584c414cd71bf (patch)
treed7d65abe93fb9ec2d52b216d452b3bbb3ecec6ab
parent686a5a5b2b22bd7fa31fae134739530a5683b228 (diff)
Add af_packet API
Change-Id: I39409ae9e75fdb59d8cbbd940fa192b24eb79b6a Signed-off-by: Matus Fabian <matfabia@cisco.com>
-rw-r--r--vpp-api-test/vat/api_format.c90
-rw-r--r--vpp/api/api.c44
-rw-r--r--vpp/api/vpe.api46
3 files changed, 176 insertions, 4 deletions
diff --git a/vpp-api-test/vat/api_format.c b/vpp-api-test/vat/api_format.c
index 6f1db386..1c8a14d6 100644
--- a/vpp-api-test/vat/api_format.c
+++ b/vpp-api-test/vat/api_format.c
@@ -2201,7 +2201,9 @@ _(lisp_add_del_local_eid_reply) \
_(lisp_gpe_add_del_fwd_entry_reply) \
_(lisp_add_del_map_resolver_reply) \
_(lisp_gpe_enable_disable_reply) \
-_(lisp_gpe_add_del_iface_reply)
+_(lisp_gpe_add_del_iface_reply) \
+_(af_packet_create_reply) \
+_(af_packet_delete_reply)
#define _(n) \
static void vl_api_##n##_t_handler \
@@ -2379,7 +2381,9 @@ _(LISP_LOCAL_EID_TABLE_DETAILS, lisp_local_eid_table_details) \
_(LISP_GPE_TUNNEL_DETAILS, lisp_gpe_tunnel_details) \
_(LISP_MAP_RESOLVER_DETAILS, lisp_map_resolver_details) \
_(LISP_GPE_ENABLE_DISABLE_STATUS_DETAILS, \
- lisp_gpe_enable_disable_status_details)
+ lisp_gpe_enable_disable_status_details) \
+_(AF_PACKET_CREATE_REPLY, af_packet_create_reply) \
+_(AF_PACKET_DELETE_REPLY, af_packet_delete_reply)
/* M: construct, but don't yet send a message */
@@ -10201,6 +10205,84 @@ api_lisp_gpe_enable_disable_status_dump(vat_main_t *vam)
return 0;
}
+static int
+api_af_packet_create (vat_main_t * vam)
+{
+ unformat_input_t * i = vam->input;
+ vl_api_af_packet_create_t * mp;
+ f64 timeout;
+ u8 * host_if_name = 0;
+ u8 hw_addr[6];
+ u8 random_hw_addr = 1;
+
+ memset (hw_addr, 0, sizeof (hw_addr));
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
+ if (unformat (i, "name %s", &host_if_name))
+ vec_add1 (host_if_name, 0);
+ else if (unformat (i, "hw_addr %U", unformat_ethernet_address, hw_addr))
+ random_hw_addr = 0;
+ else
+ break;
+ }
+
+ if (!vec_len (host_if_name)) {
+ errmsg ("host-interface name must be specified");
+ return -99;
+ }
+
+ if (vec_len (host_if_name) > 64) {
+ errmsg ("host-interface name too long");
+ return -99;
+ }
+
+ M(AF_PACKET_CREATE, af_packet_create);
+
+ clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
+ clib_memcpy (mp->hw_addr, hw_addr, 6);
+ mp->use_random_hw_addr = random_hw_addr;
+ vec_free (host_if_name);
+
+ S; W;
+ /* NOTREACHED */
+ return 0;
+}
+
+static int
+api_af_packet_delete (vat_main_t * vam)
+{
+ unformat_input_t * i = vam->input;
+ vl_api_af_packet_delete_t * mp;
+ f64 timeout;
+ u8 * host_if_name = 0;
+
+ while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) {
+ if (unformat (i, "name %s", &host_if_name))
+ vec_add1 (host_if_name, 0);
+ else
+ break;
+ }
+
+ if (!vec_len (host_if_name)) {
+ errmsg ("host-interface name must be specified");
+ return -99;
+ }
+
+ if (vec_len (host_if_name) > 64) {
+ errmsg ("host-interface name too long");
+ return -99;
+ }
+
+ M(AF_PACKET_DELETE, af_packet_delete);
+
+ clib_memcpy (mp->host_if_name, host_if_name, vec_len (host_if_name));
+ vec_free (host_if_name);
+
+ S; W;
+ /* NOTREACHED */
+ return 0;
+}
+
static int q_or_quit (vat_main_t * vam)
{
longjmp (vam->jump_buf, 1);
@@ -10688,7 +10770,9 @@ _(lisp_locator_set_dump, "") \
_(lisp_local_eid_table_dump, "") \
_(lisp_gpe_tunnel_dump, "") \
_(lisp_map_resolver_dump, "") \
-_(lisp_gpe_enable_disable_status_dump, "")
+_(lisp_gpe_enable_disable_status_dump, "") \
+_(af_packet_create, "name <host interface name> [hw_addr <mac>]") \
+_(af_packet_delete, "name <host interface name>")
/* List of command functions, CLI names map directly to functions */
#define foreach_cli_function \
diff --git a/vpp/api/api.c b/vpp/api/api.c
index 5e808795..4d7a9192 100644
--- a/vpp/api/api.c
+++ b/vpp/api/api.c
@@ -74,6 +74,7 @@
#include <vnet/map/map.h>
#include <vnet/cop/cop.h>
#include <vnet/ip/ip6_hop_by_hop.h>
+#include <vnet/devices/af_packet/af_packet.h>
#undef BIHASH_TYPE
#undef __included_bihash_template_h__
@@ -332,7 +333,10 @@ _(LISP_GPE_TUNNEL_DUMP, lisp_gpe_tunnel_dump) \
_(LISP_MAP_RESOLVER_DUMP, lisp_map_resolver_dump) \
_(LISP_GPE_ENABLE_DISABLE_STATUS_DUMP, \
lisp_gpe_enable_disable_status_dump) \
-_(SR_MULTICAST_MAP_ADD_DEL, sr_multicast_map_add_del)
+_(SR_MULTICAST_MAP_ADD_DEL, sr_multicast_map_add_del) \
+_(SR_MULTICAST_MAP_ADD_DEL, sr_multicast_map_add_del) \
+_(AF_PACKET_CREATE, af_packet_create) \
+_(AF_PACKET_DELETE, af_packet_delete)
#define QUOTE_(x) #x
#define QUOTE(x) QUOTE_(x)
@@ -5861,6 +5865,44 @@ static void vl_api_trace_profile_del_t_handler
REPLY_MACRO(VL_API_TRACE_PROFILE_DEL_REPLY);
}
+static void
+vl_api_af_packet_create_t_handler
+(vl_api_af_packet_create_t *mp)
+{
+ vlib_main_t *vm = vlib_get_main();
+ vl_api_af_packet_create_reply_t *rmp;
+ int rv = 0;
+ u8 *host_if_name = NULL;
+
+ host_if_name = format(0, "%s", mp->host_if_name);
+ vec_add1 (host_if_name, 0);
+
+ rv = af_packet_create_if(vm, host_if_name,
+ mp->use_random_hw_addr ? 0 : mp->hw_addr);
+
+ vec_free(host_if_name);
+
+ REPLY_MACRO(VL_API_AF_PACKET_CREATE_REPLY);
+}
+
+static void
+vl_api_af_packet_delete_t_handler
+(vl_api_af_packet_delete_t *mp)
+{
+ vlib_main_t * vm = vlib_get_main();
+ vl_api_af_packet_delete_reply_t *rmp;
+ int rv = 0;
+ u8 *host_if_name = NULL;
+
+ host_if_name = format(0, "%s", mp->host_if_name);
+ vec_add1 (host_if_name, 0);
+
+ rv = af_packet_delete_if(vm, host_if_name);
+
+ vec_free(host_if_name);
+
+ REPLY_MACRO(VL_API_AF_PACKET_DELETE_REPLY);
+}
#define BOUNCE_HANDLER(nn) \
static void vl_api_##nn##_t_handler ( \
diff --git a/vpp/api/vpe.api b/vpp/api/vpe.api
index 10c62bb3..c92715f4 100644
--- a/vpp/api/vpe.api
+++ b/vpp/api/vpe.api
@@ -3355,3 +3355,49 @@ define trace_profile_del_reply {
u32 context;
i32 retval;
};
+
+/** \brief Create host-interface
+ @param client_index - opaque cookie to identify the sender
+ @param context - sender context, to match reply w/ request
+ @param host_if_name - interface name
+ @param hw_addr - interface MAC
+ @param use_random_hw_addr - use random generated MAC
+*/
+define af_packet_create {
+ u32 client_index;
+ u32 context;
+
+ u8 host_if_name[64];
+ u8 hw_addr[6];
+ u8 use_random_hw_addr;
+};
+
+/** \brief Create host-interface response
+ @param context - sender context, to match reply w/ request
+ @param retval - return value for request
+*/
+define af_packet_create_reply {
+ u32 context;
+ i32 retval;
+};
+
+/** \brief Delete host-interface
+ @param client_index - opaque cookie to identify the sender
+ @param context - sender context, to match reply w/ request
+ @param host_if_name - interface name
+*/
+define af_packet_delete {
+ u32 client_index;
+ u32 context;
+
+ u8 host_if_name[64];
+};
+
+/** \brief Delete host-interface response
+ @param context - sender context, to match reply w/ request
+ @param retval - return value for request
+*/
+define af_packet_delete_reply {
+ u32 context;
+ i32 retval;
+};