summaryrefslogtreecommitdiffstats
path: root/sys/net
diff options
context:
space:
mode:
authorjlemon <jlemon@FreeBSD.org>2001-09-06 02:40:43 +0000
committerjlemon <jlemon@FreeBSD.org>2001-09-06 02:40:43 +0000
commitf729fe0a4a07f77cf2a60a88614a01b6bd649256 (patch)
treec9d6ec3dbd785e910055574e19a85daa63dc23d6 /sys/net
parent32d9aeaf2d0cb3d17941506155a2e52a94e50550 (diff)
downloadFreeBSD-src-f729fe0a4a07f77cf2a60a88614a01b6bd649256.zip
FreeBSD-src-f729fe0a4a07f77cf2a60a88614a01b6bd649256.tar.gz
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.
Diffstat (limited to 'sys/net')
-rw-r--r--sys/net/if.c89
-rw-r--r--sys/net/if_ef.c4
-rw-r--r--sys/net/if_ethersubr.c2
-rw-r--r--sys/net/if_fddisubr.c2
-rw-r--r--sys/net/if_iso88025subr.c2
-rw-r--r--sys/net/if_mib.c2
-rw-r--r--sys/net/if_var.h17
-rw-r--r--sys/net/if_vlan.c6
8 files changed, 72 insertions, 52 deletions
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 <net/route.h>
@@ -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 <sys/lock.h> /* XXX */
#include <sys/mutex.h> /* XXX */
+#include <sys/event.h> /* 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;
OpenPOWER on IntegriCloud