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" 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/misc.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <arpa/inet.h> 240216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt#include <cutils/properties.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern "C" { 270900f3657664d9046e6723825fd32b244eef2b6cMike Lockwoodint ifc_enable(const char *ifname); 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint ifc_disable(const char *ifname); 298171e6f690cca1bad354e7e352823d79d420daf3Wink Savilleint ifc_reset_connections(const char *ifname, int reset_mask); 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint dhcp_do_request(const char *ifname, 320216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt const char *ipaddr, 330216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt const char *gateway, 3477b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey uint32_t *prefixLength, 350216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt const char *dns1, 360216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt const char *dns2, 370216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt const char *server, 3877b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey uint32_t *lease, 3977b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey const char *vendorInfo); 4031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 4131be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffint dhcp_do_request_renew(const char *ifname, 4231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff const char *ipaddr, 4331be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff const char *gateway, 4477b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey uint32_t *prefixLength, 4531be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff const char *dns1, 4631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff const char *dns2, 4731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff const char *server, 4877b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey uint32_t *lease, 4977b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey const char *vendorInfo); 5031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint dhcp_stop(const char *ifname); 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint dhcp_release_lease(const char *ifname); 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectchar *dhcp_get_errmsg(); 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define NETUTILS_PKG_NAME "android/net/NetworkUtils" 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The following remembers the jfieldID's of the fields 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the DhcpInfo Java object, so that we don't have 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to look them up every time. 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct fieldIds { 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID constructorId; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID ipaddress; 680216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt jfieldID prefixLength; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID dns1; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID dns2; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID serverAddress; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID leaseDuration; 7377b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey jfieldID vendorInfo; 740216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt} dhcpInfoInternalFieldIds; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 760900f3657664d9046e6723825fd32b244eef2b6cMike Lockwoodstatic jint android_net_utils_enableInterface(JNIEnv* env, jobject clazz, jstring ifname) 770900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood{ 780900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood int result; 790900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood 800900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood const char *nameStr = env->GetStringUTFChars(ifname, NULL); 810900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood result = ::ifc_enable(nameStr); 820900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood env->ReleaseStringUTFChars(ifname, nameStr); 830900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood return (jint)result; 840900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood} 850900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_net_utils_disableInterface(JNIEnv* env, jobject clazz, jstring ifname) 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::ifc_disable(nameStr); 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 968171e6f690cca1bad354e7e352823d79d420daf3Wink Savillestatic jint android_net_utils_resetConnections(JNIEnv* env, jobject clazz, 978171e6f690cca1bad354e7e352823d79d420daf3Wink Saville jstring ifname, jint mask) 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 1028171e6f690cca1bad354e7e352823d79d420daf3Wink Saville 1035baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("android_net_utils_resetConnections in env=%p clazz=%p iface=%s mask=0x%x\n", 1048171e6f690cca1bad354e7e352823d79d420daf3Wink Saville env, clazz, nameStr, mask); 1058171e6f690cca1bad354e7e352823d79d420daf3Wink Saville 1068171e6f690cca1bad354e7e352823d79d420daf3Wink Saville result = ::ifc_reset_connections(nameStr, mask); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jint)result; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11131be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcpCommon(JNIEnv* env, jobject clazz, jstring ifname, 11231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff jobject info, bool renew) 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 1150216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char ipaddr[PROPERTY_VALUE_MAX]; 1160216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt uint32_t prefixLength; 1170216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char gateway[PROPERTY_VALUE_MAX]; 1180216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char dns1[PROPERTY_VALUE_MAX]; 1190216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char dns2[PROPERTY_VALUE_MAX]; 1200216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char server[PROPERTY_VALUE_MAX]; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t lease; 12277b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey char vendorInfo[PROPERTY_VALUE_MAX]; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 1250216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt if (nameStr == NULL) return (jboolean)false; 1260216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt 12731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff if (renew) { 12831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff result = ::dhcp_do_request_renew(nameStr, ipaddr, gateway, &prefixLength, 12977b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey dns1, dns2, server, &lease, vendorInfo); 13031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff } else { 13131be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff result = ::dhcp_do_request(nameStr, ipaddr, gateway, &prefixLength, 13277b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey dns1, dns2, server, &lease, vendorInfo); 13331be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff } 13431be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 13646e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom if (result == 0) { 1370216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetObjectField(info, dhcpInfoInternalFieldIds.ipaddress, env->NewStringUTF(ipaddr)); 138aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt 139aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt // set the gateway 140aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt jclass cls = env->FindClass("java/net/InetAddress"); 141aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt jmethodID method = env->GetStaticMethodID(cls, "getByName", 142aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt "(Ljava/lang/String;)Ljava/net/InetAddress;"); 143aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt jvalue args[1]; 144aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt args[0].l = env->NewStringUTF(gateway); 145aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt jobject inetAddressObject = env->CallStaticObjectMethodA(cls, method, args); 146aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt 147aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt if (!env->ExceptionOccurred()) { 148aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt cls = env->FindClass("android/net/RouteInfo"); 149aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt method = env->GetMethodID(cls, "<init>", "(Ljava/net/InetAddress;)V"); 150aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt args[0].l = inetAddressObject; 151aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt jobject routeInfoObject = env->NewObjectA(cls, method, args); 152aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt 153aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt cls = env->FindClass("android/net/DhcpInfoInternal"); 154aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt method = env->GetMethodID(cls, "addRoute", "(Landroid/net/RouteInfo;)V"); 155aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt args[0].l = routeInfoObject; 156aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt env->CallVoidMethodA(info, method, args); 157aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt } else { 158aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt // if we have an exception (host not found perhaps), just don't add the route 159aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt env->ExceptionClear(); 160aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt } 161aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt 1620216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetIntField(info, dhcpInfoInternalFieldIds.prefixLength, prefixLength); 1630216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetObjectField(info, dhcpInfoInternalFieldIds.dns1, env->NewStringUTF(dns1)); 1640216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetObjectField(info, dhcpInfoInternalFieldIds.dns2, env->NewStringUTF(dns2)); 1650216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetObjectField(info, dhcpInfoInternalFieldIds.serverAddress, 1660216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->NewStringUTF(server)); 1670216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetIntField(info, dhcpInfoInternalFieldIds.leaseDuration, lease); 16877b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey env->SetObjectField(info, dhcpInfoInternalFieldIds.vendorInfo, env->NewStringUTF(vendorInfo)); 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jboolean)(result == 0); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17331be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcp(JNIEnv* env, jobject clazz, jstring ifname, jobject info) 17431be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff{ 17531be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff return android_net_utils_runDhcpCommon(env, clazz, ifname, info, false); 17631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff} 17731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 17831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcpRenew(JNIEnv* env, jobject clazz, jstring ifname, jobject info) 17931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff{ 18031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff return android_net_utils_runDhcpCommon(env, clazz, ifname, info, true); 18131be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff} 18231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 18331be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_net_utils_stopDhcp(JNIEnv* env, jobject clazz, jstring ifname) 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::dhcp_stop(nameStr); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jboolean)(result == 0); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_net_utils_releaseDhcpLease(JNIEnv* env, jobject clazz, jstring ifname) 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::dhcp_release_lease(nameStr); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jboolean)(result == 0); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_net_utils_getDhcpError(JNIEnv* env, jobject clazz) 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewStringUTF(::dhcp_get_errmsg()); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration. 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gNetworkUtilMethods[] = { 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2170900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood { "enableInterface", "(Ljava/lang/String;)I", (void *)android_net_utils_enableInterface }, 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "disableInterface", "(Ljava/lang/String;)I", (void *)android_net_utils_disableInterface }, 2198171e6f690cca1bad354e7e352823d79d420daf3Wink Saville { "resetConnections", "(Ljava/lang/String;I)I", (void *)android_net_utils_resetConnections }, 2200216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt { "runDhcp", "(Ljava/lang/String;Landroid/net/DhcpInfoInternal;)Z", (void *)android_net_utils_runDhcp }, 22131be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff { "runDhcpRenew", "(Ljava/lang/String;Landroid/net/DhcpInfoInternal;)Z", (void *)android_net_utils_runDhcpRenew }, 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "stopDhcp", "(Ljava/lang/String;)Z", (void *)android_net_utils_stopDhcp }, 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "releaseDhcpLease", "(Ljava/lang/String;)Z", (void *)android_net_utils_releaseDhcpLease }, 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getDhcpError", "()Ljava/lang/String;", (void*) android_net_utils_getDhcpError }, 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_net_NetworkUtils(JNIEnv* env) 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 22946e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom jclass dhcpInfoInternalClass = env->FindClass("android/net/DhcpInfoInternal"); 23046e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom LOG_FATAL_IF(dhcpInfoInternalClass == NULL, "Unable to find class android/net/DhcpInfoInternal"); 23146e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom dhcpInfoInternalFieldIds.constructorId = env->GetMethodID(dhcpInfoInternalClass, "<init>", "()V"); 23246e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom dhcpInfoInternalFieldIds.ipaddress = env->GetFieldID(dhcpInfoInternalClass, "ipAddress", "Ljava/lang/String;"); 23346e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom dhcpInfoInternalFieldIds.prefixLength = env->GetFieldID(dhcpInfoInternalClass, "prefixLength", "I"); 23446e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom dhcpInfoInternalFieldIds.dns1 = env->GetFieldID(dhcpInfoInternalClass, "dns1", "Ljava/lang/String;"); 23546e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom dhcpInfoInternalFieldIds.dns2 = env->GetFieldID(dhcpInfoInternalClass, "dns2", "Ljava/lang/String;"); 23646e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom dhcpInfoInternalFieldIds.serverAddress = env->GetFieldID(dhcpInfoInternalClass, "serverAddress", "Ljava/lang/String;"); 23746e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom dhcpInfoInternalFieldIds.leaseDuration = env->GetFieldID(dhcpInfoInternalClass, "leaseDuration", "I"); 23877b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey dhcpInfoInternalFieldIds.vendorInfo = env->GetFieldID(dhcpInfoInternalClass, "vendorInfo", "Ljava/lang/String;"); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NETUTILS_PKG_NAME, gNetworkUtilMethods, NELEM(gNetworkUtilMethods)); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 245