|
@@ -312,6 +312,11 @@ ip_input(struct pbuf *p, struct netif *inp)
|
|
|
int check_ip_src=1;
|
|
|
#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);
|
|
|
snmp_inc_ipinreceives();
|
|
|
|
|
@@ -487,15 +492,30 @@ ip_input(struct pbuf *p, struct netif *inp)
|
|
|
|
|
|
/* packet not for us? */
|
|
|
if (netif == NULL) {
|
|
|
+#if IP_FORWARD || IP_NAT
|
|
|
+ u8_t taken = 0;
|
|
|
+#endif /* IP_FORWARD || IP_NAT */
|
|
|
/* packet not for us, route or discard */
|
|
|
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? */
|
|
|
- if (!ip_addr_isbroadcast(¤t_iphdr_dest, inp)) {
|
|
|
- /* try to forward IP packet on (other) interfaces */
|
|
|
- ip_forward(p, iphdr, inp);
|
|
|
- } else
|
|
|
+ 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 */
|
|
|
+ if (ip_forward(p, iphdr, inp) != NULL) {
|
|
|
+ taken = 1;
|
|
|
+ }
|
|
|
#endif /* IP_FORWARD */
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!taken)
|
|
|
+#endif /* IP_FORWARD || IP_NAT */
|
|
|
{
|
|
|
snmp_inc_ipinaddrerrors();
|
|
|
snmp_inc_ipindiscards();
|
|
@@ -553,6 +573,13 @@ ip_input(struct pbuf *p, struct netif *inp)
|
|
|
current_netif = inp;
|
|
|
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
|
|
|
/* raw input did not eat the packet? */
|
|
|
if (raw_input(p, inp) == 0)
|