X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/9b956fa599c92413ca476d64e06c157f93ede190..63de846eef97fd654458b5578ec645f66b677735:/usr/src/sys/net/if.c diff --git a/usr/src/sys/net/if.c b/usr/src/sys/net/if.c index c47f2b3b25..53180d0ed7 100644 --- a/usr/src/sys/net/if.c +++ b/usr/src/sys/net/if.c @@ -1,16 +1,19 @@ -/* if.c 4.27 83/03/19 */ +/* if.c 6.6 85/03/19 */ -#include "../h/param.h" -#include "../h/systm.h" -#include "../h/socket.h" -#include "../h/protosw.h" -#include "../h/time.h" -#include "../h/kernel.h" -#include "../h/ioctl.h" -#include "../h/errno.h" +#include "param.h" +#include "systm.h" +#include "socket.h" +#include "protosw.h" +#include "dir.h" +#include "user.h" +#include "kernel.h" +#include "ioctl.h" +#include "errno.h" -#include "../net/if.h" -#include "../net/af.h" +#include "if.h" +#include "af.h" + +#include "ether.h" int ifqmaxlen = IFQ_MAXLEN; @@ -35,7 +38,7 @@ ifinit() if_slowtimo(); } -#if vax +#ifdef vax /* * Call each interface on a Unibus reset. */ @@ -46,7 +49,7 @@ ifubareset(uban) for (ifp = ifnet; ifp; ifp = ifp->if_next) if (ifp->if_reset) - (*ifp->if_reset)(uban); + (*ifp->if_reset)(ifp->if_unit, uban); } #endif @@ -174,60 +177,78 @@ if_slowtimo() } /* - * Service a socket ioctl request directed - * to an interface. + * Map interface name to + * interface structure pointer. */ -ifrequest(cmd, data) - int cmd; - caddr_t data; +struct ifnet * +ifunit(name) + register char *name; { - register struct ifnet *ifp; - register struct ifreq *ifr; register char *cp; - int unit, s; + register struct ifnet *ifp; + int unit; - ifr = (struct ifreq *)data; - for (cp = ifr->ifr_name; *cp; cp++) + for (cp = name; cp < name + IFNAMSIZ && *cp; cp++) if (*cp >= '0' && *cp <= '9') break; - if (*cp == 0) - return (ENXIO); /* couldn't find unit */ - unit = *cp - '0', *cp = 0; + if (*cp == '\0' || cp == name + IFNAMSIZ) + return ((struct ifnet *)0); + unit = *cp - '0'; for (ifp = ifnet; ifp; ifp = ifp->if_next) { - if (bcmp(ifp->if_name, ifr->ifr_name, cp - ifr->ifr_name)) + if (bcmp(ifp->if_name, name, (unsigned)(cp - name))) continue; if (unit == ifp->if_unit) - goto found; + break; } - return (ENXIO); + return (ifp); +} + +/* + * Interface ioctls. + */ +ifioctl(cmd, data) + int cmd; + caddr_t data; +{ + register struct ifnet *ifp; + register struct ifreq *ifr; -found: switch (cmd) { - case SIOCGIFADDR: - ifr->ifr_addr = ifp->if_addr; - break; + 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: - if_rtinit(ifp, -1); /* delete previous route */ - s = splimp(); - ifp->if_addr = ifr->ifr_addr; - (*ifp->if_init)(unit); - splx(s); + 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 SIOCGIFDSTADDR: - if ((ifp->if_flags & IFF_POINTOPOINT) == 0) - return (EINVAL); - ifr->ifr_dstaddr = ifp->if_dstaddr; + case SIOCGIFADDR: + ifr->ifr_addr = ifp->if_addr; break; - case SIOCSIFDSTADDR: + case SIOCGIFDSTADDR: if ((ifp->if_flags & IFF_POINTOPOINT) == 0) return (EINVAL); - s = splimp(); - ifp->if_dstaddr = ifr->ifr_dstaddr; - splx(s); + ifr->ifr_dstaddr = ifp->if_dstaddr; break; case SIOCGIFFLAGS: @@ -235,9 +256,8 @@ found: break; case SIOCSIFFLAGS: - if ((ifr->ifr_flags & IFF_UP) == 0 && - (ifp->if_flags & IFF_UP)) { - s = splimp(); + if (ifp->if_flags & IFF_UP && (ifr->ifr_flags & IFF_UP) == 0) { + int s = splimp(); if_down(ifp); splx(s); } @@ -245,7 +265,9 @@ found: break; default: - return (EINVAL); + if (ifp->if_ioctl == 0) + return (EOPNOTSUPP); + return ((*ifp->if_ioctl)(ifp, cmd, data)); } return (0); } @@ -256,6 +278,7 @@ found: * in later ioctl's (above) to get * other information. */ +/*ARGSUSED*/ ifconf(cmd, data) int cmd; caddr_t data;