vcl: fix fifo sharing 52/32752/3
authorFlorin Coras <fcoras@cisco.com>
Wed, 16 Jun 2021 21:46:57 +0000 (14:46 -0700)
committerDave Barach <openvpp@barachs.net>
Wed, 16 Jun 2021 23:23:50 +0000 (23:23 +0000)
Type: fix

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: Iec1fe8315a057214901250d5fb06d1c1e33dda46

src/svm/fifo_segment.c
src/svm/fifo_segment.h
src/vcl/ldp.c
src/vcl/vcl_locked.c
src/vcl/vcl_private.c
src/vcl/vcl_private.h

index b680d27..6ab0797 100644 (file)
@@ -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
  */
index a4290bb..74f73d4 100644 (file)
@@ -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
index 54a8f66..316d97d 100644 (file)
@@ -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);
index ea22bcd..6c606f6 100644 (file)
@@ -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)
     {
index 712c070..95a45ff 100644 (file)
@@ -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
  *
index ab3ecab..151e4e9 100644 (file)
@@ -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