Complete Phase 12 dual-stack networking
Add IPv6-aware Wi-Fi state, HTTPS/SSH listeners, mDNS service reconciliation, and browser Wi-Fi administration. Include a guarded build-local fix for mDNS 1.12.0 membership handling, focused regression suites, and Phase 12 acceptance documentation.
This commit is contained in:
@@ -31,7 +31,8 @@ static ssh_slot_t s_slots[2];
|
||||
static void *s_context;
|
||||
static int s_listen_fd=-1, s_lock;
|
||||
static unsigned depth, frees, creates;
|
||||
static bool s_running, s_cleanup_pending, cleanup_fail, listener_fail;
|
||||
static bool s_running, s_cleanup_pending, cleanup_fail, listener_fail, advertised;
|
||||
static void mdns_service_set_ssh_available(bool available) { assert(!depth); assert(available == (s_listen_fd >= 0)); advertised=available; }
|
||||
#define taskENTER_CRITICAL(p) do { (void)(p); assert(!depth++); } while(0)
|
||||
#define taskEXIT_CRITICAL(p) do { (void)(p); assert(!--depth); } while(0)
|
||||
static void wolfSSH_CTX_free(void *p) { assert(!depth && p==s_context); for(unsigned i=0;i<2;++i) assert(!s_slots[i].state); ++frees; }
|
||||
@@ -48,17 +49,17 @@ static esp_err_t create_listener(void) { if(listener_fail)return ESP_FAIL;s_list
|
||||
'''
|
||||
tests=r'''
|
||||
int main(void) {
|
||||
assert(start_runtime()==ESP_OK && creates==1);
|
||||
assert(start_runtime()==ESP_OK && creates==1 && advertised);
|
||||
assert(start_runtime()==ESP_ERR_INVALID_STATE && creates==1 && !frees);
|
||||
s_slots[0].state=2;cleanup_fail=true;
|
||||
assert(stop_runtime()==ESP_ERR_TIMEOUT && s_context && !frees && s_listen_fd==-1);
|
||||
assert(stop_runtime()==ESP_ERR_TIMEOUT && s_context && !frees && s_listen_fd==-1 && !advertised);
|
||||
s_cleanup_pending=true;s_running=false;
|
||||
assert(start_runtime()==ESP_ERR_INVALID_STATE && creates==1);
|
||||
process_slots();assert(s_context && s_cleanup_pending && !frees);
|
||||
cleanup_fail=false;process_slots();assert(!s_context && !s_cleanup_pending && frees==1);
|
||||
process_slots();assert(frees==1);
|
||||
assert(start_runtime()==ESP_OK && creates==2);assert(stop_runtime()==ESP_OK && frees==2);
|
||||
listener_fail=true;assert(start_runtime()==ESP_FAIL && !s_context && frees==3 && s_listen_fd==-1);
|
||||
assert(start_runtime()==ESP_OK && creates==2 && advertised);assert(stop_runtime()==ESP_OK && frees==2 && !advertised);
|
||||
listener_fail=true;assert(start_runtime()==ESP_FAIL && !s_context && frees==3 && s_listen_fd==-1 && !advertised);
|
||||
s_slots[1].state=2;assert(start_runtime()==ESP_ERR_INVALID_STATE && creates==3);s_slots[1].state=0;
|
||||
s_listen_fd=22;assert(start_runtime()==ESP_ERR_INVALID_STATE && creates==3);
|
||||
puts("PASS SSH actual runtime stop failure retains context, rejects orphan overwrite, owner retires only after all slots free, failed listener frees context exactly once");
|
||||
|
||||
Reference in New Issue
Block a user