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

Chinaunix

標(biāo)題: 收到Vxlan隧道報(bào)文,怎么去掉隧道之后發(fā)送給協(xié)議棧?小白求助 [打印本頁(yè)]

作者: qq452739204    時(shí)間: 2015-11-06 09:58
標(biāo)題: 收到Vxlan隧道報(bào)文,怎么去掉隧道之后發(fā)送給協(xié)議棧?小白求助
如下圖所示,設(shè)備收到該報(bào)文,如何去掉隧道頭部,將原報(bào)文發(fā)送給協(xié)議棧列?
我在LCAOL_IN加了一個(gè)鉤子函數(shù),做了如下動(dòng)作
代碼中用到的結(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;//原報(bào)文長(zhǎng)度(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); 將原報(bào)文拷貝到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; //í
}

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

作者: qq452739204    時(shí)間: 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)容,確實(shí)是原報(bào)文內(nèi)容,但是沒有抓到該報(bào)文或者其回復(fù)報(bào)文;若將調(diào)用dev_queue_xmit注釋打開則可以收到原報(bào)文和其回復(fù)報(bào)文,但是運(yùn)行3分鐘左右系統(tǒng)句掛了(1s發(fā)一次封裝的報(bào)文)。請(qǐng)問知道該怎么定位問題么?





歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2