Jelajahi Sumber

change: dhcp,ulwip,增加事件回调函数,解决air8101在获取ip后需要设置wifi状态,实现低功耗模式的要求

Wendal Chen 6 bulan lalu
induk
melakukan
5dea72d5f1

+ 6 - 1
components/network/ulwip/include/luat_ulwip.h

@@ -29,6 +29,11 @@
 
 void net_lwip2_set_link_state(uint8_t adapter_index, uint8_t updown);
 
+typedef void (*ulwip_event_cb)(int32_t event, void* ctx);
+
+#define LUAT_ULWIP_DHCP_EVENT_GOT_IP 1
+#define LUAT_ULWIP_DHCP_EVENT_TIMEOUT 2
+
 typedef struct ulwip_ctx
 {
     int output_lua_ref;
@@ -44,7 +49,7 @@ typedef struct ulwip_ctx
     uint8_t hwaddr[ETH_HWADDR_LEN];
     dhcp_client_info_t *dhcp_client;
     luat_rtos_timer_t dhcp_timer;
-    // struct udp_pcb *dhcp_pcb;
+    ulwip_event_cb event_cb;
 }ulwip_ctx_t;
 
 typedef struct netif_cb_ctx {

+ 17 - 10
components/network/ulwip/src/ulwip_dhcp_client.c

@@ -23,6 +23,7 @@ static int ulwip_dhcp_client_run(ulwip_ctx_t* ctx, char* rxbuff, size_t len) {
     PV_Union uIP;
     // 检查dhcp的状态
     dhcp_client_info_t* dhcp = ctx->dhcp_client;
+    u8_t adapter_index = ctx->adapter_index;
     struct netif* netif = ctx->netif;
 
     Buffer_Struct rx_msg_buf = {0,0,0};
@@ -31,7 +32,7 @@ static int ulwip_dhcp_client_run(ulwip_ctx_t* ctx, char* rxbuff, size_t len) {
     int result = 0;
 
     if (!netif_is_up(netif) || !netif_is_link_up(netif)) {
-        LLOGD("网卡未就绪,不发送dhcp请求 %d", ctx->adapter_index);
+        LLOGD("网卡未就绪,不发送dhcp请求 %d", adapter_index);
         if (rxbuff) {
             luat_heap_free(rxbuff);
             rxbuff = NULL;
@@ -49,20 +50,20 @@ static int ulwip_dhcp_client_run(ulwip_ctx_t* ctx, char* rxbuff, size_t len) {
     if (DHCP_STATE_CHECK == dhcp->state) {
 on_check:
         uIP.u32 = dhcp->ip;
-		LLOGD("动态IP:%d.%d.%d.%d", uIP.u8[0], uIP.u8[1], uIP.u8[2], uIP.u8[3]);
+		LLOGD("adapter %d ip %d.%d.%d.%d", adapter_index, uIP.u8[0], uIP.u8[1], uIP.u8[2], uIP.u8[3]);
 		uIP.u32 = dhcp->submask;
-		LLOGD("子网掩码:%d.%d.%d.%d", uIP.u8[0], uIP.u8[1], uIP.u8[2], uIP.u8[3]);
+		LLOGD("adapter %d mask %d.%d.%d.%d", adapter_index, uIP.u8[0], uIP.u8[1], uIP.u8[2], uIP.u8[3]);
 		uIP.u32 = dhcp->gateway;
-		LLOGD("网关:%d.%d.%d.%d", uIP.u8[0], uIP.u8[1], uIP.u8[2], uIP.u8[3]);
-		LLOGD("租约时间:%u秒", dhcp->lease_time);
+		LLOGD("adapter %d gateway %d.%d.%d.%d", adapter_index, uIP.u8[0], uIP.u8[1], uIP.u8[2], uIP.u8[3]);
+		LLOGD("adapter %d lease_time %us", adapter_index, dhcp->lease_time);
 
         if (dhcp->dns_server[0] != 0) {
             uIP.u32 = dhcp->dns_server[0];
-            LLOGD("DNS服务器1:%d.%d.%d.%d", uIP.u8[0], uIP.u8[1], uIP.u8[2], uIP.u8[3]);
+            LLOGD("adapter %d DNS1:%d.%d.%d.%d", adapter_index, uIP.u8[0], uIP.u8[1], uIP.u8[2], uIP.u8[3]);
         }
         if (dhcp->dns_server[1] != 0) {
             uIP.u32 = dhcp->dns_server[1];
-            LLOGD("DNS服务器2:%d.%d.%d.%d", uIP.u8[0], uIP.u8[1], uIP.u8[2], uIP.u8[3]);
+            LLOGD("adapter %d DNS2:%d.%d.%d.%d", adapter_index, uIP.u8[0], uIP.u8[1], uIP.u8[2], uIP.u8[3]);
         }
 
         // 设置到netif
@@ -77,6 +78,9 @@ on_check:
         ulwip_netif_ip_event(ctx);
         luat_rtos_timer_stop(ctx->dhcp_timer);
         luat_rtos_timer_start(ctx->dhcp_timer, 60000, 1, dhcp_client_timer_cb, ctx);
+        if (ctx->event_cb) {
+            ctx->event_cb(LUAT_ULWIP_DHCP_EVENT_GOT_IP, ctx);
+        }
         return 0;
     }
     result = ip4_dhcp_run(dhcp, rxbuff == NULL ? NULL : &rx_msg_buf, &tx_msg_buf, &remote_ip);
@@ -85,7 +89,10 @@ on_check:
         rxbuff = NULL;
     }
     if (result) {
-        LLOGE("ip4_dhcp_run error %d", result);
+        LLOGE("adapter %d ip4_dhcp_run error %d", adapter_index, result);
+        if (ctx->event_cb) {
+            ctx->event_cb(LUAT_ULWIP_DHCP_EVENT_TIMEOUT, ctx);
+        }
         return 0;
     }
     if (!tx_msg_buf.Pos) {
@@ -110,13 +117,13 @@ on_check:
         data += q->len;
     }
     data = p->payload;
-    LLOGI("dhcp payload len %d adapter %d", p->tot_len, ctx->adapter_index);
+    LLOGI("adapter %d dhcp payload len %d", adapter_index, p->tot_len);
     // ip_addr_set_any(0, &s_ulwip_dhcp->local_ip);
     memcpy(&s_ulwip_dhcp->local_ip, &netif->ip_addr, sizeof(ip_addr_t));    // 本地地址设为netif的ip地址
     result = udp_sendto_if(s_ulwip_dhcp, p, IP_ADDR_BROADCAST, 67, netif);
     pbuf_free(p);
     if (result != ERR_OK) {
-        LLOGE("dhcp udp_sendto_if error %d", result);
+        LLOGE("adapter %d dhcp udp_sendto_if error %d", adapter_index, result);
     }
     return 0;
 }