- 论坛徽章:
- 0
|
有3台机器,A,B,C, 其中B设置为路由器功能,使得A发送UDP包-----经过B-------到达C
现在我想在B上收到来自A的UDP包,重新构造与相同的UDP包发往C。
所以在B上定义了钩子,点在NF_INET_FORWARD处;
构造新包的方法利用一个相应大小数据,将原UDP包从mac头开始复制到数组里;
再申请一个新的SKB,将数组的内容复制到新的SKB, 使用dev_queue_xmit发送时,时机。
B接收到的原包作了DROP处理。
以下是我的代码中复制包及发送的处理过程,请大家帮我看看- //udparray用来保存的数组
- memcpy( udparray, skb->mac_header, 1078);//1078是我计算的mac+ip head +udp head + data的长度
-
- printk(KERN_ALERT "before copy\n");
-
- //自己写的函数,申请skb,此时nskb的data,tail都指向空间的底部
- nskb = (struct sk_buff *)nc_alloc_skb( 1078 );
-
- //copy udp data ,长度是DATA_MAXSIZE
- datapp = (void *) udparray + ETH_HLEN +iph->ihl * 4 + sizeof(struct udphdr) ;
- memcpy( skb_push(nskb,DATA_MAXSIZE), datapp, DATA_MAXSIZE);
-
-
- //copy udp head
- struct udphdr * pudp = (void *) udparray +ETH_HLEN+iph->ihl * 4;
-
- nudph = (struct udphdr *)skb_push(nskb,sizeof(struct udphdr)); memcpy(nudph, pudp, sizeof(struct udphdr) );
- //copy ip head
- niph = (struct iphdr *)skb_push(nskb,sizeof(struct iphdr)); struct iphdr *pip = (void *) udparray +ETH_HLEN;
- memcpy(niph, pip, sizeof(struct iphdr) );
- niph->check = 0;
- niph->check = ip_fast_csum((unsigned char *)niph, niph->ihl);
- //copy mac head
- memcpy(skb_push(nskb,ETH_HLEN), udparray, ETH_HLEN );
- skb_reset_mac_header(nskb);
-
- printk("copy over!");
- printk("---------ip total len =%d--------\n", ntohs(iph->tot_len));
-
-
- nskb->csum = 0;
- nskb->csum = csum_partial(nudph+sizeof(struct udphdr), ntohs(nudph->len)-sizeof(struct udphdr), 0);
- nudph->check = 0;
- nudph->check = csum_tcpudp_magic (niph->saddr, niph->daddr, ntohs(nudph->len), IPPROTO_UDP, nskb->csum );
-
- if (0 > dev_queue_xmit(nskb))
- {
- kfree_skb (nskb);
- //dev_put(dev);
- printk(KERN_ALERT "dev_queue_xmit error\n");
- }
- else
- printk(KERN_ALERT "dev_queue_xmit succ\n");
复制代码 |
|