[haiku-commits] Change in haiku[master]: openfirmware: another way to find the MAC address

  • From: Gerrit <review@xxxxxxxxxxxxxxxxxxx>
  • To: waddlesplash <waddlesplash@xxxxxxxxx>, haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 15 Mar 2020 16:22:25 +0000

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

Other related posts:

  • » [haiku-commits] Change in haiku[master]: openfirmware: another way to find the MAC address - Gerrit