From bdbec30a849807fb5e6841a38cfe0d168e5962b9 Mon Sep 17 00:00:00 2001 From: Stefano Brivio Date: Thu, 21 Dec 2023 12:06:05 +0100 Subject: seitan: Add netlink, sendto()/sendmsg(), iovec handling, demo with routes A bit rough at the moment, but it does the trick. Bonus: setsockopt() (with magic values only, not used in any demo yet). Signed-off-by: Stefano Brivio --- cooker/emit.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) (limited to 'cooker/emit.c') diff --git a/cooker/emit.c b/cooker/emit.c index efe70eb..7899fa5 100644 --- a/cooker/emit.c +++ b/cooker/emit.c @@ -119,7 +119,7 @@ void emit_call(struct gluten_ctx *g, struct context_desc *cdesc, long nr, memcpy(desc->args, offset, sizeof(struct gluten_offset) * count); desc->args[count] = ret_offset; - debug(" %i: OP_CALL: %s, arguments:", g->ip.offset, syscall_name_str[nr]); + debug(" %i: OP_CALL: %s, arguments:", g->ip.offset, syscall_name(nr)); for (i = 0; i < count; i++) { debug("\t%i: %s %s%i", i, gluten_offset_name[offset[i].type], is_ptr[i] ? "*" : "", offset[i].offset); @@ -179,6 +179,42 @@ void emit_store(struct gluten_ctx *g, struct gluten_offset dst, die("Too many instructions"); } +/** + * emit_iovload() - Emit OP_IOVLOAD instruction: IO vector from loaded pointers + * @g: gluten context + * @iov: Pointer to msg_iov, already stored in gluten + * @iovlen: Pointer to msg_iovlen, already stored in gluten + * @dst: gluten destination to copy dereferenced data + * @len: Maximum length of data to copy altogether + */ +struct gluten_offset emit_iovload(struct gluten_ctx *g, + struct gluten_offset iov, + struct gluten_offset iovlen, + size_t len) +{ + struct op *op = (struct op *)gluten_ptr(&g->g, g->ip); + struct op_iovload *load = &op->op.iovload; + struct gluten_offset dst; + + dst = gluten_rw_alloc(g, len); + + op->type = OP_IOVLOAD; + + load->iov = iov; + load->iovlen = iovlen; + + load->dst = dst; + load->size = len; + + debug(" %i: OP_IOVLOAD: #%i < (#%i) as iovec (size: %lu)", + g->ip.offset, dst.offset, iov.offset, len); + + if (++g->ip.offset > INST_MAX) + die("Too many instructions"); + + return dst; +} + /** * emit_resolved() - Emit OP_RESOLVEFD instruction: resolve file descriptor with path * @g: gluten context -- cgit v1.2.3