+
+/*
+ * Process an ioctl request.
+ */
+enioctl(ifp, cmd, data)
+ register struct ifnet *ifp;
+ int cmd;
+ caddr_t data;
+{
+ register struct en_softc *es = ((struct en_softc *)ifp);
+ struct ifaddr *ifa = (struct ifaddr *) data;
+ int s = splimp(), error = 0;
+ struct endevice *enaddr;
+
+ switch (cmd) {
+
+ case SIOCSIFADDR:
+ enaddr = (struct endevice *)eninfo[ifp->if_unit]->ui_addr;
+ es->es_host = (~enaddr->en_addr) & 0xff;
+ /*
+ * Attempt to check agreement of protocol address
+ * and board address.
+ */
+ switch (ifa->ifa_addr.sa_family) {
+ case AF_INET:
+ if (in_lnaof(IA_SIN(ifa)->sin_addr) != es->es_host)
+ return (EADDRNOTAVAIL);
+ break;
+ }
+ ifp->if_flags |= IFF_UP;
+ if ((ifp->if_flags & IFF_RUNNING) == 0)
+ eninit(ifp->if_unit);
+ break;
+
+ default:
+ error = EINVAL;
+ }
+ splx(s);
+ return (error);
+}
+
+#ifdef ENF_SWABIPS
+/*
+ * Swab bytes
+ * Jeffrey Mogul, Stanford
+ */
+enswab(from, to, n)
+ register unsigned char *from, *to;
+ register int n;
+{
+ register unsigned long temp;
+
+ if ((n <= 0) || (n > 0xFFFF)) {
+ printf("enswab: bad len %d\n", n);
+ return;
+ }
+
+ n >>= 1; n++;
+#define STEP {temp = *from++;*to++ = *from++;*to++ = temp;}
+ /* round to multiple of 8 */
+ while ((--n) & 07)
+ STEP;
+ n >>= 3;
+ while (--n >= 0) {
+ STEP; STEP; STEP; STEP;
+ STEP; STEP; STEP; STEP;
+ }
+}
+#endif