首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux 网络中断下半部处理

在 上一篇文章 中,我们介绍了网卡接收和发过数据在 Linux 内核中的处理过程,我们先来回顾一下网卡接收和发送数据的过程,如 图1 所示: ?...函数的参数就是要上送给网络协议栈的数据包,netif_rx 函数主要完成以下几个工作: 获取当前 CPU 的待处理的数据包队列,在 Linux 内核初始化时,会为每个 CPU 创建一个待处理数据包队列...netif_rx 函数的处理过程如 图2 所示: ?...图2 netif_rx 函数的处理过程 所以,netif_rx 函数的主要工作就是把接收到的数据包添加到待处理队列中,并且启动网络中断下半部处理。...对于 Linux 内核的中断处理机制可以参考我们之前的文章 Linux中断处理,这里就不详细介绍了。在本文中,我们只需要知道网络中断下半部处理例程为 net_rx_action 函数即可。

2.2K50
您找到你想要的搜索结果了吗?
是的
没有找到

127.0.0.1 之本机网络通信过程知多少 ?!

我们拆解完了 Linux 网络包的接收过程,也搞定了网络包的发送过程。内核收发网络包整体流程就算是摸清楚了。...1.2 跨机数据接收 当数据包到达另外一台机器的时候,Linux 数据包的接收过程开始了。 当网卡收到数据以后,CPU发起一个中断,以通知 CPU 有数据到达。...我们在 Linux 上使用命令名可以查看到这两个路由表, 这里只看 local 路由表(因为本机网络 IO 查询到这个表就终止了)。...if (likely(netif_rx(skb) == NET_RX_SUCCESS)) { } } 在 skb_orphan 中先是把 skb 上的 socket 指针去掉了(剥离了出来)。...接着调用 netif_rx,在该方法中 中最终会执行到 enqueue_to_backlog 中(netif_rx -> netif_rx_internal -> enqueue_to_backlog)

1.2K30

不为人知的网络编程(十三):深入操作系统,彻底搞懂127.0.0.1本机网络通信

3.2 跨机数据接收 当数据包到达另外一台机器的时候,Linux 数据包的接收过程开始了(更详细的讲解可以看看《深入操作系统,从内核理解网络包的接收过程(Linux篇)》)。...我们在 Linux 上使用命令名可以查看到这两个路由表, 这里只看 local 路由表(因为本机网络 IO 查询到这个表就终止了)。...loopback_xmit(struct sk_buff *skb, struct net_device *dev) {  //剥离掉和原 socket 的联系  skb_orphan(skb);  //调用netif_rx... if(likely(netif_rx(skb) == NET_RX_SUCCESS)) {  } } 在 skb_orphan 中先是把 skb 上的 socket 指针去掉了(剥离了出来)。...接着调用 netif_rx,在该方法中 中最终会执行到 enqueue_to_backlog 中(netif_rx -> netif_rx_internal -> enqueue_to_backlog)

1.3K30

Linux 网卡数据收发过程分析

所以,当网卡接收到数据包后,要通知 Linux 内核有数据需要处理。另外,网卡驱动应该提供让 Linux 内核把数据把发送出去的接口。...net_device 结构是 Linux 为了适配不同类型的网卡设备而抽象出来的对象,不同的网卡驱动只需要按 Linux 的规范来填充 net_device 结构的各个成员变量,Linux 内核就能够识别出网卡...当网卡从网络接收到数据包后,需要产生一个中断来通知 Linux 内核有数据包需要处理,而 irq 就是网卡驱动注册到内核中断服务的中断号。...)); skb->protocol = eth_type_trans(skb, dev); // 从以太网头部中获取网络层协议类型 netif_rx...调用 netif_rx 函数将数据包上送给内核网络协议栈。 当把数据包上送给内核网络协议栈后,数据包的处理就由内核接管。

2.3K30

轻松理解 Docker 网络虚拟化基础之 veth 设备!

虽然我自认为把原生 Linux 网络实现过程理解的还算不错了。但在看网络虚拟化相关的技术的时候,还是觉得不是很容易。 不过,飞哥有绝招,那就是先挑个软柿子来捏。...在 Linux 下,我们可以通过使用 ip 命令创建一对儿 veth。其中 link 表示 link layer的意思,即链路层。...网络包发送过程》和《图解Linux网络包接收过程》两篇文章中,我们系统介绍了 Linux 网络包的收发过程。...return netif_rx(skb); } 先调用了 eth_type_trans 将 skb 的所属设备改为了刚刚取到的 veth 的对端设备 rcv。...在该方法中最终会执行到 enqueue_to_backlog 中(netif_rx -> netif_rx_internal -> enqueue_to_backlog)。

71420

Linux 网络设备驱动开发(一) —— linux内核网络分层结构

Linux内核对网络驱动程序使用统一的接口,并且对于网络设备采用面向对象的思想设计。    Linux内核采用分层结构处理网络数据包。...在Linux内核,所有的网络设备都被抽象为一个接口处理,该接口提供了所有的网络操作。    net_device结构表示网络设备在内核中的情况,也就是网络设备接口。...Linux内核有一个dev_base的全局指针,指向一个设备链表,包括了系统内的所有网络设备。该设备链表每个节点是一个网络设备。   ...net_device结构保存在include/linux/netdevices.h头文件,理解该结构对理解网络设备驱动有很大帮助。   ...dm9000_rx()函数收到数据包完成后,内核会继续调用 netif_rx()函数,函数的作用是把网卡接收到数据提交给协议栈处理。

1.8K21

Linux Device Drivers》 第十七章 网络驱动程序——note

基本介绍 第三类是标准的网络接口Linux设备,本章介绍的内核,其余的交互网络接口描述 网络接口,必须使用特定的内核数据结构本身注册,与外部分组交换数据线打电话时准备 经常使用的文件上的网络接口操作是没有意义的...>) FDDI设备使用alloc_fddidev() 令牌环设备使用alloc_trdev() register_netdev...该结构定义在中 传递经全hard_start_xmit的套接字缓冲区包括了物理数据包,并拥有完整的传输层数据包头 该传输函数仅仅运行了对数据包的一致性检查。...驱动程序更新其统计计数器 接收数据包过程中的最后一个步骤由netif_rx运行 中断处理例程 接口在两种可能的事件下中断处理器 新数据包到达 外发数据包的传输已经完毕 通常中断例程通过检查物理设备中的状态寄存器...从如今開始启动轮询接口 用netif_receive_skb函数将数据包传递给内核,而不是使用netif_rx 调用netif_rx_complete关闭轮询函数 链路状态的改变 大多数涉及实际的物理连接的网络技术提供载波状态信息

68340

Docker 网络基础 | 虚拟网络设备对(veth)原理

所以,Linux 内核提供了 虚拟网络设备对(veth) 这个功能,用于解决不同网络命名空间之间的通信。...当然,本文的主题是 veth 的实现,而不是 网桥 的现实,所以对 网桥 的介绍就此结束,有兴趣可以参考《Linux网桥工作原理与实现》一文。...虚拟网络设备对实现 在 Linux 内核中,使用 net_device 对象来表示一个网络设备。由于 veth 提供双向通信的功能,所以需要使用两个 net_device 对象来实现。...虽然 Linux 内核使用 net_device 对象来表示一个网络设备,但由于不同厂商的网络设备可能存在各种差异,所以为了让 Linux 内核能够适应各种网络设备,故为不同的网络设备提供私有数据的存储空间...// 将数据包的接收设备设置为对端设备 skb->protocol = eth_type_trans(skb, rcv); ... // 将数据包上送给内核协议栈 netif_rx

4.4K11
领券