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; 720a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti jmethodID setIpAddress; 730a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti jmethodID setGateway; 744717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID addDns; 758058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt jmethodID setDomains; 764717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID setServerAddress; 774717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID setLeaseDuration; 784717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID setVendorInfo; 794717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt} dhcpResultsFieldIds; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 818171e6f690cca1bad354e7e352823d79d420daf3Wink Savillestatic jint android_net_utils_resetConnections(JNIEnv* env, jobject clazz, 828171e6f690cca1bad354e7e352823d79d420daf3Wink Saville jstring ifname, jint mask) 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 878171e6f690cca1bad354e7e352823d79d420daf3Wink Saville 885baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("android_net_utils_resetConnections in env=%p clazz=%p iface=%s mask=0x%x\n", 898171e6f690cca1bad354e7e352823d79d420daf3Wink Saville env, clazz, nameStr, mask); 908171e6f690cca1bad354e7e352823d79d420daf3Wink Saville 918171e6f690cca1bad354e7e352823d79d420daf3Wink Saville result = ::ifc_reset_connections(nameStr, mask); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jint)result; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcpCommon(JNIEnv* env, jobject clazz, jstring ifname, 974717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jobject dhcpResults, bool renew) 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 1000216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char ipaddr[PROPERTY_VALUE_MAX]; 1010216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt uint32_t prefixLength; 1020216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char gateway[PROPERTY_VALUE_MAX]; 1030216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char dns1[PROPERTY_VALUE_MAX]; 1040216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char dns2[PROPERTY_VALUE_MAX]; 1053c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt char dns3[PROPERTY_VALUE_MAX]; 1063c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt char dns4[PROPERTY_VALUE_MAX]; 1073c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt const char *dns[5] = {dns1, dns2, dns3, dns4, NULL}; 1080216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char server[PROPERTY_VALUE_MAX]; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t lease; 11077b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey char vendorInfo[PROPERTY_VALUE_MAX]; 1118058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt char domains[PROPERTY_VALUE_MAX]; 112ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt char mtu[PROPERTY_VALUE_MAX]; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 1150216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt if (nameStr == NULL) return (jboolean)false; 1160216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt 11731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff if (renew) { 11831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff result = ::dhcp_do_request_renew(nameStr, ipaddr, gateway, &prefixLength, 119ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt dns, server, &lease, vendorInfo, domains, mtu); 12031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff } else { 12131be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff result = ::dhcp_do_request(nameStr, ipaddr, gateway, &prefixLength, 122ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt dns, server, &lease, vendorInfo, domains, mtu); 12331be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff } 12428cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt if (result != 0) { 125c249c2cc6b601ed1ff063f1748ba4399b9270209Vinit Deshapnde ALOGD("dhcp_do_request failed : %s (%s)", nameStr, renew ? "renew" : "new"); 12628cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt } 12728cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 12946e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom if (result == 0) { 1304717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.clear); 131aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt 1324717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // set the linkAddress 1334717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->addLinkAddress(inetAddress, prefixLength) 1340a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti result = env->CallBooleanMethod(dhcpResults, dhcpResultsFieldIds.setIpAddress, 1354717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->NewStringUTF(ipaddr), prefixLength); 1364717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt } 1374717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1384717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt if (result == 0) { 139aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt // set the gateway 1404717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt result = env->CallBooleanMethod(dhcpResults, 1410a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti dhcpResultsFieldIds.setGateway, env->NewStringUTF(gateway)); 1424717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt } 1434717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1444717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt if (result == 0) { 1454717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->addDns(new InetAddress(dns1)) 1464717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt result = env->CallBooleanMethod(dhcpResults, 1474717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.addDns, env->NewStringUTF(dns1)); 1484717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt } 1494717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1504717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt if (result == 0) { 1518058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setDomains, 1528058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt env->NewStringUTF(domains)); 1538058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt 1544717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt result = env->CallBooleanMethod(dhcpResults, 1554717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.addDns, env->NewStringUTF(dns2)); 1563c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt 1573c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt if (result == 0) { 1583c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt result = env->CallBooleanMethod(dhcpResults, 1593c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt dhcpResultsFieldIds.addDns, env->NewStringUTF(dns3)); 1603c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt if (result == 0) { 1613c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt result = env->CallBooleanMethod(dhcpResults, 1623c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt dhcpResultsFieldIds.addDns, env->NewStringUTF(dns4)); 1633c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt } 1643c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt } 1654717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt } 1664717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1674717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt if (result == 0) { 1684717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->setServerAddress(new InetAddress(server)) 1694717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt result = env->CallBooleanMethod(dhcpResults, dhcpResultsFieldIds.setServerAddress, 1700216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->NewStringUTF(server)); 1714717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt } 1724717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1734717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt if (result == 0) { 1744717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->setLeaseDuration(lease) 1754717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->CallVoidMethod(dhcpResults, 1764717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.setLeaseDuration, lease); 1774717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1784717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->setVendorInfo(vendorInfo) 1794717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setVendorInfo, 1804717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->NewStringUTF(vendorInfo)); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jboolean)(result == 0); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1854717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 18631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcp(JNIEnv* env, jobject clazz, jstring ifname, jobject info) 18731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff{ 18831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff return android_net_utils_runDhcpCommon(env, clazz, ifname, info, false); 18931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff} 19031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 19132a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensenstatic jboolean android_net_utils_runDhcpRenew(JNIEnv* env, jobject clazz, jstring ifname, 19232a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen jobject info) 19331be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff{ 19431be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff return android_net_utils_runDhcpCommon(env, clazz, ifname, info, true); 19531be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff} 19631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 19731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_net_utils_stopDhcp(JNIEnv* env, jobject clazz, jstring ifname) 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::dhcp_stop(nameStr); 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jboolean)(result == 0); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_net_utils_releaseDhcpLease(JNIEnv* env, jobject clazz, jstring ifname) 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::dhcp_release_lease(nameStr); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jboolean)(result == 0); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_net_utils_getDhcpError(JNIEnv* env, jobject clazz) 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewStringUTF(::dhcp_get_errmsg()); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22332a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensenstatic jboolean android_net_utils_bindProcessToNetwork(JNIEnv *env, jobject thiz, jint netId) 2243876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{ 22532a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen return (jboolean) !setNetworkForProcess(netId); 2263876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen} 2273876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen 2283876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensenstatic jint android_net_utils_getNetworkBoundToProcess(JNIEnv *env, jobject thiz) 2293876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{ 2303876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen return getNetworkForProcess(); 2313876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen} 2323876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen 23332a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensenstatic jboolean android_net_utils_bindProcessToNetworkForHostResolution(JNIEnv *env, jobject thiz, 23432a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen jint netId) 2353876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{ 23632a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen return (jboolean) !setNetworkForResolv(netId); 2373876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen} 2383876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen 2399f1274b7e43d14c7e3a42148ebfda3905fec8b06Lorenzo Colittistatic jint android_net_utils_bindSocketToNetwork(JNIEnv *env, jobject thiz, jint socket, 24032a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen jint netId) 2413876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{ 2429f1274b7e43d14c7e3a42148ebfda3905fec8b06Lorenzo Colitti return setNetworkForSocket(netId, socket); 2433876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen} 2443876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen 2456bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensenstatic jboolean android_net_utils_protectFromVpn(JNIEnv *env, jobject thiz, jint socket) 2466bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen{ 2476bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen return (jboolean) !protectFromVpn(socket); 2486bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen} 2496bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration. 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gNetworkUtilMethods[] = { 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 2578171e6f690cca1bad354e7e352823d79d420daf3Wink Saville { "resetConnections", "(Ljava/lang/String;I)I", (void *)android_net_utils_resetConnections }, 2584717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt { "runDhcp", "(Ljava/lang/String;Landroid/net/DhcpResults;)Z", (void *)android_net_utils_runDhcp }, 2594717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt { "runDhcpRenew", "(Ljava/lang/String;Landroid/net/DhcpResults;)Z", (void *)android_net_utils_runDhcpRenew }, 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "stopDhcp", "(Ljava/lang/String;)Z", (void *)android_net_utils_stopDhcp }, 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "releaseDhcpLease", "(Ljava/lang/String;)Z", (void *)android_net_utils_releaseDhcpLease }, 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getDhcpError", "()Ljava/lang/String;", (void*) android_net_utils_getDhcpError }, 26332a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen { "bindProcessToNetwork", "(I)Z", (void*) android_net_utils_bindProcessToNetwork }, 2643876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen { "getNetworkBoundToProcess", "()I", (void*) android_net_utils_getNetworkBoundToProcess }, 26532a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen { "bindProcessToNetworkForHostResolution", "(I)Z", (void*) android_net_utils_bindProcessToNetworkForHostResolution }, 2669f1274b7e43d14c7e3a42148ebfda3905fec8b06Lorenzo Colitti { "bindSocketToNetwork", "(II)I", (void*) android_net_utils_bindSocketToNetwork }, 2676bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen { "protectFromVpn", "(I)Z", (void*)android_net_utils_protectFromVpn }, 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_net_NetworkUtils(JNIEnv* env) 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2724717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jclass dhcpResultsClass = env->FindClass("android/net/DhcpResults"); 2734717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt LOG_FATAL_IF(dhcpResultsClass == NULL, "Unable to find class android/net/DhcpResults"); 2744717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.clear = 2754717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->GetMethodID(dhcpResultsClass, "clear", "()V"); 2760a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti dhcpResultsFieldIds.setIpAddress = 2770a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti env->GetMethodID(dhcpResultsClass, "setIpAddress", "(Ljava/lang/String;I)Z"); 2780a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti dhcpResultsFieldIds.setGateway = 2790a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti env->GetMethodID(dhcpResultsClass, "setGateway", "(Ljava/lang/String;)Z"); 2804717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.addDns = 2814717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->GetMethodID(dhcpResultsClass, "addDns", "(Ljava/lang/String;)Z"); 2828058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt dhcpResultsFieldIds.setDomains = 2838058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt env->GetMethodID(dhcpResultsClass, "setDomains", "(Ljava/lang/String;)V"); 2844717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.setServerAddress = 2854717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->GetMethodID(dhcpResultsClass, "setServerAddress", "(Ljava/lang/String;)Z"); 2864717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.setLeaseDuration = 2874717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->GetMethodID(dhcpResultsClass, "setLeaseDuration", "(I)V"); 2884717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.setVendorInfo = 2894717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->GetMethodID(dhcpResultsClass, "setVendorInfo", "(Ljava/lang/String;)V"); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NETUTILS_PKG_NAME, gNetworkUtilMethods, NELEM(gNetworkUtilMethods)); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 296