annotate toys/pending/route.c @ 1164:9482222e51f5 draft

The recent switch from get_int_value to to atolx_range left route broken. So here's a patch to switch it to atolx_range as well.
author Isaac Dunham <ibid.ag@gmail.com>
date Mon, 23 Dec 2013 20:58:24 -0600
parents e11684e3bbc5
children 41efba077b75
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1055
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
1 /* route.c - Display routing table.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
2 *
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
3 * Copyright 2012 Ranjan Kumar <ranjankumar.bth@gmail.com>
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
4 * Copyright 2013 Kyungwan Han <asura321@gmail.com>
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
5 *
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
6 * No Standard
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
7 *
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
8 USE_ROUTE(NEWTOY(route, "?neA:", TOYFLAG_BIN))
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
9 config ROUTE
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
10 bool "route"
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
11 default n
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
12 help
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
13 usage: route -neA inet{6} / [{add|del}]
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
14
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
15 Display/Edit kernel routing tables.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
16
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
17 -n Don't resolve names
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
18 -e Display other/more information
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
19 -A inet{6} Select Address Family
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
20 */
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
21
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
22 #define FOR_route
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
23 #include "toys.h"
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
24 #include <net/route.h>
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
25 #include <sys/param.h>
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
26
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
27 GLOBALS(
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
28 char *family;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
29 )
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
30
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
31 #define DEFAULT_PREFIXLEN 128
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
32 #define INVALID_ADDR 0xffffffffUL
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
33 #define IPV6_ADDR_LEN 40 //32 + 7 (':') + 1 ('\0')
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
34
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
35 #define TEST_ARGV(argv) if (!*argv) show_route_help()
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
36
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
37 struct _arglist {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
38 char *arg;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
39 int action;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
40 };
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
41
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
42 static struct _arglist arglist1[] = {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
43 { "add", 1 }, { "del", 2 },
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
44 { "delete", 2 }, { NULL, 0 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
45 };
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
46
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
47 static struct _arglist arglist2[] = {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
48 { "-net", 1 }, { "-host", 2 },
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
49 { NULL, 0 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
50 };
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
51
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
52 // display help info and exit.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
53 static void show_route_help(void)
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
54 {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
55 toys.exithelp = 1;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
56 error_exit("Invalid Argument");
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
57 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
58
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
59 // to get the host name from the given ip.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
60 static int get_hostname(char *ipstr, struct sockaddr_in *sockin)
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
61 {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
62 struct hostent *host;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
63
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
64 sockin->sin_family = AF_INET;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
65 sockin->sin_port = 0;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
66
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
67 if (!strcmp(ipstr, "default")) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
68 sockin->sin_addr.s_addr = INADDR_ANY;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
69 return 1;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
70 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
71
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
72 if (inet_aton(ipstr, &sockin->sin_addr)) return 0;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
73 if (!(host = gethostbyname(ipstr))) return -1;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
74 memcpy(&sockin->sin_addr, host->h_addr_list[0], sizeof(struct in_addr));
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
75 return 0;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
76 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
77
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
78 // used to extract the address info from the given ip.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
79 static int get_addrinfo(char *ip, struct sockaddr_in6 *sock_in6)
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
80 {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
81 struct addrinfo hints, *result;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
82 int status = 0;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
83
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
84 memset(&hints, 0, sizeof(struct addrinfo));
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
85 hints.ai_family = AF_INET6;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
86 if ((status = getaddrinfo(ip, NULL, &hints, &result))) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
87 perror_msg("getaddrinfo: %s", gai_strerror(status));
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
88 return -1;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
89 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
90 if (result) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
91 memcpy(sock_in6, result->ai_addr, sizeof(*sock_in6));
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
92 freeaddrinfo(result);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
93 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
94 return 0;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
95 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
96
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
97 //get the flag values for route command.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
98 static void get_flag_value(char *str, int flags)
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
99 {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
100 int i = 0;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
101 static unsigned flagarray[] = {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
102 RTF_GATEWAY, RTF_HOST, RTF_REINSTATE, RTF_DYNAMIC,
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
103 RTF_MODIFIED, RTF_DEFAULT, RTF_ADDRCONF, RTF_CACHE
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
104 };
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
105
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
106 *str++ = 'U';
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
107 while ((*str = "GHRDMDAC"[i]))
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
108 if (flags & flagarray[i++]) ++str;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
109 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
110
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
111 // extract inet4 route info from /proc/net/route file and display it.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
112 static void display_routes(void)
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
113 {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
114 unsigned long dest, gate, mask;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
115 int flags, ref, use, metric, mss, win, irtt, items;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
116 char iface[64] = {0,}, flag_val[10]; //there are 9 flags "UGHRDMDAC" for route.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
117
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
118 FILE *fp = xfopen("/proc/net/route", "r");
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
119
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
120 xprintf("Kernel IP routing table\n"
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
121 "Destination Gateway Genmask Flags %s Iface\n",
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
122 (toys.optflags & FLAG_e)? " MSS Window irtt" : "Metric Ref Use");
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
123
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
124 if (fscanf(fp, "%*[^\n]\n") < 0) perror_exit("fscanf"); //skip 1st line
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
125 while ((items = fscanf(fp, "%63s%lx%lx%X%d%d%d%lx%d%d%d\n", iface, &dest,
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
126 &gate, &flags, &ref, &use, &metric, &mask, &mss, &win, &irtt)) == 11) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
127
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
128 char *destip = toybuf, *gateip = toybuf+32, *maskip = toybuf+64; //ip string 16
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
129 memset(flag_val, 0, 10);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
130
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
131 if (!(flags & RTF_UP)) continue; //skip down interfaces.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
132
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
133 if (!dest && !(toys.optflags & FLAG_n)) strcpy( destip, "default");
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
134 else if (!inet_ntop(AF_INET, &dest, destip, 32)) perror_exit("inet");
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
135
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
136 if (!gate && !(toys.optflags & FLAG_n)) strcpy( gateip, "*");
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
137 else if (!inet_ntop(AF_INET, &gate, gateip, 32)) perror_exit("inet");
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
138
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
139 if (!inet_ntop(AF_INET, &mask, maskip, 32)) perror_exit("inet");
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
140
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
141 //Get flag Values
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
142 get_flag_value(flag_val, (flags & (RTF_GATEWAY|RTF_HOST|RTF_REINSTATE
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
143 |RTF_DYNAMIC|RTF_MODIFIED)));
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
144 if (flags & RTF_REJECT) flag_val[0] = '!';
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
145 xprintf("%-15.15s %-15.15s %-16s%-6s", destip, gateip, maskip, flag_val);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
146 if (toys.optflags & FLAG_e) xprintf("%5d %-5d %6d %s\n", mss, win, irtt, iface);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
147 else xprintf("%-6d %-2d %7d %s\n", metric, ref, use, iface);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
148 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
149
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
150 if (items > 0 && feof(fp)) perror_exit("fscanf %d", items);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
151 fclose(fp);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
152 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
153
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
154
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
155 /*
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
156 * find the given parameter in list like add/del/net/host.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
157 * and if match found return the appropriate action.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
158 */
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
159 static int get_action(char ***argv, struct _arglist *list)
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
160 {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
161 struct _arglist *alist;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
162
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
163 if (!**argv) return 0;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
164 for (alist = list; alist->arg; alist++) { //find the given parameter in list
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
165 if (!strcmp(**argv, alist->arg)) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
166 *argv += 1;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
167 return alist->action;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
168 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
169 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
170 return 0;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
171 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
172
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
173 /*
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
174 * get prefix len (if any) and remove the prefix from target ip.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
175 * if no prefix then set netmask as default.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
176 */
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
177 static void is_prefix(char **tip, char **netmask, struct rtentry *rt)
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
178 {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
179 char *prefix = strchr(*tip, '/');
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
180 if (prefix) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
181 unsigned long plen;
1164
9482222e51f5 The recent switch from get_int_value to to atolx_range left route
Isaac Dunham <ibid.ag@gmail.com>
parents: 1104
diff changeset
182 plen = atolx_range(prefix + 1, 0, 32);
1055
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
183 //used to verify the netmask and route conflict.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
184 (((struct sockaddr_in *)&((rt)->rt_genmask))->sin_addr.s_addr)
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
185 = htonl( ~(INVALID_ADDR >> plen));
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
186 *prefix = '\0';
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
187 rt->rt_genmask.sa_family = AF_INET;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
188 } else *netmask = "default"; //default netmask.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
189 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
190
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
191 /*
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
192 * used to get the params like: metric, netmask, gw, mss, window, irtt, dev and their values.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
193 * additionally set the flag values for reject, mod, dyn and reinstate.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
194 */
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
195 static void get_next_params(char **argv, struct rtentry *rt, char **netmask)
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
196 {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
197 while (*argv) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
198 //set the metric field in the routing table.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
199 if (!strcmp(*argv, "metric")) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
200 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
201 TEST_ARGV(argv);
1164
9482222e51f5 The recent switch from get_int_value to to atolx_range left route
Isaac Dunham <ibid.ag@gmail.com>
parents: 1104
diff changeset
202 rt->rt_metric = atolx_range(*argv, 0, ULONG_MAX) + 1;
1055
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
203 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
204 } else if (!strcmp(*argv, "netmask")) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
205 //when adding a network route, the netmask to be used.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
206 struct sockaddr sock;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
207 unsigned int addr_mask = (((struct sockaddr_in *)&((rt)->rt_genmask))->sin_addr.s_addr);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
208 if (addr_mask) show_route_help();
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
209 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
210 TEST_ARGV(argv);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
211 *netmask = *argv;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
212 if (get_hostname(*netmask, (struct sockaddr_in *) &sock) < 0)
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
213 perror_exit("resolving '%s'", *netmask);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
214 rt->rt_genmask = sock;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
215 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
216 } else if (!strcmp(*argv, "gw")) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
217 //route packets via a gateway.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
218 if (!(rt->rt_flags & RTF_GATEWAY)) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
219 int ishost;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
220 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
221 TEST_ARGV(argv);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
222 if ((ishost = get_hostname(*argv, (struct sockaddr_in *) &rt->rt_gateway)) == 0) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
223 rt->rt_flags |= RTF_GATEWAY;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
224 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
225 } else if (ishost < 0) perror_exit("resolving '%s'", *argv);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
226 else perror_exit("gateway '%s' is a NETWORK", *argv);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
227 } else show_route_help();
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
228 } else if (!strcmp(*argv, "mss")) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
229 //set the TCP Maximum Segment Size for connections over this route.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
230 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
231 TEST_ARGV(argv);
1164
9482222e51f5 The recent switch from get_int_value to to atolx_range left route
Isaac Dunham <ibid.ag@gmail.com>
parents: 1104
diff changeset
232 rt->rt_mss = atolx_range(*argv, 64, 32768); //MSS low and max
1055
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
233 rt->rt_flags |= RTF_MSS;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
234 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
235 } else if (!strcmp(*argv, "window")) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
236 //set the TCP window size for connections over this route to W bytes.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
237 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
238 TEST_ARGV(argv);
1164
9482222e51f5 The recent switch from get_int_value to to atolx_range left route
Isaac Dunham <ibid.ag@gmail.com>
parents: 1104
diff changeset
239 rt->rt_window = atolx_range(*argv, 128, INT_MAX); //win low
1055
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
240 rt->rt_flags |= RTF_WINDOW;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
241 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
242 } else if (!strcmp(*argv, "irtt")) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
243 long nclock_ticks = sysconf(_SC_CLK_TCK); //number of clock ticks per second.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
244 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
245 TEST_ARGV(argv);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
246 nclock_ticks /= 100;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
247 rt->rt_irtt = strtoul(*argv, NULL, 10);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
248 if (nclock_ticks > 0) rt->rt_irtt *= nclock_ticks;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
249 rt->rt_flags |= 0x0100; //RTF_IRTT
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
250 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
251 } else if (!strcmp(*argv, "dev")) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
252 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
253 TEST_ARGV(argv);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
254 if ((!rt->rt_dev)) rt->rt_dev = *argv;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
255 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
256 } else if (!strcmp(*argv, "reject")) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
257 rt->rt_flags |= RTF_REJECT;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
258 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
259 } else if (!strcmp(*argv, "mod")) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
260 rt->rt_flags |= RTF_MODIFIED;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
261 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
262 } else if (!strcmp(*argv, "dyn")) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
263 rt->rt_flags |= RTF_DYNAMIC;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
264 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
265 } else if (!strcmp(*argv, "reinstate")) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
266 rt->rt_flags |= RTF_REINSTATE;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
267 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
268 } else show_route_help(); //No match found; exit form the application.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
269 }//end of while loop.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
270
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
271 if (!rt->rt_dev && (rt->rt_flags & RTF_REJECT)) rt->rt_dev = (char *)"lo";
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
272 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
273
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
274 // verify the netmask and conflict in netmask and route address.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
275 static void verify_netmask(struct rtentry *rt, char *netmask)
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
276 {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
277 unsigned int addr_mask = (((struct sockaddr_in *)&((rt)->rt_genmask))->sin_addr.s_addr);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
278 unsigned int router_addr = ~(unsigned int)(((struct sockaddr_in *)&((rt)->rt_dst))->sin_addr.s_addr);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
279
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
280 if (addr_mask) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
281 addr_mask = ~ntohl(addr_mask);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
282 if ((rt->rt_flags & RTF_HOST) && addr_mask != INVALID_ADDR)
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
283 perror_exit("conflicting netmask and host route");
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
284 if (addr_mask & (addr_mask + 1)) perror_exit("wrong netmask '%s'", netmask);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
285 addr_mask = ((struct sockaddr_in *) &rt->rt_dst)->sin_addr.s_addr;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
286 if (addr_mask & router_addr) perror_exit("conflicting netmask and route address");
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
287 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
288 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
289
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
290 // add/del a route.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
291 static void setroute(char **argv)
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
292 {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
293 struct rtentry rt;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
294 char *netmask = NULL, *targetip;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
295 int is_net_or_host = 0, sokfd, arg2_action;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
296 int action = get_action(&argv, arglist1); //verify the arg for add/del.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
297
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
298 if (!action || !*argv) show_route_help();
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
299
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
300 arg2_action = get_action(&argv, arglist2); //verify the arg for -net or -host
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
301 if (!*argv) show_route_help();
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
302
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
303 memset(&rt, 0, sizeof(struct rtentry));
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
304 targetip = *argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
305
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
306 is_prefix((char **)&targetip, (char **)&netmask, &rt);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
307 if ((is_net_or_host = get_hostname(targetip,
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
308 (struct sockaddr_in *) &rt.rt_dst)) < 0)
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
309 perror_exit("resolving '%s'", targetip);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
310
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
311 if (arg2_action) is_net_or_host = arg2_action & 1;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
312 rt.rt_flags = ((is_net_or_host) ? RTF_UP : (RTF_UP | RTF_HOST));
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
313
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
314 get_next_params(argv, &rt, (char **)&netmask);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
315 verify_netmask(&rt, (char *)netmask);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
316
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
317 if ((action == 1) && (rt.rt_flags & RTF_HOST))
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
318 (((struct sockaddr_in *)&((rt).rt_genmask))->sin_addr.s_addr) = INVALID_ADDR;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
319
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
320 sokfd = xsocket(AF_INET, SOCK_DGRAM, 0);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
321 if (action == 1) xioctl(sokfd, SIOCADDRT, &rt);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
322 else xioctl(sokfd, SIOCDELRT, &rt);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
323 xclose(sokfd);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
324 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
325
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
326 /*
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
327 * get prefix len (if any) and remove the prefix from target ip.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
328 * if no prefix then set default prefix len.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
329 */
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
330 static void is_prefix_inet6(char **tip, struct in6_rtmsg *rt)
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
331 {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
332 unsigned long plen;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
333 char *prefix = strchr(*tip, '/');
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
334
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
335 if (prefix) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
336 *prefix = '\0';
1164
9482222e51f5 The recent switch from get_int_value to to atolx_range left route
Isaac Dunham <ibid.ag@gmail.com>
parents: 1104
diff changeset
337 plen = atolx_range(prefix + 1, 0, 128); //DEFAULT_PREFIXLEN);
1055
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
338 } else plen = DEFAULT_PREFIXLEN;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
339
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
340 rt->rtmsg_flags = (plen == DEFAULT_PREFIXLEN) ? (RTF_UP | RTF_HOST) : RTF_UP;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
341 rt->rtmsg_dst_len = plen;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
342 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
343
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
344 /*
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
345 * used to get the params like: metric, gw, dev and their values.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
346 * additionally set the flag values for mod and dyn.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
347 */
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
348 static void get_next_params_inet6(char **argv, struct sockaddr_in6 *sock_in6, struct in6_rtmsg *rt, char **dev_name)
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
349 {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
350 while (*argv) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
351 if (!strcmp(*argv, "metric")) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
352 //set the metric field in the routing table.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
353 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
354 TEST_ARGV(argv);
1164
9482222e51f5 The recent switch from get_int_value to to atolx_range left route
Isaac Dunham <ibid.ag@gmail.com>
parents: 1104
diff changeset
355 rt->rtmsg_metric = atolx_range(*argv, 0, ULONG_MAX);
1055
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
356 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
357 } else if (!strcmp(*argv, "gw")) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
358 //route packets via a gateway.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
359 if (!(rt->rtmsg_flags & RTF_GATEWAY)) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
360 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
361 TEST_ARGV(argv);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
362 if (!get_addrinfo(*argv, (struct sockaddr_in6 *) &sock_in6)) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
363 memcpy(&rt->rtmsg_gateway, sock_in6->sin6_addr.s6_addr, sizeof(struct in6_addr));
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
364 rt->rtmsg_flags |= RTF_GATEWAY;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
365 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
366 } else perror_exit("resolving '%s'", *argv);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
367 } else show_route_help();
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
368 } else if (!strcmp(*argv, "dev")) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
369 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
370 TEST_ARGV(argv);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
371 if (!*dev_name) *dev_name = *argv;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
372 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
373 } else if (!strcmp(*argv, "mod")) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
374 rt->rtmsg_flags |= RTF_MODIFIED;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
375 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
376 } else if (!strcmp(*argv, "dyn")) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
377 rt->rtmsg_flags |= RTF_DYNAMIC;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
378 argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
379 } else show_route_help();
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
380 }//end of while loop.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
381 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
382
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
383 // add/del a route.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
384 static void setroute_inet6(char **argv)
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
385 {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
386 struct sockaddr_in6 sock_in6;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
387 struct in6_rtmsg rt;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
388 char *targetip;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
389 int sockfd, action = get_action(&argv, arglist1);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
390
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
391 if (!action || !*argv) show_route_help();
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
392 memset(&sock_in6, 0, sizeof(struct sockaddr_in6));
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
393 memset(&rt, 0, sizeof(struct in6_rtmsg));
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
394 targetip = *argv++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
395 if (*argv) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
396 unsigned long plen = 0;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
397 char *dev_name = NULL;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
398 if (!strcmp(targetip, "default")) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
399 rt.rtmsg_flags = RTF_UP;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
400 rt.rtmsg_dst_len = plen;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
401 } else {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
402 is_prefix_inet6((char **)&targetip, &rt);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
403 if (get_addrinfo(targetip, (struct sockaddr_in6 *) &sock_in6))
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
404 perror_exit("resolving '%s'", targetip);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
405 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
406 rt.rtmsg_metric = 1; //default metric.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
407 memcpy(&rt.rtmsg_dst, sock_in6.sin6_addr.s6_addr, sizeof(struct in6_addr));
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
408 get_next_params_inet6(argv, &sock_in6, &rt, (char **)&dev_name);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
409
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
410 sockfd = xsocket(AF_INET6, SOCK_DGRAM, 0);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
411 if (dev_name) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
412 char ifre_buf[sizeof(struct ifreq)] = {0,};
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
413 struct ifreq *ifre = (struct ifreq*)ifre_buf;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
414 strncpy(ifre->ifr_name, dev_name, IFNAMSIZ-1);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
415 xioctl(sockfd, SIOGIFINDEX, ifre);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
416 rt.rtmsg_ifindex = ifre->ifr_ifindex;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
417 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
418 if (action == 1) xioctl(sockfd, SIOCADDRT, &rt);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
419 else xioctl(sockfd, SIOCDELRT, &rt);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
420 xclose(sockfd);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
421 } else show_route_help();
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
422 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
423
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
424 /*
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
425 * format the dest and src address in ipv6 format.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
426 * e.g. 2002:6b6d:26c8:d:ea03:9aff:fe65:9d62
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
427 */
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
428 static void ipv6_addr_formating(char *ptr, char *addr)
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
429 {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
430 int i = 0;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
431 while (i <= IPV6_ADDR_LEN) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
432 if (!*ptr) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
433 if (i == IPV6_ADDR_LEN) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
434 addr[IPV6_ADDR_LEN - 1] = 0; //NULL terminating the ':' seperated address.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
435 break;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
436 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
437 error_exit("IPv6 ip format error");
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
438 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
439 addr[i++] = *ptr++;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
440 if (!((i+1) % 5)) addr[i++] = ':'; //put ':' after 4th bit
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
441 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
442 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
443
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
444 static void display_routes6(void)
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
445 {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
446 char iface[16] = {0,}, ipv6_dest_addr[41];
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
447 char ipv6_src_addr[41], flag_val[10], buf2[INET6_ADDRSTRLEN];
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
448 int prefixlen, metric, use, refcount, flag, items = 0;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
449 unsigned char buf[sizeof(struct in6_addr)];
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
450
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
451 FILE *fp = xfopen("/proc/net/ipv6_route", "r");
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
452
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
453 xprintf("Kernel IPv6 routing table\n"
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
454 "%-43s%-40s Flags Metric Ref Use Iface\n", "Destination", "Next Hop");
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
455
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
456 while ((items = fscanf(fp, "%32s%x%*s%*x%32s%x%x%x%x%10s\n", ipv6_dest_addr+8,
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
457 &prefixlen, ipv6_src_addr+8, &metric, &use, &refcount, &flag,
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
458 iface)) == 8) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
459
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
460 memset(flag_val, 0, 10);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
461
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
462 if (!(flag & RTF_UP)) continue; //skip down interfaces.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
463
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
464 //ipv6_dest_addr+8: as the values are filled from the 8th location of the array.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
465 ipv6_addr_formating(ipv6_dest_addr+8, ipv6_dest_addr);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
466 ipv6_addr_formating(ipv6_src_addr+8, ipv6_src_addr);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
467
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
468 get_flag_value(flag_val, (flag & (RTF_GATEWAY|RTF_HOST|RTF_DEFAULT|
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
469 RTF_ADDRCONF|RTF_CACHE)));
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
470 if (inet_pton(AF_INET6, ipv6_dest_addr, buf) <= 0) perror_exit("inet");
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
471 if (inet_ntop(AF_INET6, buf, buf2, INET6_ADDRSTRLEN)) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
472 sprintf(toybuf, "%s/%d", buf2, prefixlen);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
473 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
474
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
475 if (inet_pton(AF_INET6, ipv6_src_addr, buf) <= 0) perror_exit("inet");
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
476 if (inet_ntop(AF_INET6, buf, buf2, INET6_ADDRSTRLEN)) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
477 xprintf("%-43s %-39s %-5s %-6d %-4d %5d %-8s\n",
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
478 toybuf, buf2, flag_val, metric, refcount, use, iface);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
479 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
480 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
481 if ((items > 0) && feof(fp)) perror_exit("fscanf");
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
482
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
483 fclose(fp);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
484 }
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
485
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
486 void route_main(void)
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
487 {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
488 if (!(toys.optflags & FLAG_A)) TT.family = "inet";
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
489 if (!*toys.optargs) {
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
490 if (!strcmp(TT.family, "inet")) display_routes();
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
491 else if (!strcmp(TT.family, "inet6")) display_routes6();
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
492 else show_route_help();
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
493 return;
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
494 }//End of if statement.
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
495
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
496 if (!strcmp(TT.family, "inet6")) setroute_inet6(toys.optargs);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
497 else setroute(toys.optargs);
f8824260d057 Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff changeset
498 }