From 55474b81146327e8cfa7702fa9366cc7da6562e7 Mon Sep 17 00:00:00 2001 From: Uros Majstorovic Date: Wed, 30 Mar 2022 13:22:57 +0200 Subject: sock api fixed; net reply messages fixed --- fw/esp32/components/eos/sock.c | 85 +++++++++++++++++++++++++----------------- 1 file changed, 51 insertions(+), 34 deletions(-) (limited to 'fw/esp32/components/eos/sock.c') diff --git a/fw/esp32/components/eos/sock.c b/fw/esp32/components/eos/sock.c index 355d7c7..ec198f0 100644 --- a/fw/esp32/components/eos/sock.c +++ b/fw/esp32/components/eos/sock.c @@ -35,7 +35,7 @@ static int t_open_dgram(void) { memset((char *)&_myaddr, 0, sizeof(_myaddr)); _myaddr.sin_family = AF_INET; _myaddr.sin_addr.s_addr = htonl(INADDR_ANY); - _myaddr.sin_port = htons(3000); + _myaddr.sin_port = htons(0); int rv = bind(sock, (struct sockaddr *)&_myaddr, sizeof(_myaddr)); if (rv < 0) { @@ -54,7 +54,7 @@ static ssize_t t_sendto(int sock, void *msg, size_t msg_size, EOSNetAddr *addr) memset((void *)&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; - servaddr.sin_port = addr->port; + servaddr.sin_port = htons(addr->port); memcpy((void *)&servaddr.sin_addr, addr->host, sizeof(addr->host)); return sendto(sock, msg, msg_size, 0, (struct sockaddr *)&servaddr, sizeof(servaddr)); } @@ -68,85 +68,102 @@ static ssize_t t_recvfrom(int sock, void *msg, size_t msg_size, EOSNetAddr *addr if (recvlen < 0) return recvlen; if (addr) { - addr->port = servaddr.sin_port; + addr->port = ntohs(servaddr.sin_port); memcpy(addr->host, (void *)&servaddr.sin_addr, sizeof(addr->host)); } return recvlen; } static void udp_rcvr_task(void *pvParameters) { - EOSNetAddr addr; - uint8_t esock = (uint8_t)pvParameters; - int sock = _socks[esock-1]; - unsigned char *buf; + uint8_t sock_i = (uint8_t)pvParameters; + int sock = _socks[sock_i-1]; do { + EOSNetAddr addr; + unsigned char *buf, *_buf; ssize_t rv; buf = eos_net_alloc(); rv = t_recvfrom(sock, buf + EOS_SOCK_SIZE_UDP_HDR, EOS_NET_MTU - EOS_SOCK_SIZE_UDP_HDR, &addr); if (rv < 0) { - sock = 0; eos_net_free(buf); ESP_LOGE(TAG, "UDP RECV ERR:%d", rv); - continue; + break; } - buf[0] = EOS_SOCK_MTYPE_PKT; - buf[1] = esock; - memcpy(buf+2, addr.host, sizeof(addr.host)); - memcpy(buf+2+sizeof(addr.host), &addr.port, sizeof(addr.port)); + _buf = buf; + _buf[0] = EOS_SOCK_MTYPE_PKT; + _buf[1] = sock_i; + _buf += 2; + memcpy(_buf, addr.host, sizeof(addr.host)); + _buf += sizeof(addr.host); + _buf[0] = addr.port >> 8; + _buf[1] = addr.port; + _buf += sizeof(addr.port); eos_net_send(EOS_NET_MTYPE_SOCK, buf, rv + EOS_SOCK_SIZE_UDP_HDR); - } while(sock); + } while (1); + xSemaphoreTake(mutex, portMAX_DELAY); - _socks[esock-1] = 0; + _socks[sock_i-1] = 0; xSemaphoreGive(mutex); vTaskDelete(NULL); } -static void sock_handler(unsigned char type, unsigned char *buffer, uint16_t size) { +static void sock_handler(unsigned char type, unsigned char *buffer, uint16_t buf_len) { EOSNetAddr addr; - uint8_t esock; + uint8_t sock_i; int sock, i; - unsigned char *rbuf; - if (size < 1) return; + if (buf_len < 1) return; switch(buffer[0]) { case EOS_SOCK_MTYPE_PKT: - if (size < EOS_SOCK_SIZE_UDP_HDR) return; - sock = _socks[buffer[1] - 1]; - memcpy(addr.host, buffer + 2, sizeof(addr.host)); - memcpy(&addr.port, buffer + 2 + sizeof(addr.host), sizeof(addr.port)); - t_sendto(sock, buffer + EOS_SOCK_SIZE_UDP_HDR, size - EOS_SOCK_SIZE_UDP_HDR, &addr); + if (buf_len < EOS_SOCK_SIZE_UDP_HDR) return; + + sock_i = buffer[1]-1; + if (sock_i >= EOS_SOCK_MAX_SOCK) return; + + sock = _socks[sock_i]; + buffer += 2; + memcpy(addr.host, buffer, sizeof(addr.host)); + buffer += sizeof(addr.host); + addr.port = (uint16_t)buffer[0] << 8; + addr.port |= (uint16_t)buffer[1]; + buffer += sizeof(addr.port); + t_sendto(sock, buffer, buf_len - EOS_SOCK_SIZE_UDP_HDR, &addr); break; case EOS_SOCK_MTYPE_OPEN_DGRAM: sock = t_open_dgram(); - esock = 0; + sock_i = 0; if (sock > 0) { xSemaphoreTake(mutex, portMAX_DELAY); for (i=0; i= EOS_SOCK_MAX_SOCK) return; + + sock = _socks[sock_i]; t_close(sock); break; default: + ESP_LOGE(TAG, "BAD TYPE:%d", buffer[0]); break; } } @@ -156,4 +173,4 @@ void eos_sock_init(void) { xSemaphoreGive(mutex); eos_net_set_handler(EOS_NET_MTYPE_SOCK, sock_handler); ESP_LOGI(TAG, "INIT"); -} \ No newline at end of file +} -- cgit v1.2.3