diff options
author | Hanhui <hanhui@acoinfo.com> | 2020-07-01 13:53:22 (GMT) |
---|---|---|
committer | Hanhui <hanhui@acoinfo.com> | 2020-07-01 13:53:22 (GMT) |
commit | fb1f48d22dec1108ef92fc95581303dc85b3ccfe (patch) | |
tree | 5efd79ed1ed52d10898b2a079ea1b19f8a22f787 /SylixOS | |
parent | cf4dd2a0fda4559030e32fa9786d298e8825bad0 (diff) | |
download | libsylixos-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.h | 4 | ||||
-rw-r--r-- | SylixOS/kernel/include/k_kernel.h | 2 | ||||
-rw-r--r-- | SylixOS/net/lwip/tools/nat/lwip_nat.c | 30 | ||||
-rw-r--r-- | SylixOS/net/lwip/tools/nat/lwip_nat.h | 4 | ||||
-rw-r--r-- | SylixOS/net/lwip/tools/nat/lwip_natlib.c | 98 | ||||
-rw-r--r-- | SylixOS/net/lwip/tools/nat/lwip_natlib.h | 2 |
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, |