- * If we have gotten into trouble and want to reset back to
- * virginity, we recognize a request of the broadcast address.
- */
- if (ns_hosteqnh(sns->sns_addr.x_host, ns_broadhost)) {
- ns_thishost = ns_zerohost;
- splx(s);
- return(EINVAL);
- }
-
- /*
- * Delete any previous route for an old address.
- */
-
- bzero((caddr_t)&netaddr, sizeof (netaddr));
- netaddr.sns_family = AF_NS;
- netaddr.sns_addr.x_host = ns_broadhost;
- netaddr.sns_addr.x_net = ia->ia_net;
- if (ia->ia_flags & IFA_ROUTE) {
- if ((ifp->if_flags & IFF_POINTOPOINT) == 0) {
- rtinit((struct sockaddr *)&netaddr, &ia->ia_addr, -1);
- } else
- rtinit((struct sockaddr *)&ia->ia_dstaddr, &ia->ia_addr, -1);
- }
-
- /*
- * Set up new addresses.
- */
- ia->ia_addr = *(struct sockaddr *)sns;
- ia->ia_net = sns->sns_addr.x_net;
- netaddr.sns_addr.x_net = ia->ia_net;
- if (ifp->if_flags & IFF_BROADCAST) {
- ia->ia_broadaddr = * (struct sockaddr *) &netaddr;
- }
- /*
- * Point to point links are a little touchier --
- * We have to have an address of our own first,
- * and will use the supplied address as that of the other end.
- */
- if (ifp->if_flags & IFF_POINTOPOINT) {
- struct sockaddr_ns *sns2 = IA_SNS(ia);
- if (ns_hosteqnh(ns_zerohost,ns_thishost))
- return(EINVAL);
- ia->ia_dstaddr = ia->ia_addr;
- sns2->sns_addr.x_host = ns_thishost;
- sns->sns_addr.x_host = ns_thishost;
- }
- /*