+ error = rtrequest(req, &(entry->rt_dst), &(entry->rt_gateway), netmask,
+ entry->rt_flags, (struct rtentry **)0);
+ rt_missmsg((req == RTM_ADD ? RTM_OLDADD : RTM_OLDDEL),
+ &(entry->rt_dst), &(entry->rt_gateway),
+ netmask, (struct sockaddr *)0, entry->rt_flags, error);
+ return (error);
+#endif
+}
+#define ROUNDUP(a) (1 + (((a) - 1) | (sizeof(long) - 1)))
+
+rtrequest(req, dst, gateway, netmask, flags, ret_nrt)
+ int req, flags;
+ struct sockaddr *dst, *gateway, *netmask;
+ struct rtentry **ret_nrt;
+{
+ int s = splnet(), len, error = 0;
+ register struct rtentry *rt;
+ register struct radix_node *rn;
+ register struct radix_node_head *rnh;
+ struct ifaddr *ifa, *ifa_ifwithdstaddr();
+ struct sockaddr *ndst;
+ u_char af = dst->sa_family;
+#define senderr(x) { error = x ; goto bad; }
+
+ if (rtinits_done == 0)
+ rtinitheads();
+ for (rnh = radix_node_head; rnh && (af != rnh->rnh_af); )
+ rnh = rnh->rnh_next;
+ if (rnh == 0)
+ senderr(ESRCH);
+ if (flags & RTF_HOST)
+ netmask = 0;
+ switch (req) {
+ case RTM_DELETE:
+ if (ret_nrt && (rt = *ret_nrt)) {
+ RTFREE(rt);
+ *ret_nrt = 0;
+ }
+ if ((rn = rn_delete((caddr_t)dst, (caddr_t)netmask,
+ rnh->rnh_treetop)) == 0)
+ senderr(ESRCH);
+ if (rn->rn_flags & (RNF_ACTIVE | RNF_ROOT))
+ panic ("rtrequest delete");
+ rt = (struct rtentry *)rn;
+ rt->rt_flags &= ~RTF_UP;
+ if ((ifa = rt->rt_ifa) && ifa->ifa_rtrequest)
+ ifa->ifa_rtrequest(RTM_DELETE, rt, (struct sockaddr *)0);
+ rttrash++;
+ if (rt->rt_refcnt <= 0)
+ rtfree(rt);