summaryrefslogtreecommitdiffstatsabout
path: root/SylixOS
diff options
context:
space:
mode:
authorHanhui <hanhui@acoinfo.com>2020-07-01 13:53:22 (GMT)
committer Hanhui <hanhui@acoinfo.com>2020-07-01 13:53:22 (GMT)
commitfb1f48d22dec1108ef92fc95581303dc85b3ccfe (patch)
tree5efd79ed1ed52d10898b2a079ea1b19f8a22f787 /SylixOS
parentcf4dd2a0fda4559030e32fa9786d298e8825bad0 (diff)
downloadlibsylixos-fb1f48d22dec1108ef92fc95581303dc85b3ccfe.zip
libsylixos-fb1f48d22dec1108ef92fc95581303dc85b3ccfe.tar.gz
libsylixos-fb1f48d22dec1108ef92fc95581303dc85b3ccfe.tar.bz2
NAT support remove LAN or WAN port.
Diffstat (limited to 'SylixOS')
-rw-r--r--SylixOS/config/net/net_tools_cfg.h4
-rw-r--r--SylixOS/kernel/include/k_kernel.h2
-rw-r--r--SylixOS/net/lwip/tools/nat/lwip_nat.c30
-rw-r--r--SylixOS/net/lwip/tools/nat/lwip_nat.h4
-rw-r--r--SylixOS/net/lwip/tools/nat/lwip_natlib.c98
-rw-r--r--SylixOS/net/lwip/tools/nat/lwip_natlib.h2
6 files changed, 127 insertions, 13 deletions
diff --git a/SylixOS/config/net/net_tools_cfg.h b/SylixOS/config/net/net_tools_cfg.h
index 14c474e..af1412c 100644
--- a/SylixOS/config/net/net_tools_cfg.h
+++ b/SylixOS/config/net/net_tools_cfg.h
@@ -119,8 +119,8 @@
*********************************************************************************************************/
#define LW_CFG_NET_NAT_EN 1 /* 是否使用 NAT 服务 */
-#define LW_CFG_NET_NAT_MAX_AP_IF 2 /* NAT 外网接口数量 */
-#define LW_CFG_NET_NAT_MAX_LOCAL_IF 2 /* NAT 内网接口数量 */
+#define LW_CFG_NET_NAT_MAX_AP_IF 5 /* NAT 外网接口数量 */
+#define LW_CFG_NET_NAT_MAX_LOCAL_IF 5 /* NAT 内网接口数量 */
#define LW_CFG_NET_NAT_MAX_SESSION 2048 /* NAT 最大会话个数 256-24576 */
#define LW_CFG_NET_NAT_IDLE_TIMEOUT 15 /* NAT 空闲链接超时, 单位:分钟 */
diff --git a/SylixOS/kernel/include/k_kernel.h b/SylixOS/kernel/include/k_kernel.h
index f3decd5..c41165c 100644
--- a/SylixOS/kernel/include/k_kernel.h
+++ b/SylixOS/kernel/include/k_kernel.h
@@ -51,7 +51,7 @@
#define __SYLIXOS_MAJOR_VER 1
#define __SYLIXOS_MINOR_VER 12
-#define __SYLIXOS_PATCH_VER 3
+#define __SYLIXOS_PATCH_VER 5
#define __SYLIXOS_PATCH_PAD 0
/*********************************************************************************************************
diff --git a/SylixOS/net/lwip/tools/nat/lwip_nat.c b/SylixOS/net/lwip/tools/nat/lwip_nat.c
index d9e96d3..e2720a5 100644
--- a/SylixOS/net/lwip/tools/nat/lwip_nat.c
+++ b/SylixOS/net/lwip/tools/nat/lwip_nat.c
@@ -219,6 +219,21 @@ INT API_INetNatLocalAdd (CPCHAR pcLocalNetif)
return (ERROR_NONE);
}
/*********************************************************************************************************
+** 函数名称: API_INetNatLocalDelete
+** 功能描述: 在 NAT 网络中删除本地接口
+** 输 入 : pcLocalNetif 本地内网网络接口名
+** 输 出 : ERROR or OK
+** 全局变量:
+** 调用模块:
+** 注 意 : 不需要 IF list 锁
+ API 函数
+*********************************************************************************************************/
+LW_API
+INT API_INetNatLocalDelete (CPCHAR pcLocalNetif)
+{
+ return (__natDeleteLocal(pcLocalNetif));
+}
+/*********************************************************************************************************
** 函数名称: API_INetNatWanAdd
** 功能描述: 在 NAT 网络中增加 WAN 接口
** 输 入 : pcApNetif 外网网络接口名
@@ -240,6 +255,21 @@ INT API_INetNatWanAdd (CPCHAR pcApNetif)
return (ERROR_NONE);
}
/*********************************************************************************************************
+** 函数名称: API_INetNatWanDelete
+** 功能描述: 在 NAT 网络中删除 WAN 接口
+** 输 入 : pcApNetif 外网网络接口名
+** 输 出 : ERROR or OK
+** 全局变量:
+** 调用模块:
+** 注 意 : 不需要 IF list 锁
+ API 函数
+*********************************************************************************************************/
+LW_API
+INT API_INetNatWanDelete (CPCHAR pcApNetif)
+{
+ return (__natDeleteAp(pcApNetif));
+}
+/*********************************************************************************************************
** 函数名称: API_INetNatMapAdd
** 功能描述: 创建内网外网映射
** 输 入 : pcLocalIp 内网 IP
diff --git a/SylixOS/net/lwip/tools/nat/lwip_nat.h b/SylixOS/net/lwip/tools/nat/lwip_nat.h
index b76198a..b2daa62 100644
--- a/SylixOS/net/lwip/tools/nat/lwip_nat.h
+++ b/SylixOS/net/lwip/tools/nat/lwip_nat.h
@@ -33,7 +33,9 @@ LW_API INT API_INetNatStop(VOID);
LW_API INT API_INetNatIpFragSet(UINT8 ucProto, BOOL bOn);
LW_API INT API_INetNatIpFragGet(UINT8 ucProto, BOOL *pbOn);
LW_API INT API_INetNatLocalAdd(CPCHAR pcLocalNetif);
+LW_API INT API_INetNatLocalDelete(CPCHAR pcLocalNetif);
LW_API INT API_INetNatWanAdd(CPCHAR pcApNetif);
+LW_API INT API_INetNatWanDelete(CPCHAR pcApNetif);
LW_API INT API_INetNatMapAdd(CPCHAR pcLocalIp, UINT16 usIpCnt, UINT16 usLocalPort,
UINT16 usAssPort, UINT8 ucProto);
LW_API INT API_INetNatMapDelete(CPCHAR pcLocalIp, UINT16 usLocalPort,
@@ -47,7 +49,9 @@ LW_API INT API_INetNatAliasDelete(CPCHAR pcAliasIp);
#define inetNatIpFragSet API_INetNatIpFragSet
#define inetNatIpFragGet API_INetNatIpFragGet
#define inetNatLocalAdd API_INetNatLocalAdd
+#define inetNatLocalDelete API_INetNatLocalDelete
#define inetNatWanAdd API_INetNatWanAdd
+#define inetNatWanDelete API_INetNatWanDelete
#define inetNatMapAdd API_INetNatMapAdd
#define inetNatMapDelete API_INetNatMapDelete
#define inetNatAliasAdd API_INetNatAliasAdd
diff --git a/SylixOS/net/lwip/tools/nat/lwip_natlib.c b/SylixOS/net/lwip/tools/nat/lwip_natlib.c
index 157f44b..91cddd6 100644
--- a/SylixOS/net/lwip/tools/nat/lwip_natlib.c
+++ b/SylixOS/net/lwip/tools/nat/lwip_natlib.c
@@ -41,6 +41,7 @@
2019.04.09 NAT AP 端口支持主机安全隔离.
2019.05.20 MAP 0.0.0.0 作为本机映射.
2020.02.25 三大协议皆使用 Hash 表, 提高转发查找速度.
+2020.06.30 增加网络接口退出 NAT 功能.
*********************************************************************************************************/
#define __SYLIXOS_STDIO
#define __SYLIXOS_KERNEL
@@ -1439,9 +1440,14 @@ INT __natStart (CPCHAR pcLocal, CPCHAR pcAp)
return (PX_ERROR);
}
+ if (net_ip_hook_nat_add(__natIphook)) {
+ return (PX_ERROR);
+ }
+
lib_strlcpy(_G_natifAp[0].NATIF_cIfName, pcAp, IF_NAMESIZE);
lib_strlcpy(_G_natifLocal[0].NATIF_cIfName, pcLocal, IF_NAMESIZE);
+ __NAT_LOCK();
_G_natifLocal[0].NATIF_pnetif = netif_find(pcLocal);
if (_G_natifLocal[0].NATIF_pnetif) {
_G_natifLocal[0].NATIF_pnetif->nat_mode = NETIF_NAT_LOCAL;
@@ -1451,18 +1457,14 @@ INT __natStart (CPCHAR pcLocal, CPCHAR pcAp)
if (_G_natifAp[0].NATIF_pnetif) {
_G_natifAp[0].NATIF_pnetif->nat_mode = NETIF_NAT_AP;
}
-
- if (net_ip_hook_nat_add(__natIphook)) {
- return (PX_ERROR);
- }
+ __NAT_UNLOCK();
API_TimerStart(_G_ulNatcbTimer, (LW_TICK_HZ * 10), LW_OPTION_AUTO_RESTART,
(PTIMER_CALLBACK_ROUTINE)__natTimer, (PVOID)10);
- __NAT_LOCK();
_G_bNatStart = LW_TRUE;
- __NAT_UNLOCK();
-
+ KN_SMP_WMB();
+
return (ERROR_NONE);
}
/*********************************************************************************************************
@@ -1598,12 +1600,50 @@ INT __natAddLocal (CPCHAR pcLocal)
return (PX_ERROR);
}
__NAT_UNLOCK();
-
+
_G_natifLocal[i].NATIF_pnetif = netif_find(pcLocal);
if (_G_natifLocal[i].NATIF_pnetif) {
_G_natifLocal[i].NATIF_pnetif->nat_mode = NETIF_NAT_LOCAL;
}
-
+
+ return (ERROR_NONE);
+}
+/*********************************************************************************************************
+** 函数名称: __natDeleteLocal
+** 功能描述: NAT 删除一个本地网络接口
+** 输 入 : pcLocal 本地网络接口
+** 输 出 : ERROR or OK
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+INT __natDeleteLocal (CPCHAR pcLocal)
+{
+ INT i;
+
+ __NAT_LOCK();
+ if (!_G_bNatStart) {
+ __NAT_UNLOCK();
+ _ErrorHandle(ENOTCONN);
+ return (PX_ERROR);
+ }
+ for (i = 0; i < LW_CFG_NET_NAT_MAX_LOCAL_IF; i++) {
+ if (_G_natifLocal[i].NATIF_cIfName[0] &&
+ !lib_strcmp(_G_natifLocal[i].NATIF_cIfName, pcLocal)) {
+ _G_natifLocal[i].NATIF_cIfName[0] = PX_EOS;
+ if (_G_natifLocal[i].NATIF_pnetif) {
+ _G_natifLocal[i].NATIF_pnetif->nat_mode = NETIF_NAT_NONE;
+ _G_natifLocal[i].NATIF_pnetif = NULL;
+ }
+ break;
+ }
+ }
+ if (i >= LW_CFG_NET_NAT_MAX_LOCAL_IF) {
+ __NAT_UNLOCK();
+ _ErrorHandle(ENODEV);
+ return (PX_ERROR);
+ }
+ __NAT_UNLOCK();
+
return (ERROR_NONE);
}
/*********************************************************************************************************
@@ -1636,7 +1676,7 @@ INT __natAddAp (CPCHAR pcAp)
return (PX_ERROR);
}
__NAT_UNLOCK();
-
+
_G_natifAp[i].NATIF_pnetif = netif_find(pcAp);
if (_G_natifAp[i].NATIF_pnetif) {
_G_natifAp[i].NATIF_pnetif->nat_mode = NETIF_NAT_AP;
@@ -1645,6 +1685,44 @@ INT __natAddAp (CPCHAR pcAp)
return (ERROR_NONE);
}
/*********************************************************************************************************
+** 函数名称: __natDeleteAp
+** 功能描述: NAT 删除一个出口网络接口
+** 输 入 : pcAp 出口网络接口
+** 输 出 : ERROR or OK
+** 全局变量:
+** 调用模块:
+*********************************************************************************************************/
+INT __natDeleteAp (CPCHAR pcAp)
+{
+ INT i;
+
+ __NAT_LOCK();
+ if (!_G_bNatStart) {
+ __NAT_UNLOCK();
+ _ErrorHandle(ENOTCONN);
+ return (PX_ERROR);
+ }
+ for (i = 0; i < LW_CFG_NET_NAT_MAX_AP_IF; i++) {
+ if (_G_natifAp[i].NATIF_cIfName[0] &&
+ !lib_strcmp(_G_natifAp[i].NATIF_cIfName, pcAp)) {
+ _G_natifAp[i].NATIF_cIfName[0] = PX_EOS;
+ if (_G_natifAp[i].NATIF_pnetif) {
+ _G_natifAp[i].NATIF_pnetif->nat_mode = NETIF_NAT_NONE;
+ _G_natifAp[i].NATIF_pnetif = NULL;
+ }
+ break;
+ }
+ }
+ if (i >= LW_CFG_NET_NAT_MAX_AP_IF) {
+ __NAT_UNLOCK();
+ _ErrorHandle(ENODEV);
+ return (PX_ERROR);
+ }
+ __NAT_UNLOCK();
+
+ return (ERROR_NONE);
+}
+/*********************************************************************************************************
NAT proc
*********************************************************************************************************/
#if LW_CFG_PROCFS_EN > 0
diff --git a/SylixOS/net/lwip/tools/nat/lwip_natlib.h b/SylixOS/net/lwip/tools/nat/lwip_natlib.h
index 4a170ed..d72a80a 100644
--- a/SylixOS/net/lwip/tools/nat/lwip_natlib.h
+++ b/SylixOS/net/lwip/tools/nat/lwip_natlib.h
@@ -97,7 +97,9 @@ INT __natStop(VOID);
INT __natIpFragSet(UINT8 ucProto, BOOL bOn);
INT __natIpFragGet(UINT8 ucProto, BOOL *pbOn);
INT __natAddLocal(CPCHAR pcLocal);
+INT __natDeleteLocal(CPCHAR pcLocal);
INT __natAddAp(CPCHAR pcAp);
+INT __natDeleteAp(CPCHAR pcAp);
INT __natMapAdd(ip4_addr_t *pipaddr, u16_t usIpCnt, u16_t usPort, u16_t AssPort, u8_t ucProto);
INT __natMapDelete(ip4_addr_t *pipaddr, u16_t usPort, u16_t AssPort, u8_t ucProto);
INT __natAliasAdd(const ip4_addr_t *pipaddrAlias,