Chinaunix首页 | 论坛 | 博客
  • 博客访问: 160488
  • 博文数量: 33
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-26 20:59
文章分类
文章存档

2015年(33)

我的朋友

分类: LINUX

2015-01-01 21:57:07

原文地址:打印skb内容的一小段代码 作者:ojhsky

代码为:

点击(此处)折叠或打开

  1. if (skb)
  2.     {
  3.              char *buf = skb->data;
  4.              int len = skb->len;
  5.              int i;
  6.  
  7.              printk("[%s:%d]Packet length = %#4x\n", __FUNCTION__, __LINE__, len);
  8.              for (i = 0; i < len; i++){
  9.                      if (i % 16 == 0) printk("%#4.4x", i);
  10.                      if (i % 2 == 0) printk(" ");
  11.                      printk("%2.2x", ((unsigned char *)buf)[i]);
  12.                     if (i % 16 == 15) printk("\n");
  13.              }
  14.              printk("\n\n\n\n");
  15.      }

这段代码可以插入到内核任意定义了skb的地方,调试skb很是方便,我每次想在skb处理路径的某个地方看skb的内容时,直接把这段代码拷贝&粘贴。

不过话说回来,自从我开始整理的自己的知识库后,发觉自己变懒了,很多时候都是首先这么想:“要实现我要的功能是不是有现成的代码呢?”,不知道这算是退化还是进化。之所以说可能是退化,是因为面试会比较失败,尼玛不知道完整的代码怎么写了呀。



在另外一个内核版本上,上的打印代码回打不全,因为skb->data指针被移动过了,所以得用下面这段:

  1. if (skb)
  2. {
  3.      char *buf = (char *)(skb->mac_header);
  4.      int len = skb->len;
  5.      int i;

  6.      printk("[%s:%d]Packet length = %#4x\n", __FUNCTION__, __LINE__, len);
  7.      for (i = 0; i < len; i++){
  8.              if (i % 16 == 0) printk("%#4.4x", i);
  9.              if (i % 2 == 0) printk(" ");
  10.              printk("%2.2x", ((unsigned char *)buf)[i]);
  11.             if (i % 16 == 15) printk("\n");
  12.      }
  13.      printk("\n\n\n\n");
  14. }



阅读(1525) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:linux模块导出符号 EXPORT_SYMBOL_GPL EXPORT_SYMBOL

给主人留下些什么吧!~~