首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >U-boot两个修改:ARP支持和UDP校验支持

U-boot两个修改:ARP支持和UDP校验支持

原创
作者头像
amc
发布于 2018-07-16 11:12:26
发布于 2018-07-16 11:12:26
9271
举报
文章被收录于专栏:后台全栈之路后台全栈之路

正如上一篇文章所说,需要对U-boot的UDP做一些小修改。

本文章采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。

原文发布于:https://segmentfault.com/a/1190000005340123,也是作者本人的专栏。


ARP支持

原文件:文件net.cNetReceive()函数

代码位置:搜索“case ARPOP_REPLY:”行并且找到其return;语句。

修改

#ifdef CONFIG_NETCONSOLE以下修改为:

代码语言:txt
AI代码解释
复制
#ifdef CONFIG_NETCONSOLE
    (*packetHandler)(0, 0, 0, 0);
#endif
    /** if Arp response by TFTP,
     ** send "TFTP Read Request"
     ** packet immediately */
    extern int TftpStarted;
    if (1 == TftpStarted) 
    {
        NetArpWaitPacketIP = 0;
        NetArpWaitTxPacketSize = 0;
        NetArpWaitPacketMAC = NULL;
        TftpSend();
    }
    else if (NetArpWaitTxPacketSize)
    {
        NetSendUDPPacket(NetArpWaitPacketMAC,
                         NetArpWaitPacketIP,
                         NetArpWaitDPort,        // 注
                         NetArpWaitSPort,
                         NetArpWaitTxPacketSize);
        NetArpWaitPacketIP = 0;
        NetArpWaitTxPacketSize = 0;
        NetArpWaitPacketMAC = NULL;
    }
    else
    {
        /* no arp request pending now */
    }

注:NetArpWaitDPortNetArpWaitSPort都是新定义的全局变量。当然,也需要在NetSendUDPPacket将这两个值赋值。


UDP校验和支持

U-boot默认不用UDP校验和(置零)。但是在OS X中,UDP校验和不正确的话,UDP包将会被系统丢弃。所以需要添加如下:

位置:文件net.c中的NetSetIp()函数

修改

首先,在NetSetIp()中的“ip->udp_xsum = 0;”后面加上:

代码语言:txt
AI代码解释
复制
unsigned int tmpSum = 0;
tmpSum = NetUdpCksum(ip, len);
ip->udp_xsum = htons((ushort)(~tmpSum));

然后,在前面添加Cksum函数:

代码语言:txt
AI代码解释
复制
#define DB_UDP_XSUM(x)
unsigned NetUdpCksum(IP_t *ip, int len)
{
    ulong xsum = 0;
    uchar *data;
    len += 8;
    ip->udp_xsum = 0;
    /* sum IP data */
    data = &(ip->src);
    xsum += ((ulong)(*(data + 0))) << 8;
    xsum += ((ulong)(*(data + 1))) << 0;
    xsum += ((ulong)(*(data + 2))) << 8;
    xsum += ((ulong)(*(data + 3))) << 0;
    xsum += ((ulong)(*(data + 4))) << 8;
    xsum += ((ulong)(*(data + 5))) << 0;
    xsum += ((ulong)(*(data + 6))) << 8;
    xsum += ((ulong)(*(data + 7))) << 0;
    DB_UDP_XSUM(printf("sum: 0x%04X IP\n", xsum));
    /* sum IP protocol */
    xsum += (ushort)(ip->ip_p);
    /* sum UDP length */
    data = &(ip->udp_len);
    xsum += ((ulong)(*(data + 0))) << 8;
    xsum += ((ulong)(*(data + 1))) << 0;
    /* sum UDP content */
    data = &(ip->udp_src);
    while(len > 1)
    {
        xsum += ((ulong)(*(data + 0))) << 8;
        xsum += ((ulong)(*(data + 1))) << 0;
        data += 2;
        len -= 2;
    }
    if (len)    /* 1 == len */
    {
        xsum += ((ulong)(*(data + 0))) << 8;
    }
    xsum = (xsum & 0x0000FFFF) + (xsum >> 16);
    xsum = (xsum & 0x0000FFFF) + (xsum >> 16);
    return (xsum & 0x0000FFFF);
}

本文章采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。

原文发布于:https://segmentfault.com/a/1190000005273491,也是作者本人的专栏。

代码语言:txt
复制

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
可以,大佬,互粉一下
可以,大佬,互粉一下
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
U-Boot 中添加自定义网络通信的方法
U-boot 没有 TCP 协议栈,不支持 TCP(提出要在 U-boot 里面支持 TCP 的协议的 PM 你给我出去)。但是UDP 还是有的。使用 U-boot 配合 UDP 可以做很多底层的功能。甚至我以前做过的项目中,计划在产品生产的时候,先对产品中的 NOR-Flash 编程,然后通过 NOR-Flash 中的 U-boot 来烧写 NAND-Flash,这样可以在产品早期节省一笔 NAND 烧录器的开支。
amc
2018/07/03
1.4K0
UIP协议栈移植到u-boot详解「建议收藏」
Author: 杨正 date:2014.11.5 Email:y2012ww@gmail.com QQ: 1209758756
全栈程序员站长
2022/11/03
1.4K0
赶紧收藏!u-boot代码分析与移植
BootLoader的目标是正确调用内核的执行,由于大部分的BootLoader都依赖于CPU的体系结构。因此大部分的BootLoader都分为两个步骤启动。依赖于CPU体系结构(如设备初始化等)的代码都放在stage1。而stage2一般使用C语言实现,能够实现更加复杂的功能,代码的可移植性也提高。
混说Linux
2022/07/14
8500
赶紧收藏!u-boot代码分析与移植
第四课:u-boot对设备树的支持
转载请注明文章地址 http://wiki.100ask.org/Linux_devicetree
韦东山
2020/09/30
2.5K0
第四课:u-boot对设备树的支持
Tcpdump的详细用法
     TcpDump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。tcpdump就是一种免费的网络分析工具,尤其其提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和***者都是非常有用的工具。tcpdump存在于基本的FreeBSD系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。
孙杰
2019/10/29
1.1K0
Linux U-Boot 开发指南
介绍 U-Boot 的编译打包、基本配置、常用命令的使用、基本调试方法等, 为 U-BOOT 的移植及应用开发提供了基础。
韦东山
2023/02/25
4.8K0
Linux U-Boot 开发指南
TCP/IP协议头部结构体(网摘小结)
================================================================================ IP协议   IP协议(Internet Protocol)是网络层协议,用在因特网上,TCP,UDP,ICMP,IGMP数据都是按照IP数据格式发送得。IP协议提供的是不可靠无连接得服务。IP数据包由一个头部和一个正文部分构成。正文主要是传输的数据,我们主要来理解头部数据,可以从其理解到IP协议。  IP数据包头部格式(RFC791)
阳光岛主
2019/02/20
2.2K0
arp欺骗攻击原理_arp攻击的原理及防范
以上显示了接口172.20.10.4对应的局域网内所有主机IP地址,其中,172.20.10.11作为攻击主机,172.20.10.12作为被攻击主机。
全栈程序员站长
2022/11/10
4.8K0
arp欺骗攻击原理_arp攻击的原理及防范
用户空间协议栈设计和netmap综合指南,将网络效率提升到新高度
应用层: 最接近用户的一层,为用户程序提供网络服务。主要协议有HTTP、FTP、TFTP、SMTP、DNS、POP3、DHCP等。 表示层: 数据的表示、安全、压缩。管理数据的解密和加密。 会话层: 负责在网络中的两个节点之间的建立、维持和终止通信。 传输层: 模型中最重要的一层,负责传输协议的流控和差错校验。数据包离开网卡后进入的就是传输层;主要协议有:TCP、UDP等。 网络层: 将网络地址翻译成对应的物理地址。主要协议有:ICMP、IP等。 数据链路层: 建立逻辑连接、进行硬件地址寻址、差错校验等功能,解决两台相连主机之间的通信问题。主要协议有SLIP、以太网协议/MAC帧协议、ARP和RARP等。 物理层: 模型的最低层,建立、维护、断开物理连接,传输比特流。常见的物理媒介有光纤、电缆、中继器等。主要协议有RS232等。
Lion 莱恩呀
2024/09/14
1690
用户空间协议栈设计和netmap综合指南,将网络效率提升到新高度
【STM32F407】第11章 ThreadX NetXDUO之UDP客户端/服务器
最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=104619 第11章 ThreadX NetXDUO之UDP客户端/服务
Simon223
2022/03/10
1.2K0
【STM32F407】第11章       ThreadX NetXDUO之UDP客户端/服务器
原始 socket 编程
1.原始 socket 可以和内核一样直接对所有层进行操作(除了物理层)。可以更改 mac 更改 ip 更改端口。so dos 攻击就可以通过原始 socket 编程来伪造 ip 进行。 2.也可以访问经过网卡的所有数据.普通的 socket 只能访问发送给自己端口的数据。
战神伽罗
2019/07/24
2.1K0
原始 socket 编程
鸿蒙系统研究之六:U-Boot引导
U-Boot 的全称是 Universal Boot Loader,其作用就是引导系统。对于我们熟悉的 PC,上电后,通过 BIOS 引导操作系统 (Windows、Linux等)。对于嵌入式系统一般将这个引导程序称作 BootLoader,U-Boot 就是目前使用得最广泛的 BootLoader。
云水木石
2021/08/06
2.9K1
【STM32F407】第9章 ThreadX NetXDUO之TCP客户端
最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=104619 第9章 ThreadX NetXDUO之TCP客户端 本章节为大家讲
Simon223
2022/03/10
1.6K0
【STM32F407】第9章   ThreadX NetXDUO之TCP客户端
Linux用户态协议栈与DPDK构建高性能应用
这里使用了已经搭建好的dpdk环境,dpdk的搭建过程网上有很多教程可以参考,后面有空再做一篇dpdk环境搭建文章吧! (1)检查网卡状态
Lion 莱恩呀
2024/09/15
5360
Linux用户态协议栈与DPDK构建高性能应用
pythonpcap原生python读取
本文代码都由python编写,无需安装第三方拓展库,代码更新:https://github.com/mengdj/python
py3study
2020/01/03
1.6K0
pythonpcap原生python读取
U-BOOT 移植到友善之臂mini2440
编译器:友善之臂mini2440光盘自带arm-linux-gcc 4.4.3
全栈程序员站长
2022/07/11
7110
C/C++ Npcap包实现数据嗅探
npcap 是Nmap自带的一个数据包处理工具,Nmap底层就是使用这个包进行收发包的,该库,是可以进行二次开发的,不过使用C语言开发费劲,在进行渗透任务时,还是使用Python构建数据包高效,这东西没啥意义.
王 瑞
2022/12/28
1.1K0
盘点一款Python发包收包利器——scapy
众所周知,我们每天上网都会有很多数据包需要发送,然后处理在接受在发送,这样一个循环往复的过程,
菜鸟小白的学习分享
2021/06/17
3.1K0
盘点一款Python发包收包利器——scapy
使用Libpcap捕获局域网中的数据包
void handler(u_char *, const struct pcap_pkthdr *, const u_char *);是一个回调函数,用于处理数据包。它接受三个参数:
Andromeda
2023/11/23
8270
15.2 主机探测与路由追踪
Ping 使用 Internet 控制消息协议(ICMP)来测试主机之间的连接。当用户发送一个 ping 请求时,则对应的发送一个 ICMP Echo 请求消息到目标主机,并等待目标主机回复一个 ICMP Echo 回应消息。如果目标主机接收到请求并且网络连接正常,则会返回一个回应消息,表示主机之间的网络连接是正常的。如果目标主机没有收到请求消息或网络连接不正常,则不会有回应消息返回。
王 瑞
2023/10/19
4220
15.2 主机探测与路由追踪
相关推荐
U-Boot 中添加自定义网络通信的方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档