+ register struct ifreq *ifr;
+
+ switch (cmd) {
+
+ case SIOCGIFCONF:
+ return (ifconf(cmd, data));
+
+#if defined(INET) && NETHER > 0
+ case SIOCSARP:
+ case SIOCDARP:
+ if (!suser())
+ return (u.u_error);
+ /* FALL THROUGH */
+ case SIOCGARP:
+ return (arpioctl(cmd, data));
+#endif
+
+ case SIOCSIFADDR:
+ case SIOCSIFFLAGS:
+ case SIOCSIFDSTADDR:
+ if (!suser())
+ return (u.u_error);
+ break;
+ }
+ ifr = (struct ifreq *)data;
+ ifp = ifunit(ifr->ifr_name);
+ if (ifp == 0)
+ return (ENXIO);
+ switch (cmd) {
+
+ case SIOCGIFADDR:
+ ifr->ifr_addr = ifp->if_addr;
+ break;
+
+ case SIOCGIFDSTADDR:
+ if ((ifp->if_flags & IFF_POINTOPOINT) == 0)
+ return (EINVAL);
+ ifr->ifr_dstaddr = ifp->if_dstaddr;
+ break;
+
+ case SIOCGIFFLAGS:
+ ifr->ifr_flags = ifp->if_flags;
+ break;
+
+ case SIOCSIFFLAGS:
+ if (ifp->if_flags & IFF_UP && (ifr->ifr_flags & IFF_UP) == 0) {
+ int s = splimp();
+ if_down(ifp);
+ splx(s);
+ }
+ ifp->if_flags = ifr->ifr_flags;
+ break;
+
+ default:
+ if (ifp->if_ioctl == 0)
+ return (EOPNOTSUPP);
+ return ((*ifp->if_ioctl)(ifp, cmd, data));
+ }
+ return (0);
+}
+
+/*
+ * Return interface configuration
+ * of system. List may be used
+ * in later ioctl's (above) to get
+ * other information.
+ */
+/*ARGSUSED*/
+ifconf(cmd, data)
+ int cmd;
+ caddr_t data;