X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=datapath%2Fvport.c;h=a6b686c85928c1ea389b447f8a997d1fa2a02310;hb=77912ae717298cb06544f1bebd9701d0b3c2f2f0;hp=ad5a10e7adefdb34b6ad31b089e465d78ac412ab;hpb=e9141eec249f97e547c6e47205b61ee98d9b52e9;p=openvswitch diff --git a/datapath/vport.c b/datapath/vport.c index ad5a10e7..a6b686c8 100644 --- a/datapath/vport.c +++ b/datapath/vport.c @@ -129,7 +129,7 @@ struct vport *vport_locate(const char *name) struct hlist_node *node; hlist_for_each_entry_rcu(vport, node, bucket, hash_node) - if (!strcmp(name, vport_get_name(vport))) + if (!strcmp(name, vport->ops->get_name(vport))) return vport; return NULL; @@ -159,7 +159,8 @@ static struct kobj_type brport_ktype = { * vport_priv(). vports that are no longer needed should be released with * vport_free(). */ -struct vport *vport_alloc(int priv_size, const struct vport_ops *ops, const struct vport_parms *parms) +struct vport *vport_alloc(int priv_size, const struct vport_ops *ops, + const struct vport_parms *parms) { struct vport *vport; size_t alloc_size; @@ -235,7 +236,7 @@ struct vport *vport_add(const struct vport_parms *parms) } hlist_add_head_rcu(&vport->hash_node, - hash_bucket(vport_get_name(vport))); + hash_bucket(vport->ops->get_name(vport))); return vport; } } @@ -326,61 +327,6 @@ void vport_set_stats(struct vport *vport, struct ovs_vport_stats *stats) spin_unlock_bh(&vport->stats_lock); } -/** - * vport_get_name - retrieve device name - * - * @vport: vport from which to retrieve the name. - * - * Retrieves the name of the given device. Either RTNL lock or rcu_read_lock - * must be held for the entire duration that the name is in use. - */ -const char *vport_get_name(const struct vport *vport) -{ - return vport->ops->get_name(vport); -} - -/** - * vport_get_type - retrieve device type - * - * @vport: vport from which to retrieve the type. - * - * Retrieves the type of the given device. - */ -enum ovs_vport_type vport_get_type(const struct vport *vport) -{ - return vport->ops->type; -} - -/** - * vport_get_addr - retrieve device Ethernet address (for kernel callers) - * - * @vport: vport from which to retrieve the Ethernet address. - * - * Retrieves the Ethernet address of the given device. Either RTNL lock or - * rcu_read_lock must be held for the entire duration that the Ethernet address - * is in use. - */ -const unsigned char *vport_get_addr(const struct vport *vport) -{ - return vport->ops->get_addr(vport); -} - -/** - * vport_get_kobj - retrieve associated kobj - * - * @vport: vport from which to retrieve the associated kobj - * - * Retrieves the associated kobj or null if no kobj. The returned kobj is - * valid for as long as the vport exists. - */ -struct kobject *vport_get_kobj(const struct vport *vport) -{ - if (vport->ops->get_kobj) - return vport->ops->get_kobj(vport); - else - return NULL; -} - /** * vport_get_stats - retrieve device stats * @@ -436,83 +382,6 @@ void vport_get_stats(struct vport *vport, struct ovs_vport_stats *stats) } } -/** - * vport_get_flags - retrieve device flags - * - * @vport: vport from which to retrieve the flags - * - * Retrieves the flags of the given device. - * - * Must be called with RTNL lock or rcu_read_lock. - */ -unsigned vport_get_flags(const struct vport *vport) -{ - return vport->ops->get_dev_flags(vport); -} - -/** - * vport_get_flags - check whether device is running - * - * @vport: vport on which to check status. - * - * Checks whether the given device is running. - * - * Must be called with RTNL lock or rcu_read_lock. - */ -int vport_is_running(const struct vport *vport) -{ - return vport->ops->is_running(vport); -} - -/** - * vport_get_flags - retrieve device operating state - * - * @vport: vport from which to check status - * - * Retrieves the RFC2863 operstate of the given device. - * - * Must be called with RTNL lock or rcu_read_lock. - */ -unsigned char vport_get_operstate(const struct vport *vport) -{ - return vport->ops->get_operstate(vport); -} - -/** - * vport_get_ifindex - retrieve device system interface index - * - * @vport: vport from which to retrieve index - * - * Retrieves the system interface index of the given device or 0 if - * the device does not have one (in the case of virtual ports). - * Returns a negative index on error. - * - * Must be called with RTNL lock or rcu_read_lock. - */ -int vport_get_ifindex(const struct vport *vport) -{ - if (vport->ops->get_ifindex) - return vport->ops->get_ifindex(vport); - else - return 0; -} - -/** - * vport_get_mtu - retrieve device MTU - * - * @vport: vport from which to retrieve MTU - * - * Retrieves the MTU of the given device. Returns 0 if @vport does not have an - * MTU (as e.g. some tunnels do not). Either RTNL lock or rcu_read_lock must - * be held. - */ -int vport_get_mtu(const struct vport *vport) -{ - if (!vport->ops->get_mtu) - return 0; - return vport->ops->get_mtu(vport); -} - /** * vport_get_options - retrieve device options * @@ -590,16 +459,18 @@ void vport_receive(struct vport *vport, struct sk_buff *skb) */ int vport_send(struct vport *vport, struct sk_buff *skb) { - struct vport_percpu_stats *stats; int sent = vport->ops->send(vport, skb); - stats = per_cpu_ptr(vport->percpu_stats, smp_processor_id()); + if (likely(sent)) { + struct vport_percpu_stats *stats; - write_seqcount_begin(&stats->seqlock); - stats->tx_packets++; - stats->tx_bytes += sent; - write_seqcount_end(&stats->seqlock); + stats = per_cpu_ptr(vport->percpu_stats, smp_processor_id()); + write_seqcount_begin(&stats->seqlock); + stats->tx_packets++; + stats->tx_bytes += sent; + write_seqcount_end(&stats->seqlock); + } return sent; }