api: nat44_ed - Mark old message versions as deprecated
[vpp.git] / src / vcl / vppcom.c
index 0f824dc..ecbbf7a 100644 (file)
@@ -361,6 +361,8 @@ vcl_session_accepted_handler (vcl_worker_t * wrk, session_accepted_msg_t * mp,
   session->transport.lcl_ip = mp->lcl.ip;
   session->session_type = listen_session->session_type;
   session->is_dgram = vcl_proto_is_dgram (session->session_type);
+  if (session->is_dgram)
+    session->flags |= (listen_session->flags & VCL_SESSION_F_CONNECTED);
   session->listener_index = listen_session->session_index;
   listen_session->n_accepted_sessions++;
 
@@ -2281,12 +2283,17 @@ vppcom_session_write_inline (vcl_worker_t *wrk, vcl_session_t *s, void *buf,
     et = SESSION_IO_EVT_TX_FLUSH;
 
   if (is_dgram)
-    n_write =
-      app_send_dgram_raw_gso (tx_fifo, &s->transport, s->vpp_evt_q, buf, n,
-                             s->gso_size, et, 0 /* do_evt */, SVM_Q_WAIT);
+    {
+      et = vcl_session_dgram_tx_evt (s, et);
+      n_write =
+       app_send_dgram_raw_gso (tx_fifo, &s->transport, s->vpp_evt_q, buf, n,
+                               s->gso_size, et, 0 /* do_evt */, SVM_Q_WAIT);
+    }
   else
-    n_write = app_send_stream_raw (tx_fifo, s->vpp_evt_q, buf, n, et,
-                                  0 /* do_evt */ , SVM_Q_WAIT);
+    {
+      n_write = app_send_stream_raw (tx_fifo, s->vpp_evt_q, buf, n, et,
+                                    0 /* do_evt */, SVM_Q_WAIT);
+    }
 
   if (svm_fifo_set_event (s->tx_fifo))
     app_send_io_evt_to_vpp (
@@ -2409,11 +2416,17 @@ vcl_select_handle_mq_event (vcl_worker_t * wrk, session_event_t * e,
        sid = e->session_index;
       if (sid == VCL_INVALID_SESSION_INDEX)
        break;
-      if (sid < n_bits && write_map)
-       {
-         clib_bitmap_set_no_check ((uword *) write_map, sid, 1);
-         *bits_set += 1;
-       }
+      if (!(sid < n_bits && write_map))
+       break;
+      clib_bitmap_set_no_check ((uword *) write_map, sid, 1);
+      *bits_set += 1;
+      s = vcl_session_get (wrk, sid);
+      if (!s->tx_fifo)
+       break;
+      /* We didn't have a fifo when the event was added */
+      svm_fifo_add_want_deq_ntf (
+       (vcl_session_is_ct (s) ? s->ct_tx_fifo : s->tx_fifo),
+       SVM_FIFO_WANT_DEQ_NOTIF_IF_FULL);
       break;
     case SESSION_CTRL_EVT_DISCONNECTED:
       disconnected_msg = (session_disconnected_msg_t *) e->data;
@@ -2623,7 +2636,7 @@ vppcom_select (int n_bits, vcl_si_set * read_map, vcl_si_set * write_map,
          clib_bitmap_set_no_check ((uword *) write_map, sid, 1);
          bits_set++;
        }
-      else
+      else if (s->tx_fifo)
        {
          svm_fifo_t *txf = vcl_session_is_ct (s) ? s->ct_tx_fifo : s->tx_fifo;
          svm_fifo_add_want_deq_ntf (txf, SVM_FIFO_WANT_DEQ_NOTIF);
@@ -2676,7 +2689,7 @@ vep_verify_epoll_chain (vcl_worker_t * wrk, u32 vep_handle)
   u32 sh = vep_handle;
   vcl_session_t *s;
 
-  if (VPPCOM_DEBUG <= 2)
+  if (VPPCOM_DEBUG <= 3)
     return;
 
   s = vcl_session_get_w_handle (wrk, vep_handle);
@@ -2916,6 +2929,15 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle,
          goto done;
        }
 
+      txf = vcl_session_is_ct (s) ? s->ct_tx_fifo : s->tx_fifo;
+      if (txf)
+       {
+         if (event->events & EPOLLOUT)
+           svm_fifo_add_want_deq_ntf (txf, SVM_FIFO_WANT_DEQ_NOTIF_IF_FULL);
+         else
+           svm_fifo_del_want_deq_ntf (txf, SVM_FIFO_WANT_DEQ_NOTIF_IF_FULL);
+       }
+
       /* Generate EPOLLOUT if session write ready nd event was not on */
       if ((event->events & EPOLLOUT) && !(s->vep.ev.events & EPOLLOUT) &&
          (vcl_session_write_ready (s) > 0))
@@ -2932,14 +2954,7 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle,
        }
       s->vep.et_mask = VEP_DEFAULT_ET_MASK;
       s->vep.ev = *event;
-      txf = vcl_session_is_ct (s) ? s->ct_tx_fifo : s->tx_fifo;
-      if (txf)
-       {
-         if (event->events & EPOLLOUT)
-           svm_fifo_add_want_deq_ntf (txf, SVM_FIFO_WANT_DEQ_NOTIF_IF_FULL);
-         else
-           svm_fifo_del_want_deq_ntf (txf, SVM_FIFO_WANT_DEQ_NOTIF_IF_FULL);
-       }
+
       VDBG (1, "EPOLL_CTL_MOD: vep_sh %u, sh %u, events 0x%x, data 0x%llx!",
            vep_handle, session_handle, event->events, event->data.u64);
       break;
@@ -3055,14 +3070,14 @@ vcl_epoll_wait_handle_mq_event (vcl_worker_t * wrk, session_event_t * e,
       s = vcl_session_get (wrk, sid);
       if (!s || !vcl_session_is_open (s))
        break;
+      svm_fifo_reset_has_deq_ntf (vcl_session_is_ct (s) ? s->ct_tx_fifo :
+                                                               s->tx_fifo);
       session_events = s->vep.ev.events;
       if (!(EPOLLOUT & session_events))
        break;
       add_event = 1;
       events[*num_ev].events = EPOLLOUT;
       session_evt_data = s->vep.ev.data.u64;
-      svm_fifo_reset_has_deq_ntf (vcl_session_is_ct (s) ?
-                                 s->ct_tx_fifo : s->tx_fifo);
       break;
     case SESSION_CTRL_EVT_ACCEPTED:
       if (!e->postponed)
@@ -3354,7 +3369,7 @@ static void
 vcl_epoll_wait_handle_lt (vcl_worker_t *wrk, struct epoll_event *events,
                          int maxevents, u32 *n_evts)
 {
-  u32 add_event = 0, next;
+  u32 add_event = 0, evt_flags = 0, next, *to_remove = 0, *si;
   vcl_session_t *s;
   u64 evt_data;
   int rv;
@@ -3372,26 +3387,28 @@ vcl_epoll_wait_handle_lt (vcl_worker_t *wrk, struct epoll_event *events,
       if ((s->vep.ev.events & EPOLLIN) && (rv = vcl_session_read_ready (s)))
        {
          add_event = 1;
-         events[*n_evts].events |= rv > 0 ? EPOLLIN : EPOLLHUP | EPOLLRDHUP;
+         evt_flags |= rv > 0 ? EPOLLIN : EPOLLHUP | EPOLLRDHUP;
          evt_data = s->vep.ev.data.u64;
        }
       if ((s->vep.ev.events & EPOLLOUT) && (rv = vcl_session_write_ready (s)))
        {
          add_event = 1;
-         events[*n_evts].events |= rv > 0 ? EPOLLOUT : EPOLLHUP | EPOLLRDHUP;
+         evt_flags |= rv > 0 ? EPOLLOUT : EPOLLHUP | EPOLLRDHUP;
          evt_data = s->vep.ev.data.u64;
        }
       if (!add_event && s->session_state > VCL_STATE_READY)
        {
          add_event = 1;
-         events[*n_evts].events |= EPOLLHUP | EPOLLRDHUP;
+         evt_flags |= EPOLLHUP | EPOLLRDHUP;
          evt_data = s->vep.ev.data.u64;
        }
       if (add_event)
        {
+         events[*n_evts].events = evt_flags;
          events[*n_evts].data.u64 = evt_data;
          *n_evts += 1;
          add_event = 0;
+         evt_flags = 0;
          if (EPOLLONESHOT & s->vep.ev.events)
            s->vep.ev.events = 0;
          if (*n_evts == maxevents)
@@ -3402,12 +3419,17 @@ vcl_epoll_wait_handle_lt (vcl_worker_t *wrk, struct epoll_event *events,
        }
       else
        {
-         vcl_epoll_lt_del (wrk, s);
-         if (wrk->ep_lt_current == VCL_INVALID_SESSION_INDEX)
-           break;
+         vec_add1 (to_remove, s->session_index);
        }
     }
   while (next != wrk->ep_lt_current);
+
+  vec_foreach (si, to_remove)
+    {
+      s = vcl_session_get (wrk, *si);
+      vcl_epoll_lt_del (wrk, s);
+    }
+  vec_free (to_remove);
 }
 
 int