/* Add all the remotes. */
HMAP_FOR_EACH (ofconn, hmap_node, &mgr->controllers) {
const char *target = rconn_get_target(ofconn->rconn);
- struct sockaddr_storage ss;
+ union {
+ struct sockaddr_storage ss;
+ struct sockaddr_in in;
+ } sa;
if (ofconn->band == OFPROTO_IN_BAND
- && stream_parse_target_with_default_port(target, OFP_OLD_PORT, &ss)
- && ss.ss_family == AF_INET) {
- addrs[n_addrs++] = *(struct sockaddr_in *) &ss;
+ && stream_parse_target_with_default_port(target, OFP_OLD_PORT,
+ &sa.ss)
+ && sa.ss.ss_family == AF_INET) {
+ addrs[n_addrs++] = sa.in;
}
}
for (i = 0; i < mgr->n_extra_remotes; i++) {
enum ofputil_protocol protocol = ofconn_get_protocol(ofconn);
if (protocol != OFPUTIL_P_NONE
- && ofputil_protocol_to_ofp_version(protocol) >= OFP13_VERSION) {
- enum ofproto_table_config config;
-
- config = ofproto_table_get_config(ofconn->connmgr->ofproto,
- pin->up.table_id);
- if (config == OFPROTO_TABLE_MISS_DEFAULT) {
- return false;
- }
+ && ofputil_protocol_to_ofp_version(protocol) >= OFP13_VERSION
+ && (ofproto_table_get_miss_config(ofconn->connmgr->ofproto,
+ pin->up.table_id)
+ == OFPUTIL_TABLE_MISS_DEFAULT)) {
+ return false;
}
}
return true;
* This logic assumes that "table-miss" packet_in messages
* are always sent to controller_id 0. */
bool
-connmgr_wants_packet_in_on_miss(struct connmgr *mgr)
+connmgr_wants_packet_in_on_miss(struct connmgr *mgr) OVS_EXCLUDED(ofproto_mutex)
{
struct ofconn *ofconn;
+ ovs_mutex_lock(&ofproto_mutex);
LIST_FOR_EACH (ofconn, node, &mgr->all_conns) {
enum ofputil_protocol protocol = ofconn_get_protocol(ofconn);
if (ofconn->controller_id == 0 &&
(protocol == OFPUTIL_P_NONE ||
ofputil_protocol_to_ofp_version(protocol) < OFP13_VERSION)) {
+ ovs_mutex_unlock(&ofproto_mutex);
return true;
}
}
+ ovs_mutex_unlock(&ofproto_mutex);
+
return false;
}