michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "NetUtils.h" michael@0: #include michael@0: #include michael@0: #include michael@0: #include "prinit.h" michael@0: #include "mozilla/Assertions.h" michael@0: #include "nsDebug.h" michael@0: michael@0: static void* sNetUtilsLib; michael@0: static PRCallOnceType sInitNetUtilsLib; michael@0: michael@0: static PRStatus michael@0: InitNetUtilsLib() michael@0: { michael@0: sNetUtilsLib = dlopen("/system/lib/libnetutils.so", RTLD_LAZY); michael@0: // We might fail to open the hardware lib. That's OK. michael@0: return PR_SUCCESS; michael@0: } michael@0: michael@0: static void* michael@0: GetNetUtilsLibHandle() michael@0: { michael@0: PR_CallOnce(&sInitNetUtilsLib, InitNetUtilsLib); michael@0: return sNetUtilsLib; michael@0: } michael@0: michael@0: // static michael@0: void* michael@0: NetUtils::GetSharedLibrary() michael@0: { michael@0: void* netLib = GetNetUtilsLibHandle(); michael@0: if (!netLib) { michael@0: NS_WARNING("No /system/lib/libnetutils.so"); michael@0: } michael@0: return netLib; michael@0: } michael@0: michael@0: // static michael@0: int32_t michael@0: NetUtils::SdkVersion() michael@0: { michael@0: char propVersion[PROPERTY_VALUE_MAX]; michael@0: property_get("ro.build.version.sdk", propVersion, "0"); michael@0: int32_t version = strtol(propVersion, nullptr, 10); michael@0: return version; michael@0: } michael@0: michael@0: DEFINE_DLFUNC(ifc_enable, int32_t, const char*) michael@0: DEFINE_DLFUNC(ifc_disable, int32_t, const char*) michael@0: DEFINE_DLFUNC(ifc_configure, int32_t, const char*, in_addr_t, uint32_t, michael@0: in_addr_t, in_addr_t, in_addr_t) michael@0: DEFINE_DLFUNC(ifc_reset_connections, int32_t, const char*, const int32_t) michael@0: DEFINE_DLFUNC(ifc_set_default_route, int32_t, const char*, in_addr_t) michael@0: DEFINE_DLFUNC(ifc_add_route, int32_t, const char*, const char*, uint32_t, const char*) michael@0: DEFINE_DLFUNC(ifc_remove_route, int32_t, const char*, const char*, uint32_t, const char*) michael@0: DEFINE_DLFUNC(ifc_remove_host_routes, int32_t, const char*) michael@0: DEFINE_DLFUNC(ifc_remove_default_route, int32_t, const char*) michael@0: DEFINE_DLFUNC(dhcp_stop, int32_t, const char*) michael@0: michael@0: int32_t NetUtils::do_ifc_enable(const char *ifname) michael@0: { michael@0: USE_DLFUNC(ifc_enable) michael@0: return ifc_enable(ifname); michael@0: } michael@0: michael@0: int32_t NetUtils::do_ifc_disable(const char *ifname) michael@0: { michael@0: USE_DLFUNC(ifc_disable) michael@0: return ifc_disable(ifname); michael@0: } michael@0: michael@0: int32_t NetUtils::do_ifc_configure(const char *ifname, michael@0: in_addr_t address, michael@0: uint32_t prefixLength, michael@0: in_addr_t gateway, michael@0: in_addr_t dns1, michael@0: in_addr_t dns2) michael@0: { michael@0: USE_DLFUNC(ifc_configure) michael@0: int32_t ret = ifc_configure(ifname, address, prefixLength, gateway, dns1, dns2); michael@0: return ret; michael@0: } michael@0: michael@0: int32_t NetUtils::do_ifc_reset_connections(const char *ifname, michael@0: const int32_t resetMask) michael@0: { michael@0: USE_DLFUNC(ifc_reset_connections) michael@0: return ifc_reset_connections(ifname, resetMask); michael@0: } michael@0: michael@0: int32_t NetUtils::do_ifc_set_default_route(const char *ifname, michael@0: in_addr_t gateway) michael@0: { michael@0: USE_DLFUNC(ifc_set_default_route) michael@0: return ifc_set_default_route(ifname, gateway); michael@0: } michael@0: michael@0: int32_t NetUtils::do_ifc_add_route(const char *ifname, michael@0: const char *dst, michael@0: uint32_t prefixLength, michael@0: const char *gateway) michael@0: { michael@0: USE_DLFUNC(ifc_add_route) michael@0: return ifc_add_route(ifname, dst, prefixLength, gateway); michael@0: } michael@0: michael@0: int32_t NetUtils::do_ifc_remove_route(const char *ifname, michael@0: const char *dst, michael@0: uint32_t prefixLength, michael@0: const char *gateway) michael@0: { michael@0: USE_DLFUNC(ifc_remove_route) michael@0: return ifc_remove_route(ifname, dst, prefixLength, gateway); michael@0: } michael@0: michael@0: int32_t NetUtils::do_ifc_remove_host_routes(const char *ifname) michael@0: { michael@0: USE_DLFUNC(ifc_remove_host_routes) michael@0: return ifc_remove_host_routes(ifname); michael@0: } michael@0: michael@0: int32_t NetUtils::do_ifc_remove_default_route(const char *ifname) michael@0: { michael@0: USE_DLFUNC(ifc_remove_default_route) michael@0: return ifc_remove_default_route(ifname); michael@0: } michael@0: michael@0: int32_t NetUtils::do_dhcp_stop(const char *ifname) michael@0: { michael@0: USE_DLFUNC(dhcp_stop) michael@0: return dhcp_stop(ifname); michael@0: } michael@0: michael@0: int32_t NetUtils::do_dhcp_do_request(const char *ifname, michael@0: char *ipaddr, michael@0: char *gateway, michael@0: uint32_t *prefixLength, michael@0: char *dns1, michael@0: char *dns2, michael@0: char *server, michael@0: uint32_t *lease, michael@0: char* vendorinfo) michael@0: { michael@0: int32_t ret = -1; michael@0: uint32_t sdkVersion = SdkVersion(); michael@0: michael@0: if (sdkVersion == 15) { michael@0: // ICS michael@0: // http://androidxref.com/4.0.4/xref/system/core/libnetutils/dhcp_utils.c#149 michael@0: DEFINE_DLFUNC(dhcp_do_request, int32_t, const char*, char*, char*, uint32_t*, char*, char*, char*, uint32_t*) michael@0: USE_DLFUNC(dhcp_do_request) michael@0: vendorinfo[0] = '\0'; michael@0: michael@0: ret = dhcp_do_request(ifname, ipaddr, gateway, prefixLength, dns1, dns2, michael@0: server, lease); michael@0: } else if (sdkVersion == 16 || sdkVersion == 17) { michael@0: // JB 4.1 and 4.2 michael@0: // http://androidxref.com/4.1.2/xref/system/core/libnetutils/dhcp_utils.c#175 michael@0: // http://androidxref.com/4.2.2_r1/xref/system/core/include/netutils/dhcp.h#26 michael@0: DEFINE_DLFUNC(dhcp_do_request, int32_t, const char*, char*, char*, uint32_t*, char*, char*, char*, uint32_t*, char*) michael@0: USE_DLFUNC(dhcp_do_request) michael@0: ret = dhcp_do_request(ifname, ipaddr, gateway, prefixLength, dns1, dns2, michael@0: server, lease, vendorinfo); michael@0: } else if (sdkVersion == 18) { michael@0: // JB 4.3 michael@0: // http://androidxref.com/4.3_r2.1/xref/system/core/libnetutils/dhcp_utils.c#181 michael@0: DEFINE_DLFUNC(dhcp_do_request, int32_t, const char*, char*, char*, uint32_t*, char**, char*, uint32_t*, char*, char*) michael@0: USE_DLFUNC(dhcp_do_request) michael@0: char *dns[3] = {dns1, dns2, nullptr}; michael@0: char domains[PROPERTY_VALUE_MAX]; michael@0: ret = dhcp_do_request(ifname, ipaddr, gateway, prefixLength, dns, michael@0: server, lease, vendorinfo, domains); michael@0: } else if (sdkVersion == 19) { michael@0: // JB 4.4 michael@0: // http://androidxref.com/4.4_r1/xref/system/core/libnetutils/dhcp_utils.c#18 michael@0: DEFINE_DLFUNC(dhcp_do_request, int32_t, const char*, char*, char*, uint32_t*, char**, char*, uint32_t*, char*, char*, char*) michael@0: USE_DLFUNC(dhcp_do_request) michael@0: char *dns[3] = {dns1, dns2, nullptr}; michael@0: char domains[PROPERTY_VALUE_MAX]; michael@0: char mtu[PROPERTY_VALUE_MAX]; michael@0: ret = dhcp_do_request(ifname, ipaddr, gateway, prefixLength, dns, server, lease, vendorinfo, domains, mtu); michael@0: } else { michael@0: NS_WARNING("Unable to perform do_dhcp_request: unsupported sdk version!"); michael@0: } michael@0: return ret; michael@0: }