ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

INET LAYER--UDP socket

2022-02-28 16:03:03  阅读:227  来源: 互联网

标签:LAYER struct -- sock UDP sk INET inet socket


struct udp_sock

struct udp_sock 代表一个UDP socket,其结构如下:

struct udp_sock 
{
	struct inet_sock inet
	{
		struct sock sk;
		… …
		INET specified
		… …
	}
	… …
	UDP specified
	… …
}

UDP socket创建

当通过系统调用创建一个UDP socket时,内核中的处理流程如下:

socket(AF_INET,SOCK_DGRAM, 0)
	__sys_socket(AF_INET,SOCK_DGRAM, 0)
		sock_create(AF_INET,SOCK_DGRAM, 0, &sock)
			__sock_create(current->nsproxy->net_ns, AF_INET, SOCK_DGRAM, 0, &sock, 0)
				1.分配struct socket结构
					struct socket *sock;
					sock = sock_alloc();
					sock->type = SOCK_DGRAM;
					
				2.调用AF_INET层处理函数
					net_families[AF_INET]->create(net, sock, 0, 0)
					
	sock_map_fd(sock, flags & (O_CLOEXEC | O_NONBLOCK))

在inet_init中,调用sock_register(&inet_family_ops)将inet_family_ops结构体加入net_families数组,所以net_families[AF_INET]->create就是inet_create:

static const struct net_proto_family inet_family_ops = {
	.family = PF_INET,
	.create = inet_create,
	.owner	= THIS_MODULE,
};

inet_create 处理流程如下:

inet_create((struct net *)net, (struct socket *)sock, 0 ,0)
	1.根椐SOCK TYPE 查找创建UDP socket 所需的struct inet_protosw结构体:
		struct inet_protosw
		{
		.type =       SOCK_DGRAM,
		.protocol =   IPPROTO_UDP,
		.prot =       &udp_prot,
		.ops =        &inet_dgram_ops,
		.flags =      INET_PROTOSW_PERMANENT,
       },
    
    2.分配struct sock结构,实际分配了struct udp_sock类型的结构体。
		sk = sk_alloc(net, PF_INET, GFP_KERNEL, &udp_prot, 0)

   	3.初始化结构体成员。
   		struct socket *sock
   		//struct socket
   		sock->state = SS_UNCONNECTED
   		sock->type = SOCK_DGRAM
   		sock->ops = &inet_dgram_ops
		
		//struct sock
		sk = sock->sk
   		sk->sk_family = PF_INET
   		sk->sk_prot_creator = &udp_prot
   		sk->sk_kern_sock = 0
   		sk->sk_reuse = 0
   		sk->sk_tx_queue_mapping = NO_QUEUE_MAPPING
   		sk->sk_send_head	=	NULL
   		sk->sk_allocation	=	GFP_KERNEL;
		sk->sk_rcvbuf		=	sysctl_rmem_default;
		sk->sk_sndbuf		=	sysctl_wmem_default;
		sk->sk_socket = sock
		sk->sk_type = SOCK_DGRAM
		sk->sk_rcvtimeo		=	MAX_SCHEDULE_TIMEOUT;
		sk->sk_sndtimeo		=	MAX_SCHEDULE_TIMEOUT;		
		sk->sk_state_change	=	sock_def_wakeup;
		sk->sk_data_ready	=	sock_def_readable;
		sk->sk_write_space	=	sock_def_write_space;
		sk->sk_error_report	=	sock_def_error_report;
		sk->sk_write_pending	=	0;
		sk->sk_rcvlowat		=	1;
		sk->sk_destruct	   = inet_sock_destruct;
		sk->sk_protocol	   = protocol;
		sk->sk_backlog_rcv = &udp_prot->backlog_rcv;
		sk->sk_destruct = udp_destruct_sock
		
		//struct inet_sock
		inet = inet_sk(sk)
		inet->is_icsk = 0
		inet->nodefrag = 0
		inet->uc_ttl	= -1;
		inet->mc_loop	= 1;
		inet->mc_ttl	= 1;
		inet->mc_all	= 1;
		inet->mc_index	= 0;
		inet->mc_list	= NULL;
		inet->rcv_tos	= 0;	
			
		//struct sock_common
		sock->sk->__sk_common.skc_prot = &udp_prot
		sock->sk->__sk_common.skc_net_refcnt = 0
		__sk_common.skc_net = net
		

标签:LAYER,struct,--,sock,UDP,sk,INET,inet,socket
来源: https://blog.csdn.net/TangGuLaMa/article/details/123180554

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有