diff options
| author | Bill Fenner <fenner@FreeBSD.org> | 1996-01-23 05:15:30 +0000 |
|---|---|---|
| committer | Bill Fenner <fenner@FreeBSD.org> | 1996-01-23 05:15:30 +0000 |
| commit | 4dde4205e1e77bf6f90a2e8da7219bb9ee8b465e (patch) | |
| tree | e0d4c3fcf8c875d3ee5d3bf3e26572f7c9b5ecde | |
| parent | 2924d4916963eb00cbd842df06197fa488bb8dfe (diff) | |
Notes
| -rw-r--r-- | sys/netinet/in_rmx.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/sys/netinet/in_rmx.c b/sys/netinet/in_rmx.c index 0d66d3cc4fb8e..958b648df75e0 100644 --- a/sys/netinet/in_rmx.c +++ b/sys/netinet/in_rmx.c @@ -26,7 +26,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: in_rmx.c,v 1.21 1995/12/05 17:45:45 wollman Exp $ + * $Id: in_rmx.c,v 1.22 1995/12/19 20:46:13 wollman Exp $ */ /* @@ -82,6 +82,7 @@ in_addroute(void *v_arg, void *n_arg, struct radix_node_head *head, { struct rtentry *rt = (struct rtentry *)treenodes; struct sockaddr_in *sin = (struct sockaddr_in *)rt_key(rt); + struct radix_node *ret; /* * For IP, all unicast non-host routes are automatically cloning. @@ -126,7 +127,32 @@ in_addroute(void *v_arg, void *n_arg, struct radix_node_head *head, rt->rt_rmx.rmx_mtu = rt->rt_ifp->if_mtu; #endif - return rn_addroute(v_arg, n_arg, head, treenodes); + ret = rn_addroute(v_arg, n_arg, head, treenodes); + if (ret == NULL && rt->rt_flags & RTF_HOST) { + struct rtentry *rt2; + /* + * We are trying to add a host route, but can't. + * Find out if it is because of an + * ARP entry and delete it if so. + */ + rt2 = rtalloc1((struct sockaddr *)sin, 0, + RTF_CLONING | RTF_PRCLONING); + if (rt2) { + if (rt2->rt_flags & RTF_LLINFO && + rt2->rt_flags & RTF_HOST && + rt2->rt_gateway && + rt2->rt_gateway->sa_family == AF_LINK) { + rtrequest(RTM_DELETE, + (struct sockaddr *)rt_key(rt2), + rt2->rt_gateway, + rt_mask(rt2), rt2->rt_flags, 0); + ret = rn_addroute(v_arg, n_arg, head, + treenodes); + } + RTFREE(rt2); + } + } + return ret; } /* |
