1. 程式人生 > >系統呼叫listen的實現

系統呼叫listen的實現

linux版本:4.9.51

在APP中,

listen(listenfd, BACKLOG_SIZE);

//The backlog argument defines the maximum length to which the queue of pending connections for sockfd may grow. 

SYSCALL_DEFINE2(listen, int, fd, int, backlog)


SYSCALL_DEFINE2(listen, int, fd, int, backlog)
{
	struct socket *sock;
	int err, fput_needed;
	int somaxconn;

	sock = sockfd_lookup_light(fd, &err, &fput_needed);
	if (sock) {
		somaxconn = sock_net(sock->sk)->core.sysctl_somaxconn;
		if ((unsigned int)backlog > somaxconn)
			backlog = somaxconn;

		err = security_socket_listen(sock, backlog);
		
		// sock->ops = inet_stream_ops
		// inet_listen
		if (!err)
			err = sock->ops->listen(sock, backlog);

		fput_light(sock->file, fput_needed);
	}
	return err;
}

其中 somaxconn = 128(預設值),在sysctl_core_net_init設定,呼叫路徑是:

[    0.084553] [sysctl_core_net_init 435]net->core.sysctl_somaxconn: 128 .
[    0.084579] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.9.51-1.2 #155
[    0.084590] Hardware name: Broadcom STB (Flattened Device Tree)
[    0.084627] [<c0210710>] (unwind_backtrace) from [<c020bb54>] (show_stack+0x10/0x14)
[    0.084652] [<c020bb54>] (show_stack) from [<c04fc69c>] (dump_stack+0x84/0x98)
[    0.084677] [<c04fc69c>] (dump_stack) from [<c0e29e70>] (sysctl_core_net_init+0x30/0x5c)
[    0.084701] [<c0e29e70>] (sysctl_core_net_init) from [<c07f5ed4>] (ops_init.constprop.5+0xa4/0x110)
[    0.084723] [<c07f5ed4>] (ops_init.constprop.5) from [<c07f5fec>] (register_pernet_operations+0xac/0xdc)
[    0.084743] [<c07f5fec>] (register_pernet_operations) from [<c07f6048>] (register_pernet_subsys+0x2c/0x40)
[    0.084763] [<c07f6048>] (register_pernet_subsys) from [<c0201898>] (do_one_initcall+0x54/0x190)
[    0.084786] [<c0201898>] (do_one_initcall) from [<c0e00e74>] (kernel_init_freeable+0x158/0x1e4)
[    0.084810] [<c0e00e74>] (kernel_init_freeable) from [<c09b69bc>] (kernel_init+0x8/0x114)
[    0.084832] [<c09b69bc>] (kernel_init) from [<c0208628>] (ret_from_fork+0x14/0x2c)