簡體   English   中英

使用linux-kernel模塊發送UDP數據包而不使用套接字

[英]UDP packet send with linux-kernel module without using sockets

我正在編寫一個創建IP數據包的內核模塊。 現在我想發送這個數據包,但沒有為它的傳輸創建任何套接字。

有沒有辦法在內核例程的幫助下直接發送它。

因為我已經跟蹤了用於數據包傳輸的linux內核代碼,所以在net / core / dev.c中定義了一個名為dev_hard_start_xmit()的函數。 我們可以用嗎?

其實我不想使用套接字。

您不需要套接字在內核中發送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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM