[lwIP] Modify the ip.c to support NAT

This commit is contained in:
Bernard Xiong 2015-01-29 09:48:48 +00:00
parent 7f4e647971
commit 627d025cda
3 changed files with 36 additions and 9 deletions

View File

@ -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(&current_iphdr_dest, inp)) { if (!ip_addr_isbroadcast(&(iphdr->dest), inp)) {
#if IP_NAT
/* check if we want to perform NAT with this packet. */
taken = ip_nat_out(p);
if (!taken)
#endif /* IP_NAT */
{
#if IP_FORWARD
/* try to forward IP packet on (other) interfaces */ /* try to forward IP packet on (other) interfaces */
ip_forward(p, iphdr, inp); if (ip_forward(p, iphdr, inp) != NULL) {
} else 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)

View File

@ -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;

View File

@ -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);