+
+nsip_free(ifp)
+struct ifnet *ifp;
+{
+ register struct ifnet_en *ifn = (struct ifnet_en *)ifp;
+ struct route *ro = & ifn->ifen_route;
+
+ if (ro->ro_rt) {
+ RTFREE(ro->ro_rt);
+ ro->ro_rt = 0;
+ }
+ ifp->if_flags &= ~IFF_UP;
+ return (0);
+}
+
+nsip_ctlinput(cmd, sa)
+ int cmd;
+ struct sockaddr *sa;
+{
+ extern u_char inetctlerrmap[];
+ struct sockaddr_in *sin;
+ int in_rtchange();
+
+ if ((unsigned)cmd >= PRC_NCMDS)
+ return;
+ if (sa->sa_family != AF_INET && sa->sa_family != AF_IMPLINK)
+ return;
+ sin = (struct sockaddr_in *)sa;
+ if (sin->sin_addr.s_addr == INADDR_ANY)
+ return;
+
+ switch (cmd) {
+
+ case PRC_ROUTEDEAD:
+ case PRC_REDIRECT_NET:
+ case PRC_REDIRECT_HOST:
+ case PRC_REDIRECT_TOSNET:
+ case PRC_REDIRECT_TOSHOST:
+ nsip_rtchange(&sin->sin_addr);
+ break;
+ }
+}
+
+nsip_rtchange(dst)
+ register struct in_addr *dst;
+{
+ register struct mbuf *m;
+ register struct ifnet_en *ifn;
+
+ for (m = nsip_list; m; m = m->m_next) {
+ ifn = mtod(m, struct ifnet_en *);
+ if (ifn->ifen_dst.s_addr == dst->s_addr &&
+ ifn->ifen_route.ro_rt) {
+ RTFREE(ifn->ifen_route.ro_rt);
+ ifn->ifen_route.ro_rt = 0;
+ }
+ }
+}