Просмотр исходного кода

fix: 解决netdrv-ch390网线反复插拔/从机重启等网络异常后的服务恢复

Wendal Chen 1 год назад
Родитель
Сommit
ea2a1168b5
3 измененных файлов с 40 добавлено и 8 удалено
  1. 2 2
      components/network/netdrv/src/ch390h_task.c
  2. 17 5
      script/libs/dnsproxy.lua
  3. 21 1
      script/libs/udpsrv.lua

+ 2 - 2
components/network/netdrv/src/ch390h_task.c

@@ -214,7 +214,7 @@ static int task_loop_one(ch390h_t* ch, luat_ch390h_cstring_t* cs) {
         if (netif_is_link_up(ch->netif)) {
             LLOGI("link is down %d %d", ch->spiid, ch->cspin);
             netif_set_link_down(ch->netif);
-            net_lwip2_set_link_state(ch->adapter_id, 0);
+            ulwip_netif_ip_event(&ch->ulwip);
             if (ch->dhcp) {
                 // 停止dhcp定时器
                 ulwip_dhcp_client_stop(&ch->ulwip);
@@ -226,7 +226,7 @@ static int task_loop_one(ch390h_t* ch, luat_ch390h_cstring_t* cs) {
     if (!netif_is_link_up(ch->netif)) {
         LLOGI("link is up %d %d %s", ch->spiid, ch->cspin, (NSR & (1<<7)) ? "10M" : "100M");
         netif_set_link_up(ch->netif);
-        net_lwip2_set_link_state(ch->adapter_id, 1);
+        ulwip_netif_ip_event(&ch->ulwip);
         if (ch->dhcp) {
             // 启动dhcp定时器
             ulwip_dhcp_client_start(&ch->ulwip);

+ 17 - 5
script/libs/dnsproxy.lua

@@ -24,6 +24,7 @@ function dnsproxy.on_request(sc, event)
             rxbuff:seek(0)
             local succ, data_len, remote_ip, remote_port = socket.rx(sc, rxbuff)
             if succ and data_len and data_len > 0 then
+                -- log.info("dnsproxy", "收到DNS查询数据", rxbuff:query():toHex())
                 if remote_ip and #remote_ip == 5 then
                     local ip1,ip2,ip3,ip4 = remote_ip:byte(2),remote_ip:byte(3),remote_ip:byte(4),remote_ip:byte(5)
                     remote_ip = string.format("%d.%d.%d.%d", ip1, ip2, ip3, ip4)
@@ -33,7 +34,7 @@ function dnsproxy.on_request(sc, event)
                     table.insert(dnsproxy.map, {txid_request, txid_map, remote_ip, remote_port})
                     rxbuff[0] = txid_map % 256
                     rxbuff[1] = txid_map // 256
-                    socket.tx(dnsproxy.main_sc, rxbuff, "114.114.114.114", 53)
+                    socket.tx(dnsproxy.main_sc, rxbuff, "223.5.5.5", 53)
                 end
             else
                 break
@@ -86,13 +87,24 @@ end
 ]]
 function dnsproxy.setup(adapter, main_adapter)
     log.info("dnsproxy", adapter, main_adapter)
-    dnsproxy.sc = socket.create(adapter, dnsproxy.on_request)
-    dnsproxy.main_sc = socket.create(main_adapter, dnsproxy.on_response)
+    dnsproxy.adapter = adapter
+    dnsproxy.main_adapter = main_adapter
+    dnsproxy.sc = socket.create(dnsproxy.adapter, dnsproxy.on_request)
+    dnsproxy.main_sc = socket.create(dnsproxy.main_adapter, dnsproxy.on_response)
     socket.config(dnsproxy.sc, 53, true)
     socket.config(dnsproxy.main_sc, nil, true)
-    socket.connect(dnsproxy.sc, "255.255.255.255", 0)
-    socket.connect(dnsproxy.main_sc, "114.114.114.114", 53)
+    dnsproxy.on_ip_ready()
     return true
 end
 
+function dnsproxy.on_ip_ready()
+    socket.close(dnsproxy.sc)
+    socket.close(dnsproxy.main_sc)
+    log.info("dnsproxy", "开启DNS代理")
+    socket.connect(dnsproxy.sc, "255.255.255.255", 0)
+    socket.connect(dnsproxy.main_sc, "223.5.5.5", 53)
+end
+
+sys.subscribe("IP_READY", dnsproxy.on_ip_ready)
+
 return dnsproxy

+ 21 - 1
script/libs/udpsrv.lua

@@ -13,6 +13,7 @@
 local sys = require "sys"
 
 local udpsrv = {}
+local srvs = {}
 
 --[[
 创建UDP服务器
@@ -28,11 +29,12 @@ function udpsrv.create(port, topic, adapter)
     -- srv.topic = topic
     srv.rxbuff = zbuff.create(1500)
     local sc = socket.create(adapter, function(sc, event)
-        -- log.info("udpsrv", sc, event)
+        -- log.info("udpsrv", sc, event, "EVENT", socket.EVENT, "CLOSED", socket.CLOSED)
         if event == socket.EVENT then
             local rxbuff = srv.rxbuff
             while 1 do
                 local succ, data_len, remote_ip, remote_port = socket.rx(sc, rxbuff)
+                -- log.info("udpsrv", "???", succ, data_len, remote_ip, remote_port)
                 if succ and data_len and data_len > 0 then
                     local resp = rxbuff:toStr(0, rxbuff:used())
                     rxbuff:del()
@@ -44,9 +46,16 @@ function udpsrv.create(port, topic, adapter)
                     end
                     sys.publish(topic, resp, remote_ip, remote_port)
                 else
+                    if not succ then
+                        socket.close(sc)
+                        socket.connect(sc, "255.255.255.255", 0)
+                    end
                     break
                 end
             end
+        elseif event == socket.CLOSED then
+            log.info("dhcpsrv", "网络中断,执行关闭流程")
+            socket.close(self.sc)
         end
     end)
     if sc == nil then
@@ -66,8 +75,10 @@ function udpsrv.create(port, topic, adapter)
             socket.close(self.sc)
             -- sys.wait(200)
             socket.release(self.sc)
+            srvs[self.sc] = nil
             self.sc = nil
         end
+        srvs[srv.sc] = true
         -- log.info("udpsrv", "监听开始")
         return srv
     end
@@ -77,4 +88,13 @@ function udpsrv.create(port, topic, adapter)
     -- log.info("udpsrv", "监听失败")
 end
 
+sys.subscribe("IP_READY", function()
+    for sc, value in pairs(srvs) do
+        log.info("udpsrv", "自动重连udpsrv", sc)
+        if sc then
+            socket.connect(sc, "255.255.255.255", 0)
+        end
+    end
+end)
+
 return udpsrv