From a991d18159e0cd4cb748ab122461a7a40a63bb7d Mon Sep 17 00:00:00 2001 From: Alexander von Gluck IV Date: Fri, 11 Mar 2011 18:20:57 +0000 Subject: [PATCH] implement *basic* network interface Healing action; make fNetworkInterface a pointer so it actually works right git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40917 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../InterfacesAddOn/InterfacesAddOn.cpp | 10 +++++ .../InterfacesAddOn/NetworkSettings.cpp | 45 ++++++++++++++----- .../preflet/InterfacesAddOn/NetworkSettings.h | 10 +++-- 3 files changed, 50 insertions(+), 15 deletions(-) diff --git a/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesAddOn.cpp b/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesAddOn.cpp index ca0985e1d3..8ef8ddfc92 100644 --- a/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesAddOn.cpp +++ b/src/tests/kits/net/preflet/InterfacesAddOn/InterfacesAddOn.cpp @@ -167,6 +167,16 @@ InterfacesAddOn::MessageReceived(BMessage* msg) break; } + case kMsgInterfaceHeal: + { + if (!item) + break; + + NetworkSettings* ns = item->GetSettings(); + ns->HealInterface(); + break; + } + default: BBox::MessageReceived(msg); } diff --git a/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.cpp b/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.cpp index f2327b63b6..2adbc96307 100644 --- a/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.cpp +++ b/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.cpp @@ -41,6 +41,8 @@ NetworkSettings::NetworkSettings(const char* name) fName = name; _DetectProtocols(); + fNetworkInterface = new BNetworkInterface(fName); + ReadConfiguration(); } @@ -109,17 +111,16 @@ NetworkSettings::_DetectProtocols() void NetworkSettings::ReadConfiguration() { - BNetworkInterface fNetworkInterface(fName); - fDisabled = (fNetworkInterface.Flags() & IFF_UP) == 0; + fDisabled = (fNetworkInterface->Flags() & IFF_UP) == 0; for (int index = 0; index < MAX_PROTOCOLS; index++) { int inet_id = fProtocols[index].inet_id; if (fProtocols[index].present) { // --- Obtain IP Addresses - int32 zeroAddr = fNetworkInterface.FindFirstAddress(inet_id); + int32 zeroAddr = fNetworkInterface->FindFirstAddress(inet_id); if (zeroAddr >= 0) { - fNetworkInterface.GetAddressAt(zeroAddr, + fNetworkInterface->GetAddressAt(zeroAddr, fInterfaceAddressMap[inet_id]); fAddress[inet_id].SetTo( fInterfaceAddressMap[inet_id].Address()); @@ -205,7 +206,7 @@ NetworkSettings::ReadConfiguration() // AutoConfiguration on the IP level doesn't exist yet // ( fInterfaceAddressMap[AF_INET].Flags() ) if (fProtocols[index].socket_id >= 0) { - fAutoConfigure[inet_id] = (fNetworkInterface.Flags() + fAutoConfigure[inet_id] = (fNetworkInterface->Flags() & (IFF_AUTO_CONFIGURED | IFF_CONFIGURING)) != 0; } } @@ -283,20 +284,19 @@ NetworkSettings::ReadConfiguration() void NetworkSettings::SetConfiguration() { - BNetworkInterface fNetworkInterface(fName); printf("Setting %s\n", Name()); for (int index = 0; index < MAX_PROTOCOLS; index++) { int inet_id = fProtocols[index].inet_id; if (fProtocols[index].present) { - int32 zeroAddr = fNetworkInterface.FindFirstAddress(inet_id); + int32 zeroAddr = fNetworkInterface->FindFirstAddress(inet_id); if (zeroAddr >= 0) { BNetworkInterfaceAddress interfaceConfig; - fNetworkInterface.GetAddressAt(zeroAddr, + fNetworkInterface->GetAddressAt(zeroAddr, interfaceConfig); interfaceConfig.SetAddress(fAddress[inet_id]); interfaceConfig.SetMask(fNetmask[inet_id]); - fNetworkInterface.SetAddress(interfaceConfig); - fNetworkInterface.SetTo(zeroAddr); + fNetworkInterface->SetAddress(interfaceConfig); + fNetworkInterface->SetTo(zeroAddr); } else { // TODO : test this case (no address set for this protocol) printf("no zeroAddr found for %s(%d), found %lu\n", @@ -304,7 +304,7 @@ NetworkSettings::SetConfiguration() BNetworkInterfaceAddress interfaceConfig; interfaceConfig.SetAddress(fAddress[inet_id]); interfaceConfig.SetMask(fNetmask[inet_id]); - fNetworkInterface.AddAddress(interfaceConfig); + fNetworkInterface->AddAddress(interfaceConfig); } } @@ -330,3 +330,26 @@ NetworkSettings::WriteConfiguration() { } + + +/*! HealInterface performs a address renegotiation in an attempt to fix + connectivity problems +*/ +status_t +NetworkSettings::HealInterface() +{ + for (int index = 0; index < MAX_PROTOCOLS; index++) { + int inet_id = fProtocols[index].inet_id; + if (fProtocols[index].present + && AutoConfigure(inet_id)) { + // If protocol is active, and set to auto + printf("Healing %d\n", inet_id); + fNetworkInterface->RemoveDefaultRoute(inet_id); + // Remove default route + fNetworkInterface->AutoConfigure(inet_id); + // Perform AutoConfiguration + } + } + + return B_OK; +} diff --git a/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.h b/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.h index 729ab6f947..adacaff299 100644 --- a/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.h +++ b/src/tests/kits/net/preflet/InterfacesAddOn/NetworkSettings.h @@ -59,6 +59,8 @@ public: void SetDisabled(bool disabled) { fDisabled = disabled; } + status_t HealInterface(); + // void SetWirelessNetwork(const char* name) // { fWirelessNetwork.SetTo(name); } // void SetDomain(const BString& domain) @@ -97,10 +99,6 @@ public: private: status_t _DetectProtocols(); - BNetworkInterface fNetworkInterface; - InterfaceAddressMap fInterfaceAddressMap; - - protocols fProtocols[MAX_PROTOCOLS]; // Stored network addresses and paramaters BoolMap fAutoConfigure; @@ -113,6 +111,10 @@ private: bool fDisabled; BObjectList fNameServers; BString fWirelessNetwork; + + protocols fProtocols[MAX_PROTOCOLS]; + BNetworkInterface* fNetworkInterface; + InterfaceAddressMap fInterfaceAddressMap; };