summaryrefslogtreecommitdiff
path: root/fw/fe310/eos/net/sock.c
diff options
context:
space:
mode:
Diffstat (limited to 'fw/fe310/eos/net/sock.c')
-rw-r--r--fw/fe310/eos/net/sock.c158
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;
+}