From 8a48c58a0b575792196e73795fbc667ca54400b6 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Sun, 5 Apr 2026 07:30:50 +0900 Subject: [PATCH] Add socket_id and port_num strong types to W6300 socket API --- w6300/w6300.cpp | 74 ++++++++++++++++++++++++++++++------------------- w6300/w6300.h | 29 ++++++++++--------- 2 files changed, 61 insertions(+), 42 deletions(-) diff --git a/w6300/w6300.cpp b/w6300/w6300.cpp index 97947ce..8ba4b9f 100644 --- a/w6300/w6300.cpp +++ b/w6300/w6300.cpp @@ -1261,7 +1261,9 @@ uint8_t sock_pack_info[_SOCK_COUNT_] = {0,}; #define CHECK_SOCKDATA() do { if(len == 0) return SOCKERR_DATALEN; } while(0) #define CHECK_IPZERO(addr, addrlen) do { uint16_t ipzero=0; for(uint8_t i=0; i(sid); + uint16_t p = static_cast(port); uint8_t taddr[16]; CHECK_SOCKNUM(); switch (protocol & 0x0F) { @@ -1309,14 +1311,14 @@ int8_t socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag) { break; } } - close(sn); + close(sid); setSn_MR(sn, (protocol | (flag & 0xF0))); setSn_MR2(sn, flag & 0x03); - if (!port) { - port = sock_any_port++; + if (!p) { + p = sock_any_port++; if (sock_any_port == 0xFFF0) sock_any_port = SOCK_ANY_PORT_NUM; } - setSn_PORTR(sn, port); + setSn_PORTR(sn, p); setSn_CR(sn, Sn_CR_OPEN); while (getSn_CR(sn)); sock_io_mode &= ~(1 << sn); @@ -1328,7 +1330,8 @@ int8_t socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag) { return (int8_t)sn; } -int8_t close(uint8_t sn) { +int8_t close(socket_id sid) { + uint8_t sn = static_cast(sid); CHECK_SOCKNUM(); setSn_CR(sn, Sn_CR_CLOSE); while (getSn_CR(sn)); @@ -1341,27 +1344,30 @@ int8_t close(uint8_t sn) { return SOCK_OK; } -int8_t listen(uint8_t sn) { +int8_t listen(socket_id sid) { + uint8_t sn = static_cast(sid); CHECK_SOCKNUM(); CHECK_TCPMODE(); CHECK_SOCKINIT(); setSn_CR(sn, Sn_CR_LISTEN); while (getSn_CR(sn)); while (getSn_SR(sn) != SOCK_LISTEN) { - close(sn); + close(sid); return SOCKERR_SOCKCLOSED; } return SOCK_OK; } -int8_t connect(uint8_t sn, uint8_t * addr, uint16_t port, uint8_t addrlen) { +int8_t connect(socket_id sid, uint8_t * addr, port_num port, uint8_t addrlen) { + uint8_t sn = static_cast(sid); + uint16_t p = static_cast(port); CHECK_SOCKNUM(); CHECK_TCPMODE(); CHECK_SOCKINIT(); CHECK_IPZERO(addr, addrlen); - if (port == 0) return SOCKERR_PORTZERO; + if (p == 0) return SOCKERR_PORTZERO; - setSn_DPORTR(sn, port); + setSn_DPORTR(sn, p); if (addrlen == 16) { if (getSn_MR(sn) & 0x08) { setSn_DIP6R(sn, addr); @@ -1386,7 +1392,8 @@ int8_t connect(uint8_t sn, uint8_t * addr, uint16_t port, uint8_t addrlen) { return SOCK_OK; } -int8_t disconnect(uint8_t sn) { +int8_t disconnect(socket_id sid) { + uint8_t sn = static_cast(sid); CHECK_SOCKNUM(); CHECK_TCPMODE(); if (getSn_SR(sn) != SOCK_CLOSED) { @@ -1396,7 +1403,7 @@ int8_t disconnect(uint8_t sn) { if (sock_io_mode & (1 << sn)) return SOCK_BUSY; while (getSn_SR(sn) != SOCK_CLOSED) { if (getSn_IR(sn) & Sn_IR_TIMEOUT) { - close(sn); + close(sid); return SOCKERR_TIMEOUT; } } @@ -1404,7 +1411,8 @@ int8_t disconnect(uint8_t sn) { return SOCK_OK; } -int32_t send(uint8_t sn, uint8_t * buf, uint16_t len) { +int32_t send(socket_id sid, uint8_t * buf, uint16_t len) { + uint8_t sn = static_cast(sid); uint8_t tmp = 0; uint16_t freesize = 0; @@ -1414,7 +1422,7 @@ int32_t send(uint8_t sn, uint8_t * buf, uint16_t len) { freesize = (uint16_t)getSn_TX_FSR(sn); tmp = getSn_SR(sn); if ((tmp != SOCK_ESTABLISHED) && (tmp != SOCK_CLOSE_WAIT)) { - if (tmp == SOCK_CLOSED) close(sn); + if (tmp == SOCK_CLOSED) close(sid); return SOCKERR_SOCKSTATUS; } if ((sock_io_mode & (1 << sn)) && (len > freesize)) return SOCK_BUSY; @@ -1425,7 +1433,7 @@ int32_t send(uint8_t sn, uint8_t * buf, uint16_t len) { while (!(getSn_IR(sn) & Sn_IR_SENDOK)) { tmp = getSn_SR(sn); if ((tmp != SOCK_ESTABLISHED) && (tmp != SOCK_CLOSE_WAIT)) { - if ((tmp == SOCK_CLOSED) || (getSn_IR(sn) & Sn_IR_TIMEOUT)) close(sn); + if ((tmp == SOCK_CLOSED) || (getSn_IR(sn) & Sn_IR_TIMEOUT)) close(sid); return SOCKERR_SOCKSTATUS; } if (sock_io_mode & (1 << sn)) return SOCK_BUSY; @@ -1438,7 +1446,8 @@ int32_t send(uint8_t sn, uint8_t * buf, uint16_t len) { return len; } -int32_t recv(uint8_t sn, uint8_t * buf, uint16_t len) { +int32_t recv(socket_id sid, uint8_t * buf, uint16_t len) { + uint8_t sn = static_cast(sid); uint8_t tmp = 0; uint16_t recvsize = 0; @@ -1456,11 +1465,11 @@ int32_t recv(uint8_t sn, uint8_t * buf, uint16_t len) { if (tmp == SOCK_CLOSE_WAIT) { if (recvsize != 0) break; else if (getSn_TX_FSR(sn) == getSn_TxMAX(sn)) { - close(sn); + close(sid); return SOCKERR_SOCKSTATUS; } } else { - close(sn); + close(sid); return SOCKERR_SOCKSTATUS; } } @@ -1475,7 +1484,9 @@ int32_t recv(uint8_t sn, uint8_t * buf, uint16_t len) { return (int32_t)len; } -int32_t sendto(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t port, uint8_t addrlen) { +int32_t sendto(socket_id sid, uint8_t * buf, uint16_t len, uint8_t * addr, port_num port, uint8_t addrlen) { + uint8_t sn = static_cast(sid); + uint16_t p = static_cast(port); uint8_t tmp = 0; uint8_t tcmd = Sn_CR_SEND; uint16_t freesize = 0; @@ -1508,8 +1519,8 @@ int32_t sendto(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t } } if ((tmp & 0x03) == 0x02) { - if (port) { - setSn_DPORTR(sn, port); + if (p) { + setSn_DPORTR(sn, p); } else { return SOCKERR_PORTZERO; } @@ -1539,7 +1550,8 @@ int32_t sendto(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t return (int32_t)len; } -int32_t recvfrom(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t *port, uint8_t *addrlen) { +int32_t recvfrom(socket_id sid, uint8_t * buf, uint16_t len, uint8_t * addr, port_num *port, uint8_t *addrlen) { + uint8_t sn = static_cast(sid); uint8_t mr; uint8_t head[8]; uint16_t pack_len = 0; @@ -1592,7 +1604,7 @@ int32_t recvfrom(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16 sock_remained_size[sn] = head[0]; sock_remained_size[sn] = (sock_remained_size[sn] << 8) + head[1] - 2; if (sock_remained_size[sn] > 1514) { - close(sn); + close(sid); return SOCKFATAL_PACKLEN; } sock_pack_info[sn] = PACK_FIRST; @@ -1624,7 +1636,7 @@ int32_t recvfrom(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16 if ((getSn_MR(sn) & 0x03) == 0x02) { if (port == 0) return SOCKERR_ARG; wiz_recv_data(sn, head, 2); - *port = (((uint16_t)head[0]) << 8) + head[1]; + *port = static_cast((((uint16_t)head[0]) << 8) + head[1]); setSn_CR(sn, Sn_CR_RECV); while (getSn_CR(sn)); } @@ -1642,7 +1654,8 @@ int32_t recvfrom(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16 return (int32_t)pack_len; } -int8_t ctl_socket(uint8_t sn, sock_ctl cstype, void* arg) { +int8_t ctl_socket(socket_id sid, sock_ctl cstype, void* arg) { + uint8_t sn = static_cast(sid); uint8_t tmp = 0; CHECK_SOCKNUM(); tmp = *((uint8_t*)arg); @@ -1688,7 +1701,8 @@ int8_t ctl_socket(uint8_t sn, sock_ctl cstype, void* arg) { return SOCK_OK; } -int8_t set_sockopt(uint8_t sn, sockopt_type sotype, void* arg) { +int8_t set_sockopt(socket_id sid, sockopt_type sotype, void* arg) { + uint8_t sn = static_cast(sid); CHECK_SOCKNUM(); switch (sotype) { case SO_TTL: @@ -1728,7 +1742,8 @@ int8_t set_sockopt(uint8_t sn, sockopt_type sotype, void* arg) { return SOCK_OK; } -int8_t get_sockopt(uint8_t sn, sockopt_type sotype, void* arg) { +int8_t get_sockopt(socket_id sid, sockopt_type sotype, void* arg) { + uint8_t sn = static_cast(sid); CHECK_SOCKNUM(); switch (sotype) { case SO_FLAG: @@ -1792,7 +1807,8 @@ int8_t get_sockopt(uint8_t sn, sockopt_type sotype, void* arg) { return SOCK_OK; } -int16_t peek_socket_msg(uint8_t sn, uint8_t* submsg, uint16_t subsize) { +int16_t peek_socket_msg(socket_id sid, uint8_t* submsg, uint16_t subsize) { + uint8_t sn = static_cast(sid); uint32_t rx_ptr = 0; uint16_t i = 0, sub_idx = 0; if ((getSn_RX_RSR(sn) > 0) && (subsize > 0)) { diff --git a/w6300/w6300.h b/w6300/w6300.h index 24a9fa7..4daccf5 100644 --- a/w6300/w6300.h +++ b/w6300/w6300.h @@ -5,6 +5,9 @@ namespace w6300 { constexpr int SOCK_COUNT = 8; +enum class socket_id : uint8_t {}; +enum class port_num : uint16_t {}; + enum chip_ctl { CW_SYS_LOCK, CW_SYS_UNLOCK, CW_GET_SYSLOCK, CW_RESET_WIZCHIP, CW_INIT_WIZCHIP, @@ -222,12 +225,12 @@ constexpr uint8_t TCPSOCK_SIP = 1 << 0; constexpr uint8_t SOCK_IO_BLOCK = 0; constexpr uint8_t SOCK_IO_NONBLOCK = 1; -int8_t socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag); -int8_t close(uint8_t sn); -int8_t listen(uint8_t sn); -int8_t disconnect(uint8_t sn); -int32_t send(uint8_t sn, uint8_t* buf, uint16_t len); -int32_t recv(uint8_t sn, uint8_t* buf, uint16_t len); +int8_t open_socket(socket_id sn, uint8_t protocol, port_num port, uint8_t flag); +int8_t close(socket_id sn); +int8_t listen(socket_id sn); +int8_t disconnect(socket_id sn); +int32_t send(socket_id sn, uint8_t* buf, uint16_t len); +int32_t recv(socket_id sn, uint8_t* buf, uint16_t len); enum sockint_kind { SIK_CONNECTED = (1 << 0), @@ -269,13 +272,13 @@ enum sockopt_type { SO_PACKINFO }; -int8_t ctl_socket(uint8_t sn, sock_ctl type, void* arg); -int8_t set_sockopt(uint8_t sn, sockopt_type type, void* arg); -int8_t get_sockopt(uint8_t sn, sockopt_type type, void* arg); -int16_t peek_socket_msg(uint8_t sn, uint8_t* submsg, uint16_t subsize); +int8_t ctl_socket(socket_id sn, sock_ctl type, void* arg); +int8_t set_sockopt(socket_id sn, sockopt_type type, void* arg); +int8_t get_sockopt(socket_id sn, sockopt_type type, void* arg); +int16_t peek_socket_msg(socket_id sn, uint8_t* submsg, uint16_t subsize); -int8_t connect(uint8_t sn, uint8_t* addr, uint16_t port, uint8_t addrlen); -int32_t sendto(uint8_t sn, uint8_t* buf, uint16_t len, uint8_t* addr, uint16_t port, uint8_t addrlen); -int32_t recvfrom(uint8_t sn, uint8_t* buf, uint16_t len, uint8_t* addr, uint16_t* port, uint8_t* addrlen); +int8_t connect(socket_id sn, uint8_t* addr, port_num port, uint8_t addrlen); +int32_t sendto(socket_id sn, uint8_t* buf, uint16_t len, uint8_t* addr, port_num port, uint8_t addrlen); +int32_t recvfrom(socket_id sn, uint8_t* buf, uint16_t len, uint8_t* addr, port_num* port, uint8_t* addrlen); } // namespace w6300