Use <sys/queue.h> to manage the interface list.

This commit is contained in:
Poul-Henning Kamp 2009-04-05 14:01:39 +00:00
parent 3b3e61faa1
commit 38ae65235e
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=190711
8 changed files with 35 additions and 41 deletions

View File

@ -80,6 +80,7 @@
#include <sys/ioctl.h>
#include <sys/sysctl.h>
#include <sys/socket.h>
#include <sys/queue.h>
#ifdef sgi
#define _USER_ROUTE_TREE
#include <net/radix.h>
@ -262,7 +263,7 @@ struct rt_entry {
* handles "logical" or "IS_REMOTE" interfaces (remote gateways).
*/
struct interface {
struct interface *int_next, **int_prev;
LIST_ENTRY(interface) int_list;
struct interface *int_ahash, **int_ahash_prev;
struct interface *int_bhash, **int_bhash_prev;
struct interface *int_rlink, **int_rlink_prev;
@ -353,6 +354,7 @@ struct interface {
#define iff_up(f) ((f) & IFF_UP)
LIST_HEAD(ifhead, interface);
/* Information for aggregating routes */
#define NUM_AG_SLOTS 32
@ -483,7 +485,7 @@ extern struct timeval ifinit_timer; /* time to check interfaces */
extern naddr loopaddr; /* our address on loopback */
extern int tot_interfaces; /* # of remote and local interfaces */
extern int rip_interfaces; /* # of interfaces doing RIP */
extern struct interface *ifnet; /* all interfaces */
extern struct ifhead ifnet; /* all interfaces */
extern struct interface *remote_if; /* remote interfaces */
extern int have_ripv1_out; /* have a RIPv1 interface */
extern int have_ripv1_in;

View File

@ -41,7 +41,7 @@ __RCSID("$Revision: 2.27 $");
#ident "$Revision: 2.27 $"
#endif
struct interface *ifnet; /* all interfaces */
struct ifhead ifnet = LIST_HEAD_INITIALIZER(ifnet); /* all interfaces */
/* hash table for all interfaces, big enough to tolerate ridiculous
* numbers of IP aliases. Crazy numbers of aliases such as 7000
@ -101,11 +101,7 @@ if_link(struct interface *ifp)
{
struct interface **hifp;
ifp->int_prev = &ifnet;
ifp->int_next = ifnet;
if (ifnet != 0)
ifnet->int_prev = &ifp->int_next;
ifnet = ifp;
LIST_INSERT_HEAD(&ifnet, ifp, int_list);
hifp = AHASH(ifp->int_addr);
ifp->int_ahash_prev = hifp;
@ -217,7 +213,7 @@ ifwithindex(u_short ifindex,
struct interface *ifp;
for (;;) {
for (ifp = ifnet; 0 != ifp; ifp = ifp->int_next) {
LIST_FOREACH(ifp, &ifnet, int_list) {
if (ifp->int_index == ifindex)
return ifp;
}
@ -245,7 +241,7 @@ iflookup(naddr addr)
maybe = 0;
for (;;) {
for (ifp = ifnet; ifp; ifp = ifp->int_next) {
LIST_FOREACH(ifp, &ifnet, int_list) {
if (ifp->int_if_flags & IFF_POINTOPOINT) {
/* finished with a match */
if (ifp->int_dstaddr == addr)
@ -322,7 +318,7 @@ ripv1_mask_net(naddr addr, /* in network byte order */
* such interface, prefer the interface with the longest
* match.
*/
for (ifp = ifnet; ifp != 0; ifp = ifp->int_next) {
LIST_FOREACH(ifp, &ifnet, int_list) {
if (on_net(addr, ifp->int_std_net, ifp->int_std_mask)
&& ifp->int_ripv1_mask > mask
&& ifp->int_ripv1_mask != HOST_MASK)
@ -394,7 +390,7 @@ check_dup(naddr addr, /* IP address, so network byte order */
{
struct interface *ifp;
for (ifp = ifnet; 0 != ifp; ifp = ifp->int_next) {
LIST_FOREACH(ifp, &ifnet, int_list) {
if (ifp->int_mask != mask)
continue;
@ -459,11 +455,7 @@ ifdel(struct interface *ifp)
ifp->int_state |= IS_BROKE;
/* unlink the interface
*/
*ifp->int_prev = ifp->int_next;
if (ifp->int_next != 0)
ifp->int_next->int_prev = ifp->int_prev;
LIST_REMOVE(ifp, int_list);
*ifp->int_ahash_prev = ifp->int_ahash;
if (ifp->int_ahash != 0)
ifp->int_ahash->int_ahash_prev = ifp->int_ahash_prev;
@ -484,7 +476,7 @@ ifdel(struct interface *ifp)
if (!(ifp->int_state & IS_ALIAS)) {
/* delete aliases when the main interface dies
*/
for (ifp1 = ifnet; 0 != ifp1; ifp1 = ifp1->int_next) {
LIST_FOREACH(ifp1, &ifnet, int_list) {
if (ifp1 != ifp
&& !strcmp(ifp->int_name, ifp1->int_name))
ifdel(ifp1);
@ -570,7 +562,7 @@ if_bad(struct interface *ifp)
trace_if("Chg", ifp);
if (!(ifp->int_state & IS_ALIAS)) {
for (ifp1 = ifnet; 0 != ifp1; ifp1 = ifp1->int_next) {
LIST_FOREACH(ifp1, &ifnet, int_list) {
if (ifp1 != ifp
&& !strcmp(ifp->int_name, ifp1->int_name))
if_bad(ifp1);
@ -606,7 +598,7 @@ if_ok(struct interface *ifp,
ifp->int_data.ts = 0;
if (!(ifp->int_state & IS_ALIAS)) {
for (ifp1 = ifnet; 0 != ifp1; ifp1 = ifp1->int_next) {
LIST_FOREACH(ifp1, &ifnet, int_list) {
if (ifp1 != ifp
&& !strcmp(ifp->int_name, ifp1->int_name))
if_ok(ifp1, type);
@ -687,7 +679,7 @@ ifinit(void)
: CHECK_QUIET_INTERVAL);
/* mark all interfaces so we can get rid of those that disappear */
for (ifp = ifnet; 0 != ifp; ifp = ifp->int_next)
LIST_FOREACH(ifp, &ifnet, int_list)
ifp->int_state &= ~(IS_CHECKED | IS_DUP);
/* Fetch the interface list, without too many system calls
@ -1111,7 +1103,7 @@ ifinit(void)
if (!(prev_complaints & COMP_NETMASK)
&& !(ifp->int_if_flags & IFF_POINTOPOINT)
&& ifp->int_addr != RIP_DEFAULT) {
for (ifp1 = ifnet; 0 != ifp1; ifp1 = ifp1->int_next) {
LIST_FOREACH(ifp1, &ifnet, int_list) {
if (ifp1->int_mask == ifp->int_mask)
continue;
if (ifp1->int_if_flags & IFF_POINTOPOINT)
@ -1188,9 +1180,7 @@ ifinit(void)
}
}
for (ifp = ifnet; ifp != 0; ifp = ifp1) {
ifp1 = ifp->int_next; /* because we may delete it */
LIST_FOREACH_SAFE(ifp, &ifnet, int_list, ifp1) {
/* Forget any interfaces that have disappeared.
*/
if (!(ifp->int_state & (IS_CHECKED | IS_REMOTE))) {
@ -1213,7 +1203,7 @@ ifinit(void)
have_ripv1_in = 1;
}
for (ifp = ifnet; ifp != 0; ifp = ifp->int_next) {
LIST_FOREACH(ifp, &ifnet, int_list) {
/* Ensure there is always a network route for interfaces,
* after any dead interfaces have been deleted, which
* might affect routes for point-to-point links.

View File

@ -529,7 +529,9 @@ main(int argc,
n--;
}
for (ifp = ifnet; n > 0 && 0 != ifp; ifp = ifp->int_next) {
LIST_FOREACH(ifp, &ifnet, int_list) {
if (n <= 0)
break;
if (ifp->int_rip_sock >= 0
&& FD_ISSET(ifp->int_rip_sock, &ibits)) {
read_rip(ifp->int_rip_sock, ifp);
@ -578,7 +580,7 @@ fix_select(void)
if (sock_max <= rip_sock)
sock_max = rip_sock+1;
}
for (ifp = ifnet; 0 != ifp; ifp = ifp->int_next) {
LIST_FOREACH(ifp, &ifnet, int_list) {
if (ifp->int_rip_sock >= 0) {
FD_SET(ifp->int_rip_sock, &fdbits);
if (sock_max <= ifp->int_rip_sock)
@ -690,7 +692,7 @@ rip_off(void)
/* get non-broadcast sockets to listen to queries.
*/
for (ifp = ifnet; ifp != 0; ifp = ifp->int_next) {
LIST_FOREACH(ifp, &ifnet, int_list) {
if (ifp->int_state & IS_REMOTE)
continue;
if (ifp->int_rip_sock < 0) {
@ -761,7 +763,7 @@ rip_on(struct interface *ifp)
* since that would let two daemons bind to the broadcast
* socket.
*/
for (ifp = ifnet; ifp != 0; ifp = ifp->int_next) {
LIST_FOREACH(ifp, &ifnet, int_list) {
if (ifp->int_rip_sock >= 0) {
(void)close(ifp->int_rip_sock);
ifp->int_rip_sock = -1;
@ -776,7 +778,7 @@ rip_on(struct interface *ifp)
if (next_bcast.tv_sec < now.tv_sec+MIN_WAITTIME)
next_bcast.tv_sec = now.tv_sec+MIN_WAITTIME;
for (ifp = ifnet; ifp != 0; ifp = ifp->int_next) {
LIST_FOREACH(ifp, &ifnet, int_list) {
ifp->int_query_time = NEVER;
rip_mcast_on(ifp);
}

View File

@ -833,7 +833,7 @@ rip_bcast(int flash)
flash ? "dynamic update" : "all routes",
rtime.tv_sec + ((float)rtime.tv_usec)/1000000.0);
for (ifp = ifnet; ifp != 0; ifp = ifp->int_next) {
LIST_FOREACH(ifp, &ifnet, int_list) {
/* Skip interfaces not doing RIP.
* Do try broken interfaces to see if they have healed.
*/
@ -907,7 +907,7 @@ rip_query(void)
memset(&buf, 0, sizeof(buf));
for (ifp = ifnet; ifp; ifp = ifp->int_next) {
LIST_FOREACH(ifp, &ifnet, int_list) {
/* Skip interfaces those already queried.
* Do not ask via interfaces through which we don't
* accept input. Do not ask via interfaces that cannot

View File

@ -350,7 +350,7 @@ gwkludge(void)
/* After all of the parameter lines have been read,
* apply them to any remote interfaces.
*/
for (ifp = ifnet; 0 != ifp; ifp = ifp->int_next) {
LIST_FOREACH(ifp, &ifnet, int_list) {
get_parms(ifp);
tot_interfaces++;

View File

@ -278,7 +278,7 @@ set_supplier(void)
/* Switch router discovery multicast groups from soliciting
* to advertising.
*/
for (ifp = ifnet; ifp; ifp = ifp->int_next) {
LIST_FOREACH(ifp, &ifnet, int_list) {
if (ifp->int_state & IS_BROKE)
continue;
ifp->int_rdisc_cnt = 0;
@ -817,7 +817,7 @@ rdisc_adv(void)
rdisc_timer.tv_sec = now.tv_sec + NEVER;
for (ifp = ifnet; ifp; ifp = ifp->int_next) {
LIST_FOREACH(ifp, &ifnet, int_list) {
if (0 != (ifp->int_state & (IS_NO_ADV_OUT | IS_BROKE)))
continue;
@ -859,7 +859,7 @@ rdisc_sol(void)
rdisc_timer.tv_sec = now.tv_sec + NEVER;
for (ifp = ifnet; ifp; ifp = ifp->int_next) {
LIST_FOREACH(ifp, &ifnet, int_list) {
if (0 != (ifp->int_state & (IS_NO_SOL_OUT | IS_BROKE))
|| ifp->int_rdisc_cnt >= MAX_SOLICITATIONS)
continue;

View File

@ -1918,7 +1918,7 @@ rtbad_sub(struct rt_entry *rt)
* If so, see if it is used by any other interfaces, such
* as a point-to-point interface with the same local address.
*/
for (ifp = ifnet; ifp != 0; ifp = ifp->int_next) {
LIST_FOREACH(ifp, &ifnet, int_list) {
/* Retain it if another interface needs it.
*/
if (ifp->int_addr == rt->rt_ifp->int_addr) {
@ -1935,7 +1935,7 @@ rtbad_sub(struct rt_entry *rt)
* interface that justifies it.
*/
if (rt->rt_state & RS_NET_SYN) {
for (ifp = ifnet; ifp != 0; ifp = ifp->int_next) {
LIST_FOREACH(ifp, &ifnet, int_list) {
if ((ifp->int_state & IS_NEED_NET_SYN)
&& rt->rt_mask == ifp->int_std_mask
&& rt->rt_dst == ifp->int_std_addr) {
@ -2105,7 +2105,7 @@ age(naddr bad_gate)
/* Check for dead IS_REMOTE interfaces by timing their
* transmissions.
*/
for (ifp = ifnet; ifp; ifp = ifp->int_next) {
LIST_FOREACH(ifp, &ifnet, int_list) {
if (!(ifp->int_state & IS_REMOTE))
continue;

View File

@ -870,7 +870,7 @@ trace_dump(void)
lastlog();
(void)fputs("current daemon state:\n", ftrace);
for (ifp = ifnet; ifp != 0; ifp = ifp->int_next)
LIST_FOREACH(ifp, &ifnet, int_list)
trace_if("", ifp);
(void)rn_walktree(rhead, walk_trace, 0);
}