aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAloys Augustin <aloaugus@cisco.com>2019-04-23 17:18:38 +0200
committerNathan Skrzypczak <nathan.skrzypczak@gmail.com>2019-05-03 14:10:18 +0200
commitde38b387297ae06a47b61859d10135467c60fc13 (patch)
tree29135737cec2e9154b9157c94028f282ed82c56b
parent1d1985de91833a5483a6b7ee96ef4090d530a7a6 (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.c2
-rw-r--r--src/vnet/udp/udp_input.c59
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: