android_net_NetUtils.cpp revision 8171e6f690cca1bad354e7e352823d79d420daf3
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright 2008, The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 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); 39914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff 40914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriffint dhcp_do_request_renew(const char *ifname, 41914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff const char *ipaddr, 42914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff const char *gateway, 43914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff uint32_t *prefixLength, 44914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff const char *dns1, 45914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff const char *dns2, 46914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff const char *server, 47914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff uint32_t *lease); 48914ed90f2c02092474d2db36626734ca1b2cf315Irfan 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 { 640216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt jclass dhcpInfoInternalClass; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID constructorId; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID ipaddress; 670216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt jfieldID prefixLength; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID dns1; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID dns2; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID serverAddress; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID leaseDuration; 720216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt} dhcpInfoInternalFieldIds; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 740900f3657664d9046e6723825fd32b244eef2b6cMike Lockwoodstatic jint android_net_utils_enableInterface(JNIEnv* env, jobject clazz, jstring ifname) 750900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood{ 760900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood int result; 770900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood 780900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood const char *nameStr = env->GetStringUTFChars(ifname, NULL); 790900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood result = ::ifc_enable(nameStr); 800900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood env->ReleaseStringUTFChars(ifname, nameStr); 810900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood return (jint)result; 820900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood} 830900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_net_utils_disableInterface(JNIEnv* env, jobject clazz, jstring ifname) 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::ifc_disable(nameStr); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jint)result; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 948171e6f690cca1bad354e7e352823d79d420daf3Wink Savillestatic jint android_net_utils_resetConnections(JNIEnv* env, jobject clazz, 958171e6f690cca1bad354e7e352823d79d420daf3Wink Saville jstring ifname, jint mask) 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 1008171e6f690cca1bad354e7e352823d79d420daf3Wink Saville 1018171e6f690cca1bad354e7e352823d79d420daf3Wink Saville LOGD("android_net_utils_resetConnections in env=%p clazz=%p iface=%s mask=0x%x\n", 1028171e6f690cca1bad354e7e352823d79d420daf3Wink Saville env, clazz, nameStr, mask); 1038171e6f690cca1bad354e7e352823d79d420daf3Wink Saville 1048171e6f690cca1bad354e7e352823d79d420daf3Wink Saville result = ::ifc_reset_connections(nameStr, mask); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jint)result; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 109914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriffstatic jboolean android_net_utils_runDhcpCommon(JNIEnv* env, jobject clazz, jstring ifname, 110914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff jobject info, bool renew) 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 1130216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char ipaddr[PROPERTY_VALUE_MAX]; 1140216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt uint32_t prefixLength; 1150216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char gateway[PROPERTY_VALUE_MAX]; 1160216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char dns1[PROPERTY_VALUE_MAX]; 1170216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char dns2[PROPERTY_VALUE_MAX]; 1180216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char server[PROPERTY_VALUE_MAX]; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t lease; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 1220216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt if (nameStr == NULL) return (jboolean)false; 1230216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt 124914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff if (renew) { 125914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff result = ::dhcp_do_request_renew(nameStr, ipaddr, gateway, &prefixLength, 126914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff dns1, dns2, server, &lease); 127914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff } else { 128914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff result = ::dhcp_do_request(nameStr, ipaddr, gateway, &prefixLength, 129914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff dns1, dns2, server, &lease); 130914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff } 131914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 1330216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt if (result == 0 && dhcpInfoInternalFieldIds.dhcpInfoInternalClass != NULL) { 1340216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetObjectField(info, dhcpInfoInternalFieldIds.ipaddress, env->NewStringUTF(ipaddr)); 135aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt 136aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt // set the gateway 137aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt jclass cls = env->FindClass("java/net/InetAddress"); 138aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt jmethodID method = env->GetStaticMethodID(cls, "getByName", 139aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt "(Ljava/lang/String;)Ljava/net/InetAddress;"); 140aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt jvalue args[1]; 141aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt args[0].l = env->NewStringUTF(gateway); 142aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt jobject inetAddressObject = env->CallStaticObjectMethodA(cls, method, args); 143aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt 144aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt if (!env->ExceptionOccurred()) { 145aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt cls = env->FindClass("android/net/RouteInfo"); 146aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt method = env->GetMethodID(cls, "<init>", "(Ljava/net/InetAddress;)V"); 147aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt args[0].l = inetAddressObject; 148aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt jobject routeInfoObject = env->NewObjectA(cls, method, args); 149aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt 150aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt cls = env->FindClass("android/net/DhcpInfoInternal"); 151aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt method = env->GetMethodID(cls, "addRoute", "(Landroid/net/RouteInfo;)V"); 152aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt args[0].l = routeInfoObject; 153aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt env->CallVoidMethodA(info, method, args); 154aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt } else { 155aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt // if we have an exception (host not found perhaps), just don't add the route 156aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt env->ExceptionClear(); 157aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt } 158aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt 1590216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetIntField(info, dhcpInfoInternalFieldIds.prefixLength, prefixLength); 1600216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetObjectField(info, dhcpInfoInternalFieldIds.dns1, env->NewStringUTF(dns1)); 1610216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetObjectField(info, dhcpInfoInternalFieldIds.dns2, env->NewStringUTF(dns2)); 1620216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetObjectField(info, dhcpInfoInternalFieldIds.serverAddress, 1630216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->NewStringUTF(server)); 1640216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetIntField(info, dhcpInfoInternalFieldIds.leaseDuration, lease); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jboolean)(result == 0); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 169914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriffstatic jboolean android_net_utils_runDhcp(JNIEnv* env, jobject clazz, jstring ifname, jobject info) 170914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff{ 171914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff return android_net_utils_runDhcpCommon(env, clazz, ifname, info, false); 172914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff} 173914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff 174914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriffstatic jboolean android_net_utils_runDhcpRenew(JNIEnv* env, jobject clazz, jstring ifname, jobject info) 175914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff{ 176914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff return android_net_utils_runDhcpCommon(env, clazz, ifname, info, true); 177914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff} 178914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff 179914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_net_utils_stopDhcp(JNIEnv* env, jobject clazz, jstring ifname) 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::dhcp_stop(nameStr); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jboolean)(result == 0); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_net_utils_releaseDhcpLease(JNIEnv* env, jobject clazz, jstring ifname) 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::dhcp_release_lease(nameStr); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jboolean)(result == 0); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_net_utils_getDhcpError(JNIEnv* env, jobject clazz) 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewStringUTF(::dhcp_get_errmsg()); 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/* 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration. 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gNetworkUtilMethods[] = { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2130900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood { "enableInterface", "(Ljava/lang/String;)I", (void *)android_net_utils_enableInterface }, 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "disableInterface", "(Ljava/lang/String;)I", (void *)android_net_utils_disableInterface }, 2158171e6f690cca1bad354e7e352823d79d420daf3Wink Saville { "resetConnections", "(Ljava/lang/String;I)I", (void *)android_net_utils_resetConnections }, 2160216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt { "runDhcp", "(Ljava/lang/String;Landroid/net/DhcpInfoInternal;)Z", (void *)android_net_utils_runDhcp }, 217914ed90f2c02092474d2db36626734ca1b2cf315Irfan Sheriff { "runDhcpRenew", "(Ljava/lang/String;Landroid/net/DhcpInfoInternal;)Z", (void *)android_net_utils_runDhcpRenew }, 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "stopDhcp", "(Ljava/lang/String;)Z", (void *)android_net_utils_stopDhcp }, 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "releaseDhcpLease", "(Ljava/lang/String;)Z", (void *)android_net_utils_releaseDhcpLease }, 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getDhcpError", "()Ljava/lang/String;", (void*) android_net_utils_getDhcpError }, 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_net_NetworkUtils(JNIEnv* env) 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass netutils = env->FindClass(NETUTILS_PKG_NAME); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(netutils == NULL, "Unable to find class " NETUTILS_PKG_NAME); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2280216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt dhcpInfoInternalFieldIds.dhcpInfoInternalClass = env->FindClass("android/net/DhcpInfoInternal"); 2290216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt if (dhcpInfoInternalFieldIds.dhcpInfoInternalClass != NULL) { 2300216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt dhcpInfoInternalFieldIds.constructorId = env->GetMethodID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "<init>", "()V"); 2310216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt dhcpInfoInternalFieldIds.ipaddress = env->GetFieldID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "ipAddress", "Ljava/lang/String;"); 2320216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt dhcpInfoInternalFieldIds.prefixLength = env->GetFieldID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "prefixLength", "I"); 2330216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt dhcpInfoInternalFieldIds.dns1 = env->GetFieldID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "dns1", "Ljava/lang/String;"); 2340216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt dhcpInfoInternalFieldIds.dns2 = env->GetFieldID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "dns2", "Ljava/lang/String;"); 2350216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt dhcpInfoInternalFieldIds.serverAddress = env->GetFieldID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "serverAddress", "Ljava/lang/String;"); 2360216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt dhcpInfoInternalFieldIds.leaseDuration = env->GetFieldID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "leaseDuration", "I"); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NETUTILS_PKG_NAME, gNetworkUtilMethods, NELEM(gNetworkUtilMethods)); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 244