20 #include <zephyr/kernel.h>
21 #include <zephyr/net/socket.h>
26 #include <zephyr/net/net_if.h>
27 #include <zephyr/posix/sys/ioctl.h>
32struct net_if* rf24_netif_get_iface(
void);
39RF24Client* RF24Client::g_rf24client_instance =
nullptr;
40int RF24Client::_socket;
41uint32_t RF24Client::serverConnectionTimeout;
42uint8_t RF24Client::peekBuffer[64];
47 #define UIP_TCP_PHYH_LEN UIP_LLH_LEN + UIP_IPTCPH_LEN
48uip_userdata_t RF24Client::all_data[UIP_CONNS];
54 #if !defined ETHERNET_USING_LWIP_ARDUINO
56 #include "lwip/tcpip.h"
57 #include "lwip/timeouts.h"
59 #include "lwip/include/lwip/tcp.h"
60 #include "lwip/include/lwip/tcpip.h"
66char* RF24Client::incomingData[2];
67uint16_t RF24Client::dataSize[2];
68struct tcp_pcb* RF24Client::myPcb;
69uint32_t RF24Client::clientConnectionTimeout;
70uint32_t RF24Client::serverConnectionTimeout;
71uint32_t RF24Client::simpleCounter;
73int32_t RF24Client::accepts;
82 if (state !=
nullptr) {
83 state->serverTimer = millis();
84 state->clientTimer = millis();
87 state->result = ERR_OK;
95err_t RF24Client::blocking_write(
struct tcp_pcb* fpcb, ConnectState* fstate,
const char* data,
size_t len)
98 if (fpcb ==
nullptr) {
103 if (!fstate->connected) {
108 const uint32_t timeoutStart = millis();
110 if (len > tcp_sndbuf(fpcb)) {
111 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
113 ETHERNET_APPLY_LOCK();
117 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
119 ETHERNET_REMOVE_LOCK();
124 while (len > tcp_sndbuf(fpcb)) {
126 if (!fstate->connected || myPcb != fpcb) {
129 if (millis() - timeoutStart > serverConnectionTimeout) {
135 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
137 ETHERNET_APPLY_LOCK();
142 while (written < len) {
143 size_t segment = fpcb->snd_wnd_max / 2 < fpcb->mss ? fpcb->snd_wnd_max / 2 : fpcb->mss;
147 const size_t piece = (len - written) < segment ? (len - written) : segment;
149 err_t err = tcp_write(fpcb, data + written, piece, TCP_WRITE_FLAG_COPY);
154 if (err != ERR_MEM) {
156 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
158 ETHERNET_REMOVE_LOCK();
167 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
169 ETHERNET_REMOVE_LOCK();
173 if (!fstate->connected || myPcb != fpcb) {
176 if (millis() - timeoutStart > serverConnectionTimeout) {
180 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
182 ETHERNET_APPLY_LOCK();
187 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
189 ETHERNET_REMOVE_LOCK();
203 if (state !=
nullptr) {
205 state->connected =
false;
206 dataSize[state->stateActiveID] = 0;
221 if (state !=
nullptr) {
222 state->serverTimer = millis();
226 if (state !=
nullptr) {
227 state->connected =
false;
229 if (tpcb !=
nullptr) {
230 if (tcp_close(tpcb) != ERR_OK) {
245 if (err != ERR_OK || state ==
nullptr) {
262 while (q !=
nullptr) {
263 memcpy(&incomingData[
id][dataSize[
id]], q->payload, q->len);
264 dataSize[id] += q->len;
269 if (tpcb !=
nullptr && acked > 0) {
270 tcp_recved(tpcb, acked);
287 if (state !=
nullptr) {
288 state->connected =
false;
290 if (tpcb !=
nullptr) {
291 if (tcp_close(tpcb) != ERR_OK) {
306 if (err != ERR_OK || state ==
nullptr) {
313 if (state !=
nullptr) {
314 state->clientTimer = millis();
326 while (q !=
nullptr) {
327 memcpy(&incomingData[
id][dataSize[
id]], q->payload, q->len);
328 dataSize[id] += q->len;
333 if (tpcb !=
nullptr && acked > 0) {
334 tcp_recved(tpcb, acked);
352err_t RF24Client::clientTimeouts(
void* arg,
struct tcp_pcb* tpcb)
357 if (state !=
nullptr) {
358 if (millis() - state->clientTimer > state->cConnectionTimeout) {
359 if (tpcb->state == ESTABLISHED || tpcb->state == SYN_SENT || tpcb->state == SYN_RCVD) {
361 err_t err = tcp_close(tpcb);
363 state->connected =
false;
372err_t RF24Client::serverTimeouts(
void* arg,
struct tcp_pcb* tpcb)
377 if (state !=
nullptr && tpcb !=
nullptr) {
380 state->result = ERR_OK;
382 if (millis() - state->serverTimer > state->sConnectionTimeout) {
386 state->result = tcp_close(tpcb);
387 state->closeTimer = millis();
389 state->connected =
false;
390 if (state->result != ERR_OK) {
392 tcp_arg(myPcb,
nullptr);
395 tcp_arg(tpcb,
nullptr);
401 return state->result;
405 return state->result;
412err_t RF24Client::closed_port(
void* arg,
struct tcp_pcb* tpcb)
417 if (state !=
nullptr) {
421 if (myPcb ==
nullptr) {
422 if (state !=
nullptr && tpcb !=
nullptr) {
424 if ((tpcb->state == ESTABLISHED || tpcb->state == SYN_SENT || tpcb->state == SYN_RCVD)) {
425 if (state->backlogWasAccepted ==
false) {
427 state->backlogWasAccepted =
true;
428 state->connectTimestamp = millis();
429 state->connected =
true;
434 tcp_backlog_accepted(tpcb);
442 if (tpcb !=
nullptr) {
443 if (state !=
nullptr) {
444 if (millis() - state->connectTimestamp > state->sConnectionTimeout * 2) {
446 if ((tpcb->state == ESTABLISHED || tpcb->state == SYN_SENT || tpcb->state == SYN_RCVD)) {
450 if (state->backlogWasAccepted ==
false) {
452 tcp_backlog_accepted(tpcb);
453 state->backlogWasAccepted =
true;
457 state->result = tcp_close(tpcb);
458 state->connected =
false;
459 if (state->result == ERR_OK) {
460 state->closeTimer = millis();
468 return state->result;
479err_t RF24Client::accept(
void* arg,
struct tcp_pcb* tpcb, err_t err)
483 if (tpcb ==
nullptr) {
484 IF_RF24ETHERNET_DEBUG_CLIENT(Serial.print(
"Server: Accepted conn, but no tpcb from: "); Serial.println(ip4addr_ntoa(ip_2_ip4(&tpcb->remote_ip))););
488 if (tpcb !=
nullptr) {
493 if (myPcb !=
nullptr) {
495 IF_RF24ETHERNET_DEBUG_CLIENT(Serial.print(
"Server: Accept w/already connected: Accepted_Conns - Delayed_Conns == "); Serial.println(accepts););
496 tcp_backlog_delayed(tpcb);
498 tcp_poll(tpcb, closed_port, 5);
500 gState[actState]->connected =
false;
501 gState[actState]->backlogWasAccepted =
false;
505 tcp_poll(tpcb, serverTimeouts, 8);
508 gState[actState]->connected =
true;
509 gState[actState]->backlogWasAccepted =
true;
512 dataSize[actState] = 0;
515 gState[actState]->stateActiveID = actState;
516 gState[actState]->identifier = simpleCounter;
517 gState[actState]->sConnectionTimeout = serverConnectionTimeout;
518 gState[actState]->connectTimestamp = millis();
519 gState[actState]->serverTimer = millis();
530err_t RF24Client::closeConn(
void* arg,
struct tcp_pcb* tpcb)
533 if (tpcb !=
nullptr) {
544err_t RF24Client::on_connected(
void* arg,
struct tcp_pcb* tpcb, err_t err)
550 if (state !=
nullptr) {
561 state->cConnectionTimeout = clientConnectionTimeout;
562 state->clientTimer = millis();
565 state->connected =
true;
568 state->connected =
false;
589 g_rf24client_instance =
this;
610 return (data && (data->packets_in != 0 || (data->state & UIP_CLIENT_CONNECTED))) ? 1 : 0;
625 if (connectionEstablished) {
626 struct zsock_pollfd pfd {};
628 pfd.events = ZSOCK_POLLIN;
630 int rc = zsock_poll(&pfd, 1, 0);
635 if (pfd.revents & (ZSOCK_POLLHUP | ZSOCK_POLLERR | ZSOCK_POLLNVAL)) {
636 connectionEstablished =
false;
638 zsock_close(_socket);
643 if (pfd.revents & ZSOCK_POLLIN) {
645 int n = zsock_recv(_socket, &dummy, 1, ZSOCK_MSG_PEEK | ZSOCK_MSG_DONTWAIT);
647 connectionEstablished =
false;
649 zsock_close(_socket);
660 struct zsock_pollfd pfd {};
662 pfd.events = ZSOCK_POLLOUT;
664 int rc = zsock_poll(&pfd, 1, 0);
675 if (pfd.revents & (ZSOCK_POLLERR | ZSOCK_POLLHUP)) {
677 zsock_close(_socket);
683 if (pfd.revents & ZSOCK_POLLOUT) {
686 socklen_t len =
sizeof(error);
688 int ret = zsock_getsockopt(_socket, SOL_SOCKET, SO_ERROR, &error, &len);
689 if (ret < 0 || error != 0) {
691 zsock_close(_socket);
698 connectionEstablished =
true;
703 zsock_close(_socket);
717 #if UIP_ACTIVE_OPEN > 0
725 struct uip_conn* conn = uip_connect(&ipaddr, htons(port));
729 #if UIP_CONNECTION_TIMEOUT > 0
730 uint32_t timeout = millis();
733 while ((conn->tcpstateflags & UIP_TS_MASK) != UIP_CLOSED)
737 if ((conn->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED)
739 data = (uip_userdata_t*)conn->appstate;
740 IF_RF24ETHERNET_DEBUG_CLIENT(Serial.print(millis()); Serial.print(F(
" connected, state: ")); Serial.print(data->state); Serial.print(F(
", first packet in: ")); Serial.println(data->packets_in););
744 #if UIP_CONNECTION_TIMEOUT > 0
747 conn->tcpstateflags = UIP_CLOSED;
759 if (myPcb !=
nullptr) {
764 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
766 ETHERNET_APPLY_LOCK();
770 if (myPcb ==
nullptr) {
775 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
777 ETHERNET_REMOVE_LOCK();
796 IP_ADDR4(&myIp, ip[0], ip[1], ip[2], ip[3]);
798 err = tcp_connect(myPcb, &myIp, port, on_connected);
801 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
803 ETHERNET_REMOVE_LOCK();
811 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
813 ETHERNET_REMOVE_LOCK();
817 const uint32_t timeoutStart = millis();
823 if (clientConnectionTimeout > 0) {
834 int sock = zsock_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
840 int flags = zsock_fcntl(sock, F_GETFL, 0);
846 zsock_fcntl(sock, F_SETFL, flags | O_NONBLOCK);
848 struct sockaddr_in addr = {};
849 addr.sin_family = AF_INET;
850 addr.sin_port = htons(port);
853 snprintf(ipstr,
sizeof(ipstr),
"%u.%u.%u.%u", ip[0], ip[1], ip[2], ip[3]);
854 if (net_addr_pton(AF_INET, ipstr, &addr.sin_addr) < 0) {
859 int rc = zsock_connect(sock, (
const struct sockaddr*)&addr,
sizeof(addr));
868 if (errno != EINPROGRESS) {
875 int64_t start_time = k_uptime_get();
878 while (k_uptime_get() - start_time < 5000) {
883 struct zsock_pollfd pfd = {
885 .events = ZSOCK_POLLOUT,
889 rc = zsock_poll(&pfd, 1, 0);
896 if (rc > 0 && (pfd.revents & (ZSOCK_POLLOUT | ZSOCK_POLLERR | ZSOCK_POLLHUP))) {
898 socklen_t slen =
sizeof(soerr);
899 if (zsock_getsockopt(sock, SOL_SOCKET, SO_ERROR, &soerr, &slen) < 0) {
907 zsock_fcntl(sock, F_SETFL, flags & ~O_NONBLOCK);
915 zsock_fcntl(sock, F_SETFL, flags & ~O_NONBLOCK);
926 zsock_fcntl(sock, F_SETFL, flags & ~O_NONBLOCK);
939void dnsCallback(
const char* name,
const ip_addr_t* ipaddr,
void* callback_arg)
952 IPAddress remote_addr;
954 dns.
begin(RF24EthernetClass::_dnsServerAddress);
959 #if defined(ETH_DEBUG_L1) || defined(RF24ETHERNET_DEBUG_DNS)
960 Serial.println(F(
"*UIP Got DNS*"));
962 return connect(remote_addr, port);
964#elif RF24ETHERNET_USE_UDP
967 IPAddress remote_addr;
969 dns.
begin(RF24EthernetClass::_dnsServerAddress);
974 #if defined(ETH_DEBUG_L1) || defined(RF24ETHERNET_DEBUG_DNS)
975 Serial.println(F(
"*lwIP Got DNS*"));
977 return connect(remote_addr, port);
988#if defined(ETH_DEBUG_L1) || defined(RF24ETHERNET_DEBUG_DNS)
989 Serial.println(F(
"* DNS fail*"));
1000 if (data && data->state)
1005 data->packets_in = 0;
1008 if (data->state & UIP_CLIENT_REMOTECLOSED)
1014 data->state |= UIP_CLIENT_CLOSE;
1032 zsock_close(_socket);
1042void RF24Client::_stop()
1045 const uint32_t drainStart = millis();
1047 if (millis() - drainStart > 5000) {
1050 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
1052 ETHERNET_APPLY_LOCK();
1056 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
1058 ETHERNET_REMOVE_LOCK();
1064 tcp_pcb* pcb = myPcb;
1067 if (pcb !=
nullptr) {
1068 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
1070 ETHERNET_APPLY_LOCK();
1073 if (pcb->state != CLOSED) {
1075 tcp_recv(pcb, NULL);
1076 tcp_sent(pcb, NULL);
1079 err_t err = tcp_close(pcb);
1080 if (err != ERR_OK) {
1084 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
1086 ETHERNET_REMOVE_LOCK();
1102 return data && rhs.data && (data == rhs.data);
1113RF24Client::operator bool()
1117 return data && (!(data->state & UIP_CLIENT_REMOTECLOSED) || data->packets_in != 0);
1130 return _write(data, &c, 1);
1137 return _write(data, buf, size);
1142size_t RF24Client::_write(uip_userdata_t* u,
const uint8_t* buf,
size_t size)
1144size_t RF24Client::_write(uint8_t* data,
const uint8_t* buf,
size_t size)
1151 size_t total_written = 0;
1152 size_t payloadSize = rf24_min(size, UIP_TCP_MSS);
1153 uint32_t start = millis();
1159 if (millis() - start > 5000)
1164 return total_written;
1167 if (u && !(u->state & (UIP_CLIENT_CLOSE | UIP_CLIENT_REMOTECLOSED)) && (u->state & UIP_CLIENT_CONNECTED))
1169 if (u->out_pos + payloadSize > UIP_TCP_MSS || u->hold)
1176 Serial.print(millis());
1177 Serial.print(F(
" UIPClient.write: writePacket("));
1178 Serial.print(u->packets_out);
1179 Serial.print(F(
") pos: "));
1180 Serial.print(u->out_pos);
1181 Serial.print(F(
", buf["));
1182 Serial.print(size - total_written);
1183 Serial.print(F(
"]: '"));
1184 Serial.write((uint8_t*)buf + total_written, payloadSize);
1185 Serial.println(F(
"'")););
1187 memcpy(u->myData + u->out_pos, buf + total_written, payloadSize);
1189 u->out_pos += payloadSize;
1190 total_written += payloadSize;
1192 if (total_written < size)
1194 size_t remain = size - total_written;
1195 payloadSize = rf24_min(remain, UIP_TCP_MSS);
1200 return total_written;
1209 bool initialActiveState = activeState;
1210 size_t chunk = (MAX_PAYLOAD_SIZE - 14) < TCP_SND_BUF ? (MAX_PAYLOAD_SIZE - 14) : TCP_SND_BUF;
1211 size_t position = 0;
1213 uint32_t timeout = millis();
1214 while (size > chunk) {
1215 if (millis() - timeout > 3000) {
1218 if (myPcb ==
nullptr)
1221 err_t write_err = blocking_write(myPcb, gState[initialActiveState],
reinterpret_cast<const char*
>(&buf[position]), chunk);
1223 if (write_err != ERR_OK) {
1224 gState[initialActiveState]->result = write_err;
1225 gState[initialActiveState]->connected =
false;
1235 if (myPcb ==
nullptr)
1238 err_t write_err = blocking_write(myPcb, gState[initialActiveState],
reinterpret_cast<const char*
>(&buf[position]), size);
1240 if (write_err != ERR_OK) {
1241 gState[initialActiveState]->result = write_err;
1242 gState[initialActiveState]->connected =
false;
1247 return position + size;
1250 RF24Client* self = RF24Client::g_rf24client_instance;
1251 if (!self || !buf || size == 0)
1254 if (self->_socket < 0) {
1255 self->_lastError = ENOTCONN;
1260 while (total < size) {
1262 ssize_t n = zsock_send(self->_socket, buf + total, size - total, 0);
1272 self->_lastError = err;
1275 if (err == EAGAIN || err == EWOULDBLOCK)
1301 uip_userdata_t* u = (uip_userdata_t*)uip_conn->appstate;
1304 if (!u && uip_connected())
1308 u = (uip_userdata_t*)EthernetClient::_allocateData();
1312 uip_conn->appstate = u;
1321 #if UIP_CONNECTION_TIMEOUT > 0
1322 if (u && u->connectTimeout > 0) {
1323 if (millis() - u->connectTimer > u->connectTimeout) {
1324 u->state |= UIP_CLIENT_CLOSE;
1325 u->connectTimer = millis();
1336 IF_RF24ETHERNET_DEBUG_CLIENT(Serial.println(); Serial.print(millis()); Serial.print(F(
" UIPClient uip_newdata, uip_len:")); Serial.println(uip_len););
1337 #if UIP_CONNECTION_TIMEOUT > 0
1338 u->connectTimer = millis();
1340 u->hold = (u->out_pos = (u->windowOpened = (u->packets_out =
false)));
1342 if (uip_len && !(u->state & (UIP_CLIENT_CLOSE | UIP_CLIENT_REMOTECLOSED)))
1345 u->state &= ~UIP_CLIENT_RESTART;
1346 u->windowOpened =
false;
1347 u->restartTime = millis();
1349 uint16_t writePos = u->in_pos + u->dataCnt;
1350 uint16_t incomingLen = uip_datalen();
1354 memcpy(&u->myData[writePos], uip_appdata, incomingLen);
1355 u->dataCnt += incomingLen;
1361 Serial.println(F(
"UIPClient RX overflow, closing connection")););
1362 u->state |= UIP_CLIENT_CLOSE;
1370 if (uip_closed() || uip_timedout() || uip_aborted())
1378 ((uip_userdata_closed_t*)u)->lport = uip_conn->lport;
1379 u->state |= UIP_CLIENT_REMOTECLOSED;
1389 uip_conn->appstate = NULL;
1397 u->state &= ~UIP_CLIENT_RESTART;
1398 u->hold = (u->out_pos = (u->windowOpened = (u->packets_out =
false)));
1399 u->restartTime = millis();
1400 #if UIP_CONNECTION_TIMEOUT > 0
1401 u->connectTimer = millis();
1406 if (uip_poll() || uip_rexmit())
1411 uip_len = u->out_pos;
1412 uip_send(u->myData, u->out_pos);
1418 if (u->packets_out != 0 && !u->hold)
1420 uip_len = u->out_pos;
1421 uip_send(u->myData, u->out_pos);
1429 if (!(u->state & (UIP_CLIENT_CLOSE | UIP_CLIENT_REMOTECLOSED)))
1432 if (u->windowOpened ==
true && u->state & UIP_CLIENT_RESTART && millis() - u->restartTime > u->restartInterval)
1434 u->restartTime = millis();
1435 #if defined RF24ETHERNET_DEBUG_CLIENT || defined ETH_DEBUG_L1
1437 Serial.print(millis());
1438 #if UIP_CONNECTION_TIMEOUT > 0
1439 Serial.print(F(
" UIPClient Re-Open TCP Window, time remaining before abort: "));
1443 u->restartInterval += 500;
1444 u->restartInterval = rf24_min(u->restartInterval, 7000);
1451 if (u->state & UIP_CLIENT_CLOSE)
1455 if (u->packets_out == 0)
1458 uip_conn->appstate = NULL;
1470 if (u->state & UIP_CLIENT_RESTART && !u->windowOpened)
1472 if (!(u->state & (UIP_CLIENT_CLOSE | UIP_CLIENT_REMOTECLOSED)))
1475 #if defined ETH_DEBUG_L1
1477 Serial.print(millis());
1478 Serial.println(F(
" UIPClient Re-Open TCP Window"));
1480 u->windowOpened =
true;
1482 u->restartTime = millis();
1490uip_userdata_t* RF24Client::_allocateData()
1492 for (uint8_t sock = 0; sock < UIP_CONNS; sock++)
1494 uip_userdata_t* data = &RF24Client::all_data[sock];
1497 data->state = sock | UIP_CLIENT_CONNECTED;
1498 data->packets_in = 0;
1499 data->packets_out = 0;
1504 data->restartTime = millis();
1505 data->restartInterval = 5000;
1506 #if (UIP_CONNECTION_TIMEOUT > 0)
1507 data->connectTimer = millis();
1519 uint32_t start = millis();
1522 if (millis() - start > timeout)
1539 return _available(data);
1542 return _available(data);
1549int RF24Client::_available(uip_userdata_t* u)
1551int RF24Client::_available(uint8_t* data)
1560 return dataSize[activeState];
1563 RF24Client* self = RF24Client::g_rf24client_instance;
1564 if (!self || self->_socket < 0)
1568 struct zsock_pollfd pfd
1571 pfd.fd = self->_socket;
1572 pfd.events = ZSOCK_POLLIN;
1573 int pr = zsock_poll(&pfd, 1, 0);
1582 int n = zsock_recv(self->_socket, peekBuffer,
sizeof(peekBuffer),
1583 ZSOCK_MSG_PEEK | ZSOCK_MSG_DONTWAIT);
1589 if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR)
1603 if (!data->packets_in) {
1605 if (!*
this || !data->packets_in) {
1612 data->state |= UIP_CLIENT_CLOSE;
1617 size = rf24_min(data->dataCnt, size);
1618 memcpy(buf, &data->myData[data->in_pos], size);
1619 data->dataCnt -= size;
1621 data->in_pos += size;
1625 data->packets_in = 0;
1628 if (uip_stopped(&uip_conns[data->state & UIP_CLIENT_SOCKETS]) && !(data->state & (UIP_CLIENT_CLOSE | UIP_CLIENT_REMOTECLOSED)))
1630 data->state |= UIP_CLIENT_RESTART;
1631 data->restartTime = 0;
1633 IF_ETH_DEBUG_L2(Serial.print(F(
"UIPClient set restart ")); Serial.println(data->state & UIP_CLIENT_SOCKETS); Serial.println(F(
"**")); Serial.println(data->state, BIN); Serial.println(F(
"**")); Serial.println(UIP_CLIENT_SOCKETS, BIN); Serial.println(F(
"**")););
1637 IF_ETH_DEBUG_L2(Serial.print(F(
"UIPClient stop?????? ")); Serial.println(data->state & UIP_CLIENT_SOCKETS); Serial.println(F(
"**")); Serial.println(data->state, BIN); Serial.println(F(
"**")); Serial.println(UIP_CLIENT_SOCKETS, BIN); Serial.println(F(
"**")););
1640 if (data->packets_in == 0)
1642 if (data->state & UIP_CLIENT_REMOTECLOSED)
1660 memcpy(&buf[0], &incomingData[
activeState][0], avail);
1665 memcpy(&buf[0], &incomingData[
activeState][0], size);
1674 if (!buf || size == 0)
1677 _lastError = ENOTCONN;
1681 int n = zsock_recv(_socket, buf, size, ZSOCK_MSG_DONTWAIT);
1683 if (n < 0 && (errno == EAGAIN || errno == EWOULDBLOCK)) {
1685 n = zsock_recv(_socket, buf, size, ZSOCK_MSG_DONTWAIT);
1704 if (err == EAGAIN || err == EWOULDBLOCK || err == EINTR) {
1710 if (err == EBADF || err == ENOTSOCK) {
1723 if (
read(&c, 1) <= 0)
1735 return data->myData[data->in_pos];
1739 return (uint8_t)peekBuffer[0];
1753 data->packets_in = 0;
void dnsCallback(const char *name, const ip_addr_t *ipaddr, void *callback_arg)
#define INCOMING_DATA_SIZE
#define uip_ip_addr(addr, ip)
RF24EthernetClass RF24Ethernet
void begin(const IPAddress &aDNSServer)
int getHostByName(const char *aHostname, IPAddress &aResult)
virtual bool operator==(const EthernetClient &)
int connect(IPAddress ip, uint16_t port)
static void error_callback(void *arg, err_t err)
static err_t srecv_callback(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
int waitAvailable(uint32_t timeout=750)
static ConnectState * gState[2]
static err_t recv_callback(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
static err_t sent_callback(void *arg, struct tcp_pcb *tpcb, uint16_t len)
static bool connectionActive
#define IF_ETH_DEBUG_L2(x)
#define IF_RF24ETHERNET_DEBUG_CLIENT(x)
#define IF_ETH_DEBUG_L1(x)
#define UIP_CONNECTION_TIMEOUT
Optional: Uncomment to disable
#define OUTPUT_BUFFER_SIZE
#define UIP_WINDOW_REOPEN_DELAY
Optional: Used with UIP_CONNECTION_TIMEOUT
volatile bool stateActiveID
uint16_t u16_t
16 bit datatype
void serialip_appcall(void)