diff options
Diffstat (limited to 'sys/net/if.c')
| -rw-r--r-- | sys/net/if.c | 160 |
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); -} |
