Chinaunix首页 | 论坛 | 博客
  • 博客访问: 192513
  • 博文数量: 30
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 476
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-07 18:15
个人简介

程序员一个。14年毕业。

文章分类

全部博文(30)

文章存档

2014年(13)

2013年(17)

我的朋友

分类: C/C++

2014-10-12 14:09:40


点击(此处)折叠或打开

  1. void send_syn(void)
  2. {
  3.  struct sk_buff *skb;
  4.  struct iphdr *iph;
  5.  struct tcphdr *tcph;
  6.  struct rtable *rt =NULL;
  7.  u8 mac[12];
  8.  u32 i;
  9.  int ret;

  10.  //查路由,主要是获取出接口然后绑定邻居表项
  11.  struct flowi fl =
  12.  {
  13.   .fl4_dst = 169741057,//syn包的目的地址地址
  14.   .fl_ip_dport = 8080,//目的端口
  15.   .fl_ip_sport = 0,
  16.   .mark = 0,
  17.   .iif = 0,
  18.   .proto = IPPROTO_TCP,//协议
  19.  };
  20.  
  21. //生成一个skb,这个skb就是syn包
  22.  skb = __alloc_skb(128, GFP_ATOMIC, 0, -1);

  23.  /*mac*/
  24.  skb->mac.raw = skb->data;
  25.  
  26.  /*ip*/
  27.  iph = skb->nh.raw = skb->mac.raw + 14;//mac大小14,所以偏过这么长的长度,填写ip头,tcp头等,mac头由邻居子系统填写
  28.  iph->version = 4;//v4
  29.  iph->ihl = 5;//ip头长度
  30.  iph->tos = 0;
  31.  iph->frag_off = 0;
  32.  iph->ttl = 127;
  33.  iph->protocol = IPPROTO_TCP;
  34.  iph->saddr = 169741309;
  35.  iph->daddr = 169741057;
  36.  iph->tot_len = 20 + 20;//ip头+tcp头+tcp数据负载
  37.  
  38.  /*tcp*/
  39.  tcph = skb->h.th = (struct tcphdr *)((u8*)iph + sizeof(struct iphdr));//获取tcp头 
  40.  memset(tcph,0x0,sizeof(struct tcphdr));
  41.  tcph->source = 12345;
  42.  tcph->dest = 8080;
  43.  tcph->seq = 1;
  44.  tcph->ack_seq = 0x0;
  45.  tcph->window = 0xffff;
  46.  tcph->syn = 1;
  47.  tcph->ack = 0;
  48.  tcph->psh = 0;
  49.  tcph->doff = sizeof(struct tcphdr)/4;tcp部分的长度

  50.  /*checksum*/
  51.  tcph->check = csum_tcpudp_magic(iph->saddr, iph->daddr, tcph->doff<<2, IPPROTO_TCP,
  52.      csum_partial((u8*)tcph, tcph->doff<<2, 0));
  53.  iph->check = ip_fast_csum((u8*)iph, iph->ihl);

  54.  /*skb info*/
  55.  skb->len = 14 + 20 + 20;/*mac + iph + tcph*/
  56.  skb->protocol = ETH_P_IP;
  57.  
  58.  if(ip_route_output_key(&net, &rt, &fl))
  59.  {
  60.   printk("route fail\n");
  61.   kfree_skb(skb);
  62.   return;
  63.  }

  64.  printk("route sucess\n");
  65.  
  66.  if (unlikely(rt == NULL)){
  67.   printk("rt.is null\n");
  68.   return;
  69.  }
  70.  
  71.  skb->dst = &rt->u.dst;
  72.  
  73.  ret = ip_output(skb);
  74.  printk("ret:%d\n",ret);
  75. }

阅读(3340) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~