使用dev_queue_xmit傳送定製報文
msn :
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配置檔案中新增以下內容 進行郵箱...