static struct vport *netdev_create(const struct vport_parms *parms) { struct vport *vport; struct netdev_vport *netdev_vport; int err; vport = vport_alloc(sizeof(struct netdev_vport), &netdev_vport_ops, parms); if (IS_ERR(vport)) { err = PTR_ERR(vport); goto error; } netdev_vport = netdev_vport_priv(vport); netdev_vport->dev = dev_get_by_name(&init_net, parms->name); if (!netdev_vport->dev) { err = -ENODEV; goto error_free_vport; } if (netdev_vport->dev->flags & IFF_LOOPBACK || netdev_vport->dev->type != ARPHRD_ETHER || is_internal_dev(netdev_vport->dev)) { err = -EINVAL; goto error_put; } err = netdev_rx_handler_register(netdev_vport->dev, netdev_frame_hook, vport); if (err) goto error_put; dev_set_promiscuity(netdev_vport->dev, 1); #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) dev_disable_lro(netdev_vport->dev); #endif netdev_vport->dev->priv_flags |= IFF_OVS_DATAPATH; return vport; error_put: dev_put(netdev_vport->dev); error_free_vport: vport_free(vport); error: return ERR_PTR(err); }
static struct vport *netdev_create(const char *name, const void __user *config) { struct vport *vport; struct netdev_vport *netdev_vport; int err; vport = vport_alloc(sizeof(struct netdev_vport), &netdev_vport_ops); if (IS_ERR(vport)) { err = PTR_ERR(vport); goto error; } netdev_vport = netdev_vport_priv(vport); netdev_vport->dev = dev_get_by_name(&init_net, name); if (!netdev_vport->dev) { err = -ENODEV; goto error_free_vport; } if (netdev_vport->dev->flags & IFF_LOOPBACK || netdev_vport->dev->type != ARPHRD_ETHER || is_internal_dev(netdev_vport->dev)) { err = -EINVAL; goto error_put; } /* If we are using the vport stats layer initialize it to the current * values so we are roughly consistent with the device stats. */ if (USE_VPORT_STATS) { struct odp_vport_stats stats; err = netdev_get_stats(vport, &stats); if (!err) vport_set_stats(vport, &stats); } return vport; error_put: dev_put(netdev_vport->dev); error_free_vport: vport_free(vport); error: return ERR_PTR(err); }