On Wed, Jan 18, 2017 at 12:24 PM, Damjan Marion <[email protected]>
wrote:
>
> I see.
>
> But how come vat doesn't do this [msg ID mapping] step?
>
> Likely somebody needs to do the work…
>
> Thanks,
> Damjan
>
Ed,
As I indicated when we spoke, I have implemented the gunky details
of establishing the mapping from <msg-name_crc> to API msg ID.
It turned out to be a bit less gross than I had anticipated, primarily
due to the fact that we have separate compilation within our client
of different functional areas.
Executive summary: It is working.
Homework: Details are below if someone wants to add something
like it to, say, vat.
HTH,
jdl
--------------- sparse details -------------
So, for example, within our interface code, I added these bits:
#define vl_msg_name_crc_list
#include <vnet/interface.api.h>
#undef vl_msg_name_crc_list
and then in our intf_init() function, these bits:
#define _(msg_id, name, crc) \
vpp_set_msg_id_map(msg_id, #name "_" #crc);
foreach_vl_msg_name_crc_interface;
#undef _
That function, vpp_set_msg_id_map() establishes entries in
a global structure:
struct vpp_msg_map {
u32 id;
char *name_crc;
} vmid_map[];
using basically:
id = vl_api_get_msg_index((u8 *)name_crc);
vmid_map[msg_id].id = id;
vmid_map[msg_id].name_crc = strdup(name_crc);
Naturally, the vl_msg_api_set_handlers() calls have to do a
map lookup to get the new API msg id, like this:
#define _(N,n) \
vl_msg_api_set_handlers(vmid_map[VL_API_##N].id, \
#n, \
vl_api_##n##_t_handler, \
vl_noop_handler, \
vl_api_##n##_t_endian, \
vl_api_##n##_t_print, \
sizeof(vl_api_##n##_t), 1);
foreach_vpe_api_reply_msg;
#undef _
I buried the map lookup in the message alloc function, so then
the rest of the code can just use, say, SW_INTERFACE_DUMP
as it was already written.
_______________________________________________
vpp-dev mailing list
[email protected]
https://lists.fd.io/mailman/listinfo/vpp-dev