Где указатели на функции указывают в структуре "proto_ops"?

В ядре Linux я нахожу системный вызов getsockopt наконец звонит sock->ops->getsockopt ( код здесь). А также sock->ops это структура называется proto_ops, Эта структура содержит много указателей на функции, такие как getsockopt и мне интересно, куда это указывает - я не нашел место, которое инициирует эту структуру.

Я использую IPv4 и TCP для системного вызова, и он может иметь некоторые определенные функции реализации для вызова здесь.

Любые идеи будут чрезвычайно полезны. Заранее спасибо!

1 ответ

Решение

Для сокета IPv4 ops будет одной из структур inet_stream_ops, inet_dgram_ops, inet_sockraw_ops определяется в net/ipv4/af_inet.c (если только вы не используете что-то странное, например, SCTP, у которого свои собственные операции определены в другом месте). Чтобы увидеть, как эти указатели попадают туда, посмотрите на inet_create в том же файле, который вызывается из __sock_create как pf->create(),

Чтобы увидеть, как этот указатель попадает туда, обратите внимание, что inet_create это create член структуры называется inet_family_ops который передается sock_register(), в результате чего он будет помещен в net_families массив, к которому обращаются при создании сокета.

Функции с register в их именах полезно искать, когда вы хотите увидеть, как связаны различные компоненты ядра.

Теперь вернемся к getsockopt, Если вы посмотрите, где getsockopt указатель фактически идет, во всех 3 inet_*_ops структурирует это указывает на sock_common_getsockopt для getsockopt функция.

sock_common_getsockopt в net/core/sock.c не очень интересно Это просто извлекает struct sock из struct socket а потом звонит sk->sk_prot->getsockopt, Так что дальше вам будет интересно, откуда это.

Это идет от следующего слоя вверх. Я собираюсь взять TCP в качестве примера.

В net/ipv4/tcp_ipv4.c есть struct proto tcp_prot в котором getsockopt участник указывает на tcp_getsockopt функция, определенная в net/ipv4/tcp.c, Это реализует SOL_TCP варианты, а для других он называет getsockopt метод из другой структуры ОПС называется icsk_af_ops, Это возвращает нас к net/ipv4/tcp_ipv4.c где struct inet_connection_sock_af_ops ipv4_specific имеет getsockopt указывая на ip_getsockopt,

ip_getsockopt в net/ipv4/ip_sockglue.c и это вызывает do_ip_getsockopt в том же файле, где SOL_IP варианты на самом деле обрабатываются.

Другие вопросы по тегам