mirror of
https://github.com/opnsense/src.git
synced 2026-06-09 00:32:25 -04:00
Add tablearg support for ipfw setfib.
PR: kern/156410 MFC after: 2 weeks
This commit is contained in:
parent
9d4a4b2a03
commit
41b6083752
4 changed files with 30 additions and 15 deletions
|
|
@ -1,7 +1,7 @@
|
|||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd July 27, 2010
|
||||
.Dd May 30, 2011
|
||||
.Dt IPFW 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
|
|
@ -871,13 +871,16 @@ for more information on
|
|||
and
|
||||
.Cm ngtee
|
||||
actions.
|
||||
.It Cm setfib Ar fibnum
|
||||
.It Cm setfib Ar fibnum | tablearg
|
||||
The packet is tagged so as to use the FIB (routing table)
|
||||
.Ar fibnum
|
||||
in any subsequent forwarding decisions.
|
||||
Initially this is limited to the values 0 through 15, see
|
||||
.Xr setfib 1 .
|
||||
Processing continues at the next rule.
|
||||
It is possible to use the
|
||||
.Cm tablearg
|
||||
keyword with a setfib. If tablearg value is not within compiled FIB range packet fib is set to 0.
|
||||
.It Cm reass
|
||||
Queue and reassemble ip fragments.
|
||||
If the packet is not fragmented, counters are updated and processing continues with the next rule.
|
||||
|
|
@ -1711,7 +1714,7 @@ is used.
|
|||
The
|
||||
.Cm tablearg
|
||||
argument can be used with the following actions:
|
||||
.Cm nat, pipe , queue, divert, tee, netgraph, ngtee, fwd, skipto
|
||||
.Cm nat, pipe , queue, divert, tee, netgraph, ngtee, fwd, skipto, setfib,
|
||||
action parameters:
|
||||
.Cm tag, untag,
|
||||
rule options:
|
||||
|
|
|
|||
|
|
@ -2835,14 +2835,19 @@ chkarg:
|
|||
size_t intsize = sizeof(int);
|
||||
|
||||
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");
|
||||
av++;
|
||||
break;
|
||||
NEED1("missing fib number");
|
||||
if (_substrcmp(*av, "tablearg") == 0) {
|
||||
action->arg1 = IP_FW_TABLEARG;
|
||||
} else {
|
||||
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");
|
||||
}
|
||||
av++;
|
||||
break;
|
||||
}
|
||||
|
||||
case TOK_REASS:
|
||||
|
|
|
|||
|
|
@ -2137,14 +2137,21 @@ do { \
|
|||
done = 1; /* exit outer loop */
|
||||
break;
|
||||
|
||||
case O_SETFIB:
|
||||
case O_SETFIB: {
|
||||
uint32_t fib;
|
||||
|
||||
f->pcnt++; /* update stats */
|
||||
f->bcnt += pktlen;
|
||||
f->timestamp = time_uptime;
|
||||
M_SETFIB(m, cmd->arg1);
|
||||
args->f_id.fib = cmd->arg1;
|
||||
fib = (cmd->arg1 == IP_FW_TABLEARG) ? tablearg:
|
||||
cmd->arg1;
|
||||
if (fib >= rt_numfibs)
|
||||
fib = 0;
|
||||
M_SETFIB(m, fib);
|
||||
args->f_id.fib = fib;
|
||||
l = 0; /* exit inner loop */
|
||||
break;
|
||||
}
|
||||
|
||||
case O_NAT:
|
||||
if (!IPFW_NAT_LOADED) {
|
||||
|
|
|
|||
|
|
@ -606,7 +606,7 @@ check_ipfw_struct(struct ip_fw *rule, int size)
|
|||
case O_SETFIB:
|
||||
if (cmdlen != F_INSN_SIZE(ipfw_insn))
|
||||
goto bad_size;
|
||||
if (cmd->arg1 >= rt_numfibs) {
|
||||
if ((cmd->arg1 != IP_FW_TABLEARG) && (cmd->arg1 >= rt_numfibs)) {
|
||||
printf("ipfw: invalid fib number %d\n",
|
||||
cmd->arg1);
|
||||
return EINVAL;
|
||||
|
|
|
|||
Loading…
Reference in a new issue