summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAndy Zhou <azhou@nicira.com>2015-10-14 16:57:52 -0700
committerAndy Zhou <azhou@ovn.org>2015-12-11 14:22:32 -0800
commitaefd97b779035f83369723b129f14c80364e5f1e (patch)
tree21d742147566f10423694512ec70ab877d4c3558 /lib
parent6cef8e87b3237d3233a6696844e41f5c614aae17 (diff)
downloadopenvswitch-aefd97b779035f83369723b129f14c80364e5f1e.tar.gz
lib: avoid set size check when generating diff datum from json
Added ovsdb_transient_datum_from_json() to avoid size check for the diff datum that is transient in nature. Suppose a datum contains set, and the max number of elements is 2. If we are changing from set that contains [A, B], to a set contains [C, D], the diff datum will contains 4 elements [A, B, C, D]. Thus diff datum should not be constrained by the size limit. However the datum after diff is applied should not violate the size limit. Signed-off-by: Andy Zhou <azhou@nicira.com> Acked-by: Ben Pfaff <blp@ovn.org>
Diffstat (limited to 'lib')
-rw-r--r--lib/ovsdb-data.c19
-rw-r--r--lib/ovsdb-data.h5
2 files changed, 24 insertions, 0 deletions
diff --git a/lib/ovsdb-data.c b/lib/ovsdb-data.c
index a62e92e06..f7d0b06e7 100644
--- a/lib/ovsdb-data.c
+++ b/lib/ovsdb-data.c
@@ -1268,6 +1268,25 @@ ovsdb_datum_from_json(struct ovsdb_datum *datum,
return error;
}
+/* Parses 'json' as a datum of the type described by 'type' for internal
+ * use. This function is similar to 'ovsdb_datum_from_json', except the
+ * member size of set or map is not checked.
+ *
+ * The datum generated should be used then discard. It is not suitable
+ * for storing into IDL because of the possible member size violation. */
+struct ovsdb_error *
+ovsdb_transient_datum_from_json(struct ovsdb_datum *datum,
+ const struct ovsdb_type *type,
+ const struct json *json)
+{
+ struct ovsdb_type relaxed_type = *type;
+
+ relaxed_type.n_min = 0;
+ relaxed_type.n_max = UINT_MAX;
+
+ return ovsdb_datum_from_json(datum, &relaxed_type, json, NULL);
+}
+
/* Converts 'datum', of the specified 'type', to JSON format, and returns the
* JSON. The caller is responsible for freeing the returned JSON.
*
diff --git a/lib/ovsdb-data.h b/lib/ovsdb-data.h
index e144c70d0..802f7184c 100644
--- a/lib/ovsdb-data.h
+++ b/lib/ovsdb-data.h
@@ -161,6 +161,11 @@ struct ovsdb_error *ovsdb_datum_from_json(struct ovsdb_datum *,
const struct json *,
struct ovsdb_symbol_table *)
OVS_WARN_UNUSED_RESULT;
+struct ovsdb_error *ovsdb_transient_datum_from_json(
+ struct ovsdb_datum *,
+ const struct ovsdb_type *,
+ const struct json *)
+ OVS_WARN_UNUSED_RESULT;
struct json *ovsdb_datum_to_json(const struct ovsdb_datum *,
const struct ovsdb_type *);