-vppcom_session_disconnect (u32 session_index)
-{
- vppcom_main_t *vcm = &vppcom_main;
- int rv;
- session_t *session;
-
- clib_spinlock_lock (&vcm->sessions_lockp);
- rv = vppcom_session_at_index (session_index, &session);
- if (PREDICT_FALSE (rv))
- {
- clib_spinlock_unlock (&vcm->sessions_lockp);
- if (VPPCOM_DEBUG > 1)
- clib_warning ("[%d] invalid session, sid (%u) has been closed!",
- vcm->my_pid, session_index);
- return rv;
- }
-
- if (!session->is_cut_thru)
- {
- vppcom_send_disconnect (session);
- clib_spinlock_unlock (&vcm->sessions_lockp);
-
- rv = vppcom_wait_for_session_state_change (session_index,
- STATE_DISCONNECT, 1.0);
- if ((VPPCOM_DEBUG > 0) && (rv < 0))
- clib_warning ("[%d] disconnect (session %d) failed, rv = %s (%d)",
- vcm->my_pid, session_index, vppcom_retval_str (rv), rv);
- }
- else
- clib_spinlock_unlock (&vcm->sessions_lockp);
-
- return VPPCOM_OK;
-}
-
-#define foreach_sock_msg \
-_(SESSION_ENABLE_DISABLE_REPLY, session_enable_disable_reply) \
-_(BIND_SOCK_REPLY, bind_sock_reply) \
-_(UNBIND_SOCK_REPLY, unbind_sock_reply) \
-_(ACCEPT_SESSION, accept_session) \
-_(CONNECT_SOCK, connect_sock) \
-_(CONNECT_SESSION_REPLY, connect_session_reply) \
-_(DISCONNECT_SESSION, disconnect_session) \
-_(DISCONNECT_SESSION_REPLY, disconnect_session_reply) \
-_(RESET_SESSION, reset_session) \
-_(APPLICATION_ATTACH_REPLY, application_attach_reply) \
-_(APPLICATION_DETACH_REPLY, application_detach_reply) \
-_(MAP_ANOTHER_SEGMENT, map_another_segment)
-
-static void
-vppcom_api_hookup (void)
-{
-#define _(N,n) \
- vl_msg_api_set_handlers(VL_API_##N, #n, \
- vl_api_##n##_t_handler, \
- vl_noop_handler, \
- vl_api_##n##_t_endian, \
- vl_api_##n##_t_print, \
- sizeof(vl_api_##n##_t), 1);
- foreach_sock_msg;
-#undef _
-}
-
-static void
-vppcom_cfg_init (vppcom_cfg_t * vcl_cfg)
-{
- ASSERT (vcl_cfg);
-
- vcl_cfg->heapsize = (256ULL << 20);
- vcl_cfg->segment_baseva = 0x200000000ULL;
- vcl_cfg->segment_size = (256 << 20);
- vcl_cfg->add_segment_size = (128 << 20);
- vcl_cfg->preallocated_fifo_pairs = 8;
- vcl_cfg->rx_fifo_size = (1 << 20);
- vcl_cfg->tx_fifo_size = (1 << 20);
- vcl_cfg->event_queue_size = 2048;
- vcl_cfg->listen_queue_size = CLIB_CACHE_LINE_BYTES / sizeof (u32);
- vcl_cfg->app_timeout = 10 * 60.0;
- vcl_cfg->session_timeout = 10 * 60.0;
- vcl_cfg->accept_timeout = 60.0;
-}
-
-static void
-vppcom_cfg_heapsize (char *conf_fname)
-{
- vppcom_main_t *vcm = &vppcom_main;
- vppcom_cfg_t *vcl_cfg = &vcm->cfg;
- FILE *fp;
- char inbuf[4096];
- int argc = 1;
- char **argv = NULL;
- char *arg = NULL;
- char *p;
- int i;
- u8 *sizep;
- u32 size;
-
- fp = fopen (conf_fname, "r");
- if (fp == NULL)
- {
- if (VPPCOM_DEBUG > 0)
- fprintf (stderr, "open configuration file '%s' failed\n", conf_fname);
- goto defaulted;
- }
- argv = calloc (1, sizeof (char *));
- if (argv == NULL)
- goto defaulted;
-
- while (1)
- {
- if (fgets (inbuf, 4096, fp) == 0)
- break;
- p = strtok (inbuf, " \t\n");
- while (p != NULL)
- {
- if (*p == '#')
- break;
- argc++;
- char **tmp = realloc (argv, argc * sizeof (char *));
- if (tmp == NULL)
- goto defaulted;
- argv = tmp;
- arg = strndup (p, 1024);
- if (arg == NULL)
- goto defaulted;
- argv[argc - 1] = arg;
- p = strtok (NULL, " \t\n");
- }
- }
-
- fclose (fp);
- fp = NULL;
-
- char **tmp = realloc (argv, (argc + 1) * sizeof (char *));
- if (tmp == NULL)
- goto defaulted;
- argv = tmp;
- argv[argc] = NULL;
-
- /*
- * Look for and parse the "heapsize" config parameter.
- * Manual since none of the clib infra has been bootstrapped yet.
- *
- * Format: heapsize <nn>[mM][gG]
- */
-
- for (i = 1; i < (argc - 1); i++)
- {
- if (!strncmp (argv[i], "heapsize", 8))
- {
- sizep = (u8 *) argv[i + 1];
- size = 0;
- while (*sizep >= '0' && *sizep <= '9')
- {
- size *= 10;
- size += *sizep++ - '0';
- }
- if (size == 0)
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] parse error '%s %s', "
- "using default heapsize %lld (0x%llx)",
- vcm->my_pid, argv[i], argv[i + 1],
- vcl_cfg->heapsize, vcl_cfg->heapsize);
- goto defaulted;
- }
-
- if (*sizep == 'g' || *sizep == 'G')
- vcl_cfg->heapsize = size << 30;
- else if (*sizep == 'm' || *sizep == 'M')
- vcl_cfg->heapsize = size << 20;
- else
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] parse error '%s %s', "
- "using default heapsize %lld (0x%llx)",
- vcm->my_pid, argv[i], argv[i + 1],
- vcl_cfg->heapsize, vcl_cfg->heapsize);
- goto defaulted;
- }
- }
- }
-
-defaulted:
- if (fp != NULL)
- fclose (fp);
- if (argv != NULL)
- free (argv);
- if (!clib_mem_init (0, vcl_cfg->heapsize))
- clib_warning ("[%d] vppcom heap allocation failure!", vcm->my_pid);
- else if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] allocated vppcom heapsize %lld (0x%llx)",
- vcm->my_pid, vcl_cfg->heapsize, vcl_cfg->heapsize);
-}
-
-static void
-vppcom_cfg_read (char *conf_fname)
-{
- vppcom_main_t *vcm = &vppcom_main;
- vppcom_cfg_t *vcl_cfg = &vcm->cfg;
- int fd;
- unformat_input_t _input, *input = &_input;
- unformat_input_t _line_input, *line_input = &_line_input;
- u8 vc_cfg_input = 0;
- u8 *chroot_path;
- struct stat s;
- u32 uid, gid;
-
- fd = open (conf_fname, O_RDONLY);
- if (fd < 0)
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] open configuration file '%s' failed!",
- vcm->my_pid, conf_fname);
- goto file_done;
- }
-
- if (fstat (fd, &s) < 0)
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] failed to stat `%s'", vcm->my_pid, conf_fname);
- goto file_done;
- }
-
- if (!(S_ISREG (s.st_mode) || S_ISLNK (s.st_mode)))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] not a regular file `%s'", vcm->my_pid,
- conf_fname);
- goto file_done;
- }
-
- unformat_init_clib_file (input, fd);
-
- while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
- {
- (void) unformat_user (input, unformat_line_input, line_input);
- unformat_skip_white_space (line_input);
-
- if (unformat (line_input, "vcl {"))
- {
- vc_cfg_input = 1;
- continue;
- }
-
- if (vc_cfg_input)
- {
- if (unformat (line_input, "heapsize %s", &chroot_path))
- {
- vec_terminate_c_string (chroot_path);
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured heapsize %s, "
- "actual heapsize %lld (0x%llx)",
- vcm->my_pid, chroot_path, vcl_cfg->heapsize,
- vcl_cfg->heapsize);
- vec_free (chroot_path);
- }
- else if (unformat (line_input, "api-prefix %s", &chroot_path))
- {
- vec_terminate_c_string (chroot_path);
- vl_set_memory_root_path ((char *) chroot_path);
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured api-prefix %s",
- vcm->my_pid, chroot_path);
- chroot_path = 0; /* Don't vec_free() it! */
- }
- else if (unformat (line_input, "uid %d", &uid))
- {
- vl_set_memory_uid (uid);
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured uid %d", vcm->my_pid, uid);
- }
- else if (unformat (line_input, "gid %d", &gid))
- {
- vl_set_memory_gid (gid);
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured gid %d", vcm->my_pid, gid);
- }
- else if (unformat (line_input, "segment-baseva 0x%lx",
- &vcl_cfg->segment_baseva))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured segment_baseva 0x%lx",
- vcm->my_pid, vcl_cfg->segment_baseva);
- }
- else if (unformat (line_input, "segment-size 0x%lx",
- &vcl_cfg->segment_size))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured segment_size 0x%lx (%ld)",
- vcm->my_pid, vcl_cfg->segment_size,
- vcl_cfg->segment_size);
- }
- else if (unformat (line_input, "segment-size %ld",
- &vcl_cfg->segment_size))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured segment_size %ld (0x%lx)",
- vcm->my_pid, vcl_cfg->segment_size,
- vcl_cfg->segment_size);
- }
- else if (unformat (line_input, "add-segment-size 0x%lx",
- &vcl_cfg->add_segment_size))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning
- ("[%d] configured add_segment_size 0x%lx (%ld)",
- vcm->my_pid, vcl_cfg->add_segment_size,
- vcl_cfg->add_segment_size);
- }
- else if (unformat (line_input, "add-segment-size %ld",
- &vcl_cfg->add_segment_size))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning
- ("[%d] configured add_segment_size %ld (0x%lx)",
- vcm->my_pid, vcl_cfg->add_segment_size,
- vcl_cfg->add_segment_size);
- }
- else if (unformat (line_input, "preallocated-fifo-pairs %d",
- &vcl_cfg->preallocated_fifo_pairs))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured preallocated_fifo_pairs "
- "%d (0x%x)", vcm->my_pid,
- vcl_cfg->preallocated_fifo_pairs,
- vcl_cfg->preallocated_fifo_pairs);
- }
- else if (unformat (line_input, "rx-fifo-size 0x%lx",
- &vcl_cfg->rx_fifo_size))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured rx_fifo_size 0x%lx (%ld)",
- vcm->my_pid, vcl_cfg->rx_fifo_size,
- vcl_cfg->rx_fifo_size);
- }
- else if (unformat (line_input, "rx-fifo-size %ld",
- &vcl_cfg->rx_fifo_size))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured rx_fifo_size %ld (0x%lx)",
- vcm->my_pid, vcl_cfg->rx_fifo_size,
- vcl_cfg->rx_fifo_size);
- }
- else if (unformat (line_input, "tx-fifo-size 0x%lx",
- &vcl_cfg->tx_fifo_size))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured tx_fifo_size 0x%lx (%ld)",
- vcm->my_pid, vcl_cfg->tx_fifo_size,
- vcl_cfg->tx_fifo_size);
- }
- else if (unformat (line_input, "tx-fifo-size %ld",
- &vcl_cfg->tx_fifo_size))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured tx_fifo_size %ld (0x%lx)",
- vcm->my_pid, vcl_cfg->tx_fifo_size,
- vcl_cfg->tx_fifo_size);
- }
- else if (unformat (line_input, "event-queue-size 0x%lx",
- &vcl_cfg->event_queue_size))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured event_queue_size 0x%lx (%ld)",
- vcm->my_pid, vcl_cfg->event_queue_size,
- vcl_cfg->event_queue_size);
- }
- else if (unformat (line_input, "event-queue-size %ld",
- &vcl_cfg->event_queue_size))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured event_queue_size %ld (0x%lx)",
- vcm->my_pid, vcl_cfg->event_queue_size,
- vcl_cfg->event_queue_size);
- }
- else if (unformat (line_input, "listen-queue-size 0x%lx",
- &vcl_cfg->listen_queue_size))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured listen_queue_size 0x%lx (%ld)",
- vcm->my_pid, vcl_cfg->listen_queue_size,
- vcl_cfg->listen_queue_size);
- }
- else if (unformat (line_input, "listen-queue-size %ld",
- &vcl_cfg->listen_queue_size))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured listen_queue_size %ld (0x%lx)",
- vcm->my_pid, vcl_cfg->listen_queue_size,
- vcl_cfg->listen_queue_size);
- }
- else if (unformat (line_input, "app-timeout %f",
- &vcl_cfg->app_timeout))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured app_timeout %f",
- vcm->my_pid, vcl_cfg->app_timeout);
- }
- else if (unformat (line_input, "session-timeout %f",
- &vcl_cfg->session_timeout))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured session_timeout %f",
- vcm->my_pid, vcl_cfg->session_timeout);
- }
- else if (unformat (line_input, "accept-timeout %f",
- &vcl_cfg->accept_timeout))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured accept_timeout %f",
- vcm->my_pid, vcl_cfg->accept_timeout);
- }
- else if (unformat (line_input, "app-proxy-transport-tcp"))
- {
- vcl_cfg->app_proxy_transport_tcp = 1;
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured app_proxy_transport_tcp (%d)",
- vcm->my_pid, vcl_cfg->app_proxy_transport_tcp);
- }
- else if (unformat (line_input, "app-proxy-transport-udp"))
- {
- vcl_cfg->app_proxy_transport_udp = 1;
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured app_proxy_transport_udp (%d)",
- vcm->my_pid, vcl_cfg->app_proxy_transport_udp);
- }
- else if (unformat (line_input, "app-scope-local"))
- {
- vcl_cfg->app_scope_local = 1;
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured app_scope_local (%d)",
- vcm->my_pid, vcl_cfg->app_scope_local);
- }
- else if (unformat (line_input, "app-scope-global"))
- {
- vcl_cfg->app_scope_global = 1;
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured app_scope_global (%d)",
- vcm->my_pid, vcl_cfg->app_scope_global);
- }
- else if (unformat (line_input, "namespace-secret %lu",
- &vcl_cfg->namespace_secret))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning
- ("[%d] configured namespace_secret %lu (0x%lx)",
- vcm->my_pid, vcl_cfg->namespace_secret,
- vcl_cfg->namespace_secret);
- }
- else if (unformat (line_input, "namespace-id %v",
- &vcl_cfg->namespace_id))
- {
- vl_api_application_attach_t *mp;
- u32 max_nsid_vec_len = sizeof (mp->namespace_id) - 1;
- u32 nsid_vec_len = vec_len (vcl_cfg->namespace_id);
- if (nsid_vec_len > max_nsid_vec_len)
- {
- _vec_len (vcl_cfg->namespace_id) = max_nsid_vec_len;
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured namespace_id is too long,"
- " truncated to %d characters!", vcm->my_pid,
- max_nsid_vec_len);
- }
-
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured namespace_id %v",
- vcm->my_pid, vcl_cfg->namespace_id);
- }
- else if (unformat (line_input, "}"))
- {
- vc_cfg_input = 0;
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] completed parsing vppcom config!",
- vcm->my_pid);
- goto input_done;
- }
- else
- {
- if (line_input->buffer[line_input->index] != '#')
- {
- clib_warning ("[%d] Unknown vppcom config option: '%s'",
- vcm->my_pid, (char *)
- &line_input->buffer[line_input->index]);
- }
- }
- }
- }
-
-input_done:
- unformat_free (input);
-
-file_done:
- if (fd >= 0)
- close (fd);
-}
-
-/*
- * VPPCOM Public API functions
- */
-int
-vppcom_app_create (char *app_name)
-{
- vppcom_main_t *vcm = &vppcom_main;
- vppcom_cfg_t *vcl_cfg = &vcm->cfg;
- u8 *heap;
- mheap_t *h;
- int rv;
-
- if (!vcm->init)
- {
- char *conf_fname;
- char *env_var_str;
-
- vcm->init = 1;
- vcm->my_pid = getpid ();
- clib_fifo_validate (vcm->client_session_index_fifo,
- vcm->cfg.listen_queue_size);
- vppcom_cfg_init (vcl_cfg);
- conf_fname = getenv (VPPCOM_ENV_CONF);
- if (!conf_fname)
- {
- conf_fname = VPPCOM_CONF_DEFAULT;
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] getenv '%s' failed!", vcm->my_pid,
- VPPCOM_ENV_CONF);
- }
- vppcom_cfg_heapsize (conf_fname);
- vppcom_cfg_read (conf_fname);
- env_var_str = getenv (VPPCOM_ENV_APP_NAMESPACE_ID);
- if (env_var_str)
- {
- u32 ns_id_vec_len = strlen (env_var_str);
-
- vec_reset_length (vcm->cfg.namespace_id);
- vec_validate (vcm->cfg.namespace_id, ns_id_vec_len - 1);
- clib_memcpy (vcm->cfg.namespace_id, env_var_str, ns_id_vec_len);
-
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured namespace_id (%v) from "
- VPPCOM_ENV_APP_NAMESPACE_ID "!", vcm->my_pid,
- vcm->cfg.namespace_id);
- }
- env_var_str = getenv (VPPCOM_ENV_APP_NAMESPACE_SECRET);
- if (env_var_str)
- {
- u64 tmp;
- if (sscanf (env_var_str, "%lu", &tmp) != 1)
- clib_warning ("[%d] Invalid namespace secret specified in "
- "the environment variable "
- VPPCOM_ENV_APP_NAMESPACE_SECRET
- " (%s)!\n", vcm->my_pid, env_var_str);
- else
- {
- vcm->cfg.namespace_secret = tmp;
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured namespace secret (%lu) from "
- VPPCOM_ENV_APP_NAMESPACE_ID "!", vcm->my_pid,
- vcm->cfg.namespace_secret);
- }
- }
- if (getenv (VPPCOM_ENV_APP_PROXY_TRANSPORT_TCP))
- {
- vcm->cfg.app_proxy_transport_tcp = 1;
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured app_proxy_transport_tcp (%u) from "
- VPPCOM_ENV_APP_PROXY_TRANSPORT_TCP "!", vcm->my_pid,
- vcm->cfg.app_proxy_transport_tcp);
- }
- if (getenv (VPPCOM_ENV_APP_PROXY_TRANSPORT_UDP))
- {
- vcm->cfg.app_proxy_transport_udp = 1;
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured app_proxy_transport_udp (%u) from "
- VPPCOM_ENV_APP_PROXY_TRANSPORT_UDP "!", vcm->my_pid,
- vcm->cfg.app_proxy_transport_udp);
- }
- if (getenv (VPPCOM_ENV_APP_SCOPE_LOCAL))
- {
- vcm->cfg.app_scope_local = 1;
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured app_scope_local (%u) from "
- VPPCOM_ENV_APP_SCOPE_LOCAL "!", vcm->my_pid,
- vcm->cfg.app_scope_local);
- }
- if (getenv (VPPCOM_ENV_APP_SCOPE_GLOBAL))
- {
- vcm->cfg.app_scope_global = 1;
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] configured app_scope_global (%u) from "
- VPPCOM_ENV_APP_SCOPE_GLOBAL "!", vcm->my_pid,
- vcm->cfg.app_scope_global);
- }
-
- vcm->bind_session_index = ~0;
- vcm->main_cpu = os_get_thread_index ();
- heap = clib_mem_get_per_cpu_heap ();
- h = mheap_header (heap);
-
- /* make the main heap thread-safe */
- h->flags |= MHEAP_FLAG_THREAD_SAFE;
-
- vcm->session_index_by_vpp_handles = hash_create (0, sizeof (uword));
-
- clib_time_init (&vcm->clib_time);
- vppcom_init_error_string_table ();
- svm_fifo_segment_init (vcl_cfg->segment_baseva,
- 20 /* timeout in secs */ );
- clib_spinlock_init (&vcm->sessions_lockp);
- vppcom_api_hookup ();
- }
-
- if (vcm->my_client_index == ~0)
- {
- vcm->app_state = STATE_APP_START;
- rv = vppcom_connect_to_vpp (app_name);
- if (rv)
- {
- clib_warning ("[%d] couldn't connect to VPP.", vcm->my_pid);
- return rv;
- }
-
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] sending session enable", vcm->my_pid);
-
- rv = vppcom_app_session_enable ();
- if (rv)
- {
- clib_warning ("[%d] vppcom_app_session_enable() failed!",
- vcm->my_pid);
- return rv;
- }
-
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] sending app attach", vcm->my_pid);
-
- rv = vppcom_app_attach ();
- if (rv)
- {
- clib_warning ("[%d] vppcom_app_attach() failed!", vcm->my_pid);
- return rv;
- }
-
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] app_name '%s', my_client_index %d (0x%x)",
- vcm->my_pid, app_name, vcm->my_client_index,
- vcm->my_client_index);
- }
-
- return VPPCOM_OK;
-}
-
-void
-vppcom_app_destroy (void)
-{
- vppcom_main_t *vcm = &vppcom_main;
- int rv;
-
- if (vcm->my_client_index == ~0)
- return;
-
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] detaching from VPP, my_client_index %d (0x%x)",
- vcm->my_pid, vcm->my_client_index, vcm->my_client_index);
-
- vppcom_app_detach ();
- rv = vppcom_wait_for_app_state_change (STATE_APP_ENABLED);
- if (PREDICT_FALSE (rv))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] application detach timed out, rv = %s (%d)",
- vcm->my_pid, vppcom_retval_str (rv), rv);
- }
- vl_client_disconnect_from_vlib ();
- vcm->my_client_index = ~0;
- vcm->app_state = STATE_APP_START;
-}
-
-int
-vppcom_session_create (u32 vrf, u8 proto, u8 is_nonblocking)
-{
- vppcom_main_t *vcm = &vppcom_main;
- session_t *session;
- u32 session_index;
-
- clib_spinlock_lock (&vcm->sessions_lockp);
- pool_get (vcm->sessions, session);
- memset (session, 0, sizeof (*session));
- session_index = session - vcm->sessions;
-
- session->vrf = vrf;
- session->proto = proto;
- session->state = STATE_START;
- session->is_nonblocking = is_nonblocking ? 1 : 0;
- clib_spinlock_unlock (&vcm->sessions_lockp);
-
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] sid %d", vcm->my_pid, session_index);
-
- return (int) session_index;
-}
-
-int
-vppcom_session_close (uint32_t session_index)
-{
- vppcom_main_t *vcm = &vppcom_main;
- session_t *session = 0;
- int rv;
- u8 is_server;
- u8 is_listen;
- u8 is_cut_thru;
- u8 is_vep;
- u8 is_vep_session;
- u32 next_sid;
- u32 vep_idx;
- session_state_t state;
-
- clib_spinlock_lock (&vcm->sessions_lockp);
- rv = vppcom_session_at_index (session_index, &session);
- if (PREDICT_FALSE (rv))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] invalid session, sid (%u) has been closed!",
- vcm->my_pid, session_index);
- clib_spinlock_unlock (&vcm->sessions_lockp);
- goto done;
- }
- is_server = session->is_server;
- is_listen = session->is_listen;
- is_cut_thru = session->is_cut_thru;
- is_vep = session->is_vep;
- is_vep_session = session->is_vep_session;
- next_sid = session->vep.next_sid;
- vep_idx = session->vep.vep_idx;
- state = session->state;
- clib_spinlock_unlock (&vcm->sessions_lockp);
-
- if (VPPCOM_DEBUG > 0)
- clib_warning ("[%d] sid %d", vcm->my_pid, session_index);
-
- if (is_vep)
- {
- while (next_sid != ~0)
- {
- rv = vppcom_epoll_ctl (session_index, EPOLL_CTL_DEL, next_sid, 0);
- if ((VPPCOM_DEBUG > 0) && (rv < 0))
- clib_warning ("[%d] EPOLL_CTL_DEL vep_idx %u, sid %u failed, "
- "rv = %s (%d)", vcm->my_pid, vep_idx, next_sid,
- vppcom_retval_str (rv), rv);
-
- clib_spinlock_lock (&vcm->sessions_lockp);
- rv = vppcom_session_at_index (session_index, &session);
- if (PREDICT_FALSE (rv))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning
- ("[%d] invalid session, sid (%u) has been closed!",
- vcm->my_pid, session_index);
- clib_spinlock_unlock (&vcm->sessions_lockp);
- goto done;
- }
- next_sid = session->vep.next_sid;
- clib_spinlock_unlock (&vcm->sessions_lockp);
- }
- }
- else
- {
- if (is_vep_session)
- {
- rv = vppcom_epoll_ctl (vep_idx, EPOLL_CTL_DEL, session_index, 0);
- if ((VPPCOM_DEBUG > 0) && (rv < 0))
- clib_warning ("[%d] EPOLL_CTL_DEL vep_idx %u, sid %u failed, "
- "rv = %s (%d)", vcm->my_pid, vep_idx, session_index,
- vppcom_retval_str (rv), rv);
- }
-
- if (is_cut_thru && is_server && (state == STATE_ACCEPT))
- {
- rv = vppcom_session_unbind_cut_thru (session);
- if ((VPPCOM_DEBUG > 0) && (rv < 0))
- clib_warning ("[%d] unbind cut-thru (session %d) failed, "
- "rv = %s (%d)",
- vcm->my_pid, session_index,
- vppcom_retval_str (rv), rv);
- }
- else if (is_server && is_listen)
- {
- rv = vppcom_session_unbind (session_index);
- if ((VPPCOM_DEBUG > 0) && (rv < 0))
- clib_warning ("[%d] unbind (session %d) failed, rv = %s (%d)",
- vcm->my_pid, session_index,
- vppcom_retval_str (rv), rv);
- }
- else if (state == STATE_CONNECT)
- if (vppcom_session_disconnect (session_index))
- goto done;
- }
- clib_spinlock_lock (&vcm->sessions_lockp);
- pool_put_index (vcm->sessions, session_index);
- clib_spinlock_unlock (&vcm->sessions_lockp);
-done:
- return rv;
-}
-
-int
-vppcom_session_bind (uint32_t session_index, vppcom_endpt_t * ep)