summaryrefslogtreecommitdiff
path: root/sys/netinet/ip_input.c
diff options
context:
space:
mode:
authorEdward Tomasz Napierala <trasz@FreeBSD.org>2009-05-27 12:44:36 +0000
committerEdward Tomasz Napierala <trasz@FreeBSD.org>2009-05-27 12:44:36 +0000
commitefbad25934c1556230b5b2d2076a9c2a30890922 (patch)
tree8927393596bcda0c8c3da8e1ece5523c383890f3 /sys/netinet/ip_input.c
parent84ccb25dc717bd1ae157f6f2d84af710f4683f3d (diff)
Notes
Diffstat (limited to 'sys/netinet/ip_input.c')
-rw-r--r--sys/netinet/ip_input.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/sys/netinet/ip_input.c b/sys/netinet/ip_input.c
index 973c392dd454..48143d7a27aa 100644
--- a/sys/netinet/ip_input.c
+++ b/sys/netinet/ip_input.c
@@ -1356,7 +1356,7 @@ ip_forward(struct mbuf *m, int srcrt)
{
INIT_VNET_INET(curvnet);
struct ip *ip = mtod(m, struct ip *);
- struct in_ifaddr *ia = NULL;
+ struct in_ifaddr *ia;
struct mbuf *mcopy;
struct in_addr dest;
struct route ro;
@@ -1380,10 +1380,17 @@ ip_forward(struct mbuf *m, int srcrt)
#endif
ia = ip_rtaddr(ip->ip_dst, M_GETFIB(m));
+#ifndef IPSEC
+ /*
+ * 'ia' may be NULL if there is no route for this destination.
+ * In case of IPsec, Don't discard it just yet, but pass it to
+ * ip_output in case of outgoing IPsec policy.
+ */
if (!srcrt && ia == NULL) {
icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_HOST, 0, 0);
return;
}
+#endif
/*
* Save the IP header and at most 8 bytes of the payload,
@@ -1435,7 +1442,8 @@ ip_forward(struct mbuf *m, int srcrt)
* or a route modified by a redirect.
*/
dest.s_addr = 0;
- if (!srcrt && V_ipsendredirects && ia->ia_ifp == m->m_pkthdr.rcvif) {
+ if (!srcrt && V_ipsendredirects &&
+ ia != NULL && ia->ia_ifp == m->m_pkthdr.rcvif) {
struct sockaddr_in *sin;
struct rtentry *rt;
@@ -1502,7 +1510,7 @@ ip_forward(struct mbuf *m, int srcrt)
/* type, code set above */
break;
- case ENETUNREACH: /* shouldn't happen, checked above */
+ case ENETUNREACH:
case EHOSTUNREACH:
case ENETDOWN:
case EHOSTDOWN: