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
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern "C" {
300900f3657664d9046e6723825fd32b244eef2b6cMike Lockwoodint ifc_enable(const char *ifname);
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint ifc_disable(const char *ifname);
328171e6f690cca1bad354e7e352823d79d420daf3Wink Savilleint ifc_reset_connections(const char *ifname, int reset_mask);
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
343c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwaltint dhcp_do_request(const char * const ifname,
350216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt                    const char *ipaddr,
360216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt                    const char *gateway,
3777b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey                    uint32_t *prefixLength,
383c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt                    const char *dns[],
390216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt                    const char *server,
4077b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey                    uint32_t *lease,
418058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt                    const char *vendorInfo,
42ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt                    const char *domains,
43ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt                    const char *mtu);
4431be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff
453c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwaltint dhcp_do_request_renew(const char * const ifname,
4631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff                    const char *ipaddr,
4731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff                    const char *gateway,
4877b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey                    uint32_t *prefixLength,
493c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt                    const char *dns[],
5031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff                    const char *server,
5177b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey                    uint32_t *lease,
528058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt                    const char *vendorInfo,
53ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt                    const char *domains,
54ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt                    const char *mtu);
5531be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint dhcp_stop(const char *ifname);
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint dhcp_release_lease(const char *ifname);
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectchar *dhcp_get_errmsg();
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define NETUTILS_PKG_NAME "android/net/NetworkUtils"
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The following remembers the jfieldID's of the fields
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the DhcpInfo Java object, so that we don't have
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to look them up every time.
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct fieldIds {
714717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID clear;
720a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    jmethodID setIpAddress;
730a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    jmethodID setGateway;
744717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID addDns;
758058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt    jmethodID setDomains;
764717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID setServerAddress;
774717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID setLeaseDuration;
784717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID setVendorInfo;
794717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt} dhcpResultsFieldIds;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
818171e6f690cca1bad354e7e352823d79d420daf3Wink Savillestatic jint android_net_utils_resetConnections(JNIEnv* env, jobject clazz,
828171e6f690cca1bad354e7e352823d79d420daf3Wink Saville      jstring ifname, jint mask)
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
878171e6f690cca1bad354e7e352823d79d420daf3Wink Saville
885baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("android_net_utils_resetConnections in env=%p clazz=%p iface=%s mask=0x%x\n",
898171e6f690cca1bad354e7e352823d79d420daf3Wink Saville          env, clazz, nameStr, mask);
908171e6f690cca1bad354e7e352823d79d420daf3Wink Saville
918171e6f690cca1bad354e7e352823d79d420daf3Wink Saville    result = ::ifc_reset_connections(nameStr, mask);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseStringUTFChars(ifname, nameStr);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jint)result;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcpCommon(JNIEnv* env, jobject clazz, jstring ifname,
974717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        jobject dhcpResults, bool renew)
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result;
1000216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    char  ipaddr[PROPERTY_VALUE_MAX];
1010216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    uint32_t prefixLength;
1020216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    char gateway[PROPERTY_VALUE_MAX];
1030216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    char    dns1[PROPERTY_VALUE_MAX];
1040216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    char    dns2[PROPERTY_VALUE_MAX];
1053c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt    char    dns3[PROPERTY_VALUE_MAX];
1063c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt    char    dns4[PROPERTY_VALUE_MAX];
1073c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt    const char *dns[5] = {dns1, dns2, dns3, dns4, NULL};
1080216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    char  server[PROPERTY_VALUE_MAX];
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t lease;
11077b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey    char vendorInfo[PROPERTY_VALUE_MAX];
1118058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt    char domains[PROPERTY_VALUE_MAX];
112ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt    char mtu[PROPERTY_VALUE_MAX];
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
1150216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    if (nameStr == NULL) return (jboolean)false;
1160216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt
11731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff    if (renew) {
11831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff        result = ::dhcp_do_request_renew(nameStr, ipaddr, gateway, &prefixLength,
119ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt                dns, server, &lease, vendorInfo, domains, mtu);
12031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff    } else {
12131be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff        result = ::dhcp_do_request(nameStr, ipaddr, gateway, &prefixLength,
122ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt                dns, server, &lease, vendorInfo, domains, mtu);
12331be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff    }
12428cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt    if (result != 0) {
125c249c2cc6b601ed1ff063f1748ba4399b9270209Vinit Deshapnde        ALOGD("dhcp_do_request failed : %s (%s)", nameStr, renew ? "renew" : "new");
12628cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt    }
12728cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseStringUTFChars(ifname, nameStr);
12946e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom    if (result == 0) {
1304717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.clear);
131aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt
1324717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // set the linkAddress
1334717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->addLinkAddress(inetAddress, prefixLength)
1340a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti        result = env->CallBooleanMethod(dhcpResults, dhcpResultsFieldIds.setIpAddress,
1354717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt                env->NewStringUTF(ipaddr), prefixLength);
1364717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    }
1374717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1384717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    if (result == 0) {
139aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt        // set the gateway
1404717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        result = env->CallBooleanMethod(dhcpResults,
1410a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti                dhcpResultsFieldIds.setGateway, env->NewStringUTF(gateway));
1424717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    }
1434717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1444717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    if (result == 0) {
1454717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->addDns(new InetAddress(dns1))
1464717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        result = env->CallBooleanMethod(dhcpResults,
1474717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt                dhcpResultsFieldIds.addDns, env->NewStringUTF(dns1));
1484717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    }
1494717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1504717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    if (result == 0) {
1518058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt        env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setDomains,
1528058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt                env->NewStringUTF(domains));
1538058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt
1544717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        result = env->CallBooleanMethod(dhcpResults,
1554717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt                dhcpResultsFieldIds.addDns, env->NewStringUTF(dns2));
1563c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt
1573c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt        if (result == 0) {
1583c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt            result = env->CallBooleanMethod(dhcpResults,
1593c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt                    dhcpResultsFieldIds.addDns, env->NewStringUTF(dns3));
1603c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt            if (result == 0) {
1613c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt                result = env->CallBooleanMethod(dhcpResults,
1623c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt                        dhcpResultsFieldIds.addDns, env->NewStringUTF(dns4));
1633c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt            }
1643c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt        }
1654717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    }
1664717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1674717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    if (result == 0) {
1684717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->setServerAddress(new InetAddress(server))
1694717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        result = env->CallBooleanMethod(dhcpResults, dhcpResultsFieldIds.setServerAddress,
1700216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt                env->NewStringUTF(server));
1714717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    }
1724717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1734717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    if (result == 0) {
1744717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->setLeaseDuration(lease)
1754717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        env->CallVoidMethod(dhcpResults,
1764717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt                dhcpResultsFieldIds.setLeaseDuration, lease);
1774717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1784717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->setVendorInfo(vendorInfo)
1794717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setVendorInfo,
1804717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt                env->NewStringUTF(vendorInfo));
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jboolean)(result == 0);
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1854717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
18631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcp(JNIEnv* env, jobject clazz, jstring ifname, jobject info)
18731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff{
18831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff    return android_net_utils_runDhcpCommon(env, clazz, ifname, info, false);
18931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff}
19031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff
19132a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensenstatic jboolean android_net_utils_runDhcpRenew(JNIEnv* env, jobject clazz, jstring ifname,
19232a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen        jobject info)
19331be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff{
19431be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff    return android_net_utils_runDhcpCommon(env, clazz, ifname, info, true);
19531be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff}
19631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff
19731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_net_utils_stopDhcp(JNIEnv* env, jobject clazz, jstring ifname)
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result;
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = ::dhcp_stop(nameStr);
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseStringUTFChars(ifname, nameStr);
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jboolean)(result == 0);
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_net_utils_releaseDhcpLease(JNIEnv* env, jobject clazz, jstring ifname)
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result;
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = ::dhcp_release_lease(nameStr);
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseStringUTFChars(ifname, nameStr);
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jboolean)(result == 0);
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_net_utils_getDhcpError(JNIEnv* env, jobject clazz)
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return env->NewStringUTF(::dhcp_get_errmsg());
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22332a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensenstatic jboolean android_net_utils_bindProcessToNetwork(JNIEnv *env, jobject thiz, jint netId)
2243876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{
22532a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen    return (jboolean) !setNetworkForProcess(netId);
2263876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen}
2273876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen
2283876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensenstatic jint android_net_utils_getNetworkBoundToProcess(JNIEnv *env, jobject thiz)
2293876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{
2303876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    return getNetworkForProcess();
2313876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen}
2323876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen
23332a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensenstatic jboolean android_net_utils_bindProcessToNetworkForHostResolution(JNIEnv *env, jobject thiz,
23432a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen        jint netId)
2353876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{
23632a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen    return (jboolean) !setNetworkForResolv(netId);
2373876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen}
2383876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen
2399f1274b7e43d14c7e3a42148ebfda3905fec8b06Lorenzo Colittistatic jint android_net_utils_bindSocketToNetwork(JNIEnv *env, jobject thiz, jint socket,
24032a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen        jint netId)
2413876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{
2429f1274b7e43d14c7e3a42148ebfda3905fec8b06Lorenzo Colitti    return setNetworkForSocket(netId, socket);
2433876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen}
2443876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen
2456bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensenstatic jboolean android_net_utils_protectFromVpn(JNIEnv *env, jobject thiz, jint socket)
2466bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen{
2476bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    return (jboolean) !protectFromVpn(socket);
2486bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen}
2496bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration.
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gNetworkUtilMethods[] = {
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* name, signature, funcPtr */
2578171e6f690cca1bad354e7e352823d79d420daf3Wink Saville    { "resetConnections", "(Ljava/lang/String;I)I",  (void *)android_net_utils_resetConnections },
2584717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    { "runDhcp", "(Ljava/lang/String;Landroid/net/DhcpResults;)Z",  (void *)android_net_utils_runDhcp },
2594717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    { "runDhcpRenew", "(Ljava/lang/String;Landroid/net/DhcpResults;)Z",  (void *)android_net_utils_runDhcpRenew },
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "stopDhcp", "(Ljava/lang/String;)Z",  (void *)android_net_utils_stopDhcp },
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "releaseDhcpLease", "(Ljava/lang/String;)Z",  (void *)android_net_utils_releaseDhcpLease },
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getDhcpError", "()Ljava/lang/String;", (void*) android_net_utils_getDhcpError },
26332a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen    { "bindProcessToNetwork", "(I)Z", (void*) android_net_utils_bindProcessToNetwork },
2643876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    { "getNetworkBoundToProcess", "()I", (void*) android_net_utils_getNetworkBoundToProcess },
26532a58f00d388584f5f47c0d5d4c74ce7c8457d78Paul Jensen    { "bindProcessToNetworkForHostResolution", "(I)Z", (void*) android_net_utils_bindProcessToNetworkForHostResolution },
2669f1274b7e43d14c7e3a42148ebfda3905fec8b06Lorenzo Colitti    { "bindSocketToNetwork", "(II)I", (void*) android_net_utils_bindSocketToNetwork },
2676bc2c2c34f2b23eae79ad733c97a691734055c4fPaul Jensen    { "protectFromVpn", "(I)Z", (void*)android_net_utils_protectFromVpn },
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_net_NetworkUtils(JNIEnv* env)
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2724717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jclass dhcpResultsClass = env->FindClass("android/net/DhcpResults");
2734717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    LOG_FATAL_IF(dhcpResultsClass == NULL, "Unable to find class android/net/DhcpResults");
2744717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    dhcpResultsFieldIds.clear =
2754717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "clear", "()V");
2760a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    dhcpResultsFieldIds.setIpAddress =
2770a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti            env->GetMethodID(dhcpResultsClass, "setIpAddress", "(Ljava/lang/String;I)Z");
2780a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti    dhcpResultsFieldIds.setGateway =
2790a82e80073e193725a9d4c84a93db8a04b2456b9Lorenzo Colitti            env->GetMethodID(dhcpResultsClass, "setGateway", "(Ljava/lang/String;)Z");
2804717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    dhcpResultsFieldIds.addDns =
2814717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "addDns", "(Ljava/lang/String;)Z");
2828058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt    dhcpResultsFieldIds.setDomains =
2838058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "setDomains", "(Ljava/lang/String;)V");
2844717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    dhcpResultsFieldIds.setServerAddress =
2854717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "setServerAddress", "(Ljava/lang/String;)Z");
2864717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    dhcpResultsFieldIds.setLeaseDuration =
2874717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "setLeaseDuration", "(I)V");
2884717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    dhcpResultsFieldIds.setVendorInfo =
2894717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "setVendorInfo", "(Ljava/lang/String;)V");
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return AndroidRuntime::registerNativeMethods(env,
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NETUTILS_PKG_NAME, gNetworkUtilMethods, NELEM(gNetworkUtilMethods));
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
296