181 #ifndef RF24ETHERNET_USE_UDP
182 RF24EthernetClass::tick();
185 uip_ipaddr_t ripaddr;
191 _uip_udp_conn->rport = htons(port);
192 uip_ipaddr_copy(_uip_udp_conn->ripaddr, &ripaddr);
196 _uip_udp_conn = uip_udp_new(&ripaddr, htons(port));
200 _uip_udp_conn->appstate = &appdata;
208 IF_RF24ETHERNET_DEBUG_UDP(Serial.print(F(
"rip: ")); Serial.print(ip); Serial.print(F(
", port: ")); Serial.println(port););
213 if (appdata.packet_out == 0)
215 appdata.packet_out = 1;
217 if (appdata.packet_out != 0)
236 #if defined ARDUINO_ARCH_ESP32 || defined ARDUINO_ARCH_ESP8266 || defined ARDUINO_ARCH_RP2040 || defined ARDUINO_ARCH_RP2350
237 IP4_ADDR(&myIp, ip[0], ip[1], ip[2], ip[3]);
238 ip_addr_t generic_addr;
239 ip_addr_copy_from_ip4(generic_addr, myIp);
240 err = udp_connect(udpPcb, &generic_addr, port);
242 IP4_ADDR(&myIp, ip[0], ip[1], ip[2], ip[3]);
244 err = udp_connect(udpPcb, &myIp, port);
253 if (udpSocketOut >= 0) {
254 zsock_close(udpSocketOut);
258 udpSocketOut = zsock_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
259 if (udpSocketOut < 0) {
263 memset(&udpDestination, 0,
sizeof(udpDestination));
264 udpDestination.sin_family = AF_INET;
265 udpDestination.sin_port = htons(port);
266 udpDestination.sin_addr.s_addr = (uint32_t)ip;
268 if (zsock_inet_pton(AF_INET, ip.toString().c_str(), &udpDestination.sin_addr) != 1) {
269 zsock_close(udpSocketOut);
274 int flags = zsock_fcntl(udpSocketOut, F_GETFL, 0);
275 zsock_fcntl(udpSocketOut, F_SETFL, flags | O_NONBLOCK);
328 #ifndef RF24ETHERNET_USE_UDP
329 if (_uip_udp_conn && appdata.packet_out != 0)
333 uip_udp_periodic_conn(_uip_udp_conn);
343 if (dataOutPos > 0) {
350 ssize_t ret = zsock_sendto(udpSocketOut, udpDataOut, dataOutPos, 0, (
struct sockaddr*)&udpDestination,
sizeof(udpDestination));
373 #ifndef RF24ETHERNET_USE_UDP
374 if (appdata.packet_out != 0)
376 IF_RF24ETHERNET_DEBUG_UDP(Serial.println(
"RF24UDP Write: "); Serial.println(size); for (
int i = 0; i < size; i++) { Serial.print((
char)buffer[i]); Serial.print(
" "); } Serial.println(
""););
378 memcpy(RF24Client::all_data[0].myData + appdata.out_pos, buffer, size);
379 appdata.out_pos += ret;
385 memcpy(&udpDataOut[dataOutPos], buffer, size);
399 RF24EthernetClass::tick();
401 #ifndef RF24ETHERNET_USE_UDP
403 int size = appdata.packet_in_size;
405 IF_RF24ETHERNET_DEBUG_UDP(
if (appdata.packet_in != 0) { Serial.print(F(
"RF24UDP udp parsePacket freeing previous packet: ")); Serial.println(appdata.packet_in); });
412 IF_RF24ETHERNET_DEBUG_UDP(
if (appdata.packet_in != 0) { Serial.print(F(
"RF24UDP udp parsePacket received packet: ")); Serial.print(appdata.packet_in); } Serial.print(F(
", size: ")); Serial.println(size););
428 RF24EthernetClass::tick();
429 #ifndef RF24ETHERNET_USE_UDP
430 return appdata.packet_in_size;
435 if (udpSocketOut >= 0) {
436 socklen_t client_addr_len =
sizeof(udpClientAddr);
437 ssize_t received = zsock_recvfrom(udpSocketOut, udpDataIn,
sizeof(udpDataIn) - 1, 0, (
struct sockaddr*)&udpClientAddr, &client_addr_len);
439 dataInPos += received;
440 uint32_t rawIP = udpClientAddr.sin_addr.s_addr;
441 IPAddress remIP(rawIP);
443 udpRemotePort = ntohs(udpClientAddr.sin_port);
448 if (udpSocketIn >= 0) {
449 socklen_t client_addr_len =
sizeof(udpClientAddr);
450 ssize_t received = zsock_recvfrom(udpSocketIn, udpDataIn,
sizeof(udpDataIn) - 1, 0, (
struct sockaddr*)&udpClientAddr, &client_addr_len);
452 dataInPos += received;
453 uint32_t rawIP = udpClientAddr.sin_addr.s_addr;
454 IPAddress remIP(rawIP);
456 udpRemotePort = ntohs(udpClientAddr.sin_port);
487 #ifndef RF24ETHERNET_USE_UDP
488 if (appdata.packet_in != 0)
490 memcpy(buffer, RF24Client::all_data[0].myData + appdata.in_pos, len);
491 appdata.in_pos += len;
492 appdata.packet_in_size -= len;
494 if (appdata.packet_in_size < 1)
496 appdata.packet_in = 0;
500 #elif USE_LWIP == 1 || USE_LWIP == 2
502 if (dataInPos >= len) {
504 size_t remainder = dataInPos - len;
505 memcpy(&buffer[0], &udpDataIn[0], len);
507 memmove(udpDataIn, &udpDataIn[len], remainder);
509 dataInPos = rf24_max(0, remainder);
561 #ifndef RF24ETHERNET_USE_UDP
562 return _uip_udp_conn ?
ip_addr_uip(_uip_udp_conn->ripaddr) : IPAddress();
565 if (udpPcb !=
nullptr) {
566 const ip4_addr_t* addr = ip_2_ip4(&udpPcb->remote_ip);
568 ip4_addr_get_byte(addr, 0),
569 ip4_addr_get_byte(addr, 1),
570 ip4_addr_get_byte(addr, 2),
571 ip4_addr_get_byte(addr, 3));
573 return IPAddress {0, 0, 0, 0};
605 #ifndef RF24ETHERNET_USE_UDP
606 if (uip_udp_userdata_t* data = (uip_udp_userdata_t*)(uip_udp_conn->appstate))
610 if (data->packet_next == 0)
612 uip_udp_conn->rport =
UDPBUF->srcport;
613 uip_ipaddr_copy(uip_udp_conn->ripaddr,
UDPBUF->srcipaddr);
616 memcpy(RF24Client::all_data[0].myData, uip_appdata, uip_len);
617 data->packet_in_size += uip_len;
620 IF_RF24ETHERNET_DEBUG_UDP(Serial.print(F(
"RF24UDP udp, uip_newdata received packet: ")); Serial.print(data->packet_next); Serial.print(F(
", size: ")); Serial.println(data->packet_in_size); for (
int i = 0; i < data->packet_in_size; i++) { Serial.print(RF24Client::all_data[0].myData[i],HEX); Serial.print(F(
" : ")); } Serial.println(););
623 if (uip_poll() && data->send)
626 IF_RF24ETHERNET_DEBUG_UDP(Serial.print(F(
"udp, uip_poll preparing packet to send: ")); Serial.print(data->packet_out); Serial.print(F(
", size: ")); Serial.println(data->out_pos););
628 memcpy(uip_appdata, RF24Client::all_data[0].myData, data->out_pos);
629 uip_udp_send(data->out_pos);