struct hmap_node node; /* In 'all_bridges'. */
char *name; /* User-specified arbitrary name. */
char *type; /* Datapath type. */
- uint8_t ea[ETH_ADDR_LEN]; /* Bridge Ethernet Address. */
- uint8_t default_ea[ETH_ADDR_LEN]; /* Default MAC. */
+ struct eth_addr ea; /* Bridge Ethernet Address. */
+ struct eth_addr default_ea; /* Default MAC. */
const struct ovsrec_bridge *cfg;
/* OpenFlow switch processing. */
static void bridge_configure_remotes(struct bridge *,
const struct sockaddr_in *managers,
size_t n_managers);
-static void bridge_pick_local_hw_addr(struct bridge *,
- uint8_t ea[ETH_ADDR_LEN],
+static void bridge_pick_local_hw_addr(struct bridge *, struct eth_addr *ea,
struct iface **hw_addr_iface);
static uint64_t bridge_pick_datapath_id(struct bridge *,
- const uint8_t bridge_ea[ETH_ADDR_LEN],
+ const struct eth_addr bridge_ea,
struct iface *hw_addr_iface);
static uint64_t dpid_from_hash(const void *, size_t nbytes);
static bool bridge_has_bond_fake_iface(const struct bridge *,
static void
bridge_configure_datapath_id(struct bridge *br)
{
- uint8_t ea[ETH_ADDR_LEN];
+ struct eth_addr ea;
uint64_t dpid;
struct iface *local_iface;
struct iface *hw_addr_iface;
char *dpid_string;
- bridge_pick_local_hw_addr(br, ea, &hw_addr_iface);
+ bridge_pick_local_hw_addr(br, &ea, &hw_addr_iface);
local_iface = iface_from_ofp_port(br, OFPP_LOCAL);
if (local_iface) {
int error = netdev_set_etheraddr(local_iface->netdev, ea);
br->name, ovs_strerror(error));
}
}
- memcpy(br->ea, ea, ETH_ADDR_LEN);
+ br->ea = ea;
dpid = bridge_pick_datapath_id(br, ea, hw_addr_iface);
if (dpid != ofproto_get_datapath_id(br->ofproto)) {
config_str = smap_get(&br->cfg->other_config, "stp-system-id");
if (config_str) {
- uint8_t ea[ETH_ADDR_LEN];
+ struct eth_addr ea;
- if (eth_addr_from_string(config_str, ea)) {
+ if (eth_addr_from_string(config_str, &ea)) {
br_s.system_id = eth_addr_to_uint64(ea);
} else {
br_s.system_id = eth_addr_to_uint64(br->ea);
config_str = smap_get(&br->cfg->other_config, "rstp-address");
if (config_str) {
- uint8_t ea[ETH_ADDR_LEN];
+ struct eth_addr ea;
- if (eth_addr_from_string(config_str, ea)) {
+ if (eth_addr_from_string(config_str, &ea)) {
br_s.address = eth_addr_to_uint64(ea);
}
else {
}
static void
-find_local_hw_addr(const struct bridge *br, uint8_t ea[ETH_ADDR_LEN],
+find_local_hw_addr(const struct bridge *br, struct eth_addr *ea,
const struct port *fake_br, struct iface **hw_addr_iface)
{
struct hmapx mirror_output_ports;
/* Otherwise choose the minimum non-local MAC address among all of the
* interfaces. */
HMAP_FOR_EACH (port, hmap_node, &br->ports) {
- uint8_t iface_ea[ETH_ADDR_LEN];
+ struct eth_addr iface_ea;
struct iface *candidate;
struct iface *iface;
/* Choose the MAC address to represent the port. */
iface = NULL;
- if (port->cfg->mac && eth_addr_from_string(port->cfg->mac, iface_ea)) {
+ if (port->cfg->mac && eth_addr_from_string(port->cfg->mac,
+ &iface_ea)) {
/* Find the interface with this Ethernet address (if any) so that
* we can provide the correct devname to the caller. */
LIST_FOR_EACH (candidate, port_elem, &port->ifaces) {
- uint8_t candidate_ea[ETH_ADDR_LEN];
- if (!netdev_get_etheraddr(candidate->netdev, candidate_ea)
+ struct eth_addr candidate_ea;
+ if (!netdev_get_etheraddr(candidate->netdev, &candidate_ea)
&& eth_addr_equals(iface_ea, candidate_ea)) {
iface = candidate;
}
}
/* Grab MAC. */
- error = netdev_get_etheraddr(iface->netdev, iface_ea);
+ error = netdev_get_etheraddr(iface->netdev, &iface_ea);
if (error) {
continue;
}
!eth_addr_is_local(iface_ea) &&
!eth_addr_is_reserved(iface_ea) &&
!eth_addr_is_zero(iface_ea) &&
- (!found_addr || eth_addr_compare_3way(iface_ea, ea) < 0))
+ (!found_addr || eth_addr_compare_3way(iface_ea, *ea) < 0))
{
- memcpy(ea, iface_ea, ETH_ADDR_LEN);
+ *ea = iface_ea;
*hw_addr_iface = iface;
found_addr = true;
}
}
if (!found_addr) {
- memcpy(ea, br->default_ea, ETH_ADDR_LEN);
+ *ea = br->default_ea;
*hw_addr_iface = NULL;
}
}
static void
-bridge_pick_local_hw_addr(struct bridge *br, uint8_t ea[ETH_ADDR_LEN],
+bridge_pick_local_hw_addr(struct bridge *br, struct eth_addr *ea,
struct iface **hw_addr_iface)
{
const char *hwaddr;
/* Did the user request a particular MAC? */
hwaddr = smap_get(&br->cfg->other_config, "hwaddr");
if (hwaddr && eth_addr_from_string(hwaddr, ea)) {
- if (eth_addr_is_multicast(ea)) {
+ if (eth_addr_is_multicast(*ea)) {
VLOG_ERR("bridge %s: cannot set MAC address to multicast "
- "address "ETH_ADDR_FMT, br->name, ETH_ADDR_ARGS(ea));
- } else if (eth_addr_is_zero(ea)) {
+ "address "ETH_ADDR_FMT, br->name, ETH_ADDR_ARGS(*ea));
+ } else if (eth_addr_is_zero(*ea)) {
VLOG_ERR("bridge %s: cannot set MAC address to zero", br->name);
} else {
return;
* 'hw_addr_iface' must be passed in as a null pointer. */
static uint64_t
bridge_pick_datapath_id(struct bridge *br,
- const uint8_t bridge_ea[ETH_ADDR_LEN],
+ const struct eth_addr bridge_ea,
struct iface *hw_addr_iface)
{
/*
static uint64_t
dpid_from_hash(const void *data, size_t n)
{
- uint8_t hash[SHA1_DIGEST_SIZE];
-
- BUILD_ASSERT_DECL(sizeof hash >= ETH_ADDR_LEN);
- sha1_bytes(data, n, hash);
- eth_addr_mark_random(hash);
- return eth_addr_to_uint64(hash);
+ union {
+ uint8_t bytes[SHA1_DIGEST_SIZE];
+ struct eth_addr ea;
+ } hash;
+
+ sha1_bytes(data, n, hash.bytes);
+ eth_addr_mark_random(&hash.ea);
+ return eth_addr_to_uint64(hash.ea);
}
static void
enum netdev_features current;
enum netdev_flags flags;
const char *link_state;
- uint8_t mac[ETH_ADDR_LEN];
+ struct eth_addr mac;
int64_t bps, mtu_64, ifindex64, link_resets;
int mtu, error;
ovsrec_interface_set_mtu(iface->cfg, NULL, 0);
}
- error = netdev_get_etheraddr(iface->netdev, mac);
+ error = netdev_get_etheraddr(iface->netdev, &mac);
if (!error) {
char mac_string[32];
static void
port_refresh_bond_status(struct port *port, bool force_update)
{
- uint8_t mac[ETH_ADDR_LEN];
+ struct eth_addr mac;
/* Return if port is not a bond */
if (list_is_singleton(&port->ifaces)) {
return;
}
- if (bond_get_changed_active_slave(port->name, mac, force_update)) {
+ if (bond_get_changed_active_slave(port->name, &mac, force_update)) {
struct ds mac_s;
ds_init(&mac_s);
/* Derive the default Ethernet address from the bridge's UUID. This should
* be unique and it will be stable between ovs-vswitchd runs. */
- memcpy(br->default_ea, &br_cfg->header_.uuid, ETH_ADDR_LEN);
- eth_addr_mark_random(br->default_ea);
+ memcpy(&br->default_ea, &br_cfg->header_.uuid, ETH_ADDR_LEN);
+ eth_addr_mark_random(&br->default_ea);
hmap_init(&br->ports);
hmap_init(&br->ifaces);
return NULL;
}
} else {
- memcpy(s->id, port->bridge->ea, ETH_ADDR_LEN);
+ s->id = port->bridge->ea;
}
if (eth_addr_is_zero(s->id)) {
if (!mac_s || !ovs_scan(mac_s, ETH_ADDR_SCAN_FMT,
ETH_ADDR_SCAN_ARGS(s->active_slave_mac))) {
/* OVSDB did not store the last active interface */
- memset(s->active_slave_mac, 0, sizeof(s->active_slave_mac));
+ s->active_slave_mac = eth_addr_zero;
}
}
static void
iface_set_mac(const struct bridge *br, const struct port *port, struct iface *iface)
{
- uint8_t ea[ETH_ADDR_LEN], *mac = NULL;
+ struct eth_addr ea, *mac = NULL;
struct iface *hw_addr_iface;
if (strcmp(iface->type, "internal")) {
return;
}
- if (iface->cfg->mac && eth_addr_from_string(iface->cfg->mac, ea)) {
- mac = ea;
+ if (iface->cfg->mac && eth_addr_from_string(iface->cfg->mac, &ea)) {
+ mac = &ea;
} else if (port->cfg->fake_bridge) {
/* Fake bridge and no MAC set in the configuration. Pick a local one. */
- find_local_hw_addr(br, ea, port, &hw_addr_iface);
- mac = ea;
+ find_local_hw_addr(br, &ea, port, &hw_addr_iface);
+ mac = &ea;
}
if (mac) {
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(mac)) {
+ } 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, mac);
+ int error = netdev_set_etheraddr(iface->netdev, *mac);
if (error) {
VLOG_ERR("interface %s: setting MAC failed (%s)",
iface->name, ovs_strerror(error));