U-bootの2つの修正:ARPサポートとUDP検証サポート
前の文章に言われているように、U-bootのUDPについて少し修正する必要があります.本住所:https://segmentfault.com/a/1190000005182243
ARPサポート
元のファイル:ファイル
コードの場所:「
変更:
注意:
UDPチェックサムサポート
U-bootのデフォルトではUDPチェックサムは使用されません(ゼロにします).しかし、OS XでUDPチェックサムが正しくないと、UDPパケットはシステムによって破棄されます.次のように追加する必要があります.
場所:ファイル
修正:まず、
次に、Cksum関数を前に追加します.
ARPサポート
元のファイル:ファイル
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
でこの2つの値を割り当てる必要があります.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
", 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);
}