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
move net addresses from interface layer into protocols,
[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
2abb68c
..
53180d0
100644
(file)
--- a/
usr/src/sys/net/if.c
+++ b/
usr/src/sys/net/if.c
@@
-1,16
+1,19
@@
-/* if.c
4.26 83/03/15
*/
+/* 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;
int ifqmaxlen = IFQ_MAXLEN;
@@
-35,7
+38,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
+49,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
+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;
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 */
- 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) {
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));
+
+#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 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
+256,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
+265,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,27
+278,29
@@
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;
{
register struct ifconf *ifc = (struct ifconf *)data;
register struct ifnet *ifp = ifnet;
ifconf(cmd, data)
int cmd;
caddr_t data;
{
register struct ifconf *ifc = (struct ifconf *)data;
register struct ifnet *ifp = ifnet;
- register char *cp;
- struct ifreq ifr;
+ register char *cp
, *ep
;
+ struct ifreq ifr
, *ifrp
;
int space = ifc->ifc_len, error = 0;
int space = ifc->ifc_len, error = 0;
+ ifrp = ifc->ifc_req;
+ ep = ifr.ifr_name + sizeof (ifr.ifr_name) - 2;
for (; space > sizeof (ifr) && ifp; ifp = ifp->if_next) {
for (; space > sizeof (ifr) && ifp; ifp = ifp->if_next) {
- bcopy(ifp->if_name, ifr.ifr_name, sizeof (ifr.ifr_name));
- for (cp = ifr.ifr_name; *cp; cp++)
+ bcopy(ifp->if_name, ifr.ifr_name, sizeof (ifr.ifr_name)
- 2
);
+ for (cp = ifr.ifr_name;
cp < ep &&
*cp; cp++)
;
;
- *cp
= '0' + ifp->if_unit
;
+ *cp
++ = '0' + ifp->if_unit; *cp = '\0'
;
ifr.ifr_addr = ifp->if_addr;
ifr.ifr_addr = ifp->if_addr;
- error = copyout((caddr_t)&ifr,
ifc->ifc_buf
, sizeof (ifr));
+ error = copyout((caddr_t)&ifr,
(caddr_t)ifrp
, sizeof (ifr));
if (error)
break;
if (error)
break;
- space -= sizeof (ifr);
- ifc->ifc_req++;
+ space -= sizeof (ifr), ifrp++;
}
ifc->ifc_len -= space;
return (error);
}
ifc->ifc_len -= space;
return (error);