热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

协议处理函数

2019独角兽企业重金招聘Python工程师标准网络协议栈处理整体结构执行正确的协议处理函数就每种网络协议而言,无论其所在的分层如何,都有一个初始

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

网络协议栈处理整体结构

image 执行正确的协议处理函数

就每种网络协议而言,无论其所在的分层如何,都有一个初始化函数。其中包括L3协议、链路层协议等等。就静态包含在内核中的协议而言,初始化函数会在引导期间执行;就编译成模块的协议而言,当模块加载时,初始化函数就会执行。此函数会分配内部数据结构,通知其他子系统有关该协议的存在,在/proc中注册文件等等。有一项关键任务是在内核注册一个处理函数,以处理该协议的流量。

协议处理函数的组织

 

image

1: struct packet_type {

2: __be16 type; /* This is really htons(ether_type). */

3: struct net_device *dev; /* NULL is wildcarded here */为NULL时指代所有的设备

4: int (*func) (struct sk_buff *,

5: struct net_device *,

6: struct packet_type *,

7: struct net_device *);

8: struct sk_buff *(*gso_segment)(struct sk_buff *skb,

9: netdev_features_t features);

10: int (*gso_send_check)(struct sk_buff *skb);

11: struct sk_buff **(*gro_receive)(struct sk_buff **head,

12: struct sk_buff *skb);

13: int (*gro_complete)(struct sk_buff *skb);

14: void *af_packet_priv;由PF_PACKET套接字使用,指向于packet_type结构建立相关联的sock数据结构。

15: struct list_head list;冲突消除链表

16: };

1: void dev_add_pack(struct packet_type *pt)

2: {

3: struct list_head *head = ptype_head(pt);

4:  

5: spin_lock(&ptype_lock);

6: list_add_rcu(&pt->list, head);

7: spin_unlock(&ptype_lock);

8: }

9: EXPORT_SYMBOL(dev_add_pack);

1: void __dev_remove_pack(struct packet_type *pt)

2: {

3: struct list_head *head = ptype_head(pt);

4: struct packet_type *pt1;

5:  

6: spin_lock(&ptype_lock);

7:  

8: list_for_each_entry(pt1, head, list) {

9: if (pt == pt1) {

10: list_del_rcu(&pt->list);

11: goto out;

12: }

13: }

14:  

15: printk(KERN_WARNING "dev_remove_pack: %p not found.\n", pt);

16: out:

17: spin_unlock(&ptype_lock);

18: }

19: EXPORT_SYMBOL(__dev_remove_pack);

协议值确定

1: /**

2: * eth_type_trans - determine the packet's protocol ID.

3: * @skb: received socket data

4: * @dev: receiving network device

5: *

6: * The rule here is that we

7: * assume 802.3 if the type field is short enough to be a length.

8: * This is normal practice and works for any 'now in use' protocol.

9: */

10: __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev)

11: {

12: struct ethhdr *eth;

13:  

14: skb->dev = dev;

15: skb_reset_mac_header(skb);

16: skb_pull_inline(skb, ETH_HLEN);

17: eth = eth_hdr(skb);

18:  

19: if (unlikely(is_multicast_ether_addr(eth->h_dest))) {

20: if (!compare_ether_addr_64bits(eth->h_dest, dev->broadcast))

21: skb->pkt_type = PACKET_BROADCAST;

22: else

23: skb->pkt_type = PACKET_MULTICAST;

24: }

25:  

26: /*

27: * This ALLMULTI check should be redundant by 1.4

28: * so don't forget to remove it.

29: *

30: * Seems, you forgot to remove it. All silly devices

31: * seems to set IFF_PROMISC.

32: */

33:  

34: else if (1 /*dev->flags&IFF_PROMISC */ ) {

35: if (unlikely(compare_ether_addr_64bits(eth->h_dest, dev->dev_addr)))

36: = PACKET_OTHERHOST;

37: }

38:  

39: /*

40: * Some variants of DSA tagging don't have an ethertype field

41: * at all, so we check here whether one of those tagging

42: * variants has been configured on the receiving interface,

43: * and if so, set skb->protocol without looking at the packet.

44: */

45: if (netdev_uses_dsa_tags(dev))

46: return htons(ETH_P_DSA);

47: if (netdev_uses_trailer_tags(dev))

48: return htons(ETH_P_TRAILER);

49:  

50:

52:  

53: /*

54: * This is a magic hack to spot IPX packets. Older Novell breaks

55: * the protocol design and runs IPX over 802.3 without an 802.2 LLC

56: * layer. We look for FFFF which isn't a used 802.2 SSAP/DSAP. This

57: * won't work for fault tolerant netware but does for the rest.

58: */

59: if (skb->len >= 2 && *(unsigned short *)(skb->data) == 0xFFFF)

60: return htons(ETH_P_802_3);

61:  

62: /*

63: * Real 802.2 LLC

64: */

65: return htons(ETH_P_802_2);

66: }

67: EXPORT_SYMBOL(eth_type_trans);

 

image


转:https://my.oschina.net/longscu/blog/57714



推荐阅读
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • Python字典推导式及循环列表生成字典方法
    本文介绍了Python中使用字典推导式和循环列表生成字典的方法,包括通过循环列表生成相应的字典,并给出了执行结果。详细讲解了代码实现过程。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
author-avatar
芳芳的地盘1990
这个家伙很懒,什么也没留下!
RankList | 热门文章