亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区
Chinaunix
標(biāo)題:
dev_queue_xmit 死機(jī),小白求幫助
[打印本頁(yè)]
作者:
qq452739204
時(shí)間:
2015-11-04 13:26
標(biāo)題:
dev_queue_xmit 死機(jī),小白求幫助
在內(nèi)核模塊中將利用netfilter在local_out掛載一個(gè)鉤子函數(shù),將發(fā)送出去的icmp報(bào)文都添加vxlan隧道報(bào)文。在利用dev_queue_xmit發(fā)包,發(fā)包的時(shí)候centos系統(tǒng)死機(jī)了,求幫助,下面是我的代碼:
static int add_tunnel_vxlan(struct sk_buff *s_skb,
UINT1 smac[],UINT1 dmac[],UINT4 sip,UINT4 dip,UINT2 sport,UINT2 dport,UINT4 vni)
{
struct sk_buff *skb =NULL;
tUdp *pUdp =NULL;
tIp* pIp =NULL;
tEther* peth=NULL;
struct vxlan_header *pvxlan =NULL;
char *p =NULL;
int ret =0;
int data_len = s_skb->len+sizeof(struct ethhdr); //±¨¤
int udp_data_len = data_len + sizeof(struct vxlan_header)+sizeof(struct udphdr);
int ip_data_len = udp_data_len + sizeof(struct iphdr);
int tot_len = ip_data_len + sizeof(struct ethhdr); //í±¨¤
skb = alloc_skb(1514,GFP_ATOMIC);
// 猀欀戀
skb->pkt_type = s_skb->pkt_type;
skb->dev = s_skb->dev;
skb->ip_summed = s_skb->ip_summed;
skb->len = ip_data_len;
/* ±猀欀戀ò */
skb_reserve (skb, 2 +tot_len);
/* ì */
p = skb_push(skb, data_len-sizeof(struct ethhdr));
memcpy(p, skb->data, data_len-sizeof(struct ethhdr));
p= skb_push(skb,sizeof(struct ethhdr));
peth =(tEther*)p;
peth->proto = ntohs(ETH_P_IP);
memcpy(peth->src,smac,MAC_ALEN);
memcpy(peth->dest,dmac,MAC_ALEN);
/*¨ vxlan·*/
p = skb_push(skb, sizeof(struct vxlan_header));
pvxlan = (struct vxlan_header*)p;
pvxlan->flags = 0x08;
pvxlan->vni = vni;
/*ìUDP·*/
p = skb_push(skb, sizeof(struct udphdr));
pUdp = (tUdp *)p;
// 甀攙瀀梔攙爀×
pUdp->dport = dport;
pUdp->sport = sport;
pUdp->cksum =0x00;
pUdp->len = ntohs(udp_data_len);
skb_reset_transport_header(skb);
/* ìIP· */
p = skb_push(skb, sizeof(struct iphdr));
pIp = (tIp*)p;
// 椀瀀梔攙爀×
pIp->hlen = 0x45;
pIp->tos = 0;
pIp->len = ntohs(ip_data_len);
pIp->ipid =interface_ipid++;
pIp->fragoff =0x00;
pIp->ttl =64;
pIp->proto = IPPROTO_UDP;
pIp->src = sip;
pIp->dest = dip;
pIp->cksum =0;
skb_reset_network_header(skb);
/* ì· */
p = skb_push(skb, sizeof(struct ethhdr));
peth = (tEther*)p;
// 攀琀梔梔攙爀×
peth->proto = ntohs(ETH_P_IP);
memcpy(peth->src,smac,MAC_ALEN);
memcpy(peth->dest,dmac,MAC_ALEN);
skb_reset_mac_header(skb);
/* · */
//ret = dev_queue_xmit(skb);
if(ret <0)
{
printk("dev_queue_xmit() error\n");
return 1;
}
return 0;
}
將dev_queue_xmit注釋掉的時(shí)centos正常,打開(kāi)注釋,發(fā)包的時(shí)centos直接死機(jī)了。求大神們幫忙
作者:
qq452739204
時(shí)間:
2015-11-04 13:56
有大神知道是哪里有問(wèn)題么?
作者:
九陽(yáng)神功愛(ài)喝茶
時(shí)間:
2015-11-04 16:58
data_len怎么加上以太網(wǎng)頭部了?
int data_len = s_skb->len+sizeof(struct ethhdr); //±¨¤
作者:
Godbach
時(shí)間:
2015-11-05 10:17
回復(fù)
1#
qq452739204
你這是將一個(gè) LOCAL out 出去的正常 ip 報(bào)文,加了個(gè) VLAN 頭吧。 dev_queue_xmit 發(fā)送的報(bào)文,下面就交給網(wǎng)卡驅(qū)動(dòng)的。
所以你應(yīng)該是在調(diào)用 xmit 前,將報(bào)文構(gòu)造正確。這個(gè)有檢驗(yàn)嗎?
作者:
qq452739204
時(shí)間:
2015-11-05 10:28
貼的代碼里面沒(méi)有做校驗(yàn),貼圖之后把校驗(yàn)和加上了
回復(fù)
4#
Godbach
作者:
qq452739204
時(shí)間:
2015-11-05 10:34
回復(fù)
3#
九陽(yáng)神功愛(ài)喝茶
data_len是原報(bào)文呀,skb->len的長(zhǎng)度值不包括以太網(wǎng)頭部的,我打印skb->len之后才發(fā)現(xiàn)的。skb->data指向的是IP頭部。所以后來(lái)我人為的給原報(bào)文添加了一個(gè)以太網(wǎng)頭部。
作者:
九陽(yáng)神功愛(ài)喝茶
時(shí)間:
2015-11-05 10:38
那后面為什么又要加上一個(gè)以太網(wǎng)頭部呢 int tot_len = ip_data_len + sizeof(struct ethhdr); //í±¨¤
回復(fù)
6#
qq452739204
作者:
Godbach
時(shí)間:
2015-11-05 11:05
回復(fù)
6#
qq452739204
你封裝的報(bào)文,要加上 VLAN 頭,還有 MAC 頭的。這個(gè)你處理好了嗎
作者:
qq452739204
時(shí)間:
2015-11-05 11:16
回復(fù)
8#
Godbach
已經(jīng)解決了,是skb->dev這個(gè)賦值有問(wèn)題,改成skb->dev = dev_get_by_name(sock_net(s_skb->sk),"eth0"
;就可以了。謝謝你啦
作者:
qq452739204
時(shí)間:
2015-11-05 11:40
回復(fù)
8#
Godbach
現(xiàn)在再看csum_tcpudp_magic這個(gè)函數(shù)怎么用的了,總感覺(jué)我的參數(shù)沒(méi)填對(duì); uh = udp_hdr(skb);
skb->csum = csum_partial(skb_transport_header(skb),skb->len, 0);
uh->check = csum_tcpudp_magic(iph->saddr,iph->daddr, ntohs(uh->len), iph->protocol, skb->csum);
作者:
Godbach
時(shí)間:
2015-11-05 12:23
回復(fù)
9#
qq452739204
完全解決了?
作者:
qq452739204
時(shí)間:
2015-11-05 13:52
回復(fù)
11#
Godbach
對(duì)的,目前測(cè)試結(jié)果是這樣的。但是收到vxlan報(bào)文,去掉vxlan頭部然后發(fā)送給協(xié)議棧,這個(gè)模塊還在思考該怎么玩
作者:
nswcfd
時(shí)間:
2015-11-05 20:30
回復(fù)
9#
qq452739204
為什么 skb->dev = s_skb->dev; 不能正常工作?
dev_queue_xmit又不會(huì)釋放skb->dev的引用計(jì)數(shù)。
作者:
qq452739204
時(shí)間:
2015-11-06 09:42
回復(fù)
13#
nswcfd
這個(gè)不清白列。換成自己計(jì)算出來(lái)的就好了。
歡迎光臨 Chinaunix (http://www.72891.cn/)
Powered by Discuz! X3.2