-
Notifications
You must be signed in to change notification settings - Fork 225
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Files for Appendix A02, https://www.youtube.com/watch?v=XJu5pXg9czc
- Loading branch information
1 parent
cb3517b
commit f49f8a2
Showing
8 changed files
with
219 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
|
||
#ifndef __MYOS__NET__ARP_H | ||
#define __MYOS__NET__ARP_H | ||
|
||
|
||
#include <common/types.h> | ||
#include <net/etherframe.h> | ||
|
||
|
||
namespace myos | ||
{ | ||
namespace net | ||
{ | ||
|
||
struct AddressResolutionProtocolMessage | ||
{ | ||
common::uint16_t hardwareType; | ||
common::uint16_t protocol; | ||
common::uint8_t hardwareAddressSize; // 6 | ||
common::uint8_t protocolAddressSize; // 4 | ||
common::uint16_t command; | ||
|
||
|
||
common::uint64_t srcMAC : 48; | ||
common::uint32_t srcIP; | ||
common::uint64_t dstMAC : 48; | ||
common::uint32_t dstIP; | ||
|
||
} __attribute__((packed)); | ||
|
||
|
||
|
||
class AddressResolutionProtocol : public EtherFrameHandler | ||
{ | ||
|
||
common::uint32_t IPcache[128]; | ||
common::uint64_t MACcache[128]; | ||
int numCacheEntries; | ||
This comment has been minimized.
Sorry, something went wrong. |
||
|
||
public: | ||
AddressResolutionProtocol(EtherFrameProvider* backend); | ||
~AddressResolutionProtocol(); | ||
|
||
bool OnEtherFrameReceived(common::uint8_t* etherframePayload, common::uint32_t size); | ||
|
||
void RequestMACAddress(common::uint32_t IP_BE); | ||
common::uint64_t GetMACFromCache(common::uint32_t IP_BE); | ||
common::uint64_t Resolve(common::uint32_t IP_BE); | ||
}; | ||
|
||
|
||
} | ||
} | ||
|
||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
|
||
#include <net/arp.h> | ||
using namespace myos; | ||
using namespace myos::common; | ||
using namespace myos::net; | ||
using namespace myos::drivers; | ||
|
||
|
||
AddressResolutionProtocol::AddressResolutionProtocol(EtherFrameProvider* backend) | ||
: EtherFrameHandler(backend, 0x806) | ||
{ | ||
numCacheEntries = 0; | ||
} | ||
|
||
AddressResolutionProtocol::~AddressResolutionProtocol() | ||
{ | ||
} | ||
|
||
bool AddressResolutionProtocol::OnEtherFrameReceived(uint8_t* etherframePayload, uint32_t size) | ||
{ | ||
if(size < sizeof(AddressResolutionProtocolMessage)) | ||
return false; | ||
|
||
AddressResolutionProtocolMessage* arp = (AddressResolutionProtocolMessage*)etherframePayload; | ||
if(arp->hardwareType == 0x0100) | ||
{ | ||
|
||
if(arp->protocol == 0x0008 | ||
&& arp->hardwareAddressSize == 6 | ||
&& arp->protocolAddressSize == 4 | ||
&& arp->dstIP == backend->GetIPAddress()) | ||
{ | ||
|
||
switch(arp->command) | ||
{ | ||
|
||
case 0x0100: // request | ||
arp->command = 0x0200; | ||
arp->dstIP = arp->srcIP; | ||
arp->dstMAC = arp->srcMAC; | ||
arp->srcIP = backend->GetIPAddress(); | ||
arp->srcMAC = backend->GetMACAddress(); | ||
return true; | ||
break; | ||
|
||
case 0x0200: // response | ||
if(numCacheEntries < 128) | ||
{ | ||
IPcache[numCacheEntries] = arp->srcIP; | ||
MACcache[numCacheEntries] = arp->srcMAC; | ||
numCacheEntries++; | ||
} | ||
break; | ||
} | ||
} | ||
|
||
} | ||
|
||
return false; | ||
} | ||
|
||
void AddressResolutionProtocol::RequestMACAddress(uint32_t IP_BE) | ||
{ | ||
|
||
AddressResolutionProtocolMessage arp; | ||
arp.hardwareType = 0x0100; // ethernet | ||
This comment has been minimized.
Sorry, something went wrong.
amr98khaled
|
||
arp.protocol = 0x0008; // ipv4 | ||
This comment has been minimized.
Sorry, something went wrong.
amr98khaled
|
||
arp.hardwareAddressSize = 6; // mac | ||
arp.protocolAddressSize = 4; // ipv4 | ||
arp.command = 0x0100; // request | ||
This comment has been minimized.
Sorry, something went wrong.
amr98khaled
|
||
|
||
arp.srcMAC = backend->GetMACAddress(); | ||
arp.srcIP = backend->GetIPAddress(); | ||
arp.dstMAC = 0xFFFFFFFFFFFF; // broadcast | ||
arp.dstIP = IP_BE; | ||
|
||
this->Send(arp.dstMAC, (uint8_t*)&arp, sizeof(AddressResolutionProtocolMessage)); | ||
|
||
} | ||
|
||
uint64_t AddressResolutionProtocol::GetMACFromCache(uint32_t IP_BE) | ||
{ | ||
for(int i = 0; i < numCacheEntries; i++) | ||
if(IPcache[i] == IP_BE) | ||
return MACcache[i]; | ||
return 0xFFFFFFFFFFFF; // broadcast address | ||
} | ||
|
||
uint64_t AddressResolutionProtocol::Resolve(uint32_t IP_BE) | ||
{ | ||
uint64_t result = GetMACFromCache(IP_BE); | ||
if(result == 0xFFFFFFFFFFFF) | ||
RequestMACAddress(IP_BE); | ||
|
||
while(result == 0xFFFFFFFFFFFF) // possible infinite loop | ||
result = GetMACFromCache(IP_BE); | ||
|
||
return result; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
We will set IP address manually , but it could also be set using DHCP