android_net_NetUtils.cpp revision 3876495129cce3ed8ac6f247189b075dc9baec8f
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;
724717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID setInterfaceName;
734717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID addLinkAddress;
744717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID addGateway;
754717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID addDns;
768058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt    jmethodID setDomains;
774717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID setServerAddress;
784717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID setLeaseDuration;
794717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID setVendorInfo;
804717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt} dhcpResultsFieldIds;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
820900f3657664d9046e6723825fd32b244eef2b6cMike Lockwoodstatic jint android_net_utils_enableInterface(JNIEnv* env, jobject clazz, jstring ifname)
830900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood{
840900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood    int result;
850900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood
860900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
870900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood    result = ::ifc_enable(nameStr);
880900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood    env->ReleaseStringUTFChars(ifname, nameStr);
890900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood    return (jint)result;
900900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood}
910900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_net_utils_disableInterface(JNIEnv* env, jobject clazz, jstring ifname)
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = ::ifc_disable(nameStr);
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseStringUTFChars(ifname, nameStr);
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jint)result;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1028171e6f690cca1bad354e7e352823d79d420daf3Wink Savillestatic jint android_net_utils_resetConnections(JNIEnv* env, jobject clazz,
1038171e6f690cca1bad354e7e352823d79d420daf3Wink Saville      jstring ifname, jint mask)
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
1088171e6f690cca1bad354e7e352823d79d420daf3Wink Saville
1095baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("android_net_utils_resetConnections in env=%p clazz=%p iface=%s mask=0x%x\n",
1108171e6f690cca1bad354e7e352823d79d420daf3Wink Saville          env, clazz, nameStr, mask);
1118171e6f690cca1bad354e7e352823d79d420daf3Wink Saville
1128171e6f690cca1bad354e7e352823d79d420daf3Wink Saville    result = ::ifc_reset_connections(nameStr, mask);
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseStringUTFChars(ifname, nameStr);
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jint)result;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcpCommon(JNIEnv* env, jobject clazz, jstring ifname,
1184717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        jobject dhcpResults, bool renew)
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result;
1210216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    char  ipaddr[PROPERTY_VALUE_MAX];
1220216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    uint32_t prefixLength;
1230216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    char gateway[PROPERTY_VALUE_MAX];
1240216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    char    dns1[PROPERTY_VALUE_MAX];
1250216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    char    dns2[PROPERTY_VALUE_MAX];
1263c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt    char    dns3[PROPERTY_VALUE_MAX];
1273c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt    char    dns4[PROPERTY_VALUE_MAX];
1283c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt    const char *dns[5] = {dns1, dns2, dns3, dns4, NULL};
1290216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    char  server[PROPERTY_VALUE_MAX];
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t lease;
13177b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey    char vendorInfo[PROPERTY_VALUE_MAX];
1328058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt    char domains[PROPERTY_VALUE_MAX];
133ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt    char mtu[PROPERTY_VALUE_MAX];
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
1360216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    if (nameStr == NULL) return (jboolean)false;
1370216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt
13831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff    if (renew) {
13931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff        result = ::dhcp_do_request_renew(nameStr, ipaddr, gateway, &prefixLength,
140ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt                dns, server, &lease, vendorInfo, domains, mtu);
14131be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff    } else {
14231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff        result = ::dhcp_do_request(nameStr, ipaddr, gateway, &prefixLength,
143ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt                dns, server, &lease, vendorInfo, domains, mtu);
14431be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff    }
14528cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt    if (result != 0) {
146c249c2cc6b601ed1ff063f1748ba4399b9270209Vinit Deshapnde        ALOGD("dhcp_do_request failed : %s (%s)", nameStr, renew ? "renew" : "new");
14728cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt    }
14828cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseStringUTFChars(ifname, nameStr);
15046e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom    if (result == 0) {
1514717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.clear);
152aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt
1534717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // set mIfaceName
1544717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->setInterfaceName(ifname)
1554717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setInterfaceName, ifname);
1564717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1574717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // set the linkAddress
1584717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->addLinkAddress(inetAddress, prefixLength)
1594717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        result = env->CallBooleanMethod(dhcpResults, dhcpResultsFieldIds.addLinkAddress,
1604717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt                env->NewStringUTF(ipaddr), prefixLength);
1614717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    }
1624717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1634717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    if (result == 0) {
164aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt        // set the gateway
1654717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->addGateway(gateway)
1664717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        result = env->CallBooleanMethod(dhcpResults,
1674717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt                dhcpResultsFieldIds.addGateway, env->NewStringUTF(gateway));
1684717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    }
1694717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1704717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    if (result == 0) {
1714717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->addDns(new InetAddress(dns1))
1724717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        result = env->CallBooleanMethod(dhcpResults,
1734717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt                dhcpResultsFieldIds.addDns, env->NewStringUTF(dns1));
1744717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    }
1754717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1764717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    if (result == 0) {
1778058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt        env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setDomains,
1788058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt                env->NewStringUTF(domains));
1798058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt
1804717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        result = env->CallBooleanMethod(dhcpResults,
1814717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt                dhcpResultsFieldIds.addDns, env->NewStringUTF(dns2));
1823c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt
1833c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt        if (result == 0) {
1843c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt            result = env->CallBooleanMethod(dhcpResults,
1853c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt                    dhcpResultsFieldIds.addDns, env->NewStringUTF(dns3));
1863c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt            if (result == 0) {
1873c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt                result = env->CallBooleanMethod(dhcpResults,
1883c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt                        dhcpResultsFieldIds.addDns, env->NewStringUTF(dns4));
1893c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt            }
1903c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt        }
1914717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    }
1924717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1934717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    if (result == 0) {
1944717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->setServerAddress(new InetAddress(server))
1954717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        result = env->CallBooleanMethod(dhcpResults, dhcpResultsFieldIds.setServerAddress,
1960216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt                env->NewStringUTF(server));
1974717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    }
1984717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1994717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    if (result == 0) {
2004717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->setLeaseDuration(lease)
2014717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        env->CallVoidMethod(dhcpResults,
2024717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt                dhcpResultsFieldIds.setLeaseDuration, lease);
2034717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
2044717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->setVendorInfo(vendorInfo)
2054717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setVendorInfo,
2064717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt                env->NewStringUTF(vendorInfo));
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jboolean)(result == 0);
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2114717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
21231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcp(JNIEnv* env, jobject clazz, jstring ifname, jobject info)
21331be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff{
21431be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff    return android_net_utils_runDhcpCommon(env, clazz, ifname, info, false);
21531be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff}
21631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff
21731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcpRenew(JNIEnv* env, jobject clazz, jstring ifname, jobject info)
21831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff{
21931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff    return android_net_utils_runDhcpCommon(env, clazz, ifname, info, true);
22031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff}
22131be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff
22231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_net_utils_stopDhcp(JNIEnv* env, jobject clazz, jstring ifname)
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result;
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = ::dhcp_stop(nameStr);
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseStringUTFChars(ifname, nameStr);
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jboolean)(result == 0);
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_net_utils_releaseDhcpLease(JNIEnv* env, jobject clazz, jstring ifname)
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = ::dhcp_release_lease(nameStr);
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseStringUTFChars(ifname, nameStr);
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jboolean)(result == 0);
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_net_utils_getDhcpError(JNIEnv* env, jobject clazz)
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return env->NewStringUTF(::dhcp_get_errmsg());
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24812324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubakerstatic void android_net_utils_markSocket(JNIEnv *env, jobject thiz, jint socket, jint mark)
24912324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker{
25012324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker    if (setsockopt(socket, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)) < 0) {
25112324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker        jniThrowException(env, "java/lang/IllegalStateException", "Error marking socket");
25212324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker    }
25312324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker}
25412324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker
2553876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensenstatic void android_net_utils_bindProcessToNetwork(JNIEnv *env, jobject thiz, jint netId)
2563876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{
2573876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    setNetworkForProcess(netId);
2583876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen}
2593876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen
2603876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensenstatic void android_net_utils_unbindProcessToNetwork(JNIEnv *env, jobject thiz)
2613876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{
2623876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    setNetworkForProcess(NETID_UNSET);
2633876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen}
2643876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen
2653876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensenstatic jint android_net_utils_getNetworkBoundToProcess(JNIEnv *env, jobject thiz)
2663876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{
2673876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    return getNetworkForProcess();
2683876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen}
2693876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen
2703876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensenstatic void android_net_utils_bindProcessToNetworkForHostResolution(JNIEnv *env, jobject thiz, jint netId)
2713876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{
2723876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    setNetworkForResolv(netId);
2733876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen}
2743876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen
2753876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensenstatic void android_net_utils_unbindProcessToNetworkForHostResolution(JNIEnv *env, jobject thiz)
2763876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{
2773876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    setNetworkForResolv(NETID_UNSET);
2783876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen}
2793876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen
2803876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensenstatic void android_net_utils_bindSocketToNetwork(JNIEnv *env, jobject thiz, jint socket, jint netId)
2813876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen{
2823876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    setNetworkForSocket(netId, socket);
2833876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen}
2843876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration.
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gNetworkUtilMethods[] = {
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* name, signature, funcPtr */
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2930900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood    { "enableInterface", "(Ljava/lang/String;)I",  (void *)android_net_utils_enableInterface },
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "disableInterface", "(Ljava/lang/String;)I",  (void *)android_net_utils_disableInterface },
2958171e6f690cca1bad354e7e352823d79d420daf3Wink Saville    { "resetConnections", "(Ljava/lang/String;I)I",  (void *)android_net_utils_resetConnections },
2964717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    { "runDhcp", "(Ljava/lang/String;Landroid/net/DhcpResults;)Z",  (void *)android_net_utils_runDhcp },
2974717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    { "runDhcpRenew", "(Ljava/lang/String;Landroid/net/DhcpResults;)Z",  (void *)android_net_utils_runDhcpRenew },
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "stopDhcp", "(Ljava/lang/String;)Z",  (void *)android_net_utils_stopDhcp },
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "releaseDhcpLease", "(Ljava/lang/String;)Z",  (void *)android_net_utils_releaseDhcpLease },
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getDhcpError", "()Ljava/lang/String;", (void*) android_net_utils_getDhcpError },
30112324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker    { "markSocket", "(II)V", (void*) android_net_utils_markSocket },
3023876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    { "bindProcessToNetwork", "(I)V", (void*) android_net_utils_bindProcessToNetwork },
3033876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    { "getNetworkBoundToProcess", "()I", (void*) android_net_utils_getNetworkBoundToProcess },
3043876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    { "unbindProcessToNetwork", "()V", (void*) android_net_utils_unbindProcessToNetwork },
3053876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    { "bindProcessToNetworkForHostResolution", "(I)V", (void*) android_net_utils_bindProcessToNetworkForHostResolution },
3063876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    { "unbindProcessToNetworkForHostResolution", "()V", (void*) android_net_utils_unbindProcessToNetworkForHostResolution },
3073876495129cce3ed8ac6f247189b075dc9baec8fPaul Jensen    { "bindSocketToNetwork", "(II)V", (void*) android_net_utils_bindSocketToNetwork },
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_net_NetworkUtils(JNIEnv* env)
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3124717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jclass dhcpResultsClass = env->FindClass("android/net/DhcpResults");
3134717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    LOG_FATAL_IF(dhcpResultsClass == NULL, "Unable to find class android/net/DhcpResults");
3144717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    dhcpResultsFieldIds.clear =
3154717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "clear", "()V");
3164717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    dhcpResultsFieldIds.setInterfaceName =
3174717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "setInterfaceName", "(Ljava/lang/String;)V");
3184717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    dhcpResultsFieldIds.addLinkAddress =
3194717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "addLinkAddress", "(Ljava/lang/String;I)Z");
3204717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    dhcpResultsFieldIds.addGateway =
3214717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "addGateway", "(Ljava/lang/String;)Z");
3224717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    dhcpResultsFieldIds.addDns =
3234717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "addDns", "(Ljava/lang/String;)Z");
3248058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt    dhcpResultsFieldIds.setDomains =
3258058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "setDomains", "(Ljava/lang/String;)V");
3264717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    dhcpResultsFieldIds.setServerAddress =
3274717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "setServerAddress", "(Ljava/lang/String;)Z");
3284717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    dhcpResultsFieldIds.setLeaseDuration =
3294717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "setLeaseDuration", "(I)V");
3304717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    dhcpResultsFieldIds.setVendorInfo =
3314717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "setVendorInfo", "(Ljava/lang/String;)V");
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return AndroidRuntime::registerNativeMethods(env,
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NETUTILS_PKG_NAME, gNetworkUtilMethods, NELEM(gNetworkUtilMethods));
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
338