Skip to content

3.0.0 Network Refactoring #8760

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 59 commits into from
Mar 26, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
ca7ec90
Create ESP_NetworkInterface class and have Ethernet extending it
me-no-dev Oct 13, 2023
e42b99a
Update CMakeLists.txt
me-no-dev Oct 18, 2023
044da55
Merge branch 'master' into feature/network_refactoring
me-no-dev Oct 18, 2023
f2824bc
Merge branch 'master' into feature/network_refactoring
me-no-dev Oct 23, 2023
74a18b6
Merge branch 'master' into feature/network_refactoring
me-no-dev Oct 23, 2023
0e6d289
Merge branch 'master' into feature/network_refactoring
me-no-dev Oct 24, 2023
0c561bc
Split networking from WiFi (H2 can now use Ethernet)
me-no-dev Oct 27, 2023
0edaa59
Fix build errors
me-no-dev Oct 27, 2023
dfc59e7
Guard WiFi classes and fix RMII ETH examples
me-no-dev Oct 27, 2023
da4d198
Decouple network related libraries from WiFi
me-no-dev Oct 31, 2023
105c739
Fix examples and WiFiUpdate
me-no-dev Oct 31, 2023
44f899f
Guard WiFiProv lib to compile only on WiFi chips
me-no-dev Oct 31, 2023
f4d8cba
Merge branch 'master' into feature/network_refactoring
me-no-dev Nov 9, 2023
78cc5ec
Merge branch 'master' into feature/network_refactoring
me-no-dev Nov 10, 2023
61b8675
Merge branch 'master' into feature/network_refactoring
me-no-dev Nov 10, 2023
4f087ee
Merge branch 'master' into feature/network_refactoring
me-no-dev Nov 10, 2023
638abc3
Add periman string for network and "fix" mdns on the first ETH
me-no-dev Nov 10, 2023
7f4b1ec
Revert back location of Client/Server/Udp in order to accept some PRs
me-no-dev Nov 13, 2023
3a83cfa
Merge branch 'master' into feature/network_refactoring
me-no-dev Nov 27, 2023
c8a4d5a
Fix periman
me-no-dev Nov 27, 2023
8ace49a
Merge branch 'master' into feature/network_refactoring
me-no-dev Nov 29, 2023
102a776
Merge branch 'master' into feature/network_refactoring
me-no-dev Dec 15, 2023
864cec1
Merge branch 'master' into feature/network_refactoring
me-no-dev Jan 24, 2024
ae2a889
Some fixes from merging master
me-no-dev Jan 24, 2024
824d2a0
Fix web server missing fs.h
me-no-dev Jan 24, 2024
2085bbe
Move Client, Server and Udp out of WiFi
me-no-dev Jan 24, 2024
8c5ae3c
More fixes
me-no-dev Jan 24, 2024
ea1717b
more fixes
me-no-dev Jan 24, 2024
a8b19cd
Merge branch 'master' into feature/network_refactoring
me-no-dev Feb 1, 2024
09910c4
Fix CMakekLists and rework lib menu dependencies
me-no-dev Feb 1, 2024
2711182
Fix CMake issues
me-no-dev Feb 1, 2024
050a267
move back WiFiClient to rebase with master
me-no-dev Feb 22, 2024
43e0564
Merge branch 'master' into feature/network_refactoring
me-no-dev Feb 22, 2024
c44d255
Update ETH_TLK110.ino
me-no-dev Feb 22, 2024
1c580b8
Move back WiFiClient
me-no-dev Feb 22, 2024
f223ce0
Merge branch 'master' into feature/network_refactoring
me-no-dev Feb 28, 2024
6ce26e9
Merge branch 'master' into feature/network_refactoring
lucasssvaz Mar 1, 2024
6691cdb
Merge branch 'master' into feature/network_refactoring
me-no-dev Mar 1, 2024
9716d5d
Merge branch 'master' into feature/network_refactoring
me-no-dev Mar 18, 2024
bcc8e3d
Update progress
me-no-dev Mar 19, 2024
9bd5205
Update WiFiGeneric.cpp
me-no-dev Mar 19, 2024
1f5b81d
More fixes
me-no-dev Mar 19, 2024
1e6725a
Switch AP to the new interface
me-no-dev Mar 19, 2024
d8d2f09
Cleanup
me-no-dev Mar 19, 2024
4127270
Rename AP methods
me-no-dev Mar 19, 2024
bf97e36
Add extra interface info for Printable
me-no-dev Mar 19, 2024
7afd573
Rename IPv6 getters to clarify that they are returning LinkLocal address
me-no-dev Mar 20, 2024
cc5765f
Rename network classes
me-no-dev Mar 20, 2024
0ec3884
Update NetworkManager.h
me-no-dev Mar 20, 2024
a39dcfd
Rename WiFi Server and UDP
me-no-dev Mar 21, 2024
df90716
Rename WiFiClient and WiFiClientSecure
me-no-dev Mar 21, 2024
9db3df9
Update CMakeLists.txt
me-no-dev Mar 21, 2024
224e5eb
Update on-push.sh
me-no-dev Mar 21, 2024
c3efaa5
Rename Network library
me-no-dev Mar 21, 2024
29ab925
Remove unnecessary guard
me-no-dev Mar 25, 2024
d5d59d3
Merge branch 'master' into feature/network_refactoring
me-no-dev Mar 25, 2024
8f79cde
Get the correct interface MAC address for mDND Workstation service
me-no-dev Mar 25, 2024
7e893e9
Apply suggestions from code review
me-no-dev Mar 25, 2024
fb0041c
Merge branch 'master' into feature/network_refactoring
me-no-dev Mar 26, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Update progress
  • Loading branch information
me-no-dev committed Mar 19, 2024
commit bcc8e3dd52c8c72e4df9d1bde3c61ca19ac6edf8
3 changes: 2 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,8 @@ set(ARDUINO_LIBRARY_WiFi_SRCS
libraries/WiFi/src/WiFiGeneric.cpp
libraries/WiFi/src/WiFiMulti.cpp
libraries/WiFi/src/WiFiScan.cpp
libraries/WiFi/src/WiFiSTA.cpp)
libraries/WiFi/src/WiFiSTA.cpp
libraries/WiFi/src/STA.cpp)

set(ARDUINO_LIBRARY_WiFiProv_SRCS libraries/WiFiProv/src/WiFiProv.cpp)

Expand Down
65 changes: 22 additions & 43 deletions libraries/Ethernet/src/ETH.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,10 @@ static void onEthConnected(arduino_event_id_t event, arduino_event_info_t info)
}
}
if(index == 3){
log_e("Could not find ETH interface with that handle!");
return;
}
if (Network.getStatusBits() & ETH_WANT_IP6_BIT(index)){
if (_ethernets[index]->getStatusBits() & ESP_NETIF_WANT_IP6_BIT){
esp_err_t err = esp_netif_create_ip6_linklocal(_ethernets[index]->netif());
if(err != ESP_OK){
log_e("Failed to enable IPv6 Link Local on ETH: [%d] %s", err, esp_err_to_name(err));
Expand All @@ -83,34 +84,10 @@ static void onEthConnected(arduino_event_id_t event, arduino_event_info_t info)
}
}

esp_eth_handle_t ETHClass::handle(){
esp_eth_handle_t ETHClass::handle() const {
return _eth_handle;
}

bool ETHClass::connected()
{
return Network.getStatusBits() & ETH_CONNECTED_BIT(_eth_index);
}

bool ETHClass::started()
{
return Network.getStatusBits() & ETH_STARTED_BIT(_eth_index);
}

bool ETHClass::enableIPv6(bool en)
{
// if(_esp_netif == NULL){
// return false;
// }
if (en) {
Network.setStatusBits(ETH_WANT_IP6_BIT(_eth_index));
} else {
Network.clearStatusBits(ETH_WANT_IP6_BIT(_eth_index));
}
return true;
// return esp_netif_create_ip6_linklocal(_esp_netif) == 0;
}

void ETHClass::_onEthEvent(int32_t event_id, void* event_data){
arduino_event_t arduino_event;
arduino_event.event_id = ARDUINO_EVENT_MAX;
Expand All @@ -119,19 +96,19 @@ void ETHClass::_onEthEvent(int32_t event_id, void* event_data){
log_v("%s Connected", desc());
arduino_event.event_id = ARDUINO_EVENT_ETH_CONNECTED;
arduino_event.event_info.eth_connected = handle();
Network.setStatusBits(ETH_CONNECTED_BIT(_eth_index));
setStatusBits(ESP_NETIF_CONNECTED_BIT);
} else if (event_id == ETHERNET_EVENT_DISCONNECTED) {
log_v("%s Disconnected", desc());
arduino_event.event_id = ARDUINO_EVENT_ETH_DISCONNECTED;
Network.clearStatusBits(ETH_CONNECTED_BIT(_eth_index) | ETH_HAS_IP_BIT(_eth_index) | ETH_HAS_IP6_BIT(_eth_index));
clearStatusBits(ESP_NETIF_CONNECTED_BIT | ESP_NETIF_HAS_IP_BIT | ESP_NETIF_HAS_LOCAL_IP6_BIT | ESP_NETIF_HAS_GLOBAL_IP6_BIT);
} else if (event_id == ETHERNET_EVENT_START) {
log_v("%s Started", desc());
arduino_event.event_id = ARDUINO_EVENT_ETH_START;
Network.setStatusBits(ETH_STARTED_BIT(_eth_index));
setStatusBits(ESP_NETIF_STARTED_BIT);
} else if (event_id == ETHERNET_EVENT_STOP) {
log_v("%s Stopped", desc());
arduino_event.event_id = ARDUINO_EVENT_ETH_STOP;
Network.clearStatusBits(ETH_STARTED_BIT(_eth_index) | ETH_CONNECTED_BIT(_eth_index) | ETH_HAS_IP_BIT(_eth_index) | ETH_HAS_IP6_BIT(_eth_index));
clearStatusBits(ESP_NETIF_STARTED_BIT | ESP_NETIF_CONNECTED_BIT | ESP_NETIF_HAS_IP_BIT | ESP_NETIF_HAS_LOCAL_IP6_BIT | ESP_NETIF_HAS_GLOBAL_IP6_BIT);
}

if(arduino_event.event_id < ARDUINO_EVENT_MAX){
Expand Down Expand Up @@ -332,7 +309,7 @@ bool ETHClass::begin(eth_phy_type_t type, int32_t phy_addr, int mdc, int mdio, i
if(!perimanSetPinBus(_pin_power, ESP32_BUS_TYPE_ETHERNET_PWR, (void *)(this), -1, -1)){ goto err; }
}

Network.onEvent(onEthConnected, ARDUINO_EVENT_ETH_CONNECTED);
Network.onSysEvent(onEthConnected, ARDUINO_EVENT_ETH_CONNECTED);

// holds a few milliseconds to let DHCP start and enter into a good state
// FIX ME -- adresses issue https://github.com/espressif/arduino-esp32/issues/5733
Expand Down Expand Up @@ -740,7 +717,7 @@ bool ETHClass::beginSPI(eth_phy_type_t type, int32_t phy_addr, int cs, int irq,
if(!perimanSetPinBus(_pin_rst, ESP32_BUS_TYPE_ETHERNET_SPI, (void *)(this), -1, -1)){ goto err; }
}

Network.onEvent(onEthConnected, ARDUINO_EVENT_ETH_CONNECTED);
Network.onSysEvent(onEthConnected, ARDUINO_EVENT_ETH_CONNECTED);

return true;

Expand Down Expand Up @@ -835,7 +812,7 @@ void ETHClass::end(void)
}
}

bool ETHClass::fullDuplex()
bool ETHClass::fullDuplex() const
{
if(_eth_handle == NULL){
return false;
Expand All @@ -845,7 +822,7 @@ bool ETHClass::fullDuplex()
return (link_duplex == ETH_DUPLEX_FULL);
}

bool ETHClass::autoNegotiation()
bool ETHClass::autoNegotiation() const
{
if(_eth_handle == NULL){
return false;
Expand All @@ -855,7 +832,7 @@ bool ETHClass::autoNegotiation()
return auto_nego;
}

uint32_t ETHClass::phyAddr()
uint32_t ETHClass::phyAddr() const
{
if(_eth_handle == NULL){
return 0;
Expand All @@ -865,7 +842,7 @@ uint32_t ETHClass::phyAddr()
return phy_addr;
}

uint8_t ETHClass::linkSpeed()
uint8_t ETHClass::linkSpeed() const
{
if(_eth_handle == NULL){
return 0;
Expand All @@ -882,17 +859,19 @@ uint8_t ETHClass::linkSpeed()
// }
// }

void ETHClass::printDriverInfo(Print & out){
out.print(",");
out.print(linkSpeed());
out.print("M");
size_t ETHClass::printDriverInfo(Print & out) const {
size_t bytes = 0;
bytes += out.print(",");
bytes += out.print(linkSpeed());
bytes += out.print("M");
if(fullDuplex()){
out.print(",FULL_DUPLEX");
bytes += out.print(",FULL_DUPLEX");
}
if(autoNegotiation()){
out.print(",AUTO");
bytes += out.print(",AUTO");
}
out.printf(",ADDR:0x%lX", phyAddr());
bytes += out.printf(",ADDR:0x%lX", phyAddr());
return bytes;
}

ETHClass ETH;
19 changes: 7 additions & 12 deletions libraries/Ethernet/src/ETH.h
Original file line number Diff line number Diff line change
Expand Up @@ -136,19 +136,14 @@ class ETHClass: public ESP_Network_Interface {
}

void end();
bool enableIPv6(bool en=true);

// Event based getters
bool connected();
bool started();

// ETH Handle APIs
bool fullDuplex();
uint8_t linkSpeed();
bool autoNegotiation();
uint32_t phyAddr();
bool fullDuplex() const;
uint8_t linkSpeed() const;
bool autoNegotiation() const;
uint32_t phyAddr() const;

esp_eth_handle_t handle();
esp_eth_handle_t handle() const;

#if ETH_SPI_SUPPORTS_CUSTOM
static esp_err_t _eth_spi_read(void *ctx, uint32_t cmd, uint32_t addr, void *data, uint32_t data_len);
Expand All @@ -162,8 +157,8 @@ class ETHClass: public ESP_Network_Interface {
#endif

// void getMac(uint8_t* mac);
void printDriverInfo(Print & out);
static void eth_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data);
size_t printDriverInfo(Print & out) const;
// static void eth_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data);

public:
void _onEthEvent(int32_t event_id, void* event_data);
Expand Down
126 changes: 79 additions & 47 deletions libraries/Networking/src/ESP_Network_Events.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ static void _network_event_task(void * arg){

ESP_Network_Events::ESP_Network_Events()
: _arduino_event_group(NULL)
, _arduino_event_group_h(NULL)
, _arduino_event_queue(NULL)
, _arduino_event_task_handle(NULL)
{}
Expand All @@ -41,10 +40,6 @@ ESP_Network_Events::~ESP_Network_Events(){
vEventGroupDelete(_arduino_event_group);
_arduino_event_group = NULL;
}
if(_arduino_event_group_h != NULL){
vEventGroupDelete(_arduino_event_group_h);
_arduino_event_group_h = NULL;
}
if(_arduino_event_queue != NULL){
arduino_event_t *event = NULL;
while(xQueueReceive(_arduino_event_queue, &event, 0) == pdTRUE){
Expand All @@ -66,13 +61,6 @@ bool ESP_Network_Events::initNetworkEvents(){
}
xEventGroupSetBits(_arduino_event_group, _initial_bits);
}
if(!_arduino_event_group_h){
_arduino_event_group_h = xEventGroupCreate();
if(!_arduino_event_group_h){
log_e("Network Event Group 2 Create Failed!");
return false;
}
}

if(!_arduino_event_queue){
_arduino_event_queue = xQueueCreate(32, sizeof(arduino_event_t*));
Expand Down Expand Up @@ -189,6 +177,48 @@ network_event_handle_t ESP_Network_Events::onEvent(NetworkEventSysCb cbEvent, ar
return newEventHandler.id;
}

network_event_handle_t ESP_Network_Events::onSysEvent(NetworkEventCb cbEvent, arduino_event_id_t event)
{
if(!cbEvent) {
return 0;
}
NetworkEventCbList_t newEventHandler;
newEventHandler.cb = cbEvent;
newEventHandler.fcb = NULL;
newEventHandler.scb = NULL;
newEventHandler.event = event;
cbEventList.insert(cbEventList.begin(), newEventHandler);
return newEventHandler.id;
}

network_event_handle_t ESP_Network_Events::onSysEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event)
{
if(!cbEvent) {
return 0;
}
NetworkEventCbList_t newEventHandler;
newEventHandler.cb = NULL;
newEventHandler.fcb = cbEvent;
newEventHandler.scb = NULL;
newEventHandler.event = event;
cbEventList.insert(cbEventList.begin(), newEventHandler);
return newEventHandler.id;
}

network_event_handle_t ESP_Network_Events::onSysEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event)
{
if(!cbEvent) {
return 0;
}
NetworkEventCbList_t newEventHandler;
newEventHandler.cb = NULL;
newEventHandler.fcb = NULL;
newEventHandler.scb = cbEvent;
newEventHandler.event = event;
cbEventList.insert(cbEventList.begin(), newEventHandler);
return newEventHandler.id;
}

void ESP_Network_Events::removeEvent(NetworkEventCb cbEvent, arduino_event_id_t event)
{
if(!cbEvent) {
Expand All @@ -203,6 +233,27 @@ void ESP_Network_Events::removeEvent(NetworkEventCb cbEvent, arduino_event_id_t
}
}

template<typename T, typename... U>
static size_t getStdFunctionAddress(std::function<T(U...)> f) {
typedef T(fnType)(U...);
fnType ** fnPointer = f.template target<fnType*>();
return (size_t) *fnPointer;
}

void ESP_Network_Events::removeEvent(NetworkEventFuncCb cbEvent, arduino_event_id_t event)
{
if(!cbEvent) {
return;
}

for(uint32_t i = 0; i < cbEventList.size(); i++) {
NetworkEventCbList_t entry = cbEventList[i];
if(getStdFunctionAddress(entry.fcb) == getStdFunctionAddress(cbEvent) && entry.event == event) {
cbEventList.erase(cbEventList.begin() + i);
}
}
}

void ESP_Network_Events::removeEvent(NetworkEventSysCb cbEvent, arduino_event_id_t event)
{
if(!cbEvent) {
Expand Down Expand Up @@ -232,62 +283,42 @@ int ESP_Network_Events::setStatusBits(int bits){
_initial_bits |= bits;
return _initial_bits;
}
int l=bits & 0x00FFFFFF, h=(bits & 0xFF000000) >> 24;
if(l){
l = xEventGroupSetBits(_arduino_event_group, l);
}
if(h){
h = xEventGroupSetBits(_arduino_event_group_h, h);
}
return l | (h << 24);
return xEventGroupSetBits(_arduino_event_group, bits);
}

int ESP_Network_Events::clearStatusBits(int bits){
if(!_arduino_event_group){
_initial_bits &= ~bits;
return _initial_bits;
}
int l=bits & 0x00FFFFFF, h=(bits & 0xFF000000) >> 24;
if(l){
l = xEventGroupClearBits(_arduino_event_group, l);
}
if(h){
h = xEventGroupClearBits(_arduino_event_group_h, h);
}
return l | (h << 24);
return xEventGroupClearBits(_arduino_event_group, bits);
}

int ESP_Network_Events::getStatusBits(){
if(!_arduino_event_group){
return _initial_bits;
}
return xEventGroupGetBits(_arduino_event_group) | (xEventGroupGetBits(_arduino_event_group_h) << 24);
return xEventGroupGetBits(_arduino_event_group);
}

int ESP_Network_Events::waitStatusBits(int bits, uint32_t timeout_ms){
if(!_arduino_event_group){
return 0;
}
int l=bits & 0x00FFFFFF, h=(bits & 0xFF000000) >> 24;
if(l){
l = xEventGroupWaitBits(
_arduino_event_group, // The event group being tested.
l, // The bits within the event group to wait for.
pdFALSE, // bits should be cleared before returning.
pdTRUE, // Don't wait for all bits, any bit will do.
timeout_ms / portTICK_PERIOD_MS ) & l; // Wait a maximum of timeout_ms for any bit to be set.
}
if(h){
h = xEventGroupWaitBits(
_arduino_event_group, // The event group being tested.
h, // The bits within the event group to wait for.
pdFALSE, // bits should be cleared before returning.
pdTRUE, // Don't wait for all bits, any bit will do.
timeout_ms / portTICK_PERIOD_MS ) & h; // Wait a maximum of timeout_ms for any bit to be set.
}
return l | (h << 24);
return xEventGroupWaitBits(
_arduino_event_group, // The event group being tested.
bits, // The bits within the event group to wait for.
pdFALSE, // bits should be cleared before returning.
pdTRUE, // Don't wait for all bits, any bit will do.
timeout_ms / portTICK_PERIOD_MS ) & bits; // Wait a maximum of timeout_ms for any bit to be set.
}

/**
* @brief Convert arduino_event_id_t to a C string.
* @param [in] id The event id to be converted.
* @return A string representation of the event id.
* @note: arduino_event_id_t values as of Mar 2023 (arduino-esp32 r2.0.7) are: 0-39 (ARDUINO_EVENT_MAX=40) and are defined in WiFiGeneric.h.
*/
const char * ESP_Network_Events::eventName(arduino_event_id_t id) {
switch(id) {
case ARDUINO_EVENT_ETH_START: return "ETH_START";
Expand All @@ -306,6 +337,7 @@ const char * ESP_Network_Events::eventName(arduino_event_id_t id) {
// case ARDUINO_EVENT_PPP_LOST_IP: return "PPP_LOST_IP";
// case ARDUINO_EVENT_PPP_GOT_IP6: return "PPP_GOT_IP6";
#if SOC_WIFI_SUPPORTED
case ARDUINO_EVENT_WIFI_OFF: return "WIFI_OFF";
case ARDUINO_EVENT_WIFI_READY: return "WIFI_READY";
case ARDUINO_EVENT_WIFI_SCAN_DONE: return "SCAN_DONE";
case ARDUINO_EVENT_WIFI_STA_START: return "STA_START";
Expand Down
Loading