Add socket_id and port_num strong types to W6300 socket API
This commit is contained in:
@@ -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_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<addrlen; i++) ipzero += (uint16_t)addr[i]; if(ipzero == 0) return SOCKERR_IPINVALID; } while(0)
|
#define CHECK_IPZERO(addr, addrlen) do { uint16_t ipzero=0; for(uint8_t i=0; i<addrlen; i++) ipzero += (uint16_t)addr[i]; if(ipzero == 0) return SOCKERR_IPINVALID; } while(0)
|
||||||
|
|
||||||
int8_t socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag) {
|
int8_t open_socket(socket_id sid, uint8_t protocol, port_num port, uint8_t flag) {
|
||||||
|
uint8_t sn = static_cast<uint8_t>(sid);
|
||||||
|
uint16_t p = static_cast<uint16_t>(port);
|
||||||
uint8_t taddr[16];
|
uint8_t taddr[16];
|
||||||
CHECK_SOCKNUM();
|
CHECK_SOCKNUM();
|
||||||
switch (protocol & 0x0F) {
|
switch (protocol & 0x0F) {
|
||||||
@@ -1309,14 +1311,14 @@ int8_t socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
close(sn);
|
close(sid);
|
||||||
setSn_MR(sn, (protocol | (flag & 0xF0)));
|
setSn_MR(sn, (protocol | (flag & 0xF0)));
|
||||||
setSn_MR2(sn, flag & 0x03);
|
setSn_MR2(sn, flag & 0x03);
|
||||||
if (!port) {
|
if (!p) {
|
||||||
port = sock_any_port++;
|
p = sock_any_port++;
|
||||||
if (sock_any_port == 0xFFF0) sock_any_port = SOCK_ANY_PORT_NUM;
|
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);
|
setSn_CR(sn, Sn_CR_OPEN);
|
||||||
while (getSn_CR(sn));
|
while (getSn_CR(sn));
|
||||||
sock_io_mode &= ~(1 << 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;
|
return (int8_t)sn;
|
||||||
}
|
}
|
||||||
|
|
||||||
int8_t close(uint8_t sn) {
|
int8_t close(socket_id sid) {
|
||||||
|
uint8_t sn = static_cast<uint8_t>(sid);
|
||||||
CHECK_SOCKNUM();
|
CHECK_SOCKNUM();
|
||||||
setSn_CR(sn, Sn_CR_CLOSE);
|
setSn_CR(sn, Sn_CR_CLOSE);
|
||||||
while (getSn_CR(sn));
|
while (getSn_CR(sn));
|
||||||
@@ -1341,27 +1344,30 @@ int8_t close(uint8_t sn) {
|
|||||||
return SOCK_OK;
|
return SOCK_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int8_t listen(uint8_t sn) {
|
int8_t listen(socket_id sid) {
|
||||||
|
uint8_t sn = static_cast<uint8_t>(sid);
|
||||||
CHECK_SOCKNUM();
|
CHECK_SOCKNUM();
|
||||||
CHECK_TCPMODE();
|
CHECK_TCPMODE();
|
||||||
CHECK_SOCKINIT();
|
CHECK_SOCKINIT();
|
||||||
setSn_CR(sn, Sn_CR_LISTEN);
|
setSn_CR(sn, Sn_CR_LISTEN);
|
||||||
while (getSn_CR(sn));
|
while (getSn_CR(sn));
|
||||||
while (getSn_SR(sn) != SOCK_LISTEN) {
|
while (getSn_SR(sn) != SOCK_LISTEN) {
|
||||||
close(sn);
|
close(sid);
|
||||||
return SOCKERR_SOCKCLOSED;
|
return SOCKERR_SOCKCLOSED;
|
||||||
}
|
}
|
||||||
return SOCK_OK;
|
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<uint8_t>(sid);
|
||||||
|
uint16_t p = static_cast<uint16_t>(port);
|
||||||
CHECK_SOCKNUM();
|
CHECK_SOCKNUM();
|
||||||
CHECK_TCPMODE();
|
CHECK_TCPMODE();
|
||||||
CHECK_SOCKINIT();
|
CHECK_SOCKINIT();
|
||||||
CHECK_IPZERO(addr, addrlen);
|
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 (addrlen == 16) {
|
||||||
if (getSn_MR(sn) & 0x08) {
|
if (getSn_MR(sn) & 0x08) {
|
||||||
setSn_DIP6R(sn, addr);
|
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;
|
return SOCK_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int8_t disconnect(uint8_t sn) {
|
int8_t disconnect(socket_id sid) {
|
||||||
|
uint8_t sn = static_cast<uint8_t>(sid);
|
||||||
CHECK_SOCKNUM();
|
CHECK_SOCKNUM();
|
||||||
CHECK_TCPMODE();
|
CHECK_TCPMODE();
|
||||||
if (getSn_SR(sn) != SOCK_CLOSED) {
|
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;
|
if (sock_io_mode & (1 << sn)) return SOCK_BUSY;
|
||||||
while (getSn_SR(sn) != SOCK_CLOSED) {
|
while (getSn_SR(sn) != SOCK_CLOSED) {
|
||||||
if (getSn_IR(sn) & Sn_IR_TIMEOUT) {
|
if (getSn_IR(sn) & Sn_IR_TIMEOUT) {
|
||||||
close(sn);
|
close(sid);
|
||||||
return SOCKERR_TIMEOUT;
|
return SOCKERR_TIMEOUT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1404,7 +1411,8 @@ int8_t disconnect(uint8_t sn) {
|
|||||||
return SOCK_OK;
|
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<uint8_t>(sid);
|
||||||
uint8_t tmp = 0;
|
uint8_t tmp = 0;
|
||||||
uint16_t freesize = 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);
|
freesize = (uint16_t)getSn_TX_FSR(sn);
|
||||||
tmp = getSn_SR(sn);
|
tmp = getSn_SR(sn);
|
||||||
if ((tmp != SOCK_ESTABLISHED) && (tmp != SOCK_CLOSE_WAIT)) {
|
if ((tmp != SOCK_ESTABLISHED) && (tmp != SOCK_CLOSE_WAIT)) {
|
||||||
if (tmp == SOCK_CLOSED) close(sn);
|
if (tmp == SOCK_CLOSED) close(sid);
|
||||||
return SOCKERR_SOCKSTATUS;
|
return SOCKERR_SOCKSTATUS;
|
||||||
}
|
}
|
||||||
if ((sock_io_mode & (1 << sn)) && (len > freesize)) return SOCK_BUSY;
|
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)) {
|
while (!(getSn_IR(sn) & Sn_IR_SENDOK)) {
|
||||||
tmp = getSn_SR(sn);
|
tmp = getSn_SR(sn);
|
||||||
if ((tmp != SOCK_ESTABLISHED) && (tmp != SOCK_CLOSE_WAIT)) {
|
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;
|
return SOCKERR_SOCKSTATUS;
|
||||||
}
|
}
|
||||||
if (sock_io_mode & (1 << sn)) return SOCK_BUSY;
|
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;
|
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<uint8_t>(sid);
|
||||||
uint8_t tmp = 0;
|
uint8_t tmp = 0;
|
||||||
uint16_t recvsize = 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 (tmp == SOCK_CLOSE_WAIT) {
|
||||||
if (recvsize != 0) break;
|
if (recvsize != 0) break;
|
||||||
else if (getSn_TX_FSR(sn) == getSn_TxMAX(sn)) {
|
else if (getSn_TX_FSR(sn) == getSn_TxMAX(sn)) {
|
||||||
close(sn);
|
close(sid);
|
||||||
return SOCKERR_SOCKSTATUS;
|
return SOCKERR_SOCKSTATUS;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
close(sn);
|
close(sid);
|
||||||
return SOCKERR_SOCKSTATUS;
|
return SOCKERR_SOCKSTATUS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1475,7 +1484,9 @@ int32_t recv(uint8_t sn, uint8_t * buf, uint16_t len) {
|
|||||||
return (int32_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<uint8_t>(sid);
|
||||||
|
uint16_t p = static_cast<uint16_t>(port);
|
||||||
uint8_t tmp = 0;
|
uint8_t tmp = 0;
|
||||||
uint8_t tcmd = Sn_CR_SEND;
|
uint8_t tcmd = Sn_CR_SEND;
|
||||||
uint16_t freesize = 0;
|
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 ((tmp & 0x03) == 0x02) {
|
||||||
if (port) {
|
if (p) {
|
||||||
setSn_DPORTR(sn, port);
|
setSn_DPORTR(sn, p);
|
||||||
} else {
|
} else {
|
||||||
return SOCKERR_PORTZERO;
|
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;
|
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<uint8_t>(sid);
|
||||||
uint8_t mr;
|
uint8_t mr;
|
||||||
uint8_t head[8];
|
uint8_t head[8];
|
||||||
uint16_t pack_len = 0;
|
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] = head[0];
|
||||||
sock_remained_size[sn] = (sock_remained_size[sn] << 8) + head[1] - 2;
|
sock_remained_size[sn] = (sock_remained_size[sn] << 8) + head[1] - 2;
|
||||||
if (sock_remained_size[sn] > 1514) {
|
if (sock_remained_size[sn] > 1514) {
|
||||||
close(sn);
|
close(sid);
|
||||||
return SOCKFATAL_PACKLEN;
|
return SOCKFATAL_PACKLEN;
|
||||||
}
|
}
|
||||||
sock_pack_info[sn] = PACK_FIRST;
|
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 ((getSn_MR(sn) & 0x03) == 0x02) {
|
||||||
if (port == 0) return SOCKERR_ARG;
|
if (port == 0) return SOCKERR_ARG;
|
||||||
wiz_recv_data(sn, head, 2);
|
wiz_recv_data(sn, head, 2);
|
||||||
*port = (((uint16_t)head[0]) << 8) + head[1];
|
*port = static_cast<port_num>((((uint16_t)head[0]) << 8) + head[1]);
|
||||||
setSn_CR(sn, Sn_CR_RECV);
|
setSn_CR(sn, Sn_CR_RECV);
|
||||||
while (getSn_CR(sn));
|
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;
|
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<uint8_t>(sid);
|
||||||
uint8_t tmp = 0;
|
uint8_t tmp = 0;
|
||||||
CHECK_SOCKNUM();
|
CHECK_SOCKNUM();
|
||||||
tmp = *((uint8_t*)arg);
|
tmp = *((uint8_t*)arg);
|
||||||
@@ -1688,7 +1701,8 @@ int8_t ctl_socket(uint8_t sn, sock_ctl cstype, void* arg) {
|
|||||||
return SOCK_OK;
|
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<uint8_t>(sid);
|
||||||
CHECK_SOCKNUM();
|
CHECK_SOCKNUM();
|
||||||
switch (sotype) {
|
switch (sotype) {
|
||||||
case SO_TTL:
|
case SO_TTL:
|
||||||
@@ -1728,7 +1742,8 @@ int8_t set_sockopt(uint8_t sn, sockopt_type sotype, void* arg) {
|
|||||||
return SOCK_OK;
|
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<uint8_t>(sid);
|
||||||
CHECK_SOCKNUM();
|
CHECK_SOCKNUM();
|
||||||
switch (sotype) {
|
switch (sotype) {
|
||||||
case SO_FLAG:
|
case SO_FLAG:
|
||||||
@@ -1792,7 +1807,8 @@ int8_t get_sockopt(uint8_t sn, sockopt_type sotype, void* arg) {
|
|||||||
return SOCK_OK;
|
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<uint8_t>(sid);
|
||||||
uint32_t rx_ptr = 0;
|
uint32_t rx_ptr = 0;
|
||||||
uint16_t i = 0, sub_idx = 0;
|
uint16_t i = 0, sub_idx = 0;
|
||||||
if ((getSn_RX_RSR(sn) > 0) && (subsize > 0)) {
|
if ((getSn_RX_RSR(sn) > 0) && (subsize > 0)) {
|
||||||
|
|||||||
@@ -5,6 +5,9 @@ namespace w6300 {
|
|||||||
|
|
||||||
constexpr int SOCK_COUNT = 8;
|
constexpr int SOCK_COUNT = 8;
|
||||||
|
|
||||||
|
enum class socket_id : uint8_t {};
|
||||||
|
enum class port_num : uint16_t {};
|
||||||
|
|
||||||
enum chip_ctl {
|
enum chip_ctl {
|
||||||
CW_SYS_LOCK, CW_SYS_UNLOCK, CW_GET_SYSLOCK,
|
CW_SYS_LOCK, CW_SYS_UNLOCK, CW_GET_SYSLOCK,
|
||||||
CW_RESET_WIZCHIP, CW_INIT_WIZCHIP,
|
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_BLOCK = 0;
|
||||||
constexpr uint8_t SOCK_IO_NONBLOCK = 1;
|
constexpr uint8_t SOCK_IO_NONBLOCK = 1;
|
||||||
|
|
||||||
int8_t socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag);
|
int8_t open_socket(socket_id sn, uint8_t protocol, port_num port, uint8_t flag);
|
||||||
int8_t close(uint8_t sn);
|
int8_t close(socket_id sn);
|
||||||
int8_t listen(uint8_t sn);
|
int8_t listen(socket_id sn);
|
||||||
int8_t disconnect(uint8_t sn);
|
int8_t disconnect(socket_id sn);
|
||||||
int32_t send(uint8_t sn, uint8_t* buf, uint16_t len);
|
int32_t send(socket_id sn, uint8_t* buf, uint16_t len);
|
||||||
int32_t recv(uint8_t sn, uint8_t* buf, uint16_t len);
|
int32_t recv(socket_id sn, uint8_t* buf, uint16_t len);
|
||||||
|
|
||||||
enum sockint_kind {
|
enum sockint_kind {
|
||||||
SIK_CONNECTED = (1 << 0),
|
SIK_CONNECTED = (1 << 0),
|
||||||
@@ -269,13 +272,13 @@ enum sockopt_type {
|
|||||||
SO_PACKINFO
|
SO_PACKINFO
|
||||||
};
|
};
|
||||||
|
|
||||||
int8_t ctl_socket(uint8_t sn, sock_ctl type, void* arg);
|
int8_t ctl_socket(socket_id sn, sock_ctl type, void* arg);
|
||||||
int8_t set_sockopt(uint8_t sn, sockopt_type type, void* arg);
|
int8_t set_sockopt(socket_id sn, sockopt_type type, void* arg);
|
||||||
int8_t get_sockopt(uint8_t sn, sockopt_type type, void* arg);
|
int8_t get_sockopt(socket_id sn, sockopt_type type, void* arg);
|
||||||
int16_t peek_socket_msg(uint8_t sn, uint8_t* submsg, uint16_t subsize);
|
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);
|
int8_t connect(socket_id sn, uint8_t* addr, port_num 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 sendto(socket_id sn, uint8_t* buf, uint16_t len, uint8_t* addr, port_num 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);
|
int32_t recvfrom(socket_id sn, uint8_t* buf, uint16_t len, uint8_t* addr, port_num* port, uint8_t* addrlen);
|
||||||
|
|
||||||
} // namespace w6300
|
} // namespace w6300
|
||||||
|
|||||||
Reference in New Issue
Block a user