diff options
author | Florin Coras <fcoras@cisco.com> | 2021-06-16 14:46:57 -0700 |
---|---|---|
committer | Dave Barach <openvpp@barachs.net> | 2021-06-16 23:23:50 +0000 |
commit | 8eb8d50ecfd7507aae340cb05a0fb07a790e4303 (patch) | |
tree | 5799f08d5472c6093fc54a33288a4ae4f1567d6f /src | |
parent | cba215dad3101c6b03483c5c40f806903de8460d (diff) |
vcl: fix fifo sharing
Type: fix
Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: Iec1fe8315a057214901250d5fb06d1c1e33dda46
Diffstat (limited to 'src')
-rw-r--r-- | src/svm/fifo_segment.c | 8 | ||||
-rw-r--r-- | src/svm/fifo_segment.h | 1 | ||||
-rw-r--r-- | src/vcl/ldp.c | 3 | ||||
-rw-r--r-- | src/vcl/vcl_locked.c | 3 | ||||
-rw-r--r-- | src/vcl/vcl_private.c | 20 | ||||
-rw-r--r-- | src/vcl/vcl_private.h | 2 |
6 files changed, 35 insertions, 2 deletions
diff --git a/src/svm/fifo_segment.c b/src/svm/fifo_segment.c index b680d27fe33..6ab07974ff7 100644 --- a/src/svm/fifo_segment.c +++ b/src/svm/fifo_segment.c @@ -903,6 +903,14 @@ fifo_segment_alloc_fifo_w_offset (fifo_segment_t *fs, uword offset) return f; } +svm_fifo_t * +fifo_segment_duplicate_fifo (fifo_segment_t *fs, svm_fifo_t *f) +{ + svm_fifo_t *nf = fs_fifo_alloc (fs, 0); + clib_memcpy (nf, f, sizeof (*f)); + return nf; +} + /** * Free fifo allocated in fifo segment */ diff --git a/src/svm/fifo_segment.h b/src/svm/fifo_segment.h index a4290bb1dc7..74f73d43334 100644 --- a/src/svm/fifo_segment.h +++ b/src/svm/fifo_segment.h @@ -132,6 +132,7 @@ svm_fifo_t *fifo_segment_alloc_fifo_w_slice (fifo_segment_t * fs, fifo_segment_ftype_t ftype); svm_fifo_t *fifo_segment_alloc_fifo_w_offset (fifo_segment_t *fs, uword offset); +svm_fifo_t *fifo_segment_duplicate_fifo (fifo_segment_t *fs, svm_fifo_t *f); /** * Free fifo allocated in fifo segment diff --git a/src/vcl/ldp.c b/src/vcl/ldp.c index 54a8f66354f..316d97df2e2 100644 --- a/src/vcl/ldp.c +++ b/src/vcl/ldp.c @@ -1945,6 +1945,9 @@ getsockopt (int fd, int level, int optname, case SO_ERROR: rv = vls_attr (vlsh, VPPCOM_ATTR_GET_ERROR, optval, optlen); break; + case SO_BINDTODEVICE: + rv = 0; + break; default: LDBG (0, "ERROR: fd %d: getsockopt SOL_SOCKET: vlsh %u " "optname %d unsupported!", fd, vlsh, optname); diff --git a/src/vcl/vcl_locked.c b/src/vcl/vcl_locked.c index ea22bcd22f5..6c606f6b0db 100644 --- a/src/vcl/vcl_locked.c +++ b/src/vcl/vcl_locked.c @@ -766,8 +766,7 @@ vls_share_session (vls_worker_t * vls_wrk, vcl_locked_session_t * vls) if (s->rx_fifo) { - svm_fifo_add_subscriber (s->rx_fifo, vcl_wrk->vpp_wrk_index); - svm_fifo_add_subscriber (s->tx_fifo, vcl_wrk->vpp_wrk_index); + vcl_session_share_fifos (s, s->rx_fifo, s->tx_fifo); } else if (s->session_state == VCL_STATE_LISTEN) { diff --git a/src/vcl/vcl_private.c b/src/vcl/vcl_private.c index 712c07049c6..95a45ffd099 100644 --- a/src/vcl/vcl_private.c +++ b/src/vcl/vcl_private.c @@ -569,6 +569,26 @@ vcl_segment_alloc_chunk (uword segment_handle, u32 slice_index, u32 size, return c; } +int +vcl_session_share_fifos (vcl_session_t *s, svm_fifo_t *rxf, svm_fifo_t *txf) +{ + vcl_worker_t *wrk = vcl_worker_get_current (); + fifo_segment_t *fs; + + clib_rwlock_reader_lock (&vcm->segment_table_lock); + + fs = fifo_segment_get_segment (&vcm->segment_main, rxf->segment_index); + s->rx_fifo = fifo_segment_duplicate_fifo (fs, rxf); + s->tx_fifo = fifo_segment_duplicate_fifo (fs, txf); + + clib_rwlock_reader_unlock (&vcm->segment_table_lock); + + svm_fifo_add_subscriber (s->rx_fifo, wrk->vpp_wrk_index); + svm_fifo_add_subscriber (s->tx_fifo, wrk->vpp_wrk_index); + + return 0; +} + /* * fd.io coding-style-patch-verification: ON * diff --git a/src/vcl/vcl_private.h b/src/vcl/vcl_private.h index ab3ecab36fa..151e4e91f44 100644 --- a/src/vcl/vcl_private.h +++ b/src/vcl/vcl_private.h @@ -730,6 +730,8 @@ int vcl_segment_discover_mqs (uword segment_handle, int *fds, u32 n_fds); svm_fifo_chunk_t *vcl_segment_alloc_chunk (uword segment_handle, u32 slice_index, u32 size, uword *offset); +int vcl_session_share_fifos (vcl_session_t *s, svm_fifo_t *rxf, + svm_fifo_t *txf); /* * VCL Binary API |