summary refs log blame commit diff
path: root/tests/plugin_net_config.c
blob: c064c537a807689a33b239ed1844c3092514b7f7 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14













                                                                         
                   






































































                                                                               
/*
 * Copyright 2018 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include <arpa/inet.h>
#include <linux/if_tun.h>
#include <sys/ioctl.h>

#include <errno.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include "crosvm.h"

/*
 * These must match the network arguments supplied to the plugin in plugins.rs.
 * IPv4 addresses here are in host-native byte order.
 */
const uint32_t expected_ip = 0x64735c05; // 100.115.92.5
const uint32_t expected_netmask = 0xfffffffc; // 255.255.255.252
const uint8_t expected_mac[] = {0xde, 0x21, 0xe8, 0x47, 0x6b, 0x6a};

int main(int argc, char** argv) {
    struct crosvm *crosvm;
    struct crosvm_net_config net_config;
    int ret = crosvm_connect(&crosvm);

    if (ret) {
        fprintf(stderr, "failed to connect to crosvm: %d\n", ret);
        return 1;
    }

    ret = crosvm_net_get_config(crosvm, &net_config);
    if (ret) {
        fprintf(stderr, "failed to get crosvm net config: %d\n", ret);
        return 1;
    }

    if (net_config.tap_fd < 0) {
        fprintf(stderr, "fd %d is < 0\n", net_config.tap_fd);
        return 1;
    }

    unsigned int features;
    if (ioctl(net_config.tap_fd, TUNGETFEATURES, &features) < 0) {
        fprintf(stderr,
                "failed to read tap features: %s\n",
                strerror(errno));
        return 1;
    }

    if (net_config.host_ip != htonl(expected_ip)) {
        char ip_addr[INET_ADDRSTRLEN];
        inet_ntop(AF_INET, &net_config.host_ip, ip_addr, sizeof(ip_addr));
        fprintf(stderr, "ip %s != 100.115.92.5\n", ip_addr);
        return 1;
    }

    if (net_config.netmask != htonl(expected_netmask)) {
        char netmask[INET_ADDRSTRLEN];
        inet_ntop(AF_INET, &net_config.netmask, netmask, sizeof(netmask));
        fprintf(stderr, "netmask %s != 255.255.255.252\n", netmask);
        return 1;
    }

    if (memcmp(net_config.host_mac_address,
               expected_mac,
               sizeof(expected_mac)) != 0) {
        fprintf(stderr,
                "mac %02X:%02X:%02X:%02X:%02X:%02X != de:21:e8:47:6b:6a\n",
                net_config.host_mac_address[0],
                net_config.host_mac_address[1],
                net_config.host_mac_address[2],
                net_config.host_mac_address[3],
                net_config.host_mac_address[4],
                net_config.host_mac_address[5]);
        return 1;
    }

    return 0;
}