From 671bbac0440a27ff9eac8c073885f8da958e37da Mon Sep 17 00:00:00 2001
From: david gauchard <gauchard@laas.fr>
Date: Fri, 30 Nov 2018 02:20:26 +0100
Subject: [PATCH 01/18] weak hook early_setup() #2111 #2133 #2136

---
 cores/esp8266/Arduino.h             |  1 +
 cores/esp8266/core_esp8266_main.cpp | 11 +++++++++--
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h
index 19d4b20853..feb4148e99 100644
--- a/cores/esp8266/Arduino.h
+++ b/cores/esp8266/Arduino.h
@@ -219,6 +219,7 @@ uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder);
 void attachInterrupt(uint8_t pin, void (*)(void), int mode);
 void detachInterrupt(uint8_t pin);
 
+void early_setup(void);
 void setup(void);
 void loop(void);
 
diff --git a/cores/esp8266/core_esp8266_main.cpp b/cores/esp8266/core_esp8266_main.cpp
index fbccac508f..8a2078b0c4 100644
--- a/cores/esp8266/core_esp8266_main.cpp
+++ b/cores/esp8266/core_esp8266_main.cpp
@@ -63,7 +63,7 @@ static uint32_t s_micros_at_task_start;
 
 extern "C" {
 extern const uint32_t __attribute__((section(".ver_number"))) core_version = ARDUINO_ESP8266_GIT_VER;
-const char* core_release = 
+const char* core_release =
 #ifdef ARDUINO_ESP8266_RELEASE
     ARDUINO_ESP8266_RELEASE;
 #else
@@ -145,6 +145,7 @@ void init_done() {
     system_set_os_print(1);
     gdb_init();
     do_global_ctors();
+    early_setup(); // <-- here after global constructors, or in user_init() ?
     esp_schedule();
 }
 
@@ -212,13 +213,19 @@ extern "C" void ICACHE_RAM_ATTR app_entry (void)
     return app_entry_custom();
 }
 
+extern "C" void early_setup (void) __attribute__((weak));
+extern "C" void early_setup (void)
+{
+    /* do nothing by default */
+}
+
 extern "C" void user_init(void) {
     struct rst_info *rtc_info_ptr = system_get_rst_info();
     memcpy((void *) &resetInfo, (void *) rtc_info_ptr, sizeof(resetInfo));
 
     uart_div_modify(0, UART_CLK_FREQ / (115200));
 
-    init();
+    init(); // in core_esp8266_wiring.c
 
     initVariant();
 

From bf7643341069edc50384c4bcac2704cc9625722e Mon Sep 17 00:00:00 2001
From: david gauchard <gauchard@laas.fr>
Date: Fri, 30 Nov 2018 11:00:48 +0100
Subject: [PATCH 02/18] rename to early_init (more "c" vs early_setup which is
 more "c++arduino")

---
 cores/esp8266/Arduino.h             | 2 +-
 cores/esp8266/core_esp8266_main.cpp | 5 +++--
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h
index feb4148e99..2e8669957c 100644
--- a/cores/esp8266/Arduino.h
+++ b/cores/esp8266/Arduino.h
@@ -219,7 +219,7 @@ uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder);
 void attachInterrupt(uint8_t pin, void (*)(void), int mode);
 void detachInterrupt(uint8_t pin);
 
-void early_setup(void);
+void early_init(void);
 void setup(void);
 void loop(void);
 
diff --git a/cores/esp8266/core_esp8266_main.cpp b/cores/esp8266/core_esp8266_main.cpp
index 8a2078b0c4..bcc7f42ff9 100644
--- a/cores/esp8266/core_esp8266_main.cpp
+++ b/cores/esp8266/core_esp8266_main.cpp
@@ -145,7 +145,6 @@ void init_done() {
     system_set_os_print(1);
     gdb_init();
     do_global_ctors();
-    early_setup(); // <-- here after global constructors, or in user_init() ?
     esp_schedule();
 }
 
@@ -214,7 +213,7 @@ extern "C" void ICACHE_RAM_ATTR app_entry (void)
 }
 
 extern "C" void early_setup (void) __attribute__((weak));
-extern "C" void early_setup (void)
+extern "C" void early_init (void)
 {
     /* do nothing by default */
 }
@@ -231,6 +230,8 @@ extern "C" void user_init(void) {
 
     cont_init(g_pcont);
 
+    early_init(); // user redefinable
+
     ets_task(loop_task,
         LOOP_TASK_PRIORITY, s_loop_queue,
         LOOP_QUEUE_SIZE);

From d296d7babce21cd82c9b488387d16f157b884712 Mon Sep 17 00:00:00 2001
From: david gauchard <gauchard@laas.fr>
Date: Fri, 30 Nov 2018 11:57:48 +0100
Subject: [PATCH 03/18] example

---
 cores/esp8266/core_esp8266_main.cpp           |  2 +-
 .../EarlyDisableWiFi/EarlyDisableWiFi.ino     | 41 +++++++++++++++++++
 2 files changed, 42 insertions(+), 1 deletion(-)
 create mode 100644 libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino

diff --git a/cores/esp8266/core_esp8266_main.cpp b/cores/esp8266/core_esp8266_main.cpp
index bcc7f42ff9..74dc5e45a9 100644
--- a/cores/esp8266/core_esp8266_main.cpp
+++ b/cores/esp8266/core_esp8266_main.cpp
@@ -212,7 +212,7 @@ extern "C" void ICACHE_RAM_ATTR app_entry (void)
     return app_entry_custom();
 }
 
-extern "C" void early_setup (void) __attribute__((weak));
+extern "C" void early_init (void) __attribute__((weak));
 extern "C" void early_init (void)
 {
     /* do nothing by default */
diff --git a/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino b/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino
new file mode 100644
index 0000000000..8abd278f9e
--- /dev/null
+++ b/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino
@@ -0,0 +1,41 @@
+
+#include <ESP8266WiFi.h>
+
+// early_init() is called before system startup
+// from nonos-sdk's user entry point user_init()
+
+void early_init() {
+  // Global constructors are not called yet
+  // (global class instances like WiFi, Serial... are not yet initialized).
+  // In this function, we must only use nonos-sdk API.
+
+  // example
+
+  // https://github.com/esp8266/Arduino/issues/2111#issuecomment-224251391
+  // WiFi.persistent(false);
+  // WiFi.mode(WIFI_OFF);
+  // WiFi.forceSleepBegin();
+
+  //WiFi.mode(WIFI_OFF) equivalent:
+  // datasheet:
+  // Set Wi-Fi working mode to Station mode, SoftAP
+  // or Station + SoftAP, and do not update flash
+  // (not persistent)
+  wifi_set_opmode_current(WIFI_OFF);
+
+  //WiFi.forceSleepBegin(/*default*/0) equivalent:
+  // sleep forever until wifi_fpm_do_wakeup() is called
+  wifi_fpm_set_sleep_type(MODEM_SLEEP_T);
+  wifi_fpm_open();
+  wifi_fpm_do_sleep(0xFFFFFFF);
+
+  // use WiFi.forceSleepWake() to wake WiFi up
+}
+
+void setup () {
+  Serial.begin(115200);
+  Serial.setDebugOutput(true);
+}
+
+void loop () {
+}

From dbf60459d8013ea90237cb7cdd11f7f663efef18 Mon Sep 17 00:00:00 2001
From: David Gauchard <gauchard@laas.fr>
Date: Fri, 30 Nov 2018 13:33:46 +0100
Subject: [PATCH 04/18] improve earlyWiFi example, slightly change AddrList
 interface, move WiFi sketches into WiFi examples

---
 cores/esp8266/AddrList.h                      | 18 +++++----
 .../EarlyDisableWiFi/EarlyDisableWiFi.ino     | 37 +++++++++++++++++++
 .../examples/IPv6/IPv6.ino                    |  6 ++-
 3 files changed, 52 insertions(+), 9 deletions(-)
 rename libraries/{esp8266 => ESP8266WiFi}/examples/IPv6/IPv6.ino (96%)

diff --git a/cores/esp8266/AddrList.h b/cores/esp8266/AddrList.h
index 68329f87c2..5a6f6a6367 100644
--- a/cores/esp8266/AddrList.h
+++ b/cores/esp8266/AddrList.h
@@ -24,7 +24,7 @@
   for (auto a: ifList)
     out.printf("IF='%s' index=%d legacy=%d IPv4=%d local=%d hostname='%s' addr= %s\n",
                a->iface().c_str(),
-               a->number(),
+               a->ifnumber(),
                a->addr().isLegacy(),
                a->addr().isV4(),
                a->addr().isLocal(),
@@ -65,7 +65,7 @@
           for (auto iface: ifList)
               if ((configured = (   !iface->addr()->isV4()
                                  && !iface->addr().isLocal()
-                                 && iface->number() == STATION_IF)))
+                                 && iface->ifnumber() == STATION_IF)))
                   break;
           Serial.print('.');
           delay(500);
@@ -126,19 +126,23 @@ class AddrListClass {
                 }
 
                 // (*iterator) emulation:
-
                 const const_iterator& operator*  () const { return *this; }
                 const const_iterator* operator-> () const { return  this; }
 
+                // iterated address
                 bool isLegacy() const { return _num == 0; }
                 bool isLocal() const { return addr().isLocal(); }
                 IPAddress addr () const { return _ip_from_netif_num(); }
+                
+                // properties of legacy/IPv4 address (one per interface)
                 IPAddress netmask () const { return _netif->netmask; }
                 IPAddress gw () const { return _netif->gw; }
-                String iface () const { return String(_netif->name[0]) + _netif->name[1]; }
-                const char* hostname () const { return _netif->hostname?: emptyString.c_str(); }
-                const char* mac () const { return (const char*)_netif->hwaddr; }
-                int number () const { return _netif->num; }
+
+                // interface properties (common to all addresses in the interface)
+                String ifname () const { return String(_netif->name[0]) + _netif->name[1]; }
+                const char* ifhostname () const { return _netif->hostname?: emptyString.c_str(); }
+                const char* ifmac () const { return (const char*)_netif->hwaddr; }
+                int ifnumber () const { return _netif->num; }
 
             protected:
 
diff --git a/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino b/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino
index 8abd278f9e..3ada45768c 100644
--- a/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino
+++ b/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino
@@ -1,6 +1,11 @@
 
 #include <ESP8266WiFi.h>
 
+#ifndef STASSID
+#define STASSID "your-ssid"
+#define STAPSK  "your-password"
+#endif
+
 // early_init() is called before system startup
 // from nonos-sdk's user entry point user_init()
 
@@ -35,6 +40,38 @@ void early_init() {
 void setup () {
   Serial.begin(115200);
   Serial.setDebugOutput(true);
+  Serial.println("sleeping 5s");
+
+  // during this period, a simple amp meter shows
+  // an average of 20mA with a Wemos D1 mini
+  // a DSO is needed to check #2111
+  delay(5000);
+
+  Serial.println("waking  WiFi up, sleeping 5s");
+  WiFi.forceSleepWake();
+
+  // amp meter raises to 75mA
+  delay(5000);
+
+  Serial.println("connecting to AP " STASSID);
+  WiFi.mode(WIFI_STA);
+  WiFi.begin(STASSID, STAPSK);
+
+  for (bool configured = false; !configured;) {
+    for (auto addr : addrList)
+      if ((configured = !addr->isLocal() && addr->ifnumber() == STATION_IF)) {
+        Serial.printf("STA: IF='%s' hostname='%s' addr= %s\n",
+                      addr->ifname().c_str(),
+                      addr->ifhostname(),
+                      addr->addr().toString().c_str());
+        break;
+      }
+    Serial.print('.');
+    delay(500);
+  }
+
+  // amp meter cycles within 75-80 mA
+
 }
 
 void loop () {
diff --git a/libraries/esp8266/examples/IPv6/IPv6.ino b/libraries/ESP8266WiFi/examples/IPv6/IPv6.ino
similarity index 96%
rename from libraries/esp8266/examples/IPv6/IPv6.ino
rename to libraries/ESP8266WiFi/examples/IPv6/IPv6.ino
index 9dbc2788d0..e2d73baaed 100644
--- a/libraries/esp8266/examples/IPv6/IPv6.ino
+++ b/libraries/ESP8266WiFi/examples/IPv6/IPv6.ino
@@ -66,10 +66,10 @@ void status(Print& out) {
   out.println(F("(with 'telnet <addr> or 'nc -u <addr> 23')"));
   for (auto a : addrList) {
     out.printf("IF='%s' IPv6=%d local=%d hostname='%s' addr= %s",
-               a->iface().c_str(),
+               a->ifname().c_str(),
                !a->addr().isV4(),
                a->addr().isLocal(),
-               a->hostname(),
+               a->ifhostname(),
                a->addr().toString().c_str());
 
     if (a->isLegacy()) {
@@ -96,6 +96,8 @@ void setup() {
   Serial.println();
   Serial.println(ESP.getFullVersion());
 
+  Serial.printf("IPV6 is%s enabled\n", LWIP_IPV6? emptyString.c_str(): " NOT");
+
   WiFi.mode(WIFI_STA);
   WiFi.begin(STASSID, STAPSK);
 

From acdbe073bd7bbd6933d6fd7882235a588badb16c Mon Sep 17 00:00:00 2001
From: David Gauchard <gauchard@laas.fr>
Date: Fri, 30 Nov 2018 15:22:54 +0100
Subject: [PATCH 05/18] fix CI

---
 .../examples/EarlyDisableWiFi/EarlyDisableWiFi.ino            | 4 ++--
 libraries/ESP8266WiFi/examples/IPv6/IPv6.ino                  | 2 +-
 tests/common.sh                                               | 4 ++--
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino b/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino
index 3ada45768c..69753e62e1 100644
--- a/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino
+++ b/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino
@@ -37,7 +37,7 @@ void early_init() {
   // use WiFi.forceSleepWake() to wake WiFi up
 }
 
-void setup () {
+void setup() {
   Serial.begin(115200);
   Serial.setDebugOutput(true);
   Serial.println("sleeping 5s");
@@ -74,5 +74,5 @@ void setup () {
 
 }
 
-void loop () {
+void loop() {
 }
diff --git a/libraries/ESP8266WiFi/examples/IPv6/IPv6.ino b/libraries/ESP8266WiFi/examples/IPv6/IPv6.ino
index e2d73baaed..e26822e6fc 100644
--- a/libraries/ESP8266WiFi/examples/IPv6/IPv6.ino
+++ b/libraries/ESP8266WiFi/examples/IPv6/IPv6.ino
@@ -96,7 +96,7 @@ void setup() {
   Serial.println();
   Serial.println(ESP.getFullVersion());
 
-  Serial.printf("IPV6 is%s enabled\n", LWIP_IPV6? emptyString.c_str(): " NOT");
+  Serial.printf("IPV6 is%s enabled\n", LWIP_IPV6 ? emptyString.c_str() : " NOT");
 
   WiFi.mode(WIFI_STA);
   WiFi.begin(STASSID, STAPSK);
diff --git a/tests/common.sh b/tests/common.sh
index c048e75fe5..883bd8a031 100755
--- a/tests/common.sh
+++ b/tests/common.sh
@@ -116,8 +116,8 @@ function install_ide()
         debug_flags="-DDEBUG_ESP_PORT=Serial -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM"
     fi
     # Set custom warnings for all builds (i.e. could add -Wextra at some point)
-    echo "compiler.c.extra_flags=-Wall -Wextra -Werror $debug_flags" > esp8266/platform.local.txt
-    echo "compiler.cpp.extra_flags=-Wall -Wextra -Werror $debug_flags" >> esp8266/platform.local.txt
+    echo "compiler.c.extra_flags=-Wall -Wextra -Werror -DLWIP_IPV6=0 $debug_flags" > esp8266/platform.local.txt
+    echo "compiler.cpp.extra_flags=-Wall -Wextra -Werror -DLWIP_IPV6=0 $debug_flags" >> esp8266/platform.local.txt
     echo -e "\n----platform.local.txt----"
     cat esp8266/platform.local.txt
     echo -e "\n----\n"

From 23b7ace90076c56da6e3553ba02d203f77722c14 Mon Sep 17 00:00:00 2001
From: David Gauchard <gauchard@laas.fr>
Date: Fri, 30 Nov 2018 15:35:56 +0100
Subject: [PATCH 06/18] fix local CI runner

---
 tests/run_CI_locally.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/run_CI_locally.sh b/tests/run_CI_locally.sh
index a080f3a3d4..49b9f119a2 100755
--- a/tests/run_CI_locally.sh
+++ b/tests/run_CI_locally.sh
@@ -33,7 +33,7 @@ if [ -d ${TMPCI} ]; then
 	echo ""
 	echo " -- updating CI directory in ${TMPCI} --"
 	echo ""
-	(cd ${TMPCI}; git checkout ${branch}; git pull)
+	(cd ${TMPCI}; git checkout master; git branch -D ${branch}; git checkout -b ${branch}; git pull origin ${branch})
 else
 	echo ""
 	echo " -- installing CI directory in ${TMPCI} --"

From 9c043f61c0ce4d2964379527e4f6248a3f1852af Mon Sep 17 00:00:00 2001
From: david gauchard <gauchard@laas.fr>
Date: Mon, 3 Dec 2018 01:36:10 +0100
Subject: [PATCH 07/18] fix local CI runner

---
 tests/run_CI_locally.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/run_CI_locally.sh b/tests/run_CI_locally.sh
index a080f3a3d4..7f28ab7066 100755
--- a/tests/run_CI_locally.sh
+++ b/tests/run_CI_locally.sh
@@ -33,7 +33,7 @@ if [ -d ${TMPCI} ]; then
 	echo ""
 	echo " -- updating CI directory in ${TMPCI} --"
 	echo ""
-	(cd ${TMPCI}; git checkout ${branch}; git pull)
+        (cd ${TMPCI}; git checkout master; git branch -D ${branch} || true; git checkout -b ${branch}; git pull origin ${branch})
 else
 	echo ""
 	echo " -- installing CI directory in ${TMPCI} --"

From e8e0b5c75771e110f12714aa5ede6737918ebd44 Mon Sep 17 00:00:00 2001
From: david gauchard <gauchard@laas.fr>
Date: Mon, 3 Dec 2018 03:32:33 +0100
Subject: [PATCH 08/18] rename early_init() to preinit()

---
 cores/esp8266/Arduino.h                                     | 2 +-
 cores/esp8266/core_esp8266_main.cpp                         | 6 +++---
 .../examples/EarlyDisableWiFi/EarlyDisableWiFi.ino          | 4 ++--
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h
index 2e8669957c..6dff712d29 100644
--- a/cores/esp8266/Arduino.h
+++ b/cores/esp8266/Arduino.h
@@ -219,7 +219,7 @@ uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder);
 void attachInterrupt(uint8_t pin, void (*)(void), int mode);
 void detachInterrupt(uint8_t pin);
 
-void early_init(void);
+void preinit(void);
 void setup(void);
 void loop(void);
 
diff --git a/cores/esp8266/core_esp8266_main.cpp b/cores/esp8266/core_esp8266_main.cpp
index 74dc5e45a9..1901b6c002 100644
--- a/cores/esp8266/core_esp8266_main.cpp
+++ b/cores/esp8266/core_esp8266_main.cpp
@@ -212,8 +212,8 @@ extern "C" void ICACHE_RAM_ATTR app_entry (void)
     return app_entry_custom();
 }
 
-extern "C" void early_init (void) __attribute__((weak));
-extern "C" void early_init (void)
+extern "C" void preinit (void) __attribute__((weak));
+extern "C" void preinit (void)
 {
     /* do nothing by default */
 }
@@ -230,7 +230,7 @@ extern "C" void user_init(void) {
 
     cont_init(g_pcont);
 
-    early_init(); // user redefinable
+    preinit(); // user redefinable
 
     ets_task(loop_task,
         LOOP_TASK_PRIORITY, s_loop_queue,
diff --git a/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino b/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino
index 8abd278f9e..a2d74b3c7f 100644
--- a/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino
+++ b/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino
@@ -1,10 +1,10 @@
 
 #include <ESP8266WiFi.h>
 
-// early_init() is called before system startup
+// preinit() is called before system startup
 // from nonos-sdk's user entry point user_init()
 
-void early_init() {
+void preinit() {
   // Global constructors are not called yet
   // (global class instances like WiFi, Serial... are not yet initialized).
   // In this function, we must only use nonos-sdk API.

From f887ce89b183b20f459db1e8ba5adab3e486724c Mon Sep 17 00:00:00 2001
From: David Gauchard <gauchard@laas.fr>
Date: Mon, 3 Dec 2018 14:07:36 +0100
Subject: [PATCH 09/18] + static ESP8266WiFiClass::preinit_wifi_off()

---
 cores/esp8266/AddrList.h                      |  1 +
 .../ESP8266WiFi/src/ESP8266WiFiGeneric.cpp    | 21 +++++++++++++++++++
 .../ESP8266WiFi/src/ESP8266WiFiGeneric.h      |  2 ++
 3 files changed, 24 insertions(+)

diff --git a/cores/esp8266/AddrList.h b/cores/esp8266/AddrList.h
index d0d7ba269a..8576db1fac 100644
--- a/cores/esp8266/AddrList.h
+++ b/cores/esp8266/AddrList.h
@@ -115,6 +115,7 @@ struct netifWrapper
     bool isLocal () const           { return addr().isLocal(); }
     bool isV4 () const              { return addr().isV4(); }
     bool isV6 () const              { return !addr().isV4(); }
+    String toString() const         { return addr().toString(); }
 
     // related to legacy address (_num=0, ipv4)
     IPAddress netmask () const      { return _netif->netmask; }
diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp
index 2e3f4043c9..18ef4bef16 100644
--- a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp
+++ b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp
@@ -580,3 +580,24 @@ void wifi_dns_found_callback(const char *name, CONST ip_addr_t *ipaddr, void *ca
 }
 
 
+void ESP8266WiFiGenericClass::preinit_wifi_off () {
+  // https://github.com/esp8266/Arduino/issues/2111#issuecomment-224251391
+  // WiFi.persistent(false);
+  // WiFi.mode(WIFI_OFF);
+  // WiFi.forceSleepBegin();
+
+  //WiFi.mode(WIFI_OFF) equivalent:
+  // datasheet:
+  // Set Wi-Fi working mode to Station mode, SoftAP
+  // or Station + SoftAP, and do not update flash
+  // (not persistent)
+  wifi_set_opmode_current(WIFI_OFF);
+
+  //WiFi.forceSleepBegin(/*default*/0) equivalent:
+  // sleep forever until wifi_fpm_do_wakeup() is called
+  wifi_fpm_set_sleep_type(MODEM_SLEEP_T);
+  wifi_fpm_open();
+  wifi_fpm_do_sleep(0xFFFFFFF);
+
+  // use WiFi.forceSleepWake() to wake WiFi up
+}
diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h
index 5fba065f55..6fcc3e5a81 100644
--- a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h
+++ b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h
@@ -88,6 +88,8 @@ class ESP8266WiFiGenericClass {
         bool forceSleepBegin(uint32 sleepUs = 0);
         bool forceSleepWake();
 
+        static void preinit_wifi_off ();
+
     protected:
         static bool _persistent;
         static WiFiMode_t _forceSleepLastMode;

From 6c09fbdb126150c2a80225ba6269a87a84a8ee78 Mon Sep 17 00:00:00 2001
From: David Gauchard <gauchard@laas.fr>
Date: Mon, 3 Dec 2018 14:09:10 +0100
Subject: [PATCH 10/18] update early disable wifi example

---
 .../EarlyDisableWiFi/EarlyDisableWiFi.ino     | 38 ++++---------------
 1 file changed, 8 insertions(+), 30 deletions(-)

diff --git a/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino b/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino
index f0ebc1fd3e..3959d08fc9 100644
--- a/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino
+++ b/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino
@@ -10,31 +10,9 @@
 // from nonos-sdk's user entry point user_init()
 
 void preinit() {
-  // Global constructors are not called yet
-  // (global class instances like WiFi, Serial... are not yet initialized).
-  // In this function, we must only use nonos-sdk API.
-
-  // example
-
-  // https://github.com/esp8266/Arduino/issues/2111#issuecomment-224251391
-  // WiFi.persistent(false);
-  // WiFi.mode(WIFI_OFF);
-  // WiFi.forceSleepBegin();
-
-  //WiFi.mode(WIFI_OFF) equivalent:
-  // datasheet:
-  // Set Wi-Fi working mode to Station mode, SoftAP
-  // or Station + SoftAP, and do not update flash
-  // (not persistent)
-  wifi_set_opmode_current(WIFI_OFF);
-
-  //WiFi.forceSleepBegin(/*default*/0) equivalent:
-  // sleep forever until wifi_fpm_do_wakeup() is called
-  wifi_fpm_set_sleep_type(MODEM_SLEEP_T);
-  wifi_fpm_open();
-  wifi_fpm_do_sleep(0xFFFFFFF);
-
-  // use WiFi.forceSleepWake() to wake WiFi up
+  // Global WiFi constructors are not called yet
+  // (global class instances like WiFi, Serial... are not yet initialized)..
+  ESP8266WiFiClass::preinit_wifi_off();
 }
 
 void setup() {
@@ -47,7 +25,7 @@ void setup() {
   // a DSO is needed to check #2111
   delay(5000);
 
-  Serial.println("waking  WiFi up, sleeping 5s");
+  Serial.println("waking WiFi up, sleeping 5s");
   WiFi.forceSleepWake();
 
   // amp meter raises to 75mA
@@ -59,11 +37,11 @@ void setup() {
 
   for (bool configured = false; !configured;) {
     for (auto addr : addrList)
-      if ((configured = !addr->isLocal() && addr->ifnumber() == STATION_IF)) {
+      if ((configured = !addr.isLocal() && addr.ifnumber() == STATION_IF)) {
         Serial.printf("STA: IF='%s' hostname='%s' addr= %s\n",
-                      addr->ifname().c_str(),
-                      addr->ifhostname(),
-                      addr->addr().toString().c_str());
+                      addr.ifname().c_str(),
+                      addr.ifhostname(),
+                      addr.toString().c_str());
         break;
       }
     Serial.print('.');

From a636a80136119d0e4feb4118475e9ef2917b45a7 Mon Sep 17 00:00:00 2001
From: David Gauchard <gauchard@laas.fr>
Date: Mon, 3 Dec 2018 14:09:37 +0100
Subject: [PATCH 11/18] example update

---
 libraries/ESP8266WiFi/examples/{udp/udp.ino => Udp/Udp.ino} | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename libraries/ESP8266WiFi/examples/{udp/udp.ino => Udp/Udp.ino} (100%)

diff --git a/libraries/ESP8266WiFi/examples/udp/udp.ino b/libraries/ESP8266WiFi/examples/Udp/Udp.ino
similarity index 100%
rename from libraries/ESP8266WiFi/examples/udp/udp.ino
rename to libraries/ESP8266WiFi/examples/Udp/Udp.ino

From 5d770aa19bb651c9216fd5a4385ec86f9a1fbff5 Mon Sep 17 00:00:00 2001
From: David Gauchard <gauchard@laas.fr>
Date: Mon, 3 Dec 2018 14:21:38 +0100
Subject: [PATCH 12/18] IPv6 example update

---
 libraries/ESP8266WiFi/examples/IPv6/IPv6.ino               | 5 ++---
 .../examples/httpUpdateSigned/httpUpdateSigned.ino         | 7 ++++++-
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/libraries/ESP8266WiFi/examples/IPv6/IPv6.ino b/libraries/ESP8266WiFi/examples/IPv6/IPv6.ino
index da36656474..565710a83e 100644
--- a/libraries/ESP8266WiFi/examples/IPv6/IPv6.ino
+++ b/libraries/ESP8266WiFi/examples/IPv6/IPv6.ino
@@ -65,13 +65,12 @@ void status(Print& out) {
   out.println(F("Try me at these addresses:"));
   out.println(F("(with 'telnet <addr> or 'nc -u <addr> 23')"));
   for (auto a : addrList) {
-    out.printf("IF='%s' set=%d IPv6=%d local=%d hostname='%s' addr= %s",
+    out.printf("IF='%s' IPv6=%d local=%d hostname='%s' addr= %s",
                a.ifname().c_str(),
-               a.addr().isSet(),
                a.isV6(),
                a.isLocal(),
                a.ifhostname(),
-               a.addr().toString().c_str());
+               a.toString().c_str());
 
     if (a.isLegacy()) {
       out.printf(" / mask:%s / gw:%s",
diff --git a/libraries/ESP8266httpUpdate/examples/httpUpdateSigned/httpUpdateSigned.ino b/libraries/ESP8266httpUpdate/examples/httpUpdateSigned/httpUpdateSigned.ino
index b503c1d5b4..e196ef6419 100644
--- a/libraries/ESP8266httpUpdate/examples/httpUpdateSigned/httpUpdateSigned.ino
+++ b/libraries/ESP8266httpUpdate/examples/httpUpdateSigned/httpUpdateSigned.ino
@@ -21,6 +21,11 @@
 #include <ESP8266HTTPClient.h>
 #include <ESP8266httpUpdate.h>
 
+#ifndef STASSID
+#define STASSID "your-ssid"
+#define STAPSK  "your-password"
+#endif
+
 ESP8266WiFiMulti WiFiMulti;
 
 #define MANUAL_SIGNING 0
@@ -66,7 +71,7 @@ void setup() {
   }
 
   WiFi.mode(WIFI_STA);
-  WiFiMulti.addAP("SSID", "PASS");
+  WiFiMulti.addAP(STASSID, STAPSK);
 
   #if MANUAL_SIGNING
   signPubKey = new BearSSL::PublicKey(pubkey);

From c0043c27f94ff95ed1e4ff127b6524729b29b281 Mon Sep 17 00:00:00 2001
From: Develo <deveyes@gmail.com>
Date: Tue, 4 Dec 2018 00:13:41 -0300
Subject: [PATCH 13/18] Update ESP8266WiFiGeneric.h

camelCase for static method name
---
 libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h
index 6fcc3e5a81..af3fce3e16 100644
--- a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h
+++ b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h
@@ -88,7 +88,7 @@ class ESP8266WiFiGenericClass {
         bool forceSleepBegin(uint32 sleepUs = 0);
         bool forceSleepWake();
 
-        static void preinit_wifi_off ();
+        static void preinitWiFiOff (); //meant to be called in user-defined preinit()
 
     protected:
         static bool _persistent;

From 8b687b0951f86bbad6c105e23cc997d711a9550c Mon Sep 17 00:00:00 2001
From: Develo <deveyes@gmail.com>
Date: Tue, 4 Dec 2018 00:16:10 -0300
Subject: [PATCH 14/18] Update ESP8266WiFiGeneric.cpp

camelCase for static method name
---
 .../ESP8266WiFi/src/ESP8266WiFiGeneric.cpp    | 44 +++++++++----------
 1 file changed, 22 insertions(+), 22 deletions(-)

diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp
index 18ef4bef16..a6239decef 100644
--- a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp
+++ b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.cpp
@@ -579,25 +579,25 @@ void wifi_dns_found_callback(const char *name, CONST ip_addr_t *ipaddr, void *ca
     esp_schedule(); // resume the hostByName function
 }
 
-
-void ESP8266WiFiGenericClass::preinit_wifi_off () {
-  // https://github.com/esp8266/Arduino/issues/2111#issuecomment-224251391
-  // WiFi.persistent(false);
-  // WiFi.mode(WIFI_OFF);
-  // WiFi.forceSleepBegin();
-
-  //WiFi.mode(WIFI_OFF) equivalent:
-  // datasheet:
-  // Set Wi-Fi working mode to Station mode, SoftAP
-  // or Station + SoftAP, and do not update flash
-  // (not persistent)
-  wifi_set_opmode_current(WIFI_OFF);
-
-  //WiFi.forceSleepBegin(/*default*/0) equivalent:
-  // sleep forever until wifi_fpm_do_wakeup() is called
-  wifi_fpm_set_sleep_type(MODEM_SLEEP_T);
-  wifi_fpm_open();
-  wifi_fpm_do_sleep(0xFFFFFFF);
-
-  // use WiFi.forceSleepWake() to wake WiFi up
-}
+//meant to be called from user-defined preinit()
+void ESP8266WiFiGenericClass::preinitWiFiOff () {
+  // https://github.com/esp8266/Arduino/issues/2111#issuecomment-224251391
+  // WiFi.persistent(false);
+  // WiFi.mode(WIFI_OFF);
+  // WiFi.forceSleepBegin();
+
+  //WiFi.mode(WIFI_OFF) equivalent:
+  // datasheet:
+  // Set Wi-Fi working mode to Station mode, SoftAP
+  // or Station + SoftAP, and do not update flash
+  // (not persistent)
+  wifi_set_opmode_current(WIFI_OFF);
+
+  //WiFi.forceSleepBegin(/*default*/0) equivalent:
+  // sleep forever until wifi_fpm_do_wakeup() is called
+  wifi_fpm_set_sleep_type(MODEM_SLEEP_T);
+  wifi_fpm_open();
+  wifi_fpm_do_sleep(0xFFFFFFF);
+
+  // use WiFi.forceSleepWake() to wake WiFi up
+}

From 85d244d253ef8646b45662eb7f608f4ca258c9d2 Mon Sep 17 00:00:00 2001
From: Develo <deveyes@gmail.com>
Date: Tue, 4 Dec 2018 00:19:23 -0300
Subject: [PATCH 15/18] Update EarlyDisableWiFi.ino

Expand comment, fix static method name
---
 .../ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino b/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino
index 3959d08fc9..ed966405df 100644
--- a/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino
+++ b/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino
@@ -12,7 +12,8 @@
 void preinit() {
   // Global WiFi constructors are not called yet
   // (global class instances like WiFi, Serial... are not yet initialized)..
-  ESP8266WiFiClass::preinit_wifi_off();
+  // No global object methods or C++ exceptions can be called in here!
+  ESP8266WiFiClass::preinitWiFiOff();
 }
 
 void setup() {

From bef67d7274d9c915e336fe24e44704f718c7ff61 Mon Sep 17 00:00:00 2001
From: Develo <deveyes@gmail.com>
Date: Tue, 4 Dec 2018 00:21:17 -0300
Subject: [PATCH 16/18] Update core_esp8266_main.cpp

Expanded comment.
---
 cores/esp8266/core_esp8266_main.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/cores/esp8266/core_esp8266_main.cpp b/cores/esp8266/core_esp8266_main.cpp
index 4a60f2e416..f9d6a454ad 100644
--- a/cores/esp8266/core_esp8266_main.cpp
+++ b/cores/esp8266/core_esp8266_main.cpp
@@ -261,7 +261,7 @@ extern "C" void user_init(void) {
 
     cont_init(g_pcont);
 
-    preinit(); // user redefinable
+    preinit(); // Prior to C++ Dynamic Init (not related to above init() ). Meant to be user redefinable.
 
     ets_task(loop_task,
         LOOP_TASK_PRIORITY, s_loop_queue,

From eb9f9c2c6871a0899ae504fbca158f90e1911b8e Mon Sep 17 00:00:00 2001
From: Develo <deveyes@gmail.com>
Date: Tue, 4 Dec 2018 00:22:52 -0300
Subject: [PATCH 17/18] Update core_esp8266_main.cpp

Expanded comment
---
 cores/esp8266/core_esp8266_main.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/cores/esp8266/core_esp8266_main.cpp b/cores/esp8266/core_esp8266_main.cpp
index f9d6a454ad..a35e3d5a8a 100644
--- a/cores/esp8266/core_esp8266_main.cpp
+++ b/cores/esp8266/core_esp8266_main.cpp
@@ -255,7 +255,7 @@ extern "C" void user_init(void) {
 
     uart_div_modify(0, UART_CLK_FREQ / (115200));
 
-    init(); // in core_esp8266_wiring.c
+    init(); // in core_esp8266_wiring.c, inits hw regs and sdk timer
 
     initVariant();
 

From 1925b0c3329ab0f755863a35e6bcbec791b7a7b5 Mon Sep 17 00:00:00 2001
From: Develo <deveyes@gmail.com>
Date: Tue, 4 Dec 2018 00:24:57 -0300
Subject: [PATCH 18/18] Update EarlyDisableWiFi.ino

Expanded comment
---
 .../ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino   | 1 +
 1 file changed, 1 insertion(+)

diff --git a/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino b/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino
index ed966405df..45627bdb16 100644
--- a/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino
+++ b/libraries/ESP8266WiFi/examples/EarlyDisableWiFi/EarlyDisableWiFi.ino
@@ -13,6 +13,7 @@ void preinit() {
   // Global WiFi constructors are not called yet
   // (global class instances like WiFi, Serial... are not yet initialized)..
   // No global object methods or C++ exceptions can be called in here!
+  //The below is a static class method, which is similar to a function, so it's ok.
   ESP8266WiFiClass::preinitWiFiOff();
 }