summaryrefslogtreecommitdiffstats
path: root/sys/net/rtsock.c
diff options
context:
space:
mode:
authorsam <sam@FreeBSD.org>2003-10-03 18:15:54 +0000
committersam <sam@FreeBSD.org>2003-10-03 18:15:54 +0000
commit8dd5eb97cf24bf6f275042acc34c5574ca559739 (patch)
tree7877f3f49f5157f92a687ac44ed0e5f2ccfc3dd1 /sys/net/rtsock.c
parent2e29f8c1880a232e80d2717be09c38af6f25e21c (diff)
downloadFreeBSD-src-8dd5eb97cf24bf6f275042acc34c5574ca559739.zip
FreeBSD-src-8dd5eb97cf24bf6f275042acc34c5574ca559739.tar.gz
cleanups prior to adding locking (and in some cases to eliminate locking):
o move route_cb to be private to rtsock.c o replace global static route_proto by locals o eliminate global #define shorthands for info references o remove some register decls o ansi-fy function decls o move items to be close in scope to their usage o add rt_dispatch function for dispatching the actual message o cleanup tangled logic for doing all-but-me msg send Support by: FreeBSD Foundation
Diffstat (limited to 'sys/net/rtsock.c')
-rw-r--r--sys/net/rtsock.c337
1 files changed, 169 insertions, 168 deletions
diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c
index d85e686..5d7d526 100644
--- a/sys/net/rtsock.c
+++ b/sys/net/rtsock.c
@@ -34,7 +34,6 @@
* $FreeBSD$
*/
-
#include <sys/param.h>
#include <sys/domain.h>
#include <sys/kernel.h>
@@ -55,10 +54,17 @@
MALLOC_DEFINE(M_RTABLE, "routetbl", "routing tables");
+/* NB: these are not modified */
static struct sockaddr route_dst = { 2, PF_ROUTE, };
static struct sockaddr route_src = { 2, PF_ROUTE, };
static struct sockaddr sa_zero = { sizeof(sa_zero), AF_INET, };
-static struct sockproto route_proto = { PF_ROUTE, };
+
+static struct {
+ int ip_count; /* attacked w/ AF_INET */
+ int ip6_count; /* attached w/ AF_INET6 */
+ int ipx_count; /* attached w/ AF_IPX */
+ int any_count; /* total attached */
+} route_cb;
struct walkarg {
int w_tmemsize;
@@ -67,23 +73,14 @@ struct walkarg {
struct sysctl_req *w_req;
};
-static struct mbuf *
- rt_msg1(int, struct rt_addrinfo *);
+static struct mbuf *rt_msg1(int, struct rt_addrinfo *);
static int rt_msg2(int, struct rt_addrinfo *, caddr_t, struct walkarg *);
static int rt_xaddrs(caddr_t, caddr_t, struct rt_addrinfo *);
static int sysctl_dumpentry(struct radix_node *rn, void *vw);
static int sysctl_iflist(int af, struct walkarg *w);
-static int route_output(struct mbuf *, struct socket *);
-static void rt_setmetrics(u_long, struct rt_metrics *, struct rt_metrics *);
-
-/* Sleazy use of local variables throughout file, warning!!!! */
-#define dst info.rti_info[RTAX_DST]
-#define gate info.rti_info[RTAX_GATEWAY]
-#define netmask info.rti_info[RTAX_NETMASK]
-#define genmask info.rti_info[RTAX_GENMASK]
-#define ifpaddr info.rti_info[RTAX_IFP]
-#define ifaaddr info.rti_info[RTAX_IFA]
-#define brdaddr info.rti_info[RTAX_BRD]
+static int route_output(struct mbuf *, struct socket *);
+static void rt_setmetrics(u_long, struct rt_metrics *, struct rt_metrics *);
+static void rt_dispatch(struct mbuf *, struct sockaddr *);
/*
* It really doesn't make any sense at all for this code to share much
@@ -271,9 +268,9 @@ route_output(m, so)
register struct mbuf *m;
struct socket *so;
{
+#define sa_equal(a1, a2) (bcmp((a1), (a2), (a1)->sa_len) == 0)
register struct rt_msghdr *rtm = 0;
register struct rtentry *rt = 0;
- struct rtentry *saved_nrt = 0;
struct radix_node_head *rnh;
struct rt_addrinfo info;
int len, error = 0;
@@ -289,36 +286,40 @@ route_output(m, so)
len = m->m_pkthdr.len;
if (len < sizeof(*rtm) ||
len != mtod(m, struct rt_msghdr *)->rtm_msglen) {
- dst = 0;
+ info.rti_info[RTAX_DST] = 0;
senderr(EINVAL);
}
R_Malloc(rtm, struct rt_msghdr *, len);
if (rtm == 0) {
- dst = 0;
+ info.rti_info[RTAX_DST] = 0;
senderr(ENOBUFS);
}
m_copydata(m, 0, len, (caddr_t)rtm);
if (rtm->rtm_version != RTM_VERSION) {
- dst = 0;
+ info.rti_info[RTAX_DST] = 0;
senderr(EPROTONOSUPPORT);
}
rtm->rtm_pid = curproc->p_pid;
bzero(&info, sizeof(info));
info.rti_addrs = rtm->rtm_addrs;
if (rt_xaddrs((caddr_t)(rtm + 1), len + (caddr_t)rtm, &info)) {
- dst = 0;
+ info.rti_info[RTAX_DST] = 0;
senderr(EINVAL);
}
info.rti_flags = rtm->rtm_flags;
- if (dst == 0 || (dst->sa_family >= AF_MAX)
- || (gate != 0 && (gate->sa_family >= AF_MAX)))
+ if (info.rti_info[RTAX_DST] == 0 ||
+ info.rti_info[RTAX_DST]->sa_family >= AF_MAX ||
+ (info.rti_info[RTAX_GATEWAY] != 0 &&
+ info.rti_info[RTAX_GATEWAY]->sa_family >= AF_MAX))
senderr(EINVAL);
- if (genmask) {
+ if (info.rti_info[RTAX_GENMASK]) {
struct radix_node *t;
- t = rn_addmask((caddr_t)genmask, 0, 1);
- if (t && Bcmp((caddr_t *)genmask + 1, (caddr_t *)t->rn_key + 1,
+ t = rn_addmask((caddr_t) info.rti_info[RTAX_GENMASK], 0, 1);
+ if (t && Bcmp((caddr_t *) info.rti_info[RTAX_GENMASK] + 1,
+ (caddr_t *)t->rn_key + 1,
*(u_char *)t->rn_key - 1) == 0)
- genmask = (struct sockaddr *)(t->rn_key);
+ info.rti_info[RTAX_GENMASK] =
+ (struct sockaddr *)(t->rn_key);
else
senderr(ENOBUFS);
}
@@ -331,10 +332,12 @@ route_output(m, so)
senderr(error);
switch (rtm->rtm_type) {
+ struct rtentry *saved_nrt;
case RTM_ADD:
- if (gate == 0)
+ if (info.rti_info[RTAX_GATEWAY] == 0)
senderr(EINVAL);
+ saved_nrt = 0;
error = rtrequest1(RTM_ADD, &info, &saved_nrt);
if (error == 0 && saved_nrt) {
rt_setmetrics(rtm->rtm_inits,
@@ -343,11 +346,12 @@ route_output(m, so)
saved_nrt->rt_rmx.rmx_locks |=
(rtm->rtm_inits & rtm->rtm_rmx.rmx_locks);
saved_nrt->rt_refcnt--;
- saved_nrt->rt_genmask = genmask;
+ saved_nrt->rt_genmask = info.rti_info[RTAX_GENMASK];
}
break;
case RTM_DELETE:
+ saved_nrt = 0;
error = rtrequest1(RTM_DELETE, &info, &saved_nrt);
if (error == 0) {
rt = saved_nrt;
@@ -358,36 +362,38 @@ route_output(m, so)
case RTM_GET:
case RTM_CHANGE:
case RTM_LOCK:
- if ((rnh = rt_tables[dst->sa_family]) == 0) {
+ rnh = rt_tables[info.rti_info[RTAX_DST]->sa_family];
+ if (rnh == 0)
senderr(EAFNOSUPPORT);
- }
RADIX_NODE_HEAD_LOCK(rnh);
- rt = (struct rtentry *) rnh->rnh_lookup(dst, netmask, rnh);
+ rt = (struct rtentry *) rnh->rnh_lookup(info.rti_info[RTAX_DST],
+ info.rti_info[RTAX_NETMASK], rnh);
RADIX_NODE_HEAD_UNLOCK(rnh);
- if (rt != NULL)
- rt->rt_refcnt++;
- else
+ if (rt == NULL) /* XXX looks bogus */
senderr(ESRCH);
+ rt->rt_refcnt++;
switch(rtm->rtm_type) {
case RTM_GET:
report:
- dst = rt_key(rt);
- gate = rt->rt_gateway;
- netmask = rt_mask(rt);
- genmask = rt->rt_genmask;
+ info.rti_info[RTAX_DST] = rt_key(rt);
+ info.rti_info[RTAX_GATEWAY] = rt->rt_gateway;
+ info.rti_info[RTAX_NETMASK] = rt_mask(rt);
+ info.rti_info[RTAX_GENMASK] = rt->rt_genmask;
if (rtm->rtm_addrs & (RTA_IFP | RTA_IFA)) {
ifp = rt->rt_ifp;
if (ifp) {
- ifpaddr = TAILQ_FIRST(&ifp->if_addrhead)->ifa_addr;
- ifaaddr = rt->rt_ifa->ifa_addr;
+ info.rti_info[RTAX_IFP] = TAILQ_FIRST(&ifp->if_addrhead)->ifa_addr;
+ info.rti_info[RTAX_IFA] =
+ rt->rt_ifa->ifa_addr;
if (ifp->if_flags & IFF_POINTOPOINT)
- brdaddr = rt->rt_ifa->ifa_dstaddr;
+ info.rti_info[RTAX_BRD] =
+ rt->rt_ifa->ifa_dstaddr;
rtm->rtm_index = ifp->if_index;
} else {
- ifpaddr = 0;
- ifaaddr = 0;
+ info.rti_info[RTAX_IFP] = 0;
+ info.rti_info[RTAX_IFA] = 0;
}
}
len = rt_msg2(rtm->rtm_type, &info, (caddr_t)0,
@@ -395,8 +401,9 @@ route_output(m, so)
if (len > rtm->rtm_msglen) {
struct rt_msghdr *new_rtm;
R_Malloc(new_rtm, struct rt_msghdr *, len);
- if (new_rtm == 0)
+ if (new_rtm == 0) {
senderr(ENOBUFS);
+ }
Bcopy(rtm, new_rtm, rtm->rtm_msglen);
Free(rtm); rtm = new_rtm;
}
@@ -408,41 +415,47 @@ route_output(m, so)
break;
case RTM_CHANGE:
- /* new gateway could require new ifaddr, ifp;
- flags may also be different; ifp may be specified
- by ll sockaddr when protocol address is ambiguous */
-/* compare two sockaddr structures */
-#define sa_equal(a1, a2) (bcmp((a1), (a2), (a1)->sa_len) == 0)
- if ((rt->rt_flags & RTF_GATEWAY && gate != NULL) ||
- ifpaddr != NULL ||
- (ifaaddr != NULL &&
- !sa_equal(ifaaddr, rt->rt_ifa->ifa_addr))) {
- if ((error = rt_getifa(&info)) != 0)
+ /*
+ * New gateway could require new ifaddr, ifp;
+ * flags may also be different; ifp may be specified
+ * by ll sockaddr when protocol address is ambiguous
+ */
+ if (((rt->rt_flags & RTF_GATEWAY) &&
+ info.rti_info[RTAX_GATEWAY] != NULL) ||
+ info.rti_info[RTAX_IFP] != NULL ||
+ (info.rti_info[RTAX_IFA] != NULL &&
+ !sa_equal(info.rti_info[RTAX_IFA],
+ rt->rt_ifa->ifa_addr))) {
+ if ((error = rt_getifa(&info)) != 0) {
senderr(error);
+ }
}
- if (gate != NULL &&
- (error = rt_setgate(rt, rt_key(rt), gate)) != 0)
+ if (info.rti_info[RTAX_GATEWAY] != NULL &&
+ (error = rt_setgate(rt, rt_key(rt),
+ info.rti_info[RTAX_GATEWAY])) != 0) {
senderr(error);
+ }
if ((ifa = info.rti_ifa) != NULL) {
- register struct ifaddr *oifa = rt->rt_ifa;
+ struct ifaddr *oifa = rt->rt_ifa;
if (oifa != ifa) {
- if (oifa) {
- if (oifa->ifa_rtrequest)
- oifa->ifa_rtrequest(RTM_DELETE, rt,
- &info);
- IFAFREE(oifa);
- }
- IFAREF(ifa);
- rt->rt_ifa = ifa;
- rt->rt_ifp = info.rti_ifp;
+ if (oifa) {
+ if (oifa->ifa_rtrequest)
+ oifa->ifa_rtrequest(
+ RTM_DELETE, rt,
+ &info);
+ IFAFREE(oifa);
+ }
+ IFAREF(ifa);
+ rt->rt_ifa = ifa;
+ rt->rt_ifp = info.rti_ifp;
}
}
rt_setmetrics(rtm->rtm_inits, &rtm->rtm_rmx,
&rt->rt_rmx);
if (rt->rt_ifa && rt->rt_ifa->ifa_rtrequest)
rt->rt_ifa->ifa_rtrequest(RTM_ADD, rt, &info);
- if (genmask)
- rt->rt_genmask = genmask;
+ if (info.rti_info[RTAX_GENMASK])
+ rt->rt_genmask = info.rti_info[RTAX_GENMASK];
/* FALLTHROUGH */
case RTM_LOCK:
rt->rt_rmx.rmx_locks &= ~(rtm->rtm_inits);
@@ -463,8 +476,8 @@ flush:
else
rtm->rtm_flags |= RTF_DONE;
}
- if (rt)
- rtfree(rt);
+ if (rt) /* XXX can this be true? */
+ RTFREE(rt);
{
register struct rawcb *rp = 0;
/*
@@ -489,22 +502,26 @@ flush:
m_adj(m, rtm->rtm_msglen - m->m_pkthdr.len);
Free(rtm);
}
- if (rp)
- rp->rcb_proto.sp_family = 0; /* Avoid us */
- if (dst)
- route_proto.sp_protocol = dst->sa_family;
- if (m)
- raw_input(m, &route_proto, &route_src, &route_dst);
- if (rp)
- rp->rcb_proto.sp_family = PF_ROUTE;
+ if (m) {
+ if (rp) {
+ /*
+ * XXX insure we don't get a copy by
+ * invalidating our protocol
+ */
+ unsigned short family = rp->rcb_proto.sp_family;
+ rp->rcb_proto.sp_family = 0;
+ rt_dispatch(m, info.rti_info[RTAX_DST]);
+ rp->rcb_proto.sp_family = family;
+ } else
+ rt_dispatch(m, info.rti_info[RTAX_DST]);
+ }
}
return (error);
+#undef sa_equal
}
static void
-rt_setmetrics(which, in, out)
- u_long which;
- register struct rt_metrics *in, *out;
+rt_setmetrics(u_long which, struct rt_metrics *in, struct rt_metrics *out)
{
#define metric(f, e) if (which & (f)) out->e = in->e;
metric(RTV_RPIPE, rmx_recvpipe);
@@ -520,8 +537,6 @@ rt_setmetrics(which, in, out)
#define ROUNDUP(a) \
((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
-#define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len))
-
/*
* Extract the addresses of the passed sockaddrs.
@@ -529,24 +544,21 @@ rt_setmetrics(which, in, out)
* This data is derived straight from userland.
*/
static int
-rt_xaddrs(cp, cplim, rtinfo)
- register caddr_t cp, cplim;
- register struct rt_addrinfo *rtinfo;
+rt_xaddrs(caddr_t cp, caddr_t cplim, struct rt_addrinfo *rtinfo)
{
+#define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len))
register struct sockaddr *sa;
register int i;
- for (i = 0; (i < RTAX_MAX) && (cp < cplim); i++) {
+ for (i = 0; i < RTAX_MAX && cp < cplim; i++) {
if ((rtinfo->rti_addrs & (1 << i)) == 0)
continue;
sa = (struct sockaddr *)cp;
/*
* It won't fit.
*/
- if ( (cp + sa->sa_len) > cplim ) {
+ if (cp + sa->sa_len > cplim)
return (EINVAL);
- }
-
/*
* there are no more.. quit now
* If there are more bits, they are in error.
@@ -558,18 +570,16 @@ rt_xaddrs(cp, cplim, rtinfo)
rtinfo->rti_info[i] = &sa_zero;
return (0); /* should be EINVAL but for compat */
}
-
/* accept it */
rtinfo->rti_info[i] = sa;
ADVANCE(cp, sa);
}
return (0);
+#undef ADVANCE
}
static struct mbuf *
-rt_msg1(type, rtinfo)
- int type;
- register struct rt_addrinfo *rtinfo;
+rt_msg1(int type, struct rt_addrinfo *rtinfo)
{
register struct rt_msghdr *rtm;
register struct mbuf *m;
@@ -635,11 +645,7 @@ rt_msg1(type, rtinfo)
}
static int
-rt_msg2(type, rtinfo, cp, w)
- int type;
- register struct rt_addrinfo *rtinfo;
- caddr_t cp;
- struct walkarg *w;
+rt_msg2(int type, struct rt_addrinfo *rtinfo, caddr_t cp, struct walkarg *w)
{
register int i;
int len, dlen, second_time = 0;
@@ -714,12 +720,10 @@ again:
* destination.
*/
void
-rt_missmsg(type, rtinfo, flags, error)
- int type, flags, error;
- register struct rt_addrinfo *rtinfo;
+rt_missmsg(int type, struct rt_addrinfo *rtinfo, int flags, int error)
{
- register struct rt_msghdr *rtm;
- register struct mbuf *m;
+ struct rt_msghdr *rtm;
+ struct mbuf *m;
struct sockaddr *sa = rtinfo->rti_info[RTAX_DST];
if (route_cb.any_count == 0)
@@ -731,8 +735,7 @@ rt_missmsg(type, rtinfo, flags, error)
rtm->rtm_flags = RTF_DONE | flags;
rtm->rtm_errno = error;
rtm->rtm_addrs = rtinfo->rti_addrs;
- route_proto.sp_protocol = sa ? sa->sa_family : 0;
- raw_input(m, &route_proto, &route_src, &route_dst);
+ rt_dispatch(m, sa);
}
/*
@@ -740,10 +743,9 @@ rt_missmsg(type, rtinfo, flags, error)
* socket indicating that the status of a network interface has changed.
*/
void
-rt_ifmsg(ifp)
- register struct ifnet *ifp;
+rt_ifmsg(struct ifnet *ifp)
{
- register struct if_msghdr *ifm;
+ struct if_msghdr *ifm;
struct mbuf *m;
struct rt_addrinfo info;
@@ -758,8 +760,7 @@ rt_ifmsg(ifp)
ifm->ifm_flags = ifp->if_flags;
ifm->ifm_data = ifp->if_data;
ifm->ifm_addrs = 0;
- route_proto.sp_protocol = 0;
- raw_input(m, &route_proto, &route_src, &route_dst);
+ rt_dispatch(m, NULL);
}
/*
@@ -771,10 +772,7 @@ rt_ifmsg(ifp)
* copies of it.
*/
void
-rt_newaddrmsg(cmd, ifa, error, rt)
- int cmd, error;
- register struct ifaddr *ifa;
- register struct rtentry *rt;
+rt_newaddrmsg(int cmd, struct ifaddr *ifa, int error, struct rtentry *rt)
{
struct rt_addrinfo info;
struct sockaddr *sa = 0;
@@ -791,10 +789,10 @@ rt_newaddrmsg(cmd, ifa, error, rt)
register struct ifa_msghdr *ifam;
int ncmd = cmd == RTM_ADD ? RTM_NEWADDR : RTM_DELADDR;
- ifaaddr = sa = ifa->ifa_addr;
- ifpaddr = TAILQ_FIRST(&ifp->if_addrhead)->ifa_addr;
- netmask = ifa->ifa_netmask;
- brdaddr = ifa->ifa_dstaddr;
+ info.rti_info[RTAX_IFA] = sa = ifa->ifa_addr;
+ info.rti_info[RTAX_IFP] = TAILQ_FIRST(&ifp->if_addrhead)->ifa_addr;
+ info.rti_info[RTAX_NETMASK] = ifa->ifa_netmask;
+ info.rti_info[RTAX_BRD] = ifa->ifa_dstaddr;
if ((m = rt_msg1(ncmd, &info)) == NULL)
continue;
ifam = mtod(m, struct ifa_msghdr *);
@@ -809,9 +807,9 @@ rt_newaddrmsg(cmd, ifa, error, rt)
if (rt == 0)
continue;
- netmask = rt_mask(rt);
- dst = sa = rt_key(rt);
- gate = rt->rt_gateway;
+ info.rti_info[RTAX_NETMASK] = rt_mask(rt);
+ info.rti_info[RTAX_DST] = sa = rt_key(rt);
+ info.rti_info[RTAX_GATEWAY] = rt->rt_gateway;
if ((m = rt_msg1(cmd, &info)) == NULL)
continue;
rtm = mtod(m, struct rt_msghdr *);
@@ -820,8 +818,7 @@ rt_newaddrmsg(cmd, ifa, error, rt)
rtm->rtm_errno = error;
rtm->rtm_addrs = info.rti_addrs;
}
- route_proto.sp_protocol = sa ? sa->sa_family : 0;
- raw_input(m, &route_proto, &route_src, &route_dst);
+ rt_dispatch(m, sa);
}
}
@@ -831,9 +828,7 @@ rt_newaddrmsg(cmd, ifa, error, rt)
* there is no route state to worry about.
*/
void
-rt_newmaddrmsg(cmd, ifma)
- int cmd;
- struct ifmultiaddr *ifma;
+rt_newmaddrmsg(int cmd, struct ifmultiaddr *ifma)
{
struct rt_addrinfo info;
struct mbuf *m = 0;
@@ -844,23 +839,24 @@ rt_newmaddrmsg(cmd, ifma)
return;
bzero((caddr_t)&info, sizeof(info));
- ifaaddr = ifma->ifma_addr;
+ info.rti_info[RTAX_IFA] = ifma->ifma_addr;
if (ifp && TAILQ_FIRST(&ifp->if_addrhead))
- ifpaddr = TAILQ_FIRST(&ifp->if_addrhead)->ifa_addr;
+ info.rti_info[RTAX_IFP] =
+ TAILQ_FIRST(&ifp->if_addrhead)->ifa_addr;
else
- ifpaddr = NULL;
+ info.rti_info[RTAX_IFP] = NULL;
/*
* If a link-layer address is present, present it as a ``gateway''
* (similarly to how ARP entries, e.g., are presented).
*/
- gate = ifma->ifma_lladdr;
- if ((m = rt_msg1(cmd, &info)) == NULL)
+ info.rti_info[RTAX_GATEWAY] = ifma->ifma_lladdr;
+ m = rt_msg1(cmd, &info);
+ if (m == NULL)
return;
ifmam = mtod(m, struct ifma_msghdr *);
ifmam->ifmam_index = ifp->if_index;
ifmam->ifmam_addrs = info.rti_addrs;
- route_proto.sp_protocol = ifma->ifma_addr->sa_family;
- raw_input(m, &route_proto, &route_src, &route_dst);
+ rt_dispatch(m, ifma->ifma_addr);
}
/*
@@ -868,9 +864,7 @@ rt_newmaddrmsg(cmd, ifma)
* network interface arrival and departure.
*/
void
-rt_ifannouncemsg(ifp, what)
- struct ifnet *ifp;
- int what;
+rt_ifannouncemsg(struct ifnet *ifp, int what)
{
struct if_announcemsghdr *ifan;
struct mbuf *m;
@@ -887,39 +881,47 @@ rt_ifannouncemsg(ifp, what)
snprintf(ifan->ifan_name, sizeof(ifan->ifan_name),
"%s%d", ifp->if_name, ifp->if_unit);
ifan->ifan_what = what;
- route_proto.sp_protocol = 0;
- raw_input(m, &route_proto, &route_src, &route_dst);
+ rt_dispatch(m, NULL);
}
+static void
+rt_dispatch(struct mbuf *m, struct sockaddr *sa)
+{
+ struct sockproto route_proto;
+
+ route_proto.sp_family = PF_ROUTE;
+ route_proto.sp_protocol = sa ? sa->sa_family : 0;
+ raw_input(m, &route_proto, &route_src, &route_dst);
+}
+
/*
* This is used in dumping the kernel table via sysctl().
*/
static int
-sysctl_dumpentry(rn, vw)
- struct radix_node *rn;
- void *vw;
+sysctl_dumpentry(struct radix_node *rn, void *vw)
{
- register struct walkarg *w = vw;
- register struct rtentry *rt = (struct rtentry *)rn;
+ struct walkarg *w = vw;
+ struct rtentry *rt = (struct rtentry *)rn;
int error = 0, size;
struct rt_addrinfo info;
if (w->w_op == NET_RT_FLAGS && !(rt->rt_flags & w->w_arg))
return 0;
bzero((caddr_t)&info, sizeof(info));
- dst = rt_key(rt);
- gate = rt->rt_gateway;
- netmask = rt_mask(rt);
- genmask = rt->rt_genmask;
+ info.rti_info[RTAX_DST] = rt_key(rt);
+ info.rti_info[RTAX_GATEWAY] = rt->rt_gateway;
+ info.rti_info[RTAX_NETMASK] = rt_mask(rt);
+ info.rti_info[RTAX_GENMASK] = rt->rt_genmask;
if (rt->rt_ifp) {
- ifpaddr = TAILQ_FIRST(&rt->rt_ifp->if_addrhead)->ifa_addr;
- ifaaddr = rt->rt_ifa->ifa_addr;
+ info.rti_info[RTAX_IFP] =
+ TAILQ_FIRST(&rt->rt_ifp->if_addrhead)->ifa_addr;
+ info.rti_info[RTAX_IFA] = rt->rt_ifa->ifa_addr;
if (rt->rt_ifp->if_flags & IFF_POINTOPOINT)
- brdaddr = rt->rt_ifa->ifa_dstaddr;
+ info.rti_info[RTAX_BRD] = rt->rt_ifa->ifa_dstaddr;
}
size = rt_msg2(RTM_GET, &info, 0, w);
if (w->w_req && w->w_tmem) {
- register struct rt_msghdr *rtm = (struct rt_msghdr *)w->w_tmem;
+ struct rt_msghdr *rtm = (struct rt_msghdr *)w->w_tmem;
rtm->rtm_flags = rt->rt_flags;
rtm->rtm_use = rt->rt_use;
@@ -934,14 +936,12 @@ sysctl_dumpentry(rn, vw)
}
static int
-sysctl_iflist(af, w)
- int af;
- register struct walkarg *w;
+sysctl_iflist(int af, struct walkarg *w)
{
- register struct ifnet *ifp;
- register struct ifaddr *ifa;
- struct rt_addrinfo info;
- int len, error = 0;
+ struct ifnet *ifp;
+ struct ifaddr *ifa;
+ struct rt_addrinfo info;
+ int len, error = 0;
bzero((caddr_t)&info, sizeof(info));
/* IFNET_RLOCK(); */ /* could sleep XXX */
@@ -949,11 +949,11 @@ sysctl_iflist(af, w)
if (w->w_arg && w->w_arg != ifp->if_index)
continue;
ifa = TAILQ_FIRST(&ifp->if_addrhead);
- ifpaddr = ifa->ifa_addr;
+ info.rti_info[RTAX_IFP] = ifa->ifa_addr;
len = rt_msg2(RTM_IFINFO, &info, (caddr_t)0, w);
- ifpaddr = 0;
+ info.rti_info[RTAX_IFP] = 0;
if (w->w_req && w->w_tmem) {
- register struct if_msghdr *ifm;
+ struct if_msghdr *ifm;
ifm = (struct if_msghdr *)w->w_tmem;
ifm->ifm_index = ifp->if_index;
@@ -970,12 +970,12 @@ sysctl_iflist(af, w)
if (jailed(curthread->td_ucred) &&
prison_if(curthread->td_ucred, ifa->ifa_addr))
continue;
- ifaaddr = ifa->ifa_addr;
- netmask = ifa->ifa_netmask;
- brdaddr = ifa->ifa_dstaddr;
+ info.rti_info[RTAX_IFA] = ifa->ifa_addr;
+ info.rti_info[RTAX_NETMASK] = ifa->ifa_netmask;
+ info.rti_info[RTAX_BRD] = ifa->ifa_dstaddr;
len = rt_msg2(RTM_NEWADDR, &info, 0, w);
if (w->w_req && w->w_tmem) {
- register struct ifa_msghdr *ifam;
+ struct ifa_msghdr *ifam;
ifam = (struct ifa_msghdr *)w->w_tmem;
ifam->ifam_index = ifa->ifa_ifp->if_index;
@@ -987,7 +987,8 @@ sysctl_iflist(af, w)
goto done;
}
}
- ifaaddr = netmask = brdaddr = 0;
+ info.rti_info[RTAX_IFA] = info.rti_info[RTAX_NETMASK] =
+ info.rti_info[RTAX_BRD] = 0;
}
done:
/* IFNET_RUNLOCK(); */ /* XXX */
@@ -999,7 +1000,7 @@ sysctl_rtsock(SYSCTL_HANDLER_ARGS)
{
int *name = (int *)arg1;
u_int namelen = arg2;
- register struct radix_node_head *rnh;
+ struct radix_node_head *rnh;
int i, s, error = EINVAL;
u_char af;
struct walkarg w;
OpenPOWER on IntegriCloud