Subject: Re: ip_len byte order in fr_fastroute
To: None <tech-net@netbsd.org>
From: Pavel Cahyna <pavel@netbsd.org>
List: tech-net
Date: 11/04/2007 18:19:46
On Sun, Nov 04, 2007 at 10:21:58AM -0500, Ken Raeburn wrote:
> On Nov 4, 2007, at 09:19, I wrote:
> >called from fr_check, fil.c:2730:
> >
> > } else if ((fdp->fd_ifp != NULL) &&
> > (fdp->fd_ifp != (struct ifnet *)-1)) {
> > /* this is for to rules: */
> > (void) fr_fastroute(fin->fin_m, mp, fin, fdp);
> > m = *mp = NULL;
> > }
> >
> >So, if I've got it right, fr_fastroute gets a handle on the packet with its
> >length in host order, sets it to network order for the call to the output
> >routine, and then sets it back to host order, just in case the caller of
> >fr_fastroute wants to do something else with the packet (e.g., in the dup-to
> >case, I assume). Then the gif soft interrupt handler is invoked, and outputs
> >on the real network interface an encapsulated packet with its length in the
> >host's byte order.
> >
> >Is the packet eventually supposed to get its length restored to network order
> >once again before the soft interrupt for gif can be serviced? Or should I
> >look at making a copy of the packet in gif_output, or maybe patch up the
> >length in gif_intr or in_gif_output? (I haven't looked to see if IPv6 tunnels
> >have a similar problem, but I'm just using the routing table to get IPv6
> >traffic to the right output queue.)
>
> Okay, I found the bit I overlooked before where the network byte order gets
> restored, in fr_check_wrapper. However, it only does so if *mp is non-null,
> and the above code is setting it to null. Perhaps when *mp is set to null
> after a fr_fastroute call, the ip_len field (and ip_off, apparently) should be
> restored to network order in fr_check?
IIUC, fr_fastroute sets *mp to NULL because fr_fastroute effectively
frees the mbuf and nothing should touch it after.
Pavel