route.c revision 4a1465fefff747bebcf95b61ad4598e2c5417de5
14a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh/*
24a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh * Copyright (c) 2009, The Android Open Source Project
34a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh * All rights reserved.
44a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh *
54a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh * Redistribution and use in source and binary forms, with or without
64a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh * modification, are permitted provided that the following conditions
74a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh * are met:
84a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh *  * Redistributions of source code must retain the above copyright
94a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh *    notice, this list of conditions and the following disclaimer.
104a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh *  * Redistributions in binary form must reproduce the above copyright
114a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh *    notice, this list of conditions and the following disclaimer in
124a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh *    the documentation and/or other materials provided with the
134a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh *    distribution.
144a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh *  * Neither the name of Google, Inc. nor the names of its contributors
154a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh *    may be used to endorse or promote products derived from this
164a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh *    software without specific prior written permission.
174a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh *
184a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
194a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
204a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
214a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
224a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
234a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
244a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
254a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
264a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
274a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
284a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
294a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh * SUCH DAMAGE.
304a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh */
31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h>
33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h>
344a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh#include <errno.h>
354a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh#include <sys/ioctl.h>
364a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh#include <sys/types.h>
37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/socket.h>
38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <netinet/in.h>
39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <arpa/inet.h>
40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <linux/route.h>
41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
424a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yehstatic inline int set_address(const char *address, struct sockaddr *sa) {
434a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh    return inet_aton(address, &((struct sockaddr_in *)sa)->sin_addr);
44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
4698c297f2448fd8194cae16d213dfc9194180fa3fChung-yih Wang/* current support the following routing entries */
47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* route add default dev wlan0 */
484a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh/* route add default gw 192.168.1.1 dev wlan0 */
494a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh/* route add -net 192.168.1.2 netmask 255.255.255.0 gw 192.168.1.1 */
50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint route_main(int argc, char *argv[])
52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
534a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh    struct rtentry rt = {
544a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh        .rt_dst     = {.sa_family = AF_INET},
554a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh        .rt_genmask = {.sa_family = AF_INET},
564a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh        .rt_gateway = {.sa_family = AF_INET},
574a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh    };
58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
594a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh    errno = EINVAL;
604a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh    if (argc > 2 && !strcmp(argv[1], "add")) {
614a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh        if (!strcmp(argv[2], "default")) {
624a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh            /* route add default dev wlan0 */
634a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh            if (argc > 4 && !strcmp(argv[3], "dev")) {
644a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh                rt.rt_flags = RTF_UP | RTF_HOST;
654a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh                rt.rt_dev = argv[4];
664a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh                errno = 0;
674a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh                goto apply;
684a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh            }
6983ec181dc74d5dab4110e1895e62f1bdbf6d7d7aSan Mehat
704a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh            /* route add default gw 192.168.1.1 dev wlan0 */
714a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh            if (argc > 6 && !strcmp(argv[3], "gw") && !strcmp(argv[5], "dev")) {
7283ec181dc74d5dab4110e1895e62f1bdbf6d7d7aSan Mehat                rt.rt_flags = RTF_UP | RTF_GATEWAY;
734a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh                rt.rt_dev = argv[6];
744a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh                if (set_address(argv[4], &rt.rt_gateway)) {
754a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh                    errno = 0;
7683ec181dc74d5dab4110e1895e62f1bdbf6d7d7aSan Mehat                }
774a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh                goto apply;
7883ec181dc74d5dab4110e1895e62f1bdbf6d7d7aSan Mehat            }
79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
804a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh
814a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh        /* route add -net 192.168.1.2 netmask 255.255.255.0 gw 192.168.1.1 */
824a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh        if (argc > 7 && !strcmp(argv[2], "-net") &&
834a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh            !strcmp(argv[4], "netmask") && !strcmp(argv[6], "gw")) {
844a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh            rt.rt_flags = RTF_UP | RTF_GATEWAY;
854a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh            if (set_address(argv[3], &rt.rt_dst) &&
864a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh                set_address(argv[5], &rt.rt_genmask) &&
874a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh                set_address(argv[7], &rt.rt_gateway)) {
884a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh                errno = 0;
894a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh            }
904a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh            goto apply;
914a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh        }
92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
944a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yehapply:
954a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh    if (!errno) {
964a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh        int s = socket(AF_INET, SOCK_DGRAM, 0);
974a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh        if (s != -1 && (ioctl(s, SIOCADDRT, &rt) != -1 || errno == EEXIST)) {
984a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh            return 0;
994a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh        }
1004a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh    }
1014a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh    puts(strerror(errno));
1024a1465fefff747bebcf95b61ad4598e2c5417de5Chia-chi Yeh    return errno;
103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
104