diff options
author | Dave Barach <dave@barachs.net> | 2017-09-10 15:04:27 -0400 |
---|---|---|
committer | Damjan Marion <dmarion.lists@gmail.com> | 2017-10-03 11:03:47 +0000 |
commit | 59b2565cd91a67ced650739f36129650830211ac (patch) | |
tree | 1ae3b8d69d7952500b07186169fb31e0f72ae04e /src/vlibapi/vat_helper_macros.h | |
parent | 35ffa3e8f6b032f6e324234d495f769049d8feea (diff) |
Repair vlib API socket server
- Teach vpp_api_test to send/receive API messages over sockets
- Add memfd-based shared memory
- Add api messages to create memfd-based shared memory segments
- vpp_api_test supports both socket and shared memory segment connections
- vpp_api_test pivot from socket to shared memory API messaging
- add socket client support to libvlibclient.so
- dead client reaper sends ping messages, container-friendly
- dead client reaper falls back to kill (<pid>, 0) live checking
if e.g. a python app goes silent for tens of seconds
- handle ping messages in python client support code
- teach show api ring about pairwise shared-memory segments
- fix ip probing of already resolved destinations (VPP-998)
We'll need this work to implement proper host-stack client isolation
Change-Id: Ic23b65f75c854d0393d9a2e9d6b122a9551be769
Signed-off-by: Dave Barach <dave@barachs.net>
Signed-off-by: Dave Wallace <dwallacelf@gmail.com>
Signed-off-by: Florin Coras <fcoras@cisco.com>
Diffstat (limited to 'src/vlibapi/vat_helper_macros.h')
-rw-r--r-- | src/vlibapi/vat_helper_macros.h | 115 |
1 files changed, 87 insertions, 28 deletions
diff --git a/src/vlibapi/vat_helper_macros.h b/src/vlibapi/vat_helper_macros.h index 57ad520be1a..5e7f1083947 100644 --- a/src/vlibapi/vat_helper_macros.h +++ b/src/vlibapi/vat_helper_macros.h @@ -22,54 +22,113 @@ /* M: construct, but don't yet send a message */ #define M(T, mp) \ do { \ + socket_client_main_t *scm = &vam->socket_client_main; \ vam->result_ready = 0; \ - mp = vl_msg_api_alloc_as_if_client(sizeof(*mp)); \ + if (scm->socket_enable) \ + { \ + mp = (void *)scm->socket_tx_buffer; \ + scm->socket_tx_nbytes = sizeof (*mp); \ + } \ + else \ + mp = vl_msg_api_alloc_as_if_client(sizeof(*mp)); \ memset (mp, 0, sizeof (*mp)); \ mp->_vl_msg_id = ntohs (VL_API_##T+__plugin_msg_base); \ mp->client_index = vam->my_client_index; \ } while(0); +/* MPING: construct a control-ping message, don't send it yet */ +#define MPING(T, mp) \ +do { \ + socket_client_main_t *scm = &vam->socket_client_main; \ + vam->result_ready = 0; \ + if (scm->socket_enable) \ + { \ + mp = (void *)scm->socket_tx_buffer; \ + scm->socket_tx_nbytes = sizeof (*mp); \ + } \ + else \ + mp = vl_msg_api_alloc_as_if_client(sizeof(*mp)); \ + memset (mp, 0, sizeof (*mp)); \ + mp->_vl_msg_id = ntohs (VL_API_##T+__plugin_msg_base); \ + mp->client_index = vam->my_client_index; \ + scm->control_pings_outstanding++; \ +} while(0); + #define M2(T, mp, n) \ do { \ + socket_client_main_t *scm = &vam->socket_client_main; \ vam->result_ready = 0; \ - mp = vl_msg_api_alloc_as_if_client(sizeof(*mp)+(n)); \ + if (scm->socket_enable) \ + { \ + mp = (void *)scm->socket_tx_buffer; \ + scm->socket_tx_nbytes = sizeof (*mp) + n; \ + } \ + else \ + mp = vl_msg_api_alloc_as_if_client(sizeof(*mp) + n); \ memset (mp, 0, sizeof (*mp)); \ mp->_vl_msg_id = ntohs (VL_API_##T+__plugin_msg_base); \ mp->client_index = vam->my_client_index; \ } while(0); /* S: send a message */ -#define S(mp) (vl_msg_api_send_shmem (vam->vl_input_queue, (u8 *)&mp)) +#define S(mp) \ +do { \ + int n; \ + socket_client_main_t *scm = &vam->socket_client_main; \ + if (scm->socket_enable) \ + { \ + msgbuf_t msgbuf; \ + \ + msgbuf.q = 0; \ + msgbuf.gc_mark_timestamp = 0; \ + msgbuf.data_len = ntohl(scm->socket_tx_nbytes); \ + \ + n = write (scm->socket_fd, &msgbuf, sizeof (msgbuf)); \ + if (n < sizeof (msgbuf)) \ + clib_unix_warning ("socket write (msgbuf)"); \ + \ + n = write (scm->socket_fd, scm->socket_tx_buffer, \ + scm->socket_tx_nbytes); \ + if (n < scm->socket_tx_nbytes) \ + clib_unix_warning ("socket write (msg)"); \ + } \ + else \ + vl_msg_api_send_shmem (vam->vl_input_queue, (u8 *)&mp); \ + } while (0); /* W: wait for results, with timeout */ -#define W(ret) \ -do { \ - f64 timeout = vat_time_now (vam) + 1.0; \ - ret = -99; \ - \ - while (vat_time_now (vam) < timeout) { \ - if (vam->result_ready == 1) { \ - ret = vam->retval; \ - break; \ - } \ - vat_suspend (vam->vlib_main, 1e-5); \ - } \ +#define W(ret) \ +do { \ + f64 timeout = vat_time_now (vam) + 1.0; \ + socket_client_main_t *scm = &vam->socket_client_main; \ + ret = -99; \ + \ + vl_socket_client_read_reply (scm); \ + while (vat_time_now (vam) < timeout) { \ + if (vam->result_ready == 1) { \ + ret = vam->retval; \ + break; \ + } \ + vat_suspend (vam->vlib_main, 1e-5); \ + } \ } while(0); /* W2: wait for results, with timeout */ -#define W2(ret, body) \ -do { \ - f64 timeout = vat_time_now (vam) + 1.0; \ - ret = -99; \ - \ - while (vat_time_now (vam) < timeout) { \ - if (vam->result_ready == 1) { \ - (body); \ - ret = vam->retval; \ - break; \ - } \ - vat_suspend (vam->vlib_main, 1e-5); \ - } \ +#define W2(ret, body) \ +do { \ + f64 timeout = vat_time_now (vam) + 1.0; \ + socket_client_main_t *scm = &vam->socket_client_main; \ + ret = -99; \ + \ + vl_socket_client_read_reply (scm); \ + while (vat_time_now (vam) < timeout) { \ + if (vam->result_ready == 1) { \ + (body); \ + ret = vam->retval; \ + break; \ + } \ + vat_suspend (vam->vlib_main, 1e-5); \ + } \ } while(0); |