Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: pskb_may_pull()
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Программирование
romez777
Комментарии к коду pskb_may_pull() на http://elixir.free-electrons.com/linux/lat.../skbuff.c#L1610 говорят, что функция может изменить skb указатели. Если так, то после выполнения этого API, нужно обновлять указатели, например, на L3/L4 заголовки. Но я просмотрел примеры использования функции в ядре, и не нашел чтобы это делали. Почему?
Olej
Цитата(romez777 @ Jun 22 2017, 15:52) *
Комментарии к коду pskb_may_pull() на http://elixir.free-electrons.com/linux/lat.../skbuff.c#L1610 говорят, что функция может изменить skb указатели. Если так, то после выполнения этого API, нужно обновлять указатели, например, на L3/L4 заголовки.

Комментарии говорят совсем о другом, о том, что очередь сокетных буферов может быть изменена (переставлена, перетасована). Но это вовсе не значит, что изменится хоть один конкретный struct sk_buff*.

Но!
Кроме того, если вы лезете в такую глубину, то:
- должны бы знать, что API ядра, начинающиеся с __ (2-х _) предназначены для внутреннего использования, а не для сторонних вызовов в качестве API;
- должны бы прочитать, в тех же комментариях, что это вызов сложный, экзотика и вызывается только в исключительных случаях.
romez777
QUOTE (Olej @ Jun 24 2017, 00:23) *
Комментарии говорят совсем о другом, о том, что очередь сокетных буферов может быть изменена (переставлена, перетасована). Но это вовсе не значит, что изменится хоть один конкретный struct sk_buff*.

Комментарии к функции дважды это упоминают:

CODE
/**
*    __pskb_pull_tail - advance tail of skb header
* ...
*    All the pointers pointing into skb header may change and must be
*    reloaded after call to this function.
*/

/* Moves tail of skb head forward, copying data from fragmented part,
* when it is necessary.
* 1. It may fail due to malloc failure.
* 2. It may change skb pointers.
* ...
*/


Функция изменяет как минимум два указателя, tail и data_len, это видно из кода.

QUOTE
Но![/b]
Кроме того, если вы лезете в такую глубину, то:
- должны бы знать, что API ядра, начинающиеся с __ (2-х _) предназначены для внутреннего использования, а не для сторонних вызовов в качестве API;


Такого правила, "высеченного в камне", нет. Использование функций с "__" префиксом широко практикуется в драйверах, там где это оправданно, например исключить проверки и валидации входных параметров, поскольку это уже сделано в коде драйвера. Более того, __pskb_pull_tail() экспортируемый символ, следовательно может использоваться.

QUOTE
- должны бы прочитать, в тех же комментариях, что это вызов сложный, экзотика и вызывается только в исключительных случаях.

Эта функция вызывается из pskb_may_pull(), в чем экзотика?
Olej
Цитата(romez777 @ Jul 8 2017, 00:06) *
Комментарии к функции дважды это упоминают:
Функция изменяет как минимум два указателя, tail и data_len, это видно из кода.

Вы указатели и то на что они указывают - различаете? laughing.gif

Цитата(romez777 @ Jul 8 2017, 00:06) *
Такого правила, "высеченного в камне", нет.

Есть.
Читайте матчасть. smile3046.gif

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.