summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/compat/linux/linux_ioctl.c2
-rw-r--r--sys/dev/an/if_an.c2
-rw-r--r--sys/dev/wi/if_wi.c2
-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
-rw-r--r--sys/netatm/atm_if.c2
-rw-r--r--sys/netinet/in.c2
-rw-r--r--sys/netinet/ip_input.c4
-rw-r--r--sys/netinet/ip_output.c2
-rw-r--r--sys/netinet6/in6.c2
-rw-r--r--sys/netinet6/in6_pcb.c5
-rw-r--r--sys/netinet6/in6_src.c9
-rw-r--r--sys/netinet6/ip6_mroute.c2
-rw-r--r--sys/netinet6/ip6_output.c12
-rw-r--r--sys/netinet6/nd6.c2
-rw-r--r--sys/netinet6/nd6_rtr.c2
-rw-r--r--sys/netinet6/raw_ip6.c4
-rw-r--r--sys/sys/kernel.h1
24 files changed, 99 insertions, 80 deletions
diff --git a/sys/compat/linux/linux_ioctl.c b/sys/compat/linux/linux_ioctl.c
index 3b14eb2..2079fcd 100644
--- a/sys/compat/linux/linux_ioctl.c
+++ b/sys/compat/linux/linux_ioctl.c
@@ -1385,7 +1385,7 @@ linux_ioctl_socket(struct proc *p, struct linux_ioctl_args *args)
* structure, as Linux interface names are all different.
*/
for (ifn = 0; ifn < if_index; ifn++) {
- ifp = ifnet_addrs[ifn]->ifa_ifp;
+ ifp = ifnet_byindex(ifn);
if (ifp->if_type == IFT_ETHER) {
ifa = TAILQ_FIRST(&ifp->if_addrhead);
while (ifa) {
diff --git a/sys/dev/an/if_an.c b/sys/dev/an/if_an.c
index 5f1262b..406be21 100644
--- a/sys/dev/an/if_an.c
+++ b/sys/dev/an/if_an.c
@@ -1001,7 +1001,7 @@ static void an_setdef(sc, areq)
case AN_RID_GENCONFIG:
cfg = (struct an_ltv_genconfig *)areq;
- ifa = ifnet_addrs[ifp->if_index - 1];
+ ifa = ifaddr_byindex(ifp->if_index);
sdl = (struct sockaddr_dl *)ifa->ifa_addr;
bcopy((char *)&cfg->an_macaddr, (char *)&sc->arpcom.ac_enaddr,
ETHER_ADDR_LEN);
diff --git a/sys/dev/wi/if_wi.c b/sys/dev/wi/if_wi.c
index cf9114d..9c7230f 100644
--- a/sys/dev/wi/if_wi.c
+++ b/sys/dev/wi/if_wi.c
@@ -1293,7 +1293,7 @@ static void wi_setdef(sc, wreq)
switch(wreq->wi_type) {
case WI_RID_MAC_NODE:
- ifa = ifnet_addrs[ifp->if_index - 1];
+ ifa = ifaddr_byindex(ifp->if_index);
sdl = (struct sockaddr_dl *)ifa->ifa_addr;
bcopy((char *)&wreq->wi_val, (char *)&sc->arpcom.ac_enaddr,
ETHER_ADDR_LEN);
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;
diff --git a/sys/netatm/atm_if.c b/sys/netatm/atm_if.c
index 0260ee0..86d783a 100644
--- a/sys/netatm/atm_if.c
+++ b/sys/netatm/atm_if.c
@@ -564,7 +564,7 @@ atm_physif_ioctl(code, data, arg)
* Set macaddr in <Link> address
*/
ifp->if_addrlen = 6;
- ifa = ifnet_addrs[ifp->if_index - 1];
+ ifa = ifaddr_byindex(ifp->if_index);
if ( ifa ) {
sdl = (struct sockaddr_dl *)
ifa->ifa_addr;
diff --git a/sys/netinet/in.c b/sys/netinet/in.c
index 7242545..c0b45c3 100644
--- a/sys/netinet/in.c
+++ b/sys/netinet/in.c
@@ -410,7 +410,7 @@ in_control(so, cmd, data, ifp, p)
* XXX horrible hack to detect that we are being called
* from if_detach()
*/
- if (!ifnet_addrs[ifp->if_index - 1]) {
+ if (ifaddr_byindex(ifp->if_index) != NULL) {
in_pcbpurgeif0(LIST_FIRST(ripcbinfo.listhead), ifp);
in_pcbpurgeif0(LIST_FIRST(udbinfo.listhead), ifp);
}
diff --git a/sys/netinet/ip_input.c b/sys/netinet/ip_input.c
index 4da9103..69eb78d 100644
--- a/sys/netinet/ip_input.c
+++ b/sys/netinet/ip_input.c
@@ -1842,8 +1842,8 @@ ip_savecontrol(inp, mp, ip, m)
if (((ifp = m->m_pkthdr.rcvif))
&& ( ifp->if_index && (ifp->if_index <= if_index))) {
- sdp = (struct sockaddr_dl *)(ifnet_addrs
- [ifp->if_index - 1]->ifa_addr);
+ sdp = (struct sockaddr_dl *)
+ (ifaddr_byindex(ifp->if_index)->ifa_addr);
/*
* Change our mind and don't try copy.
*/
diff --git a/sys/netinet/ip_output.c b/sys/netinet/ip_output.c
index 96e1e5f..2201e06 100644
--- a/sys/netinet/ip_output.c
+++ b/sys/netinet/ip_output.c
@@ -1515,7 +1515,7 @@ ip_multicast_if(a, ifindexp)
ifindex = ntohl(a->s_addr) & 0xffffff;
if (ifindex < 0 || if_index < ifindex)
return NULL;
- ifp = ifindex2ifnet[ifindex];
+ ifp = ifnet_byindex(ifindex);
if (ifindexp)
*ifindexp = ifindex;
} else {
diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c
index 529d122..c6d0d60 100644
--- a/sys/netinet6/in6.c
+++ b/sys/netinet6/in6.c
@@ -291,7 +291,7 @@ in6_ifindex2scopeid(idx)
if (idx < 0 || if_index < idx)
return -1;
- ifp = ifindex2ifnet[idx];
+ ifp = ifnet_byindex(idx);
TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list)
{
diff --git a/sys/netinet6/in6_pcb.c b/sys/netinet6/in6_pcb.c
index de4f1a8..5e8b3dd 100644
--- a/sys/netinet6/in6_pcb.c
+++ b/sys/netinet6/in6_pcb.c
@@ -424,8 +424,7 @@ in6_selectsrc(dstsock, opts, mopts, ro, laddr, errorp)
*/
if (pi && pi->ipi6_ifindex) {
/* XXX boundary check is assumed to be already done. */
- ia6 = in6_ifawithscope(ifindex2ifnet[pi->ipi6_ifindex],
- dst);
+ ia6 = in6_ifawithscope(ifnet_byindex(pi->ipi6_ifindex), dst);
if (ia6 == 0) {
*errorp = EADDRNOTAVAIL;
return(0);
@@ -453,7 +452,7 @@ in6_selectsrc(dstsock, opts, mopts, ro, laddr, errorp)
*errorp = ENXIO; /* XXX: better error? */
return(0);
}
- ia6 = in6_ifawithscope(ifindex2ifnet[dstsock->sin6_scope_id],
+ ia6 = in6_ifawithscope(ifnet_byindex(dstsock->sin6_scope_id),
dst);
if (ia6 == 0) {
*errorp = EADDRNOTAVAIL;
diff --git a/sys/netinet6/in6_src.c b/sys/netinet6/in6_src.c
index 7bf28d2..708c4f5 100644
--- a/sys/netinet6/in6_src.c
+++ b/sys/netinet6/in6_src.c
@@ -141,8 +141,7 @@ in6_selectsrc(dstsock, opts, mopts, ro, laddr, errorp)
*/
if (pi && pi->ipi6_ifindex) {
/* XXX boundary check is assumed to be already done. */
- ia6 = in6_ifawithscope(ifindex2ifnet[pi->ipi6_ifindex],
- dst);
+ ia6 = in6_ifawithscope(ifnet_byindex(pi->ipi6_ifindex), dst);
if (ia6 == 0) {
*errorp = EADDRNOTAVAIL;
return(0);
@@ -170,7 +169,7 @@ in6_selectsrc(dstsock, opts, mopts, ro, laddr, errorp)
*errorp = ENXIO; /* XXX: better error? */
return(0);
}
- ia6 = in6_ifawithscope(ifindex2ifnet[dstsock->sin6_scope_id],
+ ia6 = in6_ifawithscope(ifnet_byindex(dstsock->sin6_scope_id),
dst);
if (ia6 == 0) {
*errorp = EADDRNOTAVAIL;
@@ -474,7 +473,7 @@ in6_embedscope(in6, sin6, in6p, ifpp)
if (in6p && in6p->in6p_outputopts &&
(pi = in6p->in6p_outputopts->ip6po_pktinfo) &&
pi->ipi6_ifindex) {
- ifp = ifindex2ifnet[pi->ipi6_ifindex];
+ ifp = ifnet_byindex(pi->ipi6_ifindex);
in6->s6_addr16[1] = htons(pi->ipi6_ifindex);
} else if (in6p && IN6_IS_ADDR_MULTICAST(in6) &&
in6p->in6p_moptions &&
@@ -485,7 +484,7 @@ in6_embedscope(in6, sin6, in6p, ifpp)
/* boundary check */
if (scopeid < 0 || if_index < scopeid)
return ENXIO; /* XXX EINVAL? */
- ifp = ifindex2ifnet[scopeid];
+ ifp = ifnet_byindex(scopeid);
/*XXX assignment to 16bit from 32bit variable */
in6->s6_addr16[1] = htons(scopeid & 0xffff);
}
diff --git a/sys/netinet6/ip6_mroute.c b/sys/netinet6/ip6_mroute.c
index 2be8796..bb200da 100644
--- a/sys/netinet6/ip6_mroute.c
+++ b/sys/netinet6/ip6_mroute.c
@@ -546,7 +546,7 @@ add_m6if(mifcp)
return EADDRINUSE; /* XXX: is it appropriate? */
if (mifcp->mif6c_pifi == 0 || mifcp->mif6c_pifi > if_index)
return ENXIO;
- ifp = ifindex2ifnet[mifcp->mif6c_pifi];
+ ifp = ifnet_byindex(mifcp->mif6c_pifi);
if (mifcp->mif6c_flags & MIFF_REGISTER) {
if (reg_mif_num == (mifi_t)-1) {
diff --git a/sys/netinet6/ip6_output.c b/sys/netinet6/ip6_output.c
index fbe8821..41b25b6c 100644
--- a/sys/netinet6/ip6_output.c
+++ b/sys/netinet6/ip6_output.c
@@ -613,7 +613,7 @@ skip_ipsec2:;
* Boundary check for ifindex is assumed to be already done.
*/
if (opt && opt->ip6po_pktinfo && opt->ip6po_pktinfo->ipi6_ifindex)
- ifp = ifindex2ifnet[opt->ip6po_pktinfo->ipi6_ifindex];
+ ifp = ifnet_byindex(opt->ip6po_pktinfo->ipi6_ifindex);
/*
* If the destination is a node-local scope multicast,
@@ -795,9 +795,9 @@ skip_ipsec2:;
*/
origifp = NULL;
if (IN6_IS_SCOPE_LINKLOCAL(&ip6->ip6_src))
- origifp = ifindex2ifnet[ntohs(ip6->ip6_src.s6_addr16[1])];
+ origifp = ifnet_byindex(ntohs(ip6->ip6_src.s6_addr16[1]));
else if (IN6_IS_SCOPE_LINKLOCAL(&ip6->ip6_dst))
- origifp = ifindex2ifnet[ntohs(ip6->ip6_dst.s6_addr16[1])];
+ origifp = ifnet_byindex(ntohs(ip6->ip6_dst.s6_addr16[1]));
/*
* XXX: origifp can be NULL even in those two cases above.
* For example, if we remove the (only) link-local address
@@ -1929,7 +1929,7 @@ ip6_setmoptions(optname, im6op, m)
error = ENXIO; /* XXX EINVAL? */
break;
}
- ifp = ifindex2ifnet[ifindex];
+ ifp = ifnet_byindex(ifindex);
if (ifp == NULL || (ifp->if_flags & IFF_MULTICAST) == 0) {
error = EADDRNOTAVAIL;
break;
@@ -2038,7 +2038,7 @@ ip6_setmoptions(optname, im6op, m)
rtfree(ro.ro_rt);
}
} else
- ifp = ifindex2ifnet[mreq->ipv6mr_interface];
+ ifp = ifnet_byindex(mreq->ipv6mr_interface);
/*
* See if we found an interface, and confirm that it
@@ -2114,7 +2114,7 @@ ip6_setmoptions(optname, im6op, m)
error = ENXIO; /* XXX EINVAL? */
break;
}
- ifp = ifindex2ifnet[mreq->ipv6mr_interface];
+ ifp = ifnet_byindex(mreq->ipv6mr_interface);
/*
* Put interface index into the multicast address,
* if the address has link-local scope.
diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c
index 1a6785c..6fa087a 100644
--- a/sys/netinet6/nd6.c
+++ b/sys/netinet6/nd6.c
@@ -183,7 +183,7 @@ nd6_ifattach(ifp)
if (ND.basereachable)
return;
- ND.linkmtu = ifindex2ifnet[ifp->if_index]->if_mtu;
+ ND.linkmtu = ifnet_byindex(ifp->if_index)->if_mtu;
ND.chlim = IPV6_DEFHLIM;
ND.basereachable = REACHABLE_TIME;
ND.reachable = ND_COMPUTE_RTIME(ND.basereachable);
diff --git a/sys/netinet6/nd6_rtr.c b/sys/netinet6/nd6_rtr.c
index 120a25a..268884d 100644
--- a/sys/netinet6/nd6_rtr.c
+++ b/sys/netinet6/nd6_rtr.c
@@ -1959,7 +1959,7 @@ nd6_setdefaultiface(ifindex)
if (nd6_defifindex != ifindex) {
nd6_defifindex = ifindex;
if (nd6_defifindex > 0)
- nd6_defifp = ifindex2ifnet[nd6_defifindex];
+ nd6_defifp = ifnet_byindex(nd6_defifindex);
else
nd6_defifp = NULL;
diff --git a/sys/netinet6/raw_ip6.c b/sys/netinet6/raw_ip6.c
index 1ee29cd..43aa54e 100644
--- a/sys/netinet6/raw_ip6.c
+++ b/sys/netinet6/raw_ip6.c
@@ -375,7 +375,7 @@ rip6_output(m, va_alist)
*/
if (optp && (pi = optp->ip6po_pktinfo) && pi->ipi6_ifindex) {
ip6->ip6_dst.s6_addr16[1] = htons(pi->ipi6_ifindex);
- oifp = ifindex2ifnet[pi->ipi6_ifindex];
+ oifp = ifnet_byindex(pi->ipi6_ifindex);
} else if (IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst) &&
in6p->in6p_moptions &&
in6p->in6p_moptions->im6o_multicast_ifp) {
@@ -410,7 +410,7 @@ rip6_output(m, va_alist)
}
ip6->ip6_src = *in6a;
if (in6p->in6p_route.ro_rt)
- oifp = ifindex2ifnet[in6p->in6p_route.ro_rt->rt_ifp->if_index];
+ oifp = ifnet_byindex(in6p->in6p_route.ro_rt->rt_ifp->if_index);
}
ip6->ip6_flow = (ip6->ip6_flow & ~IPV6_FLOWINFO_MASK) |
(in6p->in6p_flowinfo & IPV6_FLOWINFO_MASK);
diff --git a/sys/sys/kernel.h b/sys/sys/kernel.h
index 0d85100..821c325 100644
--- a/sys/sys/kernel.h
+++ b/sys/sys/kernel.h
@@ -129,6 +129,7 @@ enum sysinit_sub_id {
SI_SUB_MBUF = 0x2700000, /* mbuf subsystem */
SI_SUB_INTR = 0x2800000, /* interrupt threads */
SI_SUB_SOFTINTR = 0x2800001, /* start soft interrupt thread */
+ SI_SUB_INIT_IF = 0x3000000, /* prep for net interfaces */
SI_SUB_DRIVERS = 0x3100000, /* Let Drivers initialize */
SI_SUB_CONFIGURE = 0x3800000, /* Configure devices */
SI_SUB_VFS = 0x4000000, /* virtual file system*/
OpenPOWER on IntegriCloud