android_net_NetUtils.cpp revision 987f79f60bb1f0a4bcd3ef22e57301c743f0b94f
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 29987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#include "core_jni_helpers.h" 30987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern "C" { 320900f3657664d9046e6723825fd32b244eef2b6cMike Lockwoodint ifc_enable(const char *ifname); 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint ifc_disable(const char *ifname); 348171e6f690cca1bad354e7e352823d79d420daf3Wink Savilleint ifc_reset_connections(const char *ifname, int reset_mask); 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 363c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwaltint dhcp_do_request(const char * const ifname, 370216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt const char *ipaddr, 380216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt const char *gateway, 3977b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey uint32_t *prefixLength, 403c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt const char *dns[], 410216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt const char *server, 4277b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey uint32_t *lease, 438058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt const char *vendorInfo, 44ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt const char *domains, 45ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt const char *mtu); 4631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 473c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwaltint dhcp_do_request_renew(const char * const ifname, 4831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff const char *ipaddr, 4931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff const char *gateway, 5077b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey uint32_t *prefixLength, 513c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt const char *dns[], 5231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff const char *server, 5377b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey uint32_t *lease, 548058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt const char *vendorInfo, 55ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt const char *domains, 56ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt const char *mtu); 5731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint dhcp_stop(const char *ifname); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint dhcp_release_lease(const char *ifname); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectchar *dhcp_get_errmsg(); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define NETUTILS_PKG_NAME "android/net/NetworkUtils" 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The following remembers the jfieldID's of the fields 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the DhcpInfo Java object, so that we don't have 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to look them up every time. 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct fieldIds { 734717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID clear; 740a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti jmethodID setIpAddress; 750a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti jmethodID setGateway; 764717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID addDns; 778058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt jmethodID setDomains; 784717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID setServerAddress; 794717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID setLeaseDuration; 804717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID setVendorInfo; 814717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt} dhcpResultsFieldIds; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 838171e6f690cca1bad354e7e352823d79d420daf3Wink Savillestatic jint android_net_utils_resetConnections(JNIEnv* env, jobject clazz, 848171e6f690cca1bad354e7e352823d79d420daf3Wink Saville jstring ifname, jint mask) 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 898171e6f690cca1bad354e7e352823d79d420daf3Wink Saville 905baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("android_net_utils_resetConnections in env=%p clazz=%p iface=%s mask=0x%x\n", 918171e6f690cca1bad354e7e352823d79d420daf3Wink Saville env, clazz, nameStr, mask); 928171e6f690cca1bad354e7e352823d79d420daf3Wink Saville 938171e6f690cca1bad354e7e352823d79d420daf3Wink Saville result = ::ifc_reset_connections(nameStr, mask); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jint)result; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcpCommon(JNIEnv* env, jobject clazz, jstring ifname, 994717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jobject dhcpResults, bool renew) 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 1020216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char ipaddr[PROPERTY_VALUE_MAX]; 1030216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt uint32_t prefixLength; 1040216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char gateway[PROPERTY_VALUE_MAX]; 1050216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char dns1[PROPERTY_VALUE_MAX]; 1060216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char dns2[PROPERTY_VALUE_MAX]; 1073c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt char dns3[PROPERTY_VALUE_MAX]; 1083c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt char dns4[PROPERTY_VALUE_MAX]; 1093c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt const char *dns[5] = {dns1, dns2, dns3, dns4, NULL}; 1100216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char server[PROPERTY_VALUE_MAX]; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t lease; 11277b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey char vendorInfo[PROPERTY_VALUE_MAX]; 1138058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt char domains[PROPERTY_VALUE_MAX]; 114ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt char mtu[PROPERTY_VALUE_MAX]; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 1170216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt if (nameStr == NULL) return (jboolean)false; 1180216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt 11931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff if (renew) { 12031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff result = ::dhcp_do_request_renew(nameStr, ipaddr, gateway, &prefixLength, 121ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt dns, server, &lease, vendorInfo, domains, mtu); 12231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff } else { 12331be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff result = ::dhcp_do_request(nameStr, ipaddr, gateway, &prefixLength, 124ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt dns, server, &lease, vendorInfo, domains, mtu); 12531be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff } 12628cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt if (result != 0) { 127c249c2cc6b601ed1ff063f1748ba4399b9270209Vinit Deshapnde ALOGD("dhcp_do_request failed : %s (%s)", nameStr, renew ? "renew" : "new"); 12828cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt } 12928cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 13146e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom if (result == 0) { 1324717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.clear); 133aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt 1344717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // set the linkAddress 1354717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->addLinkAddress(inetAddress, prefixLength) 1360a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti result = env->CallBooleanMethod(dhcpResults, dhcpResultsFieldIds.setIpAddress, 1374717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->NewStringUTF(ipaddr), prefixLength); 1384717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt } 1394717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1404717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt if (result == 0) { 141aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt // set the gateway 1424717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt result = env->CallBooleanMethod(dhcpResults, 1430a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti dhcpResultsFieldIds.setGateway, env->NewStringUTF(gateway)); 1444717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt } 1454717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1464717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt if (result == 0) { 1474717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->addDns(new InetAddress(dns1)) 1484717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt result = env->CallBooleanMethod(dhcpResults, 1494717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.addDns, env->NewStringUTF(dns1)); 1504717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt } 1514717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1524717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt if (result == 0) { 1538058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setDomains, 1548058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt env->NewStringUTF(domains)); 1558058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt 1564717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt result = env->CallBooleanMethod(dhcpResults, 1574717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.addDns, env->NewStringUTF(dns2)); 1583c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt 1593c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt if (result == 0) { 1603c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt result = env->CallBooleanMethod(dhcpResults, 1613c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt dhcpResultsFieldIds.addDns, env->NewStringUTF(dns3)); 1623c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt if (result == 0) { 1633c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt result = env->CallBooleanMethod(dhcpResults, 1643c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt dhcpResultsFieldIds.addDns, env->NewStringUTF(dns4)); 1653c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt } 1663c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt } 1674717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt } 1684717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1694717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt if (result == 0) { 1704717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->setServerAddress(new InetAddress(server)) 1714717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt result = env->CallBooleanMethod(dhcpResults, dhcpResultsFieldIds.setServerAddress, 1720216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->NewStringUTF(server)); 1734717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt } 1744717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1754717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt if (result == 0) { 1764717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->setLeaseDuration(lease) 1774717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->CallVoidMethod(dhcpResults, 1784717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.setLeaseDuration, lease); 1794717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1804717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->setVendorInfo(vendorInfo) 1814717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setVendorInfo, 1824717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->NewStringUTF(vendorInfo)); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jboolean)(result == 0); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1874717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 18831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcp(JNIEnv* env, jobject clazz, jstring ifname, jobject info) 18931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff{ 19031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff return android_net_utils_runDhcpCommon(env, clazz, ifname, info, false); 19131be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff} 19231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 19332a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensenstatic jboolean android_net_utils_runDhcpRenew(JNIEnv* env, jobject clazz, jstring ifname, 19432a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen jobject info) 19531be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff{ 19631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff return android_net_utils_runDhcpCommon(env, clazz, ifname, info, true); 19731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff} 19831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 19931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_net_utils_stopDhcp(JNIEnv* env, jobject clazz, jstring ifname) 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::dhcp_stop(nameStr); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jboolean)(result == 0); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_net_utils_releaseDhcpLease(JNIEnv* env, jobject clazz, jstring ifname) 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::dhcp_release_lease(nameStr); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jboolean)(result == 0); 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_net_utils_getDhcpError(JNIEnv* env, jobject clazz) 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewStringUTF(::dhcp_get_errmsg()); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22532a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensenstatic jboolean android_net_utils_bindProcessToNetwork(JNIEnv *env, jobject thiz, jint netId) 2263876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{ 22732a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen return (jboolean) !setNetworkForProcess(netId); 2283876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen} 2293876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen 2303876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensenstatic jint android_net_utils_getNetworkBoundToProcess(JNIEnv *env, jobject thiz) 2313876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{ 2323876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen return getNetworkForProcess(); 2333876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen} 2343876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen 23532a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensenstatic jboolean android_net_utils_bindProcessToNetworkForHostResolution(JNIEnv *env, jobject thiz, 23632a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen jint netId) 2373876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{ 23832a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen return (jboolean) !setNetworkForResolv(netId); 2393876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen} 2403876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen 2419f1274b7e43d14c7e3a42148ebfda3905fec8b06Lorenzo Colittistatic jint android_net_utils_bindSocketToNetwork(JNIEnv *env, jobject thiz, jint socket, 24232a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen jint netId) 2433876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{ 2449f1274b7e43d14c7e3a42148ebfda3905fec8b06Lorenzo Colitti return setNetworkForSocket(netId, socket); 2453876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen} 2463876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen 2476bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensenstatic jboolean android_net_utils_protectFromVpn(JNIEnv *env, jobject thiz, jint socket) 2486bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen{ 2496bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen return (jboolean) !protectFromVpn(socket); 2506bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen} 2516bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration. 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gNetworkUtilMethods[] = { 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 2598171e6f690cca1bad354e7e352823d79d420daf3Wink Saville { "resetConnections", "(Ljava/lang/String;I)I", (void *)android_net_utils_resetConnections }, 2604717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt { "runDhcp", "(Ljava/lang/String;Landroid/net/DhcpResults;)Z", (void *)android_net_utils_runDhcp }, 2614717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt { "runDhcpRenew", "(Ljava/lang/String;Landroid/net/DhcpResults;)Z", (void *)android_net_utils_runDhcpRenew }, 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "stopDhcp", "(Ljava/lang/String;)Z", (void *)android_net_utils_stopDhcp }, 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "releaseDhcpLease", "(Ljava/lang/String;)Z", (void *)android_net_utils_releaseDhcpLease }, 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getDhcpError", "()Ljava/lang/String;", (void*) android_net_utils_getDhcpError }, 26532a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen { "bindProcessToNetwork", "(I)Z", (void*) android_net_utils_bindProcessToNetwork }, 2663876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen { "getNetworkBoundToProcess", "()I", (void*) android_net_utils_getNetworkBoundToProcess }, 26732a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen { "bindProcessToNetworkForHostResolution", "(I)Z", (void*) android_net_utils_bindProcessToNetworkForHostResolution }, 2689f1274b7e43d14c7e3a42148ebfda3905fec8b06Lorenzo Colitti { "bindSocketToNetwork", "(II)I", (void*) android_net_utils_bindSocketToNetwork }, 2696bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen { "protectFromVpn", "(I)Z", (void*)android_net_utils_protectFromVpn }, 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_net_NetworkUtils(JNIEnv* env) 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 274987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe jclass dhcpResultsClass = FindClassOrDie(env, "android/net/DhcpResults"); 275987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 276987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe dhcpResultsFieldIds.clear = GetMethodIDOrDie(env, dhcpResultsClass, "clear", "()V"); 277987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe dhcpResultsFieldIds.setIpAddress =GetMethodIDOrDie(env, dhcpResultsClass, "setIpAddress", 278987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe "(Ljava/lang/String;I)Z"); 279987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe dhcpResultsFieldIds.setGateway = GetMethodIDOrDie(env, dhcpResultsClass, "setGateway", 280987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe "(Ljava/lang/String;)Z"); 281987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe dhcpResultsFieldIds.addDns = GetMethodIDOrDie(env, dhcpResultsClass, "addDns", 282987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe "(Ljava/lang/String;)Z"); 283987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe dhcpResultsFieldIds.setDomains = GetMethodIDOrDie(env, dhcpResultsClass, "setDomains", 284987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe "(Ljava/lang/String;)V"); 285987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe dhcpResultsFieldIds.setServerAddress = GetMethodIDOrDie(env, dhcpResultsClass, 286987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe "setServerAddress", "(Ljava/lang/String;)Z"); 287987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe dhcpResultsFieldIds.setLeaseDuration = GetMethodIDOrDie(env, dhcpResultsClass, 288987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe "setLeaseDuration", "(I)V"); 289987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe dhcpResultsFieldIds.setVendorInfo = GetMethodIDOrDie(env, dhcpResultsClass, "setVendorInfo", 290987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe "(Ljava/lang/String;)V"); 291987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 292987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe return RegisterMethodsOrDie(env, NETUTILS_PKG_NAME, gNetworkUtilMethods, 293987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe NELEM(gNetworkUtilMethods)); 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 297