19#define UIP_TCP_PHYH_LEN UIP_LLH_LEN + UIP_IPTCPH_LEN
42#if UIP_ACTIVE_OPEN > 0
50 struct uip_conn* conn = uip_connect(&ipaddr, htons(port));
54 #if UIP_CONNECTION_TIMEOUT > 0
55 uint32_t timeout = millis();
58 while ((conn->tcpstateflags & UIP_TS_MASK) != UIP_CLOSED)
60 RF24EthernetClass::tick();
62 if ((conn->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED)
64 data = (uip_userdata_t*)conn->appstate;
65 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););
69 #if UIP_CONNECTION_TIMEOUT > 0
72 conn->tcpstateflags = UIP_CLOSED;
95 IPAddress remote_addr;
97 dns.begin(RF24EthernetClass::_dnsServerAddress);
98 ret = dns.getHostByName(host, remote_addr);
102 #if defined(ETH_DEBUG_L1) || #defined(RF24ETHERNET_DEBUG_DNS)
103 Serial.println(F(
"*UIP Got DNS*"));
105 return connect(remote_addr, port);
115#if defined(ETH_DEBUG_L1) || defined(RF24ETHERNET_DEBUG_DNS)
116 Serial.println(F(
"*UIP DNS fail*"));
126 if (data && data->state)
131 data->packets_in = 0;
160 return data && rhs.data && (data == rhs.data);
165RF24Client::operator bool()
175 return _write(data, &c, 1);
182 return _write(data, buf, size);
187size_t RF24Client::_write(uip_userdata_t* u,
const uint8_t* buf,
size_t size)
190 size_t total_written = 0;
191 size_t payloadSize = rf24_min(size, UIP_TCP_MSS);
195 RF24EthernetClass::tick();
199 if (u->out_pos + payloadSize > UIP_TCP_MSS || u->hold)
204 IF_RF24ETHERNET_DEBUG_CLIENT(Serial.println(); Serial.print(millis()); Serial.print(F(
" UIPClient.write: writePacket(")); Serial.print(u->packets_out); Serial.print(F(
") pos: ")); Serial.print(u->out_pos); Serial.print(F(
", buf[")); Serial.print(size - total_written); Serial.print(F(
"]: '")); Serial.write((uint8_t*)buf + total_written, payloadSize); Serial.println(F(
"'")););
206 memcpy(u->myData + u->out_pos, buf + total_written, payloadSize);
208 u->out_pos += payloadSize;
210 total_written += payloadSize;
212 if (total_written < size)
214 size_t remain = size - total_written;
215 payloadSize = rf24_min(remain, UIP_TCP_MSS);
242 uip_userdata_t* u = (uip_userdata_t*)uip_conn->appstate;
245 if (!u && uip_connected())
249 u = (uip_userdata_t*)EthernetClient::_allocateData();
253 uip_conn->appstate = u;
262#if UIP_CONNECTION_TIMEOUT > 0
263 if (u && u->connectTimeout > 0) {
264 if (millis() - u->connectTimer > u->connectTimeout) {
266 u->connectTimer = millis();
277 IF_RF24ETHERNET_DEBUG_CLIENT(Serial.println(); Serial.print(millis()); Serial.print(F(
" UIPClient uip_newdata, uip_len:")); Serial.println(uip_len););
278#if UIP_CONNECTION_TIMEOUT > 0
279 u->connectTimer = millis();
284 u->hold = (u->out_pos = (u->windowOpened = (u->packets_out =
false)));
289 u->state &= ~UIP_CLIENT_RESTART;
290 u->windowOpened =
false;
291 u->restartTime = millis();
292 memcpy(&u->myData[u->dataPos + u->dataCnt], uip_appdata, uip_datalen());
293 u->dataCnt += uip_datalen();
302 if (uip_closed() || uip_timedout() || uip_aborted())
310 ((uip_userdata_closed_t*)u)->lport = uip_conn->lport;
321 uip_conn->appstate = NULL;
329 u->state &= ~UIP_CLIENT_RESTART;
330 u->hold = (u->out_pos = (u->windowOpened = (u->packets_out =
false)));
331 u->restartTime = millis();
332#if UIP_CONNECTION_TIMEOUT > 0
333 u->connectTimer = millis();
338 if (uip_poll() || uip_rexmit())
342 if (u->packets_out != 0)
344 uip_len = u->out_pos;
345 uip_send(u->myData, u->out_pos);
357 if (u->windowOpened ==
true && u->state &
UIP_CLIENT_RESTART && millis() - u->restartTime > u->restartInterval)
359 u->restartTime = millis();
360#if defined RF24ETHERNET_DEBUG_CLIENT || defined ETH_DEBUG_L1
362 Serial.print(millis());
363 #if UIP_CONNECTION_TIMEOUT > 0
364 Serial.print(F(
" UIPClient Re-Open TCP Window, time remaining before abort: "));
368 u->restartInterval += 500;
369 u->restartInterval = rf24_min(u->restartInterval, 7000);
380 if (u->packets_out == 0)
383 uip_conn->appstate = NULL;
400#if defined ETH_DEBUG_L1
402 Serial.print(millis());
403 Serial.println(F(
" UIPClient Re-Open TCP Window"));
405 u->windowOpened =
true;
407 u->restartTime = millis();
415uip_userdata_t* RF24Client::_allocateData()
417 for (uint8_t sock = 0; sock < UIP_CONNS; sock++)
423 data->packets_in = 0;
424 data->packets_out = 0;
429#if (UIP_CONNECTION_TIMEOUT > 0)
430 data->connectTimer = millis();
441 uint32_t start = millis();
444 if (millis() - start > timeout)
460 return _available(data);
467int RF24Client::_available(uip_userdata_t* u)
480 if (!data->packets_in)
485 size = rf24_min(data->dataCnt, size);
486 memcpy(buf, &data->myData[data->dataPos], size);
487 data->dataCnt -= size;
489 data->dataPos += size;
493 data->packets_in = 0;
499 data->restartTime = 0;
501 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(
"**")););
505 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(
"**")););
508 if (data->packets_in == 0)
539 return data->myData[data->dataPos];
550 data->packets_in = 0;
void serialip_appcall(void)
#define UIP_CLIENT_RESTART
#define UIP_CLIENT_SOCKETS
#define UIP_CLIENT_REMOTECLOSED
#define UIP_CLIENT_CONNECTED
#define uip_ip_addr(addr, ip)
RF24EthernetClass RF24Ethernet
virtual bool operator==(const EthernetClient &)
int connect(IPAddress ip, uint16_t port)
static uip_userdata_t all_data[UIP_CONNS]
int waitAvailable(uint32_t timeout=750)
#define IF_ETH_DEBUG_L2(x)
#define IF_RF24ETHERNET_DEBUG_CLIENT(x)
#define UIP_CONNECTION_TIMEOUT
Optional: Uncomment to disable
#define UIP_WINDOW_REOPEN_DELAY
Optional: Used with UIP_CONNECTION_TIMEOUT