void ArpRequest (void)

来源:互联网 发布:网络受限怎么办 编辑:程序博客网 时间:2024/05/16 19:36
void ArpRequest (void)
{
    int i;
    volatile uchar *pkt;
    ARP_t *arp;

#ifdef ET_DEBUG
    printf ("ARP broadcast %d\n", NetArpWaitTry);
#endif
    pkt = NetTxPacket;

    pkt += NetSetEther (pkt, NetBcastAddr, PROT_ARP);      //设置帧头(设置帧头(广播地址,本机mac,协议)


    arp = (ARP_t *) pkt;

    arp->ar_hrd = htons (ARP_ETHER);               //设置目标地址硬件类型
    arp->ar_pro = htons (PROT_IP);                     //设置目标地址上层协议为IP协议
    arp->ar_hln = 6;                                              //设置目标地址硬件地址长度
    arp->ar_pln = 4;                                              //设置目标地址上层协议地址长度(IP地址长度)
    arp->ar_op = htons (ARPOP_REQUEST);       //操作类型

    memcpy (&arp->ar_data[0], NetOurEther, 6);        /* source ET addr    */                //本机mac地址
    NetWriteIP ((uchar *) & arp->ar_data[6], NetOurIP);    /* source IP addr    */           //本机ip地址
    for (i = 10; i < 16; ++i) {
        arp->ar_data[i] = 0;                /* dest ET addr = 0     */                                         //目标mac地址=0
    }

    if ((NetArpWaitPacketIP & NetOurSubnetMask) !=
        (NetOurIP & NetOurSubnetMask)) {
        if (NetOurGatewayIP == 0) {
            puts ("## Warning: gatewayip needed but not set\n");
            NetArpWaitReplyIP = NetArpWaitPacketIP;           //不在同一网段,且没有网关-----目的ip地址
        } else {
            NetArpWaitReplyIP = NetOurGatewayIP;              //不在同一网段,且已设网关-----网关地址
        }
    } else {
        NetArpWaitReplyIP = NetArpWaitPacketIP;               //在同一网段-------------------------目的ip地址
    }

    NetWriteIP ((uchar *) & arp->ar_data[16], NetArpWaitReplyIP);                     //写入ar_data[16]
    (void) eth_send (NetTxPacket, (pkt - NetTxPacket) + ARP_HDR_SIZE);
}