diff options
author | ae <ae@FreeBSD.org> | 2011-05-30 05:37:26 +0000 |
---|---|---|
committer | ae <ae@FreeBSD.org> | 2011-05-30 05:37:26 +0000 |
commit | 5251d374e6bf12e432d3d911ba9be1ba950711bd (patch) | |
tree | 9cb3d9828f584d16f0e0e24c97a40faf6f54c123 /sys/netinet | |
parent | 1d72c8b97a4c5966263541277038a012dbc50ea8 (diff) | |
download | FreeBSD-src-5251d374e6bf12e432d3d911ba9be1ba950711bd.zip FreeBSD-src-5251d374e6bf12e432d3d911ba9be1ba950711bd.tar.gz |
Add tablearg support for ipfw setfib.
PR: kern/156410
MFC after: 2 weeks
Diffstat (limited to 'sys/netinet')
-rw-r--r-- | sys/netinet/ipfw/ip_fw2.c | 13 | ||||
-rw-r--r-- | sys/netinet/ipfw/ip_fw_sockopt.c | 2 |
2 files changed, 11 insertions, 4 deletions
diff --git a/sys/netinet/ipfw/ip_fw2.c b/sys/netinet/ipfw/ip_fw2.c index 9a75cf5..85ae1b2 100644 --- a/sys/netinet/ipfw/ip_fw2.c +++ b/sys/netinet/ipfw/ip_fw2.c @@ -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) { diff --git a/sys/netinet/ipfw/ip_fw_sockopt.c b/sys/netinet/ipfw/ip_fw_sockopt.c index 0c903ee..d359de3 100644 --- a/sys/netinet/ipfw/ip_fw_sockopt.c +++ b/sys/netinet/ipfw/ip_fw_sockopt.c @@ -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; |