#include <linux/compat.h>
#include "vport.h"
+#include "vport-internal_dev.h"
extern struct vport_ops netdev_vport_ops;
extern struct vport_ops internal_vport_ops;
+extern struct vport_ops patch_vport_ops;
extern struct vport_ops gre_vport_ops;
static struct vport_ops *base_vport_ops_list[] = {
&netdev_vport_ops,
&internal_vport_ops,
+ &patch_vport_ops,
&gre_vport_ops,
};
goto out;
}
- if (vport->ops->get_stats)
+ if (vport->ops->get_stats) {
+ rcu_read_lock();
err = vport->ops->get_stats(vport, &stats_req.stats);
- else if (vport->ops->flags & VPORT_F_GEN_STATS) {
+ rcu_read_unlock();
+
+ } else if (vport->ops->flags & VPORT_F_GEN_STATS) {
int i;
memset(&stats_req.stats, 0, sizeof(struct odp_vport_stats));
goto out;
}
+ rcu_read_lock();
memcpy(vport_ether.ether_addr, vport_get_addr(vport), ETH_ALEN);
+ rcu_read_unlock();
out:
vport_unlock();
dump_stack();
}
+ rcu_read_lock();
+
hlist_for_each_entry(vport, node, bucket, hash_node)
if (!strcmp(name, vport_get_name(vport)))
- return vport;
+ goto out;
+
+ vport = NULL;
- return NULL;
+out:
+ rcu_read_unlock();
+ return vport;
}
static void
if (mtu < 68)
return -EINVAL;
- if (vport->ops->set_mtu)
- return vport->ops->set_mtu(vport, mtu);
- else
+ if (vport->ops->set_mtu) {
+ int ret;
+
+ ret = vport->ops->set_mtu(vport, mtu);
+
+ if (!ret && !is_internal_vport(vport)) {
+ struct dp_port *dp_port = vport_get_dp_port(vport);
+
+ if (dp_port)
+ set_internal_devs_mtu(dp_port->dp);
+ }
+
+ return ret;
+ } else
return -EOPNOTSUPP;
}
spin_unlock_bh(&vport->err_stats.lock);
}
}
-
-/**
- * vport_gen_ether_addr - generate an Ethernet address
- *
- * @addr: location to store generated address
- *
- * Generates a random Ethernet address for use when creating a device that
- * has no natural address.
- */
-void
-vport_gen_ether_addr(u8 *addr)
-{
- random_ether_addr(addr);
-
- /* Set the OUI to the Nicira one. */
- addr[0] = 0x00;
- addr[1] = 0x23;
- addr[2] = 0x20;
-
- /* Set the top bit to indicate random address. */
- addr[3] |= 0x80;
-}