Date: Fri, 25 May 2012 17:49:20 +0200 From: =?ISO-8859-1?Q?Ermal_Lu=E7i?= <eri@freebsd.org> To: Gleb Smirnoff <glebius@freebsd.org> Cc: svn-src-projects@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r235993 - projects/pf/head/sys/contrib/pf/net Message-ID: <CAPBZQG1cUd83p76Hy6qeyGfqZ-pqUiUPWAGw1=atnQrkGdTcyw@mail.gmail.com> In-Reply-To: <201205251449.q4PEnpYd016118@svn.freebsd.org> References: <201205251449.q4PEnpYd016118@svn.freebsd.org>
index | next in thread | previous in thread | raw e-mail
I am not sure you understand the implications here and previous commit. But word CONSISTENCY and wrong behviour is the first to look after. On Fri, May 25, 2012 at 4:49 PM, Gleb Smirnoff <glebius@freebsd.org> wrote: > 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 *); > -- Ermalhelp
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAPBZQG1cUd83p76Hy6qeyGfqZ-pqUiUPWAGw1=atnQrkGdTcyw>
