- dp_ifindex = -1;
- port_no = UINT32_MAX;
- if (!shash_is_empty(args)) {
- /* Parse the provided configuration. */
- options = ofpbuf_new(64);
- error = vport_class->parse_config(name, netdev_class->type,
- args, options);
- } else {
- /* Fetch an existing configuration from the kernel.
- *
- * This case could be ambiguous with initializing a new vport with an
- * empty configuration, but none of the existing vport classes accept
- * an empty configuration. */
- struct dpif_linux_vport reply;
- struct ofpbuf *buf;
-
- error = dpif_linux_vport_get(name, &reply, &buf);
- if (!error) {
- /* XXX verify correct type */
- error = vport_class->unparse_config(name, netdev_class->type,
- reply.options,
- reply.options_len,
- &fetched_args);
- if (error) {
- VLOG_ERR_RL(&rl, "%s: failed to parse kernel config (%s)",
- name, strerror(error));
- } else {
- options = ofpbuf_clone_data(reply.options, reply.options_len);
- dp_ifindex = reply.dp_ifindex;
- port_no = reply.port_no;
- }
- ofpbuf_delete(buf);
- } else {
- VLOG_ERR_RL(&rl, "%s: vport query failed (%s)",
- name, strerror(error));
- }
- }
-
- if (!error) {
- struct netdev_dev_vport *dev;
-
- dev = xmalloc(sizeof *dev);
- netdev_dev_init(&dev->netdev_dev, name,
- shash_is_empty(&fetched_args) ? args : &fetched_args,
- netdev_class);
- dev->options = options;
- dev->dp_ifindex = dp_ifindex;
- dev->port_no = port_no;
- dev->change_seq = 1;
-
- *netdev_devp = &dev->netdev_dev;
- route_table_register();
- } else {
- ofpbuf_delete(options);
- }