cdc_ncm -> usbnet device -> net_device

enum流程,cdc_ncm的probe中直接调用usbnet_probe,usbnet_probe中会分配network_device和usbnet,并调用cdc_ncm的bind回调进行cdc_ncm的附加descriptor的解析,之后调用init_status对NCM的

第一个interface的interrupt ep进行urb的分配和注册。这个urb的complete的callback会调用cdc_ncm的status回调进行相应处理,主要是两种event, USB_CDC_NOTIFY_NETWORK_CONNECTION和USB_CDC_NOTIFY_SPEED_CHANGE.

USB_CDC_NOTIFY_NETWORK_CONNECTION:根据传来的wValue判断出是disconnect和connect,然后调用netif_carrier_on/netif_carrier_off来通知上层。

USB_CDC_NOTIFY_SPEED_CHANGE:简单的打印一句log而已。

最后注册network_device(register_netdev和netif_device_attach)。

cdc_ncm_bind主要就是根据NCM的descriptor来初始化一个cdc_ncm_ctx对象。

cdc_ncm_check_connect是在ifconfig时调用到了network_device的open函数时候被调用,主要来判断ctx是否为空,因为disconnect的时候,它就会被设置为NULL。

cdc_ncm_manage_power的实现主要就是用来开启/关闭remote wakeup功能的。

接受流程:

rx_submit, 会alloc_skb, 然后usb_fill_bulk_urb,最后usb_submit_urb。

usb_submit_urb如果submit成功,则将skb提交到rxq上。

urb的rx_complete里首先会设置state为rx_done,然后会判断urb->status, 如果是0说明接受成功,state = rx_cleanup。然后调用defer_bh。defer_bh会把skb从rxq上移除,然后将其

加入到done的list中。如果done中的qlen等于1, 则tasklet_schedule(&dev->bh),即usbnet_bh被调用。

usbnet_bh会首先从done中dequeue一个skb,然后判断如果state状态是rx_done,则设置为rx_cleanup,然后调用rx_process去处理。如果是rx_cleanup则free_urb,free_skb。

rx_process会调用driver_info->rx_fixup去让cdc_ncm驱动进行处理,处理完成后,因为cdc_ncm设置了FLAG_MULTI_PACKET,所以直接调用dev_kfree_skb_any去释放掉了skb。如果没有设置,则调用usbnet_skb_return。

cdc_ncm_rx_fixup处理:主要就是将skb中的data,按照NTB格式解析:

1,在NTH中取得NTB length,如果大于cdc_ncm驱动支持的最大size,则返回错误。

2,解析NTH中的wNdpIndex取得第一个NDP的索引。

3,memcpy,将第一个ndp拷贝到rx_ncm.ndp16中

4,接下来解析ndp,首先ndp会包含一个或多个dpe,每个dpe包含一个frame的网络数据。

1019     nframes = ((le16_to_cpu(ctx->rx_ncm.ndp16.wLength) -

1020                     sizeof(struct usb_cdc_ncm_ndp16)) /

1021                     sizeof(struct usb_cdc_ncm_dpe16));

计算出有多少个frames

5,判断nframes是否大于CDC_NCM_DPT_DATAGRAMS_MAX,如果大于则 nframes = CDC_NCM_DPT_DATAGRAMS_MAX;

6,将所有的npe都拷贝到rx_ncm.dpe16中

7,一个for循环,开始解析每一个dpe,对每一个dpe都调用skb_clone创建一个skb备份,然后调用usbnet_skb_return,通过netif_rx将dataparam中的数据,提交给network subsystem。

发送流程:

network_device的ndo_start_xmit:

1,首先调用cdc_ncm的tx_fixup函数。 cdc_ncm_tx_fixup会调用cdc_ncm_fill_tx_frame函数将上层传下来的skb转换为NTB,linux的cdc_ncm的NTB格式为: NTH + NDP + datapayload。其中NDP会包含n个datagram(index+len)。

2,创建urb,并在skb->cb创建skb_data。并处理发送ZLP,就是有些device要求发送一个zero packet来作为结束请求。

3,提交urb,成功返回后,将对应的skb加到txq中,如果txq中的skb大于maxSegmentSize,那么调用netif_stop_queue来告诉上层不要再发数据了,快爆了。

在urb的tx_complete中,最后会调用usbnet_bh,usbnet_bh中最后判断出txq中的skb小于maxSegmentSize后,会调用netif_wake_queue来恢复上层的数据传送。

linux ncm网络性能优化,USB linux NCM usbnet驱动详解相关推荐

  1. Linux内核网络性能优化

    Linux内核网络性能优化 1. 前言 2. Linux网络协议栈 3. DPDK 4. XDP 4.1 XDP主要的特性 4.2 XDP与DPDK的对比 4.3 应用场景 5. CPU负载均衡 5. ...

  2. web常见性能优化总结(浏览器渲染过程详解)

    文章目录 一.什么是web的性能优化 二.web性能优化的目的 三.web性能优化的原理 3.1 加载文档 3.2 生成dom树 3.3 加载css 和js 3.4 生成CSS OM 3.5 rend ...

  3. 通过/proc/sys/net/ipv4/优化Linux下网络性能

    通过/proc/sys/net/ipv4/优化Linux下网络性能 /proc/sys/net/ipv4/优化 1)      /proc/sys/net/ipv4/ip_forward 该文件表示是 ...

  4. Linux进程调度与性能优化 | 真货

    作者简介: 张毅峰,某主机厂架构师. 一.eBPF安全可观测性的前景展望 本次分享将从监控和可观测性.eBPF安全可观测性分析.内核安全可观测性展望三个方面展开. 1.监控(Monitoring)vs ...

  5. php调用linux摄像头,Linux_Linux中开发USB摄像头驱动详解,USB摄像头以其良好的性能和低 - phpStudy...

    Linux中开发USB摄像头驱动详解 USB摄像头以其良好的性能和低廉的价格得到广泛应用.同时因其灵活.方便的特性,易于集成到嵌入式系统中.但是如果使用现有的符合Video for Linux标准的驱 ...

  6. 44 | 套路篇:网络性能优化的几个思路(下)

    在优化网络的性能时,你可以结合 Linux 系统的网络协议栈和网络收发流程,然后从应用程序.套接字.传输层.网络层再到链路层等每个层次,进行逐层优化.上一期我们主要学习了应用程序和套接字的优化思路,比 ...

  7. 43 | 套路篇:网络性能优化的几个思路(上)

    上一节,我们了解了 NAT(网络地址转换)的原理,学会了如何排查 NAT 带来的性能问题,最后还总结了 NAT 性能优化的基本思路.我先带你简单回顾一下. NAT 基于 Linux 内核的连接跟踪机制 ...

  8. 服务器性能优化之网络性能优化

    hi ,大家好,今天分享一篇后台服务器性能优化之网络性能优化,希望大家对Linux网络有更深的理解. 曾几何时,一切都是那么简单.网卡很慢,只有一个队列.当数据包到达时,网卡通过DMA复制数据包并发送 ...

  9. 网络性能优化的几个思路

    本文是通过学习倪朋飞老师的<Linux性能优化实战> :网络性能优化的几个思路? 网络性能优化的几个思路 确定优化目标 网络性能工具 网络性能优化 应用程序 套接字 网络性能优化 传输层 ...

  10. Linux内核网络数据发送(六)——网络设备驱动

    Linux内核网络数据发送(六)--网络设备驱动 1. 前言 2. 驱动回调函数注册 3. `ndo_start_xmit` 发送数据 4. `igb_tx_map` 1. 前言 本文主要介绍设备通过 ...

最新文章

  1. Sharepoint学习笔记—架构系列
  2. work2的code和问题
  3. 电脑如何进入bios模式_华硕笔记本电脑开机自动进入BIOS界面怎么办?
  4. 最新25个高质量PSD素材免费下载
  5. JAVA阻塞队列LinkedBlockingQueue 以及非阻塞队列ConcurrentLinkedQueue 的区别
  6. OpenModelica.VehicleInterfaces离线库安装
  7. 量化投资03---小市值轮动因子---准备工作01
  8. vscode左侧文件不同颜色标识含义
  9. 华理计算机专硕奖学金,华东理工大学研究生课程学习奖学金评定方法(试行)
  10. 图文笔记,带你走进《未来简史》(11-15)
  11. 风之王纳什,言念君子,温其如玉
  12. react navigation 中使用goBack()跳转到指定页面
  13. 百度地图实现鼠标绘制多边形并获取所有点坐标
  14. 解决Ubuntu系统下启动root账户后Linux版本edge浏览器无法启动
  15. dell笔记本如何关闭计算机更新,联想戴尔笔记本Win10如何彻底永久关闭更新?
  16. Hyperledger Fabric国密改造
  17. 篮球社交小程序开发功能
  18. 谷歌seo外链预算方案,影响谷歌反向链接成本的因素
  19. 机器学习_4.隐马尔可夫模型初识
  20. 【阿朱2万字长文】我做大型企业技术创新顾问的一点经验总结

热门文章

  1. 加性噪声--传递概率密度函数=噪声概率密度函数
  2. 如何快速获得Q币(python简单实现)
  3. mac u盘linux 双系统安装教程,苹果电脑怎么安装双系统 苹果电脑安装双系统教程...
  4. 下载chrome插件离线包
  5. C#个人邮箱发邮件给多个邮箱
  6. 使用腾讯云上传图片,并给图片加水印
  7. Modbus_TCP网关与组态王连接方法
  8. Excel常用电子表格公式大全【汇总篇】
  9. pscc2021绿色免安装完整版
  10. VMware安装CentOS7以及CentOS官网下载自选镜像