亚洲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é)議棧列?
QQ圖片20151106094525.jpg
(83.09 KB, 下載次數(shù): 24)
下載附件
隧道報(bào)文
2015-11-06 09:45 上傳
我在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