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" 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/misc.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <arpa/inet.h> 250216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt#include <cutils/properties.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern "C" { 280900f3657664d9046e6723825fd32b244eef2b6cMike Lockwoodint ifc_enable(const char *ifname); 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint ifc_disable(const char *ifname); 308171e6f690cca1bad354e7e352823d79d420daf3Wink Savilleint ifc_reset_connections(const char *ifname, int reset_mask); 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 323c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwaltint dhcp_do_request(const char * const ifname, 330216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt const char *ipaddr, 340216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt const char *gateway, 3577b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey uint32_t *prefixLength, 363c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt const char *dns[], 370216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt const char *server, 3877b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey uint32_t *lease, 398058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt const char *vendorInfo, 40ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt const char *domains, 41ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt const char *mtu); 4231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 433c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwaltint dhcp_do_request_renew(const char * const ifname, 4431be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff const char *ipaddr, 4531be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff const char *gateway, 4677b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey uint32_t *prefixLength, 473c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt const char *dns[], 4831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff const char *server, 4977b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey uint32_t *lease, 508058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt const char *vendorInfo, 51ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt const char *domains, 52ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt const char *mtu); 5331be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint dhcp_stop(const char *ifname); 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint dhcp_release_lease(const char *ifname); 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectchar *dhcp_get_errmsg(); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define NETUTILS_PKG_NAME "android/net/NetworkUtils" 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The following remembers the jfieldID's of the fields 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the DhcpInfo Java object, so that we don't have 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to look them up every time. 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct fieldIds { 694717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID clear; 704717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID setInterfaceName; 714717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID addLinkAddress; 724717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID addGateway; 734717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID addDns; 748058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt jmethodID setDomains; 754717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID setServerAddress; 764717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID setLeaseDuration; 774717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jmethodID setVendorInfo; 784717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt} dhcpResultsFieldIds; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 800900f3657664d9046e6723825fd32b244eef2b6cMike Lockwoodstatic jint android_net_utils_enableInterface(JNIEnv* env, jobject clazz, jstring ifname) 810900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood{ 820900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood int result; 830900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood 840900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood const char *nameStr = env->GetStringUTFChars(ifname, NULL); 850900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood result = ::ifc_enable(nameStr); 860900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood env->ReleaseStringUTFChars(ifname, nameStr); 870900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood return (jint)result; 880900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood} 890900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_net_utils_disableInterface(JNIEnv* env, jobject clazz, jstring ifname) 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::ifc_disable(nameStr); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jint)result; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1008171e6f690cca1bad354e7e352823d79d420daf3Wink Savillestatic jint android_net_utils_resetConnections(JNIEnv* env, jobject clazz, 1018171e6f690cca1bad354e7e352823d79d420daf3Wink Saville jstring ifname, jint mask) 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 1068171e6f690cca1bad354e7e352823d79d420daf3Wink Saville 1075baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("android_net_utils_resetConnections in env=%p clazz=%p iface=%s mask=0x%x\n", 1088171e6f690cca1bad354e7e352823d79d420daf3Wink Saville env, clazz, nameStr, mask); 1098171e6f690cca1bad354e7e352823d79d420daf3Wink Saville 1108171e6f690cca1bad354e7e352823d79d420daf3Wink Saville result = ::ifc_reset_connections(nameStr, mask); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jint)result; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11531be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcpCommon(JNIEnv* env, jobject clazz, jstring ifname, 1164717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jobject dhcpResults, bool renew) 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 1190216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char ipaddr[PROPERTY_VALUE_MAX]; 1200216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt uint32_t prefixLength; 1210216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char gateway[PROPERTY_VALUE_MAX]; 1220216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char dns1[PROPERTY_VALUE_MAX]; 1230216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char dns2[PROPERTY_VALUE_MAX]; 1243c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt char dns3[PROPERTY_VALUE_MAX]; 1253c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt char dns4[PROPERTY_VALUE_MAX]; 1263c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt const char *dns[5] = {dns1, dns2, dns3, dns4, NULL}; 1270216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char server[PROPERTY_VALUE_MAX]; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t lease; 12977b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey char vendorInfo[PROPERTY_VALUE_MAX]; 1308058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt char domains[PROPERTY_VALUE_MAX]; 131ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt char mtu[PROPERTY_VALUE_MAX]; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 1340216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt if (nameStr == NULL) return (jboolean)false; 1350216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt 13631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff if (renew) { 13731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff result = ::dhcp_do_request_renew(nameStr, ipaddr, gateway, &prefixLength, 138ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt dns, server, &lease, vendorInfo, domains, mtu); 13931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff } else { 14031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff result = ::dhcp_do_request(nameStr, ipaddr, gateway, &prefixLength, 141ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt dns, server, &lease, vendorInfo, domains, mtu); 14231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff } 14328cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt if (result != 0) { 144c249c2cc6b601ed1ff063f1748ba4399b9270209Vinit Deshapnde ALOGD("dhcp_do_request failed : %s (%s)", nameStr, renew ? "renew" : "new"); 14528cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt } 14628cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 14846e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom if (result == 0) { 1494717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.clear); 150aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt 1514717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // set mIfaceName 1524717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->setInterfaceName(ifname) 1534717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setInterfaceName, ifname); 1544717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1554717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // set the linkAddress 1564717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->addLinkAddress(inetAddress, prefixLength) 1574717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt result = env->CallBooleanMethod(dhcpResults, dhcpResultsFieldIds.addLinkAddress, 1584717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->NewStringUTF(ipaddr), prefixLength); 1594717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt } 1604717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1614717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt if (result == 0) { 162aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt // set the gateway 1634717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->addGateway(gateway) 1644717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt result = env->CallBooleanMethod(dhcpResults, 1654717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.addGateway, env->NewStringUTF(gateway)); 1664717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt } 1674717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1684717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt if (result == 0) { 1694717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->addDns(new InetAddress(dns1)) 1704717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt result = env->CallBooleanMethod(dhcpResults, 1714717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.addDns, env->NewStringUTF(dns1)); 1724717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt } 1734717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1744717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt if (result == 0) { 1758058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setDomains, 1768058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt env->NewStringUTF(domains)); 1778058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt 1784717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt result = env->CallBooleanMethod(dhcpResults, 1794717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.addDns, env->NewStringUTF(dns2)); 1803c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt 1813c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt if (result == 0) { 1823c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt result = env->CallBooleanMethod(dhcpResults, 1833c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt dhcpResultsFieldIds.addDns, env->NewStringUTF(dns3)); 1843c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt if (result == 0) { 1853c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt result = env->CallBooleanMethod(dhcpResults, 1863c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt dhcpResultsFieldIds.addDns, env->NewStringUTF(dns4)); 1873c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt } 1883c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt } 1894717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt } 1904717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1914717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt if (result == 0) { 1924717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->setServerAddress(new InetAddress(server)) 1934717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt result = env->CallBooleanMethod(dhcpResults, dhcpResultsFieldIds.setServerAddress, 1940216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->NewStringUTF(server)); 1954717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt } 1964717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 1974717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt if (result == 0) { 1984717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->setLeaseDuration(lease) 1994717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->CallVoidMethod(dhcpResults, 2004717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.setLeaseDuration, lease); 2014717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 2024717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt // dhcpResults->setVendorInfo(vendorInfo) 2034717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setVendorInfo, 2044717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->NewStringUTF(vendorInfo)); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jboolean)(result == 0); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2094717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt 21031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcp(JNIEnv* env, jobject clazz, jstring ifname, jobject info) 21131be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff{ 21231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff return android_net_utils_runDhcpCommon(env, clazz, ifname, info, false); 21331be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff} 21431be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 21531be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcpRenew(JNIEnv* env, jobject clazz, jstring ifname, jobject info) 21631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff{ 21731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff return android_net_utils_runDhcpCommon(env, clazz, ifname, info, true); 21831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff} 21931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 22031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_net_utils_stopDhcp(JNIEnv* env, jobject clazz, jstring ifname) 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::dhcp_stop(nameStr); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jboolean)(result == 0); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_net_utils_releaseDhcpLease(JNIEnv* env, jobject clazz, jstring ifname) 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::dhcp_release_lease(nameStr); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jboolean)(result == 0); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_net_utils_getDhcpError(JNIEnv* env, jobject clazz) 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewStringUTF(::dhcp_get_errmsg()); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24612324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubakerstatic void android_net_utils_markSocket(JNIEnv *env, jobject thiz, jint socket, jint mark) 24712324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker{ 24812324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker if (setsockopt(socket, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)) < 0) { 24912324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker jniThrowException(env, "java/lang/IllegalStateException", "Error marking socket"); 25012324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker } 25112324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker} 25212324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration. 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gNetworkUtilMethods[] = { 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2610900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood { "enableInterface", "(Ljava/lang/String;)I", (void *)android_net_utils_enableInterface }, 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "disableInterface", "(Ljava/lang/String;)I", (void *)android_net_utils_disableInterface }, 2638171e6f690cca1bad354e7e352823d79d420daf3Wink Saville { "resetConnections", "(Ljava/lang/String;I)I", (void *)android_net_utils_resetConnections }, 2644717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt { "runDhcp", "(Ljava/lang/String;Landroid/net/DhcpResults;)Z", (void *)android_net_utils_runDhcp }, 2654717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt { "runDhcpRenew", "(Ljava/lang/String;Landroid/net/DhcpResults;)Z", (void *)android_net_utils_runDhcpRenew }, 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "stopDhcp", "(Ljava/lang/String;)Z", (void *)android_net_utils_stopDhcp }, 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "releaseDhcpLease", "(Ljava/lang/String;)Z", (void *)android_net_utils_releaseDhcpLease }, 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getDhcpError", "()Ljava/lang/String;", (void*) android_net_utils_getDhcpError }, 26912324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker { "markSocket", "(II)V", (void*) android_net_utils_markSocket }, 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{ 2744717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt jclass dhcpResultsClass = env->FindClass("android/net/DhcpResults"); 2754717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt LOG_FATAL_IF(dhcpResultsClass == NULL, "Unable to find class android/net/DhcpResults"); 2764717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.clear = 2774717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->GetMethodID(dhcpResultsClass, "clear", "()V"); 2784717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.setInterfaceName = 2794717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->GetMethodID(dhcpResultsClass, "setInterfaceName", "(Ljava/lang/String;)V"); 2804717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.addLinkAddress = 2814717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->GetMethodID(dhcpResultsClass, "addLinkAddress", "(Ljava/lang/String;I)Z"); 2824717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.addGateway = 2834717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->GetMethodID(dhcpResultsClass, "addGateway", "(Ljava/lang/String;)Z"); 2844717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.addDns = 2854717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->GetMethodID(dhcpResultsClass, "addDns", "(Ljava/lang/String;)Z"); 2868058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt dhcpResultsFieldIds.setDomains = 2878058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt env->GetMethodID(dhcpResultsClass, "setDomains", "(Ljava/lang/String;)V"); 2884717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.setServerAddress = 2894717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->GetMethodID(dhcpResultsClass, "setServerAddress", "(Ljava/lang/String;)Z"); 2904717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.setLeaseDuration = 2914717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->GetMethodID(dhcpResultsClass, "setLeaseDuration", "(I)V"); 2924717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt dhcpResultsFieldIds.setVendorInfo = 2934717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt env->GetMethodID(dhcpResultsClass, "setVendorInfo", "(Ljava/lang/String;)V"); 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NETUTILS_PKG_NAME, gNetworkUtilMethods, NELEM(gNetworkUtilMethods)); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 300