Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 16 Oct 2006 21:29:29 GMT
From:      Paolo Pisati <piso@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 108000 for review
Message-ID:  <200610162129.k9GLTTAF086207@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=108000

Change 108000 by piso@piso_newluxor on 2006/10/16 21:28:34

	Move nat locking from private nat_chain_rwl to layer3_chain rwl.

Affected files ...

.. //depot/projects/soc2005/libalias/sys/netinet/ip_fw2.c#21 edit

Differences ...

==== //depot/projects/soc2005/libalias/sys/netinet/ip_fw2.c#21 (text+ko) ====

@@ -305,20 +305,11 @@
 
 MODULE_DEPEND(ipfw, libalias, 1, 1, 1);
 
-struct rwlock   nat_chain_rwl; 
-
-#define	NAT_LOCK_INIT(_chain) \
-	rw_init(_chain, "NAT instances")
-#define	NAT_LOCK_DESTROY(_chain)	rw_destroy(_chain)
-#define	NAT_WLOCK_ASSERT(_chain)	do {				\
-	rw_assert(_chain, RA_WLOCKED);					\
-	NET_ASSERT_GIANT();						\
-} while (0)
-
-#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)
+#define	NAT_WLOCK_ASSERT(_chain) IPFW_WLOCK_ASSERT(_chain)
+#define NAT_RLOCK(p) IPFW_RLOCK(p)
+#define NAT_RUNLOCK(p) IPFW_RUNLOCK(p)
+#define NAT_WLOCK(p) IPFW_WLOCK(p)
+#define NAT_WUNLOCK(p) IPFW_WUNLOCK(p)
 
 static eventhandler_tag ifaddr_event_tag;
 
@@ -2073,12 +2064,12 @@
 }
 
 #define HOOK_NAT(b, p) do {                                     \
-	NAT_WLOCK_ASSERT(&nat_chain_rwl);                       \
+	NAT_WLOCK_ASSERT(&layer3_chain);                       \
         LIST_INSERT_HEAD(b, p, _next);                          \
 } while (0)
 
 #define UNHOOK_NAT(p) do {                                      \
-	NAT_WLOCK_ASSERT(&nat_chain_rwl);                       \
+	NAT_WLOCK_ASSERT(&layer3_chain);                       \
         LIST_REMOVE(p, _next);                                  \
 } while (0)
 
@@ -3447,12 +3438,12 @@
 				args->rule = f;	/* Report matching rule. */
 				retval = 0;
 				t = ((ipfw_insn_nat *)cmd)->nat;				
-				NAT_RLOCK(&nat_chain_rwl);
+				NAT_RLOCK(&layer3_chain);
 				if (t == NULL) {
 					t = lookup_nat(cmd->arg1);
 					if (t == NULL) {
 						retval = IP_FW_DENY;
-						NAT_RUNLOCK(&nat_chain_rwl);
+						NAT_RUNLOCK(&layer3_chain);
 						goto done;
 					} else 
 						((ipfw_insn_nat *)cmd)->nat = t;					
@@ -3518,7 +3509,7 @@
 					/* XXX - should i add some logging? */
 					m_free(mcl);
 				badnat:
-					NAT_RUNLOCK(&nat_chain_rwl);
+					NAT_RUNLOCK(&layer3_chain);
 					args->m = NULL;
 					retval = IP_FW_DENY;
 					goto done;
@@ -3584,7 +3575,7 @@
 
 				args->m = mcl;
 				retval = IP_FW_NAT; 
-				NAT_RUNLOCK(&nat_chain_rwl);
+				NAT_RUNLOCK(&layer3_chain);
 				goto done;
 			}
 
@@ -4319,7 +4310,7 @@
 	struct cfg_nat *ptr;
 	struct ifaddr *ifa;
 
-	NAT_WLOCK(&nat_chain_rwl);			
+	NAT_WLOCK(&layer3_chain);			
 	/* Check every nat entry... */
 	LIST_FOREACH(ptr, &layer3_chain.nat, _next) {
 		/* ...using nic 'ifp->if_xname' as dynamic alias address. */
@@ -4337,7 +4328,7 @@
 			mtx_unlock(&ifp->if_addr_mtx);
 		}
 	}
-	NAT_WUNLOCK(&nat_chain_rwl);	
+	NAT_WUNLOCK(&layer3_chain);	
 }
 
 /**
@@ -4577,21 +4568,21 @@
 		/* 
 		 * Find/create nat rule.
 		 */
-		NAT_WLOCK(&nat_chain_rwl);
+		NAT_WLOCK(&layer3_chain);
 		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_rwl);				
+				NAT_WUNLOCK(&layer3_chain);				
 				return (ENOSPC);				
 			}
 			ptr->lib = LibAliasInit(NULL);
 			if (ptr->lib == NULL) {		
 				free(ptr, M_IPFW);
 				free(buf, M_IPFW);
-				NAT_WUNLOCK(&nat_chain_rwl);				
+				NAT_WUNLOCK(&layer3_chain);				
 				return(EINVAL);
 			}
 			LIST_INIT(&ptr->redir_chain);
@@ -4599,7 +4590,7 @@
 			UNHOOK_NAT(ptr);
 			flush_nat_ptrs(ser_n->id);						
 		}
-		NAT_WUNLOCK(&nat_chain_rwl);
+		NAT_WUNLOCK(&layer3_chain);
 
 		/* 
 		 * Basic nat configuration.
@@ -4623,9 +4614,9 @@
 		add_redir_spool_cfg(&buf[(sizeof(struct cfg_nat))], 
 				    ptr);                               /* Add new entries. */
 		free(buf, M_IPFW);
-		NAT_WLOCK(&nat_chain_rwl);
+		NAT_WLOCK(&layer3_chain);
 		HOOK_NAT(&layer3_chain.nat, ptr);
-		NAT_WUNLOCK(&nat_chain_rwl);
+		NAT_WUNLOCK(&layer3_chain);
 	}
 	break;
 
@@ -4635,15 +4626,15 @@
 		int i;
 		
 		error = sooptcopyin(sopt, &i, sizeof i, sizeof i);
-		NAT_WLOCK(&nat_chain_rwl);
+		NAT_WLOCK(&layer3_chain);
 		ptr = lookup_nat(i);
 		if (ptr == NULL) {
 			error = EINVAL;
-			NAT_WUNLOCK(&nat_chain_rwl);
+			NAT_WUNLOCK(&layer3_chain);
 			break;
 		}
 		UNHOOK_NAT(ptr);
-		NAT_WUNLOCK(&nat_chain_rwl);
+		NAT_WUNLOCK(&layer3_chain);
 		flush_nat_ptrs(i);
 		del_redir_spool_cfg(ptr, &ptr->redir_chain);
 		LibAliasUninit(ptr->lib);
@@ -4665,7 +4656,7 @@
 		data = malloc(NAT_BUF_LEN, M_IPFW, M_NOWAIT | M_ZERO);
 		if (data == NULL)
 			return (ENOSPC);
-		NAT_RLOCK(&nat_chain_rwl);
+		NAT_RLOCK(&layer3_chain);
 		/* Serialize all the data. */
 		LIST_FOREACH(n, &layer3_chain.nat, _next) {
 			nat_cnt++;
@@ -4690,12 +4681,12 @@
 				goto nospace;
 		}
 		bcopy(&nat_cnt, data, sizeof(nat_cnt));
-		NAT_RUNLOCK(&nat_chain_rwl);
+		NAT_RUNLOCK(&layer3_chain);
 		error = sooptcopyout(sopt, data, NAT_BUF_LEN);
 		free(data, M_IPFW);
 		break;
 	nospace:
-		NAT_RUNLOCK(&nat_chain_rwl);
+		NAT_RUNLOCK(&layer3_chain);
 		printf("serialized data buffer not big enough: please increase NAT_BUF_LEN\n");
 		free(data, M_IPFW);
 	}
@@ -4708,7 +4699,7 @@
 		int sof = LIBALIAS_BUF_SIZE;
 		int i, size, cnt = 0;
 
-		NAT_RLOCK(&nat_chain_rwl);
+		NAT_RLOCK(&layer3_chain);
 		size = i = 0;
 		LIST_FOREACH(ptr, &layer3_chain.nat, _next) {
 			if (ptr->lib->logDesc == NULL) 
@@ -4717,7 +4708,7 @@
 			size = cnt * (sof + sizeof(int));
 			data = realloc(data, size, M_IPFW, M_NOWAIT | M_ZERO);
 			if (data == NULL) {
-				NAT_RUNLOCK(&nat_chain_rwl);
+				NAT_RUNLOCK(&layer3_chain);
 				return (ENOSPC);
 			}
 			bcopy(&ptr->id, &data[i], sizeof(int));
@@ -4725,7 +4716,7 @@
 			bcopy(ptr->lib->logDesc, &data[i], sof);
 			i += sof;
 		}
-		NAT_RUNLOCK(&nat_chain_rwl);
+		NAT_RUNLOCK(&layer3_chain);
 		error = sooptcopyout(sopt, data, size);
 		free(data, M_IPFW);
 	}
@@ -4904,7 +4895,6 @@
 	ip_fw_chk_ptr = ipfw_chk;
 	callout_reset(&ipfw_timeout, hz, ipfw_tick, NULL);	
 	LIST_INIT(&layer3_chain.nat);
-	NAT_LOCK_INIT(&nat_chain_rwl);
 	ifaddr_event_tag = EVENTHANDLER_REGISTER(ifaddr_event, ifaddr_change, 
 					 NULL, EVENTHANDLER_PRI_ANY);
 	return (0);
@@ -4921,16 +4911,15 @@
 	callout_drain(&ipfw_timeout);
 	IPFW_WLOCK(&layer3_chain);
 	flush_tables(&layer3_chain);
-	NAT_WLOCK(&nat_chain_rwl);
+	NAT_WLOCK(&layer3_chain);
 	LIST_FOREACH_SAFE(ptr, &layer3_chain.nat, _next, ptr_temp) {
 		LIST_REMOVE(ptr, _next);
 		del_redir_spool_cfg(ptr, &ptr->redir_chain);
 		LibAliasUninit(ptr->lib);
 		free(ptr, M_IPFW);
 	}
-	NAT_WUNLOCK(&nat_chain_rwl);
+	NAT_WUNLOCK(&layer3_chain);
 	EVENTHANDLER_DEREGISTER(ifaddr_event, ifaddr_event_tag);
-	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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200610162129.k9GLTTAF086207>