[lwIP] Modify the ip.c to support NAT
This commit is contained in:
parent
7f4e647971
commit
627d025cda
|
@ -312,6 +312,11 @@ ip_input(struct pbuf *p, struct netif *inp)
|
||||||
int check_ip_src=1;
|
int check_ip_src=1;
|
||||||
#endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */
|
#endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */
|
||||||
|
|
||||||
|
#if IP_NAT
|
||||||
|
extern u8_t ip_nat_input(struct pbuf *p);
|
||||||
|
extern u8_t ip_nat_out(struct pbuf *p);
|
||||||
|
#endif
|
||||||
|
|
||||||
IP_STATS_INC(ip.recv);
|
IP_STATS_INC(ip.recv);
|
||||||
snmp_inc_ipinreceives();
|
snmp_inc_ipinreceives();
|
||||||
|
|
||||||
|
@ -487,15 +492,30 @@ ip_input(struct pbuf *p, struct netif *inp)
|
||||||
|
|
||||||
/* packet not for us? */
|
/* packet not for us? */
|
||||||
if (netif == NULL) {
|
if (netif == NULL) {
|
||||||
|
#if IP_FORWARD || IP_NAT
|
||||||
|
u8_t taken = 0;
|
||||||
|
#endif /* IP_FORWARD || IP_NAT */
|
||||||
/* packet not for us, route or discard */
|
/* packet not for us, route or discard */
|
||||||
LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: packet not for us.\n"));
|
LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: packet not for us.\n"));
|
||||||
#if IP_FORWARD
|
#if IP_FORWARD || IP_NAT
|
||||||
/* non-broadcast packet? */
|
/* non-broadcast packet? */
|
||||||
if (!ip_addr_isbroadcast(¤t_iphdr_dest, inp)) {
|
if (!ip_addr_isbroadcast(&(iphdr->dest), inp)) {
|
||||||
/* try to forward IP packet on (other) interfaces */
|
#if IP_NAT
|
||||||
ip_forward(p, iphdr, inp);
|
/* check if we want to perform NAT with this packet. */
|
||||||
} else
|
taken = ip_nat_out(p);
|
||||||
|
if (!taken)
|
||||||
|
#endif /* IP_NAT */
|
||||||
|
{
|
||||||
|
#if IP_FORWARD
|
||||||
|
/* try to forward IP packet on (other) interfaces */
|
||||||
|
if (ip_forward(p, iphdr, inp) != NULL) {
|
||||||
|
taken = 1;
|
||||||
|
}
|
||||||
#endif /* IP_FORWARD */
|
#endif /* IP_FORWARD */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!taken)
|
||||||
|
#endif /* IP_FORWARD || IP_NAT */
|
||||||
{
|
{
|
||||||
snmp_inc_ipinaddrerrors();
|
snmp_inc_ipinaddrerrors();
|
||||||
snmp_inc_ipindiscards();
|
snmp_inc_ipindiscards();
|
||||||
|
@ -553,6 +573,13 @@ ip_input(struct pbuf *p, struct netif *inp)
|
||||||
current_netif = inp;
|
current_netif = inp;
|
||||||
current_header = iphdr;
|
current_header = iphdr;
|
||||||
|
|
||||||
|
#if IP_NAT
|
||||||
|
if (!ip_addr_isbroadcast(&(iphdr->dest), inp) &&
|
||||||
|
(ip_nat_input(p) != 0)) {
|
||||||
|
LWIP_DEBUGF(IP_DEBUG, ("ip_input: packet consumed by nat layer\n"));
|
||||||
|
} else
|
||||||
|
#endif /* IP_NAT */
|
||||||
|
|
||||||
#if LWIP_RAW
|
#if LWIP_RAW
|
||||||
/* raw input did not eat the packet? */
|
/* raw input did not eat the packet? */
|
||||||
if (raw_input(p, inp) == 0)
|
if (raw_input(p, inp) == 0)
|
||||||
|
|
|
@ -434,8 +434,8 @@ ip_nat_check_header(struct pbuf *p, u16_t min_size)
|
||||||
* @return 1 if the packet has been consumed (it was a NAT packet),
|
* @return 1 if the packet has been consumed (it was a NAT packet),
|
||||||
* 0 if the packet has not been consumed (no NAT packet)
|
* 0 if the packet has not been consumed (no NAT packet)
|
||||||
*/
|
*/
|
||||||
int
|
u8_t
|
||||||
ip_nat_input(struct pbuf *p, struct netif *inp)
|
ip_nat_input(struct pbuf *p)
|
||||||
{
|
{
|
||||||
struct ip_hdr *iphdr = (struct ip_hdr*)p->payload;
|
struct ip_hdr *iphdr = (struct ip_hdr*)p->payload;
|
||||||
struct tcp_hdr *tcphdr;
|
struct tcp_hdr *tcphdr;
|
||||||
|
@ -443,7 +443,7 @@ ip_nat_input(struct pbuf *p, struct netif *inp)
|
||||||
struct icmp_echo_hdr *icmphdr;
|
struct icmp_echo_hdr *icmphdr;
|
||||||
nat_entry_t nat_entry;
|
nat_entry_t nat_entry;
|
||||||
err_t err;
|
err_t err;
|
||||||
int consumed = 0;
|
u8_t consumed = 0;
|
||||||
int i;
|
int i;
|
||||||
struct pbuf *q = NULL;
|
struct pbuf *q = NULL;
|
||||||
|
|
||||||
|
|
|
@ -88,7 +88,7 @@ typedef struct ip_nat_entry
|
||||||
|
|
||||||
void ip_nat_init(void);
|
void ip_nat_init(void);
|
||||||
void ip_nat_tmr(void);
|
void ip_nat_tmr(void);
|
||||||
int ip_nat_input(struct pbuf *p, struct netif *inp);
|
u8_t ip_nat_input(struct pbuf *p);
|
||||||
u8_t ip_nat_out(struct pbuf *p);
|
u8_t ip_nat_out(struct pbuf *p);
|
||||||
|
|
||||||
err_t ip_nat_add(const ip_nat_entry_t *new_entry);
|
err_t ip_nat_add(const ip_nat_entry_t *new_entry);
|
||||||
|
|
Loading…
Reference in New Issue