android_net_NetUtils.cpp revision 0216e618198393bfd7ac0625fa6ad251d5ea682f
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); 29585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwaltint ifc_add_route(const char *ifname, const char *destStr, uint32_t prefixLen, const char *gwStr); 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint ifc_remove_host_routes(const char *ifname); 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint ifc_get_default_route(const char *ifname); 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint ifc_remove_default_route(const char *ifname); 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint ifc_reset_connections(const char *ifname); 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint dhcp_do_request(const char *ifname, 360216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt const char *ipaddr, 370216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt const char *gateway, 380216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt uint32_t *prefixLength, 390216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt const char *dns1, 400216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt const char *dns2, 410216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt const char *server, 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t *lease); 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint dhcp_stop(const char *ifname); 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint dhcp_release_lease(const char *ifname); 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectchar *dhcp_get_errmsg(); 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define NETUTILS_PKG_NAME "android/net/NetworkUtils" 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The following remembers the jfieldID's of the fields 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the DhcpInfo Java object, so that we don't have 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to look them up every time. 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct fieldIds { 580216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt jclass dhcpInfoInternalClass; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID constructorId; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID ipaddress; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID gateway; 620216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt jfieldID prefixLength; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID dns1; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID dns2; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID serverAddress; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID leaseDuration; 670216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt} dhcpInfoInternalFieldIds; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 690900f3657664d9046e6723825fd32b244eef2b6cMike Lockwoodstatic jint android_net_utils_enableInterface(JNIEnv* env, jobject clazz, jstring ifname) 700900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood{ 710900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood int result; 720900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood 730900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood const char *nameStr = env->GetStringUTFChars(ifname, NULL); 740900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood result = ::ifc_enable(nameStr); 750900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood env->ReleaseStringUTFChars(ifname, nameStr); 760900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood return (jint)result; 770900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood} 780900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_net_utils_disableInterface(JNIEnv* env, jobject clazz, jstring ifname) 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::ifc_disable(nameStr); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jint)result; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 89585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwaltstatic jint android_net_utils_addRoute(JNIEnv* env, jobject clazz, jstring ifname, 90585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt jstring dst, jint prefixLength, jstring gw) 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); 95585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt const char *dstStr = env->GetStringUTFChars(dst, NULL); 96585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt const char *gwStr = NULL; 97585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt if (gw != NULL) { 98585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt gwStr = env->GetStringUTFChars(gw, NULL); 99585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt } 100585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt result = ::ifc_add_route(nameStr, dstStr, prefixLength, gwStr); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 102585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt env->ReleaseStringUTFChars(dst, dstStr); 103585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt if (gw != NULL) { 104585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt env->ReleaseStringUTFChars(gw, gwStr); 105585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jint)result; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_net_utils_removeHostRoutes(JNIEnv* env, jobject clazz, jstring ifname) 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::ifc_remove_host_routes(nameStr); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jint)result; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_net_utils_getDefaultRoute(JNIEnv* env, jobject clazz, jstring ifname) 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::ifc_get_default_route(nameStr); 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jint)result; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_net_utils_removeDefaultRoute(JNIEnv* env, jobject clazz, jstring ifname) 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::ifc_remove_default_route(nameStr); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jint)result; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_net_utils_resetConnections(JNIEnv* env, jobject clazz, jstring ifname) 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = ::ifc_reset_connections(nameStr); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jint)result; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_net_utils_runDhcp(JNIEnv* env, jobject clazz, jstring ifname, jobject info) 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int result; 1520216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char ipaddr[PROPERTY_VALUE_MAX]; 1530216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt uint32_t prefixLength; 1540216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char gateway[PROPERTY_VALUE_MAX]; 1550216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char dns1[PROPERTY_VALUE_MAX]; 1560216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char dns2[PROPERTY_VALUE_MAX]; 1570216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt char server[PROPERTY_VALUE_MAX]; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t lease; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char *nameStr = env->GetStringUTFChars(ifname, NULL); 1610216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt if (nameStr == NULL) return (jboolean)false; 1620216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt 1630216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt result = ::dhcp_do_request(nameStr, ipaddr, gateway, &prefixLength, 1640216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt dns1, dns2, server, &lease); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringUTFChars(ifname, nameStr); 1660216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt if (result == 0 && dhcpInfoInternalFieldIds.dhcpInfoInternalClass != NULL) { 1670216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetObjectField(info, dhcpInfoInternalFieldIds.ipaddress, env->NewStringUTF(ipaddr)); 1680216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetObjectField(info, dhcpInfoInternalFieldIds.gateway, env->NewStringUTF(gateway)); 1690216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetIntField(info, dhcpInfoInternalFieldIds.prefixLength, prefixLength); 1700216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetObjectField(info, dhcpInfoInternalFieldIds.dns1, env->NewStringUTF(dns1)); 1710216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetObjectField(info, dhcpInfoInternalFieldIds.dns2, env->NewStringUTF(dns2)); 1720216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetObjectField(info, dhcpInfoInternalFieldIds.serverAddress, 1730216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->NewStringUTF(server)); 1740216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt env->SetIntField(info, dhcpInfoInternalFieldIds.leaseDuration, lease); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jboolean)(result == 0); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 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 }, 214585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt { "addRoute", "(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)I", 215585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt (void *)android_net_utils_addRoute }, 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "removeHostRoutes", "(Ljava/lang/String;)I", (void *)android_net_utils_removeHostRoutes }, 217585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt { "getDefaultRouteNative", "(Ljava/lang/String;)I", 218585ac0fc8dde3fe35ec4c71c8f215f2c84139b8bRobert Greenwalt (void *)android_net_utils_getDefaultRoute }, 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "removeDefaultRoute", "(Ljava/lang/String;)I", (void *)android_net_utils_removeDefaultRoute }, 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "resetConnections", "(Ljava/lang/String;)I", (void *)android_net_utils_resetConnections }, 2210216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt { "runDhcp", "(Ljava/lang/String;Landroid/net/DhcpInfoInternal;)Z", (void *)android_net_utils_runDhcp }, 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{ 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass netutils = env->FindClass(NETUTILS_PKG_NAME); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(netutils == NULL, "Unable to find class " NETUTILS_PKG_NAME); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2320216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt dhcpInfoInternalFieldIds.dhcpInfoInternalClass = env->FindClass("android/net/DhcpInfoInternal"); 2330216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt if (dhcpInfoInternalFieldIds.dhcpInfoInternalClass != NULL) { 2340216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt dhcpInfoInternalFieldIds.constructorId = env->GetMethodID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "<init>", "()V"); 2350216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt dhcpInfoInternalFieldIds.ipaddress = env->GetFieldID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "ipAddress", "Ljava/lang/String;"); 2360216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt dhcpInfoInternalFieldIds.gateway = env->GetFieldID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "gateway", "Ljava/lang/String;"); 2370216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt dhcpInfoInternalFieldIds.prefixLength = env->GetFieldID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "prefixLength", "I"); 2380216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt dhcpInfoInternalFieldIds.dns1 = env->GetFieldID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "dns1", "Ljava/lang/String;"); 2390216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt dhcpInfoInternalFieldIds.dns2 = env->GetFieldID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "dns2", "Ljava/lang/String;"); 2400216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt dhcpInfoInternalFieldIds.serverAddress = env->GetFieldID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "serverAddress", "Ljava/lang/String;"); 2410216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt dhcpInfoInternalFieldIds.leaseDuration = env->GetFieldID(dhcpInfoInternalFieldIds.dhcpInfoInternalClass, "leaseDuration", "I"); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NETUTILS_PKG_NAME, gNetworkUtilMethods, NELEM(gNetworkUtilMethods)); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 249