热门标签 | 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



推荐阅读
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Firefox火狐浏览器关闭到http://detectportal.firefox.com的流量问题解决办法
    本文介绍了使用Firefox火狐浏览器时出现关闭到http://detectportal.firefox.com的流量问题,并提供了解决办法。问题的本质是因为火狐默认开启了Captive portal技术,当连接需要认证的WiFi时,火狐会跳出认证界面。通过修改about:config中的network.captive-portal-service.en的值为false,可以解决该问题。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • MPLS VP恩 后门链路shamlink实验及配置步骤
    本文介绍了MPLS VP恩 后门链路shamlink的实验步骤及配置过程,包括拓扑、CE1、PE1、P1、P2、PE2和CE2的配置。详细讲解了shamlink实验的目的和操作步骤,帮助读者理解和实践该技术。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 解决github访问慢的问题的方法集锦
    本文总结了国内用户在访问github网站时可能遇到的加载慢的问题,并提供了解决方法,其中包括修改hosts文件来加速访问。 ... [详细]
  • 本文介绍了如何在Mac上使用Pillow库加载不同于默认字体和大小的字体,并提供了一个简单的示例代码。通过该示例,读者可以了解如何在Python中使用Pillow库来写入不同字体的文本。同时,本文也解决了在Mac上使用Pillow库加载字体时可能遇到的问题。读者可以根据本文提供的示例代码,轻松实现在Mac上使用Pillow库加载不同字体的功能。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • Centos7搭建ELK(Elasticsearch、Logstash、Kibana)教程及注意事项
    本文介绍了在Centos7上搭建ELK(Elasticsearch、Logstash、Kibana)的详细步骤,包括下载安装包、安装Elasticsearch、创建用户、修改配置文件等。同时提供了使用华为镜像站下载安装包的方法,并强调了保证版本一致的重要性。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • Python已成为全球最受欢迎的编程语言之一,然而Python程序的安全运行存在一定的风险。本文介绍了Python程序安全运行需要满足的三个条件,即系统路径上的每个条目都处于安全的位置、"主脚本"所在的目录始终位于系统路径中、若python命令使用-c和-m选项,调用程序的目录也必须是安全的。同时,文章还提出了一些预防措施,如避免将下载文件夹作为当前工作目录、使用pip所在路径而不是直接使用python命令等。对于初学Python的读者来说,这些内容将有所帮助。 ... [详细]
  • 本文介绍了在Android Studio中使用命令行build gradle的方法,并解决了一些常见问题,包括手动配置gradle环境变量和解决External Native Build Issues的方法。同时提供了相关参考文章链接。 ... [详细]
author-avatar
芳芳的地盘1990
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有