This will allow to query easily if the vport has netdev. Also it allows to unexpose netdev_vport_priv and struct netdev_vport.
Signed-off-by: Jiri Pirko <j...@resnulli.us> --- net/openvswitch/datapath.c | 2 +- net/openvswitch/dp_notify.c | 7 ++--- net/openvswitch/vport-internal_dev.c | 56 ++++++++++++++++++++++++------------ net/openvswitch/vport-netdev.c | 16 +++++++++++ net/openvswitch/vport-netdev.h | 12 -------- net/openvswitch/vport.h | 2 ++ 6 files changed, 59 insertions(+), 36 deletions(-) diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index 683d6cd..75bb07f 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c @@ -171,7 +171,7 @@ static int get_dpifindex(struct datapath *dp) local = ovs_vport_rcu(dp, OVSP_LOCAL); if (local) - ifindex = netdev_vport_priv(local)->dev->ifindex; + ifindex = local->ops->get_netdev(local)->ifindex; else ifindex = 0; diff --git a/net/openvswitch/dp_notify.c b/net/openvswitch/dp_notify.c index 2c631fe..d2cc24b 100644 --- a/net/openvswitch/dp_notify.c +++ b/net/openvswitch/dp_notify.c @@ -58,13 +58,12 @@ void ovs_dp_notify_wq(struct work_struct *work) struct hlist_node *n; hlist_for_each_entry_safe(vport, n, &dp->ports[i], dp_hash_node) { - struct netdev_vport *netdev_vport; + struct net_device *dev; if (vport->ops->type != OVS_VPORT_TYPE_NETDEV) continue; - - netdev_vport = netdev_vport_priv(vport); - if (!(netdev_vport->dev->priv_flags & IFF_OVS_DATAPATH)) + dev = vport->ops->get_netdev(vport); + if (!(dev->priv_flags & IFF_OVS_DATAPATH)) dp_detach_port_notify(vport); } } diff --git a/net/openvswitch/vport-internal_dev.c b/net/openvswitch/vport-internal_dev.c index 8451612..6be7928 100644 --- a/net/openvswitch/vport-internal_dev.c +++ b/net/openvswitch/vport-internal_dev.c @@ -32,6 +32,17 @@ #include "vport-internal_dev.h" #include "vport-netdev.h" +struct internal_dev_vport { + struct rcu_head rcu; + struct net_device *dev; +}; + +static struct internal_dev_vport * +internal_dev_vport_priv(const struct vport *vport) +{ + return vport_priv(vport); +} + struct internal_dev { struct vport *vport; }; @@ -154,49 +165,50 @@ static void do_setup(struct net_device *netdev) static struct vport *internal_dev_create(const struct vport_parms *parms) { struct vport *vport; - struct netdev_vport *netdev_vport; + struct internal_dev_vport *int_vport; struct internal_dev *internal_dev; + struct net_device *dev; int err; - vport = ovs_vport_alloc(sizeof(struct netdev_vport), + vport = ovs_vport_alloc(sizeof(struct internal_dev_vport), &ovs_internal_vport_ops, parms); if (IS_ERR(vport)) { err = PTR_ERR(vport); goto error; } - netdev_vport = netdev_vport_priv(vport); + int_vport = internal_dev_vport_priv(vport); - netdev_vport->dev = alloc_netdev(sizeof(struct internal_dev), - parms->name, NET_NAME_UNKNOWN, - do_setup); - if (!netdev_vport->dev) { + dev = alloc_netdev(sizeof(struct internal_dev), parms->name, + NET_NAME_UNKNOWN, do_setup); + if (!dev) { err = -ENOMEM; goto error_free_vport; } + int_vport->dev = dev; - dev_net_set(netdev_vport->dev, ovs_dp_get_net(vport->dp)); - internal_dev = internal_dev_priv(netdev_vport->dev); + dev_net_set(dev, ovs_dp_get_net(vport->dp)); + internal_dev = internal_dev_priv(dev); internal_dev->vport = vport; /* Restrict bridge port to current netns. */ if (vport->port_no == OVSP_LOCAL) - netdev_vport->dev->features |= NETIF_F_NETNS_LOCAL; + dev->features |= NETIF_F_NETNS_LOCAL; rtnl_lock(); - err = register_netdevice(netdev_vport->dev); + err = register_netdevice(dev); if (err) goto error_free_netdev; - dev_set_promiscuity(netdev_vport->dev, 1); + dev_set_promiscuity(dev, 1); rtnl_unlock(); - netif_start_queue(netdev_vport->dev); + netif_start_queue(dev); return vport; error_free_netdev: rtnl_unlock(); - free_netdev(netdev_vport->dev); + free_netdev(dev); error_free_vport: ovs_vport_free(vport); error: @@ -205,21 +217,21 @@ error: static void internal_dev_destroy(struct vport *vport) { - struct netdev_vport *netdev_vport = netdev_vport_priv(vport); + struct internal_dev_vport *int_vport = internal_dev_vport_priv(vport); - netif_stop_queue(netdev_vport->dev); + netif_stop_queue(int_vport->dev); rtnl_lock(); - dev_set_promiscuity(netdev_vport->dev, -1); + dev_set_promiscuity(int_vport->dev, -1); /* unregister_netdevice() waits for an RCU grace period. */ - unregister_netdevice(netdev_vport->dev); + unregister_netdevice(int_vport->dev); rtnl_unlock(); } static int internal_dev_recv(struct vport *vport, struct sk_buff *skb) { - struct net_device *netdev = netdev_vport_priv(vport)->dev; + struct net_device *netdev = internal_dev_vport_priv(vport)->dev; int len; len = skb->len; @@ -238,12 +250,18 @@ static int internal_dev_recv(struct vport *vport, struct sk_buff *skb) return len; } +static struct net_device *internal_dev_get_netdev(struct vport *vport) +{ + return internal_dev_vport_priv(vport)->dev; +} + const struct vport_ops ovs_internal_vport_ops = { .type = OVS_VPORT_TYPE_INTERNAL, .create = internal_dev_create, .destroy = internal_dev_destroy, .get_name = ovs_netdev_get_name, .send = internal_dev_recv, + .get_netdev = internal_dev_get_netdev, }; int ovs_is_internal_dev(const struct net_device *netdev) diff --git a/net/openvswitch/vport-netdev.c b/net/openvswitch/vport-netdev.c index d21f77d..aaf3d14 100644 --- a/net/openvswitch/vport-netdev.c +++ b/net/openvswitch/vport-netdev.c @@ -33,6 +33,16 @@ #include "vport-internal_dev.h" #include "vport-netdev.h" +struct netdev_vport { + struct rcu_head rcu; + struct net_device *dev; +}; + +static struct netdev_vport *netdev_vport_priv(const struct vport *vport) +{ + return vport_priv(vport); +} + /* Must be called with rcu_read_lock. */ static void netdev_port_receive(struct vport *vport, struct sk_buff *skb) { @@ -224,10 +234,16 @@ struct vport *ovs_netdev_get_vport(struct net_device *dev) return NULL; } +static struct net_device *netdev_get_netdev(struct vport *vport) +{ + return netdev_vport_priv(vport)->dev; +} + const struct vport_ops ovs_netdev_vport_ops = { .type = OVS_VPORT_TYPE_NETDEV, .create = netdev_create, .destroy = netdev_destroy, .get_name = ovs_netdev_get_name, .send = netdev_send, + .get_netdev = netdev_get_netdev, }; diff --git a/net/openvswitch/vport-netdev.h b/net/openvswitch/vport-netdev.h index 8df01c11..f03d41d 100644 --- a/net/openvswitch/vport-netdev.h +++ b/net/openvswitch/vport-netdev.h @@ -26,18 +26,6 @@ struct vport *ovs_netdev_get_vport(struct net_device *dev); -struct netdev_vport { - struct rcu_head rcu; - - struct net_device *dev; -}; - -static inline struct netdev_vport * -netdev_vport_priv(const struct vport *vport) -{ - return vport_priv(vport); -} - const char *ovs_netdev_get_name(const struct vport *); void ovs_netdev_detach_dev(struct vport *); diff --git a/net/openvswitch/vport.h b/net/openvswitch/vport.h index 8409e06..f434271 100644 --- a/net/openvswitch/vport.h +++ b/net/openvswitch/vport.h @@ -164,6 +164,8 @@ struct vport_ops { const char *(*get_name)(const struct vport *); int (*send)(struct vport *, struct sk_buff *); + + struct net_device *(*get_netdev)(struct vport *); }; enum vport_err_type { -- 1.9.3 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev