Перейти к содержанию
    

pskb_may_pull()

Комментарии к коду pskb_may_pull() на http://elixir.free-electrons.com/linux/lat.../skbuff.c#L1610 говорят, что функция может изменить skb указатели. Если так, то после выполнения этого API, нужно обновлять указатели, например, на L3/L4 заголовки. Но я просмотрел примеры использования функции в ядре, и не нашел чтобы это делали. Почему?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Комментарии к коду pskb_may_pull() на http://elixir.free-electrons.com/linux/lat.../skbuff.c#L1610 говорят, что функция может изменить skb указатели. Если так, то после выполнения этого API, нужно обновлять указатели, например, на L3/L4 заголовки.

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

 

Но!

Кроме того, если вы лезете в такую глубину, то:

- должны бы знать, что API ядра, начинающиеся с __ (2-х _) предназначены для внутреннего использования, а не для сторонних вызовов в качестве API;

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

/**
*    __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, это видно из кода.

 

Но![/b]

Кроме того, если вы лезете в такую глубину, то:

- должны бы знать, что API ядра, начинающиеся с __ (2-х _) предназначены для внутреннего использования, а не для сторонних вызовов в качестве API;

 

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

 

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

Эта функция вызывается из pskb_may_pull(), в чем экзотика?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

Такого правила, "высеченного в камне", нет.

Есть.

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...