On Fri, Oct 03, 2003 at 11:00:10AM +0300, Ruslan Ermilov wrote: > I think these uncommitted patches will mostly affect route.c, while this > patch is for rtsock.c, the route(4) interface with the kernel, which is > unlikely to change a lot.
Much-improved patch to cleanup rtsock.c at bde's prodding attached. I'm proposing doing another pass after this to clear up the bad condition checking style, parentheses, and whitespace. BMS
Index: route.h =================================================================== RCS file: /home/ncvs/src/sys/net/route.h,v retrieving revision 1.47 diff -u -r1.47 route.h --- route.h 5 Mar 2003 19:24:22 -0000 1.47 +++ route.h 3 Oct 2003 08:09:36 -0000 @@ -262,6 +262,11 @@ }; #ifdef _KERNEL +MALLOC_DECLARE(M_RTMSG); + +#define RTMSG_MALLOC(p, n) (p) = malloc((n), M_RTMSG, M_NOWAIT) +#define RTMSG_FREE(p) free((p), M_RTMSG) + #define RTFREE(rt) \ do { \ if ((rt)->rt_refcnt <= 1) \ @@ -296,6 +301,9 @@ struct sockaddr *, struct sockaddr *, int, struct rtentry **); int rtrequest1(int, struct rt_addrinfo *, struct rtentry **); int rt_check(struct rtentry **, struct rtentry **, struct sockaddr *); +#else +#define RTMSG_MALLOC(p, n) (p) = malloc((u_long)(n)) +#define RTMSG_FREE(p) free((p)) #endif #endif Index: rtsock.c =================================================================== RCS file: /home/ncvs/src/sys/net/rtsock.c,v retrieving revision 1.89 diff -u -r1.89 rtsock.c --- rtsock.c 5 Mar 2003 19:24:22 -0000 1.89 +++ rtsock.c 3 Oct 2003 08:11:06 -0000 @@ -280,7 +280,6 @@ struct ifnet *ifp = 0; struct ifaddr *ifa = 0; -#define senderr(e) { error = e; goto flush;} if (m == 0 || ((m->m_len < sizeof(long)) && (m = m_pullup(m, sizeof(long))) == 0)) return (ENOBUFS); @@ -290,37 +289,45 @@ if (len < sizeof(*rtm) || len != mtod(m, struct rt_msghdr *)->rtm_msglen) { dst = 0; - senderr(EINVAL); + error = EINVAL; + goto flush; } - R_Malloc(rtm, struct rt_msghdr *, len); + RTMSG_MALLOC(rtm, len); if (rtm == 0) { dst = 0; - senderr(ENOBUFS); + error = ENOBUFS; + goto flush; } m_copydata(m, 0, len, (caddr_t)rtm); if (rtm->rtm_version != RTM_VERSION) { dst = 0; - senderr(EPROTONOSUPPORT); + error = EPROTONOSUPPORT; + goto flush; } 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; - senderr(EINVAL); + error = EINVAL; + goto flush; } info.rti_flags = rtm->rtm_flags; if (dst == 0 || (dst->sa_family >= AF_MAX) - || (gate != 0 && (gate->sa_family >= AF_MAX))) - senderr(EINVAL); + || (gate != 0 && (gate->sa_family >= AF_MAX))) { + error = EINVAL; + goto flush; + } if (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, *(u_char *)t->rn_key - 1) == 0) genmask = (struct sockaddr *)(t->rn_key); - else - senderr(ENOBUFS); + else { + error = ENOBUFS; + goto flush; + } } /* @@ -328,13 +335,15 @@ * is the only operation the non-superuser is allowed. */ if (rtm->rtm_type != RTM_GET && (error = suser(curthread)) != 0) - senderr(error); + goto flush; switch (rtm->rtm_type) { case RTM_ADD: - if (gate == 0) - senderr(EINVAL); + if (gate == 0) { + error = EINVAL; + goto flush; + } error = rtrequest1(RTM_ADD, &info, &saved_nrt); if (error == 0 && saved_nrt) { rt_setmetrics(rtm->rtm_inits, @@ -359,15 +368,18 @@ case RTM_CHANGE: case RTM_LOCK: if ((rnh = rt_tables[dst->sa_family]) == 0) { - senderr(EAFNOSUPPORT); + error = EAFNOSUPPORT; + goto flush; } RADIX_NODE_HEAD_LOCK(rnh); rt = (struct rtentry *) rnh->rnh_lookup(dst, netmask, rnh); RADIX_NODE_HEAD_UNLOCK(rnh); if (rt != NULL) rt->rt_refcnt++; - else - senderr(ESRCH); + else { + error = ESRCH; + goto flush; + } switch(rtm->rtm_type) { @@ -394,11 +406,13 @@ (struct walkarg *)0); if (len > rtm->rtm_msglen) { struct rt_msghdr *new_rtm; - R_Malloc(new_rtm, struct rt_msghdr *, len); - if (new_rtm == 0) - senderr(ENOBUFS); + RTMSG_MALLOC(new_rtm, len); + if (new_rtm == 0) { + error = ENOBUFS; + goto flush; + } Bcopy(rtm, new_rtm, rtm->rtm_msglen); - Free(rtm); rtm = new_rtm; + RTMSG_FREE(rtm); rtm = new_rtm; } (void)rt_msg2(rtm->rtm_type, &info, (caddr_t)rtm, (struct walkarg *)0); @@ -418,11 +432,11 @@ (ifaaddr != NULL && !sa_equal(ifaaddr, rt->rt_ifa->ifa_addr))) { if ((error = rt_getifa(&info)) != 0) - senderr(error); + goto flush; } if (gate != NULL && (error = rt_setgate(rt, rt_key(rt), gate)) != 0) - senderr(error); + goto flush; if ((ifa = info.rti_ifa) != NULL) { register struct ifaddr *oifa = rt->rt_ifa; if (oifa != ifa) { @@ -453,7 +467,7 @@ break; default: - senderr(EOPNOTSUPP); + error = EOPNOTSUPP; } flush: @@ -473,7 +487,7 @@ if ((so->so_options & SO_USELOOPBACK) == 0) { if (route_cb.any_count <= 1) { if (rtm) - Free(rtm); + RTMSG_FREE(rtm); m_freem(m); return (error); } @@ -487,7 +501,7 @@ m = NULL; } else if (m->m_pkthdr.len > rtm->rtm_msglen) m_adj(m, rtm->rtm_msglen - m->m_pkthdr.len); - Free(rtm); + RTMSG_FREE(rtm); } if (rp) rp->rcb_proto.sp_family = 0; /* Avoid us */
_______________________________________________ [EMAIL PROTECTED] mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-net To unsubscribe, send any mail to "[EMAIL PROTECTED]"