summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormpi <mpi@openbsd.org>2013-04-02 08:54:37 +0000
committermpi <mpi@openbsd.org>2013-04-02 08:54:37 +0000
commitafb956e91ee5de542e340d8c7c7d5873461610c9 (patch)
tree76a1dfb5c1c8cec35a2995634b6e984112f91480
parentLet this work on gcc < 4, which don't accept /dev/null as a valid input file. (diff)
downloadwireguard-openbsd-afb956e91ee5de542e340d8c7c7d5873461610c9.tar.xz
wireguard-openbsd-afb956e91ee5de542e340d8c7c7d5873461610c9.zip
Instead of storing the link-level address of every interface in a global
array indexed by interface numbers, add a new field to the interface descriptor pointing to it. claudio@ and todd@ like it, ok mikeb@
-rw-r--r--sys/net/if.c36
-rw-r--r--sys/net/if.h3
-rw-r--r--sys/net/if_trunk.c6
-rw-r--r--sys/net/if_vlan.c9
4 files changed, 20 insertions, 34 deletions
diff --git a/sys/net/if.c b/sys/net/if.c
index c7fbae3ebaa..ee2124408bd 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if.c,v 1.257 2013/03/29 12:20:34 bluhm Exp $ */
+/* $OpenBSD: if.c,v 1.258 2013/04/02 08:54:37 mpi Exp $ */
/* $NetBSD: if.c,v 1.35 1996/05/07 05:26:04 thorpej Exp $ */
/*
@@ -190,7 +190,6 @@ ifinit()
static unsigned int if_index = 0;
static unsigned int if_indexlim = 0;
-struct ifaddr **ifnet_addrs = NULL;
struct ifnet **ifindex2ifnet = NULL;
struct ifnet_head ifnet = TAILQ_HEAD_INITIALIZER(ifnet);
struct ifnet_head iftxlist = TAILQ_HEAD_INITIALIZER(iftxlist);
@@ -237,10 +236,9 @@ if_attachsetup(struct ifnet *ifp)
/*
* We have some arrays that should be indexed by if_index.
* since if_index will grow dynamically, they should grow too.
- * struct ifaddr **ifnet_addrs
* struct ifnet **ifindex2ifnet
*/
- if (ifnet_addrs == 0 || ifindex2ifnet == 0 || if_index >= if_indexlim) {
+ if (ifindex2ifnet == NULL || if_index >= if_indexlim) {
size_t m, n, oldlim;
caddr_t q;
@@ -250,16 +248,6 @@ if_attachsetup(struct ifnet *ifp)
while (if_index >= if_indexlim)
if_indexlim <<= 1;
- /* grow ifnet_addrs */
- m = oldlim * sizeof(struct ifaddr *);
- n = if_indexlim * sizeof(struct ifaddr *);
- q = (caddr_t)malloc(n, M_IFADDR, M_WAITOK|M_ZERO);
- if (ifnet_addrs) {
- bcopy((caddr_t)ifnet_addrs, q, m);
- free((caddr_t)ifnet_addrs, M_IFADDR);
- }
- ifnet_addrs = (struct ifaddr **)q;
-
/* grow ifindex2ifnet */
m = oldlim * sizeof(struct ifnet *);
n = if_indexlim * sizeof(struct ifnet *);
@@ -336,7 +324,7 @@ if_alloc_sadl(struct ifnet *ifp)
sdl->sdl_alen = ifp->if_addrlen;
sdl->sdl_index = ifp->if_index;
sdl->sdl_type = ifp->if_type;
- ifnet_addrs[ifp->if_index] = ifa;
+ ifp->if_lladdr = ifa;
ifa->ifa_ifp = ifp;
ifa->ifa_rtrequest = link_rtrequest;
ifa->ifa_addr = (struct sockaddr *)sdl;
@@ -360,7 +348,7 @@ if_free_sadl(struct ifnet *ifp)
struct ifaddr *ifa;
int s;
- ifa = ifnet_addrs[ifp->if_index];
+ ifa = ifp->if_lladdr;
if (ifa == NULL)
return;
@@ -368,7 +356,7 @@ if_free_sadl(struct ifnet *ifp)
rtinit(ifa, RTM_DELETE, 0);
#if 0
ifa_del(ifp, ifa);
- ifnet_addrs[ifp->if_index] = NULL;
+ ifp->if_lladdr = NULL;
#endif
ifp->if_sadl = NULL;
@@ -610,7 +598,7 @@ do { \
TAILQ_REMOVE(&in_ifaddr, ifatoia(ifa), ia_list);
#endif
/* XXX if_free_sadl needs this */
- if (ifa == ifnet_addrs[ifp->if_index])
+ if (ifa == ifp->if_lladdr)
continue;
ifa->ifa_ifp = NULL;
@@ -622,9 +610,9 @@ do { \
if_free_sadl(ifp);
- ifnet_addrs[ifp->if_index]->ifa_ifp = NULL;
- ifafree(ifnet_addrs[ifp->if_index]);
- ifnet_addrs[ifp->if_index] = NULL;
+ ifp->if_lladdr->ifa_ifp = NULL;
+ ifafree(ifp->if_lladdr);
+ ifp->if_lladdr = NULL;
free(ifp->if_addrhooks, M_TEMP);
free(ifp->if_linkstatehooks, M_TEMP);
@@ -931,8 +919,8 @@ ifa_ifwithnet(struct sockaddr *addr, u_int rdomain)
rdomain = rtable_l2(rdomain);
if (af == AF_LINK) {
struct sockaddr_dl *sdl = (struct sockaddr_dl *)addr;
- if (sdl->sdl_index && if_get(sdl->sdl_index))
- return (ifnet_addrs[sdl->sdl_index]);
+ if (sdl->sdl_index && (ifp = if_get(sdl->sdl_index)) != NULL)
+ return (ifp->if_lladdr);
}
TAILQ_FOREACH(ifp, &ifnet, if_list) {
if (ifp->if_rdomain != rdomain)
@@ -1551,7 +1539,7 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p)
case SIOCSIFLLADDR:
if ((error = suser(p, 0)))
return (error);
- ifa = ifnet_addrs[ifp->if_index];
+ ifa = ifp->if_lladdr;
if (ifa == NULL)
return (EINVAL);
sdl = (struct sockaddr_dl *)ifa->ifa_addr;
diff --git a/sys/net/if.h b/sys/net/if.h
index a6302312bf4..20a42f6fba7 100644
--- a/sys/net/if.h
+++ b/sys/net/if.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: if.h,v 1.141 2013/03/26 13:19:25 mpi Exp $ */
+/* $OpenBSD: if.h,v 1.142 2013/04/02 08:54:37 mpi Exp $ */
/* $NetBSD: if.h,v 1.23 1996/05/07 02:40:27 thorpej Exp $ */
/*
@@ -307,6 +307,7 @@ struct ifnet { /* and the entries */
/* timer routine */
void (*if_watchdog)(struct ifnet *);
int (*if_wol)(struct ifnet *, int);
+ struct ifaddr *if_lladdr; /* pointer to link-level address */
struct ifaltq if_snd; /* output queue (includes altq) */
struct sockaddr_dl *if_sadl; /* pointer to our sockaddr_dl */
diff --git a/sys/net/if_trunk.c b/sys/net/if_trunk.c
index cc1f277470f..82a439f2c5b 100644
--- a/sys/net/if_trunk.c
+++ b/sys/net/if_trunk.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_trunk.c,v 1.80 2013/03/28 16:45:16 tedu Exp $ */
+/* $OpenBSD: if_trunk.c,v 1.81 2013/04/02 08:54:37 mpi Exp $ */
/*
* Copyright (c) 2005, 2006, 2007 Reyk Floeter <reyk@openbsd.org>
@@ -60,8 +60,6 @@
SLIST_HEAD(__trhead, trunk_softc) trunk_list; /* list of trunks */
-extern struct ifaddr **ifnet_addrs;
-
void trunkattach(int);
int trunk_clone_create(struct if_clone *, int);
int trunk_clone_destroy(struct ifnet *);
@@ -251,7 +249,7 @@ trunk_lladdr(struct arpcom *ac, u_int8_t *lladdr)
struct ifaddr *ifa;
struct sockaddr_dl *sdl;
- ifa = ifnet_addrs[ifp->if_index];
+ ifa = ifp->if_lladdr;
sdl = (struct sockaddr_dl *)ifa->ifa_addr;
sdl->sdl_type = IFT_ETHER;
sdl->sdl_alen = ETHER_ADDR_LEN;
diff --git a/sys/net/if_vlan.c b/sys/net/if_vlan.c
index f58bb7ae389..a69e502a65d 100644
--- a/sys/net/if_vlan.c
+++ b/sys/net/if_vlan.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_vlan.c,v 1.94 2013/03/28 16:45:16 tedu Exp $ */
+/* $OpenBSD: if_vlan.c,v 1.95 2013/04/02 08:54:37 mpi Exp $ */
/*
* Copyright 1998 Massachusetts Institute of Technology
@@ -74,7 +74,6 @@
#include <net/if_vlan_var.h>
-extern struct ifaddr **ifnet_addrs;
u_long vlan_tagmask, svlan_tagmask;
#define TAG_HASH_SIZE 32
@@ -434,8 +433,8 @@ vlan_config(struct ifvlan *ifv, struct ifnet *p, u_int16_t tag)
* Set up our ``Ethernet address'' to reflect the underlying
* physical interface's.
*/
- ifa1 = ifnet_addrs[ifv->ifv_if.if_index];
- ifa2 = ifnet_addrs[p->if_index];
+ ifa1 = ifv->ifv_if.if_lladdr;
+ ifa2 = p->if_lladdr;
sdl1 = (struct sockaddr_dl *)ifa1->ifa_addr;
sdl2 = (struct sockaddr_dl *)ifa2->ifa_addr;
sdl1->sdl_type = IFT_ETHER;
@@ -510,7 +509,7 @@ vlan_unconfig(struct ifnet *ifp, struct ifnet *newp)
ifv->ifv_flags = 0;
/* Clear our MAC address. */
- ifa = ifnet_addrs[ifv->ifv_if.if_index];
+ ifa = ifv->ifv_if.if_lladdr;
sdl = (struct sockaddr_dl *)ifa->ifa_addr;
sdl->sdl_type = IFT_ETHER;
sdl->sdl_alen = ETHER_ADDR_LEN;