亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1694 | 回復(fù): 1
打印 上一主題 下一主題

[內(nèi)核模塊] 收到Vxlan隧道報文,怎么去掉隧道之后發(fā)送給協(xié)議棧?小白求助 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2015-11-06 09:58 |只看該作者 |倒序瀏覽
如下圖所示,設(shè)備收到該報文,如何去掉隧道頭部,將原報文發(fā)送給協(xié)議棧列?
我在LCAOL_IN加了一個鉤子函數(shù),做了如下動作
代碼中用到的結(jié)構(gòu)體:
typedef struct st_Ether
{
    uint8_t dest[6];
    uint8_t src[6];
    uint16_t proto;
    uint8_t data[0];
} tEther;


struct vxlan_header {
    uint32_t flags;
    uint32_t vni;
    uint8_t  data[0];
};


typedef  struct  st_Ip
{
    uint8_t  hlen;
    uint8_t  tos;
    uint16_t  len;
    uint16_t  ipid;
    uint16_t  fragoff;
    uint8_t  ttl;
    uint8_t  proto;
    uint16_t  cksum;
    union {
    uint32_t  src;
    uint8_t  src1[4];
    };
    union {
    uint32_t  dest;
    uint8_t  dest1[4];
    };
    uint8_t  data[0];
} tIp;


typedef struct st_Udp
{
    uint16_t sport;
    uint16_t dport;
    uint16_t len;
    uint16_t cksum;
    char  data[0];
} tUdp;

typedef  struct  st_Tcp
{
    uint16_t  sport;
    uint16_t  dport;
    uint32_t  seq;
    uint32_t  ack;

    uint8_t  offset;
    uint8_t  code;
    uint16_t  window;
    uint16_t  cksum;
    uint16_t  urg;
    char   data[0];
} tTcp;

代碼如下:
static int del_tunnel_vxlan(struct sk_buff *skb)
{

        UINT1 buff[1514] ={0};
        tEther* peth =NULL;
        tIp* pIp=(tIp*)ip_hdr(skb);
        tUdp* pudp = (tUdp*)pIp->data;
        struct vxlan_header* pvxlan = (struct vxlan_header*)pudp->data;
        UINT1 *p;

        int pkt_len = skb->len - 50+14;//原報文長度(74)
        int data_len = pkt_len-sizeof(struct iphdr)-sizeof(struct ethhdr);
        int ip_len   = data_len + sizeof(struct iphdr);

        printk(KERN_ALERT "skb->len:%d,pkt_len:%d;data_len:%d\n",skb->len,pkt_len,data_len);


        memcpy(buff,pvxlan->data,data_len); 將原報文拷貝到buff中
        peth = (tEther*)buff;
        if(peth->proto != ntohs(ETH_P_IP))
                return 1;
        pIp = (tIp*)peth->data;

        skb_reserve(skb,skb->len +2);
       
        p = skb_push(skb,data_len);
        memcpy(p,pIp->data,data_len);
        skb_reset_transport_header(skb);

        p = skb_push(skb,sizeof(struct iphdr));
        memcpy(p,peth->data,sizeof(struct iphdr));
        skb_reset_network_header(skb);

        p = skb_push(skb,sizeof(struct ethhdr));
        memcpy(p,buff,sizeof(struct ethhdr));
        skb_reset_mac_header(skb);
               
        return 0;
}


static unsigned int nf_hook_in(unsigned int hooknum,struct sk_buff *skb,
                               const struct net_device *in,
                               const struct net_device *out,
                               int (*okfn)(struct sk_buff*))
{
    struct sk_buff *sb = skb;
    struct tcphdr *tcph = NULL;
    tIp* pIp = (tIp*)ip_hdr(sb);
    tTcp* ptcp = NULL;
    unsigned int src_ip = pIp->src;


    switch(pIp->proto)
    {
        case IPPROTO_UDP:
        {
            tUdp* pudp =(tUdp*)pIp->data;

            if(pIp->src == in_aton("172.16.3.40") && pIp->dest == in_aton("172.16.3.38"))
            {
                                if(pudp->sport == ntohs(4789)&& pudp->dport == ntohs(4789))
                    {
                            del_tunnel_vxlan(skb);
                        printk(KERN_ALERT "del_tunnel_vxlan ok\n");
                            return NF_ACCEPT;
                    }
                 }
        }
        break;
        default:
            break;
    }
    return NF_ACCEPT; //í
}

但是并沒有抓到去隧道之后的報文或者回復(fù)報文;

論壇徽章:
0
2 [報告]
發(fā)表于 2015-11-06 17:28 |只看該作者
static int del_tunnel_vxlan(struct sk_buff *skb)
{

        UINT1 buff[1514] ={0};
        tEther* peth =NULL;
        tIp* pIp=(tIp*)ip_hdr(skb);
        tUdp* pudp = (tUdp*)pIp->data;
        struct vxlan_header* pvxlan = (struct vxlan_header*)pudp->data;
        UINT1 *p;
        int ret =0;

        int pkt_len = skb->len - 50+14;
        int data_len = pkt_len-sizeof(struct iphdr)-sizeof(struct ethhdr);
        int ip_len   = data_len + sizeof(struct iphdr);

        memcpy(buff,pvxlan->data,pkt_len); //±¨
        peth = (tEther*)buff;
        if(peth->proto != ntohs(ETH_P_IP))
                return 1;

        skb->len = 0;
        skb->data_len = 0;
        skb->protocol = htons(ETH_P_IP);
        skb->pkt_type = PACKET_HOST;

        pIp = (tIp*)peth->data;
       
        skb_reserve(skb,pkt_len+2);
       
        p = skb_push(skb,data_len);
        memcpy(p,pIp->data,data_len);
        skb_reset_transport_header(skb);

        p = skb_push(skb,sizeof(struct iphdr));
        memcpy(p,peth->data,sizeof(struct iphdr));
        skb_reset_network_header(skb);

        p = skb_push(skb,sizeof(struct ethhdr));
        memcpy(p,buff,sizeof(struct ethhdr));
        skb_reset_mac_header(skb);


        /*ret = dev_queue_xmit(skb);
        if(ret <0)
        {
             printk("dev_queue_xmit() error\n");
             return 1;
        }*/
        return 0;
}

static unsigned int nf_hook_in(unsigned int hooknum,struct sk_buff *skb,
                               const struct net_device *in,
                               const struct net_device *out,
                               int (*okfn)(struct sk_buff*))
{
.....
            if(pIp->src == in_aton("172.16.3.40") && pIp->dest == in_aton("172.16.3.38"))
            {
                                if(pudp->sport == ntohs(4789)&& pudp->dport == ntohs(4789))
                    {
                            del_tunnel_vxlan(skb);
                        printk(KERN_ALERT "del_tunnel_vxlan ok\n");
                            return NF_ACCEPT;
                    }
                 }
        }
........
}

改成如上代碼,通過打印skb->data里面的內(nèi)容,確實是原報文內(nèi)容,但是沒有抓到該報文或者其回復(fù)報文;若將調(diào)用dev_queue_xmit注釋打開則可以收到原報文和其回復(fù)報文,但是運(yùn)行3分鐘左右系統(tǒng)句掛了(1s發(fā)一次封裝的報文)。請問知道該怎么定位問題么?
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP