return spoe_appctx->agent;
}
-static int spoe_wakeup_appctx(struct appctx *appctx)
-{
- applet_will_consume(appctx);
- applet_have_more_data(appctx);
- appctx_wakeup(appctx);
- return 1;
-}
-
static int spoe_init_appctx(struct appctx *appctx)
{
struct spoe_appctx *spoe_appctx = SPOE_APPCTX(appctx);
static int spoe_handle_receiving_frame_appctx(struct appctx *appctx)
{
- struct channel *oc = sc_oc(appctx_sc(appctx));
struct spoe_appctx *spoe_appctx = SPOE_APPCTX(appctx);
struct spoe_context *spoe_ctx = spoe_appctx->spoe_ctx;
- int ret = 0;
+ int ret = 0;
- if (!c_data(oc) || c_data(oc) != co_data(oc))
- goto end;
- if (!spoe_acquire_buffer(&spoe_ctx->buffer, &spoe_ctx->buffer_wait))
+ BUG_ON(b_data(&spoe_ctx->buffer));
+
+ if (!b_data(&appctx->inbuf)) {
+ applet_need_more_data(appctx);
goto end;
- if (co_data(oc) > spoe_appctx->agent->max_frame_size) {
- spoe_appctx->status_code = SPOP_ERR_TOO_BIG;
- goto exit;
}
- ret = co_getblk(oc, b_head(&spoe_ctx->buffer), co_data(oc), 0);
- switch (ret) {
- case -1: /* error */
- spoe_release_buffer(&spoe_ctx->buffer, &spoe_ctx->buffer_wait);
- spoe_ctx->state = SPOE_CTX_ST_ERROR;
- spoe_ctx->status_code = (spoe_appctx->status_code + 0x100);
- goto exit;
-
- case 0: /* retry */
- goto end;
-
- default:
- b_set_data(&spoe_ctx->buffer, ret);
- spoe_ctx->state = SPOE_CTX_ST_DONE;
- goto exit;
+ if (b_data(&appctx->inbuf) > spoe_appctx->agent->max_frame_size) {
+ spoe_ctx->state = SPOE_CTX_ST_ERROR;
+ spoe_ctx->status_code = (spoe_appctx->status_code + 0x100);
+ spoe_ctx->spoe_appctx = NULL;
+ spoe_appctx->spoe_ctx = NULL;
+ spoe_appctx->status_code = SPOP_ERR_TOO_BIG;
+ appctx->st0 = SPOE_APPCTX_ST_EXIT;
+ task_wakeup(spoe_ctx->strm->task, TASK_WOKEN_MSG);
+ ret = -1;
+ goto end;
}
- out:
- /* Do not forget to remove processed frame from the output buffer */
- co_skip(oc, co_data(oc));
+ b_xfer(&spoe_ctx->buffer, &appctx->inbuf, b_data(&appctx->inbuf));
+ spoe_ctx->state = SPOE_CTX_ST_DONE;
+ appctx->st0 = SPOE_APPCTX_ST_EXIT;
+ task_wakeup(spoe_ctx->strm->task, TASK_WOKEN_MSG);
+ ret = 1;
end:
return ret;
-
- exit:
- spoe_ctx->spoe_appctx = NULL;
- spoe_appctx->spoe_ctx = NULL;
- task_wakeup(spoe_ctx->strm->task, TASK_WOKEN_MSG);
- appctx->st0 = SPOE_APPCTX_ST_EXIT;
- ret = 1;
- goto out;
}
/* I/O Handler processing messages exchanged with the agent */
static void spoe_handle_appctx(struct appctx *appctx)
{
- struct channel *oc = sc_oc(appctx_sc(appctx));
-
if (SPOE_APPCTX(appctx) == NULL)
- return;
+ goto out;
+
+ if (applet_fl_test(appctx, APPCTX_FL_INBLK_ALLOC))
+ goto out;
+
+ if (!appctx_get_buf(appctx, &appctx->inbuf))
+ goto out;
if (unlikely(se_fl_test(appctx->sedesc, (SE_FL_EOS|SE_FL_ERROR)))) {
- co_skip(oc, co_data(oc));
- return;
+ b_reset(&appctx->inbuf);
+ applet_fl_clr(appctx, APPCTX_FL_INBLK_FULL);
+ goto out;
}
if (!SPOE_APPCTX(appctx)->spoe_ctx)
__fallthrough;
case SPOE_APPCTX_ST_END:
- co_skip(oc, co_data(oc));
+ b_reset(&appctx->inbuf);
+ applet_fl_clr(appctx, APPCTX_FL_INBLK_FULL);
break;
}
+
+ out:
+ applet_have_no_more_data(appctx);
+ return;
}
struct applet spoe_applet = {
.fct = spoe_handle_appctx,
.init = spoe_init_appctx,
.shut = spoe_shut_appctx,
+ .rcv_buf = appctx_raw_rcv_buf,
+ .snd_buf = appctx_raw_snd_buf,
.release = spoe_release_appctx,
};
if (sa->status_code == SPOP_ERR_NONE)
sa->status_code = spoe_ctx_err_to_spop_err(ctx->status_code);
sa->spoe_ctx = NULL;
- spoe_wakeup_appctx(sa->owner);
+ appctx_wakeup(sa->owner);
}
/* Reset the flag to allow next processing */
if (ctx->state == SPOE_CTX_ST_SENDING_MSGS) {
if (ctx->spoe_appctx)
- spoe_wakeup_appctx(ctx->spoe_appctx->owner);
+ appctx_wakeup(ctx->spoe_appctx->owner);
ret = 0;
goto out;
}