+ case VPPCOM_ATTR_GET_LIBC_EPFD:
+ rv = session->libc_epfd;
+ if (VPPCOM_DEBUG > 2)
+ clib_warning ("VCL<%d>: VPPCOM_ATTR_GET_LIBC_EPFD: libc_epfd %d",
+ getpid (), rv);
+ if (VPPCOM_DEBUG > 0)
+ {
+ /* *INDENT-OFF* */
+ ELOG_TYPE_DECLARE (e) =
+ {
+ .format = "VPPCOM_ATTR_GET_LIBC_EPFD: libc_epfd=%d",
+ .format_args = "i4",
+ };
+ CLIB_PACKED (struct {
+ i32 data;
+ }) * ed;
+
+ ed = ELOG_TRACK_DATA (&vcm->elog_main, e, session->elog_track);
+ ed->data = session->libc_epfd;
+ /* *INDENT-ON* */
+ }
+
+ break;
+
+ case VPPCOM_ATTR_SET_LIBC_EPFD:
+ if (PREDICT_TRUE (buffer && buflen &&
+ (*buflen == sizeof (session->libc_epfd))))
+ {
+ session->libc_epfd = *(int *) buffer;
+ *buflen = sizeof (session->libc_epfd);
+
+ if (VPPCOM_DEBUG > 2)
+ clib_warning ("VCL<%d>: VPPCOM_ATTR_SET_LIBC_EPFD: libc_epfd %d, "
+ "buflen %d", getpid (), session->libc_epfd,
+ *buflen);
+ if (VPPCOM_DEBUG > 0)
+ {
+ /* *INDENT-OFF* */
+ ELOG_TYPE_DECLARE (e) =
+ {
+ .format = "VPPCOM_ATTR_SET_LIBC_EPFD: libc_epfd=%s%d buflen=%d",
+ .format_args = "t1i4i4",
+ .n_enum_strings = 2,
+ .enum_strings = {"", "-",},
+ };
+ CLIB_PACKED (struct {
+ u8 sign;
+ u32 data[2];
+ }) * ed;
+
+ ed = ELOG_TRACK_DATA (&vcm->elog_main, e, session->elog_track);
+
+ ed->sign = (session->libc_epfd < 0);
+ ed->data[0] = abs(session->libc_epfd);
+ ed->data[1] = *buflen;
+ /* *INDENT-ON* */
+ }
+ }
+ else
+ rv = VPPCOM_EINVAL;
+ break;
+
+ case VPPCOM_ATTR_GET_PROTOCOL:
+ if (buffer && buflen && (*buflen >= sizeof (int)))
+ {
+ *(int *) buffer = session->proto;
+ *buflen = sizeof (int);
+
+ if (VPPCOM_DEBUG > 2)
+ clib_warning ("VCL<%d>: VPPCOM_ATTR_GET_PROTOCOL: %d (%s), "
+ "buflen %d", getpid (), *(int *) buffer,
+ *(int *) buffer ? "UDP" : "TCP", *buflen);
+ if (VPPCOM_DEBUG > 0)
+ {
+ /* *INDENT-OFF* */
+ ELOG_TYPE_DECLARE (e) =
+ {
+ .format = "VPPCOM_ATTR_GET_PROTOCOL: %s buflen=%d",
+ .format_args = "t1i4",
+ .n_enum_strings = 2,
+ .enum_strings = {"TCP", "UDP",},
+ };
+
+ CLIB_PACKED (struct {
+ u8 proto;
+ u32 buflen;
+ }) * ed;
+
+ ed = ELOG_TRACK_DATA (&vcm->elog_main, e, session->elog_track);
+ ed->proto = session->proto;
+ ed->buflen = *(int *) buffer;
+ /* *INDENT-ON* */
+ }
+ }
+ else
+ rv = VPPCOM_EINVAL;
+ break;
+
+ case VPPCOM_ATTR_GET_LISTEN:
+ if (buffer && buflen && (*buflen >= sizeof (int)))
+ {
+ *(int *) buffer = VCL_SESS_ATTR_TEST (session->attr,
+ VCL_SESS_ATTR_LISTEN);
+ *buflen = sizeof (int);
+
+ if (VPPCOM_DEBUG > 2)
+ clib_warning ("VCL<%d>: VPPCOM_ATTR_GET_LISTEN: %d, "
+ "buflen %d", getpid (), *(int *) buffer, *buflen);
+ if (VPPCOM_DEBUG > 0)
+ {
+ /* *INDENT-OFF* */
+ ELOG_TYPE_DECLARE (e) =
+ {
+ .format = "VPPCOM_ATTR_GET_LISTEN: %d buflen=%d",
+ .format_args = "i4i4",
+ };
+
+ struct {
+ u32 data[2];
+ } * ed;
+
+ ed = ELOG_TRACK_DATA (&vcm->elog_main, e, session->elog_track);
+ ed->data[0] = *(int *) buffer;
+ ed->data[1] = *buflen;
+ /* *INDENT-ON* */
+ }
+ }
+ else
+ rv = VPPCOM_EINVAL;
+ break;
+
+ case VPPCOM_ATTR_GET_ERROR:
+ if (buffer && buflen && (*buflen >= sizeof (int)))
+ {
+ *(int *) buffer = 0;
+ *buflen = sizeof (int);
+
+ if (VPPCOM_DEBUG > 2)
+ clib_warning ("VCL<%d>: VPPCOM_ATTR_GET_ERROR: %d, "
+ "buflen %d, #VPP-TBD#", getpid (),
+ *(int *) buffer, *buflen);
+ if (VPPCOM_DEBUG > 0)
+ {
+ /* *INDENT-OFF* */
+ ELOG_TYPE_DECLARE (e) =
+ {
+ .format = "VPPCOM_ATTR_GET_ERROR: %d buflen=%d",
+ .format_args = "i4i4",
+ };
+
+ struct {
+ u32 data[2];
+ } * ed;
+
+ ed = ELOG_TRACK_DATA (&vcm->elog_main, e, session->elog_track);
+ ed->data[0] = *(int *) buffer;
+ ed->data[1] = *buflen;
+ /* *INDENT-ON* */
+ }
+ }
+ else
+ rv = VPPCOM_EINVAL;
+ break;
+
+ case VPPCOM_ATTR_GET_TX_FIFO_LEN:
+ if (buffer && buflen && (*buflen >= sizeof (u32)))
+ {
+ svm_fifo_t *tx_fifo;
+
+ tx_fifo = ((!session->is_cut_thru || session->is_server) ?
+ session->server_tx_fifo : session->server_rx_fifo);
+
+ /* VPP-TBD */
+ *(size_t *) buffer = (session->sndbuf_size ? session->sndbuf_size :
+ tx_fifo ? tx_fifo->nitems :
+ vcm->cfg.tx_fifo_size);
+ *buflen = sizeof (u32);
+
+ if (VPPCOM_DEBUG > 2)
+ clib_warning ("VCL<%d>: VPPCOM_ATTR_GET_TX_FIFO_LEN: %u (0x%x), "
+ "buflen %d, #VPP-TBD#", getpid (),
+ *(size_t *) buffer, *(size_t *) buffer, *buflen);
+ if (VPPCOM_DEBUG > 0)
+ {
+ /* *INDENT-OFF* */
+ ELOG_TYPE_DECLARE (e) =
+ {
+ .format = "VPPCOM_ATTR_GET_TX_FIFO_LEN: 0x%x buflen=%d",
+ .format_args = "i4i4",
+ };
+
+ struct {
+ u32 data[2];
+ } * ed;
+
+ ed = ELOG_TRACK_DATA (&vcm->elog_main, e, session->elog_track);
+ ed->data[0] = *(size_t *) buffer;
+ ed->data[1] = *buflen;
+ /* *INDENT-ON* */
+ }
+ }
+ else
+ rv = VPPCOM_EINVAL;
+ break;
+
+ case VPPCOM_ATTR_SET_TX_FIFO_LEN:
+ if (buffer && buflen && (*buflen == sizeof (u32)))
+ {
+ /* VPP-TBD */
+ session->sndbuf_size = *(u32 *) buffer;
+ if (VPPCOM_DEBUG > 2)
+ clib_warning ("VCL<%d>: VPPCOM_ATTR_SET_TX_FIFO_LEN: %u (0x%x), "
+ "buflen %d, #VPP-TBD#", getpid (),
+ session->sndbuf_size, session->sndbuf_size,
+ *buflen);
+ if (VPPCOM_DEBUG > 0)
+ {
+ /* *INDENT-OFF* */
+ ELOG_TYPE_DECLARE (e) =
+ {
+ .format = "VPPCOM_ATTR_SET_TX_FIFO_LEN: 0x%x buflen=%d",
+ .format_args = "i4i4",
+ };
+
+ struct {
+ u32 data[2];
+ } * ed;
+
+ ed = ELOG_TRACK_DATA (&vcm->elog_main, e, session->elog_track);
+ ed->data[0] = session->sndbuf_size;
+ ed->data[1] = *buflen;
+ /* *INDENT-ON* */
+ }
+ }
+ else
+ rv = VPPCOM_EINVAL;
+ break;
+
+ case VPPCOM_ATTR_GET_RX_FIFO_LEN:
+ if (buffer && buflen && (*buflen >= sizeof (u32)))
+ {
+ svm_fifo_t *rx_fifo;
+
+ rx_fifo = ((!session->is_cut_thru || session->is_server) ?
+ session->server_rx_fifo : session->server_tx_fifo);
+
+ /* VPP-TBD */
+ *(size_t *) buffer = (session->rcvbuf_size ? session->rcvbuf_size :
+ rx_fifo ? rx_fifo->nitems :
+ vcm->cfg.rx_fifo_size);
+ *buflen = sizeof (u32);
+
+ if (VPPCOM_DEBUG > 2)
+ clib_warning ("VCL<%d>: VPPCOM_ATTR_GET_RX_FIFO_LEN: %u (0x%x), "
+ "buflen %d, #VPP-TBD#", getpid (),
+ *(size_t *) buffer, *(size_t *) buffer, *buflen);
+ if (VPPCOM_DEBUG > 0)
+ {
+ /* *INDENT-OFF* */
+ ELOG_TYPE_DECLARE (e) =
+ {
+ .format = "VPPCOM_ATTR_GET_RX_FIFO_LEN: 0x%x buflen=%d",
+ .format_args = "i4i4",
+ };
+
+ struct {
+ u32 data[2];
+ } * ed;
+
+ ed = ELOG_TRACK_DATA (&vcm->elog_main, e, session->elog_track);
+ ed->data[0] = *(size_t *) buffer;
+ ed->data[1] = *buflen;
+ /* *INDENT-ON* */
+ }
+ }
+ else
+ rv = VPPCOM_EINVAL;
+ break;
+
+ case VPPCOM_ATTR_SET_RX_FIFO_LEN:
+ if (buffer && buflen && (*buflen == sizeof (u32)))
+ {
+ /* VPP-TBD */
+ session->rcvbuf_size = *(u32 *) buffer;
+ if (VPPCOM_DEBUG > 2)
+ clib_warning ("VCL<%d>: VPPCOM_ATTR_SET_TX_FIFO_LEN: %u (0x%x), "
+ "buflen %d, #VPP-TBD#", getpid (),
+ session->sndbuf_size, session->sndbuf_size,
+ *buflen);
+ if (VPPCOM_DEBUG > 0)
+ {
+ /* *INDENT-OFF* */
+ ELOG_TYPE_DECLARE (e) =
+ {
+ .format = "VPPCOM_ATTR_SET_TX_FIFO_LEN: 0x%x buflen=%d",
+ .format_args = "i4i4",
+ };
+
+ struct {
+ u32 data[2];
+ } * ed;
+
+ ed = ELOG_TRACK_DATA (&vcm->elog_main, e, session->elog_track);
+ ed->data[0] = session->sndbuf_size;
+ ed->data[1] = *buflen;
+ /* *INDENT-ON* */
+ }
+ }
+ else
+ rv = VPPCOM_EINVAL;
+ break;
+
+ case VPPCOM_ATTR_GET_REUSEADDR:
+ if (buffer && buflen && (*buflen >= sizeof (int)))
+ {
+ /* VPP-TBD */
+ *(int *) buffer = VCL_SESS_ATTR_TEST (session->attr,
+ VCL_SESS_ATTR_REUSEADDR);
+ *buflen = sizeof (int);
+
+ if (VPPCOM_DEBUG > 2)
+ clib_warning ("VCL<%d>: VPPCOM_ATTR_GET_REUSEADDR: %d, "
+ "buflen %d, #VPP-TBD#", getpid (), *(int *) buffer,
+ *buflen);
+ if (VPPCOM_DEBUG > 0)
+ {
+ /* *INDENT-OFF* */
+ ELOG_TYPE_DECLARE (e) =
+ {
+ .format = "VPPCOM_ATTR_GET_REUSEADDR: %d buflen=%d",
+ .format_args = "i4i4",
+ };
+
+ struct {
+ u32 data[2];
+ } * ed;
+
+ ed = ELOG_TRACK_DATA (&vcm->elog_main, e, session->elog_track);
+ ed->data[0] = *(int *) buffer;
+ ed->data[1] = *buflen;
+ /* *INDENT-ON* */
+ }
+ }
+ else
+ rv = VPPCOM_EINVAL;
+ break;
+
+ case VPPCOM_ATTR_SET_REUSEADDR:
+ if (buffer && buflen && (*buflen == sizeof (int)) &&
+ !VCL_SESS_ATTR_TEST (session->attr, VCL_SESS_ATTR_LISTEN))
+ {
+ /* VPP-TBD */
+ if (*(int *) buffer)
+ VCL_SESS_ATTR_SET (session->attr, VCL_SESS_ATTR_REUSEADDR);
+ else
+ VCL_SESS_ATTR_CLR (session->attr, VCL_SESS_ATTR_REUSEADDR);
+
+ if (VPPCOM_DEBUG > 2)
+ clib_warning ("VCL<%d>: VPPCOM_ATTR_SET_REUSEADDR: %d, "
+ "buflen %d, #VPP-TBD#", getpid (),
+ VCL_SESS_ATTR_TEST (session->attr,
+ VCL_SESS_ATTR_REUSEADDR),
+ *buflen);
+ if (VPPCOM_DEBUG > 0)
+ {
+ /* *INDENT-OFF* */
+ ELOG_TYPE_DECLARE (e) =
+ {
+ .format = "VPPCOM_ATTR_SET_REUSEADDR: %d buflen=%d",
+ .format_args = "i4i4",
+ };
+
+ struct {
+ u32 data[2];
+ } * ed;
+
+ ed = ELOG_TRACK_DATA (&vcm->elog_main, e, session->elog_track);
+ ed->data[0] = VCL_SESS_ATTR_TEST (session->attr,
+ VCL_SESS_ATTR_REUSEADDR);
+ ed->data[1] = *buflen;
+ /* *INDENT-ON* */
+ }
+ }
+ else
+ rv = VPPCOM_EINVAL;
+ break;
+
+ case VPPCOM_ATTR_GET_REUSEPORT:
+ if (buffer && buflen && (*buflen >= sizeof (int)))
+ {
+ /* VPP-TBD */
+ *(int *) buffer = VCL_SESS_ATTR_TEST (session->attr,
+ VCL_SESS_ATTR_REUSEPORT);
+ *buflen = sizeof (int);
+
+ if (VPPCOM_DEBUG > 2)
+ clib_warning ("VCL<%d>: VPPCOM_ATTR_GET_REUSEPORT: %d, "
+ "buflen %d, #VPP-TBD#", getpid (), *(int *) buffer,
+ *buflen);
+ if (VPPCOM_DEBUG > 0)
+ {
+ /* *INDENT-OFF* */
+ ELOG_TYPE_DECLARE (e) =
+ {
+ .format = "VPPCOM_ATTR_GET_REUSEPORT: %d buflen=%d",
+ .format_args = "i4i4",
+ };
+
+ struct {
+ u32 data[2];
+ } * ed;
+
+ ed = ELOG_TRACK_DATA (&vcm->elog_main, e, session->elog_track);
+ ed->data[0] = *(int *) buffer;
+ ed->data[1] = *buflen;
+ /* *INDENT-ON* */
+ }
+ }
+ else
+ rv = VPPCOM_EINVAL;
+ break;
+
+ case VPPCOM_ATTR_SET_REUSEPORT:
+ if (buffer && buflen && (*buflen == sizeof (int)) &&
+ !VCL_SESS_ATTR_TEST (session->attr, VCL_SESS_ATTR_LISTEN))
+ {
+ /* VPP-TBD */
+ if (*(int *) buffer)
+ VCL_SESS_ATTR_SET (session->attr, VCL_SESS_ATTR_REUSEPORT);
+ else
+ VCL_SESS_ATTR_CLR (session->attr, VCL_SESS_ATTR_REUSEPORT);
+
+ if (VPPCOM_DEBUG > 2)
+ clib_warning ("VCL<%d>: VPPCOM_ATTR_SET_REUSEPORT: %d, "
+ "buflen %d, #VPP-TBD#", getpid (),
+ VCL_SESS_ATTR_TEST (session->attr,
+ VCL_SESS_ATTR_REUSEPORT),
+ *buflen);
+ if (VPPCOM_DEBUG > 0)
+ {
+ /* *INDENT-OFF* */
+ ELOG_TYPE_DECLARE (e) =
+ {
+ .format = "VPPCOM_ATTR_SET_REUSEPORT: %d buflen=%d",
+ .format_args = "i4i4",
+ };
+
+ struct {
+ u32 data[2];
+ } * ed;
+
+ ed = ELOG_TRACK_DATA (&vcm->elog_main, e, session->elog_track);
+ ed->data[0] = VCL_SESS_ATTR_TEST (session->attr,
+ VCL_SESS_ATTR_REUSEPORT);
+ ed->data[1] = *buflen;
+ /* *INDENT-ON* */
+ }
+ }
+ else
+ rv = VPPCOM_EINVAL;
+ break;
+
+ case VPPCOM_ATTR_GET_BROADCAST:
+ if (buffer && buflen && (*buflen >= sizeof (int)))
+ {
+ /* VPP-TBD */
+ *(int *) buffer = VCL_SESS_ATTR_TEST (session->attr,
+ VCL_SESS_ATTR_BROADCAST);
+ *buflen = sizeof (int);
+
+ if (VPPCOM_DEBUG > 2)
+ clib_warning ("VCL<%d>: VPPCOM_ATTR_GET_BROADCAST: %d, "
+ "buflen %d, #VPP-TBD#", getpid (), *(int *) buffer,
+ *buflen);
+ if (VPPCOM_DEBUG > 0)
+ {
+ /* *INDENT-OFF* */
+ ELOG_TYPE_DECLARE (e) =
+ {
+ .format = "VPPCOM_ATTR_GET_BROADCAST: %d buflen=%d",
+ .format_args = "i4i4",
+ };
+
+ struct {
+ u32 data[2];
+ } * ed;
+
+ ed = ELOG_TRACK_DATA (&vcm->elog_main, e, session->elog_track);
+ ed->data[0] = *(int *) buffer;
+ ed->data[1] = *buflen;
+ /* *INDENT-ON* */
+ }
+ }
+ else
+ rv = VPPCOM_EINVAL;
+ break;
+
+ case VPPCOM_ATTR_SET_BROADCAST:
+ if (buffer && buflen && (*buflen == sizeof (int)))
+ {
+ /* VPP-TBD */
+ if (*(int *) buffer)
+ VCL_SESS_ATTR_SET (session->attr, VCL_SESS_ATTR_BROADCAST);
+ else
+ VCL_SESS_ATTR_CLR (session->attr, VCL_SESS_ATTR_BROADCAST);
+
+ if (VPPCOM_DEBUG > 2)
+ clib_warning ("VCL<%d>: VPPCOM_ATTR_SET_BROADCAST: %d, "
+ "buflen %d, #VPP-TBD#", getpid (),
+ VCL_SESS_ATTR_TEST (session->attr,
+ VCL_SESS_ATTR_BROADCAST),
+ *buflen);
+ if (VPPCOM_DEBUG > 0)
+ {
+ /* *INDENT-OFF* */
+ ELOG_TYPE_DECLARE (e) =
+ {
+ .format = "VPPCOM_ATTR_SET_BROADCAST: %d buflen=%d",
+ .format_args = "i4i4",
+ };
+
+ struct {
+ u32 data[2];
+ } * ed;
+
+ ed = ELOG_TRACK_DATA (&vcm->elog_main, e, session->elog_track);
+ ed->data[0] = VCL_SESS_ATTR_TEST (session->attr,
+ VCL_SESS_ATTR_BROADCAST);
+ ed->data[1] = *buflen;
+ /* *INDENT-ON* */
+ }
+ }
+ else
+ rv = VPPCOM_EINVAL;
+ break;
+
+ case VPPCOM_ATTR_GET_V6ONLY:
+ if (buffer && buflen && (*buflen >= sizeof (int)))
+ {
+ /* VPP-TBD */
+ *(int *) buffer = VCL_SESS_ATTR_TEST (session->attr,
+ VCL_SESS_ATTR_V6ONLY);
+ *buflen = sizeof (int);
+
+ if (VPPCOM_DEBUG > 2)
+ clib_warning ("VCL<%d>: VPPCOM_ATTR_GET_V6ONLY: %d, "
+ "buflen %d, #VPP-TBD#", getpid (), *(int *) buffer,
+ *buflen);
+ if (VPPCOM_DEBUG > 0)
+ {
+ /* *INDENT-OFF* */
+ ELOG_TYPE_DECLARE (e) =
+ {
+ .format = "VPPCOM_ATTR_GET_V6ONLY: %d buflen=%d",
+ .format_args = "i4i4",
+ };
+
+ struct {
+ u32 data[2];
+ } * ed;
+
+ ed = ELOG_TRACK_DATA (&vcm->elog_main, e, session->elog_track);
+ ed->data[0] = *(int *) buffer;
+ ed->data[1] = *buflen;
+ /* *INDENT-ON* */
+ }
+ }
+ else
+ rv = VPPCOM_EINVAL;
+ break;
+
+ case VPPCOM_ATTR_SET_V6ONLY:
+ if (buffer && buflen && (*buflen == sizeof (int)))
+ {
+ /* VPP-TBD */
+ if (*(int *) buffer)
+ VCL_SESS_ATTR_SET (session->attr, VCL_SESS_ATTR_V6ONLY);
+ else
+ VCL_SESS_ATTR_CLR (session->attr, VCL_SESS_ATTR_V6ONLY);
+
+ if (VPPCOM_DEBUG > 2)
+ clib_warning ("VCL<%d>: VPPCOM_ATTR_SET_V6ONLY: %d, "
+ "buflen %d, #VPP-TBD#", getpid (),
+ VCL_SESS_ATTR_TEST (session->attr,
+ VCL_SESS_ATTR_V6ONLY), *buflen);
+ if (VPPCOM_DEBUG > 0)
+ {
+ /* *INDENT-OFF* */
+ ELOG_TYPE_DECLARE (e) =
+ {
+ .format = "VPPCOM_ATTR_SET_V6ONLY: %d buflen=%d",
+ .format_args = "i4i4",
+ };
+
+ struct {
+ u32 data[2];
+ } * ed;
+
+ ed = ELOG_TRACK_DATA (&vcm->elog_main, e, session->elog_track);
+ ed->data[0] = VCL_SESS_ATTR_TEST (session->attr,
+ VCL_SESS_ATTR_V6ONLY);
+ ed->data[1] = *buflen;
+ /* *INDENT-ON* */
+ }
+ }
+ else
+ rv = VPPCOM_EINVAL;
+ break;
+
+ case VPPCOM_ATTR_GET_KEEPALIVE:
+ if (buffer && buflen && (*buflen >= sizeof (int)))
+ {
+ /* VPP-TBD */
+ *(int *) buffer = VCL_SESS_ATTR_TEST (session->attr,
+ VCL_SESS_ATTR_KEEPALIVE);
+ *buflen = sizeof (int);
+
+ if (VPPCOM_DEBUG > 2)
+ clib_warning ("VCL<%d>: VPPCOM_ATTR_GET_KEEPALIVE: %d, "
+ "buflen %d, #VPP-TBD#", getpid (), *(int *) buffer,
+ *buflen);
+ if (VPPCOM_DEBUG > 0)
+ {
+ /* *INDENT-OFF* */
+ ELOG_TYPE_DECLARE (e) =
+ {
+ .format = "VPPCOM_ATTR_GET_KEEPALIVE: %d buflen=%d",
+ .format_args = "i4i4",
+ };
+
+ struct {
+ u32 data[2];
+ } * ed;
+
+ ed = ELOG_TRACK_DATA (&vcm->elog_main, e, session->elog_track);
+ ed->data[0] = *(int *) buffer;
+ ed->data[1] = *buflen;
+ /* *INDENT-ON* */
+ }
+ }
+ else
+ rv = VPPCOM_EINVAL;