在内核中使用线程与skb队列发送数据
在内核中我们发送数据一般使用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; }
在内核中使用线程与skb队列发送数据相关推荐
- Visual Studio 2013开发 mini-filter driver step by step 内核中使用线程(7)
在内核中使用线程,其过程和在应用层中使用线程基本类似,创建线程的API为 NTSTATUS PsCreateSystemThread(_Out_ PHANDLE ThreadHandle,_In_ U ...
- linux 多线程看门狗,X86平台的看门狗驱动,在内核中开线程喂狗
1.X86平台的看门狗驱动: 相关文件为:drivers/watchdog/iTCO_wdt.c 相关配置选项为: Device Drivers ---> [*] Watchdog Timer ...
- 【Linux 内核】进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库与 Linux 内核中进程相关概念 | Linux 查看进程命令及输出字段解析 )
文章目录 一.进程特殊形式 ( 内核线程 | 用户线程 ) 二.C 标准库与 Linux 内核中进程相关概念 三.Linux 查看进程命令及输出字段解析 一.进程特殊形式 ( 内核线程 | 用户线程 ...
- 操作系统多线程实现_操作系统中的线程实现
操作系统多线程实现 Each process has an address space. There is one thread of control in every traditional OS. ...
- 驱动开发:内核中实现Dump进程转储
多数ARK反内核工具中都存在驱动级别的内存转存功能,该功能可以将应用层中运行进程的内存镜像转存到特定目录下,内存转存功能在应对加壳程序的分析尤为重要,当进程在内存中解码后,我们可以很容易的将内存镜像导 ...
- java异步线程数_spring异步service中处理线程数限制详解
情况简介 spring项目,controller异步调用service的方法,产生大量并发. 具体业务: 前台同时传入大量待翻译的单词,后台业务接收单词,并调用百度翻译接口翻译接收单词并将翻译结果保存 ...
- 驱动开发笔记1—内核中的事件、进程、线程、自旋锁
内核模式下的等待 KeWaitForSingleObject() 和 KeWaitForMultipleObjects() NTSTATUS KeWaitForSingleObject(IN PVOI ...
- linux设置sfq队列参数,Linux内核中流量控制(5)
本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性, 5.5 SFQ(Stochastic Fairness Queueing discipline ...
- linux下查看mysql线程_linux-如何查看线程在哪个CPU内核中运行?
linux-如何查看线程在哪个CPU内核中运行? 在Linux中,假设线程的pid是[pid],则从目录/ proc / [pid]中我们可以获得许多有用的信息. 例如,这些proc文件/ proc ...
- linux内核中如何修改skb报文
前言 在内核开发中,我们很多时候需要修改linux网络数据包的内容.那么怎样修改skb报文才正确?这个问题在网上的资料讲解的不是很全,下面是我这几天梳理的步骤 skb修改数据包流程 -内核代码中有许多 ...
最新文章
- 用Python爬一爬那些年你硬盘存过的老师们,太方便啦!
- 线段树/树状数组问题 | 问题集合
- HTML5会成为移动互联网应用开发的未来吗?
- docker 部署 redis
- python中的operator库
- tp剩余未验证内容-7
- android tomtom gps location,TomTom智能地图修正 规避不能走的路
- echarts词云图形状_用Python 3.8绘制词云图就这么20行代码
- 201671010406 丁家辉《英文文本统计分析》结对项目报告
- spark性能调优05-troubleshooting处理
- R-CNN学习笔记1:Selective Search for Object Recognition
- html5 选择收货地址,基于layer.js实现收货地址弹框选择然后返回相应的地址信息...
- 2022年中国工业机器人市场现状研究分析与发展前景预测报告
- 边缘计算卸载matlab仿真,移动边缘计算卸载技术简介
- React中ref的三种获取方式
- python中函数的定义通常会从关键字_4.7. 深入 Python 函数定义
- c#Winform自定义控件-目录
- 驻极体式MIC电路设计
- 智能化测试技术探索与实践——AAAS/IEEE Fellow、北京大学讲席教授谢涛阿里行
- java 实现pdf 转word去除水印和去除页数限制
热门文章
- 二进制 八进制 十进制 十六进制
- BZOJ3669[NOI2014] 魔法森林
- Vuex的官方文档笔记
- actions vuex 请求_vuex中actions请求的数据提交给mutations,组件中获取到参数如何根据参数操作下面...
- 云优后台提交显示parsererror_Web测试必备技能——F12定位bug属于前端还是后台
- supersocket缓冲区_SuperSocket基础二
- java jxl包_Java开源20个项目,最好别错过,帮助你灵活应对面试师的刁难
- java实现对称加密—基本实现
- stm32CubeMx lwip + freeRTOS
- 6 Django的视图层