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



推荐阅读
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
  • STM32代码编写STM32端不需要写关于连接MQTT服务器的代码,连接的工作交给ESP8266来做,STM32只需要通过串口接收和发送数据,间接的与服务器交互。串口三配置串口一已 ... [详细]
  • Exploring issues and solutions when defining multiple Faust agents programmatically. ... [详细]
  • 本文将详细介绍如何配置并整合MVP架构、Retrofit网络请求库、Dagger2依赖注入框架以及RxAndroid响应式编程库,构建高效、模块化的Android应用。 ... [详细]
  • 本文探讨了Android系统中联系人数据库的设计,特别是AbstractContactsProvider类的作用与实现。文章提供了对源代码的详细分析,并解释了该类如何支持跨数据库操作及事务处理。源代码可从官方Android网站下载。 ... [详细]
  • 我在尝试将组合框转换为具有自动完成功能时遇到了一个问题,即页面上的列表框也被转换成了自动完成下拉框,而不是保持原有的多选列表框形式。 ... [详细]
  • 本文详细介绍了如何在PHP中使用Memcached进行数据缓存,包括服务器连接、数据操作、高级功能等。 ... [详细]
  • selenium通过JS语法操作页面元素
    做过web测试的小伙伴们都知道,web元素现在很多是JS写的,那么既然是JS写的,可以通过JS语言去操作页面,来帮助我们操作一些selenium不能覆盖的功能。问题来了我们能否通过 ... [详细]
  • 汇总了2023年7月7日最新的网络安全新闻和技术更新,包括最新的漏洞披露、工具发布及安全事件。 ... [详细]
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • 本文详细介绍了在MyBatis框架中如何通过#和$两种方式来传递SQL查询参数。使用#方式可以提高执行效率,而使用$则有助于在复杂SQL语句中更好地查看日志。此外,文章还探讨了不同场景下的参数传递方法,包括实体对象、基本数据类型以及混合参数的使用。 ... [详细]
  • 本文介绍了如何利用OpenID查询特定砍价活动的所有参与者信息,包括获取每个参与者的唯一标识符。这将帮助开发者更好地管理和分析用户在团购砍价活动中的行为。 ... [详细]
  • 本文详细探讨了select和epoll两种I/O多路复用技术的内部实现原理,分析了它们在处理大量文件描述符时的性能差异,并通过具体示例代码展示了select的工作流程。 ... [详细]
  • Linux内核中的内存反碎片技术解析
    本文深入探讨了Linux内核中实现的内存反碎片技术,包括其历史发展、关键概念如虚拟可移动区域以及具体的内存碎片整理策略。旨在为开发者提供全面的技术理解。 ... [详细]
  • 在CentOS 7中部署Nginx并配置SSL证书
    本文详细介绍了如何在CentOS 7操作系统上安装Nginx服务器,并配置SSL证书以增强网站的安全性。适合初学者和中级用户参考。 ... [详细]
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社区 版权所有