From 9e6ed6e2e1b8af46a317f9448da2bca8d8c5395d Mon Sep 17 00:00:00 2001 From: Pavel Kotucek Date: Tue, 12 Jul 2016 10:18:26 +0200 Subject: Add API calls for packet generator Added new API to: - create packet generator interface - enable packet generator per stream or all - capture into file Change-Id: I0e6c1f28069853e4b26f0dc9d282353b0b7f6512 Signed-off-by: Pavel Kotucek --- vpp/vpp-api/api.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++- vpp/vpp-api/custom_dump.c | 46 ++++++++++++++++++++++++- vpp/vpp-api/vpe.api | 71 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 200 insertions(+), 2 deletions(-) (limited to 'vpp/vpp-api') diff --git a/vpp/vpp-api/api.c b/vpp/vpp-api/api.c index 4fe183bc..91ec833e 100644 --- a/vpp/vpp-api/api.c +++ b/vpp/vpp-api/api.c @@ -370,7 +370,10 @@ _(CLASSIFY_SESSION_DUMP,classify_session_dump) \ _(CLASSIFY_SESSION_DETAILS,classify_session_details) \ _(IPFIX_ENABLE,ipfix_enable) \ _(IPFIX_DUMP,ipfix_dump) \ -_(GET_NEXT_INDEX, get_next_index) +_(GET_NEXT_INDEX, get_next_index) \ +_(PG_CREATE_INTERFACE, pg_create_interface) \ +_(PG_CAPTURE, pg_capture) \ +_(PG_ENABLE_DISABLE, pg_enable_disable) #define QUOTE_(x) #x #define QUOTE(x) QUOTE_(x) @@ -7212,6 +7215,86 @@ static void vl_api_ipfix_dump_t_handler (vl_api_ipfix_dump_t *mp) vl_msg_api_send_shmem (q, (u8 *)&rmp); } +static void vl_api_pg_create_interface_t_handler (vl_api_pg_create_interface_t *mp) +{ + vl_api_pg_create_interface_reply_t *rmp; + int rv = 0; + + pg_main_t * pg = &pg_main; + u32 sw_if_index = pg_interface_add_or_get (pg, ntohl(mp->interface_id)); + + REPLY_MACRO2(VL_API_PG_CREATE_INTERFACE_REPLY, + ({ + rmp->sw_if_index = ntohl(sw_if_index); + })); +} + +static void vl_api_pg_capture_t_handler (vl_api_pg_capture_t *mp) +{ + vl_api_pg_capture_reply_t *rmp; + int rv = 0; + + vnet_main_t * vnm = vnet_get_main(); + vnet_interface_main_t * im = &vnm->interface_main; + vnet_hw_interface_t * hi = 0; + + u8 * intf_name = format (0, "pg%d", ntohl(mp->interface_id), 0); + u32 hw_if_index = ~0; + uword * p = hash_get_mem (im->hw_interface_by_name, intf_name); + if (p) + hw_if_index = *p; + vec_free (intf_name); + + if (hw_if_index != ~0) { + pg_capture_args_t _a, *a=&_a; + + u32 len = ntohl(mp->pcap_name_length); + u8 * pcap_file_name = vec_new(u8, len); + clib_memcpy(pcap_file_name, mp->pcap_file_name, len); + + hi = vnet_get_sup_hw_interface (vnm, hw_if_index); + a->hw_if_index = hw_if_index; + a->dev_instance = hi->dev_instance; + a->is_enabled = mp->is_enabled; + a->pcap_file_name = pcap_file_name; + a->count = ntohl(mp->count); + + clib_error_t * e = pg_capture (a); + if (e) { + clib_error_report(e); + rv = VNET_API_ERROR_CANNOT_CREATE_PCAP_FILE; + } + + vec_free (pcap_file_name); + } + REPLY_MACRO(VL_API_PG_CAPTURE_REPLY); +} + +static void vl_api_pg_enable_disable_t_handler (vl_api_pg_enable_disable_t *mp) +{ + vl_api_pg_enable_disable_reply_t *rmp; + int rv = 0; + + pg_main_t * pg = &pg_main; + u32 stream_index = ~0; + + int is_enable = mp->is_enabled != 0; + u32 len = ntohl(mp->stream_name_length)-1; + + if (len>0) { + u8 * stream_name = vec_new(u8, len); + clib_memcpy(stream_name, mp->stream_name, len); + uword * p = hash_get_mem (pg->stream_index_by_name, stream_name); + if (p) + stream_index = *p; + vec_free(stream_name); + } + + pg_enable_disable (stream_index, is_enable); + + REPLY_MACRO(VL_API_PG_ENABLE_DISABLE_REPLY); +} + #define BOUNCE_HANDLER(nn) \ static void vl_api_##nn##_t_handler ( \ vl_api_##nn##_t *mp) \ diff --git a/vpp/vpp-api/custom_dump.c b/vpp/vpp-api/custom_dump.c index 4e8b0642..cb91d73c 100644 --- a/vpp/vpp-api/custom_dump.c +++ b/vpp/vpp-api/custom_dump.c @@ -1887,6 +1887,47 @@ static void *vl_api_get_next_index_t_print FINISH; } +static void *vl_api_pg_create_interface_t_print +(vl_api_pg_create_interface_t * mp, void *handle) +{ + u8 * s; + + s = format (0, "SCRIPT: pg_create_interface "); + s = format (0, "if_id %d", ntohl(mp->interface_id)); + + FINISH; +} + +static void *vl_api_pg_capture_t_print +(vl_api_pg_capture_t * mp, void *handle) +{ + u8 * s; + + s = format (0, "SCRIPT: pg_capture "); + s = format (0, "if_id %d ", ntohl(mp->interface_id)); + s = format (0, "pcap %s", mp->pcap_file_name); + if (mp->count != ~0) + s = format (s, "count %d ", ntohl(mp->count)); + if (!mp->is_enabled) + s = format (s, "disable"); + + FINISH; +} + +static void *vl_api_pg_enable_disable_t_print +(vl_api_pg_enable_disable_t * mp, void *handle) +{ + u8 * s; + + s = format (0, "SCRIPT: pg_enable_disable "); + if (ntohl(mp->stream_name_length) > 0) + s = format (s, "stream %s", mp->stream_name); + if (!mp->is_enabled) + s = format (s, "disable"); + + FINISH; +} + #define foreach_custom_print_function \ _(CREATE_LOOPBACK, create_loopback) \ _(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags) \ @@ -1985,7 +2026,10 @@ _(CLASSIFY_TABLE_INFO,classify_table_info) \ _(CLASSIFY_SESSION_DUMP,classify_session_dump) \ _(IPFIX_ENABLE,ipfix_enable) \ _(IPFIX_DUMP,ipfix_dump) \ -_(GET_NEXT_INDEX, get_next_index) +_(GET_NEXT_INDEX, get_next_index) \ +_(PG_CREATE_INTERFACE,pg_create_interface) \ +_(PG_CAPTURE, pg_capture) \ +_(PG_ENABLE_DISABLE, pg_enable_disable) void vl_msg_api_custom_dump_configure (api_main_t *am) { diff --git a/vpp/vpp-api/vpe.api b/vpp/vpp-api/vpe.api index 69ef7088..2ec4d770 100644 --- a/vpp/vpp-api/vpe.api +++ b/vpp/vpp-api/vpe.api @@ -4134,3 +4134,74 @@ define get_next_index_reply { i32 retval; u32 next_index; }; + +/** \brief PacketGenerator create interface request + @param client_index - opaque cookie to identify the sender + @param context - sender context, to match reply w/ request + @param interface_id - interface index +*/ +define pg_create_interface { + u32 client_index; + u32 context; + u32 interface_id; +}; + +/** \brief PacketGenerator create interface response + @param context - sender context, to match reply w/ request + @param retval - return value for request +*/ +define pg_create_interface_reply { + u32 context; + i32 retval; + u32 sw_if_index; +}; + +/** \brief PacketGenerator capture packets on given interface request + @param client_index - opaque cookie to identify the sender + @param context - sender context, to match reply w/ request + @param interface_id - pg interface index + @param is_enabled - 1 if enabling streams, 0 if disabling + @param count - number of packets to be captured + @param pcap_file - pacp file name to store captured packets +*/ +define pg_capture { + u32 client_index; + u32 context; + u32 interface_id; + u8 is_enabled; + u32 count; + u32 pcap_name_length; + u8 pcap_file_name[pcap_name_length]; +}; + +/** \brief PacketGenerator capture packets response + @param context - sender context, to match reply w/ request + @param retval - return value for request +*/ +define pg_capture_reply { + u32 context; + i32 retval; +}; + +/** \brief Enable / disable packet generator request + @param client_index - opaque cookie to identify the sender + @param context - sender context, to match reply w/ request + @param is_enabled - 1 if enabling streams, 0 if disabling + @param stream - stream name to be enable/disabled, if not specified handle all streams +*/ +define pg_enable_disable { + u32 client_index; + u32 context; + u8 is_enabled; + u32 stream_name_length; + u8 stream_name[stream_name_length]; +}; + +/** \brief Reply for enable / disable packet generator + @param context - returned sender context, to match reply w/ request + @param retval - return code +*/ +define pg_enable_disable_reply { + u32 context; + i32 retval; +}; -- cgit 1.2.3-korg