projects
/
unix-history
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
route hash values are unsigned, else hash function gives negative index
[unix-history]
/
usr
/
src
/
sys
/
net
/
if.c
diff --git
a/usr/src/sys/net/if.c
b/usr/src/sys/net/if.c
index
c47f2b3
..
947edfe
100644
(file)
--- a/
usr/src/sys/net/if.c
+++ b/
usr/src/sys/net/if.c
@@
-1,10
+1,11
@@
-/* if.c
4.27 83/03/19
*/
+/* if.c
6.2 83/09/27
*/
#include "../h/param.h"
#include "../h/systm.h"
#include "../h/socket.h"
#include "../h/protosw.h"
#include "../h/param.h"
#include "../h/systm.h"
#include "../h/socket.h"
#include "../h/protosw.h"
-#include "../h/time.h"
+#include "../h/dir.h"
+#include "../h/user.h"
#include "../h/kernel.h"
#include "../h/ioctl.h"
#include "../h/errno.h"
#include "../h/kernel.h"
#include "../h/ioctl.h"
#include "../h/errno.h"
@@
-35,7
+36,7
@@
ifinit()
if_slowtimo();
}
if_slowtimo();
}
-#if vax
+#if
def
vax
/*
* Call each interface on a Unibus reset.
*/
/*
* Call each interface on a Unibus reset.
*/
@@
-46,7
+47,7
@@
ifubareset(uban)
for (ifp = ifnet; ifp; ifp = ifp->if_next)
if (ifp->if_reset)
for (ifp = ifnet; ifp; ifp = ifp->if_next)
if (ifp->if_reset)
- (*ifp->if_reset)(uban);
+ (*ifp->if_reset)(
ifp->if_unit,
uban);
}
#endif
}
#endif
@@
-174,60
+175,68
@@
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;
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' && *cp <= '9')
break;
- if (*cp ==
0
)
- return (
ENXIO); /* couldn't find unit */
+ if (*cp ==
'\0' || cp == name + IFNAMSIZ
)
+ return (
(struct ifnet *)0);
unit = *cp - '0', *cp = 0;
for (ifp = ifnet; ifp; ifp = ifp->if_next) {
unit = *cp - '0', *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)
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) {
switch (cmd) {
- case SIOCGIFADDR:
- ifr->ifr_addr = ifp->if_addr;
- break;
+ case SIOCGIFCONF:
+ return (ifconf(cmd, data));
case SIOCSIFADDR:
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;
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;
break;
- case SIOC
S
IFDSTADDR:
+ case SIOC
G
IFDSTADDR:
if ((ifp->if_flags & IFF_POINTOPOINT) == 0)
return (EINVAL);
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:
break;
case SIOCGIFFLAGS:
@@
-235,9
+244,8
@@
found:
break;
case SIOCSIFFLAGS:
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);
}
if_down(ifp);
splx(s);
}
@@
-245,7
+253,9
@@
found:
break;
default:
break;
default:
- return (EINVAL);
+ if (ifp->if_ioctl == 0)
+ return (EOPNOTSUPP);
+ return ((*ifp->if_ioctl)(ifp, cmd, data));
}
return (0);
}
}
return (0);
}
@@
-256,6
+266,7
@@
found:
* in later ioctl's (above) to get
* other information.
*/
* in later ioctl's (above) to get
* other information.
*/
+/*ARGSUSED*/
ifconf(cmd, data)
int cmd;
caddr_t data;
ifconf(cmd, data)
int cmd;
caddr_t data;