- struct gre_vport *gre_vport = gre_vport_priv(vport);
- int port_type;
- const struct mutable_config *old_mutable;
-
- /* Do a hash table lookup to make sure that the port exists. It should
- * exist but might not if a modify failed earlier. */
- if (gre_vport->mutable->port_config.flags & GRE_F_IN_KEY_MATCH)
- port_type = FIND_PORT_MATCH;
- else
- port_type = FIND_PORT_KEY;
-
- if (vport == find_port(gre_vport->mutable->port_config.saddr,
- gre_vport->mutable->port_config.daddr,
- gre_vport->mutable->port_config.in_key, port_type, &old_mutable))
- del_port(vport);
-
- kfree(gre_vport->mutable);
- vport_free(vport);
-
- return 0;
-}
-
-static int
-gre_set_mtu(struct vport *vport, int mtu)
-{
- struct gre_vport *gre_vport = gre_vport_priv(vport);
- struct mutable_config *mutable;
- struct dp_port *dp_port;
-
- mutable = kmemdup(gre_vport->mutable, sizeof(struct mutable_config), GFP_KERNEL);
- if (!mutable)
- return -ENOMEM;
-
- mutable->mtu = mtu;
- assign_config_rcu(vport, mutable);
-
- dp_port = vport_get_dp_port(vport);
- if (dp_port)
- set_internal_devs_mtu(dp_port->dp);
-
- return 0;
-}
-
-static int
-gre_set_addr(struct vport *vport, const unsigned char *addr)
-{
- struct gre_vport *gre_vport = gre_vport_priv(vport);
- struct mutable_config *mutable;
-
- mutable = kmemdup(gre_vport->mutable, sizeof(struct mutable_config), GFP_KERNEL);
- if (!mutable)
- return -ENOMEM;
-
- memcpy(mutable->eth_addr, addr, ETH_ALEN);
- assign_config_rcu(vport, mutable);
-
- return 0;
-}
-
-
-static const char *
-gre_get_name(const struct vport *vport)
-{
- const struct gre_vport *gre_vport = gre_vport_priv(vport);
- return gre_vport->name;
-}
-
-static const unsigned char *
-gre_get_addr(const struct vport *vport)
-{
- const struct gre_vport *gre_vport = gre_vport_priv(vport);
- return rcu_dereference(gre_vport->mutable)->eth_addr;
-}
-
-static unsigned
-gre_get_dev_flags(const struct vport *vport)
-{
- return IFF_UP | IFF_RUNNING | IFF_LOWER_UP;
-}