socket编程的内核实现

1.一些全局结构

inetsw_array是全局定义的回调函数,不同协议,不同回调,可以简单看一下tcp协议的ops


    struct proto tcp_prot = {
    .name            = "TCP",
    .owner            = THIS_MODULE,
    .close            = tcp_close,
    .connect        = tcp_v4_connect,
    .disconnect        = tcp_disconnect,
    .accept            = inet_csk_accept,
    .ioctl            = tcp_ioctl,
    .init            = tcp_v4_init_sock,
    .destroy        = tcp_v4_destroy_sock,
    .shutdown        = tcp_shutdown,

tcp socket的ops

    const struct proto_ops inet_stream_ops = {
        .family           = PF_INET,
        .owner           = THIS_MODULE,
        .release       = inet_release,
        .bind           = inet_bind,
        .connect       = inet_stream_connect,
        .socketpair       = sock_no_socketpair,
        .accept           = inet_accept,
        .getname       = inet_getname,
        .poll           = tcp_poll,
        .ioctl           = inet_ioctl,
        .listen           = inet_listen,
        .shutdown       = inet_shutdown,
        .setsockopt       = sock_common_setsockopt,
        .getsockopt       = sock_common_getsockopt,
        .sendmsg       = inet_sendmsg,
        .recvmsg       = inet_recvmsg,
        .mmap           = sock_no_mmap,
        .sendpage       = inet_sendpage,
        .splice_read       = tcp_splice_read,
    #ifdef CONFIG_COMPAT
        .compat_setsockopt = compat_sock_common_setsockopt,
        .compat_getsockopt = compat_sock_common_getsockopt,
        .compat_ioctl       = inet_compat_ioctl,
    #endif
    };

真正开始listener在inet_csk_listen_start

tcp_rcv_state_process
tcp_v4_conn_request

inet_csk_reqsk_queue_hash_add
    inet_csk_reqsk_queue_added
        reqsk_queue_added

tcp_sock有seq ack之类的信息

sock
inet_sock

accept的入口
inet_csk_accept
它是从这个队列里取 struct request_sock_queue *queue = &icsk->icsk_accept_queue;