diff options
| author | Edward Tomasz Napierala <trasz@FreeBSD.org> | 2009-05-27 12:44:36 +0000 |
|---|---|---|
| committer | Edward Tomasz Napierala <trasz@FreeBSD.org> | 2009-05-27 12:44:36 +0000 |
| commit | efbad25934c1556230b5b2d2076a9c2a30890922 (patch) | |
| tree | 8927393596bcda0c8c3da8e1ece5523c383890f3 /sys/netinet/ip_input.c | |
| parent | 84ccb25dc717bd1ae157f6f2d84af710f4683f3d (diff) | |
Notes
Diffstat (limited to 'sys/netinet/ip_input.c')
| -rw-r--r-- | sys/netinet/ip_input.c | 14 |
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: |
