内核中的UDP socket流程(3)(4)——sock_create
retval = sock_create(family, type, protocol, &sock); |
下面看sock_create的代码
int sock_create(int family, int type, int protocol, struct socket **res) |
sock_create不过是一个包装函数,它通过__sock_create真正的去创建socket。
struct nsproxy { |
与咱们有关的就是最后一个指针,net_ns。命名空间namespace是linux在2.6中引入的特性,是为了虚拟化而做的。具体定义可以参考 http://oldwiki.linux-vserver.org/Namespaces
static int __sock_create(struct net *net, int family, int type, int protocol, /* /* } |
首先这个函数,先对family和type进行检查,查看是否超出正常范围。
/* Compatibility. This uglymoron is moved from INET layer to here to avoid err = security_socket_create(family, type, protocol, kern); |
首先是对PF_INET,SOCK_PACKET的兼容性处理。 security_socket_create函数是一个空函数,省略。
/* |
static struct inode *alloc_inode(struct super_block *sb) struct inode *new_inode_pseudo(struct super_block *sb) static struct socket *sock_alloc(void) inode = new_inode_pseudo(sock_mnt->mnt_sb); sock = SOCKET_I(inode); kmemcheck_annotate_bitfield(sock, type); percpu_add(sockets_in_use, 1); |
其中sock_mnt是一个全局变量,它在sock_init中被初始化的。并挂载到VFS层上。在sock_alloc函数中,首先是从sock_mnt->mnt_sb即socket的super block中申请一个节点。然后通过SOCKET_I宏,取得inode对应的socket的地址。
struct socket_alloc { |
new_inode中实际上是申请了一个struct socket_alloc的地址,但是返回的确是socket_all->vs_inode的地址。所以在这里需要使用SOCKET_I宏,来从inode地址中,得到socket的地址。
rcu_read_lock(); /* /* Now protected by module ref count */ |
通过RCU机制,获得pf(family)对应的net_families中的指针。
err = pf->create(net, sock, protocol, kern); |
对于TCP/IP来说,family是PF_INET。
static const struct net_proto_family inet_family_ops = { |
所以对于对于TCP/IP的socket来说,sock_create中这里的create函数实际上指向的是inet_create——这个函数明天再说,继续sock_create的代码。
/* /* return 0; |
这几行代码的注释已经很清楚,到此sock_create已经完结。
内核中的UDP socket流程(3)(4)——sock_create相关推荐
- 内核中的UDP socket流程(2)——API “sys_socket”
内核中的UDP socket流程(2)--API "sys_socket" 作者:gfree.wind@gmail.com 原文:http://blog.chinaunix.net ...
- 内核中的UDP socket流程(1)
内核中的UDP socket流程(1) 相对于TCP,UDP协议要简单的多.所以我决定由简入繁,先从UDP协议入手. 前一遍文章已经确定了struct sk_buff被用于socket的接受和发送缓 ...
- 内核中的UDP socket流程(7)——udp_sendmsg
sock_sendmsg的代码很简单 int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) { struct k ...
- 内核中的UDP socket流程(5)——inet_create
进入函数inet_create static int inet_create(struct net *net, struct socket *sock, int protocol, ...
- 内核中的UDP socket流程(6)——sendto
现在开始新的API sendto,那么就重新回到了socket.c文件. SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, l ...
- 内核中的UDP socket流程(11)——ip_append_data
作者:gfree.wind@gmail.com 博客:linuxfocus.blog.chinaunix.net 继续ip_append_data, if (copy > length) cop ...
- 一文讲解Linux内核中根文件系统挂载流程
根文件系统的概念 根文件系统是控制权从linux内核转移到用户空间的一个桥梁.linux内核就类似于一个黑匣子,只向用户提供各种功能的接口,但是功能的具体实现不可见,用户程序通过对这些功能接口的不同整 ...
- linux程序获取透传参数,Linux内核中TCP SACK处理流程分析
frankzfz2014-07-27 17:32 demo121:frankzfz您好: 我想请教一个问题,就是将写好的GenericApp项目(没有配置工具),我加入zigbee协议栈的配置工具后还 ...
- Linux内核网络协议栈8—socket监听
几个问题 了解以下几个问题的同学可以直接忽略下文: 1.listen 库函数主要做了什么? 2. 什么是最大并发连接请求数? 3.什么是等待连接队列? socket 监听相对还是比较简单的,先看 ...
最新文章
- java课堂疑问解答与思考1
- 取消项目git_git取消文件跟踪
- OpenSSL状态机中可选消息的处理
- Redis 6.0 新特性 ACL 介绍
- dfmea文件_技术干货合集「失效分析、PFMEA DFMEA关系、文件结果化」
- 一种定力夹具控制系统
- 【MOOC-生物信息学-蛋白质结构预测与分析】(占坑)
- vsftpd配置详解
- WEB版的即时聊天工具
- 优化方法总结(梯度下降法、牛顿法、拟牛顿法等)
- ISO文件与镜像文件
- 插头DP~(。。。了解了一下下)
- html 打开资源管理器,资源管理器怎么打开 教你如何快速打开资源管理器
- 使用stp制造广播风暴!
- zlib——Usage Example翻译
- Android百度地图SDK:隐藏比例尺,隐藏百度LOGO,隐藏缩放控件
- Kotlin快速学习之路(完整版)
- LSTM做预测遇到的错误总结
- Windows系统怎样配置PHP环境
- 安排软件保护服务在 2022-07-26T23:00:43Z 时重新启动成功。原因: RulesEngine
热门文章
- linux根据进程的运行路径,停止进程
- 数据分箱1——人工手动分箱
- python计算二维平面的曲线的曲率
- Ubuntu 打开 initramfs
- 九 web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解...
- 又一家药企IPO被拒,原因竟然是……
- HDU 1222 Wolf and Rabbit
- xcode 插件安装路径
- BZOJ 1086: [SCOI2005]王室联邦( )
- 云原生和ServiceMesh主要组件--理解K8s/Istio/Envoy