From f729fe0a4a07f77cf2a60a88614a01b6bd649256 Mon Sep 17 00:00:00 2001 From: jlemon Date: Thu, 6 Sep 2001 02:40:43 +0000 Subject: Wrap array accesses in macros, which also happen to be lvalues: ifnet_addrs[i - 1] -> ifaddr_byindex(i) ifindex2ifnet[i] -> ifnet_byindex(i) This is intended to ease the conversion to SMPng. --- sys/net/if.c | 89 ++++++++++++++++++++++++++--------------------- sys/net/if_ef.c | 4 +-- sys/net/if_ethersubr.c | 2 +- sys/net/if_fddisubr.c | 2 +- sys/net/if_iso88025subr.c | 2 +- sys/net/if_mib.c | 2 +- sys/net/if_var.h | 17 +++++++-- sys/net/if_vlan.c | 6 ++-- 8 files changed, 72 insertions(+), 52 deletions(-) (limited to 'sys/net') diff --git a/sys/net/if.c b/sys/net/if.c index 1499604..ecce0bb 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -71,7 +71,9 @@ #endif static int ifconf(u_long, caddr_t); -static void ifinit(void *); +static void if_grow(void); +static void if_init(void *); +static void if_check(void *); static void if_qflush(struct ifqueue *); static void if_slowtimo(void *); static void link_rtrequest(int, struct rtentry *, struct sockaddr *); @@ -87,17 +89,19 @@ extern void nd6_setmtu __P((struct ifnet *)); #endif int if_index = 0; -struct ifaddr **ifnet_addrs; -struct ifnet **ifindex2ifnet = NULL; +struct ifindex_entry *ifindex_table = NULL; int ifqmaxlen = IFQ_MAXLEN; struct ifnethead ifnet; /* depend on static init XXX */ int if_cloners_count; LIST_HEAD(, if_clone) if_cloners = LIST_HEAD_INITIALIZER(if_cloners); +static int if_indexlim = 8; + /* * System initialization */ -SYSINIT(interfaces, SI_SUB_PROTO_IF, SI_ORDER_FIRST, ifinit, NULL) +SYSINIT(interfaces, SI_SUB_INIT_IF, SI_ORDER_FIRST, if_init, NULL) +SYSINIT(interface_check, SI_SUB_PROTO_IF, SI_ORDER_FIRST, if_check, NULL) MALLOC_DEFINE(M_IFADDR, "ifaddr", "interface address"); MALLOC_DEFINE(M_IFMADDR, "ether_multi", "link-level multicast address"); @@ -109,8 +113,34 @@ MALLOC_DEFINE(M_IFMADDR, "ether_multi", "link-level multicast address"); * parameters. */ /* ARGSUSED*/ -void -ifinit(dummy) +static void +if_init(dummy) + void *dummy; +{ + + TAILQ_INIT(&ifnet); + if_grow(); /* create initial table */ +} + +static void +if_grow(void) +{ + u_int n; + struct ifindex_entry *e; + + if_indexlim <<= 1; + n = if_indexlim * sizeof(*e); + e = malloc(n, M_IFADDR, M_WAITOK | M_ZERO); + if (ifindex_table != NULL) { + memcpy((caddr_t)e, (caddr_t)ifindex_table, n/2); + free((caddr_t)ifindex_table, M_IFADDR); + } + ifindex_table = e; +} + +/* ARGSUSED*/ +static void +if_check(dummy) void *dummy; { struct ifnet *ifp; @@ -146,13 +176,6 @@ if_attach(ifp) char workbuf[64]; register struct sockaddr_dl *sdl; register struct ifaddr *ifa; - static int if_indexlim = 8; - static int inited; - - if (!inited) { - TAILQ_INIT(&ifnet); - inited = 1; - } TAILQ_INSERT_TAIL(&ifnet, ifp, if_link); ifp->if_index = ++if_index; @@ -167,27 +190,10 @@ if_attach(ifp) TAILQ_INIT(&ifp->if_prefixhead); TAILQ_INIT(&ifp->if_multiaddrs); getmicrotime(&ifp->if_lastchange); - if (ifnet_addrs == 0 || if_index >= if_indexlim) { - unsigned n = (if_indexlim <<= 1) * sizeof(ifa); - caddr_t q = malloc(n, M_IFADDR, M_WAITOK | M_ZERO); - if (ifnet_addrs) { - bcopy((caddr_t)ifnet_addrs, (caddr_t)q, n/2); - free((caddr_t)ifnet_addrs, M_IFADDR); - } - ifnet_addrs = (struct ifaddr **)q; - - /* grow ifindex2ifnet */ - n = if_indexlim * sizeof(struct ifnet *); - q = malloc(n, M_IFADDR, M_WAITOK | M_ZERO); - if (ifindex2ifnet) { - bcopy((caddr_t)ifindex2ifnet, q, n/2); - free((caddr_t)ifindex2ifnet, M_IFADDR); - } - ifindex2ifnet = (struct ifnet **)q; - } - - ifindex2ifnet[if_index] = ifp; + if (if_index >= if_indexlim) + if_grow(); + ifnet_byindex(if_index) = ifp; mtx_init(&ifp->if_snd.ifq_mtx, ifp->if_name, MTX_DEF); /* @@ -212,7 +218,7 @@ if_attach(ifp) sdl->sdl_nlen = namelen; sdl->sdl_index = ifp->if_index; sdl->sdl_type = ifp->if_type; - ifnet_addrs[if_index - 1] = ifa; + ifaddr_byindex(if_index) = ifa; ifa->ifa_ifp = ifp; ifa->ifa_rtrequest = link_rtrequest; ifa->ifa_addr = (struct sockaddr *)sdl; @@ -245,11 +251,12 @@ if_detach(ifp) if_down(ifp); /* - * Remove address from ifnet_addrs[] and maybe decrement if_index. + * Remove address from ifindex_table[] and maybe decrement if_index. * Clean up all addresses. */ - ifnet_addrs[ifp->if_index - 1] = 0; - while (if_index > 0 && ifnet_addrs[if_index - 1] == 0) + ifaddr_byindex(ifp->if_index) = NULL; + + while (if_index > 0 && ifaddr_byindex(if_index) == NULL) if_index--; for (ifa = TAILQ_FIRST(&ifp->if_addrhead); ifa; @@ -600,7 +607,7 @@ ifa_ifwithnet(addr) if (af == AF_LINK) { register struct sockaddr_dl *sdl = (struct sockaddr_dl *)addr; if (sdl->sdl_index && sdl->sdl_index <= if_index) - return (ifnet_addrs[sdl->sdl_index - 1]); + return (ifaddr_byindex(sdl->sdl_index)); } /* @@ -719,7 +726,9 @@ ifaof_ifpforaddr(addr, ifp) return (ifa); } } - return (ifa_maybe); + ifa = ifa_maybe; +done: + return (ifa); } #include @@ -1553,7 +1562,7 @@ if_setlladdr(struct ifnet *ifp, const u_char *lladdr, int len) struct sockaddr_dl *sdl; struct ifaddr *ifa; - ifa = ifnet_addrs[ifp->if_index - 1]; + ifa = ifaddr_byindex(ifp->if_index); if (ifa == NULL) return (EINVAL); sdl = (struct sockaddr_dl *)ifa->ifa_addr; diff --git a/sys/net/if_ef.c b/sys/net/if_ef.c index 3111195..5e85819 100644 --- a/sys/net/if_ef.c +++ b/sys/net/if_ef.c @@ -134,8 +134,8 @@ ef_attach(struct efnet *sc) ifp->if_type = IFT_XETHER; ifp->if_flags |= IFF_RUNNING; - ifa1 = ifnet_addrs[ifp->if_index - 1]; - ifa2 = ifnet_addrs[sc->ef_ifp->if_index - 1]; + ifa1 = ifaddr_byindex(ifp->if_index); + ifa2 = ifaddr_byindex(sc->ef_ifp->if_index); sdl1 = (struct sockaddr_dl *)ifa1->ifa_addr; sdl2 = (struct sockaddr_dl *)ifa2->ifa_addr; sdl1->sdl_type = IFT_ETHER; diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c index 3a943bf..d342491 100644 --- a/sys/net/if_ethersubr.c +++ b/sys/net/if_ethersubr.c @@ -667,7 +667,7 @@ ether_ifattach(ifp, bpf) ifp->if_resolvemulti = ether_resolvemulti; if (ifp->if_baudrate == 0) ifp->if_baudrate = 10000000; - ifa = ifnet_addrs[ifp->if_index - 1]; + ifa = ifaddr_byindex(ifp->if_index); KASSERT(ifa != NULL, ("%s: no lladdr!\n", __FUNCTION__)); sdl = (struct sockaddr_dl *)ifa->ifa_addr; sdl->sdl_type = IFT_ETHER; diff --git a/sys/net/if_fddisubr.c b/sys/net/if_fddisubr.c index 0fc8451..400106b 100644 --- a/sys/net/if_fddisubr.c +++ b/sys/net/if_fddisubr.c @@ -526,7 +526,7 @@ fddi_ifattach(ifp) ifp->if_flags |= IFF_NOTRAILERS; #endif #if defined(__FreeBSD__) - ifa = ifnet_addrs[ifp->if_index - 1]; + ifa = ifaddr_byindex(ifp->if_index); sdl = (struct sockaddr_dl *)ifa->ifa_addr; sdl->sdl_type = IFT_FDDI; sdl->sdl_alen = ifp->if_addrlen; diff --git a/sys/net/if_iso88025subr.c b/sys/net/if_iso88025subr.c index 2fd7747..4351db2 100644 --- a/sys/net/if_iso88025subr.c +++ b/sys/net/if_iso88025subr.c @@ -102,7 +102,7 @@ iso88025_ifattach(struct ifnet *ifp) if (ifp->if_mtu == 0) ifp->if_mtu = ISO88025_DEFAULT_MTU; - ifa = ifnet_addrs[ifp->if_index - 1]; + ifa = ifaddr_byindex(ifp->if_index); if (ifa == 0) { printf("iso88025_ifattach: no lladdr!\n"); return; diff --git a/sys/net/if_mib.c b/sys/net/if_mib.c index ee497a6..5b04cbb 100644 --- a/sys/net/if_mib.c +++ b/sys/net/if_mib.c @@ -83,7 +83,7 @@ sysctl_ifdata(SYSCTL_HANDLER_ARGS) /* XXX bad syntax! */ if (name[0] <= 0 || name[0] > if_index) return ENOENT; - ifp = ifnet_addrs[name[0] - 1]->ifa_ifp; + ifp = ifaddr_byindex(name[0])->ifa_ifp; switch(name[1]) { default: diff --git a/sys/net/if_var.h b/sys/net/if_var.h index 7e760c7..5a4d92f 100644 --- a/sys/net/if_var.h +++ b/sys/net/if_var.h @@ -81,6 +81,7 @@ struct ether_header; #endif /* _KERNEL */ #include /* XXX */ #include /* XXX */ +#include /* XXX */ TAILQ_HEAD(ifnethead, ifnet); /* we use TAILQs so that the order of */ TAILQ_HEAD(ifaddrhead, ifaddr); /* instantiation is preserved in the list */ @@ -109,7 +110,8 @@ struct ifnet { char *if_name; /* name, e.g. ``en'' or ``lo'' */ TAILQ_ENTRY(ifnet) if_link; /* all struct ifnets are chained */ struct ifaddrhead if_addrhead; /* linked list of addresses per if */ - int if_pcount; /* number of promiscuous listeners */ + struct klist if_klist; /* events attached to this if */ + int if_pcount; /* number of promiscuous listeners */ struct bpf_if *if_bpf; /* packet filter structure */ u_short if_index; /* numeric abbreviation for this if */ short if_unit; /* sub-unit for lower level driver */ @@ -371,12 +373,21 @@ struct ifmultiaddr { (ifa)->ifa_refcnt--; \ } while (0) +struct ifindex_entry { + struct ifnet *ife_ifnet; + struct ifaddr *ife_ifnet_addr; + dev_t ife_dev; +}; + +#define ifnet_byindex(idx) ifindex_table[(idx)].ife_ifnet +#define ifaddr_byindex(idx) ifindex_table[(idx)].ife_ifnet_addr +#define ifdev_byindex(idx) ifindex_table[(idx)].ife_dev + extern struct ifnethead ifnet; -extern struct ifnet **ifindex2ifnet; +extern struct ifindex_entry *ifindex_table; extern int ifqmaxlen; extern struct ifnet *loif; /* first loopback interface */ extern int if_index; -extern struct ifaddr **ifnet_addrs; void ether_ifattach __P((struct ifnet *, int)); void ether_ifdetach __P((struct ifnet *, int)); diff --git a/sys/net/if_vlan.c b/sys/net/if_vlan.c index 815ae37..d84a4b9 100644 --- a/sys/net/if_vlan.c +++ b/sys/net/if_vlan.c @@ -487,8 +487,8 @@ vlan_config(struct ifvlan *ifv, struct ifnet *p) * Set up our ``Ethernet address'' to reflect the underlying * physical interface's. */ - ifa1 = ifnet_addrs[ifv->ifv_if.if_index - 1]; - ifa2 = ifnet_addrs[p->if_index - 1]; + ifa1 = ifaddr_byindex(ifv->ifv_if.if_index); + ifa2 = ifaddr_byindex(p->if_index); sdl1 = (struct sockaddr_dl *)ifa1->ifa_addr; sdl2 = (struct sockaddr_dl *)ifa2->ifa_addr; sdl1->sdl_type = IFT_ETHER; @@ -549,7 +549,7 @@ vlan_unconfig(struct ifnet *ifp) ifv->ifv_if.if_mtu = ETHERMTU; /* Clear our MAC address. */ - ifa = ifnet_addrs[ifv->ifv_if.if_index - 1]; + ifa = ifaddr_byindex(ifv->ifv_if.if_index); sdl = (struct sockaddr_dl *)ifa->ifa_addr; sdl->sdl_type = IFT_ETHER; sdl->sdl_alen = ETHER_ADDR_LEN; -- cgit v1.1