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