Ver Fonte

update: netdrv-napt的tcp映射,拦截不合理的映射关系,减少映射表的消耗

Wendal Chen há 1 ano atrás
pai
commit
2955dffa47

+ 14 - 34
components/network/netdrv/src/ch390h_task.c

@@ -33,7 +33,7 @@ extern ch390h_t* ch390h_drvs[MAX_CH390H_NUM];
 
 static luat_rtos_task_handle ch390h_task_handle;
 
-// static int is_waiting;
+// static uint32_t remain_tx_size;
 
 static int ch390h_bootup(ch390h_t* ch) {
     // 初始化SPI设备, 由外部代码初始化, 因为不同bsp的速度不一样, 就不走固定值了
@@ -63,20 +63,9 @@ static void ch390h_dataout(void* userdata, uint8_t* buff, uint16_t len) {
     }
     cs->len = len;
     memcpy(cs->buff, buff, len);
-    LLOGD("数据传递到驱动task %p %p %d", ch, cs, len);
+    // remain_tx_size += len;
+    // LLOGD("数据传递到驱动task %p %p %d remain %ld", ch, cs, len, remain_tx_size);
     luat_rtos_event_send(ch390h_task_handle, 1, (uint32_t)ch, (uint32_t)cs, 0, 0);
-    // for (size_t j = 0; j < CH390H_MAX_TX_NUM; j++)
-    // {
-    //     if (ch->txqueue[j] == NULL) {
-    //         ch->txqueue[j] = cs;
-    //         // LLOGD("找到空位了 %d", j);
-    //         if (is_waiting) {
-    //             luat_rtos_event_send(ch390h_task_handle, 0, 0, 0, 0, 0);
-    //         }
-    //         return;
-    //     }
-    // }
-    // luat_heap_opt_free(LUAT_HEAP_PSRAM, cs);
     return;
 }
 
@@ -88,20 +77,10 @@ static void ch390h_dataout_pbuf(ch390h_t* ch, struct pbuf* p) {
     }
     cs->len = p->tot_len;
     pbuf_copy_partial(p, cs->buff, p->tot_len, 0);
-    LLOGD("数据传递到驱动task %p %p %d", ch, cs, cs->len);
+    // LLOGD("数据传递到驱动task %p %p %d", ch, cs, cs->len);
     luat_rtos_event_send(ch390h_task_handle, 1, (uint32_t)ch, (uint32_t)cs, 0, 0);
-    // for (size_t j = 0; j < CH390H_MAX_TX_NUM; j++)
-    // {
-    //     if (ch->txqueue[j] == NULL) {
-    //         ch->txqueue[j] = cs;
-    //         // LLOGD("找到空位了 %d", j);
-    //         if (is_waiting) {
-    //             luat_rtos_event_send(ch390h_task_handle, 0, 0, 0, 0, 0);
-    //         }
-    //         return;
-    //     }
-    // }
-    // luat_heap_opt_free(LUAT_HEAP_PSRAM, cs);
+    // remain_tx_size += p->tot_len;
+    // LLOGD("数据传递到驱动task %p %p %d remain %ld", ch, cs, p->tot_len, remain_tx_size);
     return;
 }
 
@@ -159,7 +138,7 @@ static void netdrv_netif_input(void* args) {
         return;
     }
     pbuf_take(p, ptr->buff, ptr->len);
-    LLOGD("数据注入到netif " MACFMT, MAC_ARG(p->payload));
+    // LLOGD("数据注入到netif " MACFMT, MAC_ARG(p->payload));
     int ret = ptr->netif->input(p, ptr->netif);
     if (ret) {
         pbuf_free(p);
@@ -247,7 +226,7 @@ static int task_loop_one(ch390h_t* ch, luat_ch390h_cstring_t* cs) {
     }
 
     if (cs) {
-        LLOGD("数据写入 %p %d", cs->buff, cs->len);
+        // LLOGD("数据写入 %p %d", cs->buff, cs->len);
         luat_ch390h_write_pkg(ch, cs->buff, cs->len);
     }
 
@@ -270,12 +249,12 @@ static int task_loop_one(ch390h_t* ch, luat_ch390h_cstring_t* cs) {
             // 收到数据, 开始后续处理
             print_erp_pkg(ch->rxbuff, len);
             // 先经过netdrv过滤器
-            LLOGD("ETH数据包 " MACFMT " " MACFMT " %02X%02X", MAC_ARG(ch->rxbuff), MAC_ARG(ch->rxbuff + 6), ((uint16_t)ch->rxbuff[6]) + (((uint16_t)ch->rxbuff[7])));
+            // LLOGD("ETH数据包 " MACFMT " " MACFMT " %02X%02X", MAC_ARG(ch->rxbuff), MAC_ARG(ch->rxbuff + 6), ((uint16_t)ch->rxbuff[6]) + (((uint16_t)ch->rxbuff[7])));
             ret = luat_netdrv_napt_pkg_input(ch->adapter_id, ch->rxbuff, len - 4);
-            LLOGD("napt ret %d", ret);
+            // LLOGD("napt ret %d", ret);
             if (ret != 0) {
                 // 不需要输入到LWIP了
-                LLOGD("napt说不需要注入lwip了");
+                // LLOGD("napt说不需要注入lwip了");
             }
             else {
                 // 如果返回值是0, 那就是继续处理, 输入到netif
@@ -348,15 +327,16 @@ static void ch390_task_main(void* args) {
         // luat_rtos_task_sleep(10);
         if (ret == 0) {
             // is_waiting = 1;
-            ret = luat_rtos_event_recv(ch390h_task_handle, 0, &evt, NULL, 10);
+            ret = luat_rtos_event_recv(ch390h_task_handle, 0, &evt, NULL, 5);
             // is_waiting = 0;
             if (ret == 0) {
                 // 收到消息了
                 ch = (ch390h_t *)evt.param1;
                 cs = (luat_ch390h_cstring_t*)evt.param2;
-                LLOGD("收到消息 %p %p", ch, cs);
+                // LLOGD("收到消息 %p %p", ch, cs);
                 ret = task_loop(ch, cs);
                 if (cs) {
+                    // remain_tx_size -= cs->len;
                     luat_heap_opt_free(LUAT_HEAP_PSRAM, cs);
                     cs = NULL;
                 }

+ 8 - 0
components/network/netdrv/src/luat_netdrv_napt_tcp.c

@@ -209,6 +209,14 @@ int luat_napt_tcp_handle(napt_ctx_t* ctx) {
         }
         // 寻找一个空位
         if (it_map == NULL) {
+            if ((TCPH_FLAGS(tcp_hdr) & (TCP_SYN|TCP_ACK)) == TCP_SYN && PP_NTOHS(tcp_hdr->src) >= 1024) {
+                // 允许新增映射
+            }
+            else {
+                LLOGI("非SYN包/源端口小于1024,且没有已知映射,不允许新增映射 %02X %d", TCPH_FLAGS(tcp_hdr), PP_NTOHS(tcp_hdr->src));
+                // TODO 应该返回RST?
+                return 0;
+            }
             for (size_t i = 0; i < TCP_MAP_SIZE; i++) {
                 it = &tcps[i];
                 if (it->is_vaild) {