svn commit: r269704 - in projects/ipfw: sbin/ipfw sys/netinet sys/netpfil/ipfw
Alexander V. Chernikov
melifaro at FreeBSD.org
Fri Aug 8 06:36:28 UTC 2014
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);
More information about the svn-src-projects
mailing list