2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-31 14:25:26 +00:00

ofp-print: Print OFPUTIL_NXT_FLOW_REMOVED.

This commit is contained in:
Ben Pfaff
2010-12-09 10:31:49 -08:00
parent 8d7fb7eef5
commit 9b045a0c66
3 changed files with 104 additions and 21 deletions

View File

@@ -866,12 +866,21 @@ ofp_print_duration(struct ds *string, unsigned int sec, unsigned int nsec)
}
static void
ofp_print_flow_removed(struct ds *string, const struct ofp_flow_removed *ofr,
int verbosity)
ofp_print_flow_removed(struct ds *string, const struct ofp_header *oh)
{
ofp_print_match(string, &ofr->match, verbosity);
struct ofputil_flow_removed fr;
int error;
error = ofputil_decode_flow_removed(&fr, oh, NXFF_OPENFLOW10);
if (error) {
ofp_print_error(string, error);
return;
}
cls_rule_format(&fr.rule, string);
ds_put_cstr(string, " reason=");
switch (ofr->reason) {
switch (fr.reason) {
case OFPRR_IDLE_TIMEOUT:
ds_put_cstr(string, "idle");
break;
@@ -882,22 +891,17 @@ ofp_print_flow_removed(struct ds *string, const struct ofp_flow_removed *ofr,
ds_put_cstr(string, "delete");
break;
default:
ds_put_format(string, "**%"PRIu8"**", ofr->reason);
ds_put_format(string, "**%"PRIu8"**", fr.reason);
break;
}
if (ofr->cookie != htonll(0)) {
ds_put_format(string, " cookie:0x%"PRIx64, ntohll(ofr->cookie));
}
if (ofr->priority != htons(32768)) {
ds_put_format(string, " pri:%"PRIu16, ntohs(ofr->priority));
if (fr.cookie != htonll(0)) {
ds_put_format(string, " cookie:0x%"PRIx64, ntohll(fr.cookie));
}
ds_put_cstr(string, " duration");
ofp_print_duration(string,
ntohl(ofr->duration_sec), ntohl(ofr->duration_nsec));
ofp_print_duration(string, fr.duration_sec, fr.duration_nsec);
ds_put_format(string, " idle%"PRIu16" pkts%"PRIu64" bytes%"PRIu64"\n",
ntohs(ofr->idle_timeout), ntohll(ofr->packet_count),
ntohll(ofr->byte_count));
fr.idle_timeout, fr.packet_count, fr.byte_count);
}
static void
@@ -1561,7 +1565,8 @@ ofp_to_string__(const struct ofp_header *oh,
break;
case OFPUTIL_OFPT_FLOW_REMOVED:
ofp_print_flow_removed(string, msg, verbosity);
case OFPUTIL_NXT_FLOW_REMOVED:
ofp_print_flow_removed(string, msg);
break;
case OFPUTIL_OFPT_PORT_STATUS:
@@ -1667,17 +1672,13 @@ ofp_to_string__(const struct ofp_header *oh,
ofp_print_flow_mod(string, msg, code, verbosity);
break;
case OFPUTIL_NXT_FLOW_REMOVED:
/* XXX */
break;
case OFPUTIL_NXST_FLOW_REPLY:
ofp_print_nxst_flow_reply(string, oh);
break;
case OFPUTIL_NXST_AGGREGATE_REPLY:
ofp_print_stats_reply(string, oh);
ofp_print_nxst_aggregate_reply(string, oh);
ofp_print_nxst_aggregate_reply(string, msg);
break;
}
}

View File

@@ -1067,7 +1067,11 @@ ofputil_decode_nxst_flow_request(struct flow_stats_request *fsr,
/* Converts an OFPST_FLOW, OFPST_AGGREGATE, NXST_FLOW, or NXST_AGGREGATE
* message 'oh', received when the current flow format was 'flow_format', into
* an abstract flow_stats_request in 'fsr'. Returns 0 if successful, otherwise
* an OpenFlow error code. */
* an OpenFlow error code.
*
* For OFPST_FLOW and OFPST_AGGREGATE messages, 'flow_format' should be the
* current flow format at the time when the message was received. Otherwise
* 'flow_format' is ignored. */
int
ofputil_decode_flow_stats_request(struct flow_stats_request *fsr,
const struct ofp_header *oh,
@@ -1140,6 +1144,68 @@ ofputil_encode_flow_stats_request(const struct flow_stats_request *fsr,
return msg;
}
/* Converts an OFPT_FLOW_REMOVED or NXT_FLOW_REMOVED message 'oh', received
* when the current flow format was 'flow_format', into an abstract
* ofputil_flow_removed in 'fr'. Returns 0 if successful, otherwise an
* OpenFlow error code.
*
* For OFPT_FLOW_REMOVED messages, 'flow_format' should be the current flow
* format at the time when the message was received. Otherwise 'flow_format'
* is ignored. */
int
ofputil_decode_flow_removed(struct ofputil_flow_removed *fr,
const struct ofp_header *oh,
enum nx_flow_format flow_format)
{
const struct ofputil_msg_type *type;
enum ofputil_msg_code code;
ofputil_decode_msg_type(oh, &type);
code = ofputil_msg_type_code(type);
if (code == OFPUTIL_OFPT_FLOW_REMOVED) {
const struct ofp_flow_removed *ofr;
ofr = (const struct ofp_flow_removed *) oh;
ofputil_cls_rule_from_match(&ofr->match, ntohs(ofr->priority),
flow_format, ofr->cookie, &fr->rule);
fr->cookie = ofr->cookie;
fr->reason = ofr->reason;
fr->duration_sec = ntohl(ofr->duration_sec);
fr->duration_nsec = ntohl(ofr->duration_nsec);
fr->idle_timeout = ntohs(ofr->idle_timeout);
fr->packet_count = ntohll(ofr->packet_count);
fr->byte_count = ntohll(ofr->byte_count);
} else if (code == OFPUTIL_NXT_FLOW_REMOVED) {
struct nx_flow_removed *nfr;
struct ofpbuf b;
int error;
ofpbuf_use_const(&b, oh, ntohs(oh->length));
nfr = ofpbuf_pull(&b, sizeof *nfr);
error = nx_pull_match(&b, ntohs(nfr->match_len), ntohs(nfr->priority),
&fr->rule);
if (error) {
return error;
}
if (b.size) {
return ofp_mkerr(OFPET_BAD_REQUEST, OFPBRC_BAD_LEN);
}
fr->cookie = nfr->cookie;
fr->reason = nfr->reason;
fr->duration_sec = ntohl(nfr->duration_sec);
fr->duration_nsec = ntohl(nfr->duration_nsec);
fr->idle_timeout = ntohs(nfr->idle_timeout);
fr->packet_count = ntohll(nfr->packet_count);
fr->byte_count = ntohll(nfr->byte_count);
} else {
NOT_REACHED();
}
return 0;
}
/* Returns a string representing the message type of 'type'. The string is the
* enumeration constant for the type, e.g. "OFPT_HELLO". For statistics
* messages, the constant is followed by "request" or "reply",

View File

@@ -155,6 +155,22 @@ int ofputil_decode_flow_stats_request(struct flow_stats_request *,
struct ofpbuf *ofputil_encode_flow_stats_request(
const struct flow_stats_request *, enum nx_flow_format);
/* Flow removed message, independent of flow format. */
struct ofputil_flow_removed {
struct cls_rule rule;
ovs_be64 cookie;
uint8_t reason; /* One of OFPRR_*. */
uint32_t duration_sec;
uint32_t duration_nsec;
uint16_t idle_timeout;
uint64_t packet_count;
uint64_t byte_count;
};
int ofputil_decode_flow_removed(struct ofputil_flow_removed *,
const struct ofp_header *,
enum nx_flow_format);
/* OpenFlow protocol utility functions. */
void *make_openflow(size_t openflow_len, uint8_t type, struct ofpbuf **);
void *make_nxmsg(size_t openflow_len, uint32_t subtype, struct ofpbuf **);