Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 15 Jan 1997 17:18:10 +0100
From:      Poul-Henning Kamp <phk@critter.dk.tfs.com>
To:        current@freebsd.org
Subject:   ipfw patches to test
Message-ID:  <27547.853345090@critter.dk.tfs.com>

next in thread | raw e-mail | index | archive | help

Well, I needed this badly, so I looked at it, if somebody wants to
try out this little patch, please report how it goes.

Basically you can now say

	ipfw add deny !from 192.168.23.0/30 to 140.145.230.0/24

or "!to" for that matter.  Give it a whirl...

Poul-Henning

Index: ipfw.c
===================================================================
RCS file: /home/ncvs/src/sbin/ipfw/ipfw.c,v
retrieving revision 1.34
diff -u -r1.34 ipfw.c
--- ipfw.c	1996/10/17 01:05:03	1.34
+++ ipfw.c	1997/01/15 16:06:31
@@ -158,7 +158,7 @@
 	else
 		printf("%u", chain->fw_prot);
 
-	printf(" from ");
+	printf(" %sfrom ", chain->fw_flg & IP_FW_F_INVSRC ? "!" : "");
 
 	adrt=ntohl(chain->fw_smsk.s_addr);
 	if (adrt==ULONG_MAX && do_resolv) {
@@ -198,7 +198,7 @@
 		}
 	}
 
-	printf(" to ");
+	printf(" %sto ", chain->fw_flg & IP_FW_F_INVDST ? "!" : "");
 
 	adrt=ntohl(chain->fw_dmsk.s_addr);
 	if (adrt==ULONG_MAX && do_resolv) {
@@ -679,6 +679,7 @@
 
 	/* from */
 	if (ac && !strncmp(*av,"from",strlen(*av))) { av++; ac--; }
+	else if (ac && !strncmp(*av,"!from",strlen(*av))) { av++; ac--; rule.fw_flg |= IP_FW_F_INVSRC;}
 	else show_usage("missing ``from''\n");
 
 	fill_ip(&rule.fw_src, &rule.fw_smsk, &ac, &av);
@@ -691,6 +692,7 @@
 
 	/* to */
 	if (ac && !strncmp(*av,"to",strlen(*av))) { av++; ac--; }
+	else if (ac && !strncmp(*av,"!to",strlen(*av))) { av++; ac--; rule.fw_flg |= IP_FW_F_INVDST;}
 	else show_usage("missing ``to''\n");
 
 	if (!ac) show_usage("Missing arguments\n");



Index: ip_fw.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/ip_fw.c,v
retrieving revision 1.51
diff -u -r1.51 ip_fw.c
--- ip_fw.c	1996/10/12 19:49:36	1.51
+++ ip_fw.c	1997/01/15 15:58:18
@@ -290,6 +290,7 @@
 	struct ifaddr *ia = NULL, *ia_p;
 	struct in_addr src, dst, ia_i;
 	u_short src_port, dst_port, offset;
+	int i;
 
 	src = ip->ip_src;
 	dst = ip->ip_dst;
@@ -320,11 +321,17 @@
 			continue;
 
 		/* If src-addr doesn't match, not this rule. */
-		if ((src.s_addr & f->fw_smsk.s_addr) != f->fw_src.s_addr)
+		i = (src.s_addr & f->fw_smsk.s_addr) != f->fw_src.s_addr;
+		if (i && !(f->fw_flg & IP_FW_F_INVSRC))
+			continue;
+		if (!i && (f->fw_flg & IP_FW_F_INVSRC))
 			continue;
 
 		/* If dest-addr doesn't match, not this rule. */
-		if ((dst.s_addr & f->fw_dmsk.s_addr) != f->fw_dst.s_addr)
+		i = (dst.s_addr & f->fw_dmsk.s_addr) != f->fw_dst.s_addr;
+		if (i && !(f->fw_flg & IP_FW_F_INVDST))
+			continue;
+		if (!i && (f->fw_flg & IP_FW_F_INVDST))
 			continue;
 
 		/* If a i/f name was specified, and we don't know */
Index: ip_fw.h
===================================================================
RCS file: /home/ncvs/src/sys/netinet/ip_fw.h,v
retrieving revision 1.23
diff -u -r1.23 ip_fw.h
--- ip_fw.h	1996/08/21 21:36:57	1.23
+++ ip_fw.h	1997/01/15 15:56:35
@@ -64,6 +64,8 @@
 /*
  * Values for "flags" field .
  */
+#define IP_FW_F_INVSRC	0x0001  /* Invert sense of src check	      */
+#define IP_FW_F_INVDST	0x0002  /* Invert sense of dst check	      */
 #define IP_FW_F_IN	0x0004	/* Inbound 			      */
 #define IP_FW_F_OUT	0x0008	/* Outbound			      */
 
--
Poul-Henning Kamp           | phk@FreeBSD.ORG       FreeBSD Core-team.
http://www.freebsd.org/~phk | phk@login.dknet.dk    Private mailbox.
whois: [PHK]                | phk@tfs.com	    TRW Financial Systems, Inc.
Future will arrive by its own means, progress not so.



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