NAT44: run NAT nodes after ACL (VPP-1160)
[vpp.git] / src / vpp-api / client / client.c
index 8bdcda0..fd2c417 100644 (file)
@@ -132,15 +132,18 @@ vac_api_handler (void *msg)
 static void *
 vac_rx_thread_fn (void *arg)
 {
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
+  vl_api_memclnt_keepalive_t *mp;
+  vl_api_memclnt_keepalive_reply_t *rmp;
   vac_main_t *pm = &vac_main;
   api_main_t *am = &api_main;
+  vl_shmem_hdr_t *shmem_hdr;
   uword msg;
 
   q = am->vl_input_queue;
 
   while (1)
-    while (!unix_shared_memory_queue_sub(q, (u8 *)&msg, 0))
+    while (!svm_queue_sub(q, (u8 *)&msg, SVM_Q_WAIT, 0))
       {
        u16 id = ntohs(*((u16 *)msg));
        switch (id) {
@@ -169,6 +172,17 @@ vac_rx_thread_fn (void *arg)
          vl_msg_api_free((void *) msg);
          break;
 
+        case VL_API_MEMCLNT_KEEPALIVE:
+          mp = (void *)msg;
+          rmp = vl_msg_api_alloc (sizeof (*rmp));
+          memset (rmp, 0, sizeof (*rmp));
+          rmp->_vl_msg_id = ntohs(VL_API_MEMCLNT_KEEPALIVE_REPLY);
+          rmp->context = mp->context;
+          shmem_hdr = am->shmem_hdr;
+          vl_msg_api_send_shmem(shmem_hdr->vl_input_queue, (u8 *)&rmp);
+          vl_msg_api_free((void *) msg);
+         break;
+
        default:
          vac_api_handler((void *)msg);
        }
@@ -367,11 +381,15 @@ unset_timeout (void)
 int
 vac_read (char **p, int *l, u16 timeout)
 {
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
   api_main_t *am = &api_main;
   vac_main_t *pm = &vac_main;
+  vl_api_memclnt_keepalive_t *mp;
+  vl_api_memclnt_keepalive_reply_t *rmp;
   uword msg;
   msgbuf_t *msgbuf;
+  int rv;
+  vl_shmem_hdr_t *shmem_hdr;
 
   if (!pm->connected_to_vlib) return -1;
 
@@ -384,7 +402,10 @@ vac_read (char **p, int *l, u16 timeout)
     set_timeout(timeout);
 
   q = am->vl_input_queue;
-  int rv = unix_shared_memory_queue_sub(q, (u8 *)&msg, 0);
+
+ again:
+  rv = svm_queue_sub(q, (u8 *)&msg, SVM_Q_WAIT, 0);
+
   if (rv == 0) {
     u16 msg_id = ntohs(*((u16 *)msg));
     switch (msg_id) {
@@ -397,6 +418,21 @@ vac_read (char **p, int *l, u16 timeout)
     case VL_API_MEMCLNT_READ_TIMEOUT:
       printf("Received read timeout %ds\n", timeout);
       goto error;
+    case VL_API_MEMCLNT_KEEPALIVE:
+      /* Handle an alive-check ping from vpp. */
+      mp = (void *)msg;
+      rmp = vl_msg_api_alloc (sizeof (*rmp));
+      memset (rmp, 0, sizeof (*rmp));
+      rmp->_vl_msg_id = ntohs(VL_API_MEMCLNT_KEEPALIVE_REPLY);
+      rmp->context = mp->context;
+      shmem_hdr = am->shmem_hdr;
+      vl_msg_api_send_shmem(shmem_hdr->vl_input_queue, (u8 *)&rmp);
+      vl_msg_api_free((void *) msg);
+      /* 
+       * Python code is blissfully unaware of these pings, so
+       * act as if it never happened...
+       */
+      goto again;
 
     default:
       msgbuf = (msgbuf_t *)(((u8 *)msg) - offsetof(msgbuf_t, data));
@@ -443,7 +479,7 @@ vac_write (char *p, int l)
   int rv = -1;
   api_main_t *am = &api_main;
   vl_api_header_t *mp = vl_msg_api_alloc(l);
-  unix_shared_memory_queue_t *q;
+  svm_queue_t *q;
   vac_main_t *pm = &vac_main;
 
   if (!pm->connected_to_vlib) return -1;
@@ -452,7 +488,7 @@ vac_write (char *p, int l)
   memcpy(mp, p, l);
   mp->client_index = vac_client_index();
   q = am->shmem_hdr->vl_input_queue;
-  rv = unix_shared_memory_queue_add(q, (u8 *)&mp, 0);
+  rv = svm_queue_add(q, (u8 *)&mp, 0);
   if (rv != 0) {
     clib_warning("vpe_api_write fails: %d\n", rv);
     /* Clear message */
@@ -464,7 +500,7 @@ vac_write (char *p, int l)
 int
 vac_get_msg_index (unsigned char * name)
 {
-  return vl_api_get_msg_index (name);
+  return vl_msg_api_get_msg_index (name);
 }
 
 int