void
ofputil_wildcard_from_ofpfw10(uint32_t ofpfw, struct flow_wildcards *wc)
{
- BUILD_ASSERT_DECL(FLOW_WC_SEQ == 22);
+ BUILD_ASSERT_DECL(FLOW_WC_SEQ == 24);
/* Initialize most of wc. */
flow_wildcards_init_catchall(wc);
match->wc.masks.vlan_tci = htons(0xffff);
} else {
ovs_be16 vid, pcp, tci;
+ uint16_t hpcp;
vid = ofmatch->dl_vlan & htons(VLAN_VID_MASK);
- pcp = htons((ofmatch->dl_vlan_pcp << VLAN_PCP_SHIFT) & VLAN_PCP_MASK);
+ hpcp = (ofmatch->dl_vlan_pcp << VLAN_PCP_SHIFT) & VLAN_PCP_MASK;
+ pcp = htons(hpcp);
tci = vid | pcp | htons(VLAN_CFI);
match->flow.vlan_tci = tci & match->wc.masks.vlan_tci;
}
}
if (eth_type_mpls(match->flow.dl_type)) {
- enum { OFPFW11_MPLS_ALL = OFPFW11_MPLS_LABEL | OFPFW11_MPLS_TC };
-
- if ((wc & OFPFW11_MPLS_ALL) != OFPFW11_MPLS_ALL) {
- /* MPLS not supported. */
- return OFPERR_OFPBMC_BAD_TAG;
+ if (!(wc & OFPFW11_MPLS_LABEL)) {
+ match_set_mpls_label(match, 0, ofmatch->mpls_label);
+ }
+ if (!(wc & OFPFW11_MPLS_TC)) {
+ match_set_mpls_tc(match, 0, ofmatch->mpls_tc);
}
}
ofmatch->tp_dst = match->flow.tp_dst;
}
- /* MPLS not supported. */
- wc |= OFPFW11_MPLS_LABEL;
- wc |= OFPFW11_MPLS_TC;
+ if (!(match->wc.masks.mpls_lse[0] & htonl(MPLS_LABEL_MASK))) {
+ wc |= OFPFW11_MPLS_LABEL;
+ } else {
+ ofmatch->mpls_label = htonl(mpls_lse_to_label(
+ match->flow.mpls_lse[0]));
+ }
+
+ if (!(match->wc.masks.mpls_lse[0] & htonl(MPLS_TC_MASK))) {
+ wc |= OFPFW11_MPLS_TC;
+ } else {
+ ofmatch->mpls_tc = mpls_lse_to_tc(match->flow.mpls_lse[0]);
+ }
ofmatch->metadata = match->flow.metadata;
ofmatch->metadata_mask = ~match->wc.masks.metadata;
return NXM_TYPICAL_LEN;
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
case OFPUTIL_P_OF10_STD_TID:
case OFPUTIL_P_OF10_NXM:
case OFPUTIL_P_OF10_NXM_TID:
- NOT_REACHED();
+ OVS_NOT_REACHED();
case OFPUTIL_P_OF11_STD: {
struct ofp11_match *om;
return oxm_put_match(b, match);
}
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
/* Given a 'dl_type' value in the format used in struct flow, returns the
return OFP13_VERSION;
}
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
/* Returns a bitmap of OpenFlow versions that are supported by at
return OFPUTIL_P_OF13_OXM;
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
return ofputil_protocol_set_tid(OFPUTIL_P_OF13_OXM, tid);
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
goto match;
}
}
- NOT_REACHED();
+ OVS_NOT_REACHED();
match: ;
}
case OFP13_VERSION:
return "OpenFlow13";
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
case NXPIF_NXM:
return "nxm";
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
case OFPUTIL_P_OF13_OXM:
/* There is only one variant of each OpenFlow 1.1+ protocol, and we
* verified above that we're not trying to change versions. */
- NOT_REACHED();
+ OVS_NOT_REACHED();
case OFPUTIL_P_OF10_STD_TID:
case OFPUTIL_P_OF10_NXM_TID:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
case NXFF_NXM:
return "nxm";
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
ofputil_decode_flow_mod(struct ofputil_flow_mod *fm,
const struct ofp_header *oh,
enum ofputil_protocol protocol,
- struct ofpbuf *ofpacts)
+ struct ofpbuf *ofpacts,
+ ofp_port_t max_port, uint8_t max_table)
{
ovs_be16 raw_flags;
enum ofperr error;
/* Get table ID.
*
- * OF1.1 entirely forbids table_id == 255.
- * OF1.2+ allows table_id == 255 only for deletes. */
+ * OF1.1 entirely forbids table_id == OFPTT_ALL.
+ * OF1.2+ allows table_id == OFPTT_ALL only for deletes. */
fm->table_id = ofm->table_id;
- if (fm->table_id == 255
+ if (fm->table_id == OFPTT_ALL
&& (oh->version == OFP11_VERSION
|| (ofm->command != OFPFC_DELETE &&
ofm->command != OFPFC_DELETE_STRICT))) {
if (error) {
return error;
}
- fm->out_group = ntohl(ofm->out_group);
- if ((ofm->command == OFPFC_DELETE
- || ofm->command == OFPFC_DELETE_STRICT)
- && ofm->out_group != htonl(OFPG_ANY)) {
- return OFPERR_OFPFMFC_UNKNOWN;
- }
+ fm->out_group = (ofm->command == OFPFC_DELETE ||
+ ofm->command == OFPFC_DELETE_STRICT
+ ? ntohl(ofm->out_group)
+ : OFPG11_ANY);
raw_flags = ofm->flags;
} else {
uint16_t command;
fm->out_group = OFPG11_ANY;
raw_flags = nfm->flags;
} else {
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
fm->modify_cookie = fm->new_cookie != OVS_BE64_MAX;
: OFPERR_OFPFMFC_TABLE_FULL);
}
- return 0;
+ return ofpacts_check_consistency(fm->ofpacts, fm->ofpacts_len,
+ &fm->match.flow, max_port,
+ fm->table_id, max_table, protocol);
}
static enum ofperr
}
mb = ofpbuf_put_uninit(bands, sizeof *mb);
mb->type = ntohs(ombh->type);
+ if (mb->type != OFPMBT13_DROP && mb->type != OFPMBT13_DSCP_REMARK) {
+ return OFPERR_OFPMMFC_BAD_BAND;
+ }
mb->rate = ntohl(ombh->rate);
mb->burst_size = ntohl(ombh->burst_size);
mb->prec_level = (mb->type == OFPMBT13_DSCP_REMARK) ?
/* Translate the message. */
mm->command = ntohs(omm->command);
+ if (mm->command != OFPMC13_ADD &&
+ mm->command != OFPMC13_MODIFY &&
+ mm->command != OFPMC13_DELETE) {
+ return OFPERR_OFPMMFC_BAD_COMMAND;
+ }
mm->meter.meter_id = ntohl(omm->meter_id);
if (mm->command == OFPMC13_DELETE) {
enum ofperr error;
mm->meter.flags = ntohs(omm->flags);
+ if (mm->meter.flags & OFPMF13_KBPS &&
+ mm->meter.flags & OFPMF13_PKTPS) {
+ return OFPERR_OFPMMFC_BAD_FLAGS;
+ }
mm->meter.bands = bands->data;
error = ofputil_pull_bands(&b, b.size, &mm->meter.n_bands, bands);
omc = ofpbuf_try_pull(msg, sizeof *omc);
if (!omc) {
VLOG_WARN_RL(&bad_ofmsg_rl,
- "OFPMP_METER_CONFIG reply has %zu leftover bytes at end",
+ "OFPMP_METER_CONFIG reply has %"PRIuSIZE" leftover bytes at end",
msg->size);
return OFPERR_OFPBRC_BAD_LEN;
}
oms = ofpbuf_try_pull(msg, sizeof *oms);
if (!oms) {
VLOG_WARN_RL(&bad_ofmsg_rl,
- "OFPMP_METER reply has %zu leftover bytes at end",
+ "OFPMP_METER reply has %"PRIuSIZE" leftover bytes at end",
msg->size);
return OFPERR_OFPBRC_BAD_LEN;
}
ofm->cookie = fm->cookie;
}
ofm->cookie_mask = fm->cookie_mask;
- if (fm->table_id != 255
+ if (fm->table_id != OFPTT_ALL
|| (protocol != OFPUTIL_P_OF11_STD
&& (fm->command == OFPFC_DELETE ||
fm->command == OFPFC_DELETE_STRICT))) {
}
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
ofpmsg_update_length(msg);
return ofputil_port_from_ofp11(qgcr11->port, port);
}
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
/* Constructs and returns the beginning of a reply to
break;
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
return reply;
return ofputil_port_from_ofp11(qgcr11->port, port);
}
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
static enum ofperr
default:
/* Hey, the caller lied. */
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
}
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
return msg;
ofs = ofpbuf_try_pull(msg, sizeof *ofs);
if (!ofs) {
- VLOG_WARN_RL(&bad_ofmsg_rl, "OFPST_FLOW reply has %zu leftover "
+ VLOG_WARN_RL(&bad_ofmsg_rl, "OFPST_FLOW reply has %"PRIuSIZE" leftover "
"bytes at end", msg->size);
return EINVAL;
}
length = ntohs(ofs->length);
if (length < sizeof *ofs) {
VLOG_WARN_RL(&bad_ofmsg_rl, "OFPST_FLOW reply claims invalid "
- "length %zu", length);
+ "length %"PRIuSIZE, length);
return EINVAL;
}
ofs = ofpbuf_try_pull(msg, sizeof *ofs);
if (!ofs) {
- VLOG_WARN_RL(&bad_ofmsg_rl, "OFPST_FLOW reply has %zu leftover "
+ VLOG_WARN_RL(&bad_ofmsg_rl, "OFPST_FLOW reply has %"PRIuSIZE" leftover "
"bytes at end", msg->size);
return EINVAL;
}
length = ntohs(ofs->length);
if (length < sizeof *ofs) {
VLOG_WARN_RL(&bad_ofmsg_rl, "OFPST_FLOW reply claims invalid "
- "length %zu", length);
+ "length %"PRIuSIZE, length);
return EINVAL;
}
nfs = ofpbuf_try_pull(msg, sizeof *nfs);
if (!nfs) {
- VLOG_WARN_RL(&bad_ofmsg_rl, "NXST_FLOW reply has %zu leftover "
+ VLOG_WARN_RL(&bad_ofmsg_rl, "NXST_FLOW reply has %"PRIuSIZE" leftover "
"bytes at end", msg->size);
return EINVAL;
}
length = ntohs(nfs->length);
match_len = ntohs(nfs->match_len);
if (length < sizeof *nfs + ROUND_UP(match_len, 8)) {
- VLOG_WARN_RL(&bad_ofmsg_rl, "NXST_FLOW reply with match_len=%zu "
- "claims invalid length %zu", match_len, length);
+ VLOG_WARN_RL(&bad_ofmsg_rl, "NXST_FLOW reply with match_len=%"PRIuSIZE" "
+ "claims invalid length %"PRIuSIZE, match_len, length);
return EINVAL;
}
if (nx_pull_match(msg, match_len, &fs->match, NULL, NULL)) {
fs->byte_count = ntohll(nfs->byte_count);
fs->flags = 0;
} else {
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
fs->ofpacts = ofpacts->data;
nfs->packet_count = htonll(fs->packet_count);
nfs->byte_count = htonll(fs->byte_count);
} else {
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
ofpmp_postappend(replies, start_ofs);
fr->packet_count = ntohll(nfr->packet_count);
fr->byte_count = ntohll(nfr->byte_count);
} else {
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
return 0;
}
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
return msg;
pin->reason = opi->reason;
pin->buffer_id = ntohl(opi->buffer_id);
pin->total_len = ntohs(opi->total_len);
+ } else if (raw == OFPRAW_OFPT11_PACKET_IN) {
+ const struct ofp11_packet_in *opi;
+ enum ofperr error;
+
+ opi = ofpbuf_pull(&b, sizeof *opi);
+
+ pin->packet = b.data;
+ pin->packet_len = b.size;
+
+ pin->buffer_id = ntohl(opi->buffer_id);
+ error = ofputil_port_from_ofp11(opi->in_port, &pin->fmd.in_port);
+ if (error) {
+ return error;
+ }
+ pin->total_len = ntohs(opi->total_len);
+ pin->reason = opi->reason;
+ pin->table_id = opi->table_id;
} else if (raw == OFPRAW_NXT_PACKET_IN) {
const struct nx_packet_in *npi;
struct match match;
ofputil_decode_packet_in_finish(pin, &match, &b);
} else {
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
return 0;
match_set_in_port(match, pin->fmd.in_port);
}
+static struct ofpbuf *
+ofputil_encode_ofp10_packet_in(const struct ofputil_packet_in *pin)
+{
+ struct ofp10_packet_in *opi;
+ struct ofpbuf *packet;
+
+ packet = ofpraw_alloc_xid(OFPRAW_OFPT10_PACKET_IN, OFP10_VERSION,
+ htonl(0), pin->packet_len);
+ opi = ofpbuf_put_zeros(packet, offsetof(struct ofp10_packet_in, data));
+ opi->total_len = htons(pin->total_len);
+ opi->in_port = htons(ofp_to_u16(pin->fmd.in_port));
+ opi->reason = pin->reason;
+ opi->buffer_id = htonl(pin->buffer_id);
+
+ ofpbuf_put(packet, pin->packet, pin->packet_len);
+
+ return packet;
+}
+
+static struct ofpbuf *
+ofputil_encode_nx_packet_in(const struct ofputil_packet_in *pin)
+{
+ struct nx_packet_in *npi;
+ struct ofpbuf *packet;
+ struct match match;
+ size_t match_len;
+
+ ofputil_packet_in_to_match(pin, &match);
+
+ /* The final argument is just an estimate of the space required. */
+ packet = ofpraw_alloc_xid(OFPRAW_NXT_PACKET_IN, OFP10_VERSION,
+ htonl(0), (sizeof(struct flow_metadata) * 2
+ + 2 + pin->packet_len));
+ ofpbuf_put_zeros(packet, sizeof *npi);
+ match_len = nx_put_match(packet, &match, 0, 0);
+ ofpbuf_put_zeros(packet, 2);
+ ofpbuf_put(packet, pin->packet, pin->packet_len);
+
+ npi = packet->l3;
+ npi->buffer_id = htonl(pin->buffer_id);
+ npi->total_len = htons(pin->total_len);
+ npi->reason = pin->reason;
+ npi->table_id = pin->table_id;
+ npi->cookie = pin->cookie;
+ npi->match_len = htons(match_len);
+
+ return packet;
+}
+
+static struct ofpbuf *
+ofputil_encode_ofp11_packet_in(const struct ofputil_packet_in *pin)
+{
+ struct ofp11_packet_in *opi;
+ struct ofpbuf *packet;
+
+ packet = ofpraw_alloc_xid(OFPRAW_OFPT11_PACKET_IN, OFP11_VERSION,
+ htonl(0), pin->packet_len);
+ opi = ofpbuf_put_zeros(packet, sizeof *opi);
+ opi->buffer_id = htonl(pin->buffer_id);
+ opi->in_port = ofputil_port_to_ofp11(pin->fmd.in_port);
+ opi->in_phy_port = opi->in_port;
+ opi->total_len = htons(pin->total_len);
+ opi->reason = pin->reason;
+ opi->table_id = pin->table_id;
+
+ ofpbuf_put(packet, pin->packet, pin->packet_len);
+
+ return packet;
+}
+
+static struct ofpbuf *
+ofputil_encode_ofp12_packet_in(const struct ofputil_packet_in *pin,
+ enum ofputil_protocol protocol)
+{
+ struct ofp13_packet_in *opi;
+ struct match match;
+ enum ofpraw packet_in_raw;
+ enum ofp_version packet_in_version;
+ size_t packet_in_size;
+ struct ofpbuf *packet;
+
+ if (protocol == OFPUTIL_P_OF12_OXM) {
+ packet_in_raw = OFPRAW_OFPT12_PACKET_IN;
+ packet_in_version = OFP12_VERSION;
+ packet_in_size = sizeof (struct ofp12_packet_in);
+ } else {
+ packet_in_raw = OFPRAW_OFPT13_PACKET_IN;
+ packet_in_version = OFP13_VERSION;
+ packet_in_size = sizeof (struct ofp13_packet_in);
+ }
+
+ ofputil_packet_in_to_match(pin, &match);
+
+ /* The final argument is just an estimate of the space required. */
+ packet = ofpraw_alloc_xid(packet_in_raw, packet_in_version,
+ htonl(0), (sizeof(struct flow_metadata) * 2
+ + 2 + pin->packet_len));
+ ofpbuf_put_zeros(packet, packet_in_size);
+ oxm_put_match(packet, &match);
+ ofpbuf_put_zeros(packet, 2);
+ ofpbuf_put(packet, pin->packet, pin->packet_len);
+
+ opi = packet->l3;
+ opi->pi.buffer_id = htonl(pin->buffer_id);
+ opi->pi.total_len = htons(pin->total_len);
+ opi->pi.reason = pin->reason;
+ opi->pi.table_id = pin->table_id;
+ if (protocol == OFPUTIL_P_OF13_OXM) {
+ opi->cookie = pin->cookie;
+ }
+
+ return packet;
+}
+
/* Converts abstract ofputil_packet_in 'pin' into a PACKET_IN message
* in the format specified by 'packet_in_format'. */
struct ofpbuf *
{
struct ofpbuf *packet;
- /* Add OFPT_PACKET_IN. */
- if (protocol == OFPUTIL_P_OF13_OXM || protocol == OFPUTIL_P_OF12_OXM) {
- struct ofp13_packet_in *opi;
- struct match match;
- enum ofpraw packet_in_raw;
- enum ofp_version packet_in_version;
- size_t packet_in_size;
+ switch (protocol) {
+ case OFPUTIL_P_OF10_STD:
+ case OFPUTIL_P_OF10_STD_TID:
+ case OFPUTIL_P_OF10_NXM:
+ case OFPUTIL_P_OF10_NXM_TID:
+ packet = (packet_in_format == NXPIF_NXM
+ ? ofputil_encode_nx_packet_in(pin)
+ : ofputil_encode_ofp10_packet_in(pin));
+ break;
- if (protocol == OFPUTIL_P_OF12_OXM) {
- packet_in_raw = OFPRAW_OFPT12_PACKET_IN;
- packet_in_version = OFP12_VERSION;
- packet_in_size = sizeof (struct ofp12_packet_in);
- } else {
- packet_in_raw = OFPRAW_OFPT13_PACKET_IN;
- packet_in_version = OFP13_VERSION;
- packet_in_size = sizeof (struct ofp13_packet_in);
- }
+ case OFPUTIL_P_OF11_STD:
+ packet = ofputil_encode_ofp11_packet_in(pin);
+ break;
- ofputil_packet_in_to_match(pin, &match);
-
- /* The final argument is just an estimate of the space required. */
- packet = ofpraw_alloc_xid(packet_in_raw, packet_in_version,
- htonl(0), (sizeof(struct flow_metadata) * 2
- + 2 + pin->packet_len));
- ofpbuf_put_zeros(packet, packet_in_size);
- oxm_put_match(packet, &match);
- ofpbuf_put_zeros(packet, 2);
- ofpbuf_put(packet, pin->packet, pin->packet_len);
-
- opi = packet->l3;
- opi->pi.buffer_id = htonl(pin->buffer_id);
- opi->pi.total_len = htons(pin->total_len);
- opi->pi.reason = pin->reason;
- opi->pi.table_id = pin->table_id;
- if (protocol == OFPUTIL_P_OF13_OXM) {
- opi->cookie = pin->cookie;
- }
- } else if (packet_in_format == NXPIF_OPENFLOW10) {
- struct ofp10_packet_in *opi;
-
- packet = ofpraw_alloc_xid(OFPRAW_OFPT10_PACKET_IN, OFP10_VERSION,
- htonl(0), pin->packet_len);
- opi = ofpbuf_put_zeros(packet, offsetof(struct ofp10_packet_in, data));
- opi->total_len = htons(pin->total_len);
- opi->in_port = htons(ofp_to_u16(pin->fmd.in_port));
- opi->reason = pin->reason;
- opi->buffer_id = htonl(pin->buffer_id);
-
- ofpbuf_put(packet, pin->packet, pin->packet_len);
- } else if (packet_in_format == NXPIF_NXM) {
- struct nx_packet_in *npi;
- struct match match;
- size_t match_len;
-
- ofputil_packet_in_to_match(pin, &match);
-
- /* The final argument is just an estimate of the space required. */
- packet = ofpraw_alloc_xid(OFPRAW_NXT_PACKET_IN, OFP10_VERSION,
- htonl(0), (sizeof(struct flow_metadata) * 2
- + 2 + pin->packet_len));
- ofpbuf_put_zeros(packet, sizeof *npi);
- match_len = nx_put_match(packet, &match, 0, 0);
- ofpbuf_put_zeros(packet, 2);
- ofpbuf_put(packet, pin->packet, pin->packet_len);
-
- npi = packet->l3;
- npi->buffer_id = htonl(pin->buffer_id);
- npi->total_len = htons(pin->total_len);
- npi->reason = pin->reason;
- npi->table_id = pin->table_id;
- npi->cookie = pin->cookie;
- npi->match_len = htons(match_len);
- } else {
- NOT_REACHED();
+ case OFPUTIL_P_OF12_OXM:
+ case OFPUTIL_P_OF13_OXM:
+ packet = ofputil_encode_ofp12_packet_in(pin, protocol);
+ break;
+
+ default:
+ OVS_NOT_REACHED();
}
- ofpmsg_update_length(packet);
+ ofpmsg_update_length(packet);
return packet;
}
return error;
}
} else {
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
if (ofp_to_u16(po->in_port) >= ofp_to_u16(OFPP_MAX)
ovs_strlcpy(pp->name, op->name, OFP_MAX_PORT_NAME_LEN);
pp->config = ntohl(op->config) & OFPPC11_ALL;
- pp->state = ntohl(op->state) & OFPPC11_ALL;
+ pp->state = ntohl(op->state) & OFPPS11_ALL;
pp->curr = netdev_port_features_from_ofp11(op->curr);
pp->advertised = netdev_port_features_from_ofp11(op->advertised);
case OFP13_VERSION:
return sizeof(struct ofp11_port);
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
}
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
}
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
\f
raw = OFPRAW_OFPT13_FEATURES_REPLY;
break;
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
b = ofpraw_alloc_xid(raw, version, xid, 0);
osf = ofpbuf_put_zeros(b, sizeof *osf);
}
break;
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
return b;
break;
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
b = ofpraw_alloc_xid(raw, version, htonl(0), 0);
break;
}
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
return b;
break;
}
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
return b;
rr->have_generation_id = false;
rr->generation_id = 0;
} else {
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
return 0;
nrr = ofpbuf_put_zeros(buf, sizeof *nrr);
nrr->role = htonl(rr->role - 1);
} else {
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
return buf;
break;
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
nfmr = ofpbuf_try_pull(msg, sizeof *nfmr);
if (!nfmr) {
- VLOG_WARN_RL(&bad_ofmsg_rl, "NXST_FLOW_MONITOR request has %zu "
+ VLOG_WARN_RL(&bad_ofmsg_rl, "NXST_FLOW_MONITOR request has %"PRIuSIZE" "
"leftover bytes at end", msg->size);
return OFPERR_OFPBRC_BAD_LEN;
}
}
bad_len:
- VLOG_WARN_RL(&bad_ofmsg_rl, "NXST_FLOW_MONITOR reply has %zu "
+ VLOG_WARN_RL(&bad_ofmsg_rl, "NXST_FLOW_MONITOR reply has %"PRIuSIZE" "
"leftover bytes at end", msg->size);
return OFPERR_OFPBRC_BAD_LEN;
}
}
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
if (po->buffer_id == UINT32_MAX) {
break;
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
return ofpraw_alloc(type, ofp_version, 0);
case OFPC_FRAG_NX_MATCH: return "nx-match";
}
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
bool
return op ? ofputil_decode_ofp11_port(pp, op) : EOF;
}
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
{
switch (code) {
case OFPUTIL_ACTION_INVALID:
- NOT_REACHED();
+ OVS_NOT_REACHED();
#define OFPAT10_ACTION(ENUM, STRUCT, NAME) \
case OFPUTIL_##ENUM: return ofputil_put_##ENUM(buf);
case OFPUTIL_##ENUM: return ofputil_put_##ENUM(buf);
#include "ofp-util.def"
}
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
#define OFPAT10_ACTION(ENUM, STRUCT, NAME) \
wc.masks.nd_target = in6addr_any;
}
if (!(may_match & MAY_MPLS)) {
- wc.masks.mpls_lse = htonl(0);
+ memset(wc.masks.mpls_lse, 0, sizeof wc.masks.mpls_lse);
}
/* Log any changes. */
break;
}
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
return request;
}
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
case OFP13_VERSION:
return sizeof(struct ofp13_port_stats);
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
}
return ofputil_port_stats_from_ofp10(ps, ps10);
} else {
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
bad_len:
- VLOG_WARN_RL(&bad_ofmsg_rl, "OFPST_PORT reply has %zu leftover "
+ VLOG_WARN_RL(&bad_ofmsg_rl, "OFPST_PORT reply has %"PRIuSIZE" leftover "
"bytes at end", msg->size);
return OFPERR_OFPBRC_BAD_LEN;
}
}
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
break;
}
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
return request;
break;
}
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
return request;
case OFP10_VERSION:
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
break;
}
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
return request;
ogs11 = NULL;
}
} else {
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
if (!ogs11) {
- VLOG_WARN_RL(&bad_ofmsg_rl, "%s reply has %zu leftover bytes at end",
+ VLOG_WARN_RL(&bad_ofmsg_rl, "%s reply has %"PRIuSIZE" leftover bytes at end",
ofpraw_get_name(raw), msg->size);
return OFPERR_OFPBRC_BAD_LEN;
}
length = ntohs(ogs11->length);
if (length < sizeof base_len) {
- VLOG_WARN_RL(&bad_ofmsg_rl, "%s reply claims invalid length %zu",
+ VLOG_WARN_RL(&bad_ofmsg_rl, "%s reply claims invalid length %"PRIuSIZE,
ofpraw_get_name(raw), length);
return OFPERR_OFPBRC_BAD_LEN;
}
gs->n_buckets = (length - base_len) / sizeof *obc;
obc = ofpbuf_try_pull(msg, gs->n_buckets * sizeof *obc);
if (!obc) {
- VLOG_WARN_RL(&bad_ofmsg_rl, "%s reply has %zu leftover bytes at end",
+ VLOG_WARN_RL(&bad_ofmsg_rl, "%s reply has %"PRIuSIZE" leftover bytes at end",
ofpraw_get_name(raw), msg->size);
return OFPERR_OFPBRC_BAD_LEN;
}
? ofpbuf_try_pull(msg, sizeof *ob)
: NULL);
if (!ob) {
- VLOG_WARN_RL(&bad_ofmsg_rl, "buckets end with %zu leftover bytes",
+ VLOG_WARN_RL(&bad_ofmsg_rl, "buckets end with %"PRIuSIZE" leftover bytes",
buckets_length);
}
ob_len = ntohs(ob->len);
if (ob_len < sizeof *ob) {
VLOG_WARN_RL(&bad_ofmsg_rl, "OpenFlow message bucket length "
- "%zu is not valid", ob_len);
+ "%"PRIuSIZE" is not valid", ob_len);
return OFPERR_OFPGMFC_BAD_BUCKET;
} else if (ob_len > buckets_length) {
VLOG_WARN_RL(&bad_ofmsg_rl, "OpenFlow message bucket length "
- "%zu exceeds remaining buckets data size %zu",
+ "%"PRIuSIZE" exceeds remaining buckets data size %"PRIuSIZE,
ob_len, buckets_length);
return OFPERR_OFPGMFC_BAD_BUCKET;
}
ogds = ofpbuf_try_pull(msg, sizeof *ogds);
if (!ogds) {
- VLOG_WARN_RL(&bad_ofmsg_rl, "OFPST11_GROUP_DESC reply has %zu "
+ VLOG_WARN_RL(&bad_ofmsg_rl, "OFPST11_GROUP_DESC reply has %"PRIuSIZE" "
"leftover bytes at end", msg->size);
return OFPERR_OFPBRC_BAD_LEN;
}
length = ntohs(ogds->length);
if (length < sizeof *ogds || length - sizeof *ogds > msg->size) {
VLOG_WARN_RL(&bad_ofmsg_rl, "OFPST11_GROUP_DESC reply claims invalid "
- "length %zu", length);
+ "length %"PRIuSIZE, length);
return OFPERR_OFPBRC_BAD_LEN;
}
case OFP13_VERSION: {
b = ofpraw_alloc(OFPRAW_OFPT11_GROUP_MOD, ofp_version, 0);
start_ogm = b->size;
- ofpbuf_put_uninit(b, sizeof *ogm);
+ ofpbuf_put_zeros(b, sizeof *ogm);
LIST_FOR_EACH (bucket, list_node, &gm->buckets) {
start_bucket = b->size;
- ofpbuf_put_uninit(b, sizeof *ob);
+ ofpbuf_put_zeros(b, sizeof *ob);
if (bucket->ofpacts && bucket->ofpacts_len) {
ofpacts_put_openflow_actions(bucket->ofpacts,
bucket->ofpacts_len, b,
ogm = ofpbuf_at_assert(b, start_ogm, sizeof *ogm);
ogm->command = htons(gm->command);
ogm->type = gm->type;
- ogm->pad = 0;
ogm->group_id = htonl(gm->group_id);
break;
}
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
return b;
{
const struct ofp11_group_mod *ogm;
struct ofpbuf msg;
+ struct ofputil_bucket *bucket;
+ enum ofperr err;
ofpbuf_use_const(&msg, oh, ntohs(oh->length));
ofpraw_pull_assert(&msg);
gm->type = ogm->type;
gm->group_id = ntohl(ogm->group_id);
- return ofputil_pull_buckets(&msg, msg.size, oh->version, &gm->buckets);
+ err = ofputil_pull_buckets(&msg, msg.size, oh->version, &gm->buckets);
+ if (err) {
+ return err;
+ }
+
+ LIST_FOR_EACH (bucket, list_node, &gm->buckets) {
+ switch (gm->type) {
+ case OFPGT11_ALL:
+ case OFPGT11_INDIRECT:
+ if (ofputil_bucket_has_liveness(bucket)) {
+ return OFPERR_OFPGMFC_WATCH_UNSUPPORTED;
+ }
+ break;
+ case OFPGT11_SELECT:
+ break;
+ case OFPGT11_FF:
+ if (!ofputil_bucket_has_liveness(bucket)) {
+ return OFPERR_OFPGMFC_INVALID_GROUP;
+ }
+ break;
+ default:
+ OVS_NOT_REACHED();
+ }
+ }
+
+ return 0;
}
/* Parse a queue status request message into 'oqsr'.
}
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
break;
}
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
return request;
case OFP13_VERSION:
return sizeof(struct ofp13_queue_stats);
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
}
return ofputil_queue_stats_from_ofp10(qs, qs10);
} else {
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
bad_len:
- VLOG_WARN_RL(&bad_ofmsg_rl, "OFPST_QUEUE reply has %zu leftover "
+ VLOG_WARN_RL(&bad_ofmsg_rl, "OFPST_QUEUE reply has %"PRIuSIZE" leftover "
"bytes at end", msg->size);
return OFPERR_OFPBRC_BAD_LEN;
}
}
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}