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>
stable-0.12
Mark McLoughlin 2009-10-06 12:17:16 +01:00 committed by Anthony Liguori
parent c59c7ea947
commit dc1c9fe8b7
4 changed files with 65 additions and 86 deletions

View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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);