Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 1 Aug 2014 07:35:18 +0000 (UTC)
From:      "Alexander V. Chernikov" <melifaro@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r269370 - projects/ipfw/sys/netpfil/ipfw
Message-ID:  <201408010735.s717ZI0T030495@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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,



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