X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=datapath%2Fvport.c;h=945ef448589c6aef7802dadc93cb43731ee5f11f;hb=22f7fdb621a8751b7030aa141b114c325963250e;hp=6b7381e9f1f6b1d5351ebd983e8b19fdd131456c;hpb=3fbd517acfd8dba2cd75fa234b0eb3337d202d33;p=openvswitch diff --git a/datapath/vport.c b/datapath/vport.c index 6b7381e9..945ef448 100644 --- a/datapath/vport.c +++ b/datapath/vport.c @@ -17,14 +17,17 @@ #include #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, }; @@ -400,9 +403,12 @@ vport_stats_get(struct odp_vport_stats_req __user *ustats_req) 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)); @@ -475,7 +481,9 @@ vport_ether_get(struct odp_vport_ether __user *uvport_ether) goto out; } + rcu_read_lock(); memcpy(vport_ether.ether_addr, vport_get_addr(vport), ETH_ALEN); + rcu_read_unlock(); out: vport_unlock(); @@ -632,11 +640,17 @@ vport_locate(const char *name) 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 @@ -871,9 +885,20 @@ vport_set_mtu(struct vport *vport, int mtu) 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; } @@ -1087,10 +1112,9 @@ vport_get_mtu(const struct vport *vport) * @vport: vport that received the packet * @skb: skb that was received * - * Must be called with rcu_read_lock and bottom halves disabled. The packet - * cannot be shared and skb->data should point to the Ethernet header. The - * caller must have already called compute_ip_summed() to initialize the - * checksumming fields. + * Must be called with rcu_read_lock. The packet cannot be shared and + * skb->data should point to the Ethernet header. The caller must have already + * called compute_ip_summed() to initialize the checksumming fields. */ void vport_receive(struct vport *vport, struct sk_buff *skb) @@ -1206,25 +1230,3 @@ vport_record_error(struct vport *vport, enum vport_err_type err_type) 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; -}