在内核中我们发送数据一般使用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队列发送数据相关推荐

  1. Visual Studio 2013开发 mini-filter driver step by step 内核中使用线程(7)

    在内核中使用线程,其过程和在应用层中使用线程基本类似,创建线程的API为 NTSTATUS PsCreateSystemThread(_Out_ PHANDLE ThreadHandle,_In_ U ...

  2. linux 多线程看门狗,X86平台的看门狗驱动,在内核中开线程喂狗

    1.X86平台的看门狗驱动: 相关文件为:drivers/watchdog/iTCO_wdt.c 相关配置选项为: Device Drivers  ---> [*] Watchdog Timer ...

  3. 【Linux 内核】进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库与 Linux 内核中进程相关概念 | Linux 查看进程命令及输出字段解析 )

    文章目录 一.进程特殊形式 ( 内核线程 | 用户线程 ) 二.C 标准库与 Linux 内核中进程相关概念 三.Linux 查看进程命令及输出字段解析 一.进程特殊形式 ( 内核线程 | 用户线程 ...

  4. 操作系统多线程实现_操作系统中的线程实现

    操作系统多线程实现 Each process has an address space. There is one thread of control in every traditional OS. ...

  5. 驱动开发:内核中实现Dump进程转储

    多数ARK反内核工具中都存在驱动级别的内存转存功能,该功能可以将应用层中运行进程的内存镜像转存到特定目录下,内存转存功能在应对加壳程序的分析尤为重要,当进程在内存中解码后,我们可以很容易的将内存镜像导 ...

  6. java异步线程数_spring异步service中处理线程数限制详解

    情况简介 spring项目,controller异步调用service的方法,产生大量并发. 具体业务: 前台同时传入大量待翻译的单词,后台业务接收单词,并调用百度翻译接口翻译接收单词并将翻译结果保存 ...

  7. 驱动开发笔记1—内核中的事件、进程、线程、自旋锁

    内核模式下的等待 KeWaitForSingleObject() 和 KeWaitForMultipleObjects() NTSTATUS KeWaitForSingleObject(IN PVOI ...

  8. linux设置sfq队列参数,Linux内核中流量控制(5)

    本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性, 5.5 SFQ(Stochastic Fairness Queueing discipline ...

  9. linux下查看mysql线程_linux-如何查看线程在哪个CPU内核中运行?

    linux-如何查看线程在哪个CPU内核中运行? 在Linux中,假设线程的pid是[pid],则从目录/ proc / [pid]中我们可以获得许多有用的信息. 例如,这些proc文件/ proc ...

  10. linux内核中如何修改skb报文

    前言 在内核开发中,我们很多时候需要修改linux网络数据包的内容.那么怎样修改skb报文才正确?这个问题在网上的资料讲解的不是很全,下面是我这几天梳理的步骤 skb修改数据包流程 -内核代码中有许多 ...

最新文章

  1. 用Python爬一爬那些年你硬盘存过的老师们,太方便啦!
  2. 线段树/树状数组问题 | 问题集合
  3. HTML5会成为移动互联网应用开发的未来吗?
  4. docker 部署 redis
  5. python中的operator库
  6. tp剩余未验证内容-7
  7. android tomtom gps location,TomTom智能地图修正 规避不能走的路
  8. echarts词云图形状_用Python 3.8绘制词云图就这么20行代码
  9. 201671010406 丁家辉《英文文本统计分析》结对项目报告
  10. spark性能调优05-troubleshooting处理
  11. R-CNN学习笔记1:Selective Search for Object Recognition
  12. html5 选择收货地址,基于layer.js实现收货地址弹框选择然后返回相应的地址信息...
  13. 2022年中国工业机器人市场现状研究分析与发展前景预测报告
  14. 边缘计算卸载matlab仿真,移动边缘计算卸载技术简介
  15. React中ref的三种获取方式
  16. python中函数的定义通常会从关键字_4.7. 深入 Python 函数定义
  17. c#Winform自定义控件-目录
  18. 驻极体式MIC电路设计
  19. 智能化测试技术探索与实践——AAAS/IEEE Fellow、北京大学讲席教授谢涛阿里行
  20. java 实现pdf 转word去除水印和去除页数限制

热门文章

  1. 二进制 八进制 十进制 十六进制
  2. BZOJ3669[NOI2014] 魔法森林
  3. Vuex的官方文档笔记
  4. actions vuex 请求_vuex中actions请求的数据提交给mutations,组件中获取到参数如何根据参数操作下面...
  5. 云优后台提交显示parsererror_Web测试必备技能——F12定位bug属于前端还是后台
  6. supersocket缓冲区_SuperSocket基础二
  7. java jxl包_Java开源20个项目,最好别错过,帮助你灵活应对面试师的刁难
  8. java实现对称加密—基本实现
  9. stm32CubeMx lwip + freeRTOS
  10. 6 Django的视图层