Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1919516
  • 博文数量: 376
  • 博客积分: 2147
  • 博客等级: 大尉
  • 技术积分: 3642
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-06 10:47
文章分类

全部博文(376)

文章存档

2019年(3)

2017年(28)

2016年(15)

2015年(17)

2014年(182)

2013年(16)

2012年(115)

我的朋友

分类: 嵌入式

2014-03-07 13:52:29

本文分析基于Linux Kernel 3.2.1

Linux内核中协议族有INET协议族,UNIX协议族等,我们还是以INET协议族为例。

更多请查看

下面是内核中的协议族声明:

  1. /* Supported address families. */  
  2. #define AF_UNSPEC   0   
  3. #define AF_UNIX     1   /* Unix domain sockets      */   
  4. #define AF_LOCAL    1   /* POSIX name for AF_UNIX   */   
  5. #define AF_INET     2   /* Internet IP Protocol     */   
  6. #define AF_AX25     3   /* Amateur Radio AX.25      */   
  7. #define AF_IPX      4   /* Novell IPX           */   
  8. #define AF_APPLETALK    5   /* AppleTalk DDP        */   
  9. #define AF_NETROM   6   /* Amateur Radio NET/ROM    */   
  10. #define AF_BRIDGE   7   /* Multiprotocol bridge     */   
  11. #define AF_ATMPVC   8   /* ATM PVCs         */   
  12. #define AF_X25      9   /* Reserved for X.25 project    */   
  13. #define AF_INET6    10  /* IP version 6         */   
  14. #define AF_ROSE     11  /* Amateur Radio X.25 PLP   */   
  15. #define AF_DECnet   12  /* Reserved for DECnet project  */   
  16. #define AF_NETBEUI  13  /* Reserved for 802.2LLC project*/   
  17. #define AF_SECURITY 14  /* Security callback pseudo AF */   
  18. #define AF_KEY      15      /* PF_KEY key management API */   
  19. #define AF_NETLINK  16   
  20. #define AF_ROUTE    AF_NETLINK /* Alias to emulate 4.4BSD */   
  21. #define AF_PACKET   17  /* Packet family        */   
  22. #define AF_ASH      18  /* Ash              */   
  23. #define AF_ECONET   19  /* Acorn Econet         */   
  24. #define AF_ATMSVC   20  /* ATM SVCs         */   
  25. #define AF_RDS      21  /* RDS sockets          */   
  26. #define AF_SNA      22  /* Linux SNA Project (nutters!) */   
  27. #define AF_IRDA     23  /* IRDA sockets         */   
  28. #define AF_PPPOX    24  /* PPPoX sockets        */   
  29. #define AF_WANPIPE  25  /* Wanpipe API Sockets */   
  30. #define AF_LLC      26  /* Linux LLC            */   
  31. #define AF_CAN      29  /* Controller Area Network      */   
  32. #define AF_TIPC     30  /* TIPC sockets         */   
  33. #define AF_BLUETOOTH    31  /* Bluetooth sockets        */   
  34. #define AF_IUCV     32  /* IUCV sockets         */   
  35. #define AF_RXRPC    33  /* RxRPC sockets        */   
  36. #define AF_ISDN     34  /* mISDN sockets        */   
  37. #define AF_PHONET   35  /* Phonet sockets       */   
  38. #define AF_IEEE802154   36  /* IEEE802154 sockets       */   
  39. #define AF_CAIF     37  /* CAIF sockets         */   
  40. #define AF_ALG      38  /* Algorithm sockets        */   
  41. #define AF_NFC      39  /* NFC sockets          */   
  42. #define AF_MAX      40  /* For now.. */  
内核中的PF_***和AF_***其实可以混用,它的宏定义如下:
  1. /* Protocol families, same as address families. */  
  2. #define PF_UNSPEC   AF_UNSPEC   
  3. #define PF_UNIX     AF_UNIX   
  4. #define PF_LOCAL    AF_LOCAL   
  5. #define PF_INET     AF_INET   
  6. #define PF_AX25     AF_AX25   
  7. #define PF_IPX      AF_IPX   
  8. #define PF_APPLETALK    AF_APPLETALK   
  9. #define PF_NETROM   AF_NETROM   
  10. #define PF_BRIDGE   AF_BRIDGE   
  11. #define PF_ATMPVC   AF_ATMPVC   
  12. #define PF_X25      AF_X25   
  13. #define PF_INET6    AF_INET6   
  14. #define PF_ROSE     AF_ROSE   
  15. #define PF_DECnet   AF_DECnet   
  16. #define PF_NETBEUI  AF_NETBEUI   
  17. #define PF_SECURITY AF_SECURITY   
  18. #define PF_KEY      AF_KEY   
  19. #define PF_NETLINK  AF_NETLINK   
  20. #define PF_ROUTE    AF_ROUTE   
  21. #define PF_PACKET   AF_PACKET   
  22. #define PF_ASH      AF_ASH   
  23. #define PF_ECONET   AF_ECONET   
  24. #define PF_ATMSVC   AF_ATMSVC   
  25. #define PF_RDS      AF_RDS   
  26. #define PF_SNA      AF_SNA   
  27. #define PF_IRDA     AF_IRDA   
  28. #define PF_PPPOX    AF_PPPOX   
  29. #define PF_WANPIPE  AF_WANPIPE   
  30. #define PF_LLC      AF_LLC   
  31. #define PF_CAN      AF_CAN   
  32. #define PF_TIPC     AF_TIPC   
  33. #define PF_BLUETOOTH    AF_BLUETOOTH   
  34. #define PF_IUCV     AF_IUCV   
  35. #define PF_RXRPC    AF_RXRPC   
  36. #define PF_ISDN     AF_ISDN   
  37. #define PF_PHONET   AF_PHONET   
  38. #define PF_IEEE802154   AF_IEEE802154   
  39. #define PF_CAIF     AF_CAIF   
  40. #define PF_ALG      AF_ALG   
  41. #define PF_NFC      AF_NFC   
  42. #define PF_MAX      AF_MAX  
以后的分析就是以INET协议族为例来分析的。

下面的结构体就是在系统初始化时用来管理协议族初始化的结构体:

  1. struct net_proto_family {  
  2.     int     family;  
  3.     int     (*create)(struct net *net, struct socket *sock,  
  4.                   int protocol, int kern);  
  5.     struct module   *owner;  
  6. };  
第一个属性就是协议族的宏定义,如PF_INET;

第二个属性就是协议族对应的初始化函数指针;

INET协议族对应该结构的定义如下:

  1. static const struct net_proto_family inet_family_ops = {  
  2.     .family = PF_INET,  
  3.     .create = inet_create,  
  4.     .owner  = THIS_MODULE,  
  5. };  
下面结构体是协议族操作集结构体定义:
  1. struct proto_ops {  
  2.     int     family;  
  3.     struct module   *owner;  
  4.     int     (*release)   (struct socket *sock);  
  5.     int     (*bind)      (struct socket *sock,  
  6.                       struct sockaddr *myaddr,  
  7.                       int sockaddr_len);  
  8.     int     (*connect)   (struct socket *sock,  
  9.                       struct sockaddr *vaddr,  
  10.                       int sockaddr_len, int flags);  
  11.     int     (*socketpair)(struct socket *sock1,  
  12.                       struct socket *sock2);  
  13.     int     (*accept)    (struct socket *sock,  
  14.                       struct socket *newsock, int flags);  
  15.     int     (*getname)   (struct socket *sock,  
  16.                       struct sockaddr *addr,  
  17.                       int *sockaddr_len, int peer);  
  18.     unsigned int    (*poll)      (struct file *file, struct socket *sock,  
  19.                       struct poll_table_struct *wait);  
  20.     int     (*ioctl)     (struct socket *sock, unsigned int cmd,  
  21.                       unsigned long arg);  
  22. #ifdef CONFIG_COMPAT   
  23.     int     (*compat_ioctl) (struct socket *sock, unsigned int cmd,  
  24.                       unsigned long arg);  
  25. #endif   
  26.     int     (*listen)    (struct socket *sock, int len);  
  27.     int     (*shutdown)  (struct socket *sock, int flags);  
  28.     int     (*setsockopt)(struct socket *sock, int level,  
  29.                       int optname, char __user *optval, unsigned int optlen);  
  30.     int     (*getsockopt)(struct socket *sock, int level,  
  31.                       int optname, char __user *optval, int __user *optlen);  
  32. #ifdef CONFIG_COMPAT   
  33.     int     (*compat_setsockopt)(struct socket *sock, int level,  
  34.                       int optname, char __user *optval, unsigned int optlen);  
  35.     int     (*compat_getsockopt)(struct socket *sock, int level,  
  36.                       int optname, char __user *optval, int __user *optlen);  
  37. #endif   
  38.     int     (*sendmsg)   (struct kiocb *iocb, struct socket *sock,  
  39.                       struct msghdr *m, size_t total_len);  
  40.     int     (*recvmsg)   (struct kiocb *iocb, struct socket *sock,  
  41.                       struct msghdr *m, size_t total_len,  
  42.                       int flags);  
  43.     int     (*mmap)      (struct file *file, struct socket *sock,  
  44.                       struct vm_area_struct * vma);  
  45.     ssize_t     (*sendpage)  (struct socket *sock, struct page *page,  
  46.                       int offset, size_t size, int flags);  
  47.     ssize_t     (*splice_read)(struct socket *sock,  loff_t *ppos,  
  48.                        struct pipe_inode_info *pipe, size_t len, unsigned int flags);  
  49. };  
INET协议族中TCP和UDP协议对应的上述操作集的定义不同:

TCP协议z在INET层操作集inet_stream_ops

  1. const struct proto_ops inet_stream_ops = {  
  2.     .family        = PF_INET,  
  3.     .owner         = THIS_MODULE,  
  4.     .release       = inet_release,  
  5.     .bind          = inet_bind,  
  6.     .connect       = inet_stream_connect,  
  7.     .socketpair    = sock_no_socketpair,  
  8.     .accept        = inet_accept,  
  9.     .getname       = inet_getname,  
  10.     .poll          = tcp_poll,  
  11.     .ioctl         = inet_ioctl,  
  12.     .listen        = inet_listen,  
  13.     .shutdown      = inet_shutdown,  
  14.     .setsockopt    = sock_common_setsockopt,  
  15.     .getsockopt    = sock_common_getsockopt,  
  16.     .sendmsg       = inet_sendmsg,  
  17.     .recvmsg       = inet_recvmsg,  
  18.     .mmap          = sock_no_mmap,  
  19.     .sendpage      = inet_sendpage,  
  20.     .splice_read       = tcp_splice_read,  
  21. #ifdef CONFIG_COMPAT   
  22.     .compat_setsockopt = compat_sock_common_setsockopt,  
  23.     .compat_getsockopt = compat_sock_common_getsockopt,  
  24.     .compat_ioctl      = inet_compat_ioctl,  
  25. #endif   
  26. };  
UDP协议在INET层操作集inet_dgram_ops
  1. const struct proto_ops inet_dgram_ops = {  
  2.     .family        = PF_INET,  
  3.     .owner         = THIS_MODULE,  
  4.     .release       = inet_release,  
  5.     .bind          = inet_bind,  
  6.     .connect       = inet_dgram_connect,  
  7.     .socketpair    = sock_no_socketpair,  
  8.     .accept        = sock_no_accept,  
  9.     .getname       = inet_getname,  
  10.     .poll          = udp_poll,  
  11.     .ioctl         = inet_ioctl,  
  12.     .listen        = sock_no_listen,  
  13.     .shutdown      = inet_shutdown,  
  14.     .setsockopt    = sock_common_setsockopt,  
  15.     .getsockopt    = sock_common_getsockopt,  
  16.     .sendmsg       = inet_sendmsg,  
  17.     .recvmsg       = inet_recvmsg,  
  18.     .mmap          = sock_no_mmap,  
  19.     .sendpage      = inet_sendpage,  
  20. #ifdef CONFIG_COMPAT   
  21.     .compat_setsockopt = compat_sock_common_setsockopt,  
  22.     .compat_getsockopt = compat_sock_common_getsockopt,  
  23.     .compat_ioctl      = inet_compat_ioctl,  
  24. #endif   
  25. };  
上面两个操作集是属于INET协议族层次,可以由协议族层套接字socket来管理,下面是协议族层析的套接字结构体(BSD Socket)定义:
  1. /** 
  2.  *  struct socket - general BSD socket 
  3.  *  @state: socket state (%SS_CONNECTED, etc) 
  4.  *  @type: socket type (%SOCK_STREAM, etc) 
  5.  *  @flags: socket flags (%SOCK_ASYNC_NOSPACE, etc) 
  6.  *  @ops: protocol specific socket operations 
  7.  *  @file: File back pointer for gc 
  8.  *  @sk: internal networking protocol agnostic socket representation 
  9.  *  @wq: wait queue for several uses 
  10.  */  
  11. struct socket {  
  12.     socket_state        state;  
  13.   
  14.     kmemcheck_bitfield_begin(type);  
  15.     short           type;  
  16.     kmemcheck_bitfield_end(type);  
  17.   
  18.     unsigned long       flags;  
  19.   
  20.     struct socket_wq __rcu  *wq;  
  21.   
  22.     struct file     *file;  
  23.     struct sock     *sk;  
  24.     const struct proto_ops  *ops;  
  25. }; 
阅读(3720) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~