正如上一篇文章所说,需要对U-boot的UDP做一些小修改。
本文章采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
原文发布于:https://segmentfault.com/a/1190000005340123,也是作者本人的专栏。
原文件:文件net.c
的NetReceive()
函数
代码位置:搜索“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 */
}
注:NetArpWaitDPort
和NetArpWaitSPort
都是新定义的全局变量。当然,也需要在NetSendUDPPacket
将这两个值赋值。
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,也是作者本人的专栏。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。