- 论坛徽章:
- 0
|
在内核模块中将利用netfilter在local_out挂载一个钩子函数,将发送出去的icmp报文都添加vxlan隧道报文。在利用dev_queue_xmit发包,发包的时候centos系统死机了,求帮助,下面是我的代码:
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注释掉的时centos正常,打开注释,发包的时centos直接死机了。求大神们帮忙 |
|