当前位置: 首页 > news >正文

在内核中构造一个UDP 数据

send_udp构造一个udp数据包并根据网络设备发送

int send_udp(struct net_device *odev, u16 local_port, u32 remote_ip, u16 remote_port, u8 *msg, int len) { struct sk_buff *skb; int total_len, eth_len, ip_len, udp_len, header_len; struct udphdr *udph; struct iphdr *iph; struct ethhdr *eth; u32 local_ip; //local_ip = inet_select_addr(odev, remote_ip, RT_SCOPE_LINK); // 选择网络设备地址 local_ip = inet_select_addr(odev, 0, RT_SCOPE_UNIVERSE); printk( "local ip is "NIPQUAD_FMT"\n", NIPQUAD( local_ip ) ); local_ip = ntohl( local_ip ); if ( !local_ip ) { return; } // 设置各个协议数据长度 udp_len = len + sizeof(*udph); ip_len = eth_len = udp_len + sizeof(*iph); total_len = eth_len + ETH_HLEN + NET_IP_ALIGN; header_len = total_len - len; // 分配skb skb = alloc_skb( total_len + LL_MAX_HEADER, GFP_ATOMIC ); if ( !skb ) { dbg_err( "alloc_skb fail.\n" ); return; } // 预先保留skb的协议首部长度大小 skb_reserve( skb, LL_MAX_HEADER + header_len ); // 拷贝负载数据 skb_copy_to_linear_data(skb, msg, len); skb->len += len; // skb->data 移动到udp首部 skb_push(skb, sizeof(*udph)); skb_reset_transport_header(skb); udph = udp_hdr(skb); udph->source = htons(local_port); udph->dest = htons(remote_port); udph->len = htons(udp_len); udph->check = 0; udph->check = csum_tcpudp_magic(htonl(local_ip), htonl(remote_ip), udp_len, IPPROTO_UDP, csum_partial(udph, udp_len, 0)); if (udph->check == 0) udph->check = CSUM_MANGLED_0; // skb->data 移动到ip首部 skb_push(skb, sizeof(*iph)); skb_reset_network_header(skb); iph = ip_hdr(skb); /* iph->version = 4; iph->ihl = 5; */ put_unaligned(0x45, (unsigned char *)iph); iph->tos = 0; put_unaligned(htons(ip_len), &(iph->tot_len)); iph->id = 0; iph->frag_off = 0; iph->ttl = 64; iph->protocol = IPPROTO_UDP; iph->check = 0; put_unaligned(htonl(local_ip), &(iph->saddr)); put_unaligned(htonl(remote_ip), &(iph->daddr)); iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl); /* // skb->data 移动到eth首部 eth = (struct ethhdr *) skb_push(skb, ETH_HLEN); skb_reset_mac_header(skb); skb->protocol = eth->h_proto = htons(ETH_P_IP); memcpy(eth->h_source, dev_addr, ETH_ALEN); memcpy(eth->h_dest, remote_mac, ETH_ALEN); */ skb->dev = odev; // 直接发送 //dev_queue_xmit( skb ); // 获取output rtable if ( ip_route_out( skb, iph ) != 0 ) { goto free_skb; } // 通过系统决定发送 ip_local_out(skb); return; free_skb: trace( "free skb.\n" ); kfree_skb(skb); return ; }

ip_route_out 函数查找路由路径, 获取output rtable .

int ip_route_out( struct sk_buff *skb, struct iphdr *iph ) { int err = -1; struct flowi fl = {}; struct rtable *rt = NULL; fl.nl_u.ip4_u.daddr = iph->daddr; if (ip_route_output_key( &init_net, &rt, &fl) != 0) { dbg_err( "ip_route_output_key call fail.\n" ); goto _out; } trace( "rt_dst="NIPQUAD_FMT " rt_gw=" NIPQUAD_FMT "\n", NIPQUAD( rt->rt_dst ), NIPQUAD( rt->rt_gateway ) ); trace( "route output dev=%s\n", rt->u.dst.dev->name ); //skb->dst = &rt->u.dst; skb->rtable = rt; err = 0; _out: return err; }

相关文章:

  • python xlwt xlrd 写入一行_【Python】excel读写操作 xlrd xlwt
  • 找啊!找啊!找不到工作(上)——漂在中关村(2)
  • win32 显示一行提示_linux分页显示命令的12个使用案例
  • 小谈RTMP中AMF3类型的Command message
  • python给散点图的点加名称_如何在散点图中添加最适合的直线
  • SYN-COOKIE
  • pythonseleniumide使用_从Selenium IDE将测试导出为python
  • treeselect 如何选中多个_如何在Mac上复制和粘贴
  • 对象必须实现 iconvertible_编程体系结构(06):Java面向对象
  • SYN-PROXY
  • kafka 创建topic_雅虎开源!可视化的Kafka监控管理工具
  • SYN-GATE
  • youtube python enty_python GUI尝鲜(但当涉猎,见往事耳)
  • Windows Mobile下在开始菜单增加应用程序快捷方式的两种办法
  • solidworks版本转换器_SOLIDWORKS | SOLIDWORKS? 2021 新增功能 —3D CAD
  • php的引用
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【笔记】你不知道的JS读书笔记——Promise
  • android 一些 utils
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Angular 2 DI - IoC DI - 1
  • angular学习第一篇-----环境搭建
  • Druid 在有赞的实践
  • GraphQL学习过程应该是这样的
  • gulp 教程
  • Javascript编码规范
  • Java多线程(4):使用线程池执行定时任务
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • PAT A1050
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • WebSocket使用
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 对JS继承的一点思考
  • 多线程 start 和 run 方法到底有什么区别?
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 通过git安装npm私有模块
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 正则表达式小结
  • NLPIR智能语义技术让大数据挖掘更简单
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • ​字​节​一​面​
  • # 达梦数据库知识点
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #大学#套接字
  • (a /b)*c的值
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648