clib_memcpy_fast (&mp->ip, &s->transport.lcl_ip, sizeof (mp->ip));
mp->port = s->transport.lcl_port;
mp->proto = s->session_type;
+ if (s->flags & VCL_SESSION_F_CONNECTED)
+ mp->flags = TRANSPORT_CFG_F_CONNECTED;
app_send_ctrl_evt_to_vpp (mq, app_evt);
}
return;
}
+ if (msg->type == SESSION_CLEANUP_TRANSPORT)
+ {
+ /* Transport was cleaned up before we confirmed close. Probably the
+ * app is still waiting for some data that cannot be delivered.
+ * Confirm close to make sure everything is cleaned up */
+ if (session->session_state == STATE_VPP_CLOSING)
+ vcl_session_cleanup (wrk, session, vcl_session_handle (session),
+ 1 /* do_disconnect */ );
+ return;
+ }
+
vcl_session_table_del_vpp_handle (wrk, msg->handle);
/* Should not happen. App did not close the connection so don't free it. */
if (session->session_state != STATE_CLOSED)
void
vppcom_app_destroy (void)
{
+ vcl_worker_t *wrk, *current_wrk;
struct dlmallinfo mi;
- vcl_worker_t *wrk;
mspace heap;
if (!pool_elts (vcm->workers))
vcl_evt (VCL_EVT_DETACH, vcm);
- vcl_send_app_detach (vcl_worker_get_current ());
+ current_wrk = vcl_worker_get_current ();
/* *INDENT-OFF* */
pool_foreach (wrk, vcm->workers, ({
- if (pool_elts (vcm->workers) == 1)
- vl_client_disconnect_from_vlib ();
- vcl_worker_cleanup (wrk, 0 /* notify vpp */ );
+ if (current_wrk != wrk)
+ vcl_worker_cleanup (wrk, 0 /* notify vpp */ );
}));
/* *INDENT-ON* */
+ vcl_send_app_detach (current_wrk);
+ vppcom_disconnect_from_vpp ();
+ vcl_worker_cleanup (current_wrk, 0 /* notify vpp */ );
+
vcl_elog_stop (vcm);
/*
munmap (mspace_least_addr (heap), mi.arena);
vcm = &_vppcom_main;
+ vcm->is_init = 0;
}
int
*proto = VPPCOM_PROTO_UDP;
else if (!strcmp (proto_str, "udp"))
*proto = VPPCOM_PROTO_UDP;
- else if (!strcmp (proto_str, "UDPC"))
- *proto = VPPCOM_PROTO_UDPC;
- else if (!strcmp (proto_str, "udpc"))
- *proto = VPPCOM_PROTO_UDPC;
else if (!strcmp (proto_str, "TLS"))
*proto = VPPCOM_PROTO_TLS;
else if (!strcmp (proto_str, "tls"))
}
}
ASSERT (maxevents > *num_ev);
- vcl_mq_dequeue_batch (wrk, mq, maxevents - *num_ev);
+ vcl_mq_dequeue_batch (wrk, mq, ~0);
svm_msg_q_unlock (mq);
handle_dequeued:
{
msg = vec_elt_at_index (wrk->mq_msg_vector, i);
e = svm_msg_q_msg_data (mq, msg);
- vcl_epoll_wait_handle_mq_event (wrk, e, events, num_ev);
+ if (*num_ev < maxevents)
+ vcl_epoll_wait_handle_mq_event (wrk, e, events, num_ev);
+ else
+ vcl_handle_mq_event (wrk, e);
svm_msg_q_free_msg (mq, msg);
}
vec_reset_length (wrk->mq_msg_vector);
*(int *) buffer = SHUT_RDWR;
*buflen = sizeof (int);
break;
+
+ case VPPCOM_ATTR_SET_CONNECTED:
+ session->flags |= VCL_SESSION_F_CONNECTED;
+ break;
+
default:
rv = VPPCOM_EINVAL;
break;
vcl_set_worker_index (~0);
}
+void
+vppcom_worker_index_set (int index)
+{
+ vcl_set_worker_index (index);
+}
+
int
vppcom_worker_index (void)
{