+ return (0);
+qfull:
+ m0 = m;
+ splx(s);
+bad:
+ m_freem(m0);
+ return (error);
+}
+
+/*
+ * Process an ioctl request.
+ */
+enioctl(ifp, cmd, data)
+ register struct ifnet *ifp;
+ int cmd;
+ caddr_t data;
+{
+ struct ifreq *ifr = (struct ifreq *)data;
+ int s = splimp(), error = 0;
+
+ switch (cmd) {
+
+ case SIOCSIFADDR:
+ if (ifp->if_flags & IFF_RUNNING)
+ if_rtinit(ifp, -1); /* delete previous route */
+ ensetaddr(ifp, (struct sockaddr_in *)&ifr->ifr_addr);
+ if (ifp->if_flags & IFF_RUNNING)
+ if_rtinit(ifp, RTF_UP);
+ else
+ eninit(ifp->if_unit);
+ break;
+
+ default:
+ error = EINVAL;
+ }
+ splx(s);
+ return (error);
+}
+
+ensetaddr(ifp, sin)
+ register struct ifnet *ifp;
+ register struct sockaddr_in *sin;
+{
+ struct endevice *enaddr;
+
+ ifp->if_net = in_netof(sin->sin_addr);
+ enaddr = (struct endevice *)eninfo[ifp->if_unit]->ui_addr;
+ ifp->if_host[0] = (~enaddr->en_addr) & 0xff;
+ sin = (struct sockaddr_in *)&ifp->if_addr;
+ sin->sin_family = AF_INET;
+ sin->sin_addr = if_makeaddr(ifp->if_net, ifp->if_host[0]);
+ sin = (struct sockaddr_in *)&ifp->if_broadaddr;
+ sin->sin_family = AF_INET;
+ sin->sin_addr = if_makeaddr(ifp->if_net, INADDR_ANY);
+ ifp->if_flags |= IFF_BROADCAST;