> Lorenzo Bianconi writes: > > >> Lorenzo Bianconi writes: > >> > > [...] > >> > + * Description > >> > + * For XDP frames split over multiple buffers, the > >> > + * *xdp_md*\ **->data** and*xdp_md *\ **->data_end** pointers > >> > + * will point to the start and end of the first fragment only. > >> > + * This helper can be used to access subsequent fragments by > >> > + * moving the data pointers. To use, an XDP program can call > >> > + * this helper with the byte offset of the packet payload that > >> > + * it wants to access; the helper will move *xdp_md*\ **->data** > >> > + * and *xdp_md *\ **->data_end** so they point to the requested > >> > + * payload offset and to the end of the fragment containing this > >> > + * byte offset, and return the byte offset of the start of the > >> > + * fragment. > >> > >> This comment is wrong now :) > > > > actually we are still returning the byte offset of the start of the fragment > > (base_offset). > > Hmm, right, I was looking at the 'return 0': > > > +BPF_CALL_2(bpf_xdp_adjust_data, struct xdp_buff *, xdp, u32, offset) > > +{ > > + struct skb_shared_info *sinfo = xdp_get_shared_info_from_buff(xdp); > > + u32 base_offset = xdp->mb.headlen; > > + int i; > > + > > + if (!xdp_buff_is_mb(xdp) || offset > sinfo->xdp_frags_size) > > + return -EINVAL; > > + > > + if (offset < xdp->mb.headlen) { > > + /* linear area */ > > + xdp->data = xdp->data_hard_start + xdp->mb.headroom; > > + xdp->data_end = xdp->data + xdp->mb.headlen; > > + return 0; > > + } > > But I guess that's an offset; but that means the helper is not doing > what it says it's doing if it's within the first fragment. That should > probably be made consistent... :) ack, right. I will fix it in v12, thanks. Regards, Lorenzo > > -Toke >