X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fsession%2Fsession_api.c;h=615e2ade59cefba9fff605b1b8f731b960e193b6;hb=447e51d4e4ed08df7f370b150d851842bcafa957;hp=c0ed1250dab84c7f259f5f26c5087b5865e208a4;hpb=1a9e2f96d48e346311bbc584510a14e3f721b41c;p=vpp.git diff --git a/src/vnet/session/session_api.c b/src/vnet/session/session_api.c index c0ed1250dab..615e2ade59c 100644 --- a/src/vnet/session/session_api.c +++ b/src/vnet/session/session_api.c @@ -81,41 +81,13 @@ session_send_fds (vl_api_registration_t * reg, int fds[], int n_fds) return 0; } -static int -mq_try_lock_and_alloc_msg (svm_msg_q_t * app_mq, svm_msg_q_msg_t * msg) -{ - int rv; - u8 try = 0; - while (try < 100) - { - rv = svm_msg_q_lock_and_alloc_msg_w_ring (app_mq, - SESSION_MQ_CTRL_EVT_RING, - SVM_Q_NOWAIT, msg); - if (!rv) - return 0; - /* - * Break the loop if mq is full, usually this is because the - * app has crashed or is hanging on somewhere. - */ - if (rv != -1) - break; - try++; - usleep (1); - } - clib_warning ("failed to alloc msg"); - return -1; -} - static int mq_send_session_accepted_cb (session_t * s) { app_worker_t *app_wrk = app_worker_get (s->app_wrk_index); - svm_msg_q_msg_t _msg, *msg = &_msg; session_accepted_msg_t m = { 0 }; - svm_msg_q_t *app_mq; fifo_segment_t *eq_seg; session_t *listener; - session_event_t *evt; application_t *app; app = application_get (app_wrk->app_index); @@ -164,15 +136,7 @@ mq_send_session_accepted_cb (session_t * s) m.mq_index = s->thread_index; } - app_mq = app_wrk->event_queue; - if (mq_try_lock_and_alloc_msg (app_mq, msg)) - return SESSION_E_MQ_MSG_ALLOC; - - evt = svm_msg_q_msg_data (app_mq, msg); - clib_memset (evt, 0, sizeof (*evt)); - evt->event_type = SESSION_CTRL_EVT_ACCEPTED; - clib_memcpy_fast (evt->data, &m, sizeof (m)); - svm_msg_q_add_and_unlock (app_mq, msg); + app_wrk_send_ctrl_evt (app_wrk, SESSION_CTRL_EVT_ACCEPTED, &m, sizeof (m)); return 0; } @@ -181,21 +145,12 @@ static inline void mq_send_session_close_evt (app_worker_t * app_wrk, session_handle_t sh, session_evt_type_t evt_type) { - svm_msg_q_msg_t _msg, *msg = &_msg; - session_disconnected_msg_t *mp; - svm_msg_q_t *app_mq; - session_event_t *evt; + session_disconnected_msg_t m = { 0 }; - app_mq = app_wrk->event_queue; - if (mq_try_lock_and_alloc_msg (app_mq, msg)) - return; - evt = svm_msg_q_msg_data (app_mq, msg); - clib_memset (evt, 0, sizeof (*evt)); - evt->event_type = evt_type; - mp = (session_disconnected_msg_t *) evt->data; - mp->handle = sh; - mp->context = app_wrk->api_client_index; - svm_msg_q_add_and_unlock (app_mq, msg); + m.handle = sh; + m.context = app_wrk->api_client_index; + + app_wrk_send_ctrl_evt (app_wrk, evt_type, &m, sizeof (m)); } static inline void @@ -249,13 +204,10 @@ int mq_send_session_connected_cb (u32 app_wrk_index, u32 api_context, session_t * s, session_error_t err) { - svm_msg_q_msg_t _msg, *msg = &_msg; session_connected_msg_t m = { 0 }; - svm_msg_q_t *app_mq; transport_connection_t *tc; fifo_segment_t *eq_seg; app_worker_t *app_wrk; - session_event_t *evt; application_t *app; app_wrk = app_worker_get (app_wrk_index); @@ -318,17 +270,8 @@ mq_send_session_connected_cb (u32 app_wrk_index, u32 api_context, snd_msg: - app_mq = app_wrk->event_queue; + app_wrk_send_ctrl_evt (app_wrk, SESSION_CTRL_EVT_CONNECTED, &m, sizeof (m)); - if (mq_try_lock_and_alloc_msg (app_mq, msg)) - return SESSION_E_MQ_MSG_ALLOC; - - evt = svm_msg_q_msg_data (app_mq, msg); - clib_memset (evt, 0, sizeof (*evt)); - evt->event_type = SESSION_CTRL_EVT_CONNECTED; - clib_memcpy_fast (evt->data, &m, sizeof (m)); - - svm_msg_q_add_and_unlock (app_mq, msg); return 0; } @@ -336,13 +279,10 @@ int mq_send_session_bound_cb (u32 app_wrk_index, u32 api_context, session_handle_t handle, int rv) { - svm_msg_q_msg_t _msg, *msg = &_msg; session_bound_msg_t m = { 0 }; - svm_msg_q_t *app_mq; transport_endpoint_t tep; fifo_segment_t *eq_seg; app_worker_t *app_wrk; - session_event_t *evt; application_t *app; app_listener_t *al; session_t *ls = 0; @@ -381,17 +321,8 @@ mq_send_session_bound_cb (u32 app_wrk_index, u32 api_context, snd_msg: - app_mq = app_wrk->event_queue; - - if (mq_try_lock_and_alloc_msg (app_mq, msg)) - return SESSION_E_MQ_MSG_ALLOC; + app_wrk_send_ctrl_evt (app_wrk, SESSION_CTRL_EVT_BOUND, &m, sizeof (m)); - evt = svm_msg_q_msg_data (app_mq, msg); - clib_memset (evt, 0, sizeof (*evt)); - evt->event_type = SESSION_CTRL_EVT_BOUND; - clib_memcpy_fast (evt->data, &m, sizeof (m)); - - svm_msg_q_add_and_unlock (app_mq, msg); return 0; } @@ -399,40 +330,26 @@ void mq_send_unlisten_reply (app_worker_t * app_wrk, session_handle_t sh, u32 context, int rv) { - svm_msg_q_msg_t _msg, *msg = &_msg; - session_unlisten_reply_msg_t *ump; - svm_msg_q_t *app_mq; - session_event_t *evt; - - app_mq = app_wrk->event_queue; - if (mq_try_lock_and_alloc_msg (app_mq, msg)) - return; + session_unlisten_reply_msg_t m = { 0 }; - evt = svm_msg_q_msg_data (app_mq, msg); - clib_memset (evt, 0, sizeof (*evt)); - evt->event_type = SESSION_CTRL_EVT_UNLISTEN_REPLY; - ump = (session_unlisten_reply_msg_t *) evt->data; - ump->context = context; - ump->handle = sh; - ump->retval = rv; - svm_msg_q_add_and_unlock (app_mq, msg); + m.context = context; + m.handle = sh; + m.retval = rv; + app_wrk_send_ctrl_evt (app_wrk, SESSION_CTRL_EVT_UNLISTEN_REPLY, &m, + sizeof (m)); } static void mq_send_session_migrate_cb (session_t * s, session_handle_t new_sh) { - svm_msg_q_msg_t _msg, *msg = &_msg; session_migrated_msg_t m = { 0 }; fifo_segment_t *eq_seg; app_worker_t *app_wrk; - session_event_t *evt; - svm_msg_q_t *app_mq; application_t *app; u32 thread_index; thread_index = session_thread_from_handle (new_sh); app_wrk = app_worker_get (s->app_wrk_index); - app_mq = app_wrk->event_queue; app = application_get (app_wrk->app_index); eq_seg = application_get_rx_mqs_segment (app); @@ -442,27 +359,15 @@ mq_send_session_migrate_cb (session_t * s, session_handle_t new_sh) m.vpp_evt_q = fifo_segment_msg_q_offset (eq_seg, thread_index); m.segment_handle = SESSION_INVALID_HANDLE; - if (mq_try_lock_and_alloc_msg (app_mq, msg)) - return; - - evt = svm_msg_q_msg_data (app_mq, msg); - clib_memset (evt, 0, sizeof (*evt)); - evt->event_type = SESSION_CTRL_EVT_MIGRATED; - clib_memcpy_fast (evt->data, &m, sizeof (m)); - - svm_msg_q_add_and_unlock (app_mq, msg); + app_wrk_send_ctrl_evt (app_wrk, SESSION_CTRL_EVT_MIGRATED, &m, sizeof (m)); } static int mq_send_add_segment_cb (u32 app_wrk_index, u64 segment_handle) { - int fds[SESSION_N_FD_TYPE], n_fds = 0; - svm_msg_q_msg_t _msg, *msg = &_msg; - session_app_add_segment_msg_t *mp; + session_app_add_segment_msg_t m = { 0 }; vl_api_registration_t *reg; app_worker_t *app_wrk; - session_event_t *evt; - svm_msg_q_t *app_mq; fifo_segment_t *fs; ssvm_private_t *sp; u8 fd_flags = 0; @@ -488,29 +393,16 @@ mq_send_add_segment_cb (u32 app_wrk_index, u64 segment_handle) } fd_flags |= SESSION_FD_F_MEMFD_SEGMENT; - fds[n_fds] = sp->fd; - n_fds += 1; } - app_mq = app_wrk->event_queue; - if (mq_try_lock_and_alloc_msg (app_mq, msg)) - return -1; + m.segment_size = sp->ssvm_size; + m.fd_flags = fd_flags; + m.segment_handle = segment_handle; + strncpy ((char *) m.segment_name, (char *) sp->name, + sizeof (m.segment_name) - 1); - if (n_fds) - session_send_fds (reg, fds, n_fds); - - evt = svm_msg_q_msg_data (app_mq, msg); - clib_memset (evt, 0, sizeof (*evt)); - evt->event_type = SESSION_CTRL_EVT_APP_ADD_SEGMENT; - mp = (session_app_add_segment_msg_t *) evt->data; - clib_memset (mp, 0, sizeof (*mp)); - mp->segment_size = sp->ssvm_size; - mp->fd_flags = fd_flags; - mp->segment_handle = segment_handle; - strncpy ((char *) mp->segment_name, (char *) sp->name, - sizeof (mp->segment_name) - 1); - - svm_msg_q_add_and_unlock (app_mq, msg); + app_wrk_send_ctrl_evt_fd (app_wrk, SESSION_CTRL_EVT_APP_ADD_SEGMENT, &m, + sizeof (m), sp->fd); return 0; } @@ -518,12 +410,9 @@ mq_send_add_segment_cb (u32 app_wrk_index, u64 segment_handle) static int mq_send_del_segment_cb (u32 app_wrk_index, u64 segment_handle) { - svm_msg_q_msg_t _msg, *msg = &_msg; - session_app_del_segment_msg_t *mp; + session_app_del_segment_msg_t m = { 0 }; vl_api_registration_t *reg; app_worker_t *app_wrk; - session_event_t *evt; - svm_msg_q_t *app_mq; app_wrk = app_worker_get (app_wrk_index); reg = vl_mem_api_client_index_to_registration (app_wrk->api_client_index); @@ -533,17 +422,10 @@ mq_send_del_segment_cb (u32 app_wrk_index, u64 segment_handle) return -1; } - app_mq = app_wrk->event_queue; - if (mq_try_lock_and_alloc_msg (app_mq, msg)) - return -1; + m.segment_handle = segment_handle; - evt = svm_msg_q_msg_data (app_mq, msg); - clib_memset (evt, 0, sizeof (*evt)); - evt->event_type = SESSION_CTRL_EVT_APP_DEL_SEGMENT; - mp = (session_app_del_segment_msg_t *) evt->data; - clib_memset (mp, 0, sizeof (*mp)); - mp->segment_handle = segment_handle; - svm_msg_q_add_and_unlock (app_mq, msg); + app_wrk_send_ctrl_evt (app_wrk, SESSION_CTRL_EVT_APP_DEL_SEGMENT, &m, + sizeof (m)); return 0; } @@ -551,10 +433,7 @@ mq_send_del_segment_cb (u32 app_wrk_index, u64 segment_handle) static void mq_send_session_cleanup_cb (session_t * s, session_cleanup_ntf_t ntf) { - svm_msg_q_msg_t _msg, *msg = &_msg; - session_cleanup_msg_t *mp; - svm_msg_q_t *app_mq; - session_event_t *evt; + session_cleanup_msg_t m = { 0 }; app_worker_t *app_wrk; /* Propagate transport cleanup notifications only if app didn't close */ @@ -566,17 +445,10 @@ mq_send_session_cleanup_cb (session_t * s, session_cleanup_ntf_t ntf) if (!app_wrk) return; - app_mq = app_wrk->event_queue; - if (mq_try_lock_and_alloc_msg (app_mq, msg)) - return; + m.handle = session_handle (s); + m.type = ntf; - evt = svm_msg_q_msg_data (app_mq, msg); - clib_memset (evt, 0, sizeof (*evt)); - evt->event_type = SESSION_CTRL_EVT_CLEANUP; - mp = (session_cleanup_msg_t *) evt->data; - mp->handle = session_handle (s); - mp->type = ntf; - svm_msg_q_add_and_unlock (app_mq, msg); + app_wrk_send_ctrl_evt (app_wrk, SESSION_CTRL_EVT_CLEANUP, &m, sizeof (m)); } static session_cb_vft_t session_mq_cb_vft = { @@ -601,6 +473,17 @@ vl_api_session_enable_disable_t_handler (vl_api_session_enable_disable_t * mp) REPLY_MACRO (VL_API_SESSION_ENABLE_DISABLE_REPLY); } +static void +vl_api_session_sapi_enable_disable_t_handler ( + vl_api_session_sapi_enable_disable_t *mp) +{ + vl_api_session_sapi_enable_disable_reply_t *rmp; + int rv = 0; + + rv = appns_sapi_enable_disable (mp->is_enable); + REPLY_MACRO (VL_API_SESSION_SAPI_ENABLE_DISABLE_REPLY); +} + static void vl_api_app_attach_t_handler (vl_api_app_attach_t * mp) { @@ -685,25 +568,28 @@ vl_api_app_attach_t_handler (vl_api_app_attach_t * mp) done: /* *INDENT-OFF* */ - REPLY_MACRO2 (VL_API_APP_ATTACH_REPLY, ({ - if (!rv) - { - ctrl_thread = n_workers ? 1 : 0; - segp = (fifo_segment_t *) a->segment; - rmp->app_index = clib_host_to_net_u32 (a->app_index); - rmp->app_mq = fifo_segment_msg_q_offset (segp, 0); - rmp->vpp_ctrl_mq = fifo_segment_msg_q_offset (rx_mqs_seg, ctrl_thread); - rmp->vpp_ctrl_mq_thread = ctrl_thread; - rmp->n_fds = n_fds; - rmp->fd_flags = fd_flags; - if (vec_len (segp->ssvm.name)) - { - vl_api_vec_to_api_string (segp->ssvm.name, &rmp->segment_name); - } - rmp->segment_size = segp->ssvm.ssvm_size; - rmp->segment_handle = clib_host_to_net_u64 (a->segment_handle); - } - })); + REPLY_MACRO3 ( + VL_API_APP_ATTACH_REPLY, + ((!rv) ? vec_len (((fifo_segment_t *) a->segment)->ssvm.name) : 0), ({ + if (!rv) + { + ctrl_thread = n_workers ? 1 : 0; + segp = (fifo_segment_t *) a->segment; + rmp->app_index = clib_host_to_net_u32 (a->app_index); + rmp->app_mq = fifo_segment_msg_q_offset (segp, 0); + rmp->vpp_ctrl_mq = + fifo_segment_msg_q_offset (rx_mqs_seg, ctrl_thread); + rmp->vpp_ctrl_mq_thread = ctrl_thread; + rmp->n_fds = n_fds; + rmp->fd_flags = fd_flags; + if (vec_len (segp->ssvm.name)) + { + vl_api_vec_to_api_string (segp->ssvm.name, &rmp->segment_name); + } + rmp->segment_size = segp->ssvm.ssvm_size; + rmp->segment_handle = clib_host_to_net_u64 (a->segment_handle); + } + })); /* *INDENT-ON* */ if (n_fds) @@ -769,22 +655,25 @@ vl_api_app_worker_add_del_t_handler (vl_api_app_worker_add_del_t * mp) /* *INDENT-OFF* */ done: - REPLY_MACRO2 (VL_API_APP_WORKER_ADD_DEL_REPLY, ({ - rmp->is_add = mp->is_add; - rmp->wrk_index = clib_host_to_net_u32 (args.wrk_map_index); - rmp->segment_handle = clib_host_to_net_u64 (args.segment_handle); - if (!rv && mp->is_add) - { - rmp->app_event_queue_address = - fifo_segment_msg_q_offset ((fifo_segment_t *) args.segment, 0); - rmp->n_fds = n_fds; - rmp->fd_flags = fd_flags; - if (vec_len (args.segment->name)) - { - vl_api_vec_to_api_string (args.segment->name, &rmp->segment_name); - } - } - })); + REPLY_MACRO3 ( + VL_API_APP_WORKER_ADD_DEL_REPLY, + ((!rv && mp->is_add) ? vec_len (args.segment->name) : 0), ({ + rmp->is_add = mp->is_add; + rmp->wrk_index = clib_host_to_net_u32 (args.wrk_map_index); + rmp->segment_handle = clib_host_to_net_u64 (args.segment_handle); + if (!rv && mp->is_add) + { + rmp->app_event_queue_address = + fifo_segment_msg_q_offset ((fifo_segment_t *) args.segment, 0); + rmp->n_fds = n_fds; + rmp->fd_flags = fd_flags; + if (vec_len (args.segment->name)) + { + vl_api_vec_to_api_string (args.segment->name, + &rmp->segment_name); + } + } + })); /* *INDENT-ON* */ if (n_fds) @@ -930,7 +819,7 @@ vl_api_app_namespace_add_del_v3_t_handler ( mp->netns[sizeof (mp->netns) - 1] = 0; ns_id = format (0, "%s", &mp->namespace_id); netns = format (0, "%s", &mp->netns); - sock_name = format (0, "%s", &mp->sock_name); + sock_name = vl_api_from_api_to_new_vec (mp, &mp->sock_name); vnet_app_namespace_add_del_args_t args = { .ns_id = ns_id, .netns = netns, @@ -1228,36 +1117,11 @@ VL_MSG_API_REAPER_FUNCTION (application_reaper_cb); * Socket api functions */ -static void -sapi_send_fds (app_worker_t * app_wrk, int *fds, int n_fds) -{ - app_sapi_msg_t smsg = { 0 }; - app_namespace_t *app_ns; - application_t *app; - clib_socket_t *cs; - u32 cs_index; - - app = application_get (app_wrk->app_index); - app_ns = app_namespace_get (app->ns_index); - cs_index = appns_sapi_handle_sock_index (app_wrk->api_client_index); - cs = appns_sapi_get_socket (app_ns, cs_index); - if (PREDICT_FALSE (!cs)) - return; - - /* There's no payload for the message only the type */ - smsg.type = APP_SAPI_MSG_TYPE_SEND_FDS; - clib_socket_sendmsg (cs, &smsg, sizeof (smsg), fds, n_fds); -} - static int mq_send_add_segment_sapi_cb (u32 app_wrk_index, u64 segment_handle) { - int fds[SESSION_N_FD_TYPE], n_fds = 0; - svm_msg_q_msg_t _msg, *msg = &_msg; - session_app_add_segment_msg_t *mp; + session_app_add_segment_msg_t m = { 0 }; app_worker_t *app_wrk; - session_event_t *evt; - svm_msg_q_t *app_mq; fifo_segment_t *fs; ssvm_private_t *sp; u8 fd_flags = 0; @@ -1269,33 +1133,15 @@ mq_send_add_segment_sapi_cb (u32 app_wrk_index, u64 segment_handle) ASSERT (ssvm_type (sp) == SSVM_SEGMENT_MEMFD); fd_flags |= SESSION_FD_F_MEMFD_SEGMENT; - fds[n_fds] = sp->fd; - n_fds += 1; - - app_mq = app_wrk->event_queue; - if (mq_try_lock_and_alloc_msg (app_mq, msg)) - return -1; - /* - * Send the fd over api socket - */ - sapi_send_fds (app_wrk, fds, n_fds); + m.segment_size = sp->ssvm_size; + m.fd_flags = fd_flags; + m.segment_handle = segment_handle; + strncpy ((char *) m.segment_name, (char *) sp->name, + sizeof (m.segment_name) - 1); - /* - * Send the actual message over mq - */ - evt = svm_msg_q_msg_data (app_mq, msg); - clib_memset (evt, 0, sizeof (*evt)); - evt->event_type = SESSION_CTRL_EVT_APP_ADD_SEGMENT; - mp = (session_app_add_segment_msg_t *) evt->data; - clib_memset (mp, 0, sizeof (*mp)); - mp->segment_size = sp->ssvm_size; - mp->fd_flags = fd_flags; - mp->segment_handle = segment_handle; - strncpy ((char *) mp->segment_name, (char *) sp->name, - sizeof (mp->segment_name) - 1); - - svm_msg_q_add_and_unlock (app_mq, msg); + app_wrk_send_ctrl_evt_fd (app_wrk, SESSION_CTRL_EVT_APP_ADD_SEGMENT, &m, + sizeof (m), sp->fd); return 0; } @@ -1303,25 +1149,15 @@ mq_send_add_segment_sapi_cb (u32 app_wrk_index, u64 segment_handle) static int mq_send_del_segment_sapi_cb (u32 app_wrk_index, u64 segment_handle) { - svm_msg_q_msg_t _msg, *msg = &_msg; - session_app_del_segment_msg_t *mp; + session_app_del_segment_msg_t m = { 0 }; app_worker_t *app_wrk; - session_event_t *evt; - svm_msg_q_t *app_mq; app_wrk = app_worker_get (app_wrk_index); - app_mq = app_wrk->event_queue; - if (mq_try_lock_and_alloc_msg (app_mq, msg)) - return -1; + m.segment_handle = segment_handle; - evt = svm_msg_q_msg_data (app_mq, msg); - clib_memset (evt, 0, sizeof (*evt)); - evt->event_type = SESSION_CTRL_EVT_APP_DEL_SEGMENT; - mp = (session_app_del_segment_msg_t *) evt->data; - clib_memset (mp, 0, sizeof (*mp)); - mp->segment_handle = segment_handle; - svm_msg_q_add_and_unlock (app_mq, msg); + app_wrk_send_ctrl_evt (app_wrk, SESSION_CTRL_EVT_APP_DEL_SEGMENT, &m, + sizeof (m)); return 0; } @@ -1536,6 +1372,31 @@ done: clib_socket_sendmsg (cs, &msg, sizeof (msg), fds, n_fds); } +/* This is a workaround for the case when session layer starts reading + * the socket before the client actualy sends the data + */ +static clib_error_t * +sapi_socket_receive_wait (clib_socket_t *cs, u8 *msg, u32 msg_len) +{ + clib_error_t *err; + int n_tries = 5; + + while (1) + { + err = clib_socket_recvmsg (cs, msg, msg_len, 0, 0); + if (!err) + break; + + if (!n_tries) + return err; + + n_tries--; + usleep (1); + } + + return err; +} + static void sapi_add_del_cert_key_handler (app_namespace_t *app_ns, clib_socket_t *cs, app_sapi_cert_key_add_del_msg_t *mp) @@ -1559,11 +1420,11 @@ sapi_add_del_cert_key_handler (app_namespace_t *app_ns, clib_socket_t *cs, } vec_validate (certkey, mp->certkey_len - 1); - err = clib_socket_recvmsg (cs, certkey, mp->certkey_len, 0, 0); + + err = sapi_socket_receive_wait (cs, certkey, mp->certkey_len); if (err) { clib_error_report (err); - clib_error_free (err); rv = SESSION_E_INVALID; goto send_reply; } @@ -1762,6 +1623,23 @@ error: return err; } +void +appns_sapi_del_ns_socket (app_namespace_t *app_ns) +{ + app_ns_api_handle_t *handle; + clib_socket_t *cs; + + pool_foreach (cs, app_ns->app_sockets) + { + handle = (app_ns_api_handle_t *) &cs->private_data; + clib_file_del_by_index (&file_main, handle->aah_file_index); + + clib_socket_close (cs); + clib_socket_free (cs); + } + pool_free (app_ns->app_sockets); +} + int appns_sapi_add_ns_socket (app_namespace_t * app_ns) { @@ -1799,7 +1677,7 @@ appns_sapi_add_ns_socket (app_namespace_t * app_ns) * Create and initialize socket to listen on */ cs = appns_sapi_alloc_socket (app_ns); - cs->config = (char *) app_ns->sock_name; + cs->config = (char *) vec_dup (app_ns->sock_name); cs->flags = CLIB_SOCKET_F_IS_SERVER | CLIB_SOCKET_F_ALLOW_GROUP_WRITE | CLIB_SOCKET_F_SEQPACKET | CLIB_SOCKET_F_PASSCRED;