接着上一篇文件:使用PF_PACKET和SOCK_RAW发送自己定义type以太网数据包

上一篇文章我们使用wireshare抓包。尽管在Linux下也能够使用抓包工具,可是我打算自己动手,在内核添加以太网处理类型。

先上码:

#include <linux/module.h>
#include <linux/skbuff.h>
#include <linux/netdevice.h>
#include <net/rtnetlink.h>
#include <net/netns/generic.h>
#include <linux/etherdevice.h>

#define DRV_VERSION "0.1"

const char brcm_fullname[] = "BRCM Support";
const char brcm_version[] = DRV_VERSION;
static const char brcm_copyright[] = "dean <350532197>";
static const char brcm_buggyright[] = "dean <350532197>";
void hook_func(struct sk_buff *skb)
{
    struct sk_buff *sb = skb;
    struct ethhdr *eth;
    eth=eth_hdr(sb);

    printk(KERN_INFO "SRC MAC: %pM\n",&eth->h_source);
    printk(KERN_INFO "DST MAC: %pM\n",&eth->h_dest);
    printk(KERN_INFO "MAC protocol: %04x\n",ntohs(eth->h_proto));
    printk(KERN_INFO "Date length=%d, Data=%s\n",sb->len,sb->data);
}

int brcm_skb_recv(struct sk_buff *skb, struct net_device *dev,
 struct packet_type *ptype, struct net_device *orig_dev)
{
      hook_func(skb);
kfree_skb(skb);
return NET_RX_DROP;
}

static struct packet_type brcm_packet_type __read_mostly = {
.type = cpu_to_be16(0x8874),
.func = brcm_skb_recv, /* BRCM receive method */
};

static int __init brcm_proto_init(void)
{
pr_info("%s v%s %s\n", brcm_fullname, brcm_version, brcm_copyright);
pr_info("All bugs added by %s\n", brcm_buggyright);
dev_add_pack(&brcm_packet_type);
return 0;
}

static void __exit brcm_cleanup_module(void)
{
dev_remove_pack(&brcm_packet_type);
}

module_init(brcm_proto_init);
module_exit(brcm_cleanup_module);

MODULE_LICENSE("GPL");
MODULE_VERSION(DRV_VERSION);

编译载入执行:

/tmp # insmod my_brcm.ko 
[ 8961.342368] BRCM Support v0.1 dean <350532197>
[ 8961.349598] All bugs added by dean <350532197>
/tmp # [ 8981.887476] SRC MAC: 00:15:17:28:e4:06
[ 8981.891233] DST MAC: 00:0b:82:27:fd:e4
[ 8981.894999] MAC protocol: 8874
[ 8981.898057] Date length=46, Data=hello world!

client使用使用PF_PACKET和SOCK_RAW发送自己定义type以太网数据包编译出来的软件发送helloworld。

能够看出。此模块正确获取到数据包。

感谢yoyo的文章Linux内核实践 - 怎样加入网络协议

http://blog.csdn.net/qy532846454/article/details/6627536

使用dev_add_pack注冊新的以太网类型的更多相关文章

  1. WordPress改动新用户注冊邮件内容--自己定义插件

    有些开放用户注冊功能的WordPress站点,可能有这么一项需求,就是用户注冊成功后,系统会分别给站点管理员和新用户发送一封通知邮件.给管理员发送的是新用户的username和Email,给刚刚注冊的 ...

  2. WordPress公布新文章Email通知注冊用户

    非常多WordPress博客都开放了用户注冊的功能,用户能够參与到博客的内容建设其中来.也就是一个博客由多个用户来写.如今有这种需求,怎样实如今某一个用户发表文章后.其它用户都能收到Email通知?以 ...

  3. c++ 操作注冊表

    1.       注冊表简单介绍 注冊表是为Windows NT和Windows95中全部32位硬件/驱动和32位应用程序设计的数据文件,用于存储系统和应用程序的设置信息.16位驱动在Winnt (W ...

  4. Android应用程序注冊广播接收器(registerReceiver)的过程分析

    前面我们介绍了Android系统的广播机制,从本质来说,它是一种消息订阅/公布机制,因此,使用这样的消息驱动模型的第一步便是订阅消息:而对Android应用程序来说,订阅消息事实上就是注冊广播接收器, ...

  5. EtherType :以太网类型字段及值

    Ethernet II即DIX 2.0:Xerox与DEC.Intel在1982年制定的以太网标准帧格式.Cisco名称为:ARPA Ethernet II类型以太网帧的最小长度为64字节(6+6+2 ...

  6. Android Binder分析二:Natvie Service的注冊

    这一章我们通过MediaPlayerService的注冊来说明怎样在Native层通过binder向ServiceManager注冊一个service,以及client怎样通过binder向Servi ...

  7. Spring Boot 使用Java代码创建Bean并注冊到Spring中

    从 Spring3.0 開始,添加了一种新的途经来配置Bean Definition,这就是通过 Java Code 配置 Bean Definition. 与Xml和Annotation两种配置方式 ...

  8. 《解读window核心编程》 之 注冊表

    1 注冊表的作用及组织形式 Windows系统使用注冊表来存储系统和应用程序配置数据.非常多系统和应用程序重要的配置的信息都存储在注冊表中. 注冊表是一种以树型结构组织的数据库.树的每个节点称 作键( ...

  9. 从注冊流程 分析怎样安全退出多个Activity 多种方式(附DEMO)

    前言 因为一个同学问到我怎样依照一个流程走好之后回到首页.我曾经看到过4个解决方式,后来发现有做个记录和总结的必要,就写了这篇博文. (之前看小强也写过一篇,这里通过自身的分析完整的总结一下下面6种方 ...

随机推荐

  1. flask jinja的宏

    form中关于表单的定义 class AreaListForm(Form): area1 = BooleanField(u'1区', default=False) area2 = BooleanFie ...

  2. 独家揭秘,106岁的IBM靠什么完成了世纪大转型|钛度专访

    IBM大中华区董事长陈黎明 到2017年2月,陈黎明就担任IBM大中华区董事长整整两年了. 五年前,IBM历史上首位女CEO也是第9位CEO罗睿兰上任,三年前,IBM在罗睿兰的带领下以数据与分析.云. ...

  3. Core Java 4

    p272~p273 1.除捕获异常外的另一种异常处理方式:将异常继续传递给方法调用者. 即:在方法首部添加throws说明符号,取代 try catch语句. 对于方法的调用者而言:要么处理异常,要么 ...

  4. linux及安全期中总结——20135227黄晓妍

    Linux及安全期中总结 黄晓妍 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ...

  5. python常见容器属性和方法

    `````字符串中反斜杠字符表 转义格式    意义 \'  单引号(') \"  双引号(") \\  反斜杠(\ ) \n  换行 \r  返回光标至行首 \f  换页 \t ...

  6. [翻译]将智能指针用于C++的类成员

    http://stackoverflow.com/questions/15648844/using-smart-pointers-for-class-members Question: I'm hav ...

  7. python 删除字典元素

    myDict = {,,,} print(myDict) if 'a' in myDict: del myDict['a'] print(myDict)

  8. python 字典添加元素

    d = {:, :} print(d) d.update({:}) print(d)

  9. ListBox的虚拟可视化技术

    在ListBox中承载大量的数据项时,可采用虚拟可视化技术来提高控件显示数据的性能.如下代码: <ListBox.ItemsPanel>                    <It ...

  10. HDU - 4812 D Tree 点分治

    http://acm.hdu.edu.cn/showproblem.php?pid=4812 题意:有一棵树,每个点有一个权值要求找最小的一对点,路径上的乘积mod1e6+3为k 题解:点分治,挨个把 ...