Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 1 Oct 2010 01:33:54 +0530
From:      Paul Joe <apauljoe@gmail.com>
To:        freebsd-net@freebsd.org
Subject:   ipfw tablearg support for setfib
Message-ID:  <AANLkTikDwoh3w33W9KEVfjP9VP5UEwSLD7uEGrtsNwJM@mail.gmail.com>

index | next in thread | raw e-mail

[-- Attachment #1 --]
Hi,

The attached patch supports tablearg options to setfib.

With the patch, you can add rules like

ipfw add 100 setfib tablearg ip from 'table(1)' to any

It help in policy based routing as discussed in this thread.
http://docs.freebsd.org/cgi/getmsg.cgi?fetch=124951+0+archive/2009/freebsd-net/20090426.freebsd-net

Let me know your comments..


Thanks,
Joe

[-- Attachment #2 --]
Index: src/sbin/ipfw/ipfw2.c
===================================================================
RCS file: /home/ncvs/src/sbin/ipfw/ipfw2.c,v
retrieving revision 1.159
diff -c -u -r1.159 ipfw2.c
--- src/sbin/ipfw/ipfw2.c	19 Apr 2010 16:35:47 -0000	1.159
+++ src/sbin/ipfw/ipfw2.c	30 Sep 2010 18:52:41 -0000
@@ -2833,11 +2833,17 @@
 
 		action->opcode = O_SETFIB;
  		NEED1("missing fib number");
- 	        action->arg1 = strtoul(*av, NULL, 10);
-		if (sysctlbyname("net.fibs", &numfibs, &intsize, NULL, 0) == -1)
-			errx(EX_DATAERR, "fibs not suported.\n");
-		if (action->arg1 >= numfibs)  /* Temporary */
-			errx(EX_DATAERR, "fib too large.\n");
+		if(isdigit(**av)) {
+			action->arg1 = strtoul(*av, NULL, 10);
+			if (sysctlbyname("net.fibs", &numfibs, &intsize,
+			    NULL, 0) == -1)
+				errx(EX_DATAERR, "fibs not suported.\n");
+			if (action->arg1 >= numfibs)  /* Temporary */
+				errx(EX_DATAERR, "fib too large.\n");
+		} else if (_substrcmp(*av, "tablearg") == 0)
+			action->arg1 = IP_FW_TABLEARG;
+		else
+			errx(EX_DATAERR, "illegal argument for %s", *(av - 1));
  		av++;
  		break;
 	    }
Index: src/sys/netinet/ipfw/ip_fw2.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/ipfw/ip_fw2.c,v
retrieving revision 1.45
diff -c -u -r1.45 ip_fw2.c
--- src/sys/netinet/ipfw/ip_fw2.c	27 Jul 2010 14:26:34 -0000	1.45
+++ src/sys/netinet/ipfw/ip_fw2.c	30 Sep 2010 18:52:43 -0000
@@ -2092,12 +2092,15 @@
 				done = 1;       /* exit outer loop */
 				break;
 
-			case O_SETFIB:
+			case O_SETFIB: {
+				uint32_t fibnum;
 				f->pcnt++;	/* update stats */
 				f->bcnt += pktlen;
 				f->timestamp = time_uptime;
-				M_SETFIB(m, cmd->arg1);
-				args->f_id.fib = cmd->arg1;
+				fibnum = (cmd->arg1 == IP_FW_TABLEARG)?
+					 tablearg : cmd->arg1;
+				M_SETFIB(m, fibnum);
+				args->f_id.fib = fibnum;
 				l = 0;		/* exit inner loop */
 				break;
 
Index: src/sys/netinet/ipfw/ip_fw_sockopt.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/ipfw/ip_fw_sockopt.c,v
retrieving revision 1.17
diff -c -u -r1.17 ip_fw_sockopt.c
--- src/sys/netinet/ipfw/ip_fw_sockopt.c	7 Apr 2010 08:23:58 -0000	1.17
+++ src/sys/netinet/ipfw/ip_fw_sockopt.c	30 Sep 2010 18:52:44 -0000
@@ -605,7 +605,8 @@
 		case O_SETFIB:
 			if (cmdlen != F_INSN_SIZE(ipfw_insn))
 				goto bad_size;
-			if (cmd->arg1 >= rt_numfibs) {
+			if (cmd->arg1 >= rt_numfibs &&
+			     cmd->arg1 != IP_FW_TABLEARG) {
 				printf("ipfw: invalid fib number %d\n",
 					cmd->arg1);
 				return EINVAL;
home | help

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