From a1b98367ae834c4bb2027a0a7b8e9384af0f89d3 Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Fri, 7 Oct 2011 10:23:47 +0000 Subject: [PATCH] Add a way to add persistent (configured) wireless_networks that will eventually be stored by the backend in the net_server. I put it in BNetworkDevice because that is where network enumeration is done as well, but I'm not sure that it fits there particularly well. Since BNetworkDevice::GetNetwork() directly interfaces with the driver and gets the networks from scan results, such persistent networks don't yet show up in those enumerations. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42807 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/os/net/NetworkDevice.h | 3 + src/kits/network/libnetapi/NetworkDevice.cpp | 84 ++++++++++++++++++++ 2 files changed, 87 insertions(+) diff --git a/headers/os/net/NetworkDevice.h b/headers/os/net/NetworkDevice.h index 181097585c..fb97c26218 100644 --- a/headers/os/net/NetworkDevice.h +++ b/headers/os/net/NetworkDevice.h @@ -97,6 +97,9 @@ public: status_t GetNetwork(const BNetworkAddress& address, wireless_network& network); + status_t AddPersistentNetwork( + const wireless_network& network); + status_t JoinNetwork(const char* name, const char* password = NULL); status_t JoinNetwork(const wireless_network& network, diff --git a/src/kits/network/libnetapi/NetworkDevice.cpp b/src/kits/network/libnetapi/NetworkDevice.cpp index 827ee06732..f4ac139fdf 100644 --- a/src/kits/network/libnetapi/NetworkDevice.cpp +++ b/src/kits/network/libnetapi/NetworkDevice.cpp @@ -696,6 +696,90 @@ BNetworkDevice::GetNetwork(const BNetworkAddress& address, } +status_t +BNetworkDevice::AddPersistentNetwork(const wireless_network& network) +{ + BMessage message(kMsgAddPersistentNetwork); + status_t status = message.AddString("name", network.name); + if (status != B_OK) + return status; + + if (status == B_OK && network.address.Family() == AF_LINK) { + size_t addressLength = network.address.LinkLevelAddressLength(); + uint8* macAddress = network.address.LinkLevelAddress(); + bool usable = false; + BString formatted; + + for (size_t index = 0; index < addressLength; index++) { + if (index > 0) + formatted.Append(":"); + char buffer[3]; + snprintf(buffer, sizeof(buffer), "%2x", macAddress[index]); + formatted.Append(buffer, sizeof(buffer)); + + if (macAddress[index] != 0) + usable = true; + } + + if (usable) + status = message.AddString("mac", formatted); + } + + const char* authentication = NULL; + switch (network.authentication_mode) { + case B_NETWORK_AUTHENTICATION_NONE: + authentication = "none"; + break; + case B_NETWORK_AUTHENTICATION_WEP: + authentication = "wep"; + break; + case B_NETWORK_AUTHENTICATION_WPA: + authentication = "wpa"; + break; + case B_NETWORK_AUTHENTICATION_WPA2: + authentication = "wpa2"; + break; + } + + if (status == B_OK && authentication != NULL) + status = message.AddString("authentication", authentication); + + if (status == B_OK && (network.cipher & B_NETWORK_CIPHER_NONE) != 0) + status = message.AddString("cipher", "none"); + if (status == B_OK && (network.cipher & B_NETWORK_CIPHER_TKIP) != 0) + status = message.AddString("cipher", "tkip"); + if (status == B_OK && (network.cipher & B_NETWORK_CIPHER_CCMP) != 0) + status = message.AddString("cipher", "ccmp"); + + if (status == B_OK && (network.group_cipher & B_NETWORK_CIPHER_NONE) != 0) + status = message.AddString("group_cipher", "none"); + if (status == B_OK && (network.group_cipher & B_NETWORK_CIPHER_WEP_40) != 0) + status = message.AddString("group_cipher", "wep40"); + if (status == B_OK + && (network.group_cipher & B_NETWORK_CIPHER_WEP_104) != 0) { + status = message.AddString("group_cipher", "wep104"); + } + if (status == B_OK && (network.group_cipher & B_NETWORK_CIPHER_TKIP) != 0) + status = message.AddString("group_cipher", "tkip"); + if (status == B_OK && (network.group_cipher & B_NETWORK_CIPHER_CCMP) != 0) + status = message.AddString("group_cipher", "ccmp"); + + // TODO: the other fields aren't currently used, add them when they are + // and when it's clear how they will be stored + + if (status != B_OK) + return status; + + BMessenger networkServer(kNetServerSignature); + BMessage reply; + status = networkServer.SendMessage(&message, &reply); + if (status == B_OK) + reply.FindInt32("status", &status); + + return status; +} + + status_t BNetworkDevice::JoinNetwork(const char* name, const char* password) {