security communication with openssl and simplify netio
This commit is contained in:
parent
2a7b7c39bb
commit
8f796b3109
20 changed files with 1176 additions and 922 deletions
|
|
@ -18,22 +18,14 @@ vtask_t* vtask_alloc()
|
|||
return task;
|
||||
}
|
||||
|
||||
int vtask_init(vtask_t* task, vtask_func_t entry, endpoint_t* ep)
|
||||
int vtask_init(vtask_t* task, vtask_func_t entry, void* data)
|
||||
{
|
||||
int rc;
|
||||
task->entry = entry;
|
||||
task->vcpu = -1;
|
||||
task->data = data;
|
||||
task->owner = NULL;
|
||||
|
||||
task->entry = entry;
|
||||
task->vcpu = -1;
|
||||
task->ctx.ep = endpoint_ref(ep);
|
||||
|
||||
rc = read_packet(ep->fd, &(task->ctx.pkt));
|
||||
if (rc < 0) {
|
||||
free_packet(&(task->ctx.pkt));
|
||||
endpoint_deref(task->ctx.ep);
|
||||
task->ctx.ep = NULL;
|
||||
}
|
||||
|
||||
return rc;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void vtask_fini(vtask_t* task)
|
||||
|
|
@ -42,7 +34,7 @@ void vtask_fini(vtask_t* task)
|
|||
return;
|
||||
}
|
||||
|
||||
ioctx_deref(&(task->ctx), 0);
|
||||
FREEUP(task->data);
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
@ -59,13 +51,22 @@ void vcpu_idle(vcpu_t* vcpu)
|
|||
|
||||
void run_task(vtask_t* task)
|
||||
{
|
||||
vtaskmgr_t* vtaskmgr;
|
||||
vtaskmgr_t* vtaskmgr;
|
||||
vtask_data_t* data;
|
||||
|
||||
if (task->entry != NULL) {
|
||||
(task->entry)(task);
|
||||
}
|
||||
|
||||
endpoint_unblock_tasks(task->ctx.ep);
|
||||
data = task->data;
|
||||
if ((data != NULL) && (data->vtype == VTASK_IO)) {
|
||||
endpoint_t* ep = data->u.iodata.ep;
|
||||
|
||||
if (ep != NULL) {
|
||||
endpoint_unblock_tasks(ep);
|
||||
}
|
||||
}
|
||||
|
||||
vtaskmgr = (vtaskmgr_t*)task->owner;
|
||||
if (vtaskmgr != NULL) {
|
||||
/* wake up dispatcher */
|
||||
|
|
@ -201,15 +202,21 @@ static vcpu_t* pick_idle_vcpu(vtaskmgr_t* vtaskmgr)
|
|||
|
||||
static int vtask_eligible(data_item_t* data)
|
||||
{
|
||||
vtask_t* task = ITPTR_TO_VTASK(data);
|
||||
int eligible = 0;
|
||||
vtask_t* task = ITPTR_TO_VTASK(data);
|
||||
int eligible = 0;
|
||||
vtask_data_t* vdata;
|
||||
|
||||
if (task->ctx.ep == NULL) {
|
||||
vdata = task->data;
|
||||
if ((vdata == NULL) || (vdata->vtype != VTASK_IO)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (vdata->u.iodata.ep == NULL) {
|
||||
WARN("no endpoint for task 0x%p", task);
|
||||
return 0;
|
||||
}
|
||||
|
||||
eligible = !(endpoint_is_task_blocked(task->ctx.ep));
|
||||
eligible = !(endpoint_is_task_blocked(vdata->u.iodata.ep));
|
||||
TRACE("%s vtask %p is %s", __func__, task,
|
||||
eligible ? "eligible" : "not eligible");
|
||||
|
||||
|
|
@ -236,7 +243,11 @@ static int bind_vtask(vtask_t* task, vcpu_t* vcpu)
|
|||
TRACE("binding task %p to cpu#%d\n", task, vcpu->cpuid);
|
||||
|
||||
if (task != NULL) {
|
||||
endpoint_block_tasks(task->ctx.ep);
|
||||
vtask_data_t* data = (vtask_data_t*)task->data;
|
||||
|
||||
if ((data->vtype == VTASK_IO) && (data->u.iodata.ep != NULL)) {
|
||||
endpoint_block_tasks(data->u.iodata.ep);
|
||||
}
|
||||
|
||||
task->vcpu = vcpu->cpuid;
|
||||
}
|
||||
|
|
@ -331,9 +342,8 @@ void vtaskmgr_fini(vtaskmgr_t* vtaskmgr)
|
|||
int vtask_enq(vtaskmgr_t* vtaskmgr, vtask_t* task)
|
||||
{
|
||||
int rc = 0;
|
||||
ioctx_ref(&(task->ctx));
|
||||
|
||||
rc = dataq_enq(&(vtaskmgr->taskq), &(task->ctx.link));
|
||||
rc = dataq_enq(&(vtaskmgr->taskq), &(task->link));
|
||||
if (rc >= 0) {
|
||||
/* wake up task dispatcher */
|
||||
task->owner = vtaskmgr;
|
||||
|
|
@ -342,3 +352,37 @@ int vtask_enq(vtaskmgr_t* vtaskmgr, vtask_t* task)
|
|||
|
||||
return rc;
|
||||
}
|
||||
|
||||
int vtask_handle_msg(vtaskmgr_t* mgr, vtask_func_t entry, void* arg)
|
||||
{
|
||||
endpoint_t* ep = (endpoint_t*)arg;
|
||||
vtask_data_t* data;
|
||||
vtask_t* task;
|
||||
|
||||
if (ep == NULL) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if ((ep->fsm_in.state != FSM_STATE_DONE) || (ep->fsm_in.pkt == NULL)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
data = (vtask_data_t*)calloc(1, sizeof(*data));
|
||||
if (data == NULL) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
task = (vtask_t*)calloc(1, sizeof(*task));
|
||||
if (task == NULL) {
|
||||
free(data);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
data->vtype = VTASK_IO;
|
||||
data->u.iodata.ep = ep;
|
||||
data->u.iodata.pkt = ep->fsm_in.pkt;
|
||||
|
||||
vtask_init(task, entry, data);
|
||||
|
||||
return vtask_enq(mgr, task);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue