Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 8 Aug 2014 06:36:26 +0000 (UTC)
From:      Alexander V. Chernikov <melifaro@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r269704 - in projects/ipfw: sbin/ipfw sys/netinet sys/netpfil/ipfw
Message-ID:  <53e46feb.20ae.3a588865@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: melifaro
Date: Fri Aug  8 06:36:26 2014
New Revision: 269704
URL: http://svnweb.freebsd.org/changeset/base/269704

Log:
  Remove IP_FW_TABLES_XGETSIZE opcode.
  It is superseded by IP_FW_TABLES_XLIST.

Modified:
  projects/ipfw/sbin/ipfw/tables.c
  projects/ipfw/sys/netinet/ip_fw.h
  projects/ipfw/sys/netpfil/ipfw/ip_fw_sockopt.c
  projects/ipfw/sys/netpfil/ipfw/ip_fw_table.c
  projects/ipfw/sys/netpfil/ipfw/ip_fw_table.h

Modified: projects/ipfw/sbin/ipfw/tables.c
==============================================================================
--- projects/ipfw/sbin/ipfw/tables.c	Fri Aug  8 06:30:17 2014	(r269703)
+++ projects/ipfw/sbin/ipfw/tables.c	Fri Aug  8 06:36:26 2014	(r269704)
@@ -1147,41 +1147,46 @@ tablename_cmp(const void *a, const void 
 static int
 tables_foreach(table_cb_t *f, void *arg, int sort)
 {
-	ipfw_obj_lheader req, *olh;
+	ipfw_obj_lheader *olh;
 	ipfw_xtable_info *info;
 	size_t sz;
 	int i, error;
 
-	memset(&req, 0, sizeof(req));
-	sz = sizeof(req);
-
-	if ((error = do_get3(IP_FW_TABLES_XGETSIZE, &req.opheader, &sz)) != 0)
-		return (errno);
+	/* Start with reasonable default */
+	sz = sizeof(*olh) + 16 * sizeof(ipfw_xtable_info);
 
-	sz = req.size;
-	if ((olh = calloc(1, sz)) == NULL)
-		return (ENOMEM);
+	for (;;) {
+		if ((olh = calloc(1, sz)) == NULL)
+			return (ENOMEM);
+
+		olh->size = sz;
+		error = do_get3(IP_FW_TABLES_XLIST, &olh->opheader, &sz);
+		if (error == ENOMEM) {
+			sz = olh->size;
+			free(olh);
+			continue;
+		} else if (error != 0) {
+			free(olh);
+			return (error);
+		}
 
-	olh->size = sz;
-	if ((error = do_get3(IP_FW_TABLES_XLIST, &olh->opheader, &sz)) != 0) {
-		free(olh);
-		return (errno);
-	}
+		if (sort != 0)
+			qsort(olh + 1, olh->count, olh->objsize, tablename_cmp);
 
-	if (sort != 0)
-		qsort(olh + 1, olh->count, olh->objsize, tablename_cmp);
+		info = (ipfw_xtable_info *)(olh + 1);
+		for (i = 0; i < olh->count; i++) {
+			error = f(info, arg); /* Ignore errors for now */
+			info = (ipfw_xtable_info *)((caddr_t)info + olh->objsize);
+		}
 
-	info = (ipfw_xtable_info *)(olh + 1);
-	for (i = 0; i < olh->count; i++) {
-		error = f(info, arg); /* Ignore errors for now */
-		info = (ipfw_xtable_info *)((caddr_t)info + olh->objsize);
+		free(olh);
+		break;
 	}
 
-	free(olh);
-
 	return (0);
 }
 
+
 /*
  * Retrieves all entries for given table @i in
  * eXtended format. Assumes buffer of size

Modified: projects/ipfw/sys/netinet/ip_fw.h
==============================================================================
--- projects/ipfw/sys/netinet/ip_fw.h	Fri Aug  8 06:30:17 2014	(r269703)
+++ projects/ipfw/sys/netinet/ip_fw.h	Fri Aug  8 06:36:26 2014	(r269704)
@@ -79,7 +79,6 @@ typedef struct _ip_fw3_opheader {
 #define	IP_FW_TABLE_XGETSIZE	88	/* get table size (deprecated) */
 #define	IP_FW_TABLE_XLIST	89	/* list table contents */
 #define	IP_FW_TABLE_XDESTROY	90	/* destroy table */
-#define	IP_FW_TABLES_XGETSIZE	91	/* get size for tables list */
 #define	IP_FW_TABLES_XLIST	92	/* list all tables  */
 #define	IP_FW_TABLE_XINFO	93	/* request info for one table */
 #define	IP_FW_TABLE_XFLUSH	94	/* flush table data */

Modified: projects/ipfw/sys/netpfil/ipfw/ip_fw_sockopt.c
==============================================================================
--- projects/ipfw/sys/netpfil/ipfw/ip_fw_sockopt.c	Fri Aug  8 06:30:17 2014	(r269703)
+++ projects/ipfw/sys/netpfil/ipfw/ip_fw_sockopt.c	Fri Aug  8 06:36:26 2014	(r269704)
@@ -2325,10 +2325,6 @@ ipfw_ctl3(struct sockopt *sopt)
 		error = ipfw_describe_table(chain, &sdata);
 		break;
 
-	case IP_FW_TABLES_XGETSIZE:
-		error = ipfw_listsize_tables(chain, &sdata);
-		break;
-
 	case IP_FW_TABLES_XLIST:
 		error = ipfw_list_tables(chain, &sdata);
 		break;

Modified: projects/ipfw/sys/netpfil/ipfw/ip_fw_table.c
==============================================================================
--- projects/ipfw/sys/netpfil/ipfw/ip_fw_table.c	Fri Aug  8 06:30:17 2014	(r269703)
+++ projects/ipfw/sys/netpfil/ipfw/ip_fw_table.c	Fri Aug  8 06:36:26 2014	(r269704)
@@ -1115,32 +1115,6 @@ ipfw_lookup_table_extended(struct ip_fw_
  */
 
 /*
- * Get buffer size needed to list info for all tables.
- * Data layout (v0)(current):
- * Request: [ empty ], size = sizeof(ipfw_obj_lheader)
- * Reply: [ ipfw_obj_lheader ]
- *
- * Returns 0 on success
- */
-int
-ipfw_listsize_tables(struct ip_fw_chain *ch, struct sockopt_data *sd)
-{
-	struct _ipfw_obj_lheader *olh;
-
-	olh = (struct _ipfw_obj_lheader *)ipfw_get_sopt_header(sd,sizeof(*olh));
-	if (olh == NULL)
-		return (EINVAL);
-
-	olh->size = sizeof(*olh); /* Make export_table store needed size */
-
-	IPFW_UH_RLOCK(ch);
-	export_tables(ch, olh, sd);
-	IPFW_UH_RUNLOCK(ch);
-
-	return (0);
-}
-
-/*
  * Lists all tables currently available in kernel.
  * Data layout (v0)(current):
  * Request: [ ipfw_obj_lheader ], size = ipfw_obj_lheader.size
@@ -1570,6 +1544,9 @@ export_table_internal(struct namedobj_in
 /*
  * Export all tables as ipfw_xtable_info structures to
  * storage provided by @sd.
+ *
+ * If supplied buffer is too small, fills in required size
+ * and returns ENOMEM.
  * Returns 0 on success.
  */
 static int

Modified: projects/ipfw/sys/netpfil/ipfw/ip_fw_table.h
==============================================================================
--- projects/ipfw/sys/netpfil/ipfw/ip_fw_table.h	Fri Aug  8 06:30:17 2014	(r269703)
+++ projects/ipfw/sys/netpfil/ipfw/ip_fw_table.h	Fri Aug  8 06:36:26 2014	(r269704)
@@ -137,7 +137,6 @@ void ipfw_table_algo_destroy(struct ip_f
 
 
 /* direct ipfw_ctl handlers */
-int ipfw_listsize_tables(struct ip_fw_chain *ch, struct sockopt_data *sd);
 int ipfw_list_tables(struct ip_fw_chain *ch, struct sockopt_data *sd);
 int ipfw_dump_table(struct ip_fw_chain *ch, ip_fw3_opheader *op3,
     struct sockopt_data *sd);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?53e46feb.20ae.3a588865>