1*bb4ee6a4SAndroid Build Coastguard Worker /*
2*bb4ee6a4SAndroid Build Coastguard Worker * Copyright 2018 The ChromiumOS Authors
3*bb4ee6a4SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
4*bb4ee6a4SAndroid Build Coastguard Worker * found in the LICENSE file.
5*bb4ee6a4SAndroid Build Coastguard Worker */
6*bb4ee6a4SAndroid Build Coastguard Worker
7*bb4ee6a4SAndroid Build Coastguard Worker #include <arpa/inet.h>
8*bb4ee6a4SAndroid Build Coastguard Worker #include <linux/if_tun.h>
9*bb4ee6a4SAndroid Build Coastguard Worker #include <sys/ioctl.h>
10*bb4ee6a4SAndroid Build Coastguard Worker
11*bb4ee6a4SAndroid Build Coastguard Worker #include <errno.h>
12*bb4ee6a4SAndroid Build Coastguard Worker #include <stdint.h>
13*bb4ee6a4SAndroid Build Coastguard Worker #include <stdio.h>
14*bb4ee6a4SAndroid Build Coastguard Worker #include <stdlib.h>
15*bb4ee6a4SAndroid Build Coastguard Worker #include <string.h>
16*bb4ee6a4SAndroid Build Coastguard Worker #include <unistd.h>
17*bb4ee6a4SAndroid Build Coastguard Worker
18*bb4ee6a4SAndroid Build Coastguard Worker #include "crosvm.h"
19*bb4ee6a4SAndroid Build Coastguard Worker
20*bb4ee6a4SAndroid Build Coastguard Worker /*
21*bb4ee6a4SAndroid Build Coastguard Worker * These must match the network arguments supplied to the plugin in plugins.rs.
22*bb4ee6a4SAndroid Build Coastguard Worker * IPv4 addresses here are in host-native byte order.
23*bb4ee6a4SAndroid Build Coastguard Worker */
24*bb4ee6a4SAndroid Build Coastguard Worker const uint32_t expected_ip = 0x64735c05; // 100.115.92.5
25*bb4ee6a4SAndroid Build Coastguard Worker const uint32_t expected_netmask = 0xfffffffc; // 255.255.255.252
26*bb4ee6a4SAndroid Build Coastguard Worker const uint8_t expected_mac[] = {0xde, 0x21, 0xe8, 0x47, 0x6b, 0x6a};
27*bb4ee6a4SAndroid Build Coastguard Worker
main(int argc,char ** argv)28*bb4ee6a4SAndroid Build Coastguard Worker int main(int argc, char** argv) {
29*bb4ee6a4SAndroid Build Coastguard Worker struct crosvm *crosvm;
30*bb4ee6a4SAndroid Build Coastguard Worker struct crosvm_net_config net_config;
31*bb4ee6a4SAndroid Build Coastguard Worker int ret = crosvm_connect(&crosvm);
32*bb4ee6a4SAndroid Build Coastguard Worker
33*bb4ee6a4SAndroid Build Coastguard Worker if (ret) {
34*bb4ee6a4SAndroid Build Coastguard Worker fprintf(stderr, "failed to connect to crosvm: %d\n", ret);
35*bb4ee6a4SAndroid Build Coastguard Worker return 1;
36*bb4ee6a4SAndroid Build Coastguard Worker }
37*bb4ee6a4SAndroid Build Coastguard Worker
38*bb4ee6a4SAndroid Build Coastguard Worker ret = crosvm_net_get_config(crosvm, &net_config);
39*bb4ee6a4SAndroid Build Coastguard Worker if (ret) {
40*bb4ee6a4SAndroid Build Coastguard Worker fprintf(stderr, "failed to get crosvm net config: %d\n", ret);
41*bb4ee6a4SAndroid Build Coastguard Worker return 1;
42*bb4ee6a4SAndroid Build Coastguard Worker }
43*bb4ee6a4SAndroid Build Coastguard Worker
44*bb4ee6a4SAndroid Build Coastguard Worker if (net_config.tap_fd < 0) {
45*bb4ee6a4SAndroid Build Coastguard Worker fprintf(stderr, "fd %d is < 0\n", net_config.tap_fd);
46*bb4ee6a4SAndroid Build Coastguard Worker return 1;
47*bb4ee6a4SAndroid Build Coastguard Worker }
48*bb4ee6a4SAndroid Build Coastguard Worker
49*bb4ee6a4SAndroid Build Coastguard Worker unsigned int features;
50*bb4ee6a4SAndroid Build Coastguard Worker if (ioctl(net_config.tap_fd, TUNGETFEATURES, &features) < 0) {
51*bb4ee6a4SAndroid Build Coastguard Worker fprintf(stderr,
52*bb4ee6a4SAndroid Build Coastguard Worker "failed to read tap(fd: %d) features: %s\n",
53*bb4ee6a4SAndroid Build Coastguard Worker net_config.tap_fd,
54*bb4ee6a4SAndroid Build Coastguard Worker strerror(errno));
55*bb4ee6a4SAndroid Build Coastguard Worker return 1;
56*bb4ee6a4SAndroid Build Coastguard Worker }
57*bb4ee6a4SAndroid Build Coastguard Worker
58*bb4ee6a4SAndroid Build Coastguard Worker if (net_config.host_ip != htonl(expected_ip)) {
59*bb4ee6a4SAndroid Build Coastguard Worker char ip_addr[INET_ADDRSTRLEN];
60*bb4ee6a4SAndroid Build Coastguard Worker inet_ntop(AF_INET, &net_config.host_ip, ip_addr, sizeof(ip_addr));
61*bb4ee6a4SAndroid Build Coastguard Worker fprintf(stderr, "ip %s != 100.115.92.5\n", ip_addr);
62*bb4ee6a4SAndroid Build Coastguard Worker return 1;
63*bb4ee6a4SAndroid Build Coastguard Worker }
64*bb4ee6a4SAndroid Build Coastguard Worker
65*bb4ee6a4SAndroid Build Coastguard Worker if (net_config.netmask != htonl(expected_netmask)) {
66*bb4ee6a4SAndroid Build Coastguard Worker char netmask[INET_ADDRSTRLEN];
67*bb4ee6a4SAndroid Build Coastguard Worker inet_ntop(AF_INET, &net_config.netmask, netmask, sizeof(netmask));
68*bb4ee6a4SAndroid Build Coastguard Worker fprintf(stderr, "netmask %s != 255.255.255.252\n", netmask);
69*bb4ee6a4SAndroid Build Coastguard Worker return 1;
70*bb4ee6a4SAndroid Build Coastguard Worker }
71*bb4ee6a4SAndroid Build Coastguard Worker
72*bb4ee6a4SAndroid Build Coastguard Worker if (memcmp(net_config.host_mac_address,
73*bb4ee6a4SAndroid Build Coastguard Worker expected_mac,
74*bb4ee6a4SAndroid Build Coastguard Worker sizeof(expected_mac)) != 0) {
75*bb4ee6a4SAndroid Build Coastguard Worker fprintf(stderr,
76*bb4ee6a4SAndroid Build Coastguard Worker "mac %02X:%02X:%02X:%02X:%02X:%02X != de:21:e8:47:6b:6a\n",
77*bb4ee6a4SAndroid Build Coastguard Worker net_config.host_mac_address[0],
78*bb4ee6a4SAndroid Build Coastguard Worker net_config.host_mac_address[1],
79*bb4ee6a4SAndroid Build Coastguard Worker net_config.host_mac_address[2],
80*bb4ee6a4SAndroid Build Coastguard Worker net_config.host_mac_address[3],
81*bb4ee6a4SAndroid Build Coastguard Worker net_config.host_mac_address[4],
82*bb4ee6a4SAndroid Build Coastguard Worker net_config.host_mac_address[5]);
83*bb4ee6a4SAndroid Build Coastguard Worker return 1;
84*bb4ee6a4SAndroid Build Coastguard Worker }
85*bb4ee6a4SAndroid Build Coastguard Worker
86*bb4ee6a4SAndroid Build Coastguard Worker return 0;
87*bb4ee6a4SAndroid Build Coastguard Worker }
88