diff options
author | Florin Coras <fcoras@cisco.com> | 2020-12-08 17:50:45 -0800 |
---|---|---|
committer | Florin Coras <fcoras@cisco.com> | 2020-12-24 23:08:43 -0800 |
commit | c547e91df7083007c87615ac1e37b6f223e575e9 (patch) | |
tree | 0677e843f5307becf326c14d43d57c0e4b8c3329 /src/vcl/vcl_private.c | |
parent | 8219f1f361083cc63022b70d11b08f52833d4789 (diff) |
svm: split fifo into private and shared structs
Type: improvement
Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: Id8e77e8b2623be719fd43a95e181eaa5b7df2b6e
Diffstat (limited to 'src/vcl/vcl_private.c')
-rw-r--r-- | src/vcl/vcl_private.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/vcl/vcl_private.c b/src/vcl/vcl_private.c index c5dcd39038e..ea938113615 100644 --- a/src/vcl/vcl_private.c +++ b/src/vcl/vcl_private.c @@ -374,6 +374,51 @@ vcl_segment_detach (u64 segment_handle) VDBG (0, "detached segment %u handle %u", segment_index, segment_handle); } +int +vcl_segment_attach_session (uword segment_handle, uword rxf_offset, + uword txf_offset, u8 is_ct, vcl_session_t *s) +{ + svm_fifo_shared_t *rxsf, *txsf; + svm_fifo_t *rxf, *txf; + fifo_segment_t *fs; + u32 fs_index; + + fs_index = vcl_segment_table_lookup (segment_handle); + if (fs_index == VCL_INVALID_SEGMENT_INDEX) + { + VDBG (0, "ERROR: segment for session %u is not mounted!", + s->session_index); + return -1; + } + + rxsf = uword_to_pointer (rxf_offset, svm_fifo_shared_t *); + txsf = uword_to_pointer (txf_offset, svm_fifo_shared_t *); + + clib_rwlock_reader_lock (&vcm->segment_table_lock); + + fs = fifo_segment_get_segment (&vcm->segment_main, fs_index); + rxf = fifo_segment_alloc_fifo_w_shared (fs, rxsf); + txf = fifo_segment_alloc_fifo_w_shared (fs, txsf); + + clib_rwlock_reader_unlock (&vcm->segment_table_lock); + + if (!is_ct) + { + rxsf->client_session_index = s->session_index; + txsf->client_session_index = s->session_index; + rxf->client_thread_index = vcl_get_worker_index (); + txf->client_thread_index = vcl_get_worker_index (); + s->rx_fifo = rxf; + s->tx_fifo = txf; + } + else + { + s->ct_rx_fifo = rxf; + s->ct_tx_fifo = txf; + } + + return 0; +} /* * fd.io coding-style-patch-verification: ON |