diff options
author | sowmini <none@none> | 2006-09-21 07:22:34 -0700 |
---|---|---|
committer | sowmini <none@none> | 2006-09-21 07:22:34 -0700 |
commit | e1fa7f4d6dcfe8dfcf933a438a4246c73a776ea5 (patch) | |
tree | 91e08dd2d6d90e5f7ded1fbf74e744d44c25411c /usr/src | |
parent | a7e50fb1b1efb03c4582e9def5064f66f601bcfe (diff) | |
download | illumos-gate-e1fa7f4d6dcfe8dfcf933a438a4246c73a776ea5.tar.gz |
6462191 in.routed repeatedly deletes and re-adds default route
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/cmd/cmd-inet/usr.sbin/in.routed/input.c | 9 | ||||
-rw-r--r-- | usr/src/cmd/cmd-inet/usr.sbin/in.routed/table.c | 47 |
2 files changed, 49 insertions, 7 deletions
diff --git a/usr/src/cmd/cmd-inet/usr.sbin/in.routed/input.c b/usr/src/cmd/cmd-inet/usr.sbin/in.routed/input.c index 6d1f95a468..8d12d005ef 100644 --- a/usr/src/cmd/cmd-inet/usr.sbin/in.routed/input.c +++ b/usr/src/cmd/cmd-inet/usr.sbin/in.routed/input.c @@ -1,5 +1,5 @@ /* - * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. * * Copyright (c) 1983, 1988, 1993 @@ -103,7 +103,11 @@ receiving_interface(struct msghdr *msg, boolean_t findremote) * IP_RECVIF index we requested), try to deduce the receiving * interface based on the source address of the packet. */ - return (iflookup(from->sin_addr.s_addr)); + ifp = iflookup(from->sin_addr.s_addr); + if (ifp != NULL && ifp->int_phys != NULL) { + ifp = ifwithname(ifp->int_phys->phyi_name); + } + return (ifp); } /* @@ -1121,7 +1125,6 @@ input_route(in_addr_t dst, /* network order */ */ rts0 = rt->rt_spares; - trace_misc("rt 0x%lx num_spares %d", rt, rt->rt_num_spares); for (rts = rts0, i = rt->rt_num_spares; i != 0; i--, rts++) { if (rts->rts_router == new->rts_router) break; diff --git a/usr/src/cmd/cmd-inet/usr.sbin/in.routed/table.c b/usr/src/cmd/cmd-inet/usr.sbin/in.routed/table.c index d23133c029..f7dcbd4e26 100644 --- a/usr/src/cmd/cmd-inet/usr.sbin/in.routed/table.c +++ b/usr/src/cmd/cmd-inet/usr.sbin/in.routed/table.c @@ -903,6 +903,10 @@ kern_find(in_addr_t dst, in_addr_t mask, in_addr_t gate, { struct khash *k, **pk; + if (ifp != NULL && ifp->int_phys != NULL) { + ifp = ifwithname(ifp->int_phys->phyi_name); + } + for (pk = &KHASH(dst, mask); (k = *pk) != NULL; pk = &k->k_next) { if (k->k_dst == dst && k->k_mask == mask && (gate == 0 || k->k_gate == gate) && @@ -926,6 +930,9 @@ kern_alternate(in_addr_t dst, in_addr_t mask, in_addr_t gate, { struct khash *k, **pk; + if (ifp != NULL && ifp->int_phys != NULL) { + ifp = ifwithname(ifp->int_phys->phyi_name); + } for (pk = &KHASH(dst, mask); (k = *pk) != NULL; pk = &k->k_next) { if (k->k_dst == dst && k->k_mask == mask && (k->k_gate != gate) && @@ -943,6 +950,9 @@ kern_add(in_addr_t dst, uint32_t mask, in_addr_t gate, struct interface *ifp) { struct khash *k, **pk; + if (ifp != NULL && ifp->int_phys != NULL) { + ifp = ifwithname(ifp->int_phys->phyi_name); + } k = kern_find(dst, mask, gate, ifp, &pk); if (k != NULL) return (k); @@ -968,6 +978,9 @@ kern_flush_ifp(struct interface *ifp) struct khash *k, *kprev, *knext; int i; + if (ifp != NULL && ifp->int_phys != NULL) { + ifp = ifwithname(ifp->int_phys->phyi_name); + } for (i = 0; i < KHASH_SIZE; i++) { kprev = NULL; for (k = khash_bins[i]; k != NULL; k = knext) { @@ -995,6 +1008,12 @@ kern_rewire_ifp(struct interface *oldifp, struct interface *newifp) struct khash *k; int i; + if (oldifp != NULL && oldifp->int_phys != NULL) { + oldifp = ifwithname(oldifp->int_phys->phyi_name); + } + if (newifp != NULL && newifp->int_phys != NULL) { + newifp = ifwithname(newifp->int_phys->phyi_name); + } for (i = 0; i < KHASH_SIZE; i++) { for (k = khash_bins[i]; k; k = k->k_next) { if (k->k_ifp == oldifp) { @@ -1020,6 +1039,9 @@ kern_check_static(struct khash *k, struct interface *ifp) struct rt_spare new; uint16_t rt_state = RS_STATIC; + if (ifp != NULL && ifp->int_phys != NULL) { + ifp = ifwithname(ifp->int_phys->phyi_name); + } (void) memset(&new, 0, sizeof (new)); new.rts_ifp = ifp; new.rts_gate = k->k_gate; @@ -1127,11 +1149,16 @@ rtm_add(struct rt_msghdr *rtm, if (ifp == NULL) { if (INFO_GATE(info) != NULL) ifp = iflookup(gate); - if (ifp == NULL) + if (ifp == NULL) { msglim(&msg_no_ifp, gate, "route %s --> %s nexthop is not directly connected", addrname(S_ADDR(INFO_DST(info)), mask, 0), naddr_ntoa(gate)); + } else { + if (ifp->int_phys != NULL) { + ifp = ifwithname(ifp->int_phys->phyi_name); + } + } } k = kern_add(S_ADDR(INFO_DST(info)), mask, gate, ifp); @@ -1438,8 +1465,13 @@ sync_kern(void) */ if ((ifp = gwkludge_iflookup(rp->ipRouteDest, rp->ipRouteNextHop, - ntohl(rp->ipRouteMask))) == NULL) + ntohl(rp->ipRouteMask))) == NULL) { ifp = ifwithname(ifname); + if (ifp != NULL && ifp->int_phys != NULL) { + ifp = ifwithname( + ifp->int_phys->phyi_name); + } + } info.rti_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK; if (rp->ipRouteInfo.re_ire_type & IRE_HOST_REDIRECT) @@ -1810,6 +1842,13 @@ static void kern_out(struct ag_info *ag) { struct khash *k; + struct interface *ifp; + + ifp = ag->ag_ifp; + + if (ifp != NULL && ifp->int_phys != NULL) { + ifp = ifwithname(ifp->int_phys->phyi_name); + } /* * Do not install bad routes if they are not already present. @@ -1823,7 +1862,7 @@ kern_out(struct ag_info *ag) return; } else { k = kern_add(htonl(ag->ag_dst_h), ag->ag_mask, ag->ag_nhop, - ag->ag_ifp); + ifp); } if (k->k_state & KS_NEW) { @@ -1838,7 +1877,7 @@ kern_out(struct ag_info *ag) if (ag->ag_state & AGS_FILE) k->k_state |= KS_FILE; k->k_gate = ag->ag_nhop; - k->k_ifp = ag->ag_ifp; + k->k_ifp = ifp; k->k_metric = ag->ag_metric; return; } |