diff options
author | Dave Barach <dave@barachs.net> | 2016-11-10 14:22:49 -0500 |
---|---|---|
committer | Damjan Marion <dmarion.lists@gmail.com> | 2016-11-21 18:11:41 +0000 |
commit | 557d128b68a1213e056f5eed9fe6f230ca3f3144 (patch) | |
tree | 6b31ac462efacf3f6937788c9b7af1420497c9fc /build-root/emacs-lisp | |
parent | fca670b0ec9f74aa977fe479a5517ad6367ee898 (diff) |
Add client-side msg_name_and_crc -> msg_index table
vppapigen now generates per-message crcs. Verified that whitespace
and real changes in message A don't change the crc for message B, etc.
Fixed the sample and flowperpkt plugins to participate. Others need
the same treatment. They don't build due to python/java language binding
build issues.
To use the scheme:
Client connects as usual.
Then call: u32 vl_api_get_msg_index(char * name_and_crc)
name_and_crc is a string like: "flowperpkt_tx_interface_add_del_753301f3",
aka the message name with _%08x <expected crc> appended.
Try these vpp-api-test commands to play with it:
vat# dump_msg_api_table
<snip>
[366]: punt_reply_cca27fbe
[367]: ipsec_spd_dump_5e9ae88e
[368]: ipsec_spd_details_6f7821b0
[369]: sample_macswap_enable_disable_0f2813e2
[370]: sample_macswap_enable_disable_reply_476738e5
[371]: flowperpkt_tx_interface_add_del_753301f3
[372]: flowperpkt_tx_interface_add_del_reply_d47e6e0b
vat# get_msg_id sample_macswap_enable_disable_reply_476738e5
'sample_macswap_enable_disable_reply_476738e5' has message index 370
vat# get_msg_id sample_macswap_enable_disable_reply_476738e3
'sample_macswap_enable_disable_reply_476738e3' not found
CRCs may vary, etc.
vppapigen is used to build a set of JSON representations
of each API file from vpp-api/Makefile.am and that is in
turn used by each language binding (Java, Python, Lua).
Change-Id: I3d64582e779dac5f20cddec79c562c288d8fd9c6
Signed-off-by: Dave Barach <dave@barachs.net>
Signed-off-by: Ole Troan <ot@cisco.com>
Diffstat (limited to 'build-root/emacs-lisp')
-rw-r--r-- | build-root/emacs-lisp/plugin-main-skel.el | 49 |
1 files changed, 31 insertions, 18 deletions
diff --git a/build-root/emacs-lisp/plugin-main-skel.el b/build-root/emacs-lisp/plugin-main-skel.el index 196f8653817..47240695d4f 100644 --- a/build-root/emacs-lisp/plugin-main-skel.el +++ b/build-root/emacs-lisp/plugin-main-skel.el @@ -23,7 +23,7 @@ nil '(setq PLUGIN-NAME (upcase plugin-name)) " /* - * " plugin-name ".c - skeleton vpp engine plug-in + * " plugin-name ".c - skeleton vpp engine plug-in * * Copyright (c) <current-year> <your-organization> * Licensed under the Apache License, Version 2.0 (the \"License\"); @@ -52,18 +52,18 @@ nil /* define message structures */ #define vl_typedefs -#include <" plugin-name "/" plugin-name "_all_api_h.h> +#include <" plugin-name "/" plugin-name "_all_api_h.h> #undef vl_typedefs /* define generated endian-swappers */ #define vl_endianfun -#include <" plugin-name "/" plugin-name "_all_api_h.h> +#include <" plugin-name "/" plugin-name "_all_api_h.h> #undef vl_endianfun /* instantiate all the print functions we know about */ #define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__) #define vl_printfun -#include <" plugin-name "/" plugin-name "_all_api_h.h> +#include <" plugin-name "/" plugin-name "_all_api_h.h> #undef vl_printfun /* Get the API version number */ @@ -71,7 +71,7 @@ nil #include <" plugin-name "/" plugin-name "_all_api_h.h> #undef vl_api_version -/* +/* * A handy macro to set up a message reply. * Assumes that the following variables are available: * mp - pointer to request message @@ -100,14 +100,14 @@ do { \\ #define foreach_" plugin-name "_plugin_api_msg \\ _(" PLUGIN-NAME "_ENABLE_DISABLE, " plugin-name "_enable_disable) -/* +/* * This routine exists to convince the vlib plugin framework that * we haven't accidentally copied a random .dll into the plugin directory. * * Also collects global variable pointers passed from the vpp engine */ -clib_error_t * +clib_error_t * vlib_plugin_register (vlib_main_t * vm, vnet_plugin_handoff_t * h, int from_early_init) { @@ -130,7 +130,7 @@ int " plugin-name "_enable_disable (" plugin-name "_main_t * sm, u32 sw_if_index int rv = 0; /* Utterly wrong? */ - if (pool_is_free_index (sm->vnet_main->interface_main.sw_interfaces, + if (pool_is_free_index (sm->vnet_main->interface_main.sw_interfaces, sw_if_index)) return VNET_API_ERROR_INVALID_SW_IF_INDEX; @@ -138,7 +138,7 @@ int " plugin-name "_enable_disable (" plugin-name "_main_t * sm, u32 sw_if_index sw = vnet_get_sw_interface (sm->vnet_main, sw_if_index); if (sw->type != VNET_SW_INTERFACE_TYPE_HARDWARE) return VNET_API_ERROR_INVALID_SW_IF_INDEX; - + vnet_feature_enable_disable (\"device-input\", \"" plugin-name "\", sw_if_index, enable_disable, 0, 0); @@ -153,7 +153,7 @@ static clib_error_t * " plugin-name "_main_t * sm = &" plugin-name "_main; u32 sw_if_index = ~0; int enable_disable = 1; - + int rv; while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { @@ -168,7 +168,7 @@ static clib_error_t * if (sw_if_index == ~0) return clib_error_return (0, \"Please specify an interface...\"); - + rv = " plugin-name "_enable_disable (sm, sw_if_index, enable_disable); switch(rv) { @@ -176,7 +176,7 @@ static clib_error_t * break; case VNET_API_ERROR_INVALID_SW_IF_INDEX: - return clib_error_return + return clib_error_return (0, \"Invalid interface, only works on physical ports\"); break; @@ -193,7 +193,7 @@ static clib_error_t * VLIB_CLI_COMMAND (" plugin-name "_enable_disable_command, static) = { .path = \"" plugin-name " enable-disable\", - .short_help = + .short_help = \"" plugin-name " enable-disable <interface-name> [disable]\", .function = " plugin-name "_enable_disable_command_fn, }; @@ -206,9 +206,9 @@ static void vl_api_" plugin-name "_enable_disable_t_handler " plugin-name "_main_t * sm = &" plugin-name "_main; int rv; - rv = " plugin-name "_enable_disable (sm, ntohl(mp->sw_if_index), + rv = " plugin-name "_enable_disable (sm, ntohl(mp->sw_if_index), (int) (mp->enable_disable)); - + REPLY_MACRO(VL_API_" PLUGIN-NAME "_ENABLE_DISABLE_REPLY); } @@ -224,13 +224,26 @@ static clib_error_t * vl_noop_handler, \\ vl_api_##n##_t_endian, \\ vl_api_##n##_t_print, \\ - sizeof(vl_api_##n##_t), 1); + sizeof(vl_api_##n##_t), 1); foreach_" plugin-name "_plugin_api_msg; #undef _ return 0; } +#define vl_msg_name_crc_list +#include <" plugin-name "/" plugin-name "_all_api_h.h> +#undef vl_msg_name_crc_list + +static void +setup_message_id_table (" plugin-name "_main_t * sm, api_main_t * am) +{ +#define _(id,n,crc) \ + vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id + sm->msg_id_base); + foreach_vl_msg_name_crc_" plugin-name" ; +#undef _ +} + static clib_error_t * " plugin-name "_init (vlib_main_t * vm) { " plugin-name "_main_t * sm = &" plugin-name "_main; @@ -240,7 +253,7 @@ static clib_error_t * " plugin-name "_init (vlib_main_t * vm) name = format (0, \"" plugin-name "_%08x%c\", api_version, 0); /* Ask for a correctly-sized block of API message decode slots */ - sm->msg_id_base = vl_msg_api_get_msg_ids + sm->msg_id_base = vl_msg_api_get_msg_ids ((char *) name, VL_MSG_FIRST_AVAILABLE); error = " plugin-name "_plugin_api_hookup (vm); @@ -252,7 +265,7 @@ static clib_error_t * " plugin-name "_init (vlib_main_t * vm) VLIB_INIT_FUNCTION (" plugin-name "_init); -VNET_FEATURE_INIT (" plugin-name ", static) = +VNET_FEATURE_INIT (" plugin-name ", static) = { .arc_name = \"device-input\", .node_name = \"" plugin-name "\", |