IPv4 ソケットの場合、ops はで定義された構造体inet_stream_ops
、inet_dgram_ops
、のいずれかになります (SCTP のように独自の ops が別の場所で定義されている奇妙なものを使用している場合を除きます)。これらのポインターがどのようにそこに到達するかを確認するには、 asから呼び出される同じファイルを参照してください。inet_sockraw_ops
net/ipv4/af_inet.c
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
aから aを抽出して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
と呼ばれる別の ops 構造体からメソッドを呼び出します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