Index: sys/netinet/ip_fw2.c =================================================================== RCS file: /home/ncvs/src/sys/netinet/ip_fw2.c,v retrieving revision 1.70.2.13 diff -u -d -r1.70.2.13 ip_fw2.c --- sys/netinet/ip_fw2.c 17 Jun 2005 23:56:59 -0000 1.70.2.13 +++ sys/netinet/ip_fw2.c 20 Jun 2005 21:31:56 -0000 @@ -185,9 +185,12 @@ }; #define IPFW_TABLES_MAX 128 -static struct { +static struct ip_fw_table { struct radix_node_head *rnh; int modified; + in_addr_t last_addr; + int last_match; + u_int32_t last_value; } ipfw_tables[IPFW_TABLES_MAX]; static int fw_debug = 1; @@ -1491,36 +1494,36 @@ lookup_table(u_int16_t tbl, in_addr_t addr, u_int32_t *val) { struct radix_node_head *rnh; + struct ip_fw_table *table; struct table_entry *ent; struct sockaddr_in sa; - static in_addr_t last_addr; - static int last_tbl; - static int last_match; - static u_int32_t last_value; + int last_match; if (tbl >= IPFW_TABLES_MAX) return (0); - if (tbl == last_tbl && addr == last_addr && - !ipfw_tables[tbl].modified) { + table = &ipfw_tables[tbl]; + rnh = table->rnh; + RADIX_NODE_HEAD_LOCK(rnh); + if (addr == table->last_addr && !table->modified) { + last_match = table->last_match; if (last_match) - *val = last_value; + *val = table->last_value; + RADIX_NODE_HEAD_UNLOCK(rnh); return (last_match); } - rnh = ipfw_tables[tbl].rnh; + table->modified = 0; sa.sin_len = 8; sa.sin_addr.s_addr = addr; - RADIX_NODE_HEAD_LOCK(rnh); - ipfw_tables[tbl].modified = 0; ent = (struct table_entry *)(rnh->rnh_lookup(&sa, NULL, rnh)); - RADIX_NODE_HEAD_UNLOCK(rnh); - last_addr = addr; - last_tbl = tbl; + table->last_addr = addr; if (ent != NULL) { - last_value = *val = ent->value; - last_match = 1; + table->last_value = *val = ent->value; + table->last_match = 1; + RADIX_NODE_HEAD_UNLOCK(rnh); return (1); } - last_match = 0; + table->last_match = 0; + RADIX_NODE_HEAD_UNLOCK(rnh); return (0); }