|
@@ -48,7 +48,8 @@ void ArpInit(void)
|
|
NetArpTxPacket -= (ulong)NetArpTxPacket % PKTALIGN;
|
|
NetArpTxPacket -= (ulong)NetArpTxPacket % PKTALIGN;
|
|
}
|
|
}
|
|
|
|
|
|
-void ArpRequest(void)
|
|
|
|
|
|
+void arp_raw_request(IPaddr_t sourceIP, const uchar *targetEther,
|
|
|
|
+ IPaddr_t targetIP)
|
|
{
|
|
{
|
|
uchar *pkt;
|
|
uchar *pkt;
|
|
struct arp_hdr *arp;
|
|
struct arp_hdr *arp;
|
|
@@ -69,12 +70,16 @@ void ArpRequest(void)
|
|
arp->ar_pln = ARP_PLEN;
|
|
arp->ar_pln = ARP_PLEN;
|
|
arp->ar_op = htons(ARPOP_REQUEST);
|
|
arp->ar_op = htons(ARPOP_REQUEST);
|
|
|
|
|
|
- /* source ET addr */
|
|
|
|
- memcpy(&arp->ar_sha, NetOurEther, ARP_HLEN);
|
|
|
|
- /* source IP addr */
|
|
|
|
- NetWriteIP(&arp->ar_spa, NetOurIP);
|
|
|
|
- /* dest ET addr = 0 */
|
|
|
|
- memset(&arp->ar_tha, 0, ARP_HLEN);
|
|
|
|
|
|
+ memcpy(&arp->ar_sha, NetOurEther, ARP_HLEN); /* source ET addr */
|
|
|
|
+ NetWriteIP(&arp->ar_spa, sourceIP); /* source IP addr */
|
|
|
|
+ memcpy(&arp->ar_tha, targetEther, ARP_HLEN); /* target ET addr */
|
|
|
|
+ NetWriteIP(&arp->ar_tpa, targetIP); /* target IP addr */
|
|
|
|
+
|
|
|
|
+ NetSendPacket(NetArpTxPacket, eth_hdr_size + ARP_HDR_SIZE);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void ArpRequest(void)
|
|
|
|
+{
|
|
if ((NetArpWaitPacketIP & NetOurSubnetMask) !=
|
|
if ((NetArpWaitPacketIP & NetOurSubnetMask) !=
|
|
(NetOurIP & NetOurSubnetMask)) {
|
|
(NetOurIP & NetOurSubnetMask)) {
|
|
if (NetOurGatewayIP == 0) {
|
|
if (NetOurGatewayIP == 0) {
|
|
@@ -87,8 +92,7 @@ void ArpRequest(void)
|
|
NetArpWaitReplyIP = NetArpWaitPacketIP;
|
|
NetArpWaitReplyIP = NetArpWaitPacketIP;
|
|
}
|
|
}
|
|
|
|
|
|
- NetWriteIP(&arp->ar_tpa, NetArpWaitReplyIP);
|
|
|
|
- NetSendPacket(NetArpTxPacket, eth_hdr_size + ARP_HDR_SIZE);
|
|
|
|
|
|
+ arp_raw_request(NetOurIP, NetEtherNullAddr, NetArpWaitReplyIP);
|
|
}
|
|
}
|
|
|
|
|
|
void ArpTimeoutCheck(void)
|
|
void ArpTimeoutCheck(void)
|