diff options
author | grehan <grehan@FreeBSD.org> | 2013-07-19 03:27:04 +0000 |
---|---|---|
committer | grehan <grehan@FreeBSD.org> | 2013-07-19 03:27:04 +0000 |
commit | 749888363db1320e1cc3818fcd71e411c3a955ca (patch) | |
tree | e4dd80ba19e005ead5dfb35b03225d5fb4926884 /sys/net/rtsock.c | |
parent | c8195f5331ccad33ad4e265362523f51b96abd5c (diff) | |
parent | 61d6ee86f76db7ef69b0748be4d4b6e14ffc7109 (diff) | |
download | FreeBSD-src-749888363db1320e1cc3818fcd71e411c3a955ca.zip FreeBSD-src-749888363db1320e1cc3818fcd71e411c3a955ca.tar.gz |
IFC @ r253461
Diffstat (limited to 'sys/net/rtsock.c')
-rw-r--r-- | sys/net/rtsock.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c index d665280..928d2ab 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, |