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