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;
* 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;
vport->dp = parms->dp;
vport->port_no = parms->port_no;
vport->upcall_pid = parms->upcall_pid;
- atomic_set(&vport->sflow_pool, 0);
vport->ops = ops;
/* Initialize kobject for bridge. This will be added as
}
hlist_add_head_rcu(&vport->hash_node,
- hash_bucket(vport_get_name(vport)));
+ hash_bucket(vport->ops->get_name(vport)));
return vport;
}
}
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
*
}
}
-/**
- * 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
*
{
struct vport_percpu_stats *stats;
- local_bh_disable();
stats = per_cpu_ptr(vport->percpu_stats, smp_processor_id());
write_seqcount_begin(&stats->seqlock);
stats->rx_bytes += skb->len;
write_seqcount_end(&stats->seqlock);
- local_bh_enable();
-
if (!(vport->ops->flags & VPORT_F_FLOW))
OVS_CB(skb)->flow = NULL;
*/
int vport_send(struct vport *vport, struct sk_buff *skb)
{
- struct vport_percpu_stats *stats;
int sent = vport->ops->send(vport, skb);
- local_bh_disable();
- 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);
+ if (likely(sent)) {
+ struct vport_percpu_stats *stats;
- local_bh_enable();
+ 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;
}
*/
void vport_record_error(struct vport *vport, enum vport_err_type err_type)
{
- spin_lock_bh(&vport->stats_lock);
+ spin_lock(&vport->stats_lock);
switch (err_type) {
case VPORT_E_RX_DROPPED:
break;
};
- spin_unlock_bh(&vport->stats_lock);
+ spin_unlock(&vport->stats_lock);
}