dev_queue_xmit 发生了什么?skb还会在哪里缓存
见 codebox/net/qdisk/xmit.log中保存了一份记录
调用关系
sch_direct_xmit --> dev_hard_start_xmit --> xmit_one --> netdev_start_xmit -->__netdev_start_xmit ---> ops->ndo_start_xmit --> e1000_xmit_frame
可以好好看看e1000_xmit_frame函数的实现,这是驱动的代码.
也就是时候从ip_finish_local一路下来就到驱动了
6506 0) | ip_finish_output() {
6507 0) 0.023 us | ipv4_mtu();
6508 0) | ip_finish_output2() {
6509 0) 0.027 us | skb_push();
6510 0) | dev_queue_xmit() {
6511 0) | __dev_queue_xmit() {
6512 0) 0.035 us | dst_release();
6513 0) 0.151 us | netdev_pick_tx();
6514 0) 0.029 us | _raw_spin_lock();
6515 0) | sch_direct_xmit() {
6516 0) | validate_xmit_skb_list() {
6517 0) | validate_xmit_skb.isra.97.part.98() {
6518 0) | netif_skb_features() {
6519 0) 0.024 us | passthru_features_check();
6520 0) 0.026 us | skb_network_protocol();
6521 0) 0.788 us | }
6522 0) 1.137 us | }
6523 0) 1.453 us | }
6524 0) 0.024 us | _raw_spin_lock();
6525 0) | dev_hard_start_xmit() {
6526 0) | e1000_xmit_frame [e1000e]() {
6527 0) 0.151 us | e1000_maybe_stop_tx [e1000e]();
6528 0) 0.028 us | e1000_maybe_stop_tx [e1000e]();
6529 0) 2.932 us | }
6530 0) 3.668 us | }
6531 0) 0.026 us | _raw_spin_lock();
6532 0) 6.545 us | }
6533 0) 0.038 us | __local_bh_enable_ip();
6534 0) 9.135 us | }
6535 0) 9.525 us | }
6536 0) 0.039 us | __local_bh_enable_ip();
6537 0) + 10.858 us | }
6538 0) + 11.445 us | }
dev_queue_xmit 发生了什么?skb还会在哪里缓存的更多相关文章
- 缓存服务,还未创建完缓存时, 需要更改图层名称、服务名称、数据源位置、mxd名称等
缓存服务,还未创建完缓存时, 需要更改图层名称.服务名称.数据源位置.mxd名称等.已经创建好的缓存还可以再用吗? 测试后可以, 注意:新服务相对旧服务,符号样式没有改变,切片方案没有变化. 测试步骤 ...
- skb_reserve(skb,2)中的2的意义
skb_reserve() skb_reserve()在数据缓存区头部预留一定的空间,通常被用来在数据缓存区中插入协议首部或者在某个边界上对齐.它并没有把数据移出或移入数据缓存区,而只是简单地更新了数 ...
- 有关项目依赖包发生 Manifest Merge 冲突的详细解决方案
安卓开发使用 Gradle 插件管理依赖包确实非常方便,尤其是在解决一些依赖冲突的问题上.比如,重复依赖的问题,具体内容请我之前写的一篇文章: 有关 Android Studio 重复引入包的问题和解 ...
- 转:Linux内部的时钟处理机制全面剖析
Linux内部的时钟处理机制全面剖析 在 Linux 操作系统中,很多活动都和时间有关,例如:进程调度和网络处理等等.所以说,了解 Linux 操作系统中的时钟处理机制有助于更好地了解 Linux 操 ...
- ARP 实现
ARP 实现 现在我们介绍一下arp的实现,内核版本2.6.24. [数据结构] 协议栈通过ARP协议获取到的网络上邻居主机的IP地址与MAC地址的对应关 系都会保存在这个表中,以备下次与邻居通讯时使 ...
- TCP的发送系列 — tcp_sendmsg()的实现(一)
主要内容:Socket发送函数在TCP层的实现 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 上一篇blog讲的是send().sendto().sen ...
- Selective Acknowledgment 选项 浅析 2
来自:http://abcdxyzk.github.io/blog/2013/09/06/kernel-net-sack/ static int tcp_sacktag_write_queue(str ...
- linux tcp Nagle算法,TCP_NODELAY和TCP_CORK 转载
转载自: http://www.cnhalo.net/2016/08/13/linux-tcp-nagle-cork/ http://abcdxyzk.github.io/blog/2018/07/0 ...
- IP 层收发报文简要剖析5--ip报文发送2
udp 发送ip段报文接口ip_append_data ip_append_data 函数主要用来udp 套接字以及raw套接字发送报文的接口.在tcp中发送ack 以及rest段的ip_send_u ...
随机推荐
- Jenkins中Publish Over SSH插件使用
Publish Over SSH插件安装 进入插件管理安装插件,我这里已经安装过了所以在installed里面,没安装过去available里面搜索. 系统设置中配置Publish Over SSH ...
- NB-IOT使用LWM2M移动onenet基础通信套件对接之APN设置
1. 先搞懂APN是做什么的?APN指一种网络接入技术,是通过手机上网时必须配置的一个参数,它决定了手机通过哪种接入方式来访问网络.对于手机用户来说,可以访问的外部网络类型有很多,例如:Interne ...
- 探索 Flask
探索 Flask 探索 Flask 是一本关于使用 Flask 开发 Web 应用程序的最佳实践和模式的书籍.这本书是由 426 名赞助人 在 Kickstarter 上 于 2013 年 7 月资助 ...
- 两个有序数组合并成一个有序数组(要求时间复杂度为O(n))
面试题: 怎样把两个有序数组合并成有序数组呢 逻辑步骤: 1.假设两个数组为A和B 2.A和B都是从小到大的顺序进行排列 ** 1.我们可以直接比较两个数组的首元素,哪个小就把这个小元素放入可变数组. ...
- iOS的内存分配
iOS中的内存大致可以分为代码区,全局/静态区,常量区,堆区,栈区. 1.代码区 代码段是用来存放可执行文件的操作指令(存放函数的二进制代码),也就是说是它是可执行程序在内存中的镜像.代码段需要防止在 ...
- InnoDB意向锁和插入意向锁
Preface Last night one buddy in tech wechat group asked "what's intention locks of Inno ...
- Iview 表单提交: Cannot read property 'validate' of undefined
提交表单时,提示报这个错,找了半天,然后也百度了很久,一直没找到答案,代码如下: <link href="~/lib/iview3.1.4/styles/iview.css" ...
- Bootstrap栅格系统基本使用
1.什么是栅格系统: 在Bootstrap中,它提供了一套响应式.移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列.栅格系统用于通过一系列的行(row ...
- 手机端网页返回顶部js代码
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" cont ...
- 【shell 练习5】编写简单的多级菜单
一.简单的多级菜单 [root@web129 ~]# cat menu.sh #!/bin/bash #shell菜单演示 function menu() { echo -e `date` cat & ...