{ OFPUTIL_NXT_FLOW_AGE, OFP10_VERSION,
NXT_FLOW_AGE, "NXT_FLOW_AGE",
sizeof(struct nicira_header), 0 },
+
+ { OFPUTIL_NXT_SET_ASYNC_CONFIG, OFP10_VERSION,
+ NXT_SET_ASYNC_CONFIG, "NXT_SET_ASYNC_CONFIG",
+ sizeof(struct nx_async_config), 0 },
+
+ { OFPUTIL_NXT_SET_CONTROLLER_ID, OFP10_VERSION,
+ NXT_SET_CONTROLLER_ID, "NXT_SET_CONTROLLER_ID",
+ sizeof(struct nx_controller_id), 0 },
};
static const struct ofputil_msg_category nxt_category = {
return packet;
}
+const char *
+ofputil_packet_in_reason_to_string(enum ofp_packet_in_reason reason)
+{
+ static char s[INT_STRLEN(int) + 1];
+
+ switch (reason) {
+ case OFPR_NO_MATCH:
+ return "no_match";
+ case OFPR_ACTION:
+ return "action";
+ case OFPR_INVALID_TTL:
+ return "invalid_ttl";
+
+ case OFPR_N_REASONS:
+ default:
+ sprintf(s, "%d", (int) reason);
+ return s;
+ }
+}
+
+bool
+ofputil_packet_in_reason_from_string(const char *s,
+ enum ofp_packet_in_reason *reason)
+{
+ int i;
+
+ for (i = 0; i < OFPR_N_REASONS; i++) {
+ if (!strcasecmp(s, ofputil_packet_in_reason_to_string(i))) {
+ *reason = i;
+ return true;
+ }
+ }
+ return false;
+}
+
enum ofperr
ofputil_decode_packet_out(struct ofputil_packet_out *po,
const struct ofp_packet_out *opo)
error = learn_check((const struct nx_action_learn *) a, flow);
break;
+ case OFPUTIL_NXAST_CONTROLLER:
+ if (((const struct nx_action_controller *) a)->zero) {
+ error = OFPERR_NXBAC_MUST_BE_ZERO;
+ }
+ break;
+
case OFPUTIL_OFPAT_STRIP_VLAN:
case OFPUTIL_OFPAT_SET_NW_SRC:
case OFPUTIL_OFPAT_SET_NW_DST:
case OFPUTIL_NXAST_SET_TUNNEL64:
case OFPUTIL_NXAST_EXIT:
case OFPUTIL_NXAST_DEC_TTL:
+ case OFPUTIL_NXAST_FIN_TIMEOUT:
break;
}