Add packet headers in UDPC fifos 18/19118/3
authorAloys Augustin <aloaugus@cisco.com>
Tue, 23 Apr 2019 15:18:38 +0000 (17:18 +0200)
committerNathan Skrzypczak <nathan.skrzypczak@gmail.com>
Fri, 3 May 2019 12:10:18 +0000 (14:10 +0200)
This change adds packet headers for each packet in a UDPC connection. This
changes the semantic of UDPC from an unreliable, unordered stream of bytes to an
unreliable, unordered sequence of packets.

Change-Id: I831e43903870a5720d26daa6e971299d03b208d7
Signed-off-by: Aloys Augustin <aloaugus@cisco.com>
src/vnet/udp/udp.c
src/vnet/udp/udp_input.c

index 138fe57..4178a49 100644 (file)
@@ -380,7 +380,7 @@ const static transport_proto_vft_t udpc_proto = {
   .format_connection = format_udp_session,
   .format_half_open = format_udp_half_open_session,
   .format_listener = format_udp_listener_session,
-  .tx_type = TRANSPORT_TX_DEQUEUE,
+  .tx_type = TRANSPORT_TX_DGRAM,
   .service_type = TRANSPORT_SERVICE_CL,
 };
 /* *INDENT-ON* */
index 52c29d7..591dc53 100644 (file)
@@ -227,45 +227,30 @@ udp46_input_inline (vlib_main_t * vm, vlib_node_runtime_t * node,
              goto trace0;
            }
 
-         if (!uc0->is_connected)
-           {
-             if (svm_fifo_max_enqueue_prod (s0->rx_fifo)
-                 < b0->current_length + sizeof (session_dgram_hdr_t))
-               {
-                 error0 = UDP_ERROR_FIFO_FULL;
-                 goto trace0;
-               }
-             hdr0.data_length = b0->current_length;
-             hdr0.data_offset = 0;
-             ip_set (&hdr0.lcl_ip, lcl_addr, is_ip4);
-             ip_set (&hdr0.rmt_ip, rmt_addr, is_ip4);
-             hdr0.lcl_port = udp0->dst_port;
-             hdr0.rmt_port = udp0->src_port;
-             hdr0.is_ip4 = is_ip4;
-
-             clib_spinlock_lock (&uc0->rx_lock);
-             wrote0 = session_enqueue_dgram_connection (s0, &hdr0, b0,
-                                                        TRANSPORT_PROTO_UDP,
-                                                        1 /* queue evt */ );
-             clib_spinlock_unlock (&uc0->rx_lock);
-             ASSERT (wrote0 > 0);
-
-             if (s0->session_state != SESSION_STATE_LISTENING)
-               session_pool_remove_peeker (s0->thread_index);
-           }
-         else
+
+         if (svm_fifo_max_enqueue_prod (s0->rx_fifo)
+             < b0->current_length + sizeof (session_dgram_hdr_t))
            {
-             if (svm_fifo_max_enqueue_prod (s0->rx_fifo) <
-                 b0->current_length)
-               {
-                 error0 = UDP_ERROR_FIFO_FULL;
-                 goto trace0;
-               }
-             wrote0 = session_enqueue_stream_connection (tc0, b0, 0,
-                                                         1 /* queue evt */ ,
-                                                         1 /* in order */ );
-             ASSERT (wrote0 > 0);
+             error0 = UDP_ERROR_FIFO_FULL;
+             goto trace0;
            }
+         hdr0.data_length = b0->current_length;
+         hdr0.data_offset = 0;
+         ip_set (&hdr0.lcl_ip, lcl_addr, is_ip4);
+         ip_set (&hdr0.rmt_ip, rmt_addr, is_ip4);
+         hdr0.lcl_port = udp0->dst_port;
+         hdr0.rmt_port = udp0->src_port;
+         hdr0.is_ip4 = is_ip4;
+
+         clib_spinlock_lock (&uc0->rx_lock);
+         wrote0 = session_enqueue_dgram_connection (s0, &hdr0, b0,
+                                                    TRANSPORT_PROTO_UDP,
+                                                    1 /* queue evt */ );
+         clib_spinlock_unlock (&uc0->rx_lock);
+         ASSERT (wrote0 > 0);
+
+         if (s0->session_state != SESSION_STATE_LISTENING)
+           session_pool_remove_peeker (s0->thread_index);
 
        trace0: