android_net_NetUtils.cpp revision 987f79f60bb1f0a4bcd3ef22e57301c743f0b94f
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright 2008, The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
5dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes * you may not use this file except in compliance with the License.
6dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
8dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
10dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes * Unless required by applicable law or agreed to in writing, software
11dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
12dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "NetUtils"
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h"
2012324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker#include "JNIHelp.h"
213876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen#include "NetdClient.h"
223876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen#include "resolv_netid.h"
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/misc.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h>
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <arpa/inet.h>
270216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt#include <cutils/properties.h>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#include "core_jni_helpers.h"
30987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern "C" {
320900f3657664d9046e6723825fd32b244eef2b6cMike Lockwoodint ifc_enable(const char *ifname);
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint ifc_disable(const char *ifname);
348171e6f690cca1bad354e7e352823d79d420daf3Wink Savilleint ifc_reset_connections(const char *ifname, int reset_mask);
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
363c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwaltint dhcp_do_request(const char * const ifname,
370216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt                    const char *ipaddr,
380216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt                    const char *gateway,
3977b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey                    uint32_t *prefixLength,
403c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt                    const char *dns[],
410216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt                    const char *server,
4277b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey                    uint32_t *lease,
438058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt                    const char *vendorInfo,
44ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt                    const char *domains,
45ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt                    const char *mtu);
4631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff
473c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwaltint dhcp_do_request_renew(const char * const ifname,
4831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff                    const char *ipaddr,
4931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff                    const char *gateway,
5077b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey                    uint32_t *prefixLength,
513c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt                    const char *dns[],
5231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff                    const char *server,
5377b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey                    uint32_t *lease,
548058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt                    const char *vendorInfo,
55ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt                    const char *domains,
56ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt                    const char *mtu);
5731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint dhcp_stop(const char *ifname);
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint dhcp_release_lease(const char *ifname);
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectchar *dhcp_get_errmsg();
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define NETUTILS_PKG_NAME "android/net/NetworkUtils"
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The following remembers the jfieldID's of the fields
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the DhcpInfo Java object, so that we don't have
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to look them up every time.
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct fieldIds {
734717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID clear;
740a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    jmethodID setIpAddress;
750a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    jmethodID setGateway;
764717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID addDns;
778058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt    jmethodID setDomains;
784717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID setServerAddress;
794717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID setLeaseDuration;
804717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID setVendorInfo;
814717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt} dhcpResultsFieldIds;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
838171e6f690cca1bad354e7e352823d79d420daf3Wink Savillestatic jint android_net_utils_resetConnections(JNIEnv* env, jobject clazz,
848171e6f690cca1bad354e7e352823d79d420daf3Wink Saville      jstring ifname, jint mask)
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);
898171e6f690cca1bad354e7e352823d79d420daf3Wink Saville
905baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("android_net_utils_resetConnections in env=%p clazz=%p iface=%s mask=0x%x\n",
918171e6f690cca1bad354e7e352823d79d420daf3Wink Saville          env, clazz, nameStr, mask);
928171e6f690cca1bad354e7e352823d79d420daf3Wink Saville
938171e6f690cca1bad354e7e352823d79d420daf3Wink Saville    result = ::ifc_reset_connections(nameStr, mask);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseStringUTFChars(ifname, nameStr);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jint)result;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcpCommon(JNIEnv* env, jobject clazz, jstring ifname,
994717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        jobject dhcpResults, bool renew)
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result;
1020216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    char  ipaddr[PROPERTY_VALUE_MAX];
1030216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    uint32_t prefixLength;
1040216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    char gateway[PROPERTY_VALUE_MAX];
1050216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    char    dns1[PROPERTY_VALUE_MAX];
1060216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    char    dns2[PROPERTY_VALUE_MAX];
1073c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt    char    dns3[PROPERTY_VALUE_MAX];
1083c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt    char    dns4[PROPERTY_VALUE_MAX];
1093c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt    const char *dns[5] = {dns1, dns2, dns3, dns4, NULL};
1100216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    char  server[PROPERTY_VALUE_MAX];
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t lease;
11277b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey    char vendorInfo[PROPERTY_VALUE_MAX];
1138058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt    char domains[PROPERTY_VALUE_MAX];
114ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt    char mtu[PROPERTY_VALUE_MAX];
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
1170216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    if (nameStr == NULL) return (jboolean)false;
1180216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt
11931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff    if (renew) {
12031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff        result = ::dhcp_do_request_renew(nameStr, ipaddr, gateway, &prefixLength,
121ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt                dns, server, &lease, vendorInfo, domains, mtu);
12231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff    } else {
12331be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff        result = ::dhcp_do_request(nameStr, ipaddr, gateway, &prefixLength,
124ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt                dns, server, &lease, vendorInfo, domains, mtu);
12531be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff    }
12628cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt    if (result != 0) {
127c249c2cc6b601ed1ff063f1748ba4399b9270209Vinit Deshapnde        ALOGD("dhcp_do_request failed : %s (%s)", nameStr, renew ? "renew" : "new");
12828cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt    }
12928cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseStringUTFChars(ifname, nameStr);
13146e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom    if (result == 0) {
1324717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.clear);
133aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt
1344717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // set the linkAddress
1354717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->addLinkAddress(inetAddress, prefixLength)
1360a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        result = env->CallBooleanMethod(dhcpResults, dhcpResultsFieldIds.setIpAddress,
1374717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt                env->NewStringUTF(ipaddr), prefixLength);
1384717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    }
1394717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1404717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    if (result == 0) {
141aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt        // set the gateway
1424717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        result = env->CallBooleanMethod(dhcpResults,
1430a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                dhcpResultsFieldIds.setGateway, env->NewStringUTF(gateway));
1444717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    }
1454717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1464717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    if (result == 0) {
1474717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->addDns(new InetAddress(dns1))
1484717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        result = env->CallBooleanMethod(dhcpResults,
1494717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt                dhcpResultsFieldIds.addDns, env->NewStringUTF(dns1));
1504717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    }
1514717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1524717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    if (result == 0) {
1538058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt        env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setDomains,
1548058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt                env->NewStringUTF(domains));
1558058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt
1564717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        result = env->CallBooleanMethod(dhcpResults,
1574717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt                dhcpResultsFieldIds.addDns, env->NewStringUTF(dns2));
1583c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt
1593c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt        if (result == 0) {
1603c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt            result = env->CallBooleanMethod(dhcpResults,
1613c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt                    dhcpResultsFieldIds.addDns, env->NewStringUTF(dns3));
1623c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt            if (result == 0) {
1633c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt                result = env->CallBooleanMethod(dhcpResults,
1643c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt                        dhcpResultsFieldIds.addDns, env->NewStringUTF(dns4));
1653c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt            }
1663c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt        }
1674717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    }
1684717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1694717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    if (result == 0) {
1704717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->setServerAddress(new InetAddress(server))
1714717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        result = env->CallBooleanMethod(dhcpResults, dhcpResultsFieldIds.setServerAddress,
1720216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt                env->NewStringUTF(server));
1734717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    }
1744717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1754717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    if (result == 0) {
1764717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->setLeaseDuration(lease)
1774717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        env->CallVoidMethod(dhcpResults,
1784717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt                dhcpResultsFieldIds.setLeaseDuration, lease);
1794717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1804717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->setVendorInfo(vendorInfo)
1814717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setVendorInfo,
1824717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt                env->NewStringUTF(vendorInfo));
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jboolean)(result == 0);
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1874717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
18831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcp(JNIEnv* env, jobject clazz, jstring ifname, jobject info)
18931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff{
19031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff    return android_net_utils_runDhcpCommon(env, clazz, ifname, info, false);
19131be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff}
19231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff
19332a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensenstatic jboolean android_net_utils_runDhcpRenew(JNIEnv* env, jobject clazz, jstring ifname,
19432a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen        jobject info)
19531be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff{
19631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff    return android_net_utils_runDhcpCommon(env, clazz, ifname, info, true);
19731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff}
19831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff
19931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_net_utils_stopDhcp(JNIEnv* env, jobject clazz, jstring ifname)
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = ::dhcp_stop(nameStr);
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseStringUTFChars(ifname, nameStr);
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jboolean)(result == 0);
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_net_utils_releaseDhcpLease(JNIEnv* env, jobject clazz, jstring ifname)
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result;
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = ::dhcp_release_lease(nameStr);
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseStringUTFChars(ifname, nameStr);
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jboolean)(result == 0);
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_net_utils_getDhcpError(JNIEnv* env, jobject clazz)
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return env->NewStringUTF(::dhcp_get_errmsg());
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22532a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensenstatic jboolean android_net_utils_bindProcessToNetwork(JNIEnv *env, jobject thiz, jint netId)
2263876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{
22732a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen    return (jboolean) !setNetworkForProcess(netId);
2283876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen}
2293876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen
2303876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensenstatic jint android_net_utils_getNetworkBoundToProcess(JNIEnv *env, jobject thiz)
2313876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{
2323876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    return getNetworkForProcess();
2333876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen}
2343876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen
23532a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensenstatic jboolean android_net_utils_bindProcessToNetworkForHostResolution(JNIEnv *env, jobject thiz,
23632a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen        jint netId)
2373876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{
23832a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen    return (jboolean) !setNetworkForResolv(netId);
2393876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen}
2403876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen
2419f1274b7e43d14c7e3a42148ebfda3905fec8b06Lorenzo Colittistatic jint android_net_utils_bindSocketToNetwork(JNIEnv *env, jobject thiz, jint socket,
24232a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen        jint netId)
2433876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{
2449f1274b7e43d14c7e3a42148ebfda3905fec8b06Lorenzo Colitti    return setNetworkForSocket(netId, socket);
2453876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen}
2463876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen
2476bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensenstatic jboolean android_net_utils_protectFromVpn(JNIEnv *env, jobject thiz, jint socket)
2486bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen{
2496bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    return (jboolean) !protectFromVpn(socket);
2506bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen}
2516bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration.
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gNetworkUtilMethods[] = {
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* name, signature, funcPtr */
2598171e6f690cca1bad354e7e352823d79d420daf3Wink Saville    { "resetConnections", "(Ljava/lang/String;I)I",  (void *)android_net_utils_resetConnections },
2604717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    { "runDhcp", "(Ljava/lang/String;Landroid/net/DhcpResults;)Z",  (void *)android_net_utils_runDhcp },
2614717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    { "runDhcpRenew", "(Ljava/lang/String;Landroid/net/DhcpResults;)Z",  (void *)android_net_utils_runDhcpRenew },
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "stopDhcp", "(Ljava/lang/String;)Z",  (void *)android_net_utils_stopDhcp },
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "releaseDhcpLease", "(Ljava/lang/String;)Z",  (void *)android_net_utils_releaseDhcpLease },
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getDhcpError", "()Ljava/lang/String;", (void*) android_net_utils_getDhcpError },
26532a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen    { "bindProcessToNetwork", "(I)Z", (void*) android_net_utils_bindProcessToNetwork },
2663876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    { "getNetworkBoundToProcess", "()I", (void*) android_net_utils_getNetworkBoundToProcess },
26732a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen    { "bindProcessToNetworkForHostResolution", "(I)Z", (void*) android_net_utils_bindProcessToNetworkForHostResolution },
2689f1274b7e43d14c7e3a42148ebfda3905fec8b06Lorenzo Colitti    { "bindSocketToNetwork", "(II)I", (void*) android_net_utils_bindSocketToNetwork },
2696bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    { "protectFromVpn", "(I)Z", (void*)android_net_utils_protectFromVpn },
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_net_NetworkUtils(JNIEnv* env)
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
274987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    jclass dhcpResultsClass = FindClassOrDie(env, "android/net/DhcpResults");
275987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
276987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    dhcpResultsFieldIds.clear = GetMethodIDOrDie(env, dhcpResultsClass, "clear", "()V");
277987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    dhcpResultsFieldIds.setIpAddress =GetMethodIDOrDie(env, dhcpResultsClass, "setIpAddress",
278987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe            "(Ljava/lang/String;I)Z");
279987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    dhcpResultsFieldIds.setGateway = GetMethodIDOrDie(env, dhcpResultsClass, "setGateway",
280987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe            "(Ljava/lang/String;)Z");
281987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    dhcpResultsFieldIds.addDns = GetMethodIDOrDie(env, dhcpResultsClass, "addDns",
282987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe            "(Ljava/lang/String;)Z");
283987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    dhcpResultsFieldIds.setDomains = GetMethodIDOrDie(env, dhcpResultsClass, "setDomains",
284987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe            "(Ljava/lang/String;)V");
285987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    dhcpResultsFieldIds.setServerAddress = GetMethodIDOrDie(env, dhcpResultsClass,
286987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe            "setServerAddress", "(Ljava/lang/String;)Z");
287987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    dhcpResultsFieldIds.setLeaseDuration = GetMethodIDOrDie(env, dhcpResultsClass,
288987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe            "setLeaseDuration", "(I)V");
289987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    dhcpResultsFieldIds.setVendorInfo = GetMethodIDOrDie(env, dhcpResultsClass, "setVendorInfo",
290987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe            "(Ljava/lang/String;)V");
291987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
292987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    return RegisterMethodsOrDie(env, NETUTILS_PKG_NAME, gNetworkUtilMethods,
293987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe                                NELEM(gNetworkUtilMethods));
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
297