// NAPT example released to public domain #if LWIP_FEATURES && !LWIP_IPV6 #define HAVE_NETDUMP 0 #ifndef STASSID #define STASSID "mynetwork" #define STAPSK "mynetworkpassword" #endif #include #include #include #include #define NAPT 1000 #define NAPT_PORT 10 #if HAVE_NETDUMP #include void dump(int netif_idx, const char* data, size_t len, int out, int success) { (void)success; Serial.print(out ? F("out ") : F(" in ")); Serial.printf("%d ", netif_idx); // optional filter example: if (netDump_is_ARP(data)) { netDump(Serial, data, len); //netDumpHex(Serial, data, len); } } #endif void setup() { Serial.begin(115200); Serial.printf("\n\nNAPT Range extender\n"); Serial.printf("Heap on start: %d\n", ESP.getFreeHeap()); #if HAVE_NETDUMP phy_capture = dump; #endif // first, connect to STA so we can get a proper local DNS server WiFi.mode(WIFI_STA); WiFi.begin(STASSID, STAPSK); while (WiFi.status() != WL_CONNECTED) { Serial.print('.'); delay(500); } Serial.printf("\nSTA: %s (dns: %s / %s)\n", WiFi.localIP().toString().c_str(), WiFi.dnsIP(0).toString().c_str(), WiFi.dnsIP(1).toString().c_str()); // give DNS servers to AP side dhcps_set_dns(0, WiFi.dnsIP(0)); dhcps_set_dns(1, WiFi.dnsIP(1)); WiFi.softAPConfig( // enable AP, with android-compatible google domain IPAddress(172, 217, 28, 254), IPAddress(172, 217, 28, 254), IPAddress(255, 255, 255, 0)); WiFi.softAP(STASSID "extender", STAPSK); Serial.printf("AP: %s\n", WiFi.softAPIP().toString().c_str()); Serial.printf("Heap before: %d\n", ESP.getFreeHeap()); err_t ret = ip_napt_init(NAPT, NAPT_PORT); Serial.printf("ip_napt_init(%d,%d): ret=%d (OK=%d)\n", NAPT, NAPT_PORT, (int)ret, (int)ERR_OK); if (ret == ERR_OK) { ret = ip_napt_enable_no(SOFTAP_IF, 1); Serial.printf("ip_napt_enable_no(SOFTAP_IF): ret=%d (OK=%d)\n", (int)ret, (int)ERR_OK); if (ret == ERR_OK) { Serial.printf("WiFi Network '%s' with same password is now NATed behind '%s'\n", STASSID "extender", STASSID); } } Serial.printf("Heap after napt init: %d\n", ESP.getFreeHeap()); if (ret != ERR_OK) { Serial.printf("NAPT initialization failed\n"); } } #else void setup() { Serial.begin(115200); Serial.printf("\n\nNAPT not supported in this configuration\n"); } #endif void loop() { }