-/* Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
+/* Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
static struct iface *iface_find(const char *name);
static struct iface *iface_from_ofp_port(const struct bridge *,
ofp_port_t ofp_port);
-static void iface_set_mac(struct iface *);
+static void iface_set_mac(struct iface *, const uint8_t *);
static void iface_set_ofport(const struct ovsrec_interface *, ofp_port_t ofport);
static void iface_clear_db_record(const struct ovsrec_interface *if_cfg);
static void iface_configure_qos(struct iface *, const struct ovsrec_qos *);
ovsdb_idl_omit_alert(idl, &ovsrec_port_col_status);
ovsdb_idl_omit_alert(idl, &ovsrec_port_col_statistics);
ovsdb_idl_omit(idl, &ovsrec_port_col_external_ids);
- ovsdb_idl_omit(idl, &ovsrec_port_col_fake_bridge);
ovsdb_idl_omit_alert(idl, &ovsrec_interface_col_admin_state);
ovsdb_idl_omit_alert(idl, &ovsrec_interface_col_duplex);
port_configure(port);
LIST_FOR_EACH (iface, port_elem, &port->ifaces) {
+ iface_set_ofport(iface->cfg, iface->ofp_port);
iface_configure_cfm(iface);
iface_configure_qos(iface, port->cfg->qos);
- iface_set_mac(iface);
+ iface_set_mac(iface, port->cfg->fake_bridge ? br->ea : NULL);
ofproto_port_set_bfd(br->ofproto, iface->ofp_port,
&iface->cfg->bfd);
}
enum ofproto_flow_miss_model model = OFPROTO_HANDLE_MISS_AUTO;
if (opt) {
- if (strcmp(opt, "with-facets")) {
+ if (!strcmp(opt, "with-facets")) {
model = OFPROTO_HANDLE_MISS_WITH_FACETS;
- } else if (strcmp(opt, "without-facets")) {
+ } else if (!strcmp(opt, "without-facets")) {
model = OFPROTO_HANDLE_MISS_WITHOUT_FACETS;
}
}
return netdev_set_config(netdev, &iface_cfg->options);
}
-/* Opens a network device for 'if_cfg' and configures it. If '*ofp_portp'
- * is OFPP_NONE, adds the network device to br->ofproto and stores the OpenFlow
- * port number in '*ofp_portp'; otherwise leaves br->ofproto and '*ofp_portp'
- * untouched.
+/* Opens a network device for 'if_cfg' and configures it. Adds the network
+ * device to br->ofproto and stores the OpenFlow port number in '*ofp_portp'.
*
* If successful, returns 0 and stores the network device in '*netdevp'. On
* failure, returns a positive errno value and stores NULL in '*netdevp'. */
ovs_assert(!iface_lookup(br, iface_cfg->name));
error = iface_do_create(br, iface_cfg, port_cfg, &ofp_port, &netdev);
if (error) {
- iface_set_ofport(iface_cfg, OFPP_NONE);
iface_clear_db_record(iface_cfg);
return false;
}
hmap_insert(&br->ifaces, &iface->ofp_port_node,
hash_ofp_port(ofp_port));
- iface_set_ofport(iface->cfg, ofp_port);
-
/* Populate initial status in database. */
iface_refresh_stats(iface);
iface_refresh_status(iface);
/* Set Ethernet address of 'iface', if one is specified in the configuration
* file. */
static void
-iface_set_mac(struct iface *iface)
+iface_set_mac(struct iface *iface, const uint8_t *mac)
{
uint8_t ea[ETH_ADDR_LEN];
- if (!strcmp(iface->type, "internal")
- && iface->cfg->mac && eth_addr_from_string(iface->cfg->mac, ea)) {
+ if (strcmp(iface->type, "internal")) {
+ return;
+ }
+
+ if (iface->cfg->mac && eth_addr_from_string(iface->cfg->mac, ea)) {
+ mac = ea;
+ }
+
+ if (mac) {
if (iface->ofp_port == OFPP_LOCAL) {
VLOG_ERR("interface %s: ignoring mac in Interface record "
"(use Bridge record to set local port's mac)",
iface->name);
- } else if (eth_addr_is_multicast(ea)) {
+ } else if (eth_addr_is_multicast(mac)) {
VLOG_ERR("interface %s: cannot set MAC to multicast address",
iface->name);
} else {
- int error = netdev_set_etheraddr(iface->netdev, ea);
+ int error = netdev_set_etheraddr(iface->netdev, mac);
if (error) {
VLOG_ERR("interface %s: setting MAC failed (%s)",
iface->name, ovs_strerror(error));
iface_clear_db_record(const struct ovsrec_interface *if_cfg)
{
if (!ovsdb_idl_row_is_synthetic(&if_cfg->header_)) {
+ iface_set_ofport(if_cfg, OFPP_NONE);
ovsrec_interface_set_status(if_cfg, NULL);
ovsrec_interface_set_admin_state(if_cfg, NULL);
ovsrec_interface_set_duplex(if_cfg, NULL);