blob: e4749492bb7db6947300ef599d3cb57215d05722 [file] [log] [blame]
// Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "starboard/system.h"
#include <winsock2.h>
#include <ifdef.h>
#include <iphlpapi.h>
#include "starboard/shared/win32/adapter_utils.h"
namespace sbwin32 = ::starboard::shared::win32;
namespace {
// Return the connection type of the first "up" ethernet interface,
// or unknown if none found.
SbSystemConnectionType FindConnectionType(PIP_ADAPTER_ADDRESSES adapter) {
for (; adapter != nullptr; adapter = adapter->Next) {
if ((adapter->OperStatus != IfOperStatusUp) ||
!sbwin32::IsIfTypeEthernet(adapter->IfType)) {
continue;
}
// Some devices do not report IfType correctly.
// So, an extra attempt at determining if an interface is wireless is made.
if (adapter->IfType == IF_TYPE_IEEE80211 ||
(wcsstr(adapter->Description, L"WiFi") != nullptr)) {
return kSbSystemConnectionTypeWireless;
}
return kSbSystemConnectionTypeWired;
}
return kSbSystemConnectionTypeUnknown;
}
} // namespace
SbSystemConnectionType SbSystemGetConnectionType() {
std::unique_ptr<char[]> buffer;
if (!sbwin32::GetAdapters(kSbSocketAddressTypeIpv4, &buffer)) {
return kSbSystemConnectionTypeUnknown;
}
SbSystemConnectionType result = FindConnectionType(
reinterpret_cast<PIP_ADAPTER_ADDRESSES>(buffer.get()));
if (result != kSbSystemConnectionTypeUnknown) {
return result;
}
if (!sbwin32::GetAdapters(kSbSocketAddressTypeIpv6, &buffer)) {
return kSbSystemConnectionTypeUnknown;
}
return FindConnectionType(
reinterpret_cast<PIP_ADAPTER_ADDRESSES>(buffer.get()));
}