mirror of
https://github.com/apache/nuttx.git
synced 2026-05-29 20:56:47 +08:00
net/nat: Slightly optimize the IPv4 NAT
1. Reduce getting `old_ip` in `ipv4_nat_ip_adjust`. 2. Some format change. Signed-off-by: Zhe Weng <wengzhe@xiaomi.com>
This commit is contained in:
+16
-20
@@ -140,17 +140,15 @@ static inline uint8_t ipv4_nat_l4_hdrlen(uint8_t proto)
|
|||||||
* Input Parameters:
|
* Input Parameters:
|
||||||
* ipv4 - Points to the IPv4 header to adjust.
|
* ipv4 - Points to the IPv4 header to adjust.
|
||||||
* l4chksum - Points to the L4 checksum to adjust, NULL for not adjust.
|
* l4chksum - Points to the L4 checksum to adjust, NULL for not adjust.
|
||||||
|
* old_ip - The IP to be set.
|
||||||
* new_ip - The IP to set into header.
|
* new_ip - The IP to set into header.
|
||||||
* manip_type - Whether manipulate source ip or destination ip.
|
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void ipv4_nat_ip_adjust(FAR struct ipv4_hdr_s *ipv4,
|
static void ipv4_nat_ip_adjust(FAR struct ipv4_hdr_s *ipv4,
|
||||||
FAR uint16_t *l4chksum, in_addr_t new_ip,
|
FAR uint16_t *l4chksum, FAR uint16_t *old_ip,
|
||||||
enum nat_manip_type_e manip_type)
|
in_addr_t new_ip)
|
||||||
{
|
{
|
||||||
FAR uint16_t *old_ip = MANIP_IPADDR(ipv4, manip_type);
|
|
||||||
|
|
||||||
if (l4chksum != NULL)
|
if (l4chksum != NULL)
|
||||||
{
|
{
|
||||||
chksum_adjust(l4chksum, old_ip, &new_ip, sizeof(new_ip));
|
chksum_adjust(l4chksum, old_ip, &new_ip, sizeof(new_ip));
|
||||||
@@ -231,7 +229,7 @@ ipv4_nat_inbound_tcp(FAR struct ipv4_hdr_s *ipv4,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
ipv4_nat_port_adjust(&tcp->tcpchksum, external_port, entry->local_port);
|
ipv4_nat_port_adjust(&tcp->tcpchksum, external_port, entry->local_port);
|
||||||
ipv4_nat_ip_adjust(ipv4, &tcp->tcpchksum, entry->local_ip, manip_type);
|
ipv4_nat_ip_adjust(ipv4, &tcp->tcpchksum, external_ip, entry->local_ip);
|
||||||
|
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
@@ -285,7 +283,7 @@ ipv4_nat_inbound_udp(FAR struct ipv4_hdr_s *ipv4,
|
|||||||
udpchksum = udp->udpchksum != 0 ? &udp->udpchksum : NULL;
|
udpchksum = udp->udpchksum != 0 ? &udp->udpchksum : NULL;
|
||||||
|
|
||||||
ipv4_nat_port_adjust(udpchksum, external_port, entry->local_port);
|
ipv4_nat_port_adjust(udpchksum, external_port, entry->local_port);
|
||||||
ipv4_nat_ip_adjust(ipv4, udpchksum, entry->local_ip, manip_type);
|
ipv4_nat_ip_adjust(ipv4, udpchksum, external_ip, entry->local_ip);
|
||||||
|
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
@@ -317,16 +315,14 @@ ipv4_nat_inbound_icmp(FAR struct ipv4_hdr_s *ipv4,
|
|||||||
enum nat_manip_type_e manip_type)
|
enum nat_manip_type_e manip_type)
|
||||||
{
|
{
|
||||||
FAR struct icmp_hdr_s *icmp = L4_HDR(ipv4);
|
FAR struct icmp_hdr_s *icmp = L4_HDR(ipv4);
|
||||||
FAR uint16_t *external_ip;
|
FAR uint16_t *external_ip = MANIP_IPADDR(ipv4, manip_type);
|
||||||
FAR uint16_t *peer_ip;
|
FAR uint16_t *peer_ip = PEER_IPADDR(ipv4, manip_type);
|
||||||
FAR struct ipv4_nat_entry *entry;
|
FAR struct ipv4_nat_entry *entry;
|
||||||
|
|
||||||
switch (icmp->type)
|
switch (icmp->type)
|
||||||
{
|
{
|
||||||
case ICMP_ECHO_REQUEST:
|
case ICMP_ECHO_REQUEST:
|
||||||
case ICMP_ECHO_REPLY:
|
case ICMP_ECHO_REPLY:
|
||||||
external_ip = MANIP_IPADDR(ipv4, manip_type);
|
|
||||||
peer_ip = PEER_IPADDR(ipv4, manip_type);
|
|
||||||
entry = ipv4_nat_inbound_entry_find(IP_PROTO_ICMP,
|
entry = ipv4_nat_inbound_entry_find(IP_PROTO_ICMP,
|
||||||
net_ip4addr_conv32(external_ip),
|
net_ip4addr_conv32(external_ip),
|
||||||
icmp->id,
|
icmp->id,
|
||||||
@@ -339,7 +335,7 @@ ipv4_nat_inbound_icmp(FAR struct ipv4_hdr_s *ipv4,
|
|||||||
|
|
||||||
ipv4_nat_port_adjust(&icmp->icmpchksum,
|
ipv4_nat_port_adjust(&icmp->icmpchksum,
|
||||||
&icmp->id, entry->local_port);
|
&icmp->id, entry->local_port);
|
||||||
ipv4_nat_ip_adjust(ipv4, NULL, entry->local_ip, manip_type);
|
ipv4_nat_ip_adjust(ipv4, NULL, external_ip, entry->local_ip);
|
||||||
return entry;
|
return entry;
|
||||||
|
|
||||||
case ICMP_DEST_UNREACHABLE:
|
case ICMP_DEST_UNREACHABLE:
|
||||||
@@ -397,7 +393,7 @@ ipv4_nat_inbound_icmp(FAR struct ipv4_hdr_s *ipv4,
|
|||||||
|
|
||||||
/* Adjust outer IP */
|
/* Adjust outer IP */
|
||||||
|
|
||||||
ipv4_nat_ip_adjust(ipv4, NULL, entry->local_ip, manip_type);
|
ipv4_nat_ip_adjust(ipv4, NULL, external_ip, entry->local_ip);
|
||||||
|
|
||||||
/* Recalculate ICMP checksum, we only need to re-calc data in L4
|
/* Recalculate ICMP checksum, we only need to re-calc data in L4
|
||||||
* header, because the inner IPv4 header's checksum is updated,
|
* header, because the inner IPv4 header's checksum is updated,
|
||||||
@@ -453,7 +449,7 @@ ipv4_nat_outbound_tcp(FAR struct net_driver_s *dev,
|
|||||||
entry = ipv4_nat_outbound_entry_find(dev, IP_PROTO_TCP,
|
entry = ipv4_nat_outbound_entry_find(dev, IP_PROTO_TCP,
|
||||||
net_ip4addr_conv32(local_ip), *local_port,
|
net_ip4addr_conv32(local_ip), *local_port,
|
||||||
net_ip4addr_conv32(peer_ip), *peer_port,
|
net_ip4addr_conv32(peer_ip), *peer_port,
|
||||||
(manip_type == NAT_MANIP_SRC));
|
manip_type == NAT_MANIP_SRC);
|
||||||
if (!entry)
|
if (!entry)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -465,7 +461,7 @@ ipv4_nat_outbound_tcp(FAR struct net_driver_s *dev,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
ipv4_nat_port_adjust(&tcp->tcpchksum, local_port, entry->external_port);
|
ipv4_nat_port_adjust(&tcp->tcpchksum, local_port, entry->external_port);
|
||||||
ipv4_nat_ip_adjust(ipv4, &tcp->tcpchksum, entry->external_ip, manip_type);
|
ipv4_nat_ip_adjust(ipv4, &tcp->tcpchksum, local_ip, entry->external_ip);
|
||||||
|
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
@@ -510,7 +506,7 @@ ipv4_nat_outbound_udp(FAR struct net_driver_s *dev,
|
|||||||
entry = ipv4_nat_outbound_entry_find(dev, IP_PROTO_UDP,
|
entry = ipv4_nat_outbound_entry_find(dev, IP_PROTO_UDP,
|
||||||
net_ip4addr_conv32(local_ip), *local_port,
|
net_ip4addr_conv32(local_ip), *local_port,
|
||||||
net_ip4addr_conv32(peer_ip), *peer_port,
|
net_ip4addr_conv32(peer_ip), *peer_port,
|
||||||
(manip_type == NAT_MANIP_SRC));
|
manip_type == NAT_MANIP_SRC);
|
||||||
if (!entry)
|
if (!entry)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -521,7 +517,7 @@ ipv4_nat_outbound_udp(FAR struct net_driver_s *dev,
|
|||||||
udpchksum = udp->udpchksum != 0 ? &udp->udpchksum : NULL;
|
udpchksum = udp->udpchksum != 0 ? &udp->udpchksum : NULL;
|
||||||
|
|
||||||
ipv4_nat_port_adjust(udpchksum, local_port, entry->external_port);
|
ipv4_nat_port_adjust(udpchksum, local_port, entry->external_port);
|
||||||
ipv4_nat_ip_adjust(ipv4, udpchksum, entry->external_ip, manip_type);
|
ipv4_nat_ip_adjust(ipv4, udpchksum, local_ip, entry->external_ip);
|
||||||
|
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
@@ -570,7 +566,7 @@ ipv4_nat_outbound_icmp(FAR struct net_driver_s *dev,
|
|||||||
entry = ipv4_nat_outbound_entry_find(dev, IP_PROTO_ICMP,
|
entry = ipv4_nat_outbound_entry_find(dev, IP_PROTO_ICMP,
|
||||||
net_ip4addr_conv32(local_ip), icmp->id,
|
net_ip4addr_conv32(local_ip), icmp->id,
|
||||||
net_ip4addr_conv32(peer_ip), icmp->id,
|
net_ip4addr_conv32(peer_ip), icmp->id,
|
||||||
(manip_type == NAT_MANIP_SRC));
|
manip_type == NAT_MANIP_SRC);
|
||||||
if (!entry)
|
if (!entry)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -578,7 +574,7 @@ ipv4_nat_outbound_icmp(FAR struct net_driver_s *dev,
|
|||||||
|
|
||||||
ipv4_nat_port_adjust(&icmp->icmpchksum,
|
ipv4_nat_port_adjust(&icmp->icmpchksum,
|
||||||
&icmp->id, entry->external_port);
|
&icmp->id, entry->external_port);
|
||||||
ipv4_nat_ip_adjust(ipv4, NULL, entry->external_ip, manip_type);
|
ipv4_nat_ip_adjust(ipv4, NULL, local_ip, entry->external_ip);
|
||||||
return entry;
|
return entry;
|
||||||
|
|
||||||
case ICMP_DEST_UNREACHABLE:
|
case ICMP_DEST_UNREACHABLE:
|
||||||
@@ -636,7 +632,7 @@ ipv4_nat_outbound_icmp(FAR struct net_driver_s *dev,
|
|||||||
|
|
||||||
/* Adjust outer IP */
|
/* Adjust outer IP */
|
||||||
|
|
||||||
ipv4_nat_ip_adjust(ipv4, NULL, entry->external_ip, manip_type);
|
ipv4_nat_ip_adjust(ipv4, NULL, local_ip, entry->external_ip);
|
||||||
|
|
||||||
/* Recalculate ICMP checksum, we only need to re-calc data in L4
|
/* Recalculate ICMP checksum, we only need to re-calc data in L4
|
||||||
* header, because the inner IPv4 header's checksum is updated,
|
* header, because the inner IPv4 header's checksum is updated,
|
||||||
|
|||||||
@@ -360,7 +360,8 @@ static void ipv4_nat_entry_delete(FAR struct ipv4_nat_entry *entry)
|
|||||||
entry->external_port,
|
entry->external_port,
|
||||||
entry->protocol));
|
entry->protocol));
|
||||||
hashtable_delete(g_table_outbound, &entry->hash_outbound,
|
hashtable_delete(g_table_outbound, &entry->hash_outbound,
|
||||||
ipv4_nat_outbound_key(entry->local_ip, entry->local_port,
|
ipv4_nat_outbound_key(entry->local_ip,
|
||||||
|
entry->local_port,
|
||||||
entry->protocol));
|
entry->protocol));
|
||||||
|
|
||||||
kmm_free(entry);
|
kmm_free(entry);
|
||||||
|
|||||||
Reference in New Issue
Block a user