VCL_SESS_ATTR_TCP_NODELAY, // SOL_TCP,TCP_NODELAY
VCL_SESS_ATTR_TCP_KEEPIDLE, // SOL_TCP,TCP_KEEPIDLE
VCL_SESS_ATTR_TCP_KEEPINTVL, // SOL_TCP,TCP_KEEPINTVL
- VCL_SESS_ATTR_SHUT_RD,
- VCL_SESS_ATTR_SHUT_WR,
VCL_SESS_ATTR_MAX
} vppcom_session_attr_t;
VCL_SESSION_F_IS_VEP = 1 << 1,
VCL_SESSION_F_IS_VEP_SESSION = 1 << 2,
VCL_SESSION_F_HAS_RX_EVT = 1 << 3,
+ VCL_SESSION_F_RD_SHUTDOWN = 1 << 4,
+ VCL_SESSION_F_WR_SHUTDOWN = 1 << 5,
} __clib_packed vcl_session_flags_t;
typedef struct vcl_session_
/** Per worker buffer for receiving mq epoll events */
struct epoll_event *mq_events;
+ /** Vector of session indices recently notified of epoll level events */
+ u32 *ep_level_evts;
+
+ /** Storage for level events session while new ones are processed */
+ u32 *ep_level_evts_fl;
+
/** Hash table for disconnect processing */
uword *session_index_by_vpp_handles;
return 0;
}
+ if (s->session_state == VCL_STATE_DISCONNECT)
+ {
+ VDBG (0, "listen session [0x%llx] is closing", s->vpp_handle);
+ return 0;
+ }
+
ASSERT (s->session_state == VCL_STATE_LISTEN
|| s->session_state == VCL_STATE_LISTEN_NO_MQ
|| vcl_session_is_connectable_listener (wrk, s));
static inline int
vcl_proto_is_dgram (uint8_t proto)
{
- return proto == VPPCOM_PROTO_UDP || proto == VPPCOM_PROTO_DTLS;
+ return proto == VPPCOM_PROTO_UDP || proto == VPPCOM_PROTO_DTLS ||
+ proto == VPPCOM_PROTO_SRTP;
}
static inline u8
int vcl_session_read_ready (vcl_session_t * session);
int vcl_session_write_ready (vcl_session_t * session);
int vcl_session_alloc_ext_cfg (vcl_session_t *s,
- transport_endpt_ext_cfg_type_t type);
+ transport_endpt_ext_cfg_type_t type, u32 len);
static inline vcl_worker_t *
vcl_worker_get (u32 wrk_index)