我正在編寫一個接收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
的指針。在sk_buff中接收以太網數據包
0
A
回答
-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]);
緩衝器的大小可以不同或爲u願意,你可以定義它。
&在這個緩衝區中,實際上你已經複製了帶有標題或無標題的數據加上實際的數據包有效載荷。 這取決於你在哪裏捕捉sk_buff(我的意思是在哪一層)。 因爲數據包從套接字到NIC或從NIC到套接字sk_buff的相關字段被更新。
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);
}
相關問題
- 1. 接收原始以太網數據包c
- 2. 接收Linux中的以太網數據包,並在C中有多個EthTypes
- 3. Python - 在以太網數據包中發送/接收一個numpy陣列
- 4. 在定義的以太網接口上發送數據包
- 5. NSURLRequest太晚接收數據
- 6. 從UDP端口接收以太網幀
- 7. 在Linux中使用C++過濾以太網數據包Ubuntu
- 8. 如何在Windows中將無線數據包轉發到以太網接口?
- 9. epoll可以接收udp數據包嗎?
- 10. 在UDP中接收數據包 - Java
- 11. 在android中接收UDP數據包
- 12. 如何在Ruby中將以太網數據包發送到網絡中?
- 13. 在WiFi網絡中無法使用jpcap接收數據包
- 14. 發送數據包但未在局域網中接收
- 15. 在OSX上的TAP接口上過濾以太網數據包(ICMP,Bonjour)
- 16. Windows RT App不接收UDP數據報包。以太網在我的也沒有DatagramSample由微軟
- 17. Mulesoft Http:請求 - 接收錯誤:HTTP數據包頭太大
- 18. 1千兆位以太網中的巨型數據包 - 幫助
- 19. SFML TCP數據包接收
- 20. Arduino以太網C#客戶端沒有收到數據
- 21. 在Objective-C接收原始的以太網幀
- 22. 從struct sk_buff提取數據
- 23. sk_buff copy&sk_buff clone
- 24. 在指定的網卡上接收udp數據包c#
- 25. 發送和在互聯網上接收數據包
- 26. 在我的數據包收聽器中未收到數據包
- 27. 使網絡接口接收(聽到)數據包
- 28. 在Android上接收UDP數據包
- 29. 在linux下接收亂序數據包
- 30. Scapy:IPv6數據包正在作爲原始數據包接收