25 #include <zephyr/kernel.h>
26 #include <zephyr/logging/log.h>
27 #include <zephyr/net/net_pkt.h>
28 #include <zephyr/net/net_if.h>
29 #include <zephyr/net/net_core.h>
30 #include <zephyr/net/ethernet.h>
31 #include <zephyr/net/net_ip.h>
33IPAddress RF24EthernetClass::_dnsServerAddress;
36 #include "drivers/net/rf24_netif.h"
39extern "C" int rf24_cpp_tx_frame(
const uint8_t* data,
size_t len)
51uint8_t RF24EthernetClass::networkBuffer[MAX_PAYLOAD_SIZE];
52IPAddress RF24EthernetClass::_dnsServerAddress;
85pbuf* RF24EthernetClass::readRXQueue(EthQueue* RXQueue)
97 pbuf* p = pbuf_alloc(PBUF_IP, frameLen, PBUF_RAM);
100 if (pbuf_take(p, &
RXQueue->data[
RXQueue->nRead], frameLen) == ERR_OK) {
114 return (frame & 0x01) == 0;
123 MIB2_STATS_NETIF_INC(&
Ethernet.myNetif, ifoutucastpkts);
127 MIB2_STATS_NETIF_INC(&
Ethernet.myNetif, ifoutnucastpkts);
130 IPAddress gwIP =
Ethernet.gatewayIP();
131 int16_t nodeAddress = 0;
134 if (
Ethernet.mesh.mesh_address != 0) {
135 if (gwIP[3] != buf[19]) {
136 IPAddress local_ip =
Ethernet.localIP();
137 if (local_ip[0] == buf[16] && local_ip[1] == buf[17]) {
139 nodeAddress =
Ethernet.mesh.getAddress((
char)buf[19]);
140 if (nodeAddress < 0) {
147 IPAddress local_ip =
Ethernet.localIP();
148 if (local_ip[0] == buf[16] && local_ip[1] == buf[17]) {
149 nodeAddress =
Ethernet.mesh.getAddress((
char)buf[19]);
150 if (nodeAddress < 0) {
156 IF_ETH_DEBUG_L1(Serial.print(
"Net: Out "); Serial.println(nodeAddress, OCT););
158 RF24NetworkHeader headerOut(nodeAddress, EXTERNAL_DATA_TYPE);
160 if (total_len && total_len <= MAX_PAYLOAD_SIZE) {
169 void* context = netif->state;
170 uint16_t total_len = p->tot_len;
172 if (p->tot_len >
Ethernet.MAX_FRAME_SIZE)
174 MIB2_STATS_NETIF_INC(netif, ifoutdiscards);
177 if (p->tot_len <
Ethernet.MIN_FRAME_SIZE)
179 total_len =
Ethernet.MIN_FRAME_SIZE;
187 MIB2_STATS_NETIF_INC(netif, ifoutdiscards);
192 pbuf_copy_partial(p, queue.data[slot], p->tot_len, 0);
193 memset(&queue.data[slot][p->tot_len], 0, total_len - p->tot_len);
194 queue.
len[slot] = total_len;
198 LINK_STATS_INC(link.xmit);
199 MIB2_STATS_NETIF_ADD(netif, ifoutoctets, p->tot_len);
226 return netif->linkoutput(netif, p);
234 myNetif->name[0] =
'e';
235 myNetif->name[1] =
'0';
238 myNetif->mtu = MAX_PAYLOAD_SIZE;
239 myNetif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_IGMP | NETIF_FLAG_MLD6 | NETIF_FLAG_LINK_UP;
240 myNetif->hostname =
"TmrNet";
241 MIB2_INIT_NETIF(&
Ethernet.myNetif, snmp_ifType_ppp,
Ethernet.NetIF_Speed_BPS);
243 myNetif->hwaddr_len = 0;
247 netif_set_link_up(myNetif);
254#if !defined NRF52_RADIO_LIBRARY
255 #if defined(RF24_TAP)
263 isInitialized =
false;
275 isInitialized =
false;
281 #if defined(RF24_TAP)
289 isInitialized =
false;
301 isInitialized =
false;
328 const uint8_t mac[6] = {0x52, 0x46, 0x32, 0x34, (uint8_t)address, (uint8_t)(address >> 8)};
339 RF24_Channel = RF24_Channel ? RF24_Channel : 97;
340 network.begin(RF24_Channel, address);
347 RF24_Channel = channel;
349 radio.setChannel(RF24_Channel);
357 IPAddress dns = {8, 8, 8, 8};
365 IPAddress gateway = ip;
367 begin(ip, dns, gateway);
374 IPAddress subnet(255, 255, 255, 0);
375 begin(ip, dns, gateway, subnet);
382 configure(ip, dns, gateway, subnet);
387void RF24EthernetClass::configure(IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet)
389#if !defined(RF24_TAP)
390 mesh.setNodeID(ip[3]);
394 uip_buf = (uint8_t*)&
network.frag_ptr->message_buffer[0];
398 uip_sethostaddr(ipaddr);
400 uip_setdraddr(ipaddr);
402 uip_setnetmask(ipaddr);
403 _dnsServerAddress = dns;
407 #if defined(RF24_TAP)
408 timer_set(&this->arp_timer, CLOCK_SECOND * 2);
412 #if defined(RF24_TAP)
420 RF24Client::clientConnectionTimeout = 0;
421 RF24Client::serverConnectionTimeout = 30000;
423 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING && defined ESP32
425 esp_err_t err = esp_wifi_get_mode(&mode);
432 #elif defined RF24ETHERNET_CORE_REQUIRES_LOCKING
436 ip4_addr_t myIp, myMask, myGateway;
437 IP4_ADDR(&myIp, ip[0], ip[1], ip[2], ip[3]);
438 IP4_ADDR(&myMask, subnet[0], subnet[1], subnet[2], subnet[3]);
439 IP4_ADDR(&myGateway, gateway[0], gateway[1], gateway[2], gateway[3]);
440 _dnsServerAddress = dns;
442 void* context =
nullptr;
443 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
445 ETHERNET_APPLY_LOCK();
448 netif_add(&
Ethernet.myNetif, &myIp, &myMask, &myGateway, context,
netif_init, ip_input);
449 netif_set_default(&
Ethernet.myNetif);
451 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
453 ETHERNET_REMOVE_LOCK();
459 struct net_if* iface = rf24_netif_get_iface();
465 struct in_addr my_ip, netmask, gw;
467 my_ip.s_addr = (uint32_t)ip;
468 netmask.s_addr = (uint32_t)subnet;
469 gw.s_addr = (uint32_t)gateway;
475 net_if_ipv4_addr_add(iface, &my_ip, NET_ADDR_MANUAL, 0);
476 net_if_ipv4_set_netmask_by_addr(iface, &my_ip, &netmask);
477 net_if_ipv4_set_gw(iface, &gw);
479 int ret = net_if_up(iface);
480 if (ret < 0 && ret != -EALREADY) {
488 _dnsServerAddress = dns;
489 isInitialized =
true;
490 RF24Client::serverConnectionTimeout = 30000;
502 uip_setdraddr(ipaddr);
505 IP4_ADDR(&new_gw, gwIP[0], gwIP[1], gwIP[2], gwIP[3]);
506 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
508 ETHERNET_APPLY_LOCK();
511 netif_set_gw(&
Ethernet.myNetif, &new_gw);
512 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
514 ETHERNET_REMOVE_LOCK();
519 struct net_if* iface = rf24_netif_get_iface();
526 net_if_ipv4_set_gw(iface, &gate);
536 uip_listen(
HTONS(port));
539 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
541 ETHERNET_APPLY_LOCK();
544 RF24Client::myPcb = tcp_new();
547 err_t err = tcp_bind(RF24Client::myPcb, IP_ADDR_ANY, port);
555 RF24Client::myPcb = tcp_listen(RF24Client::myPcb);
558 tcp_accept(RF24Client::myPcb, RF24Client::accept);
560 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
562 ETHERNET_REMOVE_LOCK();
581 const ip4_addr_t* ip_addr = netif_ip4_addr(&
myNetif);
582 return (IPAddress(ip_addr->addr));
589 return IPAddress {0, 0, 0, 0};
603 const ip4_addr_t* ip_addr = netif_ip4_netmask(&
myNetif);
604 return (IPAddress(ip_addr->addr));
606 return IPAddress {0, 0, 0, 0};
609 struct net_if* iface = rf24_netif_get_iface();
612 return IPAddress {0, 0, 0, 0};
615 struct in_addr my_ip;
617 struct in_addr mask = net_if_ipv4_get_netmask_by_addr(iface, &my_ip);
634 const ip4_addr_t* ip_addr = netif_ip4_gw(&
myNetif);
635 return (IPAddress(ip_addr->addr));
637 return IPAddress {0, 0, 0, 0};
639 struct net_if* iface = rf24_netif_get_iface();
642 return IPAddress {0, 0, 0, 0};
645 return net_if_ipv4_get_gw(iface).s_addr;
654 return _dnsServerAddress;
660void RF24EthernetClass::EthRX_Handler(
const uint8_t* ethFrame,
const uint16_t lenEthFrame)
662 LINK_STATS_INC(link.recv);
663 MIB2_STATS_NETIF_ADD(&
Ethernet.myNetif, ifinoctets, lenEthFrame);
664 if (
Ethernet.isUnicast(ethFrame[0]))
666 MIB2_STATS_NETIF_INC(&
Ethernet.myNetif, ifinucastpkts);
670 MIB2_STATS_NETIF_INC(&
Ethernet.myNetif, ifinnucastpkts);
680void RF24EthernetClass::tick()
683#if defined __ZEPHYR__
685#elif defined ARDUINO_ARCH_ESP32
686 const TickType_t xDelay = pdMS_TO_TICKS(1);
688#elif defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_ARCH_NRF52) || defined ARDUINO_ARCH_RP2350 || defined ARDUINO_NRF54L15
695 if (
Ethernet.mesh.mesh_address == 0) {
699 if (
result == EXTERNAL_DATA_TYPE) {
704 else if (
result == NETWORK_CORRUPTION) {
708 #if !defined(RF24_TAP)
715 else if (timer_expired(&
Ethernet.periodic_timer)) {
716 timer_reset(&
Ethernet.periodic_timer);
717 for (
int i = 0; i < UIP_CONNS; i++) {
729 if (
BUF->type == htons(UIP_ETHTYPE_IP)) {
740 else if (
BUF->type == htons(UIP_ETHTYPE_ARP)) {
750 else if (timer_expired(&
Ethernet.periodic_timer)) {
751 timer_reset(&
Ethernet.periodic_timer);
752 for (
int i = 0; i < UIP_CONNS; i++) {
764 for (
int i = 0; i < UIP_UDP_CONNS; i++) {
772 RF24UDP::_send((uip_udp_userdata_t*)(uip_udp_conns[i].appstate));
776 #if defined(RF24_TAP)
779 if (timer_expired(&
Ethernet.arp_timer)) {
790 if (
Ethernet.mesh.mesh_address == 0) {
794 if (
result == EXTERNAL_DATA_TYPE) {
798 Ethernet.EthRX_Handler(networkBuffer, len);
803 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
805 ETHERNET_APPLY_LOCK();
808 sys_check_timeouts();
810 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
812 ETHERNET_REMOVE_LOCK();
816 pbuf* p = readRXQueue(&
RXQueue);
820 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
822 ETHERNET_APPLY_LOCK();
827 LWIP_DEBUGF(NETIF_DEBUG, (
"IP input error\r\n"));
834 #if defined RF24ETHERNET_CORE_REQUIRES_LOCKING
836 ETHERNET_REMOVE_LOCK();
846 if (
Ethernet.mesh.mesh_address == 0) {
850 if (
result == EXTERNAL_DATA_TYPE) {
852 if (len == 0 || len > MAX_PAYLOAD_SIZE) {
864void RF24EthernetClass::network_send()
868 IPAddress gwIP =
Ethernet.gatewayIP();
869 int16_t nodeAddress = 0;
872 if (
Ethernet.mesh.mesh_address != 0) {
873 if (gwIP[3] != uip_buf[19]) {
874 IPAddress local_ip =
Ethernet.localIP();
875 if (local_ip[0] == uip_buf[16] && local_ip[1] == uip_buf[17]) {
877 nodeAddress =
Ethernet.mesh.getAddress((
char)uip_buf[19]);
878 if (nodeAddress < 0) {
885 IPAddress local_ip =
Ethernet.localIP();
886 if (local_ip[0] == uip_buf[16] && local_ip[1] == uip_buf[17]) {
887 nodeAddress =
Ethernet.mesh.getAddress((
char)uip_buf[19]);
888 if (nodeAddress < 0) {
893 RF24NetworkHeader headerOut(nodeAddress, EXTERNAL_DATA_TYPE);
895 #if defined ETH_DEBUG_L1 || defined ETH_DEBUG_L2
899 Serial.print(millis());
900 Serial.println(F(
" *** RF24Ethernet Network Write Fail ***"));
906 #if defined ETH_DEBUG_L2
909 Serial.print(millis());
910 Serial.println(F(
" RF24Ethernet Network Write OK"));
920int RF24EthernetClass::sendFrame(
const uint8_t* data,
size_t len)
924 if (!data || !len || !isInitialized) {
928 IPAddress gwIP =
Ethernet.gatewayIP();
930 int16_t nodeAddress = 0;
931 const uint8_t* buf = data;
933 if (
Ethernet.mesh.mesh_address != 0) {
934 if (gwIP[3] != buf[19]) {
935 IPAddress local_ip =
Ethernet.localIP();
936 if (local_ip[0] == buf[16] && local_ip[1] == buf[17]) {
938 nodeAddress =
Ethernet.mesh.getAddress((
char)buf[19]);
939 if (nodeAddress < 0) {
946 IPAddress local_ip =
Ethernet.localIP();
948 if (local_ip[0] == buf[16] && local_ip[1] == buf[17]) {
949 nodeAddress =
Ethernet.mesh.getAddress((
char)buf[19]);
950 if (nodeAddress < 0) {
956 memcpy(outputBuffer, data, len);
957 RF24NetworkHeader headerOut(nodeAddress, EXTERNAL_DATA_TYPE);
#define ETHERNET_TX_BARRIER()
#define INCOMING_DATA_SIZE
err_t tun_netif_output(struct netif *netif, struct pbuf *p, const ip4_addr_t *ipaddr)
err_t netif_init(struct netif *myNetif)
static void sendFrameToRadio(const char *buf, uint16_t total_len)
err_t netif_output(struct netif *netif, struct pbuf *p)
#define uip_ip_addr(addr, ip)
#define uip_seteth_addr(eaddr)
RF24EthernetClass RF24Ethernet
static void error_callback(void *arg, err_t err)
static ConnectState * gState[2]
uint32_t networkCorruption
void setMac(uint16_t address)
void setChannel(uint8_t channel)
static void sendQueuedFrame()
static void writeRXQueue(EthQueue *RXQueue, const uint8_t *ethFrame, uint16_t lenEthFrame)
static void initRXQueue(EthQueue *RXQueue)
void listen(uint16_t port)
static EthTxQueue TXQueue
void set_gateway(IPAddress gwIP)
static constexpr unsigned MAX_FRAME_SIZE
static bool isUnicast(const uint8_t frame)
static constexpr unsigned MAX_RX_QUEUE
static constexpr unsigned MAX_TX_QUEUE
void begin(IP_ADDR myIP, IP_ADDR subnet)
static bool useCoreLocking
#define IF_RF24ETHERNET_DEBUG_CLIENT(x)
#define IF_ETH_DEBUG_L1(x)
#define UIP_TIMER_DIVISOR
Adjust the rate at which the IP stack performs periodic processing.
uint16_t len[MAX_RX_QUEUE]
uint16_t len[MAX_TX_QUEUE]