android_net_NetUtils.cpp revision 3876495129cce3ed8ac6f247189b075dc9baec8f
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright 2008, The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 5dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes * you may not use this file except in compliance with the License. 6dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes * Unless required by applicable law or agreed to in writing, software 11dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 12dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "NetUtils" 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h" 2012324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker#include "JNIHelp.h" 213876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen#include "NetdClient.h" 223876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen#include "resolv_netid.h" 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/misc.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <arpa/inet.h> 270216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt#include <cutils/properties.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern "C" { 300900f3657664d9046e6723825fd32b244eef2b6cMike Lockwoodint ifc_enable(const char *ifname); 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint ifc_disable(const char *ifname); 328171e6f690cca1bad354e7e352823d79d420daf3Wink Savilleint ifc_reset_connections(const char *ifname, int reset_mask); 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 343c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwaltint dhcp_do_request(const char * const ifname, 350216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt const char *ipaddr, 360216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt const char *gateway, 3777b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey uint32_t *prefixLength, 383c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt const char *dns[], 390216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt const char *server, 4077b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey uint32_t *lease, 418058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt const char *vendorInfo, 42ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt const char *domains, 43ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt const char *mtu); 4431be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 453c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwaltint dhcp_do_request_renew(const char * const ifname, 4631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff const char *ipaddr, 4731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff const char *gateway, 4877b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey uint32_t *prefixLength, 493c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt const char *dns[], 5031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff const char *server, 5177b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey uint32_t *lease, 528058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt const char *vendorInfo, 53ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt const char *domains, 54ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt const char *mtu); 5531be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint dhcp_stop(const char *ifname); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint dhcp_release_lease(const char *ifname); 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectchar *dhcp_get_errmsg(); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define NETUTILS_PKG_NAME "android/net/NetworkUtils" 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The following remembers the jfieldID's of the fields 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the DhcpInfo Java object, so that we don't have 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to look them up every time. 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct fieldIds { 714717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID clear; 724717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID setInterfaceName; 734717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID addLinkAddress; 744717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID addGateway; 754717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID addDns; 768058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt jmethodID setDomains; 774717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID setServerAddress; 784717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID setLeaseDuration; 794717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID setVendorInfo; 804717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt} dhcpResultsFieldIds; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 820900f3657664d9046e6723825fd32b244eef2b6cMike Lockwoodstatic jint android_net_utils_enableInterface(JNIEnv* env, jobject clazz, jstring ifname) 830900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood{ 840900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood int result; 850900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood 860900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood const char *nameStr = env->GetStringUTFChars(ifname, NULL); 870900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood result = ::ifc_enable(nameStr); 880900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood env->ReleaseStringUTFChars(ifname, nameStr); 890900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood return (jint)result; 900900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood} 910900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_net_utils_disableInterface(JNIEnv* env, jobject clazz, jstring ifname) 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::ifc_disable(nameStr); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jint)result; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1028171e6f690cca1bad354e7e352823d79d420daf3Wink Savillestatic jint android_net_utils_resetConnections(JNIEnv* env, jobject clazz, 1038171e6f690cca1bad354e7e352823d79d420daf3Wink Saville jstring ifname, jint mask) 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 1088171e6f690cca1bad354e7e352823d79d420daf3Wink Saville 1095baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("android_net_utils_resetConnections in env=%p clazz=%p iface=%s mask=0x%x\n", 1108171e6f690cca1bad354e7e352823d79d420daf3Wink Saville env, clazz, nameStr, mask); 1118171e6f690cca1bad354e7e352823d79d420daf3Wink Saville 1128171e6f690cca1bad354e7e352823d79d420daf3Wink Saville result = ::ifc_reset_connections(nameStr, mask); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jint)result; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcpCommon(JNIEnv* env, jobject clazz, jstring ifname, 1184717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jobject dhcpResults, bool renew) 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 1210216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char ipaddr[PROPERTY_VALUE_MAX]; 1220216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt uint32_t prefixLength; 1230216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char gateway[PROPERTY_VALUE_MAX]; 1240216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char dns1[PROPERTY_VALUE_MAX]; 1250216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char dns2[PROPERTY_VALUE_MAX]; 1263c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt char dns3[PROPERTY_VALUE_MAX]; 1273c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt char dns4[PROPERTY_VALUE_MAX]; 1283c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt const char *dns[5] = {dns1, dns2, dns3, dns4, NULL}; 1290216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char server[PROPERTY_VALUE_MAX]; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t lease; 13177b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey char vendorInfo[PROPERTY_VALUE_MAX]; 1328058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt char domains[PROPERTY_VALUE_MAX]; 133ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt char mtu[PROPERTY_VALUE_MAX]; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 1360216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt if (nameStr == NULL) return (jboolean)false; 1370216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt 13831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff if (renew) { 13931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff result = ::dhcp_do_request_renew(nameStr, ipaddr, gateway, &prefixLength, 140ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt dns, server, &lease, vendorInfo, domains, mtu); 14131be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff } else { 14231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff result = ::dhcp_do_request(nameStr, ipaddr, gateway, &prefixLength, 143ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt dns, server, &lease, vendorInfo, domains, mtu); 14431be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff } 14528cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt if (result != 0) { 146c249c2cc6b601ed1ff063f1748ba4399b9270209Vinit Deshapnde ALOGD("dhcp_do_request failed : %s (%s)", nameStr, renew ? "renew" : "new"); 14728cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt } 14828cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 15046e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom if (result == 0) { 1514717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.clear); 152aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt 1534717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // set mIfaceName 1544717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->setInterfaceName(ifname) 1554717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setInterfaceName, ifname); 1564717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1574717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // set the linkAddress 1584717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->addLinkAddress(inetAddress, prefixLength) 1594717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt result = env->CallBooleanMethod(dhcpResults, dhcpResultsFieldIds.addLinkAddress, 1604717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->NewStringUTF(ipaddr), prefixLength); 1614717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt } 1624717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1634717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt if (result == 0) { 164aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt // set the gateway 1654717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->addGateway(gateway) 1664717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt result = env->CallBooleanMethod(dhcpResults, 1674717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.addGateway, env->NewStringUTF(gateway)); 1684717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt } 1694717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1704717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt if (result == 0) { 1714717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->addDns(new InetAddress(dns1)) 1724717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt result = env->CallBooleanMethod(dhcpResults, 1734717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.addDns, env->NewStringUTF(dns1)); 1744717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt } 1754717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1764717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt if (result == 0) { 1778058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setDomains, 1788058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt env->NewStringUTF(domains)); 1798058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt 1804717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt result = env->CallBooleanMethod(dhcpResults, 1814717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.addDns, env->NewStringUTF(dns2)); 1823c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt 1833c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt if (result == 0) { 1843c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt result = env->CallBooleanMethod(dhcpResults, 1853c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt dhcpResultsFieldIds.addDns, env->NewStringUTF(dns3)); 1863c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt if (result == 0) { 1873c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt result = env->CallBooleanMethod(dhcpResults, 1883c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt dhcpResultsFieldIds.addDns, env->NewStringUTF(dns4)); 1893c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt } 1903c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt } 1914717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt } 1924717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1934717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt if (result == 0) { 1944717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->setServerAddress(new InetAddress(server)) 1954717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt result = env->CallBooleanMethod(dhcpResults, dhcpResultsFieldIds.setServerAddress, 1960216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->NewStringUTF(server)); 1974717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt } 1984717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1994717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt if (result == 0) { 2004717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->setLeaseDuration(lease) 2014717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->CallVoidMethod(dhcpResults, 2024717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.setLeaseDuration, lease); 2034717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 2044717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->setVendorInfo(vendorInfo) 2054717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setVendorInfo, 2064717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->NewStringUTF(vendorInfo)); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jboolean)(result == 0); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2114717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 21231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcp(JNIEnv* env, jobject clazz, jstring ifname, jobject info) 21331be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff{ 21431be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff return android_net_utils_runDhcpCommon(env, clazz, ifname, info, false); 21531be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff} 21631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 21731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcpRenew(JNIEnv* env, jobject clazz, jstring ifname, jobject info) 21831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff{ 21931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff return android_net_utils_runDhcpCommon(env, clazz, ifname, info, true); 22031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff} 22131be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 22231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_net_utils_stopDhcp(JNIEnv* env, jobject clazz, jstring ifname) 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::dhcp_stop(nameStr); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jboolean)(result == 0); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_net_utils_releaseDhcpLease(JNIEnv* env, jobject clazz, jstring ifname) 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::dhcp_release_lease(nameStr); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jboolean)(result == 0); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_net_utils_getDhcpError(JNIEnv* env, jobject clazz) 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewStringUTF(::dhcp_get_errmsg()); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24812324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubakerstatic void android_net_utils_markSocket(JNIEnv *env, jobject thiz, jint socket, jint mark) 24912324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker{ 25012324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker if (setsockopt(socket, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)) < 0) { 25112324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker jniThrowException(env, "java/lang/IllegalStateException", "Error marking socket"); 25212324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker } 25312324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker} 25412324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker 2553876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensenstatic void android_net_utils_bindProcessToNetwork(JNIEnv *env, jobject thiz, jint netId) 2563876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{ 2573876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen setNetworkForProcess(netId); 2583876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen} 2593876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen 2603876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensenstatic void android_net_utils_unbindProcessToNetwork(JNIEnv *env, jobject thiz) 2613876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{ 2623876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen setNetworkForProcess(NETID_UNSET); 2633876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen} 2643876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen 2653876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensenstatic jint android_net_utils_getNetworkBoundToProcess(JNIEnv *env, jobject thiz) 2663876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{ 2673876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen return getNetworkForProcess(); 2683876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen} 2693876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen 2703876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensenstatic void android_net_utils_bindProcessToNetworkForHostResolution(JNIEnv *env, jobject thiz, jint netId) 2713876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{ 2723876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen setNetworkForResolv(netId); 2733876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen} 2743876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen 2753876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensenstatic void android_net_utils_unbindProcessToNetworkForHostResolution(JNIEnv *env, jobject thiz) 2763876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{ 2773876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen setNetworkForResolv(NETID_UNSET); 2783876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen} 2793876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen 2803876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensenstatic void android_net_utils_bindSocketToNetwork(JNIEnv *env, jobject thiz, jint socket, jint netId) 2813876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{ 2823876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen setNetworkForSocket(netId, socket); 2833876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen} 2843876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration. 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gNetworkUtilMethods[] = { 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2930900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood { "enableInterface", "(Ljava/lang/String;)I", (void *)android_net_utils_enableInterface }, 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "disableInterface", "(Ljava/lang/String;)I", (void *)android_net_utils_disableInterface }, 2958171e6f690cca1bad354e7e352823d79d420daf3Wink Saville { "resetConnections", "(Ljava/lang/String;I)I", (void *)android_net_utils_resetConnections }, 2964717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt { "runDhcp", "(Ljava/lang/String;Landroid/net/DhcpResults;)Z", (void *)android_net_utils_runDhcp }, 2974717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt { "runDhcpRenew", "(Ljava/lang/String;Landroid/net/DhcpResults;)Z", (void *)android_net_utils_runDhcpRenew }, 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "stopDhcp", "(Ljava/lang/String;)Z", (void *)android_net_utils_stopDhcp }, 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "releaseDhcpLease", "(Ljava/lang/String;)Z", (void *)android_net_utils_releaseDhcpLease }, 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getDhcpError", "()Ljava/lang/String;", (void*) android_net_utils_getDhcpError }, 30112324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker { "markSocket", "(II)V", (void*) android_net_utils_markSocket }, 3023876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen { "bindProcessToNetwork", "(I)V", (void*) android_net_utils_bindProcessToNetwork }, 3033876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen { "getNetworkBoundToProcess", "()I", (void*) android_net_utils_getNetworkBoundToProcess }, 3043876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen { "unbindProcessToNetwork", "()V", (void*) android_net_utils_unbindProcessToNetwork }, 3053876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen { "bindProcessToNetworkForHostResolution", "(I)V", (void*) android_net_utils_bindProcessToNetworkForHostResolution }, 3063876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen { "unbindProcessToNetworkForHostResolution", "()V", (void*) android_net_utils_unbindProcessToNetworkForHostResolution }, 3073876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen { "bindSocketToNetwork", "(II)V", (void*) android_net_utils_bindSocketToNetwork }, 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_net_NetworkUtils(JNIEnv* env) 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3124717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jclass dhcpResultsClass = env->FindClass("android/net/DhcpResults"); 3134717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt LOG_FATAL_IF(dhcpResultsClass == NULL, "Unable to find class android/net/DhcpResults"); 3144717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.clear = 3154717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->GetMethodID(dhcpResultsClass, "clear", "()V"); 3164717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.setInterfaceName = 3174717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->GetMethodID(dhcpResultsClass, "setInterfaceName", "(Ljava/lang/String;)V"); 3184717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.addLinkAddress = 3194717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->GetMethodID(dhcpResultsClass, "addLinkAddress", "(Ljava/lang/String;I)Z"); 3204717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.addGateway = 3214717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->GetMethodID(dhcpResultsClass, "addGateway", "(Ljava/lang/String;)Z"); 3224717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.addDns = 3234717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->GetMethodID(dhcpResultsClass, "addDns", "(Ljava/lang/String;)Z"); 3248058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt dhcpResultsFieldIds.setDomains = 3258058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt env->GetMethodID(dhcpResultsClass, "setDomains", "(Ljava/lang/String;)V"); 3264717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.setServerAddress = 3274717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->GetMethodID(dhcpResultsClass, "setServerAddress", "(Ljava/lang/String;)Z"); 3284717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.setLeaseDuration = 3294717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->GetMethodID(dhcpResultsClass, "setLeaseDuration", "(I)V"); 3304717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.setVendorInfo = 3314717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->GetMethodID(dhcpResultsClass, "setVendorInfo", "(Ljava/lang/String;)V"); 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NETUTILS_PKG_NAME, gNetworkUtilMethods, NELEM(gNetworkUtilMethods)); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 338