diff options
author | 2013-04-02 08:54:37 +0000 | |
---|---|---|
committer | 2013-04-02 08:54:37 +0000 | |
commit | afb956e91ee5de542e340d8c7c7d5873461610c9 (patch) | |
tree | 76a1dfb5c1c8cec35a2995634b6e984112f91480 | |
parent | Let this work on gcc < 4, which don't accept /dev/null as a valid input file. (diff) | |
download | wireguard-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.c | 36 | ||||
-rw-r--r-- | sys/net/if.h | 3 | ||||
-rw-r--r-- | sys/net/if_trunk.c | 6 | ||||
-rw-r--r-- | sys/net/if_vlan.c | 9 |
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; |