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");
|
||||
|
||||
ret = net_client_init_from_opts(mon, opts);
|
||||
ret = net_client_init(mon, opts);
|
||||
if (ret < 0)
|
||||
return NULL;
|
||||
if (nd_table[ret].devaddr) {
|
||||
|
116
net.c
116
net.c
@ -3001,7 +3001,7 @@ static struct {
|
||||
{ /* end of list */ }
|
||||
};
|
||||
|
||||
int net_client_init_from_opts(Monitor *mon, QemuOpts *opts)
|
||||
int net_client_init(Monitor *mon, QemuOpts *opts)
|
||||
{
|
||||
const char *type;
|
||||
int i;
|
||||
@ -3030,41 +3030,6 @@ int net_client_init_from_opts(Monitor *mon, QemuOpts *opts)
|
||||
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)
|
||||
{
|
||||
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);
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
@ -3140,26 +3105,6 @@ void net_host_device_remove(Monitor *mon, const QDict *qdict)
|
||||
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)
|
||||
{
|
||||
int i;
|
||||
@ -3240,7 +3185,7 @@ void net_cleanup(void)
|
||||
}
|
||||
}
|
||||
|
||||
void net_client_check(void)
|
||||
static void net_check_clients(void)
|
||||
{
|
||||
VLANState *vlan;
|
||||
|
||||
@ -3255,3 +3200,58 @@ void net_client_check(void)
|
||||
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_bootp_filename;
|
||||
|
||||
int net_client_init(Monitor *mon, const char *device, const char *p);
|
||||
int net_client_init_from_opts(Monitor *mon, QemuOpts *opts);
|
||||
int net_client_init(Monitor *mon, QemuOpts *opts);
|
||||
void net_client_uninit(NICInfo *nd);
|
||||
int net_client_parse(const char *str);
|
||||
int net_init_clients(void);
|
||||
int net_slirp_smb(const char *exported_dir);
|
||||
void net_slirp_hostfwd_add(Monitor *mon, const QDict *qdict);
|
||||
void net_slirp_hostfwd_remove(Monitor *mon, const QDict *qdict);
|
||||
int net_slirp_redir(const char *redir_str);
|
||||
void net_cleanup(void);
|
||||
void net_client_check(void);
|
||||
void net_set_boot_mask(int boot_mask);
|
||||
void net_host_device_add(Monitor *mon, const QDict *qdict);
|
||||
void net_host_device_remove(Monitor *mon, const QDict *qdict);
|
||||
|
28
vl.c
28
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, "model", "usb");
|
||||
|
||||
idx = net_client_init_from_opts(NULL, opts);
|
||||
idx = net_client_init(NULL, opts);
|
||||
if (idx == -1) {
|
||||
return -1;
|
||||
}
|
||||
@ -4538,8 +4538,6 @@ int qemu_uuid_parse(const char *str, uint8_t *uuid)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define MAX_NET_CLIENTS 32
|
||||
|
||||
#ifndef _WIN32
|
||||
|
||||
static void termsig_handler(int signal)
|
||||
@ -4743,8 +4741,6 @@ int main(int argc, char **argv, char **envp)
|
||||
DisplayState *ds;
|
||||
DisplayChangeListener *dcl;
|
||||
int cyls, heads, secs, translation;
|
||||
const char *net_clients[MAX_NET_CLIENTS];
|
||||
int nb_net_clients;
|
||||
QemuOpts *hda_opts = NULL, *opts;
|
||||
int optind;
|
||||
const char *r, *optarg;
|
||||
@ -4847,7 +4843,6 @@ int main(int argc, char **argv, char **envp)
|
||||
node_cpumask[i] = 0;
|
||||
}
|
||||
|
||||
nb_net_clients = 0;
|
||||
nb_numa_nodes = 0;
|
||||
nb_nics = 0;
|
||||
|
||||
@ -5093,12 +5088,9 @@ int main(int argc, char **argv, char **envp)
|
||||
break;
|
||||
#endif
|
||||
case QEMU_OPTION_net:
|
||||
if (nb_net_clients >= MAX_NET_CLIENTS) {
|
||||
fprintf(stderr, "qemu: too many network clients\n");
|
||||
if (net_client_parse(optarg) == -1) {
|
||||
exit(1);
|
||||
}
|
||||
net_clients[nb_net_clients] = optarg;
|
||||
nb_net_clients++;
|
||||
break;
|
||||
#ifdef CONFIG_SLIRP
|
||||
case QEMU_OPTION_tftp:
|
||||
@ -5661,25 +5653,13 @@ int main(int argc, char **argv, char **envp)
|
||||
socket_init();
|
||||
#endif
|
||||
|
||||
/* init network clients */
|
||||
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);
|
||||
if (net_init_clients() < 0) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
net_boot = (boot_devices_bitmap >> ('n' - 'a')) & 0xF;
|
||||
net_set_boot_mask(net_boot);
|
||||
|
||||
net_client_check();
|
||||
|
||||
/* init the bluetooth world */
|
||||
if (foreach_device_config(DEV_BT, bt_parse))
|
||||
exit(1);
|
||||
|
Loading…
Reference in New Issue
Block a user