mirror of
https://git.proxmox.com/git/qemu
synced 2025-08-08 02:06:42 +00:00
Final net cleanup after conversion to QemuOpts
Now that net_client_init() has no users, kill it off and rename net_client_init_from_opts(). There is no further need for the old code in net_client_parse() either. We use qemu_opts_parse() 'firstname' facitity for that. Instead, move the special handling of the 'vmchannel' type there. Simplify the vl.c code into merely call net_client_parse() for each -net command line option and then calling net_init_clients() later to iterate over the options and create the clients. Signed-off-by: Mark McLoughlin <markmc@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
c59c7ea947
commit
dc1c9fe8b7
@ -51,7 +51,7 @@ static PCIDevice *qemu_pci_hot_add_nic(Monitor *mon,
|
|||||||
|
|
||||||
qemu_opt_set(opts, "type", "nic");
|
qemu_opt_set(opts, "type", "nic");
|
||||||
|
|
||||||
ret = net_client_init_from_opts(mon, opts);
|
ret = net_client_init(mon, opts);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (nd_table[ret].devaddr) {
|
if (nd_table[ret].devaddr) {
|
||||||
|
116
net.c
116
net.c
@ -3001,7 +3001,7 @@ static struct {
|
|||||||
{ /* end of list */ }
|
{ /* end of list */ }
|
||||||
};
|
};
|
||||||
|
|
||||||
int net_client_init_from_opts(Monitor *mon, QemuOpts *opts)
|
int net_client_init(Monitor *mon, QemuOpts *opts)
|
||||||
{
|
{
|
||||||
const char *type;
|
const char *type;
|
||||||
int i;
|
int i;
|
||||||
@ -3030,41 +3030,6 @@ int net_client_init_from_opts(Monitor *mon, QemuOpts *opts)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int net_client_init(Monitor *mon, const char *device, const char *p)
|
|
||||||
{
|
|
||||||
QemuOpts *opts;
|
|
||||||
|
|
||||||
#ifdef CONFIG_SLIRP
|
|
||||||
if (!strcmp(device, "channel")) {
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (QTAILQ_EMPTY(&slirp_stacks)) {
|
|
||||||
struct slirp_config_str *config;
|
|
||||||
|
|
||||||
config = qemu_malloc(sizeof(*config));
|
|
||||||
pstrcpy(config->str, sizeof(config->str), p);
|
|
||||||
config->flags = SLIRP_CFG_LEGACY;
|
|
||||||
config->next = slirp_configs;
|
|
||||||
slirp_configs = config;
|
|
||||||
ret = 0;
|
|
||||||
} else {
|
|
||||||
ret = slirp_guestfwd(QTAILQ_FIRST(&slirp_stacks), p, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
opts = qemu_opts_parse(&qemu_net_opts, p, NULL);
|
|
||||||
if (!opts) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
qemu_opt_set(opts, "type", device);
|
|
||||||
|
|
||||||
return net_client_init_from_opts(mon, opts);
|
|
||||||
}
|
|
||||||
|
|
||||||
void net_client_uninit(NICInfo *nd)
|
void net_client_uninit(NICInfo *nd)
|
||||||
{
|
{
|
||||||
nd->vlan->nb_guest_devs--;
|
nd->vlan->nb_guest_devs--;
|
||||||
@ -3118,7 +3083,7 @@ void net_host_device_add(Monitor *mon, const QDict *qdict)
|
|||||||
|
|
||||||
qemu_opt_set(opts, "type", device);
|
qemu_opt_set(opts, "type", device);
|
||||||
|
|
||||||
if (net_client_init_from_opts(mon, opts) < 0) {
|
if (net_client_init(mon, opts) < 0) {
|
||||||
monitor_printf(mon, "adding host network device %s failed\n", device);
|
monitor_printf(mon, "adding host network device %s failed\n", device);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3140,26 +3105,6 @@ void net_host_device_remove(Monitor *mon, const QDict *qdict)
|
|||||||
qemu_del_vlan_client(vc);
|
qemu_del_vlan_client(vc);
|
||||||
}
|
}
|
||||||
|
|
||||||
int net_client_parse(const char *str)
|
|
||||||
{
|
|
||||||
const char *p;
|
|
||||||
char *q;
|
|
||||||
char device[64];
|
|
||||||
|
|
||||||
p = str;
|
|
||||||
q = device;
|
|
||||||
while (*p != '\0' && *p != ',') {
|
|
||||||
if ((q - device) < sizeof(device) - 1)
|
|
||||||
*q++ = *p;
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
*q = '\0';
|
|
||||||
if (*p == ',')
|
|
||||||
p++;
|
|
||||||
|
|
||||||
return net_client_init(NULL, device, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
void net_set_boot_mask(int net_boot_mask)
|
void net_set_boot_mask(int net_boot_mask)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -3240,7 +3185,7 @@ void net_cleanup(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void net_client_check(void)
|
static void net_check_clients(void)
|
||||||
{
|
{
|
||||||
VLANState *vlan;
|
VLANState *vlan;
|
||||||
|
|
||||||
@ -3255,3 +3200,58 @@ void net_client_check(void)
|
|||||||
vlan->id);
|
vlan->id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int net_init_client(QemuOpts *opts, void *dummy)
|
||||||
|
{
|
||||||
|
return net_client_init(NULL, opts);
|
||||||
|
}
|
||||||
|
|
||||||
|
int net_init_clients(void)
|
||||||
|
{
|
||||||
|
if (QTAILQ_EMPTY(&qemu_net_opts.head)) {
|
||||||
|
/* if no clients, we use a default config */
|
||||||
|
qemu_opts_set(&qemu_net_opts, NULL, "type", "nic");
|
||||||
|
#ifdef CONFIG_SLIRP
|
||||||
|
qemu_opts_set(&qemu_net_opts, NULL, "type", "user");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qemu_opts_foreach(&qemu_net_opts, net_init_client, NULL, 1) == -1) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
net_check_clients();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int net_client_parse(const char *optarg)
|
||||||
|
{
|
||||||
|
/* handle legacy -net channel,port:chr */
|
||||||
|
if (!strncmp(optarg, "channel,", strlen("channel,"))) {
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
optarg += strlen("channel,");
|
||||||
|
|
||||||
|
if (QTAILQ_EMPTY(&slirp_stacks)) {
|
||||||
|
struct slirp_config_str *config;
|
||||||
|
|
||||||
|
config = qemu_malloc(sizeof(*config));
|
||||||
|
pstrcpy(config->str, sizeof(config->str), optarg);
|
||||||
|
config->flags = SLIRP_CFG_LEGACY;
|
||||||
|
config->next = slirp_configs;
|
||||||
|
slirp_configs = config;
|
||||||
|
ret = 0;
|
||||||
|
} else {
|
||||||
|
ret = slirp_guestfwd(QTAILQ_FIRST(&slirp_stacks), optarg, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!qemu_opts_parse(&qemu_net_opts, optarg, "type")) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
5
net.h
5
net.h
@ -136,16 +136,15 @@ void net_checksum_calculate(uint8_t *data, int length);
|
|||||||
extern const char *legacy_tftp_prefix;
|
extern const char *legacy_tftp_prefix;
|
||||||
extern const char *legacy_bootp_filename;
|
extern const char *legacy_bootp_filename;
|
||||||
|
|
||||||
int net_client_init(Monitor *mon, const char *device, const char *p);
|
int net_client_init(Monitor *mon, QemuOpts *opts);
|
||||||
int net_client_init_from_opts(Monitor *mon, QemuOpts *opts);
|
|
||||||
void net_client_uninit(NICInfo *nd);
|
void net_client_uninit(NICInfo *nd);
|
||||||
int net_client_parse(const char *str);
|
int net_client_parse(const char *str);
|
||||||
|
int net_init_clients(void);
|
||||||
int net_slirp_smb(const char *exported_dir);
|
int net_slirp_smb(const char *exported_dir);
|
||||||
void net_slirp_hostfwd_add(Monitor *mon, const QDict *qdict);
|
void net_slirp_hostfwd_add(Monitor *mon, const QDict *qdict);
|
||||||
void net_slirp_hostfwd_remove(Monitor *mon, const QDict *qdict);
|
void net_slirp_hostfwd_remove(Monitor *mon, const QDict *qdict);
|
||||||
int net_slirp_redir(const char *redir_str);
|
int net_slirp_redir(const char *redir_str);
|
||||||
void net_cleanup(void);
|
void net_cleanup(void);
|
||||||
void net_client_check(void);
|
|
||||||
void net_set_boot_mask(int boot_mask);
|
void net_set_boot_mask(int boot_mask);
|
||||||
void net_host_device_add(Monitor *mon, const QDict *qdict);
|
void net_host_device_add(Monitor *mon, const QDict *qdict);
|
||||||
void net_host_device_remove(Monitor *mon, const QDict *qdict);
|
void net_host_device_remove(Monitor *mon, const QDict *qdict);
|
||||||
|
26
vl.c
26
vl.c
@ -2606,7 +2606,7 @@ static int usb_device_add(const char *devname, int is_hotplug)
|
|||||||
qemu_opt_set(opts, "type", "nic");
|
qemu_opt_set(opts, "type", "nic");
|
||||||
qemu_opt_set(opts, "model", "usb");
|
qemu_opt_set(opts, "model", "usb");
|
||||||
|
|
||||||
idx = net_client_init_from_opts(NULL, opts);
|
idx = net_client_init(NULL, opts);
|
||||||
if (idx == -1) {
|
if (idx == -1) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -4538,8 +4538,6 @@ int qemu_uuid_parse(const char *str, uint8_t *uuid)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MAX_NET_CLIENTS 32
|
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
|
|
||||||
static void termsig_handler(int signal)
|
static void termsig_handler(int signal)
|
||||||
@ -4743,8 +4741,6 @@ int main(int argc, char **argv, char **envp)
|
|||||||
DisplayState *ds;
|
DisplayState *ds;
|
||||||
DisplayChangeListener *dcl;
|
DisplayChangeListener *dcl;
|
||||||
int cyls, heads, secs, translation;
|
int cyls, heads, secs, translation;
|
||||||
const char *net_clients[MAX_NET_CLIENTS];
|
|
||||||
int nb_net_clients;
|
|
||||||
QemuOpts *hda_opts = NULL, *opts;
|
QemuOpts *hda_opts = NULL, *opts;
|
||||||
int optind;
|
int optind;
|
||||||
const char *r, *optarg;
|
const char *r, *optarg;
|
||||||
@ -4847,7 +4843,6 @@ int main(int argc, char **argv, char **envp)
|
|||||||
node_cpumask[i] = 0;
|
node_cpumask[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
nb_net_clients = 0;
|
|
||||||
nb_numa_nodes = 0;
|
nb_numa_nodes = 0;
|
||||||
nb_nics = 0;
|
nb_nics = 0;
|
||||||
|
|
||||||
@ -5093,12 +5088,9 @@ int main(int argc, char **argv, char **envp)
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case QEMU_OPTION_net:
|
case QEMU_OPTION_net:
|
||||||
if (nb_net_clients >= MAX_NET_CLIENTS) {
|
if (net_client_parse(optarg) == -1) {
|
||||||
fprintf(stderr, "qemu: too many network clients\n");
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
net_clients[nb_net_clients] = optarg;
|
|
||||||
nb_net_clients++;
|
|
||||||
break;
|
break;
|
||||||
#ifdef CONFIG_SLIRP
|
#ifdef CONFIG_SLIRP
|
||||||
case QEMU_OPTION_tftp:
|
case QEMU_OPTION_tftp:
|
||||||
@ -5661,25 +5653,13 @@ int main(int argc, char **argv, char **envp)
|
|||||||
socket_init();
|
socket_init();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* init network clients */
|
if (net_init_clients() < 0) {
|
||||||
if (nb_net_clients == 0) {
|
|
||||||
/* if no clients, we use a default config */
|
|
||||||
net_clients[nb_net_clients++] = "nic";
|
|
||||||
#ifdef CONFIG_SLIRP
|
|
||||||
net_clients[nb_net_clients++] = "user";
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
for(i = 0;i < nb_net_clients; i++) {
|
|
||||||
if (net_client_parse(net_clients[i]) < 0)
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
net_boot = (boot_devices_bitmap >> ('n' - 'a')) & 0xF;
|
net_boot = (boot_devices_bitmap >> ('n' - 'a')) & 0xF;
|
||||||
net_set_boot_mask(net_boot);
|
net_set_boot_mask(net_boot);
|
||||||
|
|
||||||
net_client_check();
|
|
||||||
|
|
||||||
/* init the bluetooth world */
|
/* init the bluetooth world */
|
||||||
if (foreach_device_config(DEV_BT, bt_parse))
|
if (foreach_device_config(DEV_BT, bt_parse))
|
||||||
exit(1);
|
exit(1);
|
||||||
|
Loading…
Reference in New Issue
Block a user