我正在编写一个内核模块,用于接收 Linux 2.6.31 的以太网数据包,我想从struct sk_buff
传递给func
函数的指针中提取以太网数据包的内容,struct packet_type
该函数由dev_add_pack
. 我应该参考结构的哪个成员?当我发送一个 46 字节正文的以太网数据包时,skb->data - skb->head
分别为 48 和skb->len
46,其中skb
是指向struct sk_buff
.
问问题
1899 次
2 回答
0
您可以使用 netfilter 挂钩功能。这是我的示例代码。
static unsigned int hook_func(unsigned int hooknum,
struct sk_buff *pskb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff*)) {
int ret = 110;
int x = 0;
struct net_device * dev;
struct ethhdr *neth_hdr = NULL;
if(strcmp(in->name,"lo0") == 0){
return NF_ACCEPT;
}
if(!pskb){
return NF_ACCEPT;
}
struct iphdr* iph = ip_hdr(pskb);
if(!(iph)){
return NF_ACCEPT;
}
if(iph->ttl == 0xFF){
return NF_ACCEPT;
}
if(iph->protocol == 6){
struct tcphdr *tcp = tcp_hdr(pskb);
if(tcp == NULL){
return NF_ACCEPT;
}
if(ntohs(tcp->dest) == 80){
if(tcp->syn == 1){
printk(KERN_DEBUG "Packet TCP SYN\n");
return NF_ACCEPT;
}
}
}
return NF_ACCEPT;
}
int init_module(void) {
nfho.hook = hook_func;
nfho.pf = PF_INET;
nfho.hooknum = NF_INET_PRE_ROUTING;
nfho.priority = NF_IP_PRI_FIRST;
thrqueue = create_workqueue(WQ_NAME1);
INIT_WORK(&thread, thread_function);
return nf_register_hook(&nfho);
}
void cleanup_module() {
nf_unregister_hook(&nfho);
}
于 2017-01-17T14:39:04.563 回答
-1
您可以从 sk_buff 结构中提取数据...
char buff[1024];
int i=0;
//printk("******start of the data*******\n");
while(i<((skb->tail)-(skb->data)))
buff[i]=(char *)((skb->data)[i]);
缓冲区的大小可能不同,或者您可以根据需要定义它。
& 在这个缓冲区中,实际上您已经复制了带有标题或没有标题加上实际数据包有效负载的数据。这取决于您在哪里捕获 sk_buff(我的意思是在哪一层)。因为随着数据包从套接字到 NIC 或从 NIC 到套接字 sk_buff 的相关字段被更新。
于 2012-11-06T10:09:37.480 回答