-/* Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks
+/* Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira Networks
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include "jsonrpc.h"
#include "lacp.h"
#include "list.h"
+#include "mac-learning.h"
#include "netdev.h"
#include "ofp-print.h"
#include "ofpbuf.h"
#include "sha1.h"
#include "shash.h"
#include "socket-util.h"
+#include "stream.h"
#include "stream-ssl.h"
#include "sset.h"
#include "system-stats.h"
static void bridge_configure_flow_eviction_threshold(struct bridge *);
static void bridge_configure_netflow(struct bridge *);
static void bridge_configure_forward_bpdu(struct bridge *);
+static void bridge_configure_mac_idle_time(struct bridge *);
static void bridge_configure_sflow(struct bridge *, int *sflow_bridge_number);
static void bridge_configure_stp(struct bridge *);
static void bridge_configure_remotes(struct bridge *,
ovsdb_idl_omit(idl, &ovsrec_ssl_col_external_ids);
/* Register unixctl commands. */
- unixctl_command_register("qos/show", "interface", qos_unixctl_show, NULL);
- unixctl_command_register("bridge/dump-flows", "bridge",
+ unixctl_command_register("qos/show", "interface", 1, 1,
+ qos_unixctl_show, NULL);
+ unixctl_command_register("bridge/dump-flows", "bridge", 1, 1,
bridge_unixctl_dump_flows, NULL);
- unixctl_command_register("bridge/reconnect", "[bridge]",
+ unixctl_command_register("bridge/reconnect", "[bridge]", 0, 1,
bridge_unixctl_reconnect, NULL);
lacp_init();
bond_init();
SSET_FOR_EACH (target, &targets) {
struct sockaddr_in *sin = &managers[n_managers];
- if ((!strncmp(target, "tcp:", 4)
- && inet_parse_active(target + 4, JSONRPC_TCP_PORT, sin)) ||
- (!strncmp(target, "ssl:", 4)
- && inet_parse_active(target + 4, JSONRPC_SSL_PORT, sin))) {
+ if (stream_parse_target_with_default_ports(target,
+ JSONRPC_TCP_PORT,
+ JSONRPC_SSL_PORT,
+ sin)) {
n_managers++;
}
}
* has at least one iface, every "struct iface" has a valid ofp_port and
* netdev. */
HMAP_FOR_EACH_SAFE (br, next, node, &all_bridges) {
- if (!br->ofproto && !bridge_add_ofprotos(br)) {
- bridge_destroy(br);
+ if (!br->ofproto) {
+ if (bridge_add_ofprotos(br)) {
+ bridge_del_ofproto_ports(br);
+ } else {
+ bridge_destroy(br);
+ }
}
}
HMAP_FOR_EACH (br, node, &all_bridges) {
bridge_configure_mirrors(br);
bridge_configure_flow_eviction_threshold(br);
bridge_configure_forward_bpdu(br);
+ bridge_configure_mac_idle_time(br);
bridge_configure_remotes(br, managers, n_managers);
bridge_configure_netflow(br);
bridge_configure_sflow(br, &sflow_bridge_number);
/* We already reported a related error, don't bother
* duplicating it. */
}
+ if (!ofproto_port_query_by_name(br->ofproto, port->name,
+ &ofproto_port)) {
+ ofproto_port_del(br->ofproto, ofproto_port.ofp_port);
+ ofproto_port_destroy(&ofproto_port);
+ }
iface_clear_db_record(iface->cfg);
iface_destroy(iface);
}
ofproto_set_forward_bpdu(br->ofproto, forward_bpdu);
}
+/* Set MAC aging time for 'br'. */
+static void
+bridge_configure_mac_idle_time(struct bridge *br)
+{
+ const char *idle_time_str;
+ int idle_time;
+
+ idle_time_str = bridge_get_other_config(br->cfg, "mac-aging-time");
+ idle_time = (idle_time_str && atoi(idle_time_str)
+ ? atoi(idle_time_str)
+ : MAC_ENTRY_DEFAULT_IDLE_TIME);
+ ofproto_set_mac_idle_time(br->ofproto, idle_time);
+}
+
static void
bridge_pick_local_hw_addr(struct bridge *br, uint8_t ea[ETH_ADDR_LEN],
struct iface **hw_addr_iface)
}
static void
-qos_unixctl_show(struct unixctl_conn *conn,
- const char *args, void *aux OVS_UNUSED)
+qos_unixctl_show(struct unixctl_conn *conn, int argc OVS_UNUSED,
+ const char *argv[], void *aux OVS_UNUSED)
{
struct ds ds = DS_EMPTY_INITIALIZER;
struct shash sh = SHASH_INITIALIZER(&sh);
struct qos_unixctl_show_cbdata data;
int error;
- iface = iface_find(args);
+ iface = iface_find(argv[1]);
if (!iface) {
unixctl_command_reply(conn, 501, "no such interface");
return;
/* Handle requests for a listing of all flows known by the OpenFlow
* stack, including those normally hidden. */
static void
-bridge_unixctl_dump_flows(struct unixctl_conn *conn,
- const char *args, void *aux OVS_UNUSED)
+bridge_unixctl_dump_flows(struct unixctl_conn *conn, int argc OVS_UNUSED,
+ const char *argv[], void *aux OVS_UNUSED)
{
struct bridge *br;
struct ds results;
- br = bridge_lookup(args);
+ br = bridge_lookup(argv[1]);
if (!br) {
unixctl_command_reply(conn, 501, "Unknown bridge");
return;
* connections and reconnect. If BRIDGE is not specified, then all bridges
* drop their controller connections and reconnect. */
static void
-bridge_unixctl_reconnect(struct unixctl_conn *conn,
- const char *args, void *aux OVS_UNUSED)
+bridge_unixctl_reconnect(struct unixctl_conn *conn, int argc,
+ const char *argv[], void *aux OVS_UNUSED)
{
struct bridge *br;
- if (args[0] != '\0') {
- br = bridge_lookup(args);
+ if (argc > 1) {
+ br = bridge_lookup(argv[1]);
if (!br) {
unixctl_command_reply(conn, 501, "Unknown bridge");
return;
s->name = port->name;
s->balance = BM_SLB;
- if (port->cfg->bond_mode
- && !bond_mode_from_string(&s->balance, port->cfg->bond_mode)) {
- VLOG_WARN("port %s: unknown bond_mode %s, defaulting to %s",
- port->name, port->cfg->bond_mode,
- bond_mode_to_string(s->balance));
+ if (port->cfg->bond_mode) {
+ if (!bond_mode_from_string(&s->balance, port->cfg->bond_mode)) {
+ VLOG_WARN("port %s: unknown bond_mode %s, defaulting to %s",
+ port->name, port->cfg->bond_mode,
+ bond_mode_to_string(s->balance));
+ }
+ } else {
+ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
+
+ /* XXX: Post version 1.4.*, change the default bond_mode to
+ * active-backup. Until then, warn that the change is imminent. */
+ VLOG_WARN_RL(&rl, "port %s: Using the default bond_mode %s. Note that"
+ " in future versions, the default bond_mode is expected"
+ " to change to active-backup", port->name,
+ bond_mode_to_string(s->balance));
}
if (s->balance == BM_SLB && port->bridge->cfg->n_flood_vlans) {
VLOG_WARN("port %s: SLB bonds are incompatible with flood_vlans, "
if (!queue_zero) {
static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
VLOG_WARN_RL(&rl, "interface %s: QoS configured without a default "
- "queue (queue 0). Packets not directed to a "
- "correctly configured queue may be dropped.",
+ "queue (queue 0). Using default configuration.",
iface->name);
+
+ shash_init(&details);
+ netdev_set_queue(iface->netdev, 0, &details);
+ shash_destroy(&details);
}
}
* in the process of reconstructing all of them. */
free_registered_blocks();
- splinter_vlans = NULL;
+ splinter_vlans = bitmap_allocate(4096);
sset_init(&splinter_ifaces);
+ vlan_splinters_enabled_anywhere = false;
for (i = 0; i < ovs_cfg->n_bridges; i++) {
struct ovsrec_bridge *br_cfg = ovs_cfg->bridges[i];
size_t j;
struct ovsrec_interface *iface_cfg = port_cfg->interfaces[k];
if (vlan_splinters_is_enabled(iface_cfg)) {
+ vlan_splinters_enabled_anywhere = true;
sset_add(&splinter_ifaces, iface_cfg->name);
-
- if (!splinter_vlans) {
- splinter_vlans = bitmap_allocate(4096);
- }
vlan_bitmap_from_array__(port_cfg->trunks,
port_cfg->n_trunks,
splinter_vlans);
}
}
+
+ if (port_cfg->tag && *port_cfg->tag > 0 && *port_cfg->tag < 4095) {
+ bitmap_set1(splinter_vlans, *port_cfg->tag);
+ }
}
}
- vlan_splinters_enabled_anywhere = splinter_vlans != NULL;
- if (!splinter_vlans) {
+ if (!vlan_splinters_enabled_anywhere) {
+ free(splinter_vlans);
sset_destroy(&splinter_ifaces);
return NULL;
}