net/nat: Add foreach interface for entries
Prepare for netlink conntrack dump of entries. Signed-off-by: Zhe Weng <wengzhe@xiaomi.com>
This commit is contained in:
parent
8f4f166bf0
commit
b0cf0acc66
@ -195,32 +195,25 @@ static void ipv4_nat_entry_delete(FAR ipv4_nat_entry_t *entry)
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#if CONFIG_NET_NAT_ENTRY_RECLAIM_SEC > 0
|
#if CONFIG_NET_NAT_ENTRY_RECLAIM_SEC > 0
|
||||||
|
static void ipv4_nat_reclaim_entry_cb(FAR ipv4_nat_entry_t *entry,
|
||||||
|
FAR void *arg)
|
||||||
|
{
|
||||||
|
int32_t current_time = *(FAR int32_t *)arg;
|
||||||
|
|
||||||
|
if (entry->expire_time - current_time <= 0)
|
||||||
|
{
|
||||||
|
ipv4_nat_entry_delete(entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void ipv4_nat_reclaim_entry(int32_t current_time)
|
static void ipv4_nat_reclaim_entry(int32_t current_time)
|
||||||
{
|
{
|
||||||
static int32_t next_reclaim_time = CONFIG_NET_NAT_ENTRY_RECLAIM_SEC;
|
static int32_t next_reclaim_time = CONFIG_NET_NAT_ENTRY_RECLAIM_SEC;
|
||||||
|
|
||||||
if (next_reclaim_time - current_time <= 0)
|
if (next_reclaim_time - current_time <= 0)
|
||||||
{
|
{
|
||||||
FAR hash_node_t *p;
|
|
||||||
FAR hash_node_t *tmp;
|
|
||||||
int count = 0;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
ninfo("INFO: Reclaiming all expired NAT44 entries.\n");
|
ninfo("INFO: Reclaiming all expired NAT44 entries.\n");
|
||||||
|
ipv4_nat_entry_foreach(ipv4_nat_reclaim_entry_cb, ¤t_time);
|
||||||
hashtable_for_every_safe(g_nat44_inbound, p, tmp, i)
|
|
||||||
{
|
|
||||||
FAR ipv4_nat_entry_t *entry =
|
|
||||||
container_of(p, ipv4_nat_entry_t, hash_inbound);
|
|
||||||
|
|
||||||
if (entry->expire_time - current_time <= 0)
|
|
||||||
{
|
|
||||||
ipv4_nat_entry_delete(entry);
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ninfo("INFO: %d expired NAT44 entries reclaimed.\n", count);
|
|
||||||
next_reclaim_time = current_time + CONFIG_NET_NAT_ENTRY_RECLAIM_SEC;
|
next_reclaim_time = current_time + CONFIG_NET_NAT_ENTRY_RECLAIM_SEC;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -228,6 +221,26 @@ static void ipv4_nat_reclaim_entry(int32_t current_time)
|
|||||||
# define ipv4_nat_reclaim_entry(t)
|
# define ipv4_nat_reclaim_entry(t)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: ipv4_nat_entry_clear_cb
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Clear an entry related to dev. Called when NAT will be disabled on
|
||||||
|
* any device.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static void ipv4_nat_entry_clear_cb(FAR ipv4_nat_entry_t *entry,
|
||||||
|
FAR void *arg)
|
||||||
|
{
|
||||||
|
FAR struct net_driver_s *dev = arg;
|
||||||
|
|
||||||
|
if (net_ipv4addr_cmp(entry->external_ip, dev->d_ipaddr))
|
||||||
|
{
|
||||||
|
ipv4_nat_entry_delete(entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Functions
|
* Public Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -248,22 +261,35 @@ static void ipv4_nat_reclaim_entry(int32_t current_time)
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
void ipv4_nat_entry_clear(FAR struct net_driver_s *dev)
|
void ipv4_nat_entry_clear(FAR struct net_driver_s *dev)
|
||||||
|
{
|
||||||
|
ninfo("INFO: Clearing all NAT44 entries for %s\n", dev->d_ifname);
|
||||||
|
ipv4_nat_entry_foreach(ipv4_nat_entry_clear_cb, dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: ipv4_nat_entry_foreach
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Call the callback function for each NAT entry.
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* cb - The callback function.
|
||||||
|
* arg - The argument to pass to the callback function.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void ipv4_nat_entry_foreach(ipv4_nat_entry_cb_t cb, FAR void *arg)
|
||||||
{
|
{
|
||||||
FAR hash_node_t *p;
|
FAR hash_node_t *p;
|
||||||
FAR hash_node_t *tmp;
|
FAR hash_node_t *tmp;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
ninfo("INFO: Clearing all NAT44 entries for %s\n", dev->d_ifname);
|
|
||||||
|
|
||||||
hashtable_for_every_safe(g_nat44_inbound, p, tmp, i)
|
hashtable_for_every_safe(g_nat44_inbound, p, tmp, i)
|
||||||
{
|
{
|
||||||
FAR ipv4_nat_entry_t *entry =
|
FAR ipv4_nat_entry_t *entry =
|
||||||
container_of(p, ipv4_nat_entry_t, hash_inbound);
|
container_of(p, ipv4_nat_entry_t, hash_inbound);
|
||||||
|
|
||||||
if (net_ipv4addr_cmp(entry->external_ip, dev->d_ipaddr))
|
cb(entry, arg);
|
||||||
{
|
|
||||||
ipv4_nat_entry_delete(entry);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -188,32 +188,25 @@ static void ipv6_nat_entry_delete(FAR ipv6_nat_entry_t *entry)
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#if CONFIG_NET_NAT_ENTRY_RECLAIM_SEC > 0
|
#if CONFIG_NET_NAT_ENTRY_RECLAIM_SEC > 0
|
||||||
|
static void ipv6_nat_reclaim_entry_cb(FAR ipv6_nat_entry_t *entry,
|
||||||
|
FAR void *arg)
|
||||||
|
{
|
||||||
|
int32_t current_time = *(FAR int32_t *)arg;
|
||||||
|
|
||||||
|
if (entry->expire_time - current_time <= 0)
|
||||||
|
{
|
||||||
|
ipv6_nat_entry_delete(entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void ipv6_nat_reclaim_entry(int32_t current_time)
|
static void ipv6_nat_reclaim_entry(int32_t current_time)
|
||||||
{
|
{
|
||||||
static int32_t next_reclaim_time = CONFIG_NET_NAT_ENTRY_RECLAIM_SEC;
|
static int32_t next_reclaim_time = CONFIG_NET_NAT_ENTRY_RECLAIM_SEC;
|
||||||
|
|
||||||
if (next_reclaim_time - current_time <= 0)
|
if (next_reclaim_time - current_time <= 0)
|
||||||
{
|
{
|
||||||
FAR hash_node_t *p;
|
|
||||||
FAR hash_node_t *tmp;
|
|
||||||
int count = 0;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
ninfo("INFO: Reclaiming all expired NAT66 entries.\n");
|
ninfo("INFO: Reclaiming all expired NAT66 entries.\n");
|
||||||
|
ipv6_nat_entry_foreach(ipv6_nat_reclaim_entry_cb, ¤t_time);
|
||||||
hashtable_for_every_safe(g_nat66_inbound, p, tmp, i)
|
|
||||||
{
|
|
||||||
FAR ipv6_nat_entry_t *entry =
|
|
||||||
container_of(p, ipv6_nat_entry_t, hash_inbound);
|
|
||||||
|
|
||||||
if (entry->expire_time - current_time <= 0)
|
|
||||||
{
|
|
||||||
ipv6_nat_entry_delete(entry);
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ninfo("INFO: %d expired NAT66 entries reclaimed.\n", count);
|
|
||||||
next_reclaim_time = current_time + CONFIG_NET_NAT_ENTRY_RECLAIM_SEC;
|
next_reclaim_time = current_time + CONFIG_NET_NAT_ENTRY_RECLAIM_SEC;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -221,6 +214,26 @@ static void ipv6_nat_reclaim_entry(int32_t current_time)
|
|||||||
# define ipv6_nat_reclaim_entry(t)
|
# define ipv6_nat_reclaim_entry(t)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: ipv6_nat_entry_clear_cb
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Clear an entry related to dev. Called when NAT will be disabled on
|
||||||
|
* any device.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static void ipv6_nat_entry_clear_cb(FAR ipv6_nat_entry_t *entry,
|
||||||
|
FAR void *arg)
|
||||||
|
{
|
||||||
|
FAR struct net_driver_s *dev = arg;
|
||||||
|
|
||||||
|
if (NETDEV_IS_MY_V6ADDR(dev, entry->external_ip))
|
||||||
|
{
|
||||||
|
ipv6_nat_entry_delete(entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Functions
|
* Public Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -241,22 +254,35 @@ static void ipv6_nat_reclaim_entry(int32_t current_time)
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
void ipv6_nat_entry_clear(FAR struct net_driver_s *dev)
|
void ipv6_nat_entry_clear(FAR struct net_driver_s *dev)
|
||||||
|
{
|
||||||
|
ninfo("INFO: Clearing all NAT66 entries for %s\n", dev->d_ifname);
|
||||||
|
ipv6_nat_entry_foreach(ipv6_nat_entry_clear_cb, dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: ipv6_nat_entry_foreach
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Call the callback function for each NAT entry.
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* cb - The callback function.
|
||||||
|
* arg - The argument to pass to the callback function.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void ipv6_nat_entry_foreach(ipv6_nat_entry_cb_t cb, FAR void *arg)
|
||||||
{
|
{
|
||||||
FAR hash_node_t *p;
|
FAR hash_node_t *p;
|
||||||
FAR hash_node_t *tmp;
|
FAR hash_node_t *tmp;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
ninfo("INFO: Clearing all NAT66 entries for %s\n", dev->d_ifname);
|
|
||||||
|
|
||||||
hashtable_for_every_safe(g_nat66_inbound, p, tmp, i)
|
hashtable_for_every_safe(g_nat66_inbound, p, tmp, i)
|
||||||
{
|
{
|
||||||
FAR ipv6_nat_entry_t *entry =
|
FAR ipv6_nat_entry_t *entry =
|
||||||
container_of(p, ipv6_nat_entry_t, hash_inbound);
|
container_of(p, ipv6_nat_entry_t, hash_inbound);
|
||||||
|
|
||||||
if (NETDEV_IS_MY_V6ADDR(dev, entry->external_ip))
|
cb(entry, arg);
|
||||||
{
|
|
||||||
ipv6_nat_entry_delete(entry);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,6 +123,11 @@ struct ipv6_nat_entry_s
|
|||||||
typedef struct ipv4_nat_entry_s ipv4_nat_entry_t;
|
typedef struct ipv4_nat_entry_s ipv4_nat_entry_t;
|
||||||
typedef struct ipv6_nat_entry_s ipv6_nat_entry_t;
|
typedef struct ipv6_nat_entry_s ipv6_nat_entry_t;
|
||||||
|
|
||||||
|
typedef CODE void (*ipv4_nat_entry_cb_t)(FAR ipv4_nat_entry_t *entry,
|
||||||
|
FAR void *arg);
|
||||||
|
typedef CODE void (*ipv6_nat_entry_cb_t)(FAR ipv6_nat_entry_t *entry,
|
||||||
|
FAR void *arg);
|
||||||
|
|
||||||
/* NAT IP/Port manipulate type, to indicate whether to manipulate source or
|
/* NAT IP/Port manipulate type, to indicate whether to manipulate source or
|
||||||
* destination IP/Port in a packet.
|
* destination IP/Port in a packet.
|
||||||
*/
|
*/
|
||||||
@ -281,6 +286,25 @@ uint16_t nat_port_select(FAR struct net_driver_s *dev,
|
|||||||
|
|
||||||
uint32_t nat_expire_time(uint8_t protocol);
|
uint32_t nat_expire_time(uint8_t protocol);
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: ipv4/ipv6_nat_entry_foreach
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Call the callback function for each NAT entry.
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* cb - The callback function.
|
||||||
|
* arg - The argument to pass to the callback function.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_NET_NAT44
|
||||||
|
void ipv4_nat_entry_foreach(ipv4_nat_entry_cb_t cb, FAR void *arg);
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_NET_NAT66
|
||||||
|
void ipv6_nat_entry_foreach(ipv6_nat_entry_cb_t cb, FAR void *arg);
|
||||||
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: ipv4/ipv6_nat_entry_clear
|
* Name: ipv4/ipv6_nat_entry_clear
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user