U-bootの2つの修正:ARPサポートとUDP検証サポート


前の文章に言われているように、U-bootのUDPについて少し修正する必要があります.本住所:https://segmentfault.com/a/1190000005182243
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 */
    }

注意:NetArpWaitDPortおよびNetArpWaitSPortは、新しく定義されたグローバル変数です.もちろん、NetSendUDPPacketでこの2つの値を割り当てる必要があります.
UDPチェックサムサポート
U-bootのデフォルトではUDPチェックサムは使用されません(ゼロにします).しかし、OS XでUDPチェックサムが正しくないと、UDPパケットはシステムによって破棄されます.次のように追加する必要があります.
場所:ファイルnet.cNetSetIp()関数
修正:まず、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); }