USB linux NCM usbnet驱动详解

2024-05-27 11:58
文章标签 linux 详解 驱动 usb ncm usbnet

本文主要是介绍USB linux NCM usbnet驱动详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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来恢复上层的数据传送。

这篇关于USB linux NCM usbnet驱动详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1007412

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念