自己构造的synack包收不到回复

lxy123go 2016-04-18 09:03:08
之前用alloc_skb创造新包总有错所以就直接在原来的skb上改了数据并发出去
我添加了校验和,用tcpdump抓包也看得到端口和ip都正确,但是收不到客户端的响应rst包(我是故意发了个错误的synack包想收到rst包),
代码很短,,请大家帮忙看看是不是校验和哪里没用对?..
这是代码

445 struct sk_buff *nskb = NULL;
446 struct ethhdr *neth = NULL;
447 const struct iphdr *oiph = ip_hdr(oldskb);
448 struct iphdr *niph = NULL;
449 const struct tcphdr *oth = tcp_hdr(oldskb);
450 struct tcphdr *tcph = NULL;//_otcph
451 struct ethhdr *oeth = eth_hdr(oldskb);
452 int length = 0;
459 if (oth == NULL)
460 return;
461
462 nskb = oldskb; //直接改的原来的skb
463 if(!nskb){
464 printk(KERN_EMERG "the nskb is null\n");
465 return;
466 }
467
468 niph = ip_hdr(nskb);
469 tcph = (struct tcphdr *)((void *)niph + (niph->ihl << 2));
470
471 //tcp头
472 tcph->source = 47138;
473 tcph->dest = 20500;
474 tcph->seq = htonl(isn);
475 tcph->ack_seq = htonl(isn);
476 tcph->ack = 1;
477
478 //ip头 我都是直接赋值的,赋的值是正确的
479
480 niph->saddr = 16777226;
481 niph->daddr = 33554442;
482 //ip checksum
483 niph->check = ip_fast_csum((unsigned char *)niph,niph->ihl);
485 neth = eth_hdr(nskb);
486 ether_addr_copy(neth->h_dest,oeth->h_source);
487 ether_addr_copy(neth->h_source,key->eth.dst); //这个key->eth,dst也是正确的
488
597 length = tcph->doff << 2;
604 tcph->check = ~tcp_v4_check(length,niph->saddr,niph->daddr,0);
605
606 nskb->ip_summed = CHECKSUM_PARTIAL;
607
608 nskb->csum_start = (unsigned char *)tcph - nskb->head;
609 nskb->csum_offset = offsetof(struct tcphdr,check);
610 nskb->pkt_type = PACKET_OTHERHOST;

后面就是正常的发送函数,
这是用tcpdump抓包的结果





...全文
357 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxy123go 2016-04-18
  • 打赏
  • 举报
回复
抓包结果看出ip和端口都是正确的,,,ack是我故意弄错的..但是接下来客户端又继续重发了syn..一样的seq所以应该是没处理我自己发的这个synack...我想应该是校验和有问题,,但是没找出问题在哪....
lxy123go 2016-04-18
  • 打赏
  • 举报
回复


抓包结果在这,,,刚没发出去不好意思

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧