From owner-svn-src-projects@FreeBSD.ORG Fri Aug 1 07:35:19 2014 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 0CF184EE; Fri, 1 Aug 2014 07:35:19 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id E21552570; Fri, 1 Aug 2014 07:35:18 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id s717ZIhi030499; Fri, 1 Aug 2014 07:35:18 GMT (envelope-from melifaro@svn.freebsd.org) Received: (from melifaro@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id s717ZI0T030495; Fri, 1 Aug 2014 07:35:18 GMT (envelope-from melifaro@svn.freebsd.org) Message-Id: <201408010735.s717ZI0T030495@svn.freebsd.org> From: "Alexander V. Chernikov" Date: Fri, 1 Aug 2014 07:35:18 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r269370 - projects/ipfw/sys/netpfil/ipfw X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 01 Aug 2014 07:35:19 -0000 Author: melifaro Date: Fri Aug 1 07:35:17 2014 New Revision: 269370 URL: http://svnweb.freebsd.org/changeset/base/269370 Log: * Use TA_FLAG_DEFAULT for default algorithm selection instead of exporting algorithm structures directly. * Pass needed state buffer size in algo structures as preparation for tables add/del requests batching. Modified: projects/ipfw/sys/netpfil/ipfw/ip_fw_table.c projects/ipfw/sys/netpfil/ipfw/ip_fw_table.h projects/ipfw/sys/netpfil/ipfw/ip_fw_table_algo.c Modified: projects/ipfw/sys/netpfil/ipfw/ip_fw_table.c ============================================================================== --- projects/ipfw/sys/netpfil/ipfw/ip_fw_table.c Fri Aug 1 06:20:25 2014 (r269369) +++ projects/ipfw/sys/netpfil/ipfw/ip_fw_table.c Fri Aug 1 07:35:17 2014 (r269370) @@ -91,6 +91,7 @@ struct tables_config { struct namedobj_instance *namehash; int algo_count; struct table_algo *algo[256]; + struct table_algo *def_algo[IPFW_TABLE_MAXTYPE + 1]; }; static struct table_config *find_table(struct namedobj_instance *ni, @@ -1544,6 +1545,9 @@ find_table_algo(struct tables_config *tc int i, l; struct table_algo *ta; + if (ti->type > IPFW_TABLE_MAXTYPE) + return (NULL); + /* Search by index */ if (ti->atype != 0) { if (ti->atype > tcfg->algo_count) @@ -1575,19 +1579,8 @@ find_table_algo(struct tables_config *tc return (NULL); } - /* Search by type */ - switch (ti->type) { - case IPFW_TABLE_CIDR: - return (&cidr_radix); - case IPFW_TABLE_INTERFACE: - return (&iface_idx); - case IPFW_TABLE_NUMBER: - return (&number_array); - case IPFW_TABLE_FLOW: - return (&flow_hash); - } - - return (NULL); + /* Return default algorithm for given type if set */ + return (tcfg->def_algo[ti->type]); } int @@ -1600,6 +1593,8 @@ ipfw_add_table_algo(struct ip_fw_chain * if (size > sizeof(struct table_algo)) return (EINVAL); + KASSERT(ta->type >= IPFW_TABLE_MAXTYPE,("Increase IPFW_TABLE_MAXTYPE")); + ta_new = malloc(sizeof(struct table_algo), M_IPFW, M_WAITOK | M_ZERO); memcpy(ta_new, ta, size); @@ -1610,6 +1605,11 @@ ipfw_add_table_algo(struct ip_fw_chain * tcfg->algo[++tcfg->algo_count] = ta_new; ta_new->idx = tcfg->algo_count; + /* Set algorithm as default one for given type */ + if ((ta_new->flags & TA_FLAG_DEFAULT) != 0 && + tcfg->def_algo[ta_new->type] == NULL) + tcfg->def_algo[ta_new->type] = ta_new; + *idx = ta_new->idx; return (0); @@ -1628,6 +1628,10 @@ ipfw_del_table_algo(struct ip_fw_chain * ta = tcfg->algo[idx]; KASSERT(ta != NULL, ("algo idx %d is NULL", idx)); + + if (tcfg->def_algo[ta->type] == ta) + tcfg->def_algo[ta->type] = NULL; + free(ta, M_IPFW); } Modified: projects/ipfw/sys/netpfil/ipfw/ip_fw_table.h ============================================================================== --- projects/ipfw/sys/netpfil/ipfw/ip_fw_table.h Fri Aug 1 06:20:25 2014 (r269369) +++ projects/ipfw/sys/netpfil/ipfw/ip_fw_table.h Fri Aug 1 07:35:17 2014 (r269370) @@ -99,10 +99,11 @@ typedef int ta_dump_tinfo(void *ta_state struct table_algo { char name[16]; - int idx; - int type; - int refcnt; - int spare; + uint32_t idx; + uint32_t type; + uint32_t refcnt; + uint32_t flags; + size_t ta_buf_size; ta_init *init; ta_destroy *destroy; ta_prepare_add *prepare_add; @@ -121,13 +122,12 @@ struct table_algo { ta_print_config *print_config; ta_dump_tinfo *dump_tinfo; }; +#define TA_FLAG_DEFAULT 0x01 /* Algorithm is default for given type */ int ipfw_add_table_algo(struct ip_fw_chain *ch, struct table_algo *ta, size_t size, int *idx); void ipfw_del_table_algo(struct ip_fw_chain *ch, int idx); -extern struct table_algo cidr_radix, iface_idx, number_array, flow_hash; - void ipfw_table_algo_init(struct ip_fw_chain *chain); void ipfw_table_algo_destroy(struct ip_fw_chain *chain); Modified: projects/ipfw/sys/netpfil/ipfw/ip_fw_table_algo.c ============================================================================== --- projects/ipfw/sys/netpfil/ipfw/ip_fw_table_algo.c Fri Aug 1 06:20:25 2014 (r269369) +++ projects/ipfw/sys/netpfil/ipfw/ip_fw_table_algo.c Fri Aug 1 07:35:17 2014 (r269370) @@ -517,6 +517,8 @@ ta_flush_cidr_entry(struct ip_fw_chain * struct table_algo cidr_radix = { .name = "cidr:radix", .type = IPFW_TABLE_CIDR, + .flags = TA_FLAG_DEFAULT, + .ta_buf_size = sizeof(struct ta_buf_cidr), .init = ta_init_radix, .destroy = ta_destroy_radix, .prepare_add = ta_prepare_add_cidr, @@ -1364,6 +1366,7 @@ ta_flush_mod_chash(void *ta_buf) struct table_algo cidr_hash = { .name = "cidr:hash", .type = IPFW_TABLE_CIDR, + .ta_buf_size = sizeof(struct ta_buf_chash), .init = ta_init_chash, .destroy = ta_destroy_chash, .prepare_add = ta_prepare_add_chash, @@ -2021,6 +2024,8 @@ ta_foreach_ifidx(void *ta_state, struct struct table_algo iface_idx = { .name = "iface:array", .type = IPFW_TABLE_INTERFACE, + .flags = TA_FLAG_DEFAULT, + .ta_buf_size = sizeof(struct ta_buf_ifidx), .init = ta_init_ifidx, .destroy = ta_destroy_ifidx, .prepare_add = ta_prepare_add_ifidx, @@ -2384,6 +2389,7 @@ ta_foreach_numarray(void *ta_state, stru struct table_algo number_array = { .name = "number:array", .type = IPFW_TABLE_NUMBER, + .ta_buf_size = sizeof(struct ta_buf_numarray), .init = ta_init_numarray, .destroy = ta_destroy_numarray, .prepare_add = ta_prepare_add_numarray, @@ -3051,6 +3057,8 @@ ta_flush_mod_fhash(void *ta_buf) struct table_algo flow_hash = { .name = "flow:hash", .type = IPFW_TABLE_FLOW, + .flags = TA_FLAG_DEFAULT, + .ta_buf_size = sizeof(struct ta_buf_fhash), .init = ta_init_fhash, .destroy = ta_destroy_fhash, .prepare_add = ta_prepare_add_fhash,