- const char *name = netdev_dev_get_name(netdev_dev);
- struct odp_vport_mod ovm;
- int err;
-
- ovs_strlcpy(ovm.devname, name, sizeof ovm.devname);
- err = netdev_vport_parse_config(netdev_dev_get_class(netdev_dev), name,
- args, &ovm.config);
- if (err) {
- return err;
+ const struct netdev_class *netdev_class = netdev_dev_get_class(dev_);
+ const struct vport_class *vport_class = vport_class_cast(netdev_class);
+ struct netdev_dev_vport *dev = netdev_dev_vport_cast(dev_);
+ struct odp_port port;
+ int error;
+
+ memset(&port, 0, sizeof port);
+ strncpy(port.devname, netdev_dev_get_name(dev_), sizeof port.devname);
+ strncpy(port.type, netdev_dev_get_type(dev_), sizeof port.type);
+ error = vport_class->parse_config(dev_, args, port.config);
+ if (!error && memcmp(port.config, dev->config, sizeof dev->config)) {
+ error = netdev_vport_do_ioctl(ODP_VPORT_MOD, &port);
+ if (!error || error == ENODEV) {
+ /* Either reconfiguration succeeded or this vport is not installed
+ * in the kernel (e.g. it hasn't been added to a dpif yet with
+ * dpif_port_add()). */
+ memcpy(dev->config, port.config, sizeof dev->config);
+ }