/* State that should be cleared from one connection to the next. */
/* OpenFlow state. */
- enum nx_role role; /* Role. */
+ enum ofp12_controller_role role; /* Role. */
enum ofputil_protocol protocol; /* Current protocol variant. */
enum nx_packet_in_format packet_in_format; /* OFPT_PACKET_IN format. */
static void ofconn_run(struct ofconn *,
bool (*handle_openflow)(struct ofconn *,
- struct ofpbuf *ofp_msg));
+ const struct ofpbuf *ofp_msg));
static void ofconn_wait(struct ofconn *, bool handling_openflow);
static const char *ofconn_get_target(const struct ofconn *);
* fail-open processing) are suppressed too. */
void
connmgr_run(struct connmgr *mgr,
- bool (*handle_openflow)(struct ofconn *, struct ofpbuf *ofp_msg))
+ bool (*handle_openflow)(struct ofconn *,
+ const struct ofpbuf *ofp_msg))
+ OVS_EXCLUDED(ofproto_mutex)
{
struct ofconn *ofconn, *next_ofconn;
struct ofservice *ofservice;
ofconn_set_rate_limit(ofconn, ofservice->rate_limit,
ofservice->burst_limit);
} else if (retval != EAGAIN) {
- VLOG_WARN_RL(&rl, "accept failed (%s)", strerror(retval));
+ VLOG_WARN_RL(&rl, "accept failed (%s)", ovs_strerror(retval));
}
}
if (!retval) {
add_snooper(mgr, vconn);
} else if (retval != EAGAIN) {
- VLOG_WARN_RL(&rl, "accept failed (%s)", strerror(retval));
+ VLOG_WARN_RL(&rl, "accept failed (%s)", ovs_strerror(retval));
}
}
}
continue;
}
- if (stream_parse_target_with_default_ports(target,
- OFP_TCP_PORT,
- OFP_SSL_PORT,
- sin)) {
+ if (stream_parse_target_with_default_port(target,
+ OFP_OLD_PORT,
+ sin)) {
n_addrs++;
}
}
if (!error) {
pvconns[n_pvconns++] = pvconn;
} else {
- VLOG_ERR("failed to listen on %s: %s", name, strerror(error));
+ VLOG_ERR("failed to listen on %s: %s", name, ovs_strerror(error));
if (!retval) {
retval = error;
}
snoop_preference(const struct ofconn *ofconn)
{
switch (ofconn->role) {
- case NX_ROLE_MASTER:
+ case OFPCR12_ROLE_MASTER:
return 3;
- case NX_ROLE_OTHER:
+ case OFPCR12_ROLE_EQUAL:
return 2;
- case NX_ROLE_SLAVE:
+ case OFPCR12_ROLE_SLAVE:
return 1;
+ case OFPCR12_ROLE_NOCHANGE:
default:
/* Shouldn't happen. */
return 0;
return ofconn->type;
}
+/* If a master election id is defined, stores it into '*idp' and returns
+ * true. Otherwise, stores UINT64_MAX into '*idp' and returns false. */
+bool
+ofconn_get_master_election_id(const struct ofconn *ofconn, uint64_t *idp)
+{
+ *idp = (ofconn->connmgr->master_election_id_defined
+ ? ofconn->connmgr->master_election_id
+ : UINT64_MAX);
+ return ofconn->connmgr->master_election_id_defined;
+}
+
/* Sets the master election id.
*
* Returns true if successful, false if the id is stale
/* Returns the role configured for 'ofconn'.
*
- * The default role, if no other role has been set, is NX_ROLE_OTHER. */
-enum nx_role
+ * The default role, if no other role has been set, is OFPCR12_ROLE_EQUAL. */
+enum ofp12_controller_role
ofconn_get_role(const struct ofconn *ofconn)
{
return ofconn->role;
}
-/* Changes 'ofconn''s role to 'role'. If 'role' is NX_ROLE_MASTER then any
- * existing master is demoted to a slave. */
+/* Changes 'ofconn''s role to 'role'. If 'role' is OFPCR12_ROLE_MASTER then
+ * any existing master is demoted to a slave. */
void
-ofconn_set_role(struct ofconn *ofconn, enum nx_role role)
+ofconn_set_role(struct ofconn *ofconn, enum ofp12_controller_role role)
{
- if (role == NX_ROLE_MASTER) {
+ if (role == OFPCR12_ROLE_MASTER) {
struct ofconn *other;
HMAP_FOR_EACH (other, hmap_node, &ofconn->connmgr->controllers) {
- if (other->role == NX_ROLE_MASTER) {
- other->role = NX_ROLE_SLAVE;
+ if (other->role == OFPCR12_ROLE_MASTER) {
+ other->role = OFPCR12_ROLE_SLAVE;
}
}
}
memcpy(ofconn->slave_async_config, slave_masks, size);
}
+void
+ofconn_get_async_config(struct ofconn *ofconn,
+ uint32_t *master_masks, uint32_t *slave_masks)
+{
+ size_t size = sizeof ofconn->master_async_config;
+ memcpy(master_masks, ofconn->master_async_config, size);
+ memcpy(slave_masks, ofconn->slave_async_config, size);
+}
+
/* Sends 'msg' on 'ofconn', accounting it as a reply. (If there is a
* sufficient number of OpenFlow replies in-flight on a single ofconn, then the
* connmgr will stop accepting new OpenFlow requests on that ofconn until the
/* Same as pktbuf_retrieve(), using the pktbuf owned by 'ofconn'. */
enum ofperr
ofconn_pktbuf_retrieve(struct ofconn *ofconn, uint32_t id,
- struct ofpbuf **bufferp, uint16_t *in_port)
+ struct ofpbuf **bufferp, ofp_port_t *in_port)
{
return pktbuf_retrieve(ofconn->pktbuf, id, bufferp, in_port);
}
struct ofmonitor *monitor, *next_monitor;
int i;
- ofconn->role = NX_ROLE_OTHER;
+ ofconn->role = OFPCR12_ROLE_EQUAL;
ofconn_set_protocol(ofconn, OFPUTIL_P_NONE);
ofconn->packet_in_format = NXPIF_OPENFLOW10;
hmap_remove(&ofconn->connmgr->controllers, &ofconn->hmap_node);
}
+ hmap_destroy(&ofconn->monitors);
list_remove(&ofconn->node);
rconn_destroy(ofconn->rconn);
rconn_packet_counter_destroy(ofconn->packet_in_counter);
static void
ofconn_run(struct ofconn *ofconn,
- bool (*handle_openflow)(struct ofconn *, struct ofpbuf *ofp_msg))
+ bool (*handle_openflow)(struct ofconn *,
+ const struct ofpbuf *ofp_msg))
{
struct connmgr *mgr = ofconn->connmgr;
size_t i;
{
const uint32_t *async_config;
- assert(reason < 32);
- assert((unsigned int) type < OAM_N_TYPES);
+ ovs_assert(reason < 32);
+ ovs_assert((unsigned int) type < OAM_N_TYPES);
if (ofconn_get_protocol(ofconn) == OFPUTIL_P_NONE
|| !rconn_is_connected(ofconn->rconn)) {
return false;
}
- async_config = (ofconn->role == NX_ROLE_SLAVE
+ async_config = (ofconn->role == OFPCR12_ROLE_SLAVE
? ofconn->slave_async_config
: ofconn->master_async_config);
if (!(async_config[type] & (1u << reason))) {
/* In-band implementation. */
bool
-connmgr_msg_in_hook(struct connmgr *mgr, const struct flow *flow,
- const struct ofpbuf *packet)
+connmgr_has_in_band(struct connmgr *mgr)
{
- return mgr->in_band && in_band_msg_in_hook(mgr->in_band, flow, packet);
-}
-
-bool
-connmgr_may_set_up_flow(struct connmgr *mgr, const struct flow *flow,
- const struct nlattr *odp_actions,
- size_t actions_len)
-{
- return !mgr->in_band || in_band_rule_check(flow, odp_actions, actions_len);
+ return mgr->in_band != NULL;
}
\f
/* Fail-open and in-band implementation. */
* In-band control has more sophisticated code that manages flows itself. */
void
connmgr_flushed(struct connmgr *mgr)
+ OVS_EXCLUDED(ofproto_mutex)
{
if (mgr->fail_open) {
fail_open_flushed(mgr->fail_open);
ofmonitor_destroy(struct ofmonitor *m)
{
if (m) {
+ minimatch_destroy(&m->match);
hmap_remove(&m->ofconn->monitors, &m->ofconn_node);
free(m);
}
enum nx_flow_update_event event,
enum ofp_flow_removed_reason reason,
const struct ofconn *abbrev_ofconn, ovs_be32 abbrev_xid)
+ OVS_REQUIRES(ofproto_mutex)
{
enum nx_flow_monitor_flags update;
struct ofconn *ofconn;
fu.event = event;
fu.reason = event == NXFME_DELETED ? reason : 0;
- fu.idle_timeout = rule->idle_timeout;
- fu.hard_timeout = rule->hard_timeout;
fu.table_id = rule->table_id;
fu.cookie = rule->flow_cookie;
minimatch_expand(&rule->cr.match, &match);
fu.match = &match;
fu.priority = rule->cr.priority;
+
+ ovs_mutex_lock(&rule->mutex);
+ fu.idle_timeout = rule->idle_timeout;
+ fu.hard_timeout = rule->hard_timeout;
+ ovs_mutex_unlock(&rule->mutex);
+
if (flags & NXFMF_ACTIONS) {
- fu.ofpacts = rule->ofpacts;
- fu.ofpacts_len = rule->ofpacts_len;
+ fu.ofpacts = rule->actions->ofpacts;
+ fu.ofpacts_len = rule->actions->ofpacts_len;
} else {
fu.ofpacts = NULL;
fu.ofpacts_len = 0;
static void
ofmonitor_resume(struct ofconn *ofconn)
{
+ struct rule_collection rules;
struct ofpbuf *resumed;
struct ofmonitor *m;
- struct list rules;
struct list msgs;
- list_init(&rules);
+ rule_collection_init(&rules);
HMAP_FOR_EACH (m, ofconn_node, &ofconn->monitors) {
ofmonitor_collect_resume_rules(m, ofconn->monitor_paused, &rules);
}