67 #ifndef RF24ETHERNET_USE_UDP
70 _uip_udp_conn = uip_udp_new(NULL, 0);
74 uip_udp_bind(_uip_udp_conn, htons(port));
75 _uip_udp_conn->appstate = &appdata;
81 if (udpPcb ==
nullptr) {
84 err_t err = udp_bind(udpPcb, IP_ANY_TYPE, port);
126 #ifndef RF24ETHERNET_USE_UDP
127 RF24EthernetClass::tick();
130 uip_ipaddr_t ripaddr;
131 uip_ip_addr(&ripaddr, ip);
136 _uip_udp_conn->rport = htons(port);
137 uip_ipaddr_copy(_uip_udp_conn->ripaddr, &ripaddr);
141 _uip_udp_conn = uip_udp_new(&ripaddr, htons(port));
145 _uip_udp_conn->appstate = &appdata;
153 IF_RF24ETHERNET_DEBUG_UDP(Serial.print(F(
"rip: ")); Serial.print(ip); Serial.print(F(
", port: ")); Serial.println(port););
158 if (appdata.packet_out == 0)
160 appdata.packet_out = 1;
162 if (appdata.packet_out != 0)
181 #if defined ARDUINO_ARCH_ESP32 || defined ARDUINO_ARCH_ESP8266 || defined ARDUINO_ARCH_RP2040 || defined ARDUINO_ARCH_RP2350
182 IP4_ADDR(&myIp, ip[0], ip[1], ip[2], ip[3]);
183 ip_addr_t generic_addr;
184 ip_addr_copy_from_ip4(generic_addr, myIp);
185 err = udp_connect(udpPcb, &generic_addr, port);
187 IP4_ADDR(&myIp, ip[0], ip[1], ip[2], ip[3]);
189 err = udp_connect(udpPcb, &myIp, port);
205 #ifndef RF24ETHERNET_USE_UDP
209 IPAddress remote_addr;
225 IPAddress remote_addr;
247 #ifndef RF24ETHERNET_USE_UDP
248 if (_uip_udp_conn && appdata.packet_out != 0)
252 uip_udp_periodic_conn(_uip_udp_conn);
262 if (dataOutPos > 0) {
283 #ifndef RF24ETHERNET_USE_UDP
284 if (appdata.packet_out != 0)
286 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(
""););
288 memcpy(RF24Client::all_data[0].myData + appdata.out_pos, buffer, size);
289 appdata.out_pos += ret;
295 memcpy(&udpDataOut[dataOutPos], buffer, size);
308 RF24EthernetClass::tick();
310 #ifndef RF24ETHERNET_USE_UDP
312 int size = appdata.packet_in_size;
314 IF_RF24ETHERNET_DEBUG_UDP(
if (appdata.packet_in != 0) { Serial.print(F(
"RF24UDP udp parsePacket freeing previous packet: ")); Serial.println(appdata.packet_in); });
321 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););
335 RF24EthernetClass::tick();
336 #ifndef RF24ETHERNET_USE_UDP
337 return appdata.packet_in_size;
364 #ifndef RF24ETHERNET_USE_UDP
365 if (appdata.packet_in != 0)
367 memcpy(buffer, RF24Client::all_data[0].myData + appdata.in_pos, len);
368 appdata.in_pos += len;
369 appdata.packet_in_size -= len;
371 if (appdata.packet_in_size < 1)
373 appdata.packet_in = 0;
379 if (dataInPos >= len) {
381 size_t remainder = dataInPos - len;
382 memcpy(&buffer[0], &udpDataIn[0], len);
384 memmove(udpDataIn, &udpDataIn[len], remainder);
386 dataInPos = rf24_max(0, remainder);
399 #ifndef RF24ETHERNET_USE_UDP
400 RF24EthernetClass::tick();
402 if (appdata.packet_in != 0)
404 return RF24Client::all_data[0].myData[appdata.in_pos];
421 #ifndef RF24ETHERNET_USE_UDP
422 appdata.packet_in = 0;
423 appdata.packet_in_size = 0;
437 #ifndef RF24ETHERNET_USE_UDP
438 return _uip_udp_conn ? ip_addr_uip(_uip_udp_conn->ripaddr) : IPAddress();
441 if (udpPcb !=
nullptr) {
442 const ip4_addr_t* addr = ip_2_ip4(&udpPcb->remote_ip);
444 ip4_addr_get_byte(addr, 0),
445 ip4_addr_get_byte(addr, 1),
446 ip4_addr_get_byte(addr, 2),
447 ip4_addr_get_byte(addr, 3));
449 return IPAddress {0, 0, 0, 0};
458 #ifndef RF24ETHERNET_USE_UDP
459 return _uip_udp_conn ? ntohs(_uip_udp_conn->rport) : 0;
462 if (udpPcb !=
nullptr) {
463 return udpPcb->remote_port;
475 #ifndef RF24ETHERNET_USE_UDP
476 if (uip_udp_userdata_t* data = (uip_udp_userdata_t*)(uip_udp_conn->appstate))
480 if (data->packet_next == 0)
482 uip_udp_conn->rport =
UDPBUF->srcport;
483 uip_ipaddr_copy(uip_udp_conn->ripaddr,
UDPBUF->srcipaddr);
486 memcpy(RF24Client::all_data[0].myData, uip_appdata, uip_len);
487 data->packet_in_size += uip_len;
490 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(););
493 if (uip_poll() && data->send)
496 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););
498 memcpy(uip_appdata, RF24Client::all_data[0].myData, data->out_pos);
499 uip_udp_send(data->out_pos);
508 #if RF24ETHERNET_USE_UDP
509void RF24UDP::receiveUdp(
void* arg,
struct udp_pcb* pcb,
struct pbuf* p,
const ip_addr_t* addr,
u16_t port)
513 memcpy(&udpDataIn[0], p->payload, p->len);
524void RF24UDP::sendUdp(
void* arg)
527 struct udp_send_ctx* data = (
struct udp_send_ctx*)arg;
529 udp_send(data->pcb, data->p);
533 #ifndef RF24ETHERNET_USE_UDP
534void RF24UDP::_send(uip_udp_userdata_t* data)
540 #ifndef RF24ETHERNET_USE_UDP
541 #if defined(RF24_TAP)
550 RF24EthernetClass::network_send();
556 data->packet_out = 0;
558 IF_RF24ETHERNET_DEBUG_UDP(Serial.println(data->out_pos); Serial.print(F(
"udp, uip_packet to send: "));
for (
int i = 0; i < data->out_pos; i++) { Serial.print((
char)RF24Client::all_data[0].myData[i]); } Serial.println(
""););
560 RF24NetworkHeader headerOut(00, EXTERNAL_DATA_TYPE);
569 udp_recv(udpPcb, receiveUdp,
udpState);
571 pbuf* p = pbuf_alloc(PBUF_RAW, dataOutPos, PBUF_RAM);
573 memcpy(
reinterpret_cast<uint8_t*
>(p->payload), &udpDataOut[0], dataOutPos);