aboutsummaryrefslogtreecommitdiff
path: root/sys/net/rtsock.c
diff options
context:
space:
mode:
authorHiroki Sato <hrs@FreeBSD.org>2013-07-12 12:36:12 +0000
committerHiroki Sato <hrs@FreeBSD.org>2013-07-12 12:36:12 +0000
commit4825b1e0981bf7fe0b9cf4122a83d518064e29a6 (patch)
tree8304af862548c2d7d1c830badbde7fc348e58686 /sys/net/rtsock.c
parente9f947e27c9168a1c9e4bb239e4a094941b4a417 (diff)
downloadsrc-4825b1e0981bf7fe0b9cf4122a83d518064e29a6.tar.gz
src-4825b1e0981bf7fe0b9cf4122a83d518064e29a6.zip
Add a leaf node CTL_NET.PF_ROUTE.0.AF.NET_RT_DUMP.0.FIB. This returns
routing table with the specified FIB number, not td->td_proc->p_fibnum.
Notes
Notes: svn path=/head/; revision=253262
Diffstat (limited to 'sys/net/rtsock.c')
-rw-r--r--sys/net/rtsock.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c
index d665280d1d05..928d2abb169d 100644
--- a/sys/net/rtsock.c
+++ b/sys/net/rtsock.c
@@ -1905,6 +1905,7 @@ sysctl_rtsock(SYSCTL_HANDLER_ARGS)
u_int namelen = arg2;
struct radix_node_head *rnh = NULL; /* silence compiler. */
int i, lim, error = EINVAL;
+ int fib = 0;
u_char af;
struct walkarg w;
@@ -1912,7 +1913,17 @@ sysctl_rtsock(SYSCTL_HANDLER_ARGS)
namelen--;
if (req->newptr)
return (EPERM);
- if (namelen != 3)
+ if (name[1] == NET_RT_DUMP) {
+ if (namelen == 3)
+ fib = req->td->td_proc->p_fibnum;
+ else if (namelen == 4)
+ fib = (name[3] == -1) ?
+ req->td->td_proc->p_fibnum : name[3];
+ else
+ return ((namelen < 3) ? EISDIR : ENOTDIR);
+ if (fib < 0 || fib >= rt_numfibs)
+ return (EINVAL);
+ } else if (namelen != 3)
return ((namelen < 3) ? EISDIR : ENOTDIR);
af = name[0];
if (af > AF_MAX)
@@ -1951,7 +1962,7 @@ sysctl_rtsock(SYSCTL_HANDLER_ARGS)
* take care of routing entries
*/
for (error = 0; error == 0 && i <= lim; i++) {
- rnh = rt_tables_get_rnh(req->td->td_proc->p_fibnum, i);
+ rnh = rt_tables_get_rnh(fib, i);
if (rnh != NULL) {
RADIX_NODE_HEAD_RLOCK(rnh);
error = rnh->rnh_walktree(rnh,