diff options
Diffstat (limited to 'ecp/src/platform/fe310/transport.c')
-rw-r--r-- | ecp/src/platform/fe310/transport.c | 50 |
1 files changed, 27 insertions, 23 deletions
diff --git a/ecp/src/platform/fe310/transport.c b/ecp/src/platform/fe310/transport.c index 1ae0f56..ed33fa0 100644 --- a/ecp/src/platform/fe310/transport.c +++ b/ecp/src/platform/fe310/transport.c @@ -10,31 +10,34 @@ ECPSocket *_ecp_tr_sock = NULL; unsigned char pld_buf[ECP_MAX_PLD]; -static void packet_handler(unsigned char type, unsigned char *buffer, uint16_t len) { - ECPContext *ctx; +static void packet_handler(unsigned char type, unsigned char *buffer, uint16_t buf_len) { ECP2Buffer bufs; ECPBuffer packet; ECPBuffer payload; ecp_tr_addr_t addr; + size_t hdr_size; ssize_t rv; + unsigned char *_packet; + int _rv; + + _rv = eos_sock_recvfrom(buffer, buf_len, &addr, NULL, 0); + if (!_rv) _packet = eos_sock_buf2pkt(buffer, buf_len); + if (_rv || _packet == NULL) { + if (_rv == EOS_SOCK_ERR_CLOSED) _ecp_tr_sock->sock = 0; + eos_net_free(buffer, 0); + return; + } bufs.packet = &packet; bufs.payload = &payload; - packet.buffer = buffer+EOS_SOCK_SIZE_UDP_HDR; - packet.size = EOS_NET_MTU-EOS_SOCK_SIZE_UDP_HDR; + hdr_size = _packet - buffer; + packet.buffer = _packet; + packet.size = EOS_NET_MTU - hdr_size; payload.buffer = pld_buf; payload.size = ECP_MAX_PLD; - if (len < EOS_SOCK_SIZE_UDP_HDR) { - eos_net_free(buffer, 0); - return; - } - - eos_sock_recvfrom(buffer, len, NULL, 0, &addr); - - ctx = _ecp_tr_sock->ctx; - rv = ecp_pkt_handle(_ecp_tr_sock, NULL, &addr, &bufs, len-EOS_SOCK_SIZE_UDP_HDR); + rv = ecp_pkt_handle(_ecp_tr_sock, NULL, &addr, &bufs, buf_len - hdr_size); if (rv < 0) ECP_LOG_ERR(_ecp_tr_sock, "packet_handler: err:%d\n", (int)rv); if (bufs.packet->buffer) { @@ -81,24 +84,25 @@ void ecp_tr_close(ECPSocket *sock) { } ssize_t ecp_tr_send(ECPSocket *sock, ECPBuffer *packet, size_t pkt_size, ecp_tr_addr_t *addr, unsigned char flags) { - unsigned char *buf = NULL; + unsigned char *buffer = NULL; int reply; int rv; + if (sock->sock == 0) return ECP_ERR_CLOSED; + reply = 0; if (flags & ECP_SEND_FLAG_REPLY) { if (flags & ECP_SEND_FLAG_MORE) return ECP_ERR; - if (packet->buffer) { - buf = packet->buffer-EOS_SOCK_SIZE_UDP_HDR; - packet->buffer = NULL; - reply = 1; - } + if (packet->buffer == NULL) return ECP_ERR; + buffer = packet->buffer; + packet->buffer = NULL; + reply = 1; } else { - buf = eos_net_alloc(); + rv = eos_sock_pkt_alloc(&buffer, packet->buffer, pkt_size); + if (rv) return ECP_ERR; } - if (buf == NULL) return ECP_ERR_ALLOC; - rv = eos_sock_sendto_async(sock->sock, reply ? NULL : packet->buffer, pkt_size, addr, buf, !!(flags & ECP_SEND_FLAG_MORE)); + rv = eos_sock_sendto_async(sock->sock, addr, buffer, pkt_size, !!(flags & ECP_SEND_FLAG_MORE)); if (rv) return ECP_ERR_SEND; return pkt_size; @@ -110,7 +114,7 @@ ssize_t ecp_tr_recv(ECPSocket *sock, ECPBuffer *packet, ecp_tr_addr_t *addr, int void ecp_tr_release(ECPBuffer *packet, unsigned char more) { if (packet->buffer) { - eos_net_free(packet->buffer-EOS_SOCK_SIZE_UDP_HDR, more); + eos_net_free(eos_sock_pkt2buf(packet->buffer), more); packet->buffer = NULL; } else if (!more) { eos_net_release(); |