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)
{
if (s->ext_config)
return -1;
- s->ext_config = clib_mem_alloc (sizeof (transport_endpt_ext_cfg_t));
- clib_memset (s->ext_config, 0, sizeof (*s->ext_config));
- s->ext_config->len = sizeof (*s->ext_config);
+ s->ext_config = clib_mem_alloc (len);
+ clib_memset (s->ext_config, 0, len);
+ s->ext_config->len = len;
s->ext_config->type = type;
return 0;
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)
}
if (!session->ext_config)
{
- vcl_session_alloc_ext_cfg (session, TRANSPORT_ENDPT_EXT_CFG_CRYPTO);
+ vcl_session_alloc_ext_cfg (session, TRANSPORT_ENDPT_EXT_CFG_CRYPTO,
+ sizeof (transport_endpt_ext_cfg_t));
}
else if (session->ext_config->type != TRANSPORT_ENDPT_EXT_CFG_CRYPTO)
{
*buflen);
break;
+ case VPPCOM_ATTR_SET_ENDPT_EXT_CFG:
+ if (!(buffer && buflen && (*buflen > 0)))
+ {
+ rv = VPPCOM_EINVAL;
+ break;
+ }
+ if (session->ext_config)
+ {
+ rv = VPPCOM_EINVAL;
+ break;
+ }
+ vcl_session_alloc_ext_cfg (session, TRANSPORT_ENDPT_EXT_CFG_NONE,
+ *buflen + sizeof (u32));
+ clib_memcpy (session->ext_config->data, buffer, *buflen);
+ session->ext_config->len = *buflen;
+ break;
+
default:
rv = VPPCOM_EINVAL;
break;
VPPCOM_ATTR_SET_VRF,
VPPCOM_ATTR_GET_VRF,
VPPCOM_ATTR_GET_DOMAIN,
+ VPPCOM_ATTR_SET_ENDPT_EXT_CFG,
} vppcom_attr_op_t;
typedef struct _vcl_poll