summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/ofp-print.c11
-rw-r--r--lib/ofp-util.c31
-rw-r--r--ofproto/ofproto.c26
-rw-r--r--tests/ofproto.at3
4 files changed, 65 insertions, 6 deletions
diff --git a/lib/ofp-print.c b/lib/ofp-print.c
index 1f22dd753..d24eac1d2 100644
--- a/lib/ofp-print.c
+++ b/lib/ofp-print.c
@@ -1053,6 +1053,17 @@ ofp_print_table_desc(struct ds *string, const struct ofputil_table_desc *td)
ofputil_table_eviction_to_string(td->eviction));
ofputil_put_eviction_flags(string, td->eviction_flags);
ds_put_char(string, '\n');
+ ds_put_format(string, " vacancy=%s",
+ ofputil_table_vacancy_to_string(td->vacancy));
+ if (td->vacancy == OFPUTIL_TABLE_VACANCY_ON) {
+ ds_put_format(string, " vacancy_down=%"PRIu8"%%",
+ td->table_vacancy.vacancy_down);
+ ds_put_format(string, " vacancy_up=%"PRIu8"%%",
+ td->table_vacancy.vacancy_up);
+ ds_put_format(string, " vacancy=%"PRIu8"%%",
+ td->table_vacancy.vacancy);
+ }
+ ds_put_char(string, '\n');
}
static void
diff --git a/lib/ofp-util.c b/lib/ofp-util.c
index 207c33527..885ceb168 100644
--- a/lib/ofp-util.c
+++ b/lib/ofp-util.c
@@ -4887,6 +4887,22 @@ parse_table_desc_eviction_property(struct ofpbuf *property,
return 0;
}
+static enum ofperr
+parse_table_desc_vacancy_property(struct ofpbuf *property,
+ struct ofputil_table_desc *td)
+{
+ struct ofp14_table_mod_prop_vacancy *otv = property->data;
+
+ if (property->size != sizeof *otv) {
+ return OFPERR_OFPBPC_BAD_LEN;
+ }
+
+ td->table_vacancy.vacancy_down = otv->vacancy_down;
+ td->table_vacancy.vacancy_up = otv->vacancy_up;
+ td->table_vacancy.vacancy = otv->vacancy;
+ return 0;
+}
+
/* Decodes the next OpenFlow "table desc" message (of possibly several) from
* 'msg' into an abstract form in '*td'. Returns 0 if successful, EOF if the
* last "table desc" in 'msg' was already decoded, otherwise an OFPERR_*
@@ -4928,6 +4944,7 @@ ofputil_decode_table_desc(struct ofpbuf *msg,
ofpbuf_use_const(&properties, ofpbuf_pull(msg, length), length);
td->eviction = ofputil_decode_table_eviction(otd->config, version);
+ td->vacancy = ofputil_decode_table_vacancy(otd->config, version);
td->eviction_flags = UINT32_MAX;
while (properties.size > 0) {
@@ -4945,6 +4962,10 @@ ofputil_decode_table_desc(struct ofpbuf *msg,
error = parse_table_desc_eviction_property(&payload, td);
break;
+ case OFPTMPT14_VACANCY:
+ error = parse_table_desc_vacancy_property(&payload, td);
+ break;
+
default:
log_property(true, "unknown table_desc property %"PRIu16, type);
error = 0;
@@ -4997,6 +5018,16 @@ ofputil_append_table_desc_reply(const struct ofputil_table_desc *td,
ote->length = htons(sizeof *ote);
ote->flags = htonl(td->eviction_flags);
}
+ if (td->vacancy == OFPUTIL_TABLE_VACANCY_ON) {
+ struct ofp14_table_mod_prop_vacancy *otv;
+
+ otv = ofpbuf_put_zeros(reply, sizeof *otv);
+ otv->type = htons(OFPTMPT14_VACANCY);
+ otv->length = htons(sizeof *otv);
+ otv->vacancy_down = td->table_vacancy.vacancy_down;
+ otv->vacancy_up = td->table_vacancy.vacancy_up;
+ otv->vacancy = td->table_vacancy.vacancy;
+ }
otd = ofpbuf_at_assert(reply, start_otd, sizeof *otd);
otd->length = htons(reply->size - start_otd);
diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
index eeb3316be..4f69cc2c9 100644
--- a/ofproto/ofproto.c
+++ b/ofproto/ofproto.c
@@ -3588,6 +3588,26 @@ handle_table_features_request(struct ofconn *ofconn,
return 0;
}
+static void
+query_table_desc__(struct ofputil_table_desc *td,
+ struct ofproto *ofproto, uint8_t table_id)
+{
+ unsigned int count = ofproto->tables[table_id].n_flows;
+ unsigned int max_flows = ofproto->tables[table_id].max_flows;
+
+ td->table_id = table_id;
+ td->eviction = (ofproto->tables[table_id].eviction & EVICTION_OPENFLOW
+ ? OFPUTIL_TABLE_EVICTION_ON
+ : OFPUTIL_TABLE_EVICTION_OFF);
+ td->eviction_flags = OFPROTO_EVICTION_FLAGS;
+ td->vacancy = (ofproto->tables[table_id].vacancy_enabled
+ ? OFPUTIL_TABLE_VACANCY_ON
+ : OFPUTIL_TABLE_VACANCY_OFF);
+ td->table_vacancy.vacancy_down = ofproto->tables[table_id].vacancy_down;
+ td->table_vacancy.vacancy_up = ofproto->tables[table_id].vacancy_up;
+ td->table_vacancy.vacancy = max_flows ? (count * 100) / max_flows : 0;
+}
+
/* This function queries the database for dumping table-desc. */
static void
query_tables_desc(struct ofproto *ofproto, struct ofputil_table_desc **descp)
@@ -3598,11 +3618,7 @@ query_tables_desc(struct ofproto *ofproto, struct ofputil_table_desc **descp)
table_desc = *descp = xcalloc(ofproto->n_tables, sizeof *table_desc);
for (i = 0; i < ofproto->n_tables; i++) {
struct ofputil_table_desc *td = &table_desc[i];
- td->table_id = i;
- td->eviction = (ofproto->tables[i].eviction & EVICTION_OPENFLOW
- ? OFPUTIL_TABLE_EVICTION_ON
- : OFPUTIL_TABLE_EVICTION_OFF);
- td->eviction_flags = OFPROTO_EVICTION_FLAGS;
+ query_table_desc__(td, ofproto, i);
}
}
diff --git a/tests/ofproto.at b/tests/ofproto.at
index eff2495b5..e96012ace 100644
--- a/tests/ofproto.at
+++ b/tests/ofproto.at
@@ -1923,7 +1923,8 @@ OVS_VSWITCHD_START
while test $x -lt 254; do
y=`expr $x + 1`
echo " table $x:
- eviction=off eviction_flags=OTHER|IMPORTANCE|LIFETIME"
+ eviction=off eviction_flags=OTHER|IMPORTANCE|LIFETIME
+ vacancy=off"
x=$y
done) > expout
AT_CHECK([ovs-ofctl -O OpenFlow14 dump-table-desc br0 | sed '/^$/d