亚洲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