openfirmware: another way to find the MAC address

Of course Sun and Apple didn't put it at the same place...

Change-Id: I974caff7335bb25a0e8dd4f7da8bdb9a737d011e
Reviewed-on: https://review.haiku-os.org/c/haiku/+/2357
Reviewed-by: waddlesplash <waddlesplash@gmail.com>
This commit is contained in:
PulkoMandy 2020-03-15 16:42:56 +01:00 committed by waddlesplash
parent 4e134b546a
commit 9a515368b7

View File

@ -1,6 +1,7 @@
/*
* Copyright 2005, Ingo Weinhold <bonefish@cs.tu-berlin.de>.
* Copyright 2010, Andreas Faerber <andreas.faerber@web.de>
* Copyright 2002, Adrien Destugues <pulkomandy@pulkomandy.tk>
* All rights reserved. Distributed under the terms of the MIT License.
*/
@ -43,6 +44,9 @@ public:
virtual ssize_t Send(const void *buffer, size_t size);
virtual ssize_t Receive(void *buffer, size_t size);
private:
status_t FindMACAddress();
private:
intptr_t fHandle;
mac_addr_t fMACAddress;
@ -96,6 +100,40 @@ OFEthernetInterface::~OFEthernetInterface()
}
status_t
OFEthernetInterface::FindMACAddress()
{
intptr_t package = of_instance_to_package(fHandle);
// get MAC address
int bytesRead = of_getprop(package, "local-mac-address", &fMACAddress,
sizeof(fMACAddress));
if (bytesRead == (int)sizeof(fMACAddress))
return B_OK;
// Failed to get the MAC address of the network device. The system may
// have a global standard MAC address.
bytesRead = of_getprop(gChosen, "mac-address", &fMACAddress,
sizeof(fMACAddress));
if (bytesRead == (int)sizeof(fMACAddress)) {
return B_OK;
}
// On Sun machines, there is a global word 'mac-address' which returns
// the size and a pointer to the MAC address
size_t size;
void* ptr;
if (of_interpret("mac-address", 0, 2, &size, &ptr) != OF_FAILED) {
if (size == sizeof(fMACAddress)) {
memcpy(&fMACAddress, ptr, size);
return B_OK;
}
}
return B_ERROR;
}
status_t
OFEthernetInterface::Init(const char *device, const char *parameters)
{
@ -109,21 +147,10 @@ OFEthernetInterface::Init(const char *device, const char *parameters)
return B_ERROR;
}
intptr_t package = of_instance_to_package(fHandle);
// get MAC address
int bytesRead = of_getprop(package, "local-mac-address", &fMACAddress,
sizeof(fMACAddress));
if (bytesRead == OF_FAILED || bytesRead < (int)sizeof(fMACAddress)) {
// Failed to get the MAC address of the network device. The system may
// have a global standard MAC address.
bytesRead = of_getprop(gChosen, "mac-address", &fMACAddress,
sizeof(fMACAddress));
if (bytesRead == OF_FAILED || bytesRead < (int)sizeof(fMACAddress)) {
if (FindMACAddress() != B_OK) {
printf("Failed to get MAC address\n");
return B_ERROR;
}
}
// get IP address