Date: Fri, 25 May 2012 14:49:51 +0000 (UTC) From: Gleb Smirnoff <glebius@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r235993 - projects/pf/head/sys/contrib/pf/net Message-ID: <201205251449.q4PEnpYd016118@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: glebius Date: Fri May 25 14:49:51 2012 New Revision: 235993 URL: http://svn.freebsd.org/changeset/base/235993 Log: - Stop referencing tag names by states. Not a big deal if tag name disappears. - Make tag code more private to pf_ioctl.c Modified: projects/pf/head/sys/contrib/pf/net/pf.c projects/pf/head/sys/contrib/pf/net/pf_ioctl.c projects/pf/head/sys/contrib/pf/net/pfvar.h Modified: projects/pf/head/sys/contrib/pf/net/pf.c ============================================================================== --- projects/pf/head/sys/contrib/pf/net/pf.c Fri May 25 14:40:56 2012 (r235992) +++ projects/pf/head/sys/contrib/pf/net/pf.c Fri May 25 14:49:51 2012 (r235993) @@ -1472,8 +1472,6 @@ pf_free_state(struct pf_state *cur) if (cur->anchor.ptr != NULL) --cur->anchor.ptr->states_cur; pf_normalize_tcp_cleanup(cur); - if (cur->tag) - pf_tag_unref(cur->tag); uma_zfree(V_pf_state_z, cur); V_pf_status.fcounters[FCNT_STATE_REMOVALS]++; V_pf_status.states--; @@ -3446,10 +3444,8 @@ pf_create_state(struct pf_rule *r, struc *sm = s; pf_set_rt_ifp(s, pd->src); /* needs s->state_key set */ - if (tag > 0) { - pf_tag_ref(tag); + if (tag > 0) s->tag = tag; - } if (pd->proto == IPPROTO_TCP && (th->th_flags & (TH_SYN|TH_ACK)) == TH_SYN && r->keep_state == PF_STATE_SYNPROXY) { s->src.state = PF_TCPS_PROXY_SRC; Modified: projects/pf/head/sys/contrib/pf/net/pf_ioctl.c ============================================================================== --- projects/pf/head/sys/contrib/pf/net/pf_ioctl.c Fri May 25 14:40:56 2012 (r235992) +++ projects/pf/head/sys/contrib/pf/net/pf_ioctl.c Fri May 25 14:49:51 2012 (r235993) @@ -135,8 +135,6 @@ static int pf_addr_setup(struct pf_rul static void pf_addr_copyout(struct pf_addr_wrap *); static void pf_pkt_addr_changed(struct mbuf *); -#define TAGID_MAX 50000 - VNET_DEFINE(struct pf_rule, pf_default_rule); VNET_DEFINE(struct sx, pf_consistency_lock); #define V_pf_consistency_lock VNET(pf_consistency_lock) @@ -146,13 +144,20 @@ static VNET_DEFINE(int, pf_altq_running #define V_pf_altq_running VNET(pf_altq_running) #endif -TAILQ_HEAD(pf_tags, pf_tagname); +#define TAGID_MAX 50000 +struct pf_tagname { + TAILQ_ENTRY(pf_tagname) entries; + char name[PF_TAG_NAME_SIZE]; + uint16_t tag; + int ref; +}; +TAILQ_HEAD(pf_tags, pf_tagname); #define V_pf_tags VNET(pf_tags) VNET_DEFINE(struct pf_tags, pf_tags); #define V_pf_qids VNET(pf_qids) VNET_DEFINE(struct pf_tags, pf_qids); - +MALLOC_DEFINE(M_PFTAG, "pf tags", "pf tags"); #if (PF_QNAME_SIZE != PF_TAG_NAME_SIZE) #error PF_QNAME_SIZE must be equal to PF_TAG_NAME_SIZE @@ -160,7 +165,7 @@ VNET_DEFINE(struct pf_tags, pf_qids); static u_int16_t tagname2tag(struct pf_tags *, char *); static u_int16_t pf_tagname2tag(char *); -void tag_unref(struct pf_tags *, u_int16_t); +static void tag_unref(struct pf_tags *, u_int16_t); #define DPFPRINTF(n, x) if (V_pf_status.debug >= (n)) printf x @@ -406,8 +411,10 @@ pf_free_rule(struct pf_rule *rule) PF_RULES_WASSERT(); - pf_tag_unref(rule->tag); - pf_tag_unref(rule->match_tag); + if (rule->tag) + tag_unref(&V_pf_tags, rule->tag); + if (rule->match_tag) + tag_unref(&V_pf_tags, rule->match_tag); #ifdef ALTQ if (rule->pqid != rule->qid) pf_qid_unref(rule->pqid); @@ -444,6 +451,8 @@ tagname2tag(struct pf_tags *head, char * struct pf_tagname *tag, *p = NULL; u_int16_t new_tagid = 1; + PF_RULES_WASSERT(); + TAILQ_FOREACH(tag, head, entries) if (strcmp(tagname, tag->name) == 0) { tag->ref++; @@ -466,7 +475,7 @@ tagname2tag(struct pf_tags *head, char * return (0); /* allocate and fill new struct pf_tagname */ - tag = malloc(sizeof(*tag), M_TEMP, M_NOWAIT|M_ZERO); + tag = malloc(sizeof(*tag), M_PFTAG, M_NOWAIT|M_ZERO); if (tag == NULL) return (0); strlcpy(tag->name, tagname, sizeof(tag->name)); @@ -481,20 +490,19 @@ tagname2tag(struct pf_tags *head, char * return (tag->tag); } -void +static void tag_unref(struct pf_tags *head, u_int16_t tag) { struct pf_tagname *p, *next; - if (tag == 0) - return; + PF_RULES_WASSERT(); for (p = TAILQ_FIRST(head); p != NULL; p = next) { next = TAILQ_NEXT(p, entries); if (tag == p->tag) { if (--p->ref == 0) { TAILQ_REMOVE(head, p, entries); - free(p, M_TEMP); + free(p, M_PFTAG); } break; } @@ -507,24 +515,6 @@ pf_tagname2tag(char *tagname) return (tagname2tag(&V_pf_tags, tagname)); } -void -pf_tag_ref(u_int16_t tag) -{ - struct pf_tagname *t; - - TAILQ_FOREACH(t, &V_pf_tags, entries) - if (t->tag == tag) - break; - if (t != NULL) - t->ref++; -} - -void -pf_tag_unref(u_int16_t tag) -{ - tag_unref(&V_pf_tags, tag); -} - #ifdef ALTQ static u_int32_t pf_qname2qid(char *qname) Modified: projects/pf/head/sys/contrib/pf/net/pfvar.h ============================================================================== --- projects/pf/head/sys/contrib/pf/net/pfvar.h Fri May 25 14:40:56 2012 (r235992) +++ projects/pf/head/sys/contrib/pf/net/pfvar.h Fri May 25 14:49:51 2012 (r235993) @@ -1410,13 +1410,6 @@ struct pf_altq { u_int32_t qid; /* return value */ }; -struct pf_tagname { - TAILQ_ENTRY(pf_tagname) entries; - char name[PF_TAG_NAME_SIZE]; - u_int16_t tag; - int ref; -}; - struct pf_divert { union { struct in_addr ipv4; @@ -1931,8 +1924,6 @@ int pfi_clear_flags(const char *, int) int pf_match_tag(struct mbuf *, struct pf_rule *, int *, struct pf_mtag *); -void pf_tag_ref(u_int16_t); -void pf_tag_unref(u_int16_t); int pf_tag_packet(struct mbuf *, int, int, struct pf_mtag *); void pf_qid2qname(u_int32_t, char *);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201205251449.q4PEnpYd016118>