On Mon, Jan 23, 2017 at 04:56:02PM +0100, Alexander Bluhm wrote: > On Mon, Jan 23, 2017 at 01:18:05AM +0100, Claudio Jeker wrote: > > Last bit for now. This is changing the reporting madness. It moves it in > > its own function which is called after the big switch statement. > > If you hit a bad error in the switch the code should eiter goto fail or > > flush. > > The new function rt_report is actually constructing the rt message out of > > a rtentry. It does not magically update the message that was passed in > > from userland. I think this is much safer and works better. > > OK bluhm@ > > > +rt_report(struct rtentry *rt, u_char type, int seq, int tableid) > ... > > + ifp = if_get(rt->rt_ifidx); > > + if (ifp != NULL) { > > + info.rti_info[RTAX_IFP] = sdltosa(ifp->if_sadl); > > + info.rti_info[RTAX_IFA] = rt->rt_ifa->ifa_addr; > > + if (ifp->if_flags & IFF_POINTOPOINT) > > + info.rti_info[RTAX_BRD] = rt->rt_ifa->ifa_dstaddr; > > + } > > + if_put(ifp); > > The if_put() could be in the if (ifp != NULL) block. >
While true, I like the symetry of if_get and if_put. Makes sure the if_put is not lost in some other later code changes. > > flush: > > + if (rt) > > + rtfree(rt); > > rtfree() checks (rt != NULL) itself. > Thanks, will change that. -- :wq Claudio