LINUX.ORG.RU

понять 'struct proto' и 'struct proto_ops' в ядре

 , ,


0

2

Приветствую, Пытаюсь разобраться в коде tcp/ip в ядре (2.6.35), конкретно - socket layer.

Я понимаю, что proto_ops нужна для определения операций на сокете, например bind/connect/accept, и каждый сокет (struct sock) имеет указатель на proto_ops.

Кроме того, есть также struct proto, который описывает новый протокол, эта структура также содержит указатели на методы для accept/bind/setsockopt/getsockopt и пр.

Но нигде в коде в $linux/net/ я не встретил примененения методов определенных в 'struct proto', кем и где они задействованы?

Буду признателен за пояснения. Спасибо.

★★

Может я не правильно понял исходники, но ″struct sock″ содержит ″struct proto″. А ″struct socket″ содержит ″struct proto_ops″. При этом для tcp/udp поле ″getsockopt″ в ″struct proto_ops″ указывает на ″sock_common_setsockopt″, а эта функция фактически вызывает ″getsockopt″ из ″struct proto″. А зачем так сделано я не знаю, может ответ есть в книге «Linux Kernel Networking: Implementation and Theory».

mky ★★★★★
()

Я понимаю, что proto_ops нужна для определения операций на сокете

Да. Если чуть глубже — она определяет семантику коммуникационного протокола — то, что ты задаёшь параметрами domain и type при вызове socket().

Кроме того, есть также struct proto

Это транспортный протокол.

Но нигде в коде в $linux/net/ я не встретил примененения методов определенных в 'struct proto', кем и где они задействованы?

Методами proto_ops. Скажем, для internet stream socket + TCP, inet_sendmsg() в итоге дёргает tcp_sendmsg() через эту структуру.

Есть такая структура как inet_protosw, которая связывает между собой proto_ops и proto. Погрепай по сорцам — в них есть несколько её глобальных экземпляров.

fang
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.