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"
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/misc.h>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <arpa/inet.h>
250216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt#include <cutils/properties.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern "C" {
280900f3657664d9046e6723825fd32b244eef2b6cMike Lockwoodint ifc_enable(const char *ifname);
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint ifc_disable(const char *ifname);
308171e6f690cca1bad354e7e352823d79d420daf3Wink Savilleint ifc_reset_connections(const char *ifname, int reset_mask);
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
323c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwaltint dhcp_do_request(const char * const ifname,
330216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt                    const char *ipaddr,
340216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt                    const char *gateway,
3577b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey                    uint32_t *prefixLength,
363c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt                    const char *dns[],
370216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt                    const char *server,
3877b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey                    uint32_t *lease,
398058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt                    const char *vendorInfo,
40ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt                    const char *domains,
41ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt                    const char *mtu);
4231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff
433c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwaltint dhcp_do_request_renew(const char * const ifname,
4431be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff                    const char *ipaddr,
4531be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff                    const char *gateway,
4677b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey                    uint32_t *prefixLength,
473c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt                    const char *dns[],
4831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff                    const char *server,
4977b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey                    uint32_t *lease,
508058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt                    const char *vendorInfo,
51ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt                    const char *domains,
52ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt                    const char *mtu);
5331be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint dhcp_stop(const char *ifname);
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint dhcp_release_lease(const char *ifname);
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectchar *dhcp_get_errmsg();
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define NETUTILS_PKG_NAME "android/net/NetworkUtils"
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The following remembers the jfieldID's of the fields
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the DhcpInfo Java object, so that we don't have
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to look them up every time.
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct fieldIds {
694717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID clear;
704717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID setInterfaceName;
714717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID addLinkAddress;
724717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID addGateway;
734717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID addDns;
748058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt    jmethodID setDomains;
754717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID setServerAddress;
764717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID setLeaseDuration;
774717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jmethodID setVendorInfo;
784717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt} dhcpResultsFieldIds;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
800900f3657664d9046e6723825fd32b244eef2b6cMike Lockwoodstatic jint android_net_utils_enableInterface(JNIEnv* env, jobject clazz, jstring ifname)
810900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood{
820900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood    int result;
830900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood
840900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
850900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood    result = ::ifc_enable(nameStr);
860900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood    env->ReleaseStringUTFChars(ifname, nameStr);
870900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood    return (jint)result;
880900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood}
890900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_net_utils_disableInterface(JNIEnv* env, jobject clazz, jstring ifname)
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);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = ::ifc_disable(nameStr);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseStringUTFChars(ifname, nameStr);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jint)result;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1008171e6f690cca1bad354e7e352823d79d420daf3Wink Savillestatic jint android_net_utils_resetConnections(JNIEnv* env, jobject clazz,
1018171e6f690cca1bad354e7e352823d79d420daf3Wink Saville      jstring ifname, jint mask)
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
1068171e6f690cca1bad354e7e352823d79d420daf3Wink Saville
1075baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    ALOGD("android_net_utils_resetConnections in env=%p clazz=%p iface=%s mask=0x%x\n",
1088171e6f690cca1bad354e7e352823d79d420daf3Wink Saville          env, clazz, nameStr, mask);
1098171e6f690cca1bad354e7e352823d79d420daf3Wink Saville
1108171e6f690cca1bad354e7e352823d79d420daf3Wink Saville    result = ::ifc_reset_connections(nameStr, mask);
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseStringUTFChars(ifname, nameStr);
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jint)result;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11531be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcpCommon(JNIEnv* env, jobject clazz, jstring ifname,
1164717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        jobject dhcpResults, bool renew)
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result;
1190216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    char  ipaddr[PROPERTY_VALUE_MAX];
1200216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    uint32_t prefixLength;
1210216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    char gateway[PROPERTY_VALUE_MAX];
1220216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    char    dns1[PROPERTY_VALUE_MAX];
1230216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    char    dns2[PROPERTY_VALUE_MAX];
1243c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt    char    dns3[PROPERTY_VALUE_MAX];
1253c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt    char    dns4[PROPERTY_VALUE_MAX];
1263c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt    const char *dns[5] = {dns1, dns2, dns3, dns4, NULL};
1270216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    char  server[PROPERTY_VALUE_MAX];
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t lease;
12977b87ba0bc1c5de025976416b49e698ed9362814Jeff Sharkey    char vendorInfo[PROPERTY_VALUE_MAX];
1308058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt    char domains[PROPERTY_VALUE_MAX];
131ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt    char mtu[PROPERTY_VALUE_MAX];
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
1340216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt    if (nameStr == NULL) return (jboolean)false;
1350216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt
13631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff    if (renew) {
13731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff        result = ::dhcp_do_request_renew(nameStr, ipaddr, gateway, &prefixLength,
138ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt                dns, server, &lease, vendorInfo, domains, mtu);
13931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff    } else {
14031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff        result = ::dhcp_do_request(nameStr, ipaddr, gateway, &prefixLength,
141ec90545b5ff0e651154f8b9ab107b34e3a1124d8Dmitry Shmidt                dns, server, &lease, vendorInfo, domains, mtu);
14231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff    }
14328cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt    if (result != 0) {
144c249c2cc6b601ed1ff063f1748ba4399b9270209Vinit Deshapnde        ALOGD("dhcp_do_request failed : %s (%s)", nameStr, renew ? "renew" : "new");
14528cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt    }
14628cdf1dc222e27b11902bfb15a49331fd800cd87Robert Greenwalt
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseStringUTFChars(ifname, nameStr);
14846e18c11d46a2bc1a46174f963d0ed1224d94cd2Brian Carlstrom    if (result == 0) {
1494717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.clear);
150aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt
1514717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // set mIfaceName
1524717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->setInterfaceName(ifname)
1534717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setInterfaceName, ifname);
1544717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1554717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // set the linkAddress
1564717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->addLinkAddress(inetAddress, prefixLength)
1574717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        result = env->CallBooleanMethod(dhcpResults, dhcpResultsFieldIds.addLinkAddress,
1584717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt                env->NewStringUTF(ipaddr), prefixLength);
1594717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    }
1604717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1614717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    if (result == 0) {
162aa70f101e08098ed9cb190abe2d7f952561026b8Robert Greenwalt        // set the gateway
1634717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->addGateway(gateway)
1644717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        result = env->CallBooleanMethod(dhcpResults,
1654717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt                dhcpResultsFieldIds.addGateway, env->NewStringUTF(gateway));
1664717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    }
1674717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1684717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    if (result == 0) {
1694717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->addDns(new InetAddress(dns1))
1704717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        result = env->CallBooleanMethod(dhcpResults,
1714717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt                dhcpResultsFieldIds.addDns, env->NewStringUTF(dns1));
1724717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    }
1734717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1744717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    if (result == 0) {
1758058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt        env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setDomains,
1768058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt                env->NewStringUTF(domains));
1778058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt
1784717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        result = env->CallBooleanMethod(dhcpResults,
1794717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt                dhcpResultsFieldIds.addDns, env->NewStringUTF(dns2));
1803c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt
1813c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt        if (result == 0) {
1823c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt            result = env->CallBooleanMethod(dhcpResults,
1833c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt                    dhcpResultsFieldIds.addDns, env->NewStringUTF(dns3));
1843c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt            if (result == 0) {
1853c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt                result = env->CallBooleanMethod(dhcpResults,
1863c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt                        dhcpResultsFieldIds.addDns, env->NewStringUTF(dns4));
1873c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt            }
1883c97f944eb08a2720b43382d94a56383c2cd6b9bRobert Greenwalt        }
1894717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    }
1904717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1914717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    if (result == 0) {
1924717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->setServerAddress(new InetAddress(server))
1934717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        result = env->CallBooleanMethod(dhcpResults, dhcpResultsFieldIds.setServerAddress,
1940216e618198393bfd7ac0625fa6ad251d5ea682fRobert Greenwalt                env->NewStringUTF(server));
1954717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    }
1964717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
1974717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    if (result == 0) {
1984717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->setLeaseDuration(lease)
1994717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        env->CallVoidMethod(dhcpResults,
2004717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt                dhcpResultsFieldIds.setLeaseDuration, lease);
2014717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
2024717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        // dhcpResults->setVendorInfo(vendorInfo)
2034717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt        env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setVendorInfo,
2044717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt                env->NewStringUTF(vendorInfo));
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jboolean)(result == 0);
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2094717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt
21031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcp(JNIEnv* env, jobject clazz, jstring ifname, jobject info)
21131be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff{
21231be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff    return android_net_utils_runDhcpCommon(env, clazz, ifname, info, false);
21331be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff}
21431be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff
21531be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriffstatic jboolean android_net_utils_runDhcpRenew(JNIEnv* env, jobject clazz, jstring ifname, jobject info)
21631be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff{
21731be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff    return android_net_utils_runDhcpCommon(env, clazz, ifname, info, true);
21831be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff}
21931be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff
22031be7cf4c7aef140f2a576975a7fd31e062f6964Irfan Sheriff
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_net_utils_stopDhcp(JNIEnv* env, jobject clazz, jstring ifname)
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = ::dhcp_stop(nameStr);
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseStringUTFChars(ifname, nameStr);
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jboolean)(result == 0);
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_net_utils_releaseDhcpLease(JNIEnv* env, jobject clazz, jstring ifname)
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int result;
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char *nameStr = env->GetStringUTFChars(ifname, NULL);
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = ::dhcp_release_lease(nameStr);
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseStringUTFChars(ifname, nameStr);
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jboolean)(result == 0);
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_net_utils_getDhcpError(JNIEnv* env, jobject clazz)
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return env->NewStringUTF(::dhcp_get_errmsg());
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24612324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubakerstatic void android_net_utils_markSocket(JNIEnv *env, jobject thiz, jint socket, jint mark)
24712324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker{
24812324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker    if (setsockopt(socket, SOL_SOCKET, SO_MARK, &mark, sizeof(mark)) < 0) {
24912324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker        jniThrowException(env, "java/lang/IllegalStateException", "Error marking socket");
25012324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker    }
25112324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker}
25212324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration.
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gNetworkUtilMethods[] = {
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* name, signature, funcPtr */
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2610900f3657664d9046e6723825fd32b244eef2b6cMike Lockwood    { "enableInterface", "(Ljava/lang/String;)I",  (void *)android_net_utils_enableInterface },
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "disableInterface", "(Ljava/lang/String;)I",  (void *)android_net_utils_disableInterface },
2638171e6f690cca1bad354e7e352823d79d420daf3Wink Saville    { "resetConnections", "(Ljava/lang/String;I)I",  (void *)android_net_utils_resetConnections },
2644717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    { "runDhcp", "(Ljava/lang/String;Landroid/net/DhcpResults;)Z",  (void *)android_net_utils_runDhcp },
2654717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    { "runDhcpRenew", "(Ljava/lang/String;Landroid/net/DhcpResults;)Z",  (void *)android_net_utils_runDhcpRenew },
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "stopDhcp", "(Ljava/lang/String;)Z",  (void *)android_net_utils_stopDhcp },
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "releaseDhcpLease", "(Ljava/lang/String;)Z",  (void *)android_net_utils_releaseDhcpLease },
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getDhcpError", "()Ljava/lang/String;", (void*) android_net_utils_getDhcpError },
26912324b46049f9bcba9aa3d5fe7ae540d49a03076Chad Brubaker    { "markSocket", "(II)V", (void*) android_net_utils_markSocket },
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{
2744717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    jclass dhcpResultsClass = env->FindClass("android/net/DhcpResults");
2754717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    LOG_FATAL_IF(dhcpResultsClass == NULL, "Unable to find class android/net/DhcpResults");
2764717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    dhcpResultsFieldIds.clear =
2774717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "clear", "()V");
2784717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    dhcpResultsFieldIds.setInterfaceName =
2794717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "setInterfaceName", "(Ljava/lang/String;)V");
2804717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    dhcpResultsFieldIds.addLinkAddress =
2814717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "addLinkAddress", "(Ljava/lang/String;I)Z");
2824717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    dhcpResultsFieldIds.addGateway =
2834717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "addGateway", "(Ljava/lang/String;)Z");
2844717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    dhcpResultsFieldIds.addDns =
2854717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "addDns", "(Ljava/lang/String;)Z");
2868058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt    dhcpResultsFieldIds.setDomains =
2878058f621891b41c6864b6004c1c47647436a0ac1Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "setDomains", "(Ljava/lang/String;)V");
2884717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    dhcpResultsFieldIds.setServerAddress =
2894717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "setServerAddress", "(Ljava/lang/String;)Z");
2904717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    dhcpResultsFieldIds.setLeaseDuration =
2914717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "setLeaseDuration", "(I)V");
2924717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt    dhcpResultsFieldIds.setVendorInfo =
2934717c261b2c670d5c0925e3527a864aa52db6ac0Robert Greenwalt            env->GetMethodID(dhcpResultsClass, "setVendorInfo", "(Ljava/lang/String;)V");
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return AndroidRuntime::registerNativeMethods(env,
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NETUTILS_PKG_NAME, gNetworkUtilMethods, NELEM(gNetworkUtilMethods));
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
300