OpenVPN
test_networking.c
Go to the documentation of this file.
1 #include "config.h"
2 #include "syshead.h"
3 #include "networking.h"
4 
5 
6 static char *iface = "ovpn-dummy0";
7 
8 static int
9 net__iface_up(bool up)
10 {
11  printf("CMD: ip link set %s %s\n", iface, up ? "up" : "down");
12 
13  return net_iface_up(NULL, iface, up);
14 }
15 
16 static int
18 {
19  printf("CMD: ip link set %s mtu %d\n", iface, mtu);
20 
21  return net_iface_mtu_set(NULL, iface, mtu);
22 }
23 
24 static int
25 net__addr_v4_add(const char *addr_str, int prefixlen)
26 {
27  in_addr_t addr;
28  int ret;
29 
30  ret = inet_pton(AF_INET, addr_str, &addr);
31  if (ret != 1)
32  {
33  return -1;
34  }
35 
36  addr = ntohl(addr);
37 
38  printf("CMD: ip addr add %s/%d dev %s\n", addr_str, prefixlen, iface);
39 
40  return net_addr_v4_add(NULL, iface, &addr, prefixlen);
41 }
42 
43 static int
44 net__addr_v6_add(const char *addr_str, int prefixlen)
45 {
46  struct in6_addr addr;
47  int ret;
48 
49  ret = inet_pton(AF_INET6, addr_str, &addr);
50  if (ret != 1)
51  {
52  return -1;
53  }
54 
55  printf("CMD: ip -6 addr add %s/%d dev %s\n", addr_str, prefixlen, iface);
56 
57  return net_addr_v6_add(NULL, iface, &addr, prefixlen);
58 }
59 
60 static int
61 net__route_v4_add(const char *dst_str, int prefixlen, int metric)
62 {
63  in_addr_t dst;
64  int ret;
65 
66  if (!dst_str)
67  {
68  return -1;
69  }
70 
71  ret = inet_pton(AF_INET, dst_str, &dst);
72  if (ret != 1)
73  {
74  return -1;
75  }
76 
77  dst = ntohl(dst);
78 
79  printf("CMD: ip route add %s/%d dev %s", dst_str, prefixlen, iface);
80  if (metric > 0)
81  {
82  printf(" metric %d", metric);
83  }
84  printf("\n");
85 
86  return net_route_v4_add(NULL, &dst, prefixlen, NULL, iface, 0, metric);
87 
88 }
89 
90 static int
91 net__route_v4_add_gw(const char *dst_str, int prefixlen, const char *gw_str,
92  int metric)
93 {
94  in_addr_t dst, gw;
95  int ret;
96 
97  if (!dst_str || !gw_str)
98  {
99  return -1;
100  }
101 
102  ret = inet_pton(AF_INET, dst_str, &dst);
103  if (ret != 1)
104  {
105  return -1;
106  }
107 
108  ret = inet_pton(AF_INET, gw_str, &gw);
109  if (ret != 1)
110  {
111  return -1;
112  }
113 
114  dst = ntohl(dst);
115  gw = ntohl(gw);
116 
117  printf("CMD: ip route add %s/%d dev %s via %s", dst_str, prefixlen, iface,
118  gw_str);
119  if (metric > 0)
120  {
121  printf(" metric %d", metric);
122  }
123  printf("\n");
124 
125  return net_route_v4_add(NULL, &dst, prefixlen, &gw, iface, 0, metric);
126 }
127 
128 static int
129 net__route_v6_add(const char *dst_str, int prefixlen, int metric)
130 {
131  struct in6_addr dst;
132  int ret;
133 
134  if (!dst_str)
135  {
136  return -1;
137  }
138 
139  ret = inet_pton(AF_INET6, dst_str, &dst);
140  if (ret != 1)
141  {
142  return -1;
143  }
144 
145  printf("CMD: ip -6 route add %s/%d dev %s", dst_str, prefixlen, iface);
146  if (metric > 0)
147  {
148  printf(" metric %d", metric);
149  }
150  printf("\n");
151 
152  return net_route_v6_add(NULL, &dst, prefixlen, NULL, iface, 0, metric);
153 
154 }
155 
156 static int
157 net__route_v6_add_gw(const char *dst_str, int prefixlen, const char *gw_str,
158  int metric)
159 {
160  struct in6_addr dst, gw;
161  int ret;
162 
163  if (!dst_str || !gw_str)
164  {
165  return -1;
166  }
167 
168  ret = inet_pton(AF_INET6, dst_str, &dst);
169  if (ret != 1)
170  {
171  return -1;
172  }
173 
174  ret = inet_pton(AF_INET6, gw_str, &gw);
175  if (ret != 1)
176  {
177  return -1;
178  }
179 
180  printf("CMD: ip -6 route add %s/%d dev %s via %s", dst_str, prefixlen,
181  iface, gw_str);
182  if (metric > 0)
183  {
184  printf(" metric %d", metric);
185  }
186  printf("\n");
187 
188  return net_route_v6_add(NULL, &dst, prefixlen, &gw, iface, 0, metric);
189 }
190 
191 static void
192 usage(char *name)
193 {
194  printf("Usage: %s <0-7>\n", name);
195 }
196 
197 int
198 main(int argc, char *argv[])
199 {
200  int test;
201 
202  if (argc < 2)
203  {
204  usage(argv[0]);
205  return -1;
206  }
207 
208  /* the t_net script can use this command to perform a dry-run test */
209  if (strcmp(argv[1], "test") == 0)
210  {
211  return 0;
212  }
213 
214  if (argc > 3)
215  {
216  iface = argv[2];
217  }
218 
219  test = atoi(argv[1]);
220  switch (test)
221  {
222  case 0:
223  return net__iface_up(true);
224 
225  case 1:
226  return net__iface_mtu_set(1281);
227 
228  case 2:
229  return net__addr_v4_add("10.255.255.1", 24);
230 
231  case 3:
232  return net__addr_v6_add("2001::1", 64);
233 
234  case 4:
235  return net__route_v4_add("11.11.11.0", 24, 0);
236 
237  case 5:
238  return net__route_v4_add_gw("11.11.12.0", 24, "10.255.255.2", 0);
239 
240  case 6:
241  return net__route_v6_add("2001:babe:cafe:babe::", 64, 600);
242 
243  case 7:
244  return net__route_v6_add_gw("2001:cafe:babe::", 48, "2001::2", 600);
245 
246  default:
247  printf("invalid test: %d\n", test);
248  break;
249  }
250 
251  usage(argv[0]);
252  return -1;
253 }
int main(int argc, char *argv[])
static int net__route_v4_add(const char *dst_str, int prefixlen, int metric)
static char * iface
#define in_addr_t
Definition: config-msvc.h:103
static int net__addr_v4_add(const char *addr_str, int prefixlen)
static int net__route_v4_add_gw(const char *dst_str, int prefixlen, const char *gw_str, int metric)
static int net__route_v6_add(const char *dst_str, int prefixlen, int metric)
static int net__iface_mtu_set(int mtu)
static int net__route_v6_add_gw(const char *dst_str, int prefixlen, const char *gw_str, int metric)
static void usage(char *name)
static int net__addr_v6_add(const char *addr_str, int prefixlen)
static int net__iface_up(bool up)
Definition: argv.h:35