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

Merge branch 'master' of https://gitee.com/openLuat/LuatOS

Dozingfiretruck 2 лет назад
Родитель
Сommit
d9a5a4bcfb
2 измененных файлов с 75 добавлено и 10 удалено
  1. 45 9
      components/network/ulwip/binding/luat_lib_ulwip.c
  2. 30 1
      script/libs/httpplus.lua

+ 45 - 9
components/network/ulwip/binding/luat_lib_ulwip.c

@@ -164,8 +164,8 @@ static err_t luat_netif_init(struct netif *netif) {
             #if LWIP_IPV6
             netif->output_ip6 = ethip6_output;
             #endif
-            netif->mtu        = 1460; // TODO 支持配置
-            netif->flags      = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET | NETIF_FLAG_IGMP | NETIF_FLAG_MLD6;
+            netif->mtu        = nets[i].mtu;
+            netif->flags      = nets[i].flags;
             memcpy(netif->hwaddr, nets[i].hwaddr, ETH_HWADDR_LEN);
             netif->hwaddr_len = ETH_HWADDR_LEN;
             return 0;
@@ -180,6 +180,7 @@ static err_t luat_netif_init(struct netif *netif) {
 @int adapter_index 适配器编号
 @string mac 网卡mac地址
 @function output_lua_ref 回调函数, 参数为(adapter_index, data)
+@table 额外参数, 例如 {mtu=1500, flags=(ulwip.FLAG_BROADCAST | ulwip.FLAG_ETHARP |)}
 @return boolean 成功与否
 @usage
 -- 初始化一个适配器, 并设置回调函数
@@ -187,6 +188,11 @@ ulwip.setup(socket.LWIP_STA, string.fromHex("18fe34a27b69"), function(adapter_in
     log.info("ulwip", "output_lua_ref", adapter_index, data:toHex())
 end)
 -- 注意, setup之后, netif的状态是down, 调用ulwip.updown(adapter_index, true)后, 才能正常收发数据
+
+-- 额外参数配置table可选值
+-- mtu, 默认1460
+-- flags, 默认 ulwip.FLAG_BROADCAST | ulwip.FLAG_ETHARP | ulwip.FLAG_ETHERNET | ulwip.FLAG_IGMP | ulwip.FLAG_MLD6
+-- 即如下格式 {mtu=1460, flags=(ulwip.FLAG_BROADCAST | ulwip.FLAG_ETHARP | ulwip.FLAG_ETHERNET | ulwip.FLAG_IGMP | ulwip.FLAG_MLD6)}
 */
 static int l_ulwip_setup(lua_State *L) {
     // 必须有适配器编号
@@ -202,6 +208,20 @@ static int l_ulwip_setup(lua_State *L) {
         LLOGE("output_lua_ref must be a function");
         return 0;
     }
+    int mtu = 1460;
+    int flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET | NETIF_FLAG_IGMP | NETIF_FLAG_MLD6;
+    if (lua_istable(L, 4)) {
+        lua_getfield(L, 4, "mtu");
+        if (lua_isinteger(L, -1)) {
+            mtu = luaL_checkinteger(L, -1);
+        }
+        lua_pop(L, 1);
+        lua_getfield(L, 4, "flags");
+        if (lua_isinteger(L, -1)) {
+            flags = luaL_checkinteger(L, -1);
+        }
+        lua_pop(L, 1);
+    }
     struct netif *netif = NULL;
     for (size_t i = 0; i < USERLWIP_NET_COUNT; i++)
     {
@@ -212,6 +232,8 @@ static int l_ulwip_setup(lua_State *L) {
                 memset(netif, 0, sizeof(struct netif));
                 nets[i].adapter_index = adapter_index;
                 nets[i].netif = netif;
+                nets[i].mtu = mtu;
+                nets[i].flags = flags;
                 lua_pushvalue(L, 3);
                 memcpy(nets[i].hwaddr, mac, ETH_HWADDR_LEN);
                 nets[i].output_lua_ref = luaL_ref(L, LUA_REGISTRYINDEX);
@@ -226,9 +248,9 @@ static int l_ulwip_setup(lua_State *L) {
     }
 
     // 已经分配netif, 继续初始化
-    #if defined(TYPE_EC718P)
-    net_lwip2_set_netif(adapter_index, netif, luat_netif_init, 0);
-    #else
+    // #if defined(TYPE_EC718P)
+    // net_lwip2_set_netif(adapter_index, netif, luat_netif_init, 0);
+    // #else
     netif_add(netif, IP4_ADDR_ANY, IP4_ADDR_ANY, IP4_ADDR_ANY, NULL, luat_netif_init, netif_input);
     netif->name[0] = 'u';
     netif->name[1] = 's';
@@ -237,17 +259,17 @@ static int l_ulwip_setup(lua_State *L) {
     netif->ip6_autoconfig_enabled = 1;
     #endif
 
-    #endif
+    // #endif
 
     #if LWIP_NETIF_STATUS_CALLBACK
     netif_set_status_callback(netif, netif_status_callback);
     #endif
 
-    #if defined(TYPE_EC718P)
+    // #if defined(TYPE_EC718P)
     // nothing
-    #else
+    // #else
     net_lwip2_set_netif(adapter_index, netif);
-    #endif
+    // #endif
     
     lua_pushboolean(L, 1);
     return 1;
@@ -475,6 +497,20 @@ static const rotable_Reg_t reg_ulwip[] =
     { "dhcp" ,              ROREG_FUNC(l_ulwip_dhcp)},
     { "ip" ,                ROREG_FUNC(l_ulwip_ip)},
     { "reg" ,               ROREG_FUNC(l_ulwip_reg)},
+
+    // 网卡FLAGS,默认
+    // NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET | NETIF_FLAG_IGMP | NETIF_FLAG_MLD6
+
+    // @const FLAG_BROADCAST number 支持广播
+    { "FLAG_BROADCAST",     ROREG_INT(NETIF_FLAG_BROADCAST)}, 
+    // @const FLAG_ETHARP number 支持ARP
+    { "FLAG_ETHARP",        ROREG_INT(NETIF_FLAG_ETHARP)}, 
+    // @const FLAG_ETHERNET number 以太网模式
+    { "FLAG_ETHERNET",      ROREG_INT(NETIF_FLAG_ETHERNET)}, 
+    // @const FLAG_IGMP number 支持IGMP
+    { "FLAG_IGMP",          ROREG_INT(NETIF_FLAG_IGMP)}, 
+    // @const FLAG_MLD6 number 支持_MLD6
+    { "FLAG_MLD6",          ROREG_INT(NETIF_FLAG_MLD6)}, 
 	{ NULL,                 ROREG_INT(0)}
 };
 

+ 30 - 1
script/libs/httpplus.lua

@@ -177,6 +177,17 @@ local function http_opts_parse(opts)
         end
     end
 
+    -- 直接设置bodyfile
+    if opts.bodyfile then
+        local fd = io.open(opts.bodyfile, "rb")
+        if not fd then
+            log.error("httpplus", "bodyfile失败,文件不存在", opts.bodyfile)
+            return -104, "bodyfile失败,文件不存在"
+        end
+        fd:close()
+        opts.body_len = io.fileSize(opts.bodyfile)
+    end
+
     -- 有设置body, 而且没设置长度
     if opts.body and (not opts.body_len or opts.body_len == 0) then
         -- body是zbuff的情况
@@ -229,7 +240,7 @@ local function http_opts_parse(opts)
         opts.timeout = 30
     end
 
-    return -- 完成,不需要返回值
+    return -- 成功完成,不需要返回值
 end
 
 
@@ -476,6 +487,23 @@ local function http_exec(opts)
         socket.tx(netc, opts.boundary)
         socket.tx(netc, "--\r\n")
         write_counter = write_counter + #opts.boundary + 2 + 2 + 2
+    elseif opts.bodyfile then
+        local fd = io.open(opts.bodyfile, "rb")
+        -- log.info("写入文件数据", v[1])
+        if fd then
+            while not opts.is_closed do
+                local fdata = fd:read(1400)
+                if not fdata or #fdata == 0 then
+                    break
+                end
+                -- log.info("写入文件数据", "长度", #fdata)
+                socket.tx(netc, fdata)
+                write_counter = write_counter + #fdata
+                -- 注意, 这里要等待TX_OK事件
+                sys.waitUntil(opts.topic, 3000)
+            end
+            fd:close()
+        end
     elseif opts.body then
         if type(opts.body) == "string" and #opts.body > 0 then
             socket.tx(netc, opts.body)
@@ -518,6 +546,7 @@ local opts = {
     try_ipv6 = false, -- 可选,是否优先尝试ipv6地址,默认是false
     adapter = nil,    -- 可选,网络适配器编号, 默认是自动选
     timeout = 30,     -- 可选,读取服务器响应的超时时间,单位秒,默认30
+    bodyfile = "xxx"  -- 可选,直接把文件内容作为body上传, 优先级高于body参数
 }
 
 local code, resp = httpplus.request({url="https://httpbin.air32.cn/get"})