struct netdev_dev netdev_dev;
struct ofpbuf *options;
unsigned int change_seq;
-};
-
-struct netdev_vport {
- struct netdev netdev;
+ uint8_t etheraddr[ETH_ADDR_LEN];
};
struct vport_class {
return CONTAINER_OF(netdev_dev, struct netdev_dev_vport, netdev_dev);
}
-static struct netdev_vport *
-netdev_vport_cast(const struct netdev *netdev)
+static struct netdev_dev_vport *
+netdev_vport_get_dev(const struct netdev *netdev)
{
- struct netdev_dev *netdev_dev = netdev_get_dev(netdev);
- assert(is_vport_class(netdev_dev_get_class(netdev_dev)));
- return CONTAINER_OF(netdev, struct netdev_vport, netdev);
+ return netdev_dev_vport_cast(netdev_get_dev(netdev));
}
/* If 'netdev' is a vport netdev, returns an ofpbuf that contains Netlink
netdev_dev_init(&dev->netdev_dev, name, netdev_class);
dev->options = NULL;
dev->change_seq = 1;
+ eth_addr_random(dev->etheraddr);
*netdev_devp = &dev->netdev_dev;
route_table_register();
}
static int
-netdev_vport_open(struct netdev_dev *netdev_dev_, struct netdev **netdevp)
+netdev_vport_open(struct netdev_dev *netdev_dev, struct netdev **netdevp)
{
- struct netdev_vport *netdev;
-
- netdev = xmalloc(sizeof *netdev);
- netdev_init(&netdev->netdev, netdev_dev_);
-
- *netdevp = &netdev->netdev;
+ *netdevp = xmalloc(sizeof **netdevp);
+ netdev_init(*netdevp, netdev_dev);
return 0;
}
static void
-netdev_vport_close(struct netdev *netdev_)
+netdev_vport_close(struct netdev *netdev)
{
- struct netdev_vport *netdev = netdev_vport_cast(netdev_);
free(netdev);
}
netdev_vport_set_etheraddr(struct netdev *netdev,
const uint8_t mac[ETH_ADDR_LEN])
{
- struct dpif_linux_vport vport;
- int error;
-
- dpif_linux_vport_init(&vport);
- vport.cmd = OVS_VPORT_CMD_SET;
- vport.name = netdev_get_name(netdev);
- vport.address = mac;
-
- error = dpif_linux_vport_transact(&vport, NULL, NULL);
- if (!error) {
- netdev_vport_poll_notify(netdev);
- }
- return error;
+ memcpy(netdev_vport_get_dev(netdev)->etheraddr, mac, ETH_ADDR_LEN);
+ netdev_vport_poll_notify(netdev);
+ return 0;
}
static int
netdev_vport_get_etheraddr(const struct netdev *netdev,
uint8_t mac[ETH_ADDR_LEN])
{
- struct dpif_linux_vport reply;
- struct ofpbuf *buf;
- int error;
-
- error = dpif_linux_vport_get(netdev_get_name(netdev), &reply, &buf);
- if (!error) {
- if (reply.address) {
- memcpy(mac, reply.address, ETH_ADDR_LEN);
- } else {
- error = EOPNOTSUPP;
- }
- ofpbuf_delete(buf);
- }
- return error;
+ memcpy(mac, netdev_vport_get_dev(netdev)->etheraddr, ETH_ADDR_LEN);
+ return 0;
}
/* Copies 'src' into 'dst', performing format conversion in the process.
static int
tunnel_get_status(const struct netdev *netdev, struct smap *smap)
{
+ struct netdev_dev_vport *ndv = netdev_vport_get_dev(netdev);
struct nlattr *a[OVS_TUNNEL_ATTR_MAX + 1];
- struct netdev_dev_vport *ndv;
static char iface[IFNAMSIZ];
ovs_be32 route;
- ndv = netdev_dev_vport_cast(netdev_get_dev(netdev));
if (!ndv->options) {
/* Race condition when 'ndv' was created, but did not have it's
* configuration set yet. */
static unsigned int
netdev_vport_change_seq(const struct netdev *netdev)
{
- return netdev_dev_vport_cast(netdev_get_dev(netdev))->change_seq;
+ return netdev_vport_get_dev(netdev)->change_seq;
}
static void
static void
netdev_vport_poll_notify(const struct netdev *netdev)
{
- struct netdev_dev_vport *ndv;
-
- ndv = netdev_dev_vport_cast(netdev_get_dev(netdev));
+ struct netdev_dev_vport *ndv = netdev_vport_get_dev(netdev);
ndv->change_seq++;
if (!ndv->change_seq) {
if (!strcmp(node->value, "true")) {
flags |= TNL_F_CSUM;
}
- } else if (!strcmp(node->key, "df_inherit")) {
- if (!strcmp(node->value, "true")) {
- flags |= TNL_F_DF_INHERIT;
- }
} else if (!strcmp(node->key, "df_default")) {
if (!strcmp(node->value, "false")) {
flags &= ~TNL_F_DF_DEFAULT;
}
- } else if (!strcmp(node->key, "pmtud")) {
- if (!strcmp(node->value, "true")) {
- VLOG_WARN_ONCE("%s: The tunnel Path MTU discovery is "
- "deprecated and may be removed in February "
- "2013. Please email dev@openvswitch.org with "
- "concerns.", name);
- flags |= TNL_F_PMTUD;
- }
} else if (!strcmp(node->key, "peer_cert") && is_ipsec) {
if (smap_get(args, "certificate")) {
ipsec_mech_set = true;
smap_add(args, "csum", "true");
}
if (flags & TNL_F_DF_INHERIT) {
+ /* Shouldn't happen as "df_inherit" is no longer supported. However,
+ * for completeness we report it if it's there. */
smap_add(args, "df_inherit", "true");
}
if (!(flags & TNL_F_DF_DEFAULT)) {
smap_add(args, "df_default", "false");
}
- if (flags & TNL_F_PMTUD) {
- smap_add(args, "pmtud", "true");
- }
return 0;
}
\
netdev_vport_change_seq
+#define TUNNEL_CLASS(NAME, VPORT_TYPE) \
+ { VPORT_TYPE, \
+ { NAME, VPORT_FUNCTIONS(tunnel_get_status) }, \
+ parse_tunnel_config, unparse_tunnel_config }
+
void
netdev_vport_register(void)
{
static const struct vport_class vport_classes[] = {
- { OVS_VPORT_TYPE_GRE,
- { "gre", VPORT_FUNCTIONS(tunnel_get_status) },
- parse_tunnel_config, unparse_tunnel_config },
-
- { OVS_VPORT_TYPE_GRE,
- { "ipsec_gre", VPORT_FUNCTIONS(tunnel_get_status) },
- parse_tunnel_config, unparse_tunnel_config },
-
- { OVS_VPORT_TYPE_GRE64,
- { "gre64", VPORT_FUNCTIONS(tunnel_get_status) },
- parse_tunnel_config, unparse_tunnel_config },
-
- { OVS_VPORT_TYPE_GRE64,
- { "ipsec_gre64", VPORT_FUNCTIONS(tunnel_get_status) },
- parse_tunnel_config, unparse_tunnel_config },
-
- { OVS_VPORT_TYPE_CAPWAP,
- { "capwap", VPORT_FUNCTIONS(tunnel_get_status) },
- parse_tunnel_config, unparse_tunnel_config },
-
- { OVS_VPORT_TYPE_VXLAN,
- { "vxlan", VPORT_FUNCTIONS(tunnel_get_status) },
- parse_tunnel_config, unparse_tunnel_config },
+ TUNNEL_CLASS("gre", OVS_VPORT_TYPE_GRE),
+ TUNNEL_CLASS("ipsec_gre", OVS_VPORT_TYPE_GRE),
+ TUNNEL_CLASS("gre64", OVS_VPORT_TYPE_GRE64),
+ TUNNEL_CLASS("ipsec_gre64", OVS_VPORT_TYPE_GRE64),
+ TUNNEL_CLASS("capwap", OVS_VPORT_TYPE_CAPWAP),
+ TUNNEL_CLASS("vxlan", OVS_VPORT_TYPE_VXLAN),
{ OVS_VPORT_TYPE_PATCH,
{ "patch", VPORT_FUNCTIONS(NULL) },