使用dev queue xmit傳送定製報文

2021-05-04 05:36:29 字數 3478 閱讀 7079

使用dev_queue_xmit傳送定製報文

msn :

[email protected]

necofang.cublog.cn

本文通過例項講述如何使用dev_queue_xmit來直接傳送udp和tcp報文。示例**在linux-2.6.24上可以編譯執行。

**注:

的確不錯,

基本可以執行,我用的fdora 8, 2.6.23.1-42-fc8, 

核心api有點不同dev_get_by_name(char * name)

udp那裡是icmp包,源192.168.1.10 -> 目的 192.168.1.197 的echo ping request

使用這還需自己改改

===========我 是 分 割 線 ===========================

用於除錯的**: 

#define msg_debug(msg...) printk(kern_info "cup: " msg)

#define ip_parts_native(n) /

(unsigned int)((n)&0xff),                         /

(unsigned int)((n)>>8)&0xff,                    /

(unsigned int)((n)>>16)&0xff,                   /

(unsigned int)((n)>>24)&0xff

#define xmit(skb, rt)                              /

nf_hook(pf_inet, nf_ip_local_out, (skb), null,  /

(rt)->u.dst.dev, dst_output);     

void dump_block(char *s, caddr_t bb, int len)

printk(" %02x", b[i]);

if(!((i + 1) % 16))

}if(i % 16)

}void print_ip(struct iphdr *ip)

skb destroy

void cup_destroy (struct sk_buff *skb)

tcp輸出

int cp_dev_xmit_tcp (char * eth, u_char * smac, u_char * dmac,

u_char * pkt, int pkt_len,

u_long sip, u_long dip,

u_short sport, u_short dport, u_long seq, u_long ack_seq, u_char psh, u_char fin)

skb->csum = skb_checksum (skb, iph->ihl*4, skb->len - iph->ihl * 4, 0);

tcph->check = csum_tcpudp_magic (sip, dip, skb->len - iph->ihl * 4, ipproto_tcp, skb->csum);

ip_send_check(iph);

skb->mac_header = skb_push (skb, 14);

print_ip ((struct iphdr *)skb->network_header);

dump_block ("before xmit", skb->data, skb->len);

if (0 > dev_queue_xmit(skb)) goto out;

msg_debug ("dev_queue_xmit succ/n");

msg_debug ("skb->len = %d/n", skb->len);

nret = 0;

out:

if (0 != nret && null != skb)

return (nret);}

udp輸出

void my_cup (void)

; //eth

u_char pkt_ip [20] = ; //ip

u_char pkt_icmp [8] = ;

u_char pkt_data [56] = ;

msg_debug ("send /n");

dev = dev_get_by_name (&init_net , "eth2");

msg_debug ("dev name : %s/n", dev->name);

skb = alloc_skb (100, gfp_atomic);

//skb = dev_alloc_skb (100);

if (null == skb) return;

skb->dev = dev;

skb->pkt_type = packet_otherhost;//packet_outgoing;

skb->protocol = __constant_htons(eth_p_ip);

skb->ip_summed = checksum_none;

skb->destructor = cup_destroy;

skb->priority = 0;

skb_reserve (skb, 16);

memcpy (skb_push (skb, 14), pkt_eth, 14);

skb->network_header = skb_put (skb, sizeof (struct iphdr));

memcpy (skb->network_header, pkt_ip, sizeof (struct iphdr));

skb->transport_header = skb_put (skb, sizeof (struct icmphdr));

memcpy (skb->transport_header, pkt_icmp, sizeof (struct icmphdr));

memcpy (skb_put (skb, 56), pkt_data, 56);

msg_debug ("skb->network_header = %p /n", skb->network_header);

msg_debug ("skb->data %p /n", skb->data);

msg_debug ("skb->tail %p /n", skb->tail);

skb->tail = skb->data + 98;

msg_debug ("skb->tail %p /n", skb->tail);

print_ip ((struct iphdr *)skb->network_header);

dump_block ("before xmit", skb->data, skb->len);

if (0 > dev_queue_xmit(skb))

else

return;

}

使用dev queue xmit傳送定製報文

使用dev queue xmit傳送定製報文 msn necofang hotmail.com necofang.cublog.cn 本文通過例項講述如何使用dev queue xmit來直接傳送udp和tcp報文。示例 在linux 2.6.24上可以編譯執行。注 的確不錯,基本可以執行,我用的f...

redis發發發發

涉及搶購 秒殺 搶票等活動時,為了避免超賣,那麼庫存數量是有限的,但是如果同時下單人數超過了庫存數量,就會導致商品超賣問題。那麼我們怎麼來解決這個問題呢,我的思路如下 偽 sql1 查詢商品庫存 if 庫存數量 0 當沒有併發時,上面的流程看起來是再正常不過了,假設同時兩個人下單,而庫存只有1個了,...

Thinkphp使用PHPMailer傳送郵件

一 郵箱前期準備 註冊完之後,就要去開啟 pop3 smtp imap服務。在開啟服務時,需要客戶端授權密碼 記住這個授權密碼!服務開啟後,如果設定 姓名 在寫郵件傳送時會提示設定 姓名 後才能傳送郵件,當然也可以提前設定好 二 部分 修改配置檔案 向conf.php配置檔案中新增以下內容 進行郵箱...