From 9a515368b73fc38c87d3b268636a39f53874126b Mon Sep 17 00:00:00 2001 From: PulkoMandy Date: Sun, 15 Mar 2020 16:42:56 +0100 Subject: [PATCH] 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 --- .../boot/platform/openfirmware/network.cpp | 75 +++++++++++++------ 1 file changed, 51 insertions(+), 24 deletions(-) diff --git a/src/system/boot/platform/openfirmware/network.cpp b/src/system/boot/platform/openfirmware/network.cpp index be78f2972f..8e95c42ed3 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 . * Copyright 2010, Andreas Faerber + * Copyright 2002, Adrien Destugues * 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; }; @@ -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,20 +147,9 @@ 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)) { - 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