diff options
Diffstat (limited to 'code/ecp/fe310/transport.c')
-rw-r--r-- | code/ecp/fe310/transport.c | 46 |
1 files changed, 37 insertions, 9 deletions
diff --git a/code/ecp/fe310/transport.c b/code/ecp/fe310/transport.c index b833ee3..9ff04ca 100644 --- a/code/ecp/fe310/transport.c +++ b/code/ecp/fe310/transport.c @@ -1,10 +1,10 @@ #include <stddef.h> #include <string.h> -#include <core.h> +#include <eos/eos.h> +#include <eos/net.h> -#include "eos.h" -#include "net.h" +#include <core.h> static int t_addr_eq(ECPNetAddr *addr1, ECPNetAddr *addr2) { if (addr1->port != addr2->port) return 0; @@ -20,27 +20,55 @@ static int t_open(int *sock, void *addr_s) { static void t_close(int *sock) { } -static ssize_t t_send(int *sock, void *msg, size_t msg_size, ECPNetAddr *addr) { - unsigned char *buf = msg; +static ssize_t t_send(int *sock, ECPBuffer *packet, size_t msg_size, ECPNetAddr *addr, unsigned char flags) { + unsigned char *buf = NULL; size_t addr_len = sizeof(addr->host) + sizeof(addr->port); uint16_t buf_size = msg_size + addr_len; + unsigned char cmd = EOS_NET_CMD_PKT; int rv; - buf -= addr_len; + if (flags & ECP_SEND_FLAG_MORE) { + cmd |= EOS_NET_CMD_FLAG_ONEW; + } + if (flags & ECP_SEND_FLAG_REPLY) { + if (packet && packet->buffer) buf = packet->buffer-addr_len; + } else { + buf = eos_net_alloc(); + } + if (buf == NULL) return ECP_ERR; memcpy(buf, addr->host, sizeof(addr->host)); memcpy(buf+sizeof(addr->host), &addr->port, sizeof(addr->port)); - rv = eos_net_send(EOS_NET_CMD_PKT, buf, buf_size); + rv = eos_net_send(cmd, buf, buf_size); if (rv) return ECP_ERR_SEND; return msg_size; } +static void t_buf_free(ECP2Buffer *b, unsigned char flags) { + size_t addr_len = ECP_IPv4_ADDR_SIZE + sizeof(uint16_t); + if (b && b->packet && b->packet->buffer) eos_net_free(b->packet->buffer-addr_len, flags & ECP_SEND_FLAG_MORE); +} + +static void t_buf_flag_set(ECP2Buffer *b, unsigned char flags) { + size_t addr_len = ECP_IPv4_ADDR_SIZE + sizeof(uint16_t); + if (flags & ECP_SEND_FLAG_MORE) { + if (b && b->packet && b->packet->buffer) eos_net_reserve(b->packet->buffer-addr_len); + } +} + +static void t_buf_flag_clear(ECP2Buffer *b, unsigned char flags) { + if (flags & ECP_SEND_FLAG_MORE) { + eos_net_release(1); + } +} + int ecp_transport_init(ECPTransportIface *t) { t->init = 1; t->open = t_open; t->close = t_close; t->send = t_send; - t->recv = NULL; t->addr_eq = t_addr_eq; - t->addr_set = NULL; + t->buf_free = t_buf_free; + t->buf_flag_set = t_buf_flag_set; + t->buf_flag_clear = t_buf_flag_clear; return ECP_OK; } |