+int
+vppcom_session_attr (uint32_t session_index, uint32_t op,
+ void *buffer, uint32_t * buflen)
+{
+ vppcom_main_t *vcm = &vppcom_main;
+ session_t *session;
+ int rv = VPPCOM_OK;
+ u32 *flags = buffer;
+ vppcom_ip46_t *vcl_addr = buffer;
+
+ VCL_LOCK_AND_GET_SESSION (session_index, &session);
+ switch (op)
+ {
+ case VPPCOM_ATTR_GET_NREAD:
+ rv = vppcom_session_read_ready (session, session_index);
+ if (VPPCOM_DEBUG > 0)
+ clib_warning ("VPPCOM_ATTR_GET_NREAD: nread = %d", rv);
+
+ break;
+
+ case VPPCOM_ATTR_PEEK_NREAD:
+ /* TBD */
+ break;
+
+ case VPPCOM_ATTR_GET_FLAGS:
+ if (buffer && buflen && (*buflen >= sizeof (*flags)))
+ {
+ *flags = O_RDWR | ((session->is_nonblocking) ? O_NONBLOCK : 0);
+ *buflen = sizeof (*flags);
+ if (VPPCOM_DEBUG > 0)
+ clib_warning ("VPPCOM_ATTR_GET_FLAGS: flags = 0x%08x, "
+ "is_nonblocking = %u", *flags,
+ session->is_nonblocking);
+ }
+ else
+ rv = VPPCOM_EINVAL;
+ break;
+
+ case VPPCOM_ATTR_SET_FLAGS:
+ if (buffer && buflen && (*buflen >= sizeof (*flags)))
+ {
+ session->is_nonblocking = (*flags & O_NONBLOCK) ? 1 : 0;
+ if (VPPCOM_DEBUG > 0)
+ clib_warning ("VPPCOM_ATTR_SET_FLAGS: flags = 0x%08x, "
+ "is_nonblocking = %u", *flags,
+ session->is_nonblocking);
+ }
+ else
+ rv = VPPCOM_EINVAL;
+ break;
+
+ case VPPCOM_ATTR_GET_PEER_ADDR:
+ if (buffer && buflen && (*buflen >= sizeof (*vcl_addr)))
+ {
+ *vcl_addr = session->peer_addr;
+ *buflen = sizeof (*vcl_addr);
+ if (VPPCOM_DEBUG > 0)
+ clib_warning ("VPPCOM_ATTR_GET_PEER_ADDR: is_ip4 = %u, "
+ "addr = %U", vcl_addr->is_ip4, format_ip46_address,
+ &vcl_addr->ip46, vcl_addr->is_ip4);
+ }
+ else
+ rv = VPPCOM_EINVAL;
+ break;
+
+ case VPPCOM_ATTR_GET_LCL_ADDR:
+ if (buffer && buflen && (*buflen >= sizeof (*vcl_addr)))
+ {
+ *vcl_addr = session->lcl_addr;
+ *buflen = sizeof (*vcl_addr);
+ if (VPPCOM_DEBUG > 0)
+ clib_warning ("VPPCOM_ATTR_GET_LCL_ADDR: is_ip4 = %u, "
+ "addr = %U", vcl_addr->is_ip4, format_ip46_address,
+ &vcl_addr->ip46, vcl_addr->is_ip4);
+ }
+ else
+ rv = VPPCOM_EINVAL;
+ break;
+ }
+
+done:
+ clib_spinlock_unlock (&vcm->sessions_lockp);
+ return rv;
+}
+