int probe_interval; /* Secs of inactivity before sending probe. */
time_t last_activity; /* Last time we saw some activity. */
- /* When we create a vconn we obtain these values, to save them past the end
- * of the vconn's lifetime. Otherwise, in-band control will only allow
- * traffic when a vconn is actually open, but it is nice to allow ARP to
- * complete even between connection attempts, and it is also polite to
- * allow traffic from other switches to go through to the controller
- * whether or not we are connected.
- *
- * We don't cache the local port, because that changes from one connection
- * attempt to the next. */
- ovs_be32 local_ip, remote_ip;
- ovs_be16 remote_port;
uint8_t dscp;
/* Messages sent or received are copied to the monitor connections. */
retval = vconn_open(rc->target, rc->allowed_versions, rc->dscp,
&rc->vconn);
if (!retval) {
- rc->remote_ip = vconn_get_remote_ip(rc->vconn);
- rc->local_ip = vconn_get_local_ip(rc->vconn);
- rc->remote_port = vconn_get_remote_port(rc->vconn);
rc->backoff_deadline = time_now() + rc->backoff;
state_transition(rc, S_CONNECTING);
} else {
STATES
#undef STATE
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
} while (rc->state != old_state);
ovs_mutex_unlock(&rc->mutex);
return duration;
}
-/* Returns the IP address of the peer, or 0 if the peer's IP address is not
- * known. */
-ovs_be32
-rconn_get_remote_ip(const struct rconn *rconn)
-{
- return rconn->remote_ip;
-}
-
-/* Returns the transport port of the peer, or 0 if the peer's port is not
- * known. */
-ovs_be16
-rconn_get_remote_port(const struct rconn *rconn)
-{
- return rconn->remote_port;
-}
-
-/* Returns the IP address used to connect to the peer, or 0 if the
- * connection is not an IP-based protocol or if its IP address is not
- * known. */
-ovs_be32
-rconn_get_local_ip(const struct rconn *rconn)
-{
- return rconn->local_ip;
-}
-
-/* Returns the transport port used to connect to the peer, or 0 if the
- * connection does not contain a port or if the port is not known. */
-ovs_be16
-rconn_get_local_port(const struct rconn *rconn)
- OVS_EXCLUDED(rconn->mutex)
-{
- ovs_be16 port;
-
- ovs_mutex_lock(&rconn->mutex);
- port = rconn->vconn ? vconn_get_local_port(rconn->vconn) : 0;
- ovs_mutex_unlock(&rconn->mutex);
-
- return port;
-}
-
static int
rconn_get_version__(const struct rconn *rconn)
OVS_REQUIRES(rconn->mutex)
rc->name = xstrdup(name ? name : target);
free(rc->target);
rc->target = xstrdup(target);
- rc->local_ip = 0;
- rc->remote_ip = 0;
- rc->remote_port = 0;
}
/* Tries to send a packet from 'rc''s send buffer. Returns 0 if successful,
STATES
#undef STATE
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
return (state & (S_ACTIVE | S_IDLE)) != 0;
}
+/* When a switch initially connects to a controller, the controller may spend a
+ * little time examining the switch, looking at, for example, its datapath ID,
+ * before it decides whether it is willing to control that switch. At that
+ * point, it either disconnects or starts controlling the switch.
+ *
+ * This function returns a guess to its caller about whether 'b' is OpenFlow
+ * message that indicates that the controller has decided to control the
+ * switch. It returns false if the message is one that a controller typically
+ * uses to determine whether a switch is admissible, true if the message is one
+ * that would typically be used only after the controller has admitted the
+ * switch. */
static bool
is_admitted_msg(const struct ofpbuf *b)
{
case OFPTYPE_GET_CONFIG_REQUEST:
case OFPTYPE_GET_CONFIG_REPLY:
case OFPTYPE_SET_CONFIG:
- /* FIXME: Change the following once they are implemented: */
case OFPTYPE_QUEUE_GET_CONFIG_REQUEST:
case OFPTYPE_QUEUE_GET_CONFIG_REPLY:
case OFPTYPE_GET_ASYNC_REQUEST:
case OFPTYPE_METER_FEATURES_STATS_REPLY:
case OFPTYPE_ROLE_REQUEST:
case OFPTYPE_ROLE_REPLY:
+ case OFPTYPE_ROLE_STATUS:
case OFPTYPE_SET_FLOW_FORMAT:
case OFPTYPE_FLOW_MOD_TABLE_ID:
case OFPTYPE_SET_PACKET_IN_FORMAT: