在内核中我们发送数据一般使用dev_queue_xmit. 但是每次都需要通读等待返回, 通过线程的方式, 可以实现异步模式, 无需等待发送完成.可以大大加快发送速度.以下是示例代码:
static int xmit_thread_worker(void *arg); /////////////////////////////////////////////////////////////////////////////// static struct task_struct *xmit_thread = NULL; // 等待线程启动与完成 static struct completion start_done; static struct completion end_done; // 线程状态 static u32 thread_state = 0x0; // 终止线程标记 static volatile u32 xmit_stop = 0x0; // skb发送队列 struct sk_buff_head pkt_xmit; /////////////////////////////////////////////////////////////////////////////// int xmit_thread_init(void) { int rc = 0x0; // 初始化队列与completion skb_queue_head_init( &pkt_xmit ); init_completion( &start_done ); init_completion( &end_done ); // 创建线程 xmit_thread = kthread_create( xmit_thread_worker, NULL, " "); if ( IS_ERR( xmit_thread ) ) { xmit_thread = NULL; pr_err( "kthread_create occur error./n" ); rc = -1; } else { pr_emerg( "kthread_create success./n" ); // 唤醒线程 wake_up_process( xmit_thread ); // 等待线程启动完成 wait_for_completion( &start_done ); pr_emerg( "xmit thread worker run success./n" ); } return rc; } // skb入队列发送 void xmit_enqueue( struct sk_buff *skb ) { // skb 入队列 skb_queue_tail( &pkt_xmit, skb ); if ( NULL != xmit_thread ){ // 唤醒线程 wake_up_process( xmit_thread ); } } // 销毁线程 void xmit_thread_fini(void) { struct sk_buff *skb = NULL; pr_emerg( "wait for xmit thread done/n" ); if ( NULL == xmit_thread ){ return ; } // 设置线程终止标记 xmit_stop = 0x1; // 等待完成 wait_for_completion( &end_done ); // 释放队列中未发送skb do { skb = __skb_dequeue( &pkt_xmit ); if ( NULL != skb ) { kfree_skb( skb ); } }while( NULL != skb ); } static int xmit_thread_worker(void *arg) { struct sk_buff *skb = NULL; // 通知启动完成 complete( &start_done ); while( 1 ) { thread_state = 0x0; // 调度 schedule_timeout_interruptible(2); //__set_current_state(TASK_RUNNING); thread_state = 0x1; // 是否终止? if ( xmit_stop ) { pr_emerg( "%s end./n", __func__ ); break; } do { // 取skb发送队列并发送 skb = skb_dequeue( &pkt_xmit ); if ( NULL != skb ) { dev_queue_xmit( skb ); } // 是否终止? if ( xmit_stop ) { pr_emerg( "%s end./n", __func__ ); goto _out; } }while( NULL != skb ); }; _out: // 通知线程终止 complete( &end_done ); return 0; }
您还没有登录,请您登录后再发表评论
linux数据栈的关键数据结构skb_buf
权威人士根据linux内核进行图解,很全对skb的处理,有arp、ip、等多种报文,还有socket等,很全,很实用
根据linux内核进行图解,很全对skb的处理,有arp、ip、等多种报文,还有socket等,很全,很实用
linux数据栈的关键数据结构skb
kernel_net_chart, 它是Linux内核的skb路径 命令行目无论是用户空间,内核,客户端还是服务器,我总是关注于网络软件开发在这个库中,我尝试尽可能多地描述内核网络模块的细节。现在已经有两个流程图了。kernel_skb_...
linux数据栈的关键数据结构skb-buf.doc
!!!skb释放和分配流程分析
SKB381是SKYLAB基于Silicon Labs方案研发的工业级大功率5.0蓝牙模块,主要用于无线网络通讯中...当建立连接,两设备共同使用一通道也就是同一个串口,一个设备发送数据到通道中,另外一个设备便可以接收通道中的数据。
linux 操作系统的skb_buff 结构的详细介绍
SKYLAB SKB 369 user manual based on nrf52832
SKB369是一款高度集成的蓝牙4.2低功耗模块,专为无线2.4GHz ISM高速率传输设计!...SKB369因其低功耗和低成本而被防范应用在无线传输行业!本文档是SKB369的AT指令集,希望能够帮助到各位工程师们。
linux下网络重要结构skb_buff的包缓冲过程。是了解网络工作原理的很好的资料。
SKB369是一个高度集成的蓝牙4.2BLE模块,设计用于2.4GHzISM频段的高速短距离无线通信。此外,SKB369支持蚂蚁协议。该模块基于北欧nRF52832无线收发器IC,具有32位ARM Cortex-M4F CPU、闪存和模拟及数字外围设备。该...
syncookie、读写分析、NFS实现框架、网络新特性、skb核心操作、HASH算法、过滤框架Nftables、接 收框架、页缓存PageCache、Netfilter框架、处理器架构、中断机制、malloc、free实现原理、内存的 动态、缺页中断、...
Bootloader中使用的所有“srm_”函数在“arch/alpha/lib/”中定义。 以上这种Boot方式是一种最简单的方式,即不需其他工具就能引导Kernel,前提是按照 Makefile的指导,生成bootimage文件,内含以上提到的...
SKYLAB BLE5.0蓝牙模块SKB501基于Nordic nRF52840方案,具有性能良好,功耗低,接收灵敏度高,传输距离远,支持SPI/UART/TWI通信协议,封装小等优点。产品能较好的嵌入到客户产品中,同时满足客户对蓝牙产品再次快速...
SKB378是一个高度集成的蓝牙5.2模组,可用来在2.4GHz ISM频段内做高速率、短距离无线通信。工业级标准,支持主从模式(1主对8从),支持串口透传,AT指令控制,且支持AoA蓝牙高精度室内定位,模组内部集成32位ARM ...
基于Nordic nRF52832 SoC的BLE蓝牙模块SKB369具有最佳低功耗蓝牙性能,并且这款SoC强大自带的硬件浮点运算单元有助于动态心率和运动识别运算准确性的提高,以及较大的内存和存储空间,非常适合可穿戴设备如智能手表...
相关推荐
linux数据栈的关键数据结构skb_buf
权威人士根据linux内核进行图解,很全对skb的处理,有arp、ip、等多种报文,还有socket等,很全,很实用
根据linux内核进行图解,很全对skb的处理,有arp、ip、等多种报文,还有socket等,很全,很实用
linux数据栈的关键数据结构skb
kernel_net_chart, 它是Linux内核的skb路径 命令行目无论是用户空间,内核,客户端还是服务器,我总是关注于网络软件开发在这个库中,我尝试尽可能多地描述内核网络模块的细节。现在已经有两个流程图了。kernel_skb_...
linux数据栈的关键数据结构skb-buf.doc
!!!skb释放和分配流程分析
SKB381是SKYLAB基于Silicon Labs方案研发的工业级大功率5.0蓝牙模块,主要用于无线网络通讯中...当建立连接,两设备共同使用一通道也就是同一个串口,一个设备发送数据到通道中,另外一个设备便可以接收通道中的数据。
linux 操作系统的skb_buff 结构的详细介绍
SKYLAB SKB 369 user manual based on nrf52832
SKB369是一款高度集成的蓝牙4.2低功耗模块,专为无线2.4GHz ISM高速率传输设计!...SKB369因其低功耗和低成本而被防范应用在无线传输行业!本文档是SKB369的AT指令集,希望能够帮助到各位工程师们。
linux下网络重要结构skb_buff的包缓冲过程。是了解网络工作原理的很好的资料。
SKB369是一个高度集成的蓝牙4.2BLE模块,设计用于2.4GHzISM频段的高速短距离无线通信。此外,SKB369支持蚂蚁协议。该模块基于北欧nRF52832无线收发器IC,具有32位ARM Cortex-M4F CPU、闪存和模拟及数字外围设备。该...
syncookie、读写分析、NFS实现框架、网络新特性、skb核心操作、HASH算法、过滤框架Nftables、接 收框架、页缓存PageCache、Netfilter框架、处理器架构、中断机制、malloc、free实现原理、内存的 动态、缺页中断、...
Bootloader中使用的所有“srm_”函数在“arch/alpha/lib/”中定义。 以上这种Boot方式是一种最简单的方式,即不需其他工具就能引导Kernel,前提是按照 Makefile的指导,生成bootimage文件,内含以上提到的...
SKYLAB BLE5.0蓝牙模块SKB501基于Nordic nRF52840方案,具有性能良好,功耗低,接收灵敏度高,传输距离远,支持SPI/UART/TWI通信协议,封装小等优点。产品能较好的嵌入到客户产品中,同时满足客户对蓝牙产品再次快速...
SKB378是一个高度集成的蓝牙5.2模组,可用来在2.4GHz ISM频段内做高速率、短距离无线通信。工业级标准,支持主从模式(1主对8从),支持串口透传,AT指令控制,且支持AoA蓝牙高精度室内定位,模组内部集成32位ARM ...
基于Nordic nRF52832 SoC的BLE蓝牙模块SKB369具有最佳低功耗蓝牙性能,并且这款SoC强大自带的硬件浮点运算单元有助于动态心率和运动识别运算准确性的提高,以及较大的内存和存储空间,非常适合可穿戴设备如智能手表...