Wei,

If you use the high level C API called vapi instead of the low level C 
interface you may be in for an easier ride. 

Cheers 
Ole

> On 7 Mar 2022, at 18:14, Florin Coras <[email protected]> wrote:
> 
> Hi Wei, 
> 
> I suspect you wanted to register CREATE_LOOPBACK_REPLY instead of 
> CREATE_LOOPBACK in foreach_vpe_api_reply_msg
> 
> Regards,
> Florin
> 
>> On Mar 7, 2022, at 9:07 AM, Wei Huang <[email protected]> wrote:
>> 
>> I used the following program to test API functions. For sw_interface_dump, I 
>> got the reply with all the interfaces information, but for the 
>> create_loopback message, I don't get any reply, although the loopback is 
>> successfully created. I also tried ip_route_add_del, ip_route_add_del_v2, 
>> same thing, the reply handler function never got called.
>> Anybody knows why the reply handler not get called? 
>> 
>> Thanks,
>> Wei
>> =========================================
>> #include <stdio.h>
>> 
>> #include <vlibmemory/api.h>
>> #include <svm/fifo_segment.h>
>> #include <svm/message_queue.h>
>> #include <vpp/api/vpe_msg_enum.h>
>> 
>> #define vl_typedefs
>> #include <vpp/api/vpe_all_api_h.h>
>> #undef vl_typedefs
>> 
>> #define vl_endianfun
>> #include <vpp/api/vpe_all_api_h.h>
>> #undef vl_endianfun
>> 
>> #define vl_print(handle, ...)
>> #define vl_printfun
>> #include <vpp/api/vpe_all_api_h.h>
>> #undef vl_printfun
>> 
>> #define DEFAULT_QUEUE_SIZE  1024
>> 
>> typedef struct
>> {
>>     svm_queue_t *vl_input_queue; /* vpe input queue */
>>     u32 my_client_index; /* API client handle */
>> } vpp_api_agent_main_t;
>> 
>> vpp_api_agent_main_t agent_main;
>> 
>> static void 
>> vl_api_sw_interface_details_t_handler(vl_api_sw_interface_details_t * mp)
>> {
>>     printf("Received: sw_interface_details interface_index:%u 
>> interface_name:%s context:0x%x\n",
>>               ntohl(mp->sw_if_index), mp->interface_name, 
>> ntohl(mp->context));
>> }
>> 
>> static void vl_api_create_loopback_reply_t_handler(
>>     vl_api_create_loopback_reply_t * mp) {
>>     printf("\tCreate loopback reply received, message id: %d, with retval: 
>> %d, new interface index: %d\n",
>>            clib_net_to_host_u32(mp->context), mp->retval, 
>> clib_net_to_host_u32(mp->sw_if_index));
>> }
>> 
>> #define foreach_vpe_api_reply_msg                           \
>> _(SW_INTERFACE_DETAILS, sw_interface_details)               \
>> _(CREATE_LOOPBACK, create_loopback_reply)
>> 
>> void agent_api_hookup(vpp_api_agent_main_t * agentm)
>> {
>> #define _(N,n)                                                  \
>>     vl_msg_api_set_handlers(VL_API_##N, #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 _
>> }
>> 
>> 
>> void send_sw_interface_dump()
>> {
>>     vl_api_sw_interface_dump_t * mp;
>>  
>>     mp = vl_msg_api_alloc(sizeof(*mp));
>>     memset(mp, 0, sizeof(*mp));
>>     mp->_vl_msg_id = ntohs(VL_API_SW_INTERFACE_DUMP);
>>     mp->client_index = agent_main.my_client_index;
>>     mp->context = htonl (0x1234);
>>  
>>     vl_msg_api_send_shmem(agent_main.vl_input_queue, (u8 *) &mp);
>>     printf("Sent: sw_interface_dump context:0x%x\n", ntohl(mp->context));
>> 
>> }
>> 
>> static void create_loopback() 
>> {
>>     vl_api_create_loopback_t * mp;
>> 
>>     // Allocate create loopback message
>>     mp = vl_msg_api_alloc(sizeof(*mp));
>>     memset(mp, 0, sizeof(*mp));
>>     // Set the message ID to create_loopback ID reported by VPP
>>     mp->_vl_msg_id = ntohs(VL_API_CREATE_LOOPBACK);
>>     // Set our client index
>>     mp->client_index = agent_main.my_client_index;
>>     // Set context (context is an arbitrary number that can help matching 
>> request/reply pairs)
>>     mp->context = htonl (0x1235);
>>     // We could also set mac address
>> 
>>     // send messagee to VPP
>>     vl_msg_api_send_shmem(agent_main.vl_input_queue, (u8 *) &mp);
>>     printf("Sending create loopback. Create loopback msg \n");
>> }
>> 
>> void main()
>> {
>>     // Initialization
>>     clib_mem_init_thread_safe(0, 256 << 20);
>>     clib_memset(&agent_main, 0, sizeof (vpp_api_agent_main_t));    
>> 
>>     // Create shared mem with vpp
>>     api_main_t *am = vlibapi_get_main();
>> 
>>     if (vl_client_connect_to_vlib("/vpe-api", "t3_app", DEFAULT_QUEUE_SIZE) 
>> < 0)
>>     {
>>         printf("Shmem connect failed\n");
>>         svm_region_exit();
>>     }
>>     else
>>     {
>>         agent_main.vl_input_queue = am->shmem_hdr->vl_input_queue;
>>         agent_main.my_client_index = am->my_client_index;
>> 
>>         printf("Connected to vpp!!!\n");
>>     }
>>     
>>     // Register callback functions
>>     agent_api_hookup(&agent_main);
>>     
>>     send_sw_interface_dump();
>>     sleep(1);
>> 
>>     create_loopback();
>>     sleep(3);
>> }
>> 
> 
> 
> 
> 
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#20975): https://lists.fd.io/g/vpp-dev/message/20975
Mute This Topic: https://lists.fd.io/mt/89617291/21656
Group Owner: [email protected]
Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub [[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to