Linux内核对三层协议的管理

本文主要讲解了Linux内核对三层协议的管理,使用的内核的版本是2.6.32.27


为了方便理解,

本文采用整体流程图加伪代码的方式

从内核高层面上梳理了Linux内核对三层协议的管理,

希望可以对大家有所帮助。


阅读本文章假设大家对C语言有了一定的了解


三层管理的整体结构图



伪代码和实例

[cpp]  view plain copy
  1. /*协议类型标识符*/  
  2. #define ETH_P_LOOP  0x0060      /* Ethernet Loopback packet */  
  3. #define ETH_P_PUP   0x0200      /* Xerox PUP packet     */  
  4. #define ETH_P_PUPAT 0x0201      /* Xerox PUP Addr Trans packet  */  
  5. #define ETH_P_IP    0x0800      /* Internet Protocol packet */  
  6. #define ETH_P_X25   0x0805      /* CCITT X.25           */  
  7. #define ETH_P_ARP   0x0806      /* Address Resolution packet    */  
  8.   
  9.   
  10. /*每个协议处理都会注册一套这样的结构*/  
  11. struct packet_type {  
  12.     __be16          type;   /* 标明协议的类型 ,当配置为ETH_P_ALL的时候,会放入ptype_all接受所有协议的报文,否则具体的协议会放入ptype_base中*/  
  13.     struct net_device   *dev;   /* NULL 就是收集所有设备的该协议包 ,否则收集指定网络设备的 */  
  14.     int         (*func) (struct sk_buff *,  
  15.                      struct net_device *,  
  16.                      struct packet_type *,  
  17.                      struct net_device *);  /*协议工作的起始点*/  
  18.     void            *af_packet_priv; /*私有数据内容*/  
  19.     struct list_head    list;  
  20. };  
  21.   
  22.   
  23. static struct packet_type ip_packet_type __read_mostly = {  
  24.     .type = cpu_to_be16(ETH_P_IP),  
  25.     .func = ip_rcv,  
  26.     .gso_send_check = inet_gso_send_check,  
  27.     .gso_segment = inet_gso_segment,  
  28.     .gro_receive = inet_gro_receive,  
  29.     .gro_complete = inet_gro_complete,  
  30. };  
  31. static int __init inet_init(void)  
  32. {  
  33.     dev_add_pack(&ip_packet_type); /*使用dev_add_pack将协议结构注册到系统中*/  
  34. }  
  35.   
  36. void dev_add_pack(struct packet_type *pt)  
  37. {  
  38.     /*ETH_P_ALL的放入ptype_all中,其他具体类型的放入ptype_base哈希桶中*/  
  39.     if (pt->type == htons(ETH_P_ALL))  
  40.         list_add_rcu(&pt->list, &ptype_all);  
  41.     else {  
  42.         hash = ntohs(pt->type) & PTYPE_HASH_MASK;  
  43.         list_add_rcu(&pt->list, &ptype_base[hash]);  
  44.     }  
  45.       
  46. }  
  47.   
  48.   
  49. static void ipv6_packet_cleanup(void)  
  50. {  
  51.     dev_remove_pack(&ipv6_packet_type); /*使用dev_remove_pack从协议中注销相应的协议*/  
  52. }  
  53.   
  54. void dev_remove_pack(struct packet_type *pt)  
  55. {  
  56.     /*删除指定的协议处理类型*/  
  57.     __dev_remove_pack(pt);  
  58.     {  
  59.         /*找到所属管理组*/  
  60.         if (pt->type == htons(ETH_P_ALL))  
  61.             head = &ptype_all;  
  62.         else  
  63.             head = &ptype_base[ntohs(pt->type) & PTYPE_HASH_MASK];  
  64.       
  65.         /*删除对应的协议类型*/  
  66.         list_for_each_entry(pt1, head, list) {  
  67.             if (pt == pt1) {  
  68.                 list_del_rcu(&pt->list);  
  69.                 goto out;  
  70.             }  
  71.         }  
  72.     }  
  73. }  

通过上面的讲解,

可以看出LInux对所有的协议都是基于组件性质进行灵活配置,大大提高了系统的可扩展性。


其关键在于成功的提取了struct packet_type的抽象,

所有我们在设计系统的时候,是不是可以对各个模块有个良好统一的接口抽象,

决定了我们的系统是否可以在未来更长的时间里良好的进行特性的扩展


希望大家批评指正


original link:http://blog.csdn.net/eric_liufeng/article/details/10296673

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值