diff options
author | Aloys Augustin <aloaugus@cisco.com> | 2019-04-23 17:18:38 +0200 |
---|---|---|
committer | Nathan Skrzypczak <nathan.skrzypczak@gmail.com> | 2019-05-03 14:10:18 +0200 |
commit | de38b387297ae06a47b61859d10135467c60fc13 (patch) | |
tree | 29135737cec2e9154b9157c94028f282ed82c56b | |
parent | 1d1985de91833a5483a6b7ee96ef4090d530a7a6 (diff) |
Add packet headers in UDPC fifos
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>
-rw-r--r-- | src/vnet/udp/udp.c | 2 | ||||
-rw-r--r-- | src/vnet/udp/udp_input.c | 59 |
2 files changed, 23 insertions, 38 deletions
diff --git a/src/vnet/udp/udp.c b/src/vnet/udp/udp.c index 138fe578a01..4178a49c4db 100644 --- a/src/vnet/udp/udp.c +++ b/src/vnet/udp/udp.c @@ -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* */ diff --git a/src/vnet/udp/udp_input.c b/src/vnet/udp/udp_input.c index 52c29d7ebfa..591dc53459a 100644 --- a/src/vnet/udp/udp_input.c +++ b/src/vnet/udp/udp_input.c @@ -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: |