diff options
Diffstat (limited to 'fw/fe310/eos/net/sock.c')
| -rw-r--r-- | fw/fe310/eos/net/sock.c | 158 |
1 files changed, 65 insertions, 93 deletions
diff --git a/fw/fe310/eos/net/sock.c b/fw/fe310/eos/net/sock.c index c55b8e8..0c2f07d 100644 --- a/fw/fe310/eos/net/sock.c +++ b/fw/fe310/eos/net/sock.c @@ -10,40 +10,41 @@ static eos_evt_handler_t evt_handler[EOS_SOCK_MAX_SOCK]; -static void sock_handle_msg(unsigned char type, unsigned char *buffer, uint16_t buf_len) { +static void sock_handle_msg(unsigned char type, EOSMessage *msg, uint16_t len) { unsigned char sock; int i; - if ((buffer == NULL) || (buf_len < 2)) { - eos_net_bad_handler(type, buffer, buf_len); + if ((msg == NULL) || (len < 2)) { + eos_net_bad_handler(type, msg, len); return; } - switch(buffer[0]) { + switch(msg->buffer[0]) { case EOS_SOCK_MTYPE_PKT: { - sock = buffer[1]; + sock = msg->buffer[1]; if ((sock == 0) || (sock > EOS_SOCK_MAX_SOCK) || (evt_handler[sock - 1] == NULL)) { - eos_net_bad_handler(type, buffer, buf_len); + eos_net_bad_handler(type, msg, len); return; } - evt_handler[sock - 1](type, buffer, buf_len); + evt_handler[sock - 1](type, msg, len); break; } case EOS_SOCK_MTYPE_CLOSE: { - for (i=1; i<buf_len; i++) { - sock = buffer[i]; + for (i=1; i<len; i++) { + sock = msg->buffer[i]; if ((sock == 0) || (sock > EOS_SOCK_MAX_SOCK) || (evt_handler[sock - 1] == NULL)) { - eos_net_bad_handler(type, buffer, buf_len); - return; + eos_net_bad_handler(type, msg, len); + continue; } - evt_handler[sock - 1](type, buffer, buf_len); + evt_handler[sock - 1](type, msg, len); + evt_handler[sock - 1] = NULL; } break; } default: - eos_net_bad_handler(type, buffer, buf_len); + eos_net_bad_handler(type, msg, len); break; } } @@ -66,85 +67,44 @@ eos_evt_handler_t eos_sock_get_handler(unsigned char sock) { return NULL; } -int eos_sock_open_udp(eos_evt_handler_t handler, unsigned char *buffer) { +int eos_sock_open_udp(eos_evt_handler_t handler, EOSMessage *msg) { unsigned char type; - uint16_t buf_len; - int do_release; + uint16_t len; int rv, sock; - do_release = 0; - if (buffer == NULL) { - buffer = eos_net_alloc(); - do_release = 1; - } + if (msg->size < 2) return EOS_ERR_SIZE; type = EOS_NET_MTYPE_SOCK; - buf_len = 1; - buffer[0] = EOS_SOCK_MTYPE_OPEN_DGRAM; + len = 1; + msg->buffer[0] = EOS_SOCK_MTYPE_OPEN_DGRAM; - rv = eos_net_xchg(&type, buffer, &buf_len); - if (rv) goto sock_open_udp_fin; + rv = eos_net_xchg(&type, msg, &len); + if (rv) return rv; - if (type != EOS_NET_MTYPE_SOCK) { - rv = EOS_ERR_NET; - goto sock_open_udp_fin; - } - if (buf_len < 2) { - rv = EOS_ERR_SIZE; - goto sock_open_udp_fin; - } + if (type != EOS_NET_MTYPE_SOCK) return EOS_ERR_NET; + if (len < 2) return EOS_ERR_SIZE; - sock = buffer[1]; - if ((sock == 0) || (sock > EOS_SOCK_MAX_SOCK)) { - rv = EOS_ERR_NET; - goto sock_open_udp_fin; - } + sock = msg->buffer[1]; + if ((sock == 0) || (sock > EOS_SOCK_MAX_SOCK)) return EOS_ERR_NET; - rv = sock; eos_sock_set_handler(sock, handler); - -sock_open_udp_fin: - if (do_release) eos_net_free(buffer, 1); - return rv; + return sock; } -void eos_sock_close(unsigned char sock, unsigned char *buffer) { - int async; +void eos_sock_close(unsigned char sock, EOSMessage *msg) { + if ((sock == 0) || (sock > EOS_SOCK_MAX_SOCK)) return; + if (msg->size < 2) return; - async = 0; - if (buffer == NULL) { - buffer = eos_net_alloc(); - async = 1; - } - buffer[0] = EOS_SOCK_MTYPE_CLOSE; - buffer[1] = sock; - _eos_net_send(EOS_NET_MTYPE_SOCK, buffer, 2, async, 1); + msg->buffer[0] = EOS_SOCK_MTYPE_CLOSE; + msg->buffer[1] = sock; + eos_net_send_sync(EOS_NET_MTYPE_SOCK, msg, 2); eos_sock_set_handler(sock, NULL); } -int eos_sock_pkt_alloc(unsigned char **buffer, unsigned char *pkt, size_t pkt_len) { - *buffer = NULL; - - if (pkt && (pkt_len + EOS_SOCK_SIZE_UDP_HDR > EOS_NET_SIZE_BUF)) return EOS_ERR_SIZE; - - *buffer = eos_net_alloc(); - *buffer += EOS_SOCK_SIZE_UDP_HDR; - if (pkt) memcpy(*buffer, pkt, pkt_len); - - return EOS_OK; -} - -unsigned char *eos_sock_buf2pkt(unsigned char *buf, uint16_t buf_len) { - if (buf_len < EOS_SOCK_SIZE_UDP_HDR) return NULL; +static void sock_sendto(unsigned char sock, EOSNetAddr *addr, EOSMessage *msg) { + unsigned char *buffer; - return buf + EOS_SOCK_SIZE_UDP_HDR; -} - -unsigned char *eos_sock_pkt2buf(unsigned char *pkt) { - return pkt - EOS_SOCK_SIZE_UDP_HDR; -} - -static void sock_sendto(unsigned char sock, EOSNetAddr *addr, unsigned char *buffer) { + buffer = msg->buffer; buffer[0] = EOS_SOCK_MTYPE_PKT; buffer[1] = sock; buffer += 2; @@ -155,28 +115,24 @@ static void sock_sendto(unsigned char sock, EOSNetAddr *addr, unsigned char *buf buffer += sizeof(addr->port); } -int eos_sock_sendto(unsigned char sock, EOSNetAddr *addr, unsigned char *buffer, uint16_t buf_len, unsigned char more) { - int rv; +int eos_sock_sendto(unsigned char sock, EOSNetAddr *addr, EOSMessage *msg, uint16_t pkt_len) { + if ((sock == 0) || (sock > EOS_SOCK_MAX_SOCK)) return EOS_ERR_NET; - buffer -= EOS_SOCK_SIZE_UDP_HDR; - sock_sendto(sock, addr, buffer); - - rv = eos_net_send(EOS_NET_MTYPE_SOCK, buffer, buf_len + EOS_SOCK_SIZE_UDP_HDR, more); - return rv; + sock_sendto(sock, addr, msg); + return eos_net_send_sync(EOS_NET_MTYPE_SOCK, msg, pkt_len + EOS_SOCK_SIZE_UDP_HDR); } -int eos_sock_sendto_sync(unsigned char sock, EOSNetAddr *addr, unsigned char *buffer, uint16_t buf_len) { - int rv; - - buffer -= EOS_SOCK_SIZE_UDP_HDR; - sock_sendto(sock, addr, buffer); +int eos_sock_sendto_async(unsigned char sock, EOSNetAddr *addr, EOSMessage *msg, uint16_t pkt_len, int more) { + if ((sock == 0) || (sock > EOS_SOCK_MAX_SOCK)) return EOS_ERR_NET; - rv = eos_net_send_sync(EOS_NET_MTYPE_SOCK, buffer, buf_len + EOS_SOCK_SIZE_UDP_HDR); - return rv; + sock_sendto(sock, addr, msg); + return eos_net_send(EOS_NET_MTYPE_SOCK, msg, pkt_len + EOS_SOCK_SIZE_UDP_HDR, more); } -int eos_sock_recvfrom(unsigned char *buffer, uint16_t buf_len, EOSNetAddr *addr, unsigned char *pkt, size_t pkt_size) { - if (buf_len < EOS_SOCK_SIZE_UDP_HDR) return EOS_ERR_SIZE; +int eos_sock_recvfrom(EOSMessage *msg, uint16_t len, EOSNetAddr *addr, unsigned char *pkt, size_t pkt_size) { + char *buffer = msg->buffer; + + if (len < EOS_SOCK_SIZE_UDP_HDR) return EOS_ERR_SIZE; if (buffer[0] == EOS_SOCK_MTYPE_CLOSE) return EOS_SOCK_ERR_CLOSED; if (buffer[0] != EOS_SOCK_MTYPE_PKT) return EOS_ERR_NET; @@ -192,9 +148,25 @@ int eos_sock_recvfrom(unsigned char *buffer, uint16_t buf_len, EOSNetAddr *addr, } buffer += sizeof(addr->port); if (pkt) { - if (pkt_size < buf_len - EOS_SOCK_SIZE_UDP_HDR) return EOS_ERR_SIZE; - memcpy(pkt, buffer, buf_len - EOS_SOCK_SIZE_UDP_HDR); + if (pkt_size < len - EOS_SOCK_SIZE_UDP_HDR) return EOS_ERR_SIZE; + memcpy(pkt, buffer, len - EOS_SOCK_SIZE_UDP_HDR); } return EOS_OK; } + +unsigned char *eos_sock_msg2pkt(EOSMessage *msg, uint16_t *len, uint16_t *pkt_size) { + if (len && (*len < EOS_SOCK_SIZE_UDP_HDR)) return NULL; + if (msg->size < EOS_SOCK_SIZE_UDP_HDR) return NULL; + + if (len && (msg->buffer[0] != EOS_SOCK_MTYPE_PKT)) return NULL; + + if (len) *len -= EOS_SOCK_SIZE_UDP_HDR; + if (pkt_size) *pkt_size = msg->size - EOS_SOCK_SIZE_UDP_HDR; + return msg->buffer + EOS_SOCK_SIZE_UDP_HDR; +} + +void eos_sock_pkt2msg(EOSMessage *msg, unsigned char *pkt, uint16_t pkt_size) { + msg->buffer = pkt - EOS_SOCK_SIZE_UDP_HDR; + msg->size = pkt_size + EOS_SOCK_SIZE_UDP_HDR; +} |
