summaryrefslogtreecommitdiffstats
path: root/sys/net/if.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/net/if.c')
-rw-r--r--sys/net/if.c160
1 files changed, 48 insertions, 112 deletions
diff --git a/sys/net/if.c b/sys/net/if.c
index 426939ffdb7..b3da97849c1 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: if.c,v 1.8 1996/05/09 11:10:28 deraadt Exp $ */
-/* $NetBSD: if.c,v 1.24 1996/02/13 22:00:09 christos Exp $ */
+/* $OpenBSD: if.c,v 1.9 1996/05/10 12:31:07 deraadt Exp $ */
+/* $NetBSD: if.c,v 1.35 1996/05/07 05:26:04 thorpej Exp $ */
/*
* Copyright (c) 1980, 1986, 1993
@@ -73,7 +73,6 @@ ifinit()
int if_index = 0;
struct ifaddr **ifnet_addrs;
-static char *sprint_d __P((u_int, char *, int));
/*
* Attach an interface to the
@@ -84,8 +83,7 @@ if_attach(ifp)
struct ifnet *ifp;
{
unsigned socksize, ifasize;
- int namelen, unitlen, masklen;
- char workbuf[12], *unitname;
+ int namelen, masklen;
register struct sockaddr_dl *sdl;
register struct ifaddr *ifa;
static int if_indexlim = 8;
@@ -108,12 +106,9 @@ if_attach(ifp)
/*
* create a Link Level name for this device
*/
- unitname = sprint_d((u_int)ifp->if_unit, workbuf, sizeof(workbuf));
- namelen = strlen(ifp->if_name);
- unitlen = strlen(unitname);
+ namelen = strlen(ifp->if_xname);
#define _offsetof(t, m) ((int)((caddr_t)&((t *)0)->m))
- masklen = _offsetof(struct sockaddr_dl, sdl_data[0]) +
- unitlen + namelen;
+ masklen = _offsetof(struct sockaddr_dl, sdl_data[0]) + namelen;
socksize = masklen + ifp->if_addrlen;
#define ROUNDUP(a) (1 + (((a) - 1) | (sizeof(long) - 1)))
if (socksize < sizeof(*sdl))
@@ -125,9 +120,8 @@ if_attach(ifp)
sdl = (struct sockaddr_dl *)(ifa + 1);
sdl->sdl_len = socksize;
sdl->sdl_family = AF_LINK;
- bcopy(ifp->if_name, sdl->sdl_data, namelen);
- bcopy(unitname, namelen + (caddr_t)sdl->sdl_data, unitlen);
- sdl->sdl_nlen = (namelen += unitlen);
+ bcopy(ifp->if_xname, sdl->sdl_data, namelen);
+ sdl->sdl_nlen = namelen;
sdl->sdl_index = ifp->if_index;
sdl->sdl_type = ifp->if_type;
ifnet_addrs[if_index - 1] = ifa;
@@ -394,7 +388,7 @@ if_slowtimo(arg)
if (ifp->if_timer == 0 || --ifp->if_timer)
continue;
if (ifp->if_watchdog)
- (*ifp->if_watchdog)(ifp->if_unit);
+ (*ifp->if_watchdog)(ifp);
}
splx(s);
timeout(if_slowtimo, NULL, hz / IFNET_SLOWHZ);
@@ -408,36 +402,13 @@ struct ifnet *
ifunit(name)
register char *name;
{
- register char *cp;
register struct ifnet *ifp;
- int unit;
- unsigned len;
- char *ep, c;
- for (cp = name; cp < name + IFNAMSIZ && *cp; cp++)
- if (*cp >= '0' && *cp <= '9')
- break;
- if (*cp == '\0' || cp == name + IFNAMSIZ)
- return ((struct ifnet *)0);
- /*
- * Save first char of unit, and pointer to it,
- * so we can put a null there to avoid matching
- * initial substrings of interface names.
- */
- len = cp - name + 1;
- c = *cp;
- ep = cp;
- for (unit = 0; *cp >= '0' && *cp <= '9'; )
- unit = unit * 10 + *cp++ - '0';
- *ep = 0;
- for (ifp = ifnet.tqh_first; ifp != 0; ifp = ifp->if_list.tqe_next) {
- if (bcmp(ifp->if_name, name, len))
- continue;
- if (unit == ifp->if_unit)
- break;
- }
- *ep = c;
- return (ifp);
+ for (ifp = ifnet.tqh_first; ifp != 0; ifp = ifp->if_list.tqe_next)
+ if (strcmp(ifp->if_xname, name) == 0)
+ return (ifp);
+
+ return (NULL);
}
/*
@@ -586,33 +557,13 @@ ifconf(cmd, data)
register struct ifconf *ifc = (struct ifconf *)data;
register struct ifnet *ifp;
register struct ifaddr *ifa;
- register char *cp, *ep;
struct ifreq ifr, *ifrp;
int space = ifc->ifc_len, error = 0;
- int i, ndig;
ifrp = ifc->ifc_req;
- ep = ifr.ifr_name + sizeof (ifr.ifr_name);
- for (ifp = ifnet.tqh_first;
- space > sizeof (ifr) && ifp != 0; ifp = ifp->if_list.tqe_next) {
- strncpy(ifr.ifr_name, ifp->if_name, sizeof(ifr.ifr_name) - 2);
- for (cp = ifr.ifr_name; cp < ep && *cp; cp++)
- continue;
- i = ifp->if_unit;
- ndig = 0;
- do {
- ndig++;
- i /= 10;
- } while (i);
- cp += ndig;
- if (cp >= ep)
- continue;
- *cp = '\0';
- i = ifp->if_unit;
- do {
- *--cp = '0' + i % 10;
- i /= 10;
- } while (i);
+ for (ifp = ifnet.tqh_first; space >= sizeof (ifr) && ifp != 0;
+ ifp = ifp->if_list.tqe_next) {
+ bcopy(ifp->if_xname, ifr.ifr_name, IFNAMSIZ);
if ((ifa = ifp->if_addrlist.tqh_first) == 0) {
bzero((caddr_t)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
@@ -621,58 +572,43 @@ ifconf(cmd, data)
break;
space -= sizeof (ifr), ifrp++;
} else
- for (; space > sizeof (ifr) && ifa != 0; ifa = ifa->ifa_list.tqe_next) {
- register struct sockaddr *sa = ifa->ifa_addr;
+ for (; space >= sizeof (ifr) && ifa != 0;
+ ifa = ifa->ifa_list.tqe_next) {
+ register struct sockaddr *sa = ifa->ifa_addr;
#if defined(COMPAT_43) || defined(COMPAT_LINUX) || defined(COMPAT_SVR4)
- if (cmd == OSIOCGIFCONF) {
- struct osockaddr *osa =
- (struct osockaddr *)&ifr.ifr_addr;
- ifr.ifr_addr = *sa;
- osa->sa_family = sa->sa_family;
- error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
- sizeof (ifr));
- ifrp++;
- } else
+ if (cmd == OSIOCGIFCONF) {
+ struct osockaddr *osa =
+ (struct osockaddr *)&ifr.ifr_addr;
+ ifr.ifr_addr = *sa;
+ osa->sa_family = sa->sa_family;
+ error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
+ sizeof (ifr));
+ ifrp++;
+ } else
#endif
- if (sa->sa_len <= sizeof(*sa)) {
- ifr.ifr_addr = *sa;
- error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
- sizeof (ifr));
- ifrp++;
- } else {
- space -= sa->sa_len - sizeof(*sa);
- if (space < sizeof (ifr))
+ if (sa->sa_len <= sizeof(*sa)) {
+ ifr.ifr_addr = *sa;
+ error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
+ sizeof (ifr));
+ ifrp++;
+ } else {
+ space -= sa->sa_len - sizeof(*sa);
+ if (space < sizeof (ifr))
+ break;
+ error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
+ sizeof (ifr.ifr_name));
+ if (error == 0)
+ error = copyout((caddr_t)sa,
+ (caddr_t)&ifrp->ifr_addr,
+ sa->sa_len);
+ ifrp = (struct ifreq *)(sa->sa_len +
+ (caddr_t)&ifrp->ifr_addr);
+ }
+ if (error)
break;
- error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
- sizeof (ifr.ifr_name));
- if (error == 0)
- error = copyout((caddr_t)sa,
- (caddr_t)&ifrp->ifr_addr, sa->sa_len);
- ifrp = (struct ifreq *)
- (sa->sa_len + (caddr_t)&ifrp->ifr_addr);
+ space -= sizeof (ifr);
}
- if (error)
- break;
- space -= sizeof (ifr);
- }
}
ifc->ifc_len -= space;
return (error);
}
-
-static char *
-sprint_d(n, buf, buflen)
- u_int n;
- char *buf;
- int buflen;
-{
- register char *cp = buf + buflen - 1;
-
- *cp = 0;
- do {
- cp--;
- *cp = "0123456789"[n % 10];
- n /= 10;
- } while (n != 0);
- return (cp);
-}