/*! * \brief Request the MAC address of a specified IP address. * * \param dip IP address in network byte order. * \param dmac Points to the buffer, that will receive the MAC address. * * \return 0 on success, -1 otherwise. */ int ArpRequest(unsigned long dip, unsigned char *dmac) { ETHERARP *ea = &arpframe.eth_arp; unsigned char retry; int rlen; memset_(dmac, 0xFF, 6); if (dip == INADDR_BROADCAST) { return 0; } if (dip == arptab_ip) { memcpy_(dmac, arptab_ha, 6); return 0; } /* * Set ARP header. */ ea->arp_hrd = ARPHRD_ETHER; ea->arp_pro = ETHERTYPE_IP; ea->arp_hln = 6; ea->arp_pln = 4; ea->arp_op = ARPOP_REQUEST; memcpy_(ea->arp_sha, confnet.cdn_mac, 6); memset_(ea->arp_tha, 0xFF, 6); ea->arp_spa = confnet.cdn_ip_addr; ea->arp_tpa = dip; ea = &rframe.eth.arp; for (rlen = retry = 0; retry < 3;) { /* * Send a message, if nothing has been received yet. */ if (rlen == 0) { /* Transmit failure, must be a NIC problem. Give up. */ if (EtherOutput(dmac, ETHERTYPE_ARP, sizeof(ETHERARP)) < 0) break; } if ((rlen = EtherInput(ETHERTYPE_ARP, 1000)) <= 0) { retry++; continue; } /* * Check if the response contains the expected values. */ if (ea->arp_tpa == confnet.cdn_ip_addr && ea->arp_op == ARPOP_REPLY && ea->arp_spa == dip) { arptab_ip = dip; memcpy_(arptab_ha, ea->arp_sha, 6); memcpy_(dmac, ea->arp_sha, 6); return 0; } } return -1; }
static void prepare_ramstage_region(void *resume_backup_memory) { size_t backup_top = backup_size(); print_car_debug("Prepare ramstage memory region..."); if (resume_backup_memory) { memcpy_(resume_backup_memory, (void *) CONFIG_RAMBASE, HIGH_MEMORY_SAVE - backup_top); memset_((void*) CONFIG_RAMBASE, 0, HIGH_MEMORY_SAVE - backup_top); } else { memset_((void*)0, 0, CONFIG_RAMTOP - backup_top); } #if IS_ENABLED(CONFIG_HAVE_ROMSTAGE_CONSOLE_SPINLOCK) initialize_romstage_console_lock(); #endif #if IS_ENABLED(CONFIG_HAVE_ROMSTAGE_NVRAM_CBFS_SPINLOCK) initialize_romstage_nvram_cbfs_lock(); #endif print_car_debug(" Done\n"); }
static void prepare_romstage_ramstack(void *resume_backup_memory) { size_t backup_top = backup_size(); print_car_debug("Prepare CAR migration and stack regions..."); if (resume_backup_memory) { memcpy_(resume_backup_memory + HIGH_MEMORY_SAVE - backup_top, (void *)(CONFIG_RAMTOP - backup_top), backup_top); } memset_((void *)(CONFIG_RAMTOP - backup_top), 0, backup_top); print_car_debug(" Done\n"); }