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

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

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

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


ARP支持

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

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

修改

#ifdef CONFIG_NETCONSOLE以下修改为:

#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;”后面加上:

unsigned int tmpSum = 0;
tmpSum = NetUdpCksum(ip, len);
ip->udp_xsum = htons((ushort)(~tmpSum));

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

#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,也是作者本人的专栏。

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

完整的golang 多协程+信道 任务处理示例

有几个地方需要注意:for i + 协程时如果协程使用可 i ,那么需要增加 i:= 来防止多协程冲突;实际执行任务时需要用一个函数包起来,防止单个任务pani...

52150
来自专栏FreeBuf

3步以内利用中间人MitM攻击从RDP连接中获得密码

今天和大家分享个小技术,简单几步通过执行MitM攻击同时从RDP连接中提取明文凭据。我这里使用的测试环境是Linux(1台)、Windows(2台),此环境仅供...

24630
来自专栏一只程序汪的自我修养

一些有用的脚本

15410
来自专栏bboysoul

无线攻击工具NETATTACK 2

我是一直不喜欢介绍无线攻击工具的,首先我不喜欢在实体机器上安装乱七八糟的软件包,所以我一般是在docker容器中或者在虚拟机上搭建渗透测试环境的,还有就是doc...

16010
来自专栏SAP最佳业务实践

SAP最佳业务实践:FI–现金管理(160)-24银企对账-供应商付款-承兑汇票-对账单再处理

4.7.4 FEBA_BANK_STATEMENT帐户对帐单的重新处理 ? 输入公司代码、开户行、账户标识 ? 清帐凭证没有生成,重新执行。 点击菜单 编辑-过...

34950
来自专栏FreeBuf

攻击中东欧的间谍工具集

图1 在过去的一年里,ESET检测并分析了若干有针对性的进行间谍活动的恶意软件,被称作SBDH工具集。它使用了强大的过滤器,多种通信方式以及非常有意思的驻留技术...

241100
来自专栏FreeBuf

看我如何利用发现的漏洞接管D-Link路由器

我曾发现了D-Link路由器不同型号的多个漏洞,今天我要分享的是我最近发现的D-Link路由器的三个漏洞,综合利用这三个漏洞,可以获取D-Link路由器管理权限...

11520
来自专栏ACM小冰成长之路

51Nod-1032-骨牌覆盖 V2

ACM模版 描述 ? 题解 数据弱化的一个题,原题是 51Nod1033骨牌覆盖V251Nod 1033 骨牌覆盖 V2,插头 DPDP。 代码 #includ...

237100
来自专栏web007

工行b2c

2.商户按照工行B2C支付1.0.0.11接口形成提交数据,并使用工行提供API和商户证书对订单数据签名,形成form表单返回客户浏览器,表单action地址指...

37600
来自专栏FreeBuf

【推广】永恒之蓝WannaCry详细分析报

2017年5 月12 日晚上20 时左右,全球爆发大规模蠕虫勒索软件感染事件,仅仅几个小时内,该勒索软件已经攻击了99个国家近万台电脑。英国、美国、俄罗斯、德国...

22950

扫码关注云+社区

领取腾讯云代金券