- rt->rt_ifa->ifa_rtrequest(RTM_CHANGE, rt, gate);
- Bcopy(gate, rt->rt_gateway, len);
- rt->rt_gateway->sa_len = len;
-
-#ifdef notdef
-#define metric(f, e) if (rtm->rtm_inits & (f)) rt->rt_m.e = rtm->e;
- metric(RTM_RPIPE, rtm_recvpipe);
- metric(RTM_SPIPE, rtm_sendpipe);
- metric(RTM_SSTHRESH, rtm_ssthresh);
- metric(RTM_RTT, rtm_rtt);
- metric(RTM_RTTVAR, rtm_rttvar);
- metric(RTM_HOPCOUNT, rtm_hopcount);
- metric(RTM_MTU, rtm_mtu);
+ rt->rt_ifa->ifa_rtrequest(RTM_DELETE, rt, gate);
+ /* new gateway could require new ifaddr, ifp;
+ flags may also be different; ifp may be specified
+ by ll sockaddr when protocol address is ambiguous */
+ if (ifpaddr &&
+ (ifa = ifa_ifwithnet(ifpaddr)) &&
+ (ifp = ifa->ifa_ifp) &&
+ (ifa = ifaof_ifpforaddr(gate, ifp))) {
+ /* We got it */
+ } else {
+ ifa = 0; ifp = 0;
+ }
+ if (gate)
+ Bcopy(gate, rt->rt_gateway, len);
+ rt_setmetrics(rtm->rtm_inits,
+ &rtm->rtm_rmx, &rt->rt_rmx);
+ if (ifa == 0)
+ ifa = ifa_ifwithroute(rt->rt_flags, rt_key(rt),
+ gate);
+ if (ifa) {
+ if (rt->rt_ifa != ifa) {
+ rt->rt_ifa = ifa;
+ rt->rt_ifp = ifa->ifa_ifp;
+ }
+ }
+ if (rt->rt_ifa && rt->rt_ifa->ifa_rtrequest)
+ rt->rt_ifa->ifa_rtrequest(RTM_ADD, rt, gate);
+ if (genmask)
+ rt->rt_genmask = genmask;