Here's a diff that substitutes the crazy defines of rtsock.c plus some 0 -> NULL conversion. There's no object change with it.
ok? Index: net/rtsock.c =================================================================== RCS file: /home/ncvs/src/sys/net/rtsock.c,v retrieving revision 1.134 diff -u -p -r1.134 rtsock.c --- net/rtsock.c 19 Jan 2014 11:20:46 -0000 1.134 +++ net/rtsock.c 20 Jan 2014 11:34:58 -0000 @@ -107,15 +107,6 @@ struct rt_omsghdr *rtmsg_5to4(struct rt_ void rt_ogetmetrics(struct rt_kmetrics *in, struct rt_ometrics *out); #endif /* RTM_OVERSION */ -/* 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] - struct routecb { struct rawcb rcb; struct timeout timeout; @@ -474,7 +465,7 @@ route_output(struct mbuf *m, ...) so = va_arg(ap, struct socket *); va_end(ap); - dst = NULL; /* for error handling (goto flush) */ + info.rti_info[RTAX_DST] = NULL; /* for error handling (goto flush) */ if (m == 0 || ((m->m_len < sizeof(int32_t)) && (m = m_pullup(m, sizeof(int32_t))) == 0)) return (ENOBUFS); @@ -588,19 +579,23 @@ route_output(struct mbuf *m, ...) info.rti_addrs = rtm->rtm_addrs; rt_xaddrs(rtm->rtm_hdrlen + (caddr_t)rtm, len + (caddr_t)rtm, &info); 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] == NULL || + info.rti_info[RTAX_DST]->sa_family >= AF_MAX || + (info.rti_info[RTAX_GATEWAY] != NULL && + info.rti_info[RTAX_GATEWAY]->sa_family >= AF_MAX)) { error = EINVAL; goto flush; } - if (genmask) { + if (info.rti_info[RTAX_GENMASK] != NULL) { struct radix_node *t; - t = rn_addmask(genmask, 0, 1); - if (t && genmask->sa_len >= + t = rn_addmask(info.rti_info[RTAX_GENMASK], 0, 1); + if (t && info.rti_info[RTAX_GENMASK]->sa_len >= ((struct sockaddr *)t->rn_key)->sa_len && - memcmp((caddr_t *)genmask + 1, (caddr_t *)t->rn_key + 1, + memcmp((caddr_t *)info.rti_info[RTAX_GENMASK] + 1, + (caddr_t *)t->rn_key + 1, ((struct sockaddr *)t->rn_key)->sa_len) - 1) - genmask = (struct sockaddr *)(t->rn_key); + info.rti_info[RTAX_GENMASK] = + (struct sockaddr *)(t->rn_key); else { error = ENOBUFS; goto flush; @@ -612,7 +607,7 @@ route_output(struct mbuf *m, ...) switch (rtm->rtm_type) { case RTM_ADD: - if (gate == 0) { + if (info.rti_info[RTAX_GATEWAY] == NULL) { error = EINVAL; goto flush; } @@ -622,7 +617,7 @@ route_output(struct mbuf *m, ...) rt_setmetrics(rtm->rtm_inits, &rtm->rtm_rmx, &saved_nrt->rt_rmx); saved_nrt->rt_refcnt--; - saved_nrt->rt_genmask = genmask; + saved_nrt->rt_genmask = info.rti_info[RTAX_GENMASK]; /* write back the priority the kernel used */ rtm->rtm_priority = saved_nrt->rt_priority & RTP_MASK; rtm->rtm_index = saved_nrt->rt_ifp->if_index; @@ -640,11 +635,13 @@ route_output(struct mbuf *m, ...) case RTM_GET: case RTM_CHANGE: case RTM_LOCK: - if ((rnh = rt_gettable(dst->sa_family, tableid)) == NULL) { + rnh = rt_gettable(info.rti_info[RTAX_DST]->sa_family, tableid); + if (rnh == NULL) { error = EAFNOSUPPORT; goto flush; } - rt = rt_lookup(dst, netmask, tableid); + rt = rt_lookup(info.rti_info[RTAX_DST], + info.rti_info[RTAX_NETMASK], tableid); rn = (struct radix_node *)rt; if (rn == NULL || (rn->rn_flags & RNF_ROOT) != 0) { error = ESRCH; @@ -656,9 +653,10 @@ route_output(struct mbuf *m, ...) * for RTM_CHANGE/LOCK, if we got multipath routes, * we require users to specify a matching RTAX_GATEWAY. * - * for RTM_GET, gate is optional even with multipath. - * if gate == NULL the first match is returned. - * (no need to call rt_mpath_matchgate if gate == NULL) + * for RTM_GET, info.rti_info[RTAX_GATEWAY] is optional + * even with multipath. + * if it is NULL the first match is returned (no need to + * call rt_mpath_matchgate). */ if (rn_mpath_capable(rnh)) { /* first find correct priority bucket */ @@ -673,22 +671,27 @@ route_output(struct mbuf *m, ...) /* if multipath routes */ if (rt_mpath_next(rt)) { /* XXX ignores down routes */ - if (gate) - rt = rt_mpath_matchgate(rt, gate, prio); - else if (rtm->rtm_type != RTM_GET) + if (info.rti_info[RTAX_GATEWAY] != NULL) { + rt = rt_mpath_matchgate(rt, + info.rti_info[RTAX_GATEWAY], prio); + } else if (rtm->rtm_type != RTM_GET) { /* - * only RTM_GET may use an empty gate - * on multipath ... + * only RTM_GET may use an empty + * gateway on multipath ... */ rt = NULL; - } else if (gate && (rtm->rtm_type == RTM_GET || - rtm->rtm_type == RTM_LOCK)) + } + } else if ((info.rti_info[RTAX_GATEWAY] != NULL) && + (rtm->rtm_type == RTM_GET || + rtm->rtm_type == RTM_LOCK)) { /* - * ... but if a gate is specified RTM_GET - * and RTM_LOCK must match the gate no matter + * ... but if a gateway is specified RTM_GET + * and RTM_LOCK must match the gateway no matter * what. */ - rt = rt_mpath_matchgate(rt, gate, prio); + rt = rt_mpath_matchgate(rt, + info.rti_info[RTAX_GATEWAY], prio); + } if (!rt) { error = ESRCH; @@ -708,7 +711,8 @@ route_output(struct mbuf *m, ...) * if none of them have a netmask both are host routes which is * also a perfect match. */ - if (rtm->rtm_type != RTM_GET && !rt_mask(rt) != !netmask) { + if (rtm->rtm_type != RTM_GET && + !rt_mask(rt) != !info.rti_info[RTAX_NETMASK]) { error = ESRCH; goto flush; } @@ -716,10 +720,10 @@ route_output(struct mbuf *m, ...) 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 (rt->rt_labelid) { bzero(&sa_rt, sizeof(sa_rt)); @@ -745,17 +749,18 @@ report: rtm->rtm_mpls = info.rti_mpls; } #endif - ifpaddr = 0; - ifaaddr = 0; + info.rti_info[RTAX_IFP] = NULL; + info.rti_info[RTAX_IFA] = NULL; if (rtm->rtm_addrs & (RTA_IFP | RTA_IFA) && (ifp = rt->rt_ifp) != NULL) { - ifpaddr = + info.rti_info[RTAX_IFP] = TAILQ_FIRST(&ifp->if_addrlist)->ifa_addr; - ifaaddr = rt->rt_ifa->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; else - brdaddr = 0; + info.rti_info[RTAX_BRD] = NULL; rtm->rtm_index = ifp->if_index; } len = rt_msg2(rtm->rtm_type, RTM_VERSION, &info, NULL, @@ -789,23 +794,31 @@ report: if ((error = rt_getifa(&info, tableid)) != 0) goto flush; newgate = 0; - if (gate) + if (info.rti_info[RTAX_GATEWAY] != NULL) if (rt->rt_gateway == NULL || - bcmp(rt->rt_gateway, gate, gate->sa_len)) + bcmp(rt->rt_gateway, + info.rti_info[RTAX_GATEWAY], + info.rti_info[RTAX_GATEWAY]->sa_len)) { newgate = 1; - if (gate && rt_setgate(rt, rt_key(rt), gate, tableid)) { + } + if (info.rti_info[RTAX_GATEWAY] != NULL && + rt_setgate(rt, rt_key(rt), + info.rti_info[RTAX_GATEWAY], tableid)) { error = EDQUOT; goto flush; } - if (ifpaddr && - (ifa = ifa_ifwithnet(ifpaddr, tableid)) && - (ifp = ifa->ifa_ifp) && (ifaaddr || gate)) - ifa = ifaof_ifpforaddr(ifaaddr ? ifaaddr : gate, - ifp); - else if ((ifaaddr && - (ifa = ifa_ifwithaddr(ifaaddr, tableid))) || - (gate && (ifa = ifa_ifwithroute(rt->rt_flags, - rt_key(rt), gate, tableid)))) + if (info.rti_info[RTAX_IFP] != NULL && (ifa = + ifa_ifwithnet(info.rti_info[RTAX_IFP], tableid)) && + (ifp = ifa->ifa_ifp) && (info.rti_info[RTAX_IFA] || + info.rti_info[RTAX_GATEWAY])) + ifa = ifaof_ifpforaddr(info.rti_info[RTAX_IFA] ? + info.rti_info[RTAX_IFA] : + info.rti_info[RTAX_GATEWAY], ifp); + else if ((info.rti_info[RTAX_IFA] != NULL && (ifa = + ifa_ifwithaddr(info.rti_info[RTAX_IFA], tableid)))|| + (info.rti_info[RTAX_GATEWAY] != NULL && (ifa = + ifa_ifwithroute(rt->rt_flags, rt_key(rt), + info.rti_info[RTAX_GATEWAY], tableid)))) ifp = ifa->ifa_ifp; if (ifa) { struct ifaddr *oifa = rt->rt_ifa; @@ -877,8 +890,8 @@ report: rtm->rtm_flags = rt->rt_flags; if (rt->rt_ifa && rt->rt_ifa->ifa_rtrequest) rt->rt_ifa->ifa_rtrequest(RTM_ADD, rt); - if (genmask) - rt->rt_genmask = genmask; + if (info.rti_info[RTAX_GENMASK]) + rt->rt_genmask = info.rti_info[RTAX_GENMASK]; if (info.rti_info[RTAX_LABEL] != NULL) { char *rtlabel = ((struct sockaddr_rtlabel *) info.rti_info[RTAX_LABEL])->sr_label; @@ -886,7 +899,8 @@ report: rt->rt_labelid = rtlabel_name2id(rtlabel); } - if_group_routechange(dst, netmask); + if_group_routechange(info.rti_info[RTAX_DST], + info.rti_info[RTAX_NETMASK]); /* FALLTHROUGH */ case RTM_LOCK: rt->rt_rmx.rmx_locks &= ~(rtm->rtm_inits); @@ -906,8 +920,8 @@ flush: rtm->rtm_flags |= RTF_DONE; } } - if (dst) - route_proto.sp_protocol = dst->sa_family; + if (info.rti_info[RTAX_DST]) + route_proto.sp_protocol = info.rti_info[RTAX_DST]->sa_family; if (rt) rtfree(rt); @@ -1241,10 +1255,11 @@ rt_newaddrmsg(int cmd, struct ifaddr *if else ncmd = RTM_DELADDR; - ifaaddr = sa = ifa->ifa_addr; - ifpaddr = TAILQ_FIRST(&ifp->if_addrlist)->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_addrlist)->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 *); @@ -1260,9 +1275,9 @@ rt_newaddrmsg(int cmd, struct ifaddr *if 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 *); @@ -1323,15 +1338,16 @@ sysctl_dumpentry(struct radix_node *rn, if (w->w_op == NET_RT_FLAGS && !(rt->rt_flags & w->w_arg)) return 0; bzero(&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_addrlist)->ifa_addr; - ifaaddr = rt->rt_ifa->ifa_addr; + info.rti_info[RTAX_IFP] = + TAILQ_FIRST(&rt->rt_ifp->if_addrlist)->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; } if (rt->rt_labelid) { bzero(&sa_rt, sizeof(sa_rt)); @@ -1415,7 +1431,7 @@ sysctl_iflist(int af, struct walkarg *w) ifa = TAILQ_FIRST(&ifp->if_addrlist); if (!ifa) continue; - ifpaddr = ifa->ifa_addr; + info.rti_info[RTAX_IFP] = ifa->ifa_addr; len = rt_msg2(RTM_IFINFO, RTM_VERSION, &info, 0, w); if (w->w_where && w->w_tmem && w->w_needed <= 0) { struct if_msghdr *ifm; @@ -1448,13 +1464,13 @@ sysctl_iflist(int af, struct walkarg *w) w->w_where += len; } #endif /* RTM_OVERSION */ - ifpaddr = 0; + info.rti_info[RTAX_IFP] = NULL; while ((ifa = TAILQ_NEXT(ifa, ifa_list)) != NULL) { if (af && af != ifa->ifa_addr->sa_family) 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, RTM_VERSION, &info, 0, w); if (w->w_where && w->w_tmem && w->w_needed <= 0) { struct ifa_msghdr *ifam; @@ -1486,7 +1502,8 @@ sysctl_iflist(int af, struct walkarg *w) } #endif /* RTM_OVERSION */ } - ifaaddr = netmask = brdaddr = 0; + info.rti_info[RTAX_IFA] = info.rti_info[RTAX_NETMASK] = + info.rti_info[RTAX_BRD] = NULL; } return (0); }