From owner-p4-projects@FreeBSD.ORG Wed Aug 30 11:42:35 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 7563C16A4E6; Wed, 30 Aug 2006 11:42:35 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 3915516A4DD for ; Wed, 30 Aug 2006 11:42:35 +0000 (UTC) (envelope-from piso@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id CEDA743D58 for ; Wed, 30 Aug 2006 11:42:34 +0000 (GMT) (envelope-from piso@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k7UBgYNW060880 for ; Wed, 30 Aug 2006 11:42:34 GMT (envelope-from piso@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k7UBgYx7060877 for perforce@freebsd.org; Wed, 30 Aug 2006 11:42:34 GMT (envelope-from piso@freebsd.org) Date: Wed, 30 Aug 2006 11:42:34 GMT Message-Id: <200608301142.k7UBgYx7060877@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to piso@freebsd.org using -f From: Paolo Pisati To: Perforce Change Reviews Cc: Subject: PERFORCE change 105322 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 30 Aug 2006 11:42:35 -0000 http://perforce.freebsd.org/chv.cgi?CH=105322 Change 105322 by piso@piso_newluxor on 2006/08/30 11:42:29 Move the nat rwlock outside of nat_chain (in preparation of turning all the lists data structs into LIST macro). Affected files ... .. //depot/projects/soc2005/libalias/sys/netinet/ip_fw2.c#8 edit Differences ... ==== //depot/projects/soc2005/libalias/sys/netinet/ip_fw2.c#8 (text+ko) ==== @@ -301,23 +301,23 @@ MODULE_DEPEND(ipfw, libalias, 1, 1, 1); +struct rwlock nat_chain_rwl; struct _nat_chain { - struct cfg_nat *chain; - struct rwlock rwl; + struct cfg_nat *chain; } nat_chain; #define NAT_LOCK_INIT(_chain) \ - rw_init(&(_chain)->rwl, "NAT instances") -#define NAT_LOCK_DESTROY(_chain) rw_destroy(&(_chain)->rwl) + rw_init(_chain, "NAT instances") +#define NAT_LOCK_DESTROY(_chain) rw_destroy(_chain) #define NAT_WLOCK_ASSERT(_chain) do { \ - rw_assert(&(_chain)->rwl, RA_WLOCKED); \ + rw_assert(_chain, RA_WLOCKED); \ NET_ASSERT_GIANT(); \ } while (0) -#define NAT_RLOCK(p) rw_rlock(&(p)->rwl) -#define NAT_RUNLOCK(p) rw_runlock(&(p)->rwl) -#define NAT_WLOCK(p) rw_wlock(&(p)->rwl) -#define NAT_WUNLOCK(p) rw_wunlock(&(p)->rwl) +#define NAT_RLOCK(p) rw_rlock(p) +#define NAT_RUNLOCK(p) rw_runlock(p) +#define NAT_WLOCK(p) rw_wlock(p) +#define NAT_WUNLOCK(p) rw_wunlock(p) static eventhandler_tag ifaddr_event_tag; @@ -2077,19 +2077,19 @@ static void unhook_entry(struct _chain **b, struct _chain *p) { - NAT_WLOCK_ASSERT(&nat_chain); + NAT_WLOCK_ASSERT(&nat_chain_rwl); for(; *b != p; b = &((*b)->next)) ; *b = p->next; } #define HOOK_NAT(b, p) do { \ - NAT_WLOCK_ASSERT(&nat_chain); \ + NAT_WLOCK_ASSERT(&nat_chain_rwl); \ hook_entry((struct _chain **)b, (struct _chain *)p); \ } while (0) #define UNHOOK_NAT(b, p) do { \ - NAT_WLOCK_ASSERT(&nat_chain); \ + NAT_WLOCK_ASSERT(&nat_chain_rwl); \ unhook_entry((struct _chain **)b, (struct _chain *)p); \ } while (0) @@ -3448,7 +3448,7 @@ retval = 0; t = ((ipfw_insn_nat *)cmd)->nat; if (t == NULL) { - NAT_RLOCK(&nat_chain); + NAT_RLOCK(&nat_chain_rwl); t = lookup_nat(cmd->arg1); if (t == NULL) { retval = IP_FW_DENY; @@ -3582,7 +3582,7 @@ args->m = mcl; retval = IP_FW_NAT; - NAT_RUNLOCK(&nat_chain); + NAT_RUNLOCK(&nat_chain_rwl); goto done; } @@ -4317,7 +4317,7 @@ struct cfg_nat *ptr; struct ifaddr *ifa; - NAT_WLOCK(&nat_chain); + NAT_WLOCK(&nat_chain_rwl); /* Check every nat entry... */ for (ptr = nat_chain.chain; ptr; ptr = ptr->next) { /* ...using nic 'ifp->if_xname' as dynamic alias address. */ @@ -4335,7 +4335,7 @@ mtx_unlock(&ifp->if_addr_mtx); } } - NAT_WUNLOCK(&nat_chain); + NAT_WUNLOCK(&nat_chain_rwl); } /** @@ -4576,28 +4576,28 @@ /* * Find/create nat rule. */ - NAT_WLOCK(&nat_chain); + NAT_WLOCK(&nat_chain_rwl); ptr = lookup_nat(ser_n->id); if (ptr == NULL) { /* New rule: allocate and init new instance. */ ptr = malloc(sizeof(struct cfg_nat), M_IPFW, M_NOWAIT | M_ZERO); if (ptr == NULL) { free(buf, M_IPFW); - NAT_WUNLOCK(&nat_chain); + NAT_WUNLOCK(&nat_chain_rwl); return (ENOSPC); } ptr->lib = LibAliasInit(NULL); if (ptr->lib == NULL) { free(ptr, M_IPFW); free(buf, M_IPFW); - NAT_WUNLOCK(&nat_chain); + NAT_WUNLOCK(&nat_chain_rwl); return(EINVAL); } } else { /* Entry already present: temporarly unhook it. */ UNHOOK_NAT(&nat_chain.chain, ptr); flush_nat_ptrs(ser_n->id); } - NAT_WUNLOCK(&nat_chain); + NAT_WUNLOCK(&nat_chain_rwl); /* * Basic nat configuration. @@ -4622,9 +4622,9 @@ ptr); /* Add new entries. */ free(buf, M_IPFW); if (err == 1) { - NAT_WLOCK(&nat_chain); + NAT_WLOCK(&nat_chain_rwl); HOOK_NAT(&nat_chain.chain, ptr); - NAT_WUNLOCK(&nat_chain); + NAT_WUNLOCK(&nat_chain_rwl); } else /* Something bad happened, redir cfg not added. */ return(EINVAL); } @@ -4636,15 +4636,15 @@ int i; error = sooptcopyin(sopt, &i, sizeof i, sizeof i); - NAT_WLOCK(&nat_chain); + NAT_WLOCK(&nat_chain_rwl); ptr = lookup_nat(i); if (ptr == NULL) { error = EINVAL; - NAT_WUNLOCK(&nat_chain); + NAT_WUNLOCK(&nat_chain_rwl); break; } UNHOOK_NAT(&nat_chain.chain, ptr); - NAT_WUNLOCK(&nat_chain); + NAT_WUNLOCK(&nat_chain_rwl); flush_nat_ptrs(i); del_redir_spool_cfg(ptr, ptr->redir_chain); LibAliasUninit(ptr->lib); @@ -4666,7 +4666,7 @@ data = malloc(NAT_BUF_LEN, M_IPFW, M_NOWAIT | M_ZERO); if (data == NULL) return (ENOSPC); - NAT_RLOCK(&nat_chain); + NAT_RLOCK(&nat_chain_rwl); /* Serialize all the data. */ for (n = nat_chain.chain; (n && (off + sof_nat < NAT_BUF_LEN)); n = n->next) { @@ -4683,7 +4683,7 @@ } } } - NAT_RUNLOCK(&nat_chain); + NAT_RUNLOCK(&nat_chain_rwl); error = sooptcopyout(sopt, data, NAT_BUF_LEN); free(data, M_IPFW); @@ -4697,7 +4697,7 @@ int sof = LIBALIAS_BUF_SIZE; int i, size, cnt = 0; - NAT_RLOCK(&nat_chain); + NAT_RLOCK(&nat_chain_rwl); for (ptr = nat_chain.chain, size = i = 0; ptr; ptr = ptr->next) { if (ptr->lib->logDesc == NULL) continue; @@ -4711,7 +4711,7 @@ bcopy(ptr->lib->logDesc, &data[i], sof); i += sof; } - NAT_RUNLOCK(&nat_chain); + NAT_RUNLOCK(&nat_chain_rwl); error = sooptcopyout(sopt, data, size); free(data, M_IPFW); } @@ -4890,7 +4890,7 @@ ip_fw_chk_ptr = ipfw_chk; callout_reset(&ipfw_timeout, hz, ipfw_tick, NULL); nat_chain.chain = NULL; - NAT_LOCK_INIT(&nat_chain); + NAT_LOCK_INIT(&nat_chain_rwl); ifaddr_event_tag = EVENTHANDLER_REGISTER(ifaddr_event, ifaddr_change, NULL, EVENTHANDLER_PRI_ANY); return (0); @@ -4907,16 +4907,16 @@ callout_drain(&ipfw_timeout); IPFW_WLOCK(&layer3_chain); flush_tables(&layer3_chain); - NAT_WLOCK(&nat_chain); + NAT_WLOCK(&nat_chain_rwl); for (ptr = nat_chain.chain; ptr; ptr = ptr_temp) { ptr_temp = ptr->next; del_redir_spool_cfg(ptr, ptr->redir_chain); LibAliasUninit(ptr->lib); free(ptr, M_IPFW); } - NAT_WUNLOCK(&nat_chain); + NAT_WUNLOCK(&nat_chain_rwl); EVENTHANDLER_DEREGISTER(ifaddr_event, ifaddr_event_tag); - NAT_LOCK_DESTROY(&nat_chain); + NAT_LOCK_DESTROY(&nat_chain_rwl); layer3_chain.reap = NULL; free_chain(&layer3_chain, 1 /* kill default rule */); reap = layer3_chain.reap, layer3_chain.reap = NULL;