2012-11-05 66 views
3

我正在編寫一個創建IP數據包的內核模塊。現在我想發送這個數據包,但沒有爲它的傳輸創建任何套接字。使用linux-kernel模塊發送UDP數據包而不使用套接字

是否有任何方式直接發送它的內核例程的幫助。

正如我已經跟蹤的數據包傳輸的Linux內核代碼存在命名爲dev_hard_start_xmit()淨/型芯/ dev.c定義的函數。我們可以使用它嗎?

其實我不想使用套接字。

回答

4

你不需要一個套接字在內核中發送一個UDP數據包,你只需要分配一個skb,並自己構造IP頭和UDP頭,最後通過dev_queue_xmit()發送出去。

skb = alloc_skb(len, GFP_ATOMIC); 
if (!skb) 
     return; 

skb_put(skb, len); 

skb_push(skb, sizeof(*udph)); 
skb_reset_transport_header(skb); 
udph = udp_hdr(skb); 
udph->source = htons(....); 
udph->dest = htons(...); 
udph->len = htons(udp_len); 
udph->check = 0; 
udph->check = csum_tcpudp_magic(local_ip, 
           remote_ip, 
           udp_len, IPPROTO_UDP, 
           csum_partial(udph, udp_len, 0)); 

if (udph->check == 0) 
     udph->check = CSUM_MANGLED_0; 

skb_push(skb, sizeof(*iph)); 
skb_reset_network_header(skb); 
iph = ip_hdr(skb); 

/* iph->version = 4; iph->ihl = 5; */ 
put_unaligned(0x45, (unsigned char *)iph); 
iph->tos  = 0; 
put_unaligned(htons(ip_len), &(iph->tot_len)); 
iph->id  = htons(atomic_inc_return(&ip_ident)); 
iph->frag_off = 0; 
iph->ttl  = 64; 
iph->protocol = IPPROTO_UDP; 
iph->check = 0; 
put_unaligned(local_ip, &(iph->saddr)); 
put_unaligned(remote_ip, &(iph->daddr)); 
iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl); 

eth = (struct ethhdr *) skb_push(skb, ETH_HLEN); 
skb_reset_mac_header(skb); 
skb->protocol = eth->h_proto = htons(ETH_P_IP); 
memcpy(eth->h_source, dev->dev_addr, ETH_ALEN); 
memcpy(eth->h_dest, remote_mac, ETH_ALEN); 

skb->dev = dev; 


dev_queue_xmit(skb); 
+0

我正在做同樣的過程,但在傳輸系統變得有點慢..爲什麼發生這種情況我無法找出... plese幫助? – akp

+0

與我同樣的問題。 –

+0

你從哪裏獲得開發結構? –

相關問題