/* for all pending requests */
list_for_every_entry_safe(&hwrng_req_list, ctx, temp, struct hwrng_chan_ctx,
node) { if (ctx->send_blocked) continue; /* cant service it rignt now */
size_t len = ctx->req_size;
if (len > MAX_HWRNG_MSG_SIZE)
len = MAX_HWRNG_MSG_SIZE;
/* get rng data */
hwrng_dev_get_rng_data(rng_data, len);
/* send reply */ int rc = tipc_send_single_buf(ctx->chan, rng_data, len); if (rc < 0) { if (rc == ERR_NOT_ENOUGH_BUFFER) { /* mark it as send_blocked */
ctx->send_blocked = true;
} else { /* just close HWRNG request channel */
TLOGE("failed (%d) to send_reply\n", rc);
hwrng_close_chan(ctx);
} continue;
}
ctx->req_size -= len;
if (ctx->req_size == 0) { /* remove it from pending list */
list_delete(&ctx->node);
} else {
need_more = true;
}
}
/* read request */
rc = tipc_recv_single_buf(ctx->chan, &req, sizeof(req)); if (rc != sizeof(req)) {
TLOGE("failed (%d) to receive msg for chan %d\n", rc, ctx->chan); return rc;
}
/* check if we already have request in progress */ if (list_in_list(&ctx->node)) { /* extend it */
ctx->req_size += req.len;
} else { /* queue it */
ctx->req_size = req.len;
list_add_tail(&hwrng_req_list, &ctx->node);
}
if (ev->event & IPC_HANDLE_POLL_READY) {
handle_t chan;
/* incoming connection: accept it */ int rc = accept(ev->handle, &peer_uuid); if (rc < 0) {
TLOGE("failed (%d) to accept on port %d\n", rc, ev->handle); return;
}
chan = (handle_t)rc;
/* allocate state */ struct hwrng_chan_ctx* ctx = calloc(1, sizeof(*ctx)); if (!ctx) {
TLOGE("failed to alloc state for chan %d\n", chan);
close(chan); return;
}
/* attach channel handler */
rc = set_cookie(chan, &ctx->evt_handler); if (rc) {
TLOGE("failed (%d) to set_cookie on chan %d\n", rc, chan);
free(ctx);
close(chan); return;
}
}
}
/* *InitializeHWRNGservices
*/ int hwrng_start_service(void) { int rc;
TLOGD("Start HWRNG service\n");
/* create HWRNG port */
rc = port_create(HWRNG_SRV_NAME, 1, MAX_HWRNG_MSG_SIZE,
IPC_PORT_ALLOW_TA_CONNECT); if (rc < 0) {
TLOGE("Failed (%d) to create port '%s'\n", rc, HWRNG_SRV_NAME); return rc;
} else {
hwrng_port = (handle_t)rc;
set_cookie(hwrng_port, &hwrng_port_evt_handler);
}
return NO_ERROR;
}
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.10Bemerkung:
(vorverarbeitet am 2026-09-27)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.