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, 340216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt uint32_t *prefixLength, 350216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt const char *dns1, 360216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt const char *dns2, 370216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt const char *server, 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t *lease); 3931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 4031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffint dhcp_do_request_renew(const char *ifname, 4131be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff const char *ipaddr, 4231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff const char *gateway, 4331be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff uint32_t *prefixLength, 4431be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff const char *dns1, 4531be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff const char *dns2, 4631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff const char *server, 4731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff uint32_t *lease); 4831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint dhcp_stop(const char *ifname); 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint dhcp_release_lease(const char *ifname); 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectchar *dhcp_get_errmsg(); 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define NETUTILS_PKG_NAME "android/net/NetworkUtils" 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The following remembers the jfieldID's of the fields 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the DhcpInfo Java object, so that we don't have 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to look them up every time. 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct fieldIds { 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID constructorId; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID ipaddress; 660216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt jfieldID prefixLength; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID dns1; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID dns2; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID serverAddress; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID leaseDuration; 710216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt} dhcpInfoInternalFieldIds; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 730900f3657664d9046e6723825fd32b244eef2b6cMike Lockwoodstatic jint android_net_utils_enableInterface(JNIEnv* env, jobject clazz, jstring ifname) 740900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood{ 750900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood int result; 760900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood 770900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood const char *nameStr = env->GetStringUTFChars(ifname, NULL); 780900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood result = ::ifc_enable(nameStr); 790900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood env->ReleaseStringUTFChars(ifname, nameStr); 800900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood return (jint)result; 810900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood} 820900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_net_utils_disableInterface(JNIEnv* env, jobject clazz, jstring ifname) 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::ifc_disable(nameStr); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jint)result; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 938171e6f690cca1bad354e7e352823d79d420daf3Wink Savillestatic jint android_net_utils_resetConnections(JNIEnv* env, jobject clazz, 948171e6f690cca1bad354e7e352823d79d420daf3Wink Saville jstring ifname, jint mask) 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 998171e6f690cca1bad354e7e352823d79d420daf3Wink Saville 1008171e6f690cca1bad354e7e352823d79d420daf3Wink Saville LOGD("android_net_utils_resetConnections in env=%p clazz=%p iface=%s mask=0x%x\n", 1018171e6f690cca1bad354e7e352823d79d420daf3Wink Saville env, clazz, nameStr, mask); 1028171e6f690cca1bad354e7e352823d79d420daf3Wink Saville 1038171e6f690cca1bad354e7e352823d79d420daf3Wink Saville result = ::ifc_reset_connections(nameStr, mask); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jint)result; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcpCommon(JNIEnv* env, jobject clazz, jstring ifname, 10931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff jobject info, bool renew) 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 1120216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char ipaddr[PROPERTY_VALUE_MAX]; 1130216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt uint32_t prefixLength; 1140216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char gateway[PROPERTY_VALUE_MAX]; 1150216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char dns1[PROPERTY_VALUE_MAX]; 1160216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char dns2[PROPERTY_VALUE_MAX]; 1170216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char server[PROPERTY_VALUE_MAX]; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t lease; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 1210216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt if (nameStr == NULL) return (jboolean)false; 1220216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt 12331be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff if (renew) { 12431be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff result = ::dhcp_do_request_renew(nameStr, ipaddr, gateway, &prefixLength, 12531be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff dns1, dns2, server, &lease); 12631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff } else { 12731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff result = ::dhcp_do_request(nameStr, ipaddr, gateway, &prefixLength, 12831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff dns1, dns2, server, &lease); 12931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff } 13031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 13246e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom if (result == 0) { 1330216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetObjectField(info, dhcpInfoInternalFieldIds.ipaddress, env->NewStringUTF(ipaddr)); 134aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt 135aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt // set the gateway 136aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt jclass cls = env->FindClass("java/net/InetAddress"); 137aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt jmethodID method = env->GetStaticMethodID(cls, "getByName", 138aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt "(Ljava/lang/String;)Ljava/net/InetAddress;"); 139aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt jvalue args[1]; 140aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt args[0].l = env->NewStringUTF(gateway); 141aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt jobject inetAddressObject = env->CallStaticObjectMethodA(cls, method, args); 142aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt 143aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt if (!env->ExceptionOccurred()) { 144aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt cls = env->FindClass("android/net/RouteInfo"); 145aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt method = env->GetMethodID(cls, "<init>", "(Ljava/net/InetAddress;)V"); 146aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt args[0].l = inetAddressObject; 147aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt jobject routeInfoObject = env->NewObjectA(cls, method, args); 148aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt 149aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt cls = env->FindClass("android/net/DhcpInfoInternal"); 150aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt method = env->GetMethodID(cls, "addRoute", "(Landroid/net/RouteInfo;)V"); 151aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt args[0].l = routeInfoObject; 152aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt env->CallVoidMethodA(info, method, args); 153aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt } else { 154aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt // if we have an exception (host not found perhaps), just don't add the route 155aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt env->ExceptionClear(); 156aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt } 157aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt 1580216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetIntField(info, dhcpInfoInternalFieldIds.prefixLength, prefixLength); 1590216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetObjectField(info, dhcpInfoInternalFieldIds.dns1, env->NewStringUTF(dns1)); 1600216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetObjectField(info, dhcpInfoInternalFieldIds.dns2, env->NewStringUTF(dns2)); 1610216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetObjectField(info, dhcpInfoInternalFieldIds.serverAddress, 1620216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->NewStringUTF(server)); 1630216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetIntField(info, dhcpInfoInternalFieldIds.leaseDuration, lease); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jboolean)(result == 0); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcp(JNIEnv* env, jobject clazz, jstring ifname, jobject info) 16931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff{ 17031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff return android_net_utils_runDhcpCommon(env, clazz, ifname, info, false); 17131be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff} 17231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 17331be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcpRenew(JNIEnv* env, jobject clazz, jstring ifname, jobject info) 17431be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff{ 17531be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff return android_net_utils_runDhcpCommon(env, clazz, ifname, info, true); 17631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff} 17731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 17831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_net_utils_stopDhcp(JNIEnv* env, jobject clazz, jstring ifname) 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::dhcp_stop(nameStr); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jboolean)(result == 0); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_net_utils_releaseDhcpLease(JNIEnv* env, jobject clazz, jstring ifname) 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::dhcp_release_lease(nameStr); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jboolean)(result == 0); 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_net_utils_getDhcpError(JNIEnv* env, jobject clazz) 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewStringUTF(::dhcp_get_errmsg()); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration. 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gNetworkUtilMethods[] = { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2120900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood { "enableInterface", "(Ljava/lang/String;)I", (void *)android_net_utils_enableInterface }, 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "disableInterface", "(Ljava/lang/String;)I", (void *)android_net_utils_disableInterface }, 2148171e6f690cca1bad354e7e352823d79d420daf3Wink Saville { "resetConnections", "(Ljava/lang/String;I)I", (void *)android_net_utils_resetConnections }, 2150216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt { "runDhcp", "(Ljava/lang/String;Landroid/net/DhcpInfoInternal;)Z", (void *)android_net_utils_runDhcp }, 21631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff { "runDhcpRenew", "(Ljava/lang/String;Landroid/net/DhcpInfoInternal;)Z", (void *)android_net_utils_runDhcpRenew }, 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "stopDhcp", "(Ljava/lang/String;)Z", (void *)android_net_utils_stopDhcp }, 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "releaseDhcpLease", "(Ljava/lang/String;)Z", (void *)android_net_utils_releaseDhcpLease }, 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getDhcpError", "()Ljava/lang/String;", (void*) android_net_utils_getDhcpError }, 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_net_NetworkUtils(JNIEnv* env) 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 22446e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom jclass dhcpInfoInternalClass = env->FindClass("android/net/DhcpInfoInternal"); 22546e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom LOG_FATAL_IF(dhcpInfoInternalClass == NULL, "Unable to find class android/net/DhcpInfoInternal"); 22646e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom dhcpInfoInternalFieldIds.constructorId = env->GetMethodID(dhcpInfoInternalClass, "<init>", "()V"); 22746e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom dhcpInfoInternalFieldIds.ipaddress = env->GetFieldID(dhcpInfoInternalClass, "ipAddress", "Ljava/lang/String;"); 22846e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom dhcpInfoInternalFieldIds.prefixLength = env->GetFieldID(dhcpInfoInternalClass, "prefixLength", "I"); 22946e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom dhcpInfoInternalFieldIds.dns1 = env->GetFieldID(dhcpInfoInternalClass, "dns1", "Ljava/lang/String;"); 23046e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom dhcpInfoInternalFieldIds.dns2 = env->GetFieldID(dhcpInfoInternalClass, "dns2", "Ljava/lang/String;"); 23146e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom dhcpInfoInternalFieldIds.serverAddress = env->GetFieldID(dhcpInfoInternalClass, "serverAddress", "Ljava/lang/String;"); 23246e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom dhcpInfoInternalFieldIds.leaseDuration = env->GetFieldID(dhcpInfoInternalClass, "leaseDuration", "I"); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NETUTILS_PKG_NAME, gNetworkUtilMethods, NELEM(gNetworkUtilMethods)); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 239