svn commit: r202122 - user/luigi/ipfw3-head/sbin/ipfw

Luigi Rizzo luigi at FreeBSD.org
Mon Jan 11 22:31:48 UTC 2010


Author: luigi
Date: Mon Jan 11 22:31:47 2010
New Revision: 202122
URL: http://svn.freebsd.org/changeset/base/202122

Log:
  start implementing commands with the new IP_DUMMYNET3 sockopt

Modified:
  user/luigi/ipfw3-head/sbin/ipfw/dummynet.c
  user/luigi/ipfw3-head/sbin/ipfw/ipfw2.c
  user/luigi/ipfw3-head/sbin/ipfw/ipfw2.h

Modified: user/luigi/ipfw3-head/sbin/ipfw/dummynet.c
==============================================================================
--- user/luigi/ipfw3-head/sbin/ipfw/dummynet.c	Mon Jan 11 22:28:40 2010	(r202121)
+++ user/luigi/ipfw3-head/sbin/ipfw/dummynet.c	Mon Jan 11 22:31:47 2010	(r202122)
@@ -1184,7 +1184,7 @@ end_mask:
 		*p2 = *p;
 		p2->pipe_nr = i;
 	}
-	i = do_cmd(IP_DUMMYNET_CONFIGURE, base,
+	i = do_cmd(IP_DUMMYNET3, base,
 		(char *)buf - (char *)base);
 
 	if (i)
@@ -1192,9 +1192,18 @@ end_mask:
 }
 
 void
+dummynet_flush(void)
+{
+	struct dn_id oid;
+	oid.type = DN_CMD_FLUSH;
+	oid.len = sizeof(oid);
+	do_cmd(IP_DUMMYNET3, &oid, sizeof(oid));
+}
+
+void
 dummynet_list(int ac, char *av[], int show_counters)
 {
-	struct dn_id oid , *x;
+	struct dn_id oid, *x;
 	int ret, l = sizeof(oid);
 
 	oid.type = DN_CMD_GET;
@@ -1208,7 +1217,7 @@ dummynet_list(int ac, char *av[], int sh
 		oid.subtype = DN_FS;	/* list queue */
 		break;
 	}
-	ret = do_cmd(IP_DUMMYNET_GET, &oid, (uintptr_t)&l);
+	ret = do_cmd(-IP_DUMMYNET3, &oid, (uintptr_t)&l);
 	printf("%s returns %d need %d\n", __FUNCTION__, ret, oid.id);
 	if (ret != 0 || oid.id <= sizeof(oid))
 		return;
@@ -1218,7 +1227,7 @@ dummynet_list(int ac, char *av[], int sh
 		err(1, "no memory in %s", __FUNCTION__);
 	}
 	*x = oid;
-	ret = do_cmd(IP_DUMMYNET_GET, x, (uintptr_t)&l);
+	ret = do_cmd(-IP_DUMMYNET3, x, (uintptr_t)&l);
 	printf("%s returns %d need %d\n", __FUNCTION__, ret, oid.id);
 	list_pipes(x, O_NEXT(x, l), NULL);
 	free(x);

Modified: user/luigi/ipfw3-head/sbin/ipfw/ipfw2.c
==============================================================================
--- user/luigi/ipfw3-head/sbin/ipfw/ipfw2.c	Mon Jan 11 22:28:40 2010	(r202121)
+++ user/luigi/ipfw3-head/sbin/ipfw/ipfw2.c	Mon Jan 11 22:31:47 2010	(r202122)
@@ -353,6 +353,7 @@ safe_realloc(void *ptr, size_t size)
 
 /*
  * conditionally runs the command.
+ * Selected options or negative -> getsockopt
  */
 int
 do_cmd(int optname, void *optval, uintptr_t optlen)
@@ -372,11 +373,15 @@ do_cmd(int optname, void *optval, uintpt
 	    optname == IP_FW_ADD || optname == IP_FW_TABLE_LIST ||
 	    optname == IP_FW_TABLE_GETSIZE || 
 	    optname == IP_FW_NAT_GET_CONFIG || 
-	    optname == IP_FW_NAT_GET_LOG)
+	    optname < 0 ||
+	    optname == IP_FW_NAT_GET_LOG) {
+		if (optname < 0)
+			optname = -optname;
 		i = getsockopt(s, IPPROTO_IP, optname, optval,
 			(socklen_t *)optlen);
-	else
+	} else {
 		i = setsockopt(s, IPPROTO_IP, optname, optval, optlen);
+	}
 	return i;
 }
 
@@ -3697,6 +3702,10 @@ ipfw_flush(int force)
 		if (c == 'N')	/* user said no */
 			return;
 	}
+	if (co.do_pipe) {
+		dummynet_flush();
+		return;
+	}
 	/* `ipfw set N flush` - is the same that `ipfw delete set N` */
 	if (co.use_set) {
 		uint32_t arg = ((co.use_set - 1) & 0xffff) | (1 << 24);

Modified: user/luigi/ipfw3-head/sbin/ipfw/ipfw2.h
==============================================================================
--- user/luigi/ipfw3-head/sbin/ipfw/ipfw2.h	Mon Jan 11 22:28:40 2010	(r202121)
+++ user/luigi/ipfw3-head/sbin/ipfw/ipfw2.h	Mon Jan 11 22:31:47 2010	(r202122)
@@ -266,6 +266,7 @@ void print_altq_cmd(struct _ipfw_insn_al
 
 /* dummynet.c */
 void dummynet_list(int ac, char *av[], int show_counters);
+void dummynet_flush(void);
 int ipfw_delete_pipe(int pipe_or_queue, int n);
 
 /* ipv6.c */


More information about the svn-src-user mailing list