A couple of questions about the SKB fragments

4 messages, 3 authors, 2016-05-07 · open the first message on its own page

A couple of questions about the SKB fragments

From: Ilya Matveychikov <hidden>
Date: 2016-05-05 07:40:22

Hello folks,

While working with fragmented SKBs we've got stuck with the following:
- is it possible for an SKB fragment in skb_shinfo(skb)->frag_list to
be fragmented too (i.e. to have SKBs in frag_list)?
- do skb->len and skb->data_len contain the whole SKB length,
including the length of all fragments (not only the paged parts)?

Is there any docs except the kernel sources itself to refer to?

Thanks.

Re: A couple of questions about the SKB fragments

From: Edward Cree <hidden>
Date: 2016-05-05 11:14:43

On 05/05/16 08:40, Ilya Matveychikov wrote:
Hello folks,

While working with fragmented SKBs we've got stuck with the following:
- is it possible for an SKB fragment in skb_shinfo(skb)->frag_list to
be fragmented too (i.e. to have SKBs in frag_list)?
- do skb->len and skb->data_len contain the whole SKB length,
including the length of all fragments (not only the paged parts)?

Is there any docs except the kernel sources itself to refer to?
davem has some docs up at http://vger.kernel.org/~davem/skb.html and
http://vger.kernel.org/~davem/skb_data.html
In particular note the following:
"The frag_list is used to maintain a chain of SKBs organized for
 fragmentation purposes, it is _not_ used for maintaining paged data."
So my reading would suggest there is no way to multiple-layer-fragment
an SKB; the frags are page pointers and offsets, not entire sk_buff
structs in their own right.

-Ed

Re: A couple of questions about the SKB fragments

From: Sowmini Varadhan <hidden>
Date: 2016-05-05 12:58:45

On (05/05/16 12:13), Edward Cree wrote:
On 05/05/16 08:40, Ilya Matveychikov wrote:
quoted
While working with fragmented SKBs we've got stuck with the following:
- is it possible for an SKB fragment in skb_shinfo(skb)->frag_list to
be fragmented too (i.e. to have SKBs in frag_list)?
- do skb->len and skb->data_len contain the whole SKB length,
including the length of all fragments (not only the paged parts)?

Is there any docs except the kernel sources itself to refer to?
davem has some docs up at http://vger.kernel.org/~davem/skb.html and
http://vger.kernel.org/~davem/skb_data.html
In particular note the following:
"The frag_list is used to maintain a chain of SKBs organized for
 fragmentation purposes, it is _not_ used for maintaining paged data."
So my reading would suggest there is no way to multiple-layer-fragment
an SKB; the frags are page pointers and offsets, not entire sk_buff
structs in their own right.
Actually (and perhaps I am mixing up skb_frag_t with the sk_buff in
skb_shinfo(skb)->frag_list) I think it is entirely possible in theory 
for the frag_list to itself both skb_frag_t's as well as more sk_buffs
in the ->frag_list- at least that's why I understand fromcode
that recurses using skb_walk_frags(), such as tcp_md5_hash_skb_data().
AIUI, the statement about page pointers and offsets applies to the 
skb_frag_t's in the skb_shared_info. The len and data_len should be
the sum-total for the whole skb, including skb_frag_t's and ->frag_list.

--Sowmini

Re: A couple of questions about the SKB fragments

From: Ilya Matveychikov <hidden>
Date: 2016-05-07 09:21:21

2016-05-05 14:13 GMT+03:00 Edward Cree [off-list ref]:
On 05/05/16 08:40, Ilya Matveychikov wrote:
quoted
Is there any docs except the kernel sources itself to refer to?
davem has some docs up at http://vger.kernel.org/~davem/skb.html and
http://vger.kernel.org/~davem/skb_data.html
In particular note the following:
"The frag_list is used to maintain a chain of SKBs organized for
 fragmentation purposes, it is _not_ used for maintaining paged data."
So my reading would suggest there is no way to multiple-layer-fragment
an SKB; the frags are page pointers and offsets, not entire sk_buff
structs in their own right.
Seems that the docs is slightly outdated. I think the structure of SKB does
not impose any restrictions on the nesting of the fragments. But is there
any of them in the kernel's code?
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help