- session->vpp_handle = mp->handle;
- session->lcl_addr.is_ip4 = mp->lcl_is_ip4;
- clib_memcpy (&session->lcl_addr.ip46, mp->lcl_ip,
- sizeof (session->peer_addr.ip46));
- session->lcl_port = mp->lcl_port;
- vppcom_session_table_add_listener (mp->handle, session_index);
- session->state = STATE_LISTEN;
-
- if (VPPCOM_DEBUG > 1)
- clib_warning ("VCL<%d>: vpp handle 0x%llx, sid %u: bind succeeded!",
- getpid (), mp->handle, mp->context);
-done_unlock:
- clib_spinlock_unlock (&vcm->sessions_lockp);
-}
-
-static void
-vl_api_unbind_sock_reply_t_handler (vl_api_unbind_sock_reply_t * mp)
-{
- if (mp->retval)
- clib_warning ("VCL<%d>: ERROR: sid %u: unbind failed: %U",
- getpid (), mp->context, format_api_error,
- ntohl (mp->retval));
-
- else if (VPPCOM_DEBUG > 1)
- clib_warning ("VCL<%d>: sid %u: unbind succeeded!",
- getpid (), mp->context);
-}
-
-u8 *
-format_ip4_address (u8 * s, va_list * args)
-{
- u8 *a = va_arg (*args, u8 *);
- return format (s, "%d.%d.%d.%d", a[0], a[1], a[2], a[3]);
-}
-
-u8 *
-format_ip6_address (u8 * s, va_list * args)
-{
- ip6_address_t *a = va_arg (*args, ip6_address_t *);
- u32 i, i_max_n_zero, max_n_zeros, i_first_zero, n_zeros, last_double_colon;
-
- i_max_n_zero = ARRAY_LEN (a->as_u16);
- max_n_zeros = 0;
- i_first_zero = i_max_n_zero;
- n_zeros = 0;
- for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
- {
- u32 is_zero = a->as_u16[i] == 0;
- if (is_zero && i_first_zero >= ARRAY_LEN (a->as_u16))
- {
- i_first_zero = i;
- n_zeros = 0;
- }
- n_zeros += is_zero;
- if ((!is_zero && n_zeros > max_n_zeros)
- || (i + 1 >= ARRAY_LEN (a->as_u16) && n_zeros > max_n_zeros))
- {
- i_max_n_zero = i_first_zero;
- max_n_zeros = n_zeros;
- i_first_zero = ARRAY_LEN (a->as_u16);
- n_zeros = 0;
- }
- }
-
- last_double_colon = 0;
- for (i = 0; i < ARRAY_LEN (a->as_u16); i++)
- {
- if (i == i_max_n_zero && max_n_zeros > 1)
- {
- s = format (s, "::");
- i += max_n_zeros - 1;
- last_double_colon = 1;
- }
- else
- {
- s = format (s, "%s%x",
- (last_double_colon || i == 0) ? "" : ":",
- clib_net_to_host_u16 (a->as_u16[i]));
- last_double_colon = 0;
- }
- }
-
- return s;
-}
-
-/* Format an IP46 address. */
-u8 *
-format_ip46_address (u8 * s, va_list * args)
-{
- ip46_address_t *ip46 = va_arg (*args, ip46_address_t *);
- ip46_type_t type = va_arg (*args, ip46_type_t);
- int is_ip4 = 1;
-
- switch (type)
- {
- case IP46_TYPE_ANY:
- is_ip4 = ip46_address_is_ip4 (ip46);
- break;
- case IP46_TYPE_IP4:
- is_ip4 = 1;
- break;
- case IP46_TYPE_IP6:
- is_ip4 = 0;
- break;
- }
-
- return is_ip4 ?
- format (s, "%U", format_ip4_address, &ip46->ip4) :
- format (s, "%U", format_ip6_address, &ip46->ip6);
-}
-
-static inline void
-vppcom_send_accept_session_reply (u64 handle, u32 context, int retval)
-{
- vl_api_accept_session_reply_t *rmp;
-
- rmp = vl_msg_api_alloc (sizeof (*rmp));
- memset (rmp, 0, sizeof (*rmp));
- rmp->_vl_msg_id = ntohs (VL_API_ACCEPT_SESSION_REPLY);
- rmp->retval = htonl (retval);
- rmp->context = context;
- rmp->handle = handle;
- vl_msg_api_send_shmem (vcm->vl_input_queue, (u8 *) & rmp);
-}
-
-static void
-vl_api_accept_session_t_handler (vl_api_accept_session_t * mp)
-{
- svm_fifo_t *rx_fifo, *tx_fifo;
- session_t *session, *listen_session;
- u32 session_index;
-
- clib_spinlock_lock (&vcm->sessions_lockp);
- if (!clib_fifo_free_elts (vcm->client_session_index_fifo))
- {
- clib_warning ("VCL<%d>: client session queue is full!", getpid ());
- vppcom_send_accept_session_reply (mp->handle, mp->context,
- VNET_API_ERROR_QUEUE_FULL);
- clib_spinlock_unlock (&vcm->sessions_lockp);
- return;
- }
-
- listen_session = vppcom_session_table_lookup_listener (mp->listener_handle);
- if (!listen_session)
- {
- clib_warning ("VCL<%d>: ERROR: couldn't find listen session: "
- "unknown vpp listener handle %llx",
- getpid (), mp->listener_handle);
- clib_spinlock_unlock (&vcm->sessions_lockp);
- return;
- }
-
- /* Allocate local session and set it up */
- pool_get (vcm->sessions, session);
- memset (session, 0, sizeof (*session));
- session_index = session - vcm->sessions;
-
- rx_fifo = uword_to_pointer (mp->server_rx_fifo, svm_fifo_t *);
- rx_fifo->client_session_index = session_index;
- tx_fifo = uword_to_pointer (mp->server_tx_fifo, svm_fifo_t *);
- tx_fifo->client_session_index = session_index;
-
- session->vpp_handle = mp->handle;
- session->client_context = mp->context;
- session->rx_fifo = rx_fifo;
- session->tx_fifo = tx_fifo;
- session->vpp_event_queue = uword_to_pointer (mp->vpp_event_queue_address,
- svm_queue_t *);
- session->state = STATE_ACCEPT;
- session->peer_port = mp->port;
- session->peer_addr.is_ip4 = mp->is_ip4;
- clib_memcpy (&session->peer_addr.ip46, mp->ip,
- sizeof (session->peer_addr.ip46));
-
- /* Add it to lookup table */
- hash_set (vcm->session_index_by_vpp_handles, mp->handle, session_index);
- session->lcl_port = listen_session->lcl_port;
- session->lcl_addr = listen_session->lcl_addr;
-
- /* TBD: move client_session_index_fifo into listener session */
- clib_fifo_add1 (vcm->client_session_index_fifo, session_index);
-
- if (VPPCOM_DEBUG > 1)
- clib_warning ("VCL<%d>: vpp handle 0x%llx, sid %u: client accept "
- "request from %s address %U port %d queue %p!", getpid (),
- mp->handle, session_index, mp->is_ip4 ? "IPv4" : "IPv6",
- format_ip46_address, &mp->ip, mp->is_ip4,
- clib_net_to_host_u16 (mp->port), session->vpp_event_queue);
-
- if (VPPCOM_DEBUG > 0)
- {
- session->elog_track.name =
- (char *) format (0, "C:%d:S:%d%c", vcm->my_client_index,
- session_index, 0);
- elog_track_register (&vcm->elog_main, &session->elog_track);
-
- if (session->peer_addr.is_ip4)
- {
- /* *INDENT-OFF* */
- ELOG_TYPE_DECLARE (e) =
- {
- .format =
- "client_accept:handle:%x addr:%d.%d.%d.%d:%d",
- .format_args = "i8i1i1i1i1i2",
- };
-
- CLIB_PACKED (struct {
- u64 handle; //8
- u8 addr[4]; //4
- u16 port; //2
- }) * ed;
-
- ed = ELOG_TRACK_DATA (&vcm->elog_main, e, session->elog_track);
-
- ed->handle = mp->handle;
- ed->addr[0] = session->peer_addr.ip46.ip4.as_u8[0];
- ed->addr[1] = session->peer_addr.ip46.ip4.as_u8[1];
- ed->addr[2] = session->peer_addr.ip46.ip4.as_u8[2];
- ed->addr[3] = session->peer_addr.ip46.ip4.as_u8[3];
- ed->port = clib_net_to_host_u16 (session->peer_port);
- /* *INDENT-ON* */
- }
- else
- {
- clib_warning ("ip6");
- }
- }
- clib_spinlock_unlock (&vcm->sessions_lockp);
-
-}
-
-static void
-vppcom_send_connect_session_reply (session_t * session, u32 session_index,
- u64 vpp_handle, u32 context, int retval)
-{
- vl_api_connect_session_reply_t *rmp;
- u32 len;
- svm_queue_t *client_q;
-
- rmp = vl_msg_api_alloc (sizeof (*rmp));
- memset (rmp, 0, sizeof (*rmp));
- rmp->_vl_msg_id = ntohs (VL_API_CONNECT_SESSION_REPLY);
-
- if (!session)
- {
- rmp->context = context;
- rmp->handle = vpp_handle;
- rmp->retval = htonl (retval);
- vl_msg_api_send_shmem (vcm->vl_input_queue, (u8 *) & rmp);
- return;
- }
-
- rmp->context = session->client_context;
- rmp->retval = htonl (retval);
- rmp->handle = session->vpp_handle;
- rmp->server_rx_fifo = pointer_to_uword (session->rx_fifo);
- rmp->server_tx_fifo = pointer_to_uword (session->tx_fifo);
- rmp->vpp_event_queue_address = pointer_to_uword (session->vpp_event_queue);
- rmp->segment_size = vcm->cfg.segment_size;
- len = vec_len (session->segment_name);
- rmp->segment_name_length = clib_min (len, sizeof (rmp->segment_name));
- clib_memcpy (rmp->segment_name, session->segment_name,
- rmp->segment_name_length - 1);
- clib_memcpy (rmp->lcl_ip, session->peer_addr.ip46.as_u8,
- sizeof (rmp->lcl_ip));
- rmp->is_ip4 = session->peer_addr.is_ip4;
- rmp->lcl_port = session->peer_port;
- client_q = uword_to_pointer (session->client_queue_address, svm_queue_t *);
- ASSERT (client_q);
- vl_msg_api_send_shmem (client_q, (u8 *) & rmp);
-}
-
-/*
- * Acting as server for redirected connect requests
- */
-static void
-vl_api_connect_sock_t_handler (vl_api_connect_sock_t * mp)
-{
- u32 session_index;
- session_t *session = 0;
-
- clib_spinlock_lock (&vcm->sessions_lockp);
- if (!clib_fifo_free_elts (vcm->client_session_index_fifo))
- {
- clib_spinlock_unlock (&vcm->sessions_lockp);
-
- if (VPPCOM_DEBUG > 1)
- clib_warning ("VCL<%d>: client session queue is full!", getpid ());
-
- /* TBD: Fix api to include vpp handle */
- vppcom_send_connect_session_reply (0 /* session */ , 0 /* sid */ ,
- 0 /* handle */ , mp->context,
- VNET_API_ERROR_QUEUE_FULL);
- return;
- }
-
- pool_get (vcm->sessions, session);
- memset (session, 0, sizeof (*session));
- session_index = session - vcm->sessions;
-
- session->client_context = mp->context;
- session->vpp_handle = session_index;
- session->client_queue_address = mp->client_queue_address;
- session->lcl_port = mp->port;
- session->lcl_addr.is_ip4 = mp->is_ip4;
- clib_memcpy (&session->lcl_addr.ip46, mp->ip,
- sizeof (session->lcl_addr.ip46));
-
- /* TBD: missing peer info in api msg.
- */
- session->peer_addr.is_ip4 = mp->is_ip4;
- ASSERT (session->lcl_addr.is_ip4 == session->peer_addr.is_ip4);
-
- session->state = STATE_ACCEPT;
- clib_fifo_add1 (vcm->client_session_index_fifo, session_index);
- if (VPPCOM_DEBUG > 1)
- clib_warning ("VCL<%d>: sid %u: Got a cut-thru connect request! "
- "clib_fifo_elts %u!\n", getpid (), session_index,
- clib_fifo_elts (vcm->client_session_index_fifo));
-
- if (VPPCOM_DEBUG > 0)
- {
- session->elog_track.name =
- (char *) format (0, "C:%d:S:%d%c", vcm->my_client_index,
- session_index, 0);
- elog_track_register (&vcm->elog_main, &session->elog_track);
-
- /* *INDENT-OFF* */
- ELOG_TYPE_DECLARE (e) =
- {
- .format = "cut-thru-connect:S:%d clib_fifo_elts:%d",
- .format_args = "i4i4",
- };
-
- struct
- {
- u32 data[2];
- } *ed;
-
- ed = ELOG_TRACK_DATA (&vcm->elog_main, e, session->elog_track);
-
- ed->data[0] = session_index;
- ed->data[1] = clib_fifo_elts (vcm->client_session_index_fifo);
- /* *INDENT-ON* */
- }
-
- clib_spinlock_unlock (&vcm->sessions_lockp);
-}
-
-static void
-vppcom_send_bind_sock (session_t * session, u32 session_index)
-{
- vl_api_bind_sock_t *bmp;
-
- /* Assumes caller has acquired spinlock: vcm->sessions_lockp */
- bmp = vl_msg_api_alloc (sizeof (*bmp));
- memset (bmp, 0, sizeof (*bmp));
-
- bmp->_vl_msg_id = ntohs (VL_API_BIND_SOCK);
- bmp->client_index = vcm->my_client_index;
- bmp->context = session_index;
- bmp->is_ip4 = session->lcl_addr.is_ip4;
- clib_memcpy (bmp->ip, &session->lcl_addr.ip46, sizeof (bmp->ip));
- bmp->port = session->lcl_port;
- bmp->proto = session->proto;
- clib_memcpy (bmp->options, session->options, sizeof (bmp->options));
- vl_msg_api_send_shmem (vcm->vl_input_queue, (u8 *) & bmp);
-}
-
-static void
-vppcom_send_unbind_sock (u64 vpp_handle)
-{
- vl_api_unbind_sock_t *ump;
-
- ump = vl_msg_api_alloc (sizeof (*ump));
- memset (ump, 0, sizeof (*ump));
-
- ump->_vl_msg_id = ntohs (VL_API_UNBIND_SOCK);
- ump->client_index = vcm->my_client_index;
- ump->handle = vpp_handle;
- vl_msg_api_send_shmem (vcm->vl_input_queue, (u8 *) & ump);
-}
-
-static int
-vppcom_session_unbind (u32 session_index)
-{
- session_t *session = 0;
- int rv;
- u64 vpp_handle;
- elog_track_t session_elog_track;
-
- VCL_LOCK_AND_GET_SESSION (session_index, &session);
-
- vpp_handle = session->vpp_handle;
- vppcom_session_table_del_listener (vpp_handle);
- session->vpp_handle = ~0;
- session->state = STATE_DISCONNECT;
- session_elog_track = session->elog_track;
-
- clib_spinlock_unlock (&vcm->sessions_lockp);
-
- if (VPPCOM_DEBUG > 1)
- clib_warning ("VCL<%d>: vpp handle 0x%llx, sid %u: "
- "sending unbind msg! new state 0x%x (%s)",
- getpid (), vpp_handle, session_index,
- STATE_DISCONNECT,
- vppcom_session_state_str (STATE_DISCONNECT));
-
- if (VPPCOM_DEBUG > 0)
- {
- /* *INDENT-OFF* */
- ELOG_TYPE_DECLARE (e) =
- {
- .format = "unbind: handle:%x",
- .format_args = "i8",
- };
-
- struct
- {
- u64 handle;
- } *ed;
-
- ed = ELOG_TRACK_DATA (&vcm->elog_main, e, session_elog_track);
- ed->handle = vpp_handle;
- /* *INDENT-ON* */
- }
-
- vppcom_send_unbind_sock (vpp_handle);
-
-done:
- return rv;
-}
-
-static inline int
-vppcom_session_disconnect (u32 session_index)
-{
- int rv;
- session_t *session;
- u64 vpp_handle;
- session_state_t state;
-
- VCL_LOCK_AND_GET_SESSION (session_index, &session);
-
- vpp_handle = session->vpp_handle;
- state = session->state;
- clib_spinlock_unlock (&vcm->sessions_lockp);
-
- if (VPPCOM_DEBUG > 1)
- {
- clib_warning ("VCL<%d>: vpp handle 0x%llx, sid %u "
- "state 0x%x (%s)",
- getpid (), vpp_handle, session_index,
- state, vppcom_session_state_str (state));
- }
-
- if (PREDICT_FALSE (state & STATE_LISTEN))
- {
- clib_warning ("VCL<%d>: ERROR: vpp handle 0x%llx, sid %u: "
- "Cannot disconnect a listen socket!",
- getpid (), vpp_handle, session_index);
- rv = VPPCOM_EBADFD;
- goto done;
- }
-
- /* The peer has already initiated the close,
- * so send the disconnect session reply.
- */
- if (state & STATE_CLOSE_ON_EMPTY)
- {
- //XXX alagalah - Check and drain here?
- vppcom_send_disconnect_session_reply (vpp_handle,
- session_index, 0 /* rv */ );
- if (VPPCOM_DEBUG > 1)
- clib_warning ("VCL<%d>: vpp handle 0x%llx, sid %u: "
- "sending disconnect REPLY...",
- getpid (), vpp_handle, session_index);
- }
-
- /* Otherwise, send a disconnect session msg...
- */
- else
- {
- if (VPPCOM_DEBUG > 1)
- clib_warning ("VCL<%d>: vpp handle 0x%llx, sid %u: "
- "sending disconnect...",
- getpid (), vpp_handle, session_index);
-
- vppcom_send_disconnect_session (vpp_handle, session_index);
- }
-
-done:
- return rv;
-}
-
-#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) \
-_(UNMAP_SEGMENT, unmap_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->vpp_api_q_length = 1024;
- 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;
- vcl_cfg->event_ring_size = (128 << 10);
- vcl_cfg->event_log_path = "/dev/shm";
-}
-
-static void
-vppcom_cfg_heapsize (char *conf_fname)
-{
- 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;
- void *vcl_mem;
- void *heap;
-
- fp = fopen (conf_fname, "r");
- if (fp == NULL)
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("VCL<%d>: using default heapsize %lld (0x%llx)",
- getpid (), vcl_cfg->heapsize, vcl_cfg->heapsize);
- goto defaulted;
- }
-
- argv = calloc (1, sizeof (char *));
- if (argv == NULL)
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("VCL<%d>: calloc failed, using default "
- "heapsize %lld (0x%llx)",
- getpid (), vcl_cfg->heapsize, vcl_cfg->heapsize);
- 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)
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("VCL<%d>: realloc failed, "
- "using default heapsize %lld (0x%llx)",
- getpid (), vcl_cfg->heapsize,
- vcl_cfg->heapsize);
- goto defaulted;
- }
- argv = tmp;
- arg = strndup (p, 1024);
- if (arg == NULL)
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("VCL<%d>: strndup failed, "
- "using default heapsize %lld (0x%llx)",
- getpid (), vcl_cfg->heapsize,
- vcl_cfg->heapsize);
- 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)
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("VCL<%d>: realloc failed, "
- "using default heapsize %lld (0x%llx)",
- getpid (), vcl_cfg->heapsize, vcl_cfg->heapsize);
- 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 ("VCL<%d>: parse error '%s %s', "
- "using default heapsize %lld (0x%llx)",
- getpid (), 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 ("VCL<%d>: parse error '%s %s', "
- "using default heapsize %lld (0x%llx)",
- getpid (), argv[i], argv[i + 1],
- vcl_cfg->heapsize, vcl_cfg->heapsize);
- goto defaulted;
- }
- }
- }
-
-defaulted:
- if (fp != NULL)
- fclose (fp);
- if (argv != NULL)
- free (argv);
-
- vcl_mem = mmap (0, vcl_cfg->heapsize, PROT_READ | PROT_WRITE,
- MAP_SHARED | MAP_ANONYMOUS, -1, 0);
- if (vcl_mem == MAP_FAILED)
- {
- clib_unix_error ("VCL<%d>: ERROR: mmap(0, %lld == 0x%llx, "
- "PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS, "
- "-1, 0) failed!",
- getpid (), vcl_cfg->heapsize, vcl_cfg->heapsize);
- ASSERT (vcl_mem != MAP_FAILED);
- return;
- }
- heap = clib_mem_init (vcl_mem, vcl_cfg->heapsize);
- if (!heap)
- {
- clib_warning ("VCL<%d>: ERROR: clib_mem_init() failed!", getpid ());
- ASSERT (heap);
- return;
- }
- vcl_mem = clib_mem_alloc (sizeof (_vppcom_main));
- if (!vcl_mem)
- {
- clib_warning ("VCL<%d>: ERROR: clib_mem_alloc() failed!", getpid ());
- ASSERT (vcl_mem);
- return;
- }
-
- clib_memcpy (vcl_mem, &_vppcom_main, sizeof (_vppcom_main));
- vcm = vcl_mem;
-
- if (VPPCOM_DEBUG > 0)
- clib_warning ("VCL<%d>: allocated VCL heap = %p, size %lld (0x%llx)",
- getpid (), heap, vcl_cfg->heapsize, vcl_cfg->heapsize);
-}
-
-static void
-vppcom_cfg_read (char *conf_fname)
-{
- 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, q_len;
-
- fd = open (conf_fname, O_RDONLY);
- if (fd < 0)
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("VCL<%d>: using default configuration.",
- getpid (), conf_fname);
- goto file_done;
- }
-
- if (fstat (fd, &s) < 0)
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("VCL<%d>: failed to stat `%s', "
- "using default configuration", getpid (), conf_fname);
- goto file_done;
- }
-
- if (!(S_ISREG (s.st_mode) || S_ISLNK (s.st_mode)))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("VCL<%d>: not a regular file `%s', "
- "using default configuration", getpid (), 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 ("VCL<%d>: configured heapsize %s, "
- "actual heapsize %lld (0x%llx)",
- getpid (), 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);
- if (vcl_cfg->vpp_api_filename)
- vec_free (vcl_cfg->vpp_api_filename);
- vcl_cfg->vpp_api_filename = format (0, "/%s-vpe-api%c",
- chroot_path, 0);
- vl_set_memory_root_path ((char *) chroot_path);
-
- if (VPPCOM_DEBUG > 0)
- clib_warning ("VCL<%d>: configured api-prefix (%s) and "
- "api filename (%s)", getpid (), chroot_path,
- vcl_cfg->vpp_api_filename);
- chroot_path = 0; /* Don't vec_free() it! */
- }
- else if (unformat (line_input, "vpp-api-q-length %d", &q_len))
- {
- if (q_len < vcl_cfg->vpp_api_q_length)
- {
- clib_warning ("VCL<%d>: ERROR: configured vpp-api-q-length "
- "(%u) is too small! Using default: %u ",
- getpid (), q_len, vcl_cfg->vpp_api_q_length);
- }
- else
- {
- vcl_cfg->vpp_api_q_length = q_len;
-
- if (VPPCOM_DEBUG > 0)
- clib_warning ("VCL<%d>: configured vpp-api-q-length %u",
- getpid (), vcl_cfg->vpp_api_q_length);
- }
- }
- else if (unformat (line_input, "uid %d", &uid))
- {
- vl_set_memory_uid (uid);
- if (VPPCOM_DEBUG > 0)
- clib_warning ("VCL<%d>: configured uid %d", getpid (), uid);
- }
- else if (unformat (line_input, "gid %d", &gid))
- {
- vl_set_memory_gid (gid);
- if (VPPCOM_DEBUG > 0)
- clib_warning ("VCL<%d>: configured gid %d", getpid (), gid);
- }
- else if (unformat (line_input, "segment-baseva 0x%lx",
- &vcl_cfg->segment_baseva))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("VCL<%d>: configured segment_baseva 0x%lx",
- getpid (), vcl_cfg->segment_baseva);
- }
- else if (unformat (line_input, "segment-size 0x%lx",
- &vcl_cfg->segment_size))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("VCL<%d>: configured segment_size 0x%lx (%ld)",
- getpid (), 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 ("VCL<%d>: configured segment_size %ld (0x%lx)",
- getpid (), 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
- ("VCL<%d>: configured add_segment_size 0x%lx (%ld)",
- getpid (), 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
- ("VCL<%d>: configured add_segment_size %ld (0x%lx)",
- getpid (), 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 ("VCL<%d>: configured preallocated_fifo_pairs "
- "%d (0x%x)", getpid (),
- 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 ("VCL<%d>: configured rx_fifo_size 0x%lx (%ld)",
- getpid (), 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 ("VCL<%d>: configured rx_fifo_size %ld (0x%lx)",
- getpid (), 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 ("VCL<%d>: configured tx_fifo_size 0x%lx (%ld)",
- getpid (), 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 ("VCL<%d>: configured tx_fifo_size %ld (0x%lx)",
- getpid (), 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 ("VCL<%d>: configured event_queue_size "
- "0x%lx (%ld)",
- getpid (), 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 ("VCL<%d>: configured event_queue_size "
- "%ld (0x%lx)",
- getpid (), 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 ("VCL<%d>: configured listen_queue_size "
- "0x%lx (%ld)",
- getpid (), 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 ("VCL<%d>: configured listen_queue_size "
- "%ld (0x%lx)",
- getpid (), 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 ("VCL<%d>: configured app_timeout %f",
- getpid (), vcl_cfg->app_timeout);
- }
- else if (unformat (line_input, "session-timeout %f",
- &vcl_cfg->session_timeout))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("VCL<%d>: configured session_timeout %f",
- getpid (), vcl_cfg->session_timeout);
- }
- else if (unformat (line_input, "accept-timeout %f",
- &vcl_cfg->accept_timeout))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning ("VCL<%d>: configured accept_timeout %f",
- getpid (), 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 ("VCL<%d>: configured "
- "app_proxy_transport_tcp (%d)",
- getpid (), 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 ("VCL<%d>: configured "
- "app_proxy_transport_udp (%d)",
- getpid (), 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 ("VCL<%d>: configured app_scope_local (%d)",
- getpid (), 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 ("VCL<%d>: configured app_scope_global (%d)",
- getpid (), vcl_cfg->app_scope_global);
- }
- else if (unformat (line_input, "namespace-secret %lu",
- &vcl_cfg->namespace_secret))
- {
- if (VPPCOM_DEBUG > 0)
- clib_warning
- ("VCL<%d>: configured namespace_secret %lu (0x%lx)",
- getpid (), 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 ("VCL<%d>: configured namespace_id is "
- "too long, truncated to %d characters!",
- getpid (), max_nsid_vec_len);
- }
-
- if (VPPCOM_DEBUG > 0)
- clib_warning ("VCL<%d>: configured namespace_id %v",
- getpid (), vcl_cfg->namespace_id);
- }
- else if (unformat (line_input, "}"))
- {
- vc_cfg_input = 0;
- if (VPPCOM_DEBUG > 0)
- clib_warning ("VCL<%d>: completed parsing vppcom config!",
- getpid ());
- goto input_done;
- }
- else
- {
- if (line_input->buffer[line_input->index] != '#')
- {
- clib_warning ("VCL<%d>: Unknown vppcom config option: '%s'",
- getpid (), (char *)
- &line_input->buffer[line_input->index]);
- }
- }
- }
- }
-
-input_done:
- unformat_free (input);
-
-file_done:
- if (fd >= 0)
- close (fd);