aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2021-06-16 14:46:57 -0700
committerFlorin Coras <florin.coras@gmail.com>2021-06-16 23:25:44 +0000
commita95292ffdbfaf4288f3510d53bebf06ba1a8842a (patch)
tree66e1740c88bbafebf4e192383a442ba0fab9f246
parent8b297dbcebd6b437b16dc6923f8144ea457c944a (diff)
vcl: fix fifo sharing
Type: fix Signed-off-by: Florin Coras <fcoras@cisco.com> Change-Id: Iec1fe8315a057214901250d5fb06d1c1e33dda46 (cherry picked from commit 8eb8d50ecfd7507aae340cb05a0fb07a790e4303)
-rw-r--r--src/svm/fifo_segment.c8
-rw-r--r--src/svm/fifo_segment.h1
-rw-r--r--src/vcl/ldp.c3
-rw-r--r--src/vcl/vcl_locked.c3
-rw-r--r--src/vcl/vcl_private.c20
-rw-r--r--src/vcl/vcl_private.h2
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 33b24a7a8bf..38d1301d722 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 69f492b8694..2f1bcca0182 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 3538a092bac..1ef4cc6a27a 100644
--- a/src/vcl/vcl_private.c
+++ b/src/vcl/vcl_private.c
@@ -560,6 +560,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 628b7310788..c3215ad9bbd 100644
--- a/src/vcl/vcl_private.h
+++ b/src/vcl/vcl_private.h
@@ -725,6 +725,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