Make tcp active open data structures thread safe
[vpp.git] / src / vnet / udp / udp_input.c
index 4d50933..6ccb1e5 100644 (file)
@@ -70,7 +70,7 @@ udp4_uri_input_node_fn (vlib_main_t * vm,
   udp4_uri_input_next_t next_index;
   udp_uri_main_t *um = vnet_get_udp_main ();
   session_manager_main_t *smm = vnet_get_session_manager_main ();
-  u32 my_thread_index = vm->cpu_index;
+  u32 my_thread_index = vm->thread_index;
   u8 my_enqueue_epoch;
   u32 *session_indices_to_enqueue;
   static u32 serial_number;
@@ -123,7 +123,7 @@ udp4_uri_input_node_fn (vlib_main_t * vm,
          /* lookup session */
          s0 = stream_session_lookup4 (&ip0->dst_address, &ip0->src_address,
                                       udp0->dst_port, udp0->src_port,
-                                      SESSION_TYPE_IP4_UDP, my_thread_index);
+                                      SESSION_TYPE_IP4_UDP);
 
          /* no listener */
          if (PREDICT_FALSE (s0 == 0))
@@ -145,8 +145,7 @@ udp4_uri_input_node_fn (vlib_main_t * vm,
                  goto trace0;
                }
 
-             svm_fifo_enqueue_nowait (f0, 0 /* pid */ ,
-                                      udp_len0 - sizeof (*udp0),
+             svm_fifo_enqueue_nowait (f0, udp_len0 - sizeof (*udp0),
                                       (u8 *) (udp0 + 1));
 
              b0->error = node->errors[SESSION_ERROR_ENQUEUED];
@@ -180,7 +179,7 @@ udp4_uri_input_node_fn (vlib_main_t * vm,
              us->c_rmt_ip4.as_u32 = ip0->src_address.as_u32;
              us->c_lcl_port = udp0->dst_port;
              us->c_rmt_port = udp0->src_port;
-             us->c_proto = SESSION_TYPE_IP4_UDP;
+             us->c_transport_proto = TRANSPORT_PROTO_UDP;
              us->c_c_index = us - um->udp_sessions[my_thread_index];
 
              /*
@@ -251,37 +250,46 @@ udp4_uri_input_node_fn (vlib_main_t * vm,
          continue;
        }
 
-      /* Fabricate event */
-      evt.fifo = s0->server_rx_fifo;
-      evt.event_type = FIFO_EVENT_SERVER_RX;
-      evt.event_id = serial_number++;
-      evt.enqueue_length = svm_fifo_max_dequeue (s0->server_rx_fifo);
+      if (svm_fifo_set_event (s0->server_rx_fifo))
+       {
+         /* Fabricate event */
+         evt.fifo = s0->server_rx_fifo;
+         evt.event_type = FIFO_EVENT_APP_RX;
+         evt.event_id = serial_number++;
 
-      /* Add event to server's event queue */
-      q = server0->event_queue;
+         /* Add event to server's event queue */
+         q = server0->event_queue;
 
-      /* Don't block for lack of space */
-      if (PREDICT_TRUE (q->cursize < q->maxsize))
-       unix_shared_memory_queue_add (server0->event_queue, (u8 *) & evt,
-                                     0 /* do wait for mutex */ );
-      else
-       {
-         vlib_node_increment_counter (vm, udp4_uri_input_node.index,
-                                      SESSION_ERROR_FIFO_FULL, 1);
+         /* Don't block for lack of space */
+         if (PREDICT_TRUE (q->cursize < q->maxsize))
+           {
+             unix_shared_memory_queue_add (server0->event_queue,
+                                           (u8 *) & evt,
+                                           0 /* do wait for mutex */ );
+           }
+         else
+           {
+             vlib_node_increment_counter (vm, udp4_uri_input_node.index,
+                                          SESSION_ERROR_FIFO_FULL, 1);
+           }
        }
+      /* *INDENT-OFF* */
       if (1)
        {
          ELOG_TYPE_DECLARE (e) =
          {
-         .format = "evt-enqueue: id %d length %d",.format_args = "i4i4",};
+             .format = "evt-enqueue: id %d length %d",
+             .format_args = "i4i4",};
          struct
          {
            u32 data[2];
          } *ed;
          ed = ELOG_DATA (&vlib_global_main.elog_main, e);
          ed->data[0] = evt.event_id;
-         ed->data[1] = evt.enqueue_length;
+         ed->data[1] = svm_fifo_max_dequeue (s0->server_rx_fifo);
        }
+      /* *INDENT-ON* */
+
     }
 
   vec_reset_length (session_indices_to_enqueue);