X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=datapath%2Fvport-patch.c;h=b0ae3a070f6713c38c3761d1a65bc73653bda191;hb=29b639ed7522594dac03bd10ad477f2f188ce4b6;hp=eb3915805baf69d3d2d11983cde23d1a727d501b;hpb=94903c989826268a7fab3c730cd7d0b35ef423d5;p=openvswitch diff --git a/datapath/vport-patch.c b/datapath/vport-patch.c index eb391580..b0ae3a07 100644 --- a/datapath/vport-patch.c +++ b/datapath/vport-patch.c @@ -39,6 +39,8 @@ struct patch_vport { static struct hlist_head *peer_table; #define PEER_HASH_BUCKETS 256 +static void update_peers(const char *name, struct vport *); + static inline struct patch_vport *patch_vport_priv(const struct vport *vport) { return vport_priv(vport); @@ -83,29 +85,18 @@ static void patch_exit(void) kfree(peer_table); } -static int set_config(struct vport *vport, const void __user *uconfig) +static int set_config(struct vport *vport, const void *config) { struct patch_vport *patch_vport = patch_vport_priv(vport); char peer_name[IFNAMSIZ]; - int retval; - retval = strncpy_from_user(peer_name, uconfig, IFNAMSIZ); - if (retval < 0) - return -EFAULT; - else if (retval >= IFNAMSIZ) - return -ENAMETOOLONG; + strlcpy(peer_name, config, IFNAMSIZ); if (!strcmp(patch_vport->name, peer_name)) return -EINVAL; strcpy(patch_vport->peer_name, peer_name); - if (vport_get_dp_port(vport)) { - hlist_del(&patch_vport->hash_node); - rcu_assign_pointer(patch_vport->peer, vport_locate(patch_vport->peer_name)); - hlist_add_head(&patch_vport->hash_node, hash_bucket(patch_vport->peer_name)); - } - return 0; } @@ -115,7 +106,7 @@ static struct vport *patch_create(const struct vport_parms *parms) struct patch_vport *patch_vport; int err; - vport = vport_alloc(sizeof(struct patch_vport), &patch_vport_ops); + vport = vport_alloc(sizeof(struct patch_vport), &patch_vport_ops, parms); if (IS_ERR(vport)) { err = PTR_ERR(vport); goto error; @@ -141,6 +132,11 @@ static struct vport *patch_create(const struct vport_parms *parms) * bottleneck on systems using jumbo frames. */ patch_vport->devconf->mtu = 65535; + hlist_add_head(&patch_vport->hash_node, hash_bucket(patch_vport->peer_name)); + + rcu_assign_pointer(patch_vport->peer, vport_locate(patch_vport->peer_name)); + update_peers(patch_vport->name, vport); + return vport; error_free_vport: @@ -149,15 +145,30 @@ error: return ERR_PTR(err); } -static int patch_modify(struct vport *vport, const void __user *config) +static int patch_modify(struct vport *vport, struct odp_port *port) { - return set_config(vport, config); + int err = set_config(vport, port->config); + if (!err) { + struct patch_vport *patch_vport = patch_vport_priv(vport); + + hlist_del(&patch_vport->hash_node); + rcu_assign_pointer(patch_vport->peer, vport_locate(patch_vport->peer_name)); + hlist_add_head(&patch_vport->hash_node, hash_bucket(patch_vport->peer_name)); + } + return err; } static int patch_destroy(struct vport *vport) { struct patch_vport *patch_vport = patch_vport_priv(vport); + update_peers(patch_vport->name, NULL); + rcu_assign_pointer(patch_vport->peer, NULL); + + hlist_del(&patch_vport->hash_node); + + synchronize_rcu(); + kfree(patch_vport->devconf); vport_free(vport); @@ -175,30 +186,6 @@ static void update_peers(const char *name, struct vport *vport) rcu_assign_pointer(peer_vport->peer, vport); } -static int patch_attach(struct vport *vport) -{ - struct patch_vport *patch_vport = patch_vport_priv(vport); - - hlist_add_head(&patch_vport->hash_node, hash_bucket(patch_vport->peer_name)); - - rcu_assign_pointer(patch_vport->peer, vport_locate(patch_vport->peer_name)); - update_peers(patch_vport->name, vport); - - return 0; -} - -static int patch_detach(struct vport *vport) -{ - struct patch_vport *patch_vport = patch_vport_priv(vport); - - update_peers(patch_vport->name, NULL); - rcu_assign_pointer(patch_vport->peer, NULL); - - hlist_del(&patch_vport->hash_node); - - return 0; -} - static int patch_set_mtu(struct vport *vport, int mtu) { struct patch_vport *patch_vport = patch_vport_priv(vport); @@ -273,8 +260,6 @@ const struct vport_ops patch_vport_ops = { .create = patch_create, .modify = patch_modify, .destroy = patch_destroy, - .attach = patch_attach, - .detach = patch_detach, .set_mtu = patch_set_mtu, .set_addr = patch_set_addr, .get_name = patch_get_name,