+ match_len = ntohs(fs->match_len);
+ if (match_len > length - sizeof *fs) {
+ ds_put_format(string, " ***length=%zu match_len=%d***",
+ length, match_len);
+ break;
+ }
+
+ ds_put_format(string, " cookie=0x%"PRIx64", duration=",
+ ntohll(fs->cookie));
+ ofp_print_duration(string, ntohl(fs->duration_sec),
+ ntohl(fs->duration_nsec));
+ ds_put_format(string, ", table_id=%"PRIu8", ", fs->table_id);
+ ds_put_format(string, "n_packets=%"PRIu64", ",
+ ntohll(fs->packet_count));
+ ds_put_format(string, "n_bytes=%"PRIu64", ", ntohll(fs->byte_count));
+ if (fs->idle_timeout != htons(OFP_FLOW_PERMANENT)) {
+ ds_put_format(string, "idle_timeout=%"PRIu16",",
+ ntohs(fs->idle_timeout));
+ }
+ if (fs->hard_timeout != htons(OFP_FLOW_PERMANENT)) {
+ ds_put_format(string, "hard_timeout=%"PRIu16",",
+ ntohs(fs->hard_timeout));
+ }
+
+ error = nx_pull_match(&b, match_len, ntohs(fs->priority), &rule);
+ if (error) {
+ ofp_print_error(string, error);
+ break;
+ }
+
+ actions_len = length - sizeof *fs - ROUND_UP(match_len, 8);
+ error = ofputil_pull_actions(&b, actions_len, &actions, &n_actions);
+ if (error) {
+ ofp_print_error(string, error);
+ break;
+ }
+
+ cls_rule_format(&rule, string);
+ ds_put_char(string, ' ');
+ ofp_print_actions(string, (const struct ofp_action_header *) actions,
+ n_actions * sizeof *actions);
+ }