On Tue, Jan 24, 2023 at 03:14:36PM +0100, Jan Klemkow wrote: > On Tue, Jan 24, 2023 at 09:32:53PM +1000, David Gwynne wrote: > > On Mon, Jan 23, 2023 at 09:25:34AM +0100, Jan Klemkow wrote: > > > On Wed, Jan 18, 2023 at 03:49:25PM -0700, Theo de Raadt wrote: > > > > Jan Klemkow <j.klem...@wemelug.de> wrote: > > > > > On Wed, Jan 18, 2023 at 10:50:25AM +0300, Vitaliy Makkoveev wrote: > > > > > > On Tue, Jan 17, 2023 at 11:09:17PM +0100, Jan Klemkow wrote: > > > > > > > we have several drivers which have to parse the content of mbufs. > > > > > > > This > > > > > > > diff suggest a central parsing function for this. Thus, we can > > > > > > > reduce > > > > > > > redundant code. > > > > > > > > > > > > > > I just start with ix(4) and ixl(4) because it was easy to test > > > > > > > for me. > > > > > > > But, this could also improve em(4), igc(4), ale(4) and oce(4). > > > > > > > > > > > > > > I'm not sure about the name, the api nor the place of this code. > > > > > > > So, if > > > > > > > someone has a better idea: i'm open to anything. > > > > > > > > > > > > I like code this deduplication. > > > > > > > > > > > > This newly introduced function doesn't touch ifnet but only extracts > > > > > > protocol headers from mbuf(9). I guess mbuf_extract_headers() or > > > > > > something like is much better for name with the ern/uipc_mbuf2.c as > > > > > > place. > > > > > > > > > > Good Point. Updates diff below. > > > > > > > > I agree, "extract" is a better name. dlg, do you have a comment? > > > > > > Whats you opinion about this diff? > > > > it makes ix and ixl prettier, so that's a good enough reason to do > > it. it should go in net/if_ethersubr.c as ether_extract_headers() > > though. > > > > could you try using a struct to carry the header pointers around and see > > what that looks like? > > > > struct ether_extracted { > > struct ether_header *eh; > > struct ip *ip4; > > struct ip6_hdr *ip6; > > struct tcphdr *tcp; > > struct udphdr *udp; > > }; > > > > void ether_extract_headers(struct mbuf *, struct ether_extracted *); > > > > you can add a depth or flags argument if you want to be able to > > tell it to return before looking for the tcp/udp headers if you > > want. > > OK? >
Looks better then m_extract_headers(). Since ext->eh is always assigned to non NULL value below, the "ext->eh = NULL;" is not necessary. Also I'm not sure, but is memset() more reliable for `ext' zeroing? Anyway, feel free to commit without memset(). > + /* Return NULL if header was not recognized. */ > + ext->eh = NULL; > + ext->ip4 = NULL; > + ext->ip6 = NULL; > + ext->tcp = NULL; > + ext->udp = NULL; > + > + ext->eh = mtod(mp, struct ether_header *);