免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1383 | 回复: 1
打印 上一主题 下一主题

请帮我看下内核构造UDP时出现的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-22 10:45 |只看该作者 |倒序浏览
有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处理。

   以下是我的代码中复制包及发送的处理过程,请大家帮我看看
  1.                                  //udparray用来保存的数组
  2.                          memcpy( udparray, skb->mac_header, 1078);//1078是我计算的mac+ip head +udp head + data的长度
  3.                                            
  4.                           printk(KERN_ALERT "before copy\n");
  5.                                                                
  6.                       //自己写的函数,申请skb,此时nskb的data,tail都指向空间的底部
  7.                     nskb = (struct sk_buff *)nc_alloc_skb( 1078 );
  8.                                                                
  9.                               //copy udp data ,长度是DATA_MAXSIZE
  10.                              datapp = (void *) udparray + ETH_HLEN +iph->ihl * 4 + sizeof(struct udphdr) ;
  11.                         memcpy( skb_push(nskb,DATA_MAXSIZE), datapp, DATA_MAXSIZE);
  12.                                                    
  13.                                                                                   
  14.                       //copy udp head
  15.                       struct udphdr * pudp = (void *) udparray +ETH_HLEN+iph->ihl * 4;
  16.                                                        
  17.                             nudph = (struct udphdr *)skb_push(nskb,sizeof(struct udphdr));                                                      memcpy(nudph, pudp, sizeof(struct udphdr) );
  18.                                                                                                                                                                                                                 //copy ip head
  19.                 niph = (struct iphdr *)skb_push(nskb,sizeof(struct iphdr));                                                                                                                                                        struct iphdr *pip = (void *) udparray +ETH_HLEN;                                                                                                                                                    
  20.         memcpy(niph, pip, sizeof(struct iphdr) );                                                                                                  
  21.                    niph->check = 0;
  22.                            niph->check = ip_fast_csum((unsigned char *)niph, niph->ihl);

  23.         //copy mac head
  24.                   memcpy(skb_push(nskb,ETH_HLEN), udparray, ETH_HLEN );
  25.                    skb_reset_mac_header(nskb);
  26.                                                                                                
  27.                                                                                                                 printk("copy over!");
  28.                                                                                                                 printk("---------ip total len =%d--------\n", ntohs(iph->tot_len));
  29.                                                                                                
  30.        
  31.                 nskb->csum = 0;
  32.         nskb->csum = csum_partial(nudph+sizeof(struct udphdr), ntohs(nudph->len)-sizeof(struct udphdr), 0);
  33.                 nudph->check = 0;
  34.         nudph->check = csum_tcpudp_magic (niph->saddr, niph->daddr, ntohs(nudph->len), IPPROTO_UDP, nskb->csum );
  35.                                                                                                
  36.                 if (0 > dev_queue_xmit(nskb))
  37.                                                                                                         {
  38.                                                                                                                 kfree_skb (nskb);
  39.                                                                                                                 //dev_put(dev);
  40.                                                                                                                  printk(KERN_ALERT "dev_queue_xmit error\n");
  41.                                                                                                         }
  42.                                                                                                         else
  43.                          printk(KERN_ALERT "dev_queue_xmit succ\n");
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-06-23 08:56 |只看该作者
即便没死机,你的包也到不了C啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP