内核中的UDP socket流程(2)——API “sys_socket”

作者:gfree.wind@gmail.com
原文:http://blog.chinaunix.net/u3/116859/showart.php?id=2445122
前面已经列出了UDP常用的4个API,那么下面从第一个API “sys_socket”开始

1272 SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
1273 {
1274     int retval;
1275     struct socket *sock;
1276     int flags;
1277
1278     /* Check the SOCK_* constants for consistency. */
1279     BUILD_BUG_ON(SOCK_CLOEXEC != O_CLOEXEC);
1280     BUILD_BUG_ON((SOCK_MAX | SOCK_TYPE_MASK) != SOCK_TYPE_MASK);
1281     BUILD_BUG_ON(SOCK_CLOEXEC & SOCK_TYPE_MASK);
1282     BUILD_BUG_ON(SOCK_NONBLOCK & SOCK_TYPE_MASK);
1283
1284     flags = type & ~SOCK_TYPE_MASK;
1285     if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
1286         return -EINVAL;
1287     type &= SOCK_TYPE_MASK;
1288
1289     if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK))
1290         flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK;
1291
1292     retval = sock_create(family, type, protocol, &sock);
1293     if (retval 0)
1294         goto out;
1295
1296     retval = sock_map_fd(sock, flags & (O_CLOEXEC | O_NONBLOCK));
1297     if (retval 0)
1298         goto out_release;
1299
1300 out:
1301     /* It may be already another descriptor 8) Not kernel problem. */
1302     return retval;
1303
1304 out_release:
1305     sock_release(sock);
1306     return retval;
1307 }

1272行:使用宏SYSCALL_DEFINE3定义了内核export出来的API “sys_socket”,参数是int family, int type, 和int protocol。
1279~1282行:对于这些常量作出编译期间的检查。
1284~1286行:在linux2.6.27以前的版本,参数int type只能取真正的socket type的值,即下面的

enum sock_type {
    SOCK_STREAM    = 1,
    SOCK_DGRAM    = 2,
    SOCK_RAW    = 3,
    SOCK_RDM    = 4,
    SOCK_SEQPACKET    = 5,
    SOCK_DCCP    = 6,
    SOCK_PACKET    = 10,
};

但是在Linux 2.6.27版本以后,type有了第二个用途,它可以或上下面的两个数,来指定socket的行为。

#define SOCK_CLOEXEC    O_CLOEXEC
#ifndef SOCK_NONBLOCK
#define SOCK_NONBLOCK    O_NONBLOCK
#endif

所以,1284行到1286行,是为了检测是否type是否只set了上面两个位。如果不是的话,即为非法的type,返回错误EINVAL。

1287行:获得真正的type值
1289~1290行:如果socket的NOBLOCK标志位不等于普通的文件描述符标志的NOBLOCK标志,且该socket设置了SOCK_NONBLOCK,那么就取消这个SOCK_NONBLOCK标志位,并设置上O_NONBLOCK标志位。
在sock_create之后,我们获得了一个socket,然后调用sock_map_fd,将其映射为文件描述符,并将这个描述符返回给用户。
今天又晚了。。。正在看sock_create的代码,明天继续吧。

内核中的UDP socket流程(2)——API “sys_socket”相关推荐

  1. 内核中的UDP socket流程(1)

    内核中的UDP socket流程(1)  相对于TCP,UDP协议要简单的多.所以我决定由简入繁,先从UDP协议入手. 前一遍文章已经确定了struct sk_buff被用于socket的接受和发送缓 ...

  2. 内核中的UDP socket流程(7)——udp_sendmsg

    sock_sendmsg的代码很简单 int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) { struct k ...

  3. 内核中的UDP socket流程(5)——inet_create

    进入函数inet_create static int inet_create(struct net *net, struct socket *sock, int protocol,           ...

  4. 内核中的UDP socket流程(3)(4)——sock_create

    好了,闲话少说.上次看到了sys_socket调用sock_create的地方了.下面开始研究sock_create了. sys_socket将自己的参数family, type, protocol传 ...

  5. 内核中的UDP socket流程(6)——sendto

    现在开始新的API sendto,那么就重新回到了socket.c文件. SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, l ...

  6. 内核中的UDP socket流程(11)——ip_append_data

    作者:gfree.wind@gmail.com 博客:linuxfocus.blog.chinaunix.net 继续ip_append_data, if (copy > length) cop ...

  7. 一文讲解Linux内核中根文件系统挂载流程

    根文件系统的概念 根文件系统是控制权从linux内核转移到用户空间的一个桥梁.linux内核就类似于一个黑匣子,只向用户提供各种功能的接口,但是功能的具体实现不可见,用户程序通过对这些功能接口的不同整 ...

  8. linux程序获取透传参数,Linux内核中TCP SACK处理流程分析

    frankzfz2014-07-27 17:32 demo121:frankzfz您好: 我想请教一个问题,就是将写好的GenericApp项目(没有配置工具),我加入zigbee协议栈的配置工具后还 ...

  9. Linux内核网络协议栈8—socket监听

    几个问题  了解以下几个问题的同学可以直接忽略下文: 1.listen 库函数主要做了什么?  2. 什么是最大并发连接请求数?  3.什么是等待连接队列? socket 监听相对还是比较简单的,先看 ...

最新文章

  1. C 一个数组删除一项 并且移位
  2. 网络推广外包——网络推广外包指出新站上线前一定要做好自我检测
  3. JSON 是个什么??!!!
  4. spock测试_使用Spock测试您的代码
  5. zip unzip_zip和unzip上的Java要点
  6. C++经典问题:如果对象A中有对象成员B,对象B没有默认构造函数,那么对象A必须在初始化列表中初始化对象B?
  7. Android kernel Crash后,定位出错点的方法
  8. 傅奎:十年安全路,一颗好奇心
  9. [转载] Java中的字符串处理
  10. 用计算机字符写名字,NSIS:把计算机名转换为大写或小写字符
  11. URI和URL、URN的区别
  12. 设置word07标题样式
  13. 表格里加横线一分为二_我告诉你excel表格分割线一分为二
  14. python3基础知识复习 -- 进程,线程,多任务讲解
  15. word如何给数学公式编号
  16. Google glog
  17. Paxos 与拜占庭将军问题
  18. JAVA—— JQuery
  19. Command 模式——读书笔记
  20. MD5是摘要算法,摘要算法和加密算法区别

热门文章

  1. PetaPoco 快速上手
  2. windows 10 常用快捷键
  3. 解决WebClient或HttpWebRequest首次连接缓慢问题
  4. SpringMvc 事务的注解配置、实现、挂起
  5. 计算时间差的Oracle函数
  6. hdu 3265 线段树扫描线(拆分矩形)
  7. hdu4911 简单树状数组
  8. hdu4869 费马小+快速幂
  9. POJ 3461 KMP
  10. CSS中的BFC机制