Skip to content

Commit

Permalink
lwip2: fix static address management (#4677)
Browse files Browse the repository at this point in the history
+ interactive example (for debugging)
  • Loading branch information
d-a-v authored May 1, 2018
1 parent 758b0bd commit 76a14b1
Show file tree
Hide file tree
Showing 9 changed files with 131 additions and 6 deletions.
91 changes: 91 additions & 0 deletions libraries/esp8266/examples/interactive/interactive.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@

/*
Interactive script meant for debugging only
Run it on serial console and keep this source file opened for the list of commands
Please configure SSID, PSK and IPAddresses below to fit with your network
Released to public domain
*/

#include "ESP8266WiFi.h"
#include "user_interface.h"

const char SSID[] = "open";
const char PSK[] = "";

IPAddress staticip(192, 168, 1, 123);
IPAddress gateway(192, 168, 1, 254);
IPAddress subnet(255, 255, 255, 0);

void setup() {
Serial.begin(115200);
Serial.setDebugOutput(true);

WiFi.mode(WIFI_STA);
WiFi.begin(SSID, PSK);
Serial.println("connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println(WiFi.localIP());
Serial.print(
"WL_IDLE_STATUS = 0\n"
"WL_NO_SSID_AVAIL = 1\n"
"WL_SCAN_COMPLETED = 2\n"
"WL_CONNECTED = 3\n"
"WL_CONNECT_FAILED = 4\n"
"WL_CONNECTION_LOST = 5\n"
"WL_DISCONNECTED = 6\n"
);
}

void WiFiOn() {
wifi_fpm_do_wakeup();
wifi_fpm_close();
wifi_set_opmode(STATION_MODE);
wifi_station_connect();
}

void WiFiOff() {
wifi_station_disconnect();
wifi_set_opmode(NULL_MODE);
wifi_set_sleep_type(MODEM_SLEEP_T);
wifi_fpm_open();
wifi_fpm_do_sleep(0xFFFFFFF);
}

void loop() {
#define TEST(name, var, varinit, func) \
static decltype(func) var = (varinit); \
if ((var) != (func)) { var = (func); Serial.printf("**** %s: ", name); Serial.println(var); }

#define DO(x...) Serial.println(F( #x )); x; break

TEST("Free Heap", freeHeap, 0, ESP.getFreeHeap());
TEST("WiFiStatus", status, WL_IDLE_STATUS, WiFi.status());
TEST("STA-IP", localIp, (uint32_t)0, WiFi.localIP());
TEST("AP-IP", apIp, (uint32_t)0, WiFi.softAPIP());

switch (Serial.read()) {
case 'F': DO(WiFiOff());
case 'N': DO(WiFiOn());
case '1': DO(WiFi.mode(WIFI_AP));
case '2': DO(WiFi.mode(WIFI_AP_STA));
case '3': DO(WiFi.mode(WIFI_STA));
case 'R': DO(if (((GPI >> 16) & 0xf) == 1) ESP.reset() /* else must hard reset */);
case 'd': DO(WiFi.disconnect());
case 'b': DO(WiFi.begin());
case 'B': DO(WiFi.begin(SSID, PSK));
case 'r': DO(WiFi.reconnect());
case 'c': DO(wifi_station_connect());
case 'a': DO(WiFi.setAutoReconnect(false));
case 'A': DO(WiFi.setAutoReconnect(true));
case 'n': DO(WiFi.setSleepMode(WIFI_NONE_SLEEP));
case 'l': DO(WiFi.setSleepMode(WIFI_LIGHT_SLEEP));
case 'm': DO(WiFi.setSleepMode(WIFI_MODEM_SLEEP));
case 's': DO(WiFi.config(staticip, gateway, subnet));
case 'D': DO(wifi_station_dhcpc_start());
}
}
Binary file modified tools/sdk/lib/liblwip2.a
Binary file not shown.
Binary file modified tools/sdk/lib/liblwip2_1460.a
Binary file not shown.
10 changes: 10 additions & 0 deletions tools/sdk/lwip2/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,16 @@
all install clean: builder/lwip2-src/README
make -C builder -f Makefile.arduino $@

latestmaster: downloadmaster install

latestupstream: downloadupstream install

downloadupstream: downloadmaster
cd builder/lwip2-src; git checkout master

downloadmaster: download
cd builder; git checkout master

download: builder/lwip2-src/README

builder/lwip2-src/README:
Expand Down
6 changes: 5 additions & 1 deletion tools/sdk/lwip2/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
```make install```: download, compile, install lwip2

```make latestmaster```: download latest lwip2, compile, install

```make latestupstream```: download latest lwip2 and latest upstream lwIP, compile, install

```make download```: download lwIP-2 builder

```make clean```: clean builder only
Expand All @@ -10,4 +14,4 @@ MSS values are in builder/Makefile.arduino

MSS values in boards.txt are only informative

current lwip2 submodule repository: https://github.com/d-a-v/esp82xx-nonos-linklayer/tree/arduino-2.4.0
current lwip2 submodule repository: https://github.com/d-a-v/esp82xx-nonos-linklayer/tree/arduino-2.4.1
10 changes: 10 additions & 0 deletions tools/sdk/lwip2/include/gluedebug.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#ifndef __GLUE_DEBUG_H
#define __GLUE_DEBUG_H

// this file is commonly included by both sides of the glue
/////////////////////////////////////////////////////////////////////////////
// user-definable

Expand All @@ -27,6 +28,15 @@
#define LWIP_DBG_TYPES_ON (LWIP_DBG_ON)
#endif

/////////////////////////////////////////////////////////////////////////////
// packet capture callback from esp side
#include <stdlib.h>

#ifdef __cplusplus
extern "C"
#endif
void (*phy_capture) (int netif_idx, const char* data, size_t len, int out, int success);

/////////////////////////////////////////////////////////////////////////////

#if UDEBUG && UDEBUGSTORE
Expand Down
2 changes: 1 addition & 1 deletion tools/sdk/lwip2/include/lwip-git-hash.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// generated by makefiles/make-lwip2-hash
#ifndef LWIP_HASH_H
#define LWIP_HASH_H
#define LWIP_HASH_STR "STABLE-2_0_3_RELEASE/glue:arduino-2.4.1"
#define LWIP_HASH_STR "STABLE-2_0_3_RELEASE/glue:arduino-2.4.1-7-g2b827f8"
#endif // LWIP_HASH_H
16 changes: 13 additions & 3 deletions tools/sdk/lwip2/include/lwipopts.h
Original file line number Diff line number Diff line change
Expand Up @@ -2688,9 +2688,11 @@
* Return ERR_OK if packet is accepted, any error code otherwise.
* Payload points to ethernet header!
*/
#ifdef __DOXYGEN__
#define LWIP_HOOK_UNKNOWN_ETH_PROTOCOL(pbuf, netif)
#endif
//#ifdef __DOXYGEN__
//#define LWIP_HOOK_UNKNOWN_ETH_PROTOCOL(pbuf, netif)
//#endif
#define LWIP_HOOK_UNKNOWN_ETH_PROTOCOL(pbuf, netif) lwip_unhandled_packet((pbuf), (netif))

/**
* @}
*/
Expand Down Expand Up @@ -3003,4 +3005,12 @@
#include "lwip-git-hash.h"
#include <sys/time.h> // settimeofday() + struct timeval

// allow to handle special packets (user redefinable)
struct pbuf;
struct netif;
#ifndef LWIP_ERR_T
#define LWIP_ERR_T s8
#endif
LWIP_ERR_T lwip_unhandled_packet (struct pbuf* pbuf, struct netif* netif) __attribute__((weak));

#endif // MYLWIPOPTS_H

1 comment on commit 76a14b1

@Rob58329
Copy link

@Rob58329 Rob58329 commented on 76a14b1 Jun 6, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

edit from maintainer: moved to #4792

This commit "lwip2: fix static address management (#4677)" breaks the "WiFi.status()" command after a "WiFi.disconnect()" and "WiFi.begin(ssid,pw)".
(Specifically, the "WiFi.status()==WL_CONNECTED" never returns true after the 1st successful connection & disconnection.)
ie. "git checkout 758b0bd" WORKS
but "git checkout 76a14b1" FAILS

My setup is Arduino-IDE using Github-ESP8266 code, with a D1-Mini-ESP8266
Test code is show below:

const char* ssid="your_ssid"; const char* pw="your_password"; // details for your router
#include <ESP8266WiFi.h>
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA); delay(5);
WiFi.disconnect(); delay(5); // disconnect any existing [WIFI_STA] connection

delay(3000); Serial.println(); Serial.println("TEST SKETCH");
if (Connect_wifi()) Disconnect_wifi(); // this works fine

Serial.println("Please wait until 2nd try..."); delay(5000);
if (Connect_wifi()) Disconnect_wifi(); // this fails to report "connected"

WiFi.disconnect(); delay(5); // disconnect any still existing [WIFI_STA] connection
Serial.println("Test END");
}

void Disconnect_wifi() {
delay(2000); Serial.print("Disconnecting from router="); Serial.println(WiFi.disconnect());
}

boolean Connect_wifi() {
Serial.print("Connecting to router ");
WiFi.begin(ssid,pw);
byte x=0, y=0, Wstatus_old=99;
boolean success;
do {
byte Wstatus=WiFi.status();
if (Wstatus_old!=Wstatus) {Wstatus_old=Wstatus; Serial.print(Wstatus);}
y++; if (y==250) {y=0; x++; Serial.print(".");}
success=(Wstatus==WL_CONNECTED);
delay(4);
} while ((x<20) and !success ); // try for 20seconds
if (success) Serial.println(" connected OK"); else Serial.println(" FAILED (but the router actually says apparently connected OK!)");
return success;
}

void loop() {}

Please sign in to comment.