From Adrien Destugues <pulkomandy@xxxxxxxxx>:
Adrien Destugues has uploaded this change for review. (
https://review.haiku-os.org/c/haiku/+/2357 ;)
Change subject: openfirmware: another way to find the MAC address
......................................................................
openfirmware: another way to find the MAC address
Of course Sun and Apple didn't put it at the same place...
---
M src/system/boot/platform/openfirmware/network.cpp
1 file changed, 51 insertions(+), 24 deletions(-)
git pull ssh://git.haiku-os.org:22/haiku refs/changes/57/2357/1
diff --git a/src/system/boot/platform/openfirmware/network.cpp
b/src/system/boot/platform/openfirmware/network.cpp
index be78f29..8e95c42 100644
--- a/src/system/boot/platform/openfirmware/network.cpp
+++ b/src/system/boot/platform/openfirmware/network.cpp
@@ -1,6 +1,7 @@
/*
* Copyright 2005, Ingo Weinhold <bonefish@xxxxxxxxxxxxxxx>.
* Copyright 2010, Andreas Faerber <andreas.faerber@xxxxxx>
+ * Copyright 2002, Adrien Destugues <pulkomandy@xxxxxxxxxxxxx>
* All rights reserved. Distributed under the terms of the MIT License.
*/
@@ -30,22 +31,25 @@
class OFEthernetInterface : public EthernetInterface {
public:
- OFEthernetInterface();
- virtual ~OFEthernetInterface();
+ OFEthernetInterface();
+ virtual ~OFEthernetInterface();
- status_t Init(const char *device, const char *parameters);
+ status_t Init(const char *device, const char
*parameters);
- virtual mac_addr_t MACAddress() const;
+ virtual mac_addr_t MACAddress() const;
- virtual void *AllocateSendReceiveBuffer(size_t size);
- virtual void FreeSendReceiveBuffer(void *buffer);
+ virtual void * AllocateSendReceiveBuffer(size_t size);
+ virtual void FreeSendReceiveBuffer(void *buffer);
- virtual ssize_t Send(const void *buffer, size_t size);
- virtual ssize_t Receive(void *buffer, size_t size);
+ virtual ssize_t Send(const void *buffer, size_t size);
+ virtual ssize_t Receive(void *buffer, size_t size);
private:
- intptr_t fHandle;
- mac_addr_t fMACAddress;
+ status_t FindMACAddress();
+
+private:
+ intptr_t fHandle;
+ mac_addr_t fMACAddress;
};
@@ -97,6 +101,40 @@
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)
{
if (!device)
@@ -109,20 +147,9 @@
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)) {
- printf("Failed to get MAC address\n");
- return B_ERROR;
- }
+ if (FindMACAddress() != B_OK) {
+ printf("Failed to get MAC address\n");
+ return B_ERROR;
}
// get IP address
--
To view, visit https://review.haiku-os.org/c/haiku/+/2357
To unsubscribe, or for help writing mail filters, visit
https://review.haiku-os.org/settings
Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: I974caff7335bb25a0e8dd4f7da8bdb9a737d011e
Gerrit-Change-Number: 2357
Gerrit-PatchSet: 1
Gerrit-Owner: Adrien Destugues <pulkomandy@xxxxxxxxx>
Gerrit-MessageType: newchange