2022-11-08 17:23:04 +08:00
|
|
|
/*
|
|
|
|
* virt-host-validate-bhyve.c: Sanity check a bhyve hypervisor host
|
|
|
|
*
|
|
|
|
* Copyright (C) 2017 Roman Bogorodskiy
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library. If not, see
|
|
|
|
* <http://www.gnu.org/licenses/>.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
|
|
|
|
#include <sys/param.h>
|
|
|
|
#include <sys/linker.h>
|
|
|
|
|
|
|
|
#include "virt-host-validate-bhyve.h"
|
|
|
|
#include "virt-host-validate-common.h"
|
|
|
|
|
|
|
|
#define MODULE_STATUS(mod, err_msg, err_code) \
|
2024-05-17 12:43:23 +08:00
|
|
|
virHostMsgCheck("BHYVE", _("for %1$s module"), #mod); \
|
2022-11-08 17:23:04 +08:00
|
|
|
if (mod ## _loaded) { \
|
|
|
|
virHostMsgPass(); \
|
|
|
|
} else { \
|
|
|
|
virHostMsgFail(err_code, \
|
2024-05-17 12:43:23 +08:00
|
|
|
_("%1$s module is not loaded, " err_msg), \
|
2022-11-08 17:23:04 +08:00
|
|
|
#mod); \
|
|
|
|
ret = -1; \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define MODULE_STATUS_FAIL(mod, err_msg) \
|
|
|
|
MODULE_STATUS(mod, err_msg, VIR_HOST_VALIDATE_FAIL)
|
|
|
|
|
|
|
|
#define MODULE_STATUS_WARN(mod, err_msg) \
|
|
|
|
MODULE_STATUS(mod, err_msg, VIR_HOST_VALIDATE_WARN)
|
|
|
|
|
|
|
|
|
|
|
|
int virHostValidateBhyve(void)
|
|
|
|
{
|
|
|
|
int ret = 0;
|
|
|
|
int fileid = 0;
|
2024-05-17 12:43:23 +08:00
|
|
|
g_autofree struct kld_file_stat *stat = g_new0(struct kld_file_stat, 1);
|
|
|
|
bool vmm_loaded = false;
|
|
|
|
bool if_tap_loaded = false;
|
|
|
|
bool if_bridge_loaded = false;
|
|
|
|
bool nmdm_loaded = false;
|
2022-11-08 17:23:04 +08:00
|
|
|
|
|
|
|
for (fileid = kldnext(0); fileid > 0; fileid = kldnext(fileid)) {
|
2024-05-17 12:43:23 +08:00
|
|
|
stat->version = sizeof(struct kld_file_stat);
|
|
|
|
if (kldstat(fileid, stat) < 0)
|
2022-11-08 17:23:04 +08:00
|
|
|
continue;
|
|
|
|
|
2024-05-17 12:43:23 +08:00
|
|
|
if (STREQ(stat->name, "vmm.ko"))
|
2022-11-08 17:23:04 +08:00
|
|
|
vmm_loaded = true;
|
2024-05-17 12:43:23 +08:00
|
|
|
else if (STREQ(stat->name, "if_tap.ko"))
|
2022-11-08 17:23:04 +08:00
|
|
|
if_tap_loaded = true;
|
2024-05-17 12:43:23 +08:00
|
|
|
else if (STREQ(stat->name, "if_bridge.ko"))
|
2022-11-08 17:23:04 +08:00
|
|
|
if_bridge_loaded = true;
|
2024-05-17 12:43:23 +08:00
|
|
|
else if (STREQ(stat->name, "nmdm.ko"))
|
2022-11-08 17:23:04 +08:00
|
|
|
nmdm_loaded = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
MODULE_STATUS_FAIL(vmm, "will not be able to start VMs");
|
|
|
|
MODULE_STATUS_WARN(if_tap, "networking will not work");
|
|
|
|
MODULE_STATUS_WARN(if_bridge, "bridged networking will not work");
|
|
|
|
MODULE_STATUS_WARN(nmdm, "nmdm console will not work");
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|