diff options
author | Thomas Haller <thaller@redhat.com> | 2020-11-05 15:10:52 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2020-11-09 17:53:16 +0100 |
commit | e05edcfd7ed5c2f396fc2bace4144b140bd285dc (patch) | |
tree | 6b21b02a5dbb1b0454cf0e2d33ef8b424e42d763 | |
parent | 609b08e2eb6a10ca1ca87725207eafa5ac4f4b83 (diff) | |
download | NetworkManager-e05edcfd7ed5c2f396fc2bace4144b140bd285dc.tar.gz |
core/ovs: cleanup handling of call id for OVS commands
- rename "id" to something more distinct: "call_id".
- consistently use guint64 type. We don't want nor need
to handle negative values. For CALL_ID_UNSPEC we can use
G_MAXUINT64.
- don't use "i" format string for the call id. That expects
an "int", so it's not clear how this was working correctly
previously. Also, "int" has a smaller range than our 64bits.
Use instead "json_int_t" and cast properly in the variadic
arguments of json_pack().
-rw-r--r-- | src/devices/ovs/nm-ovsdb.c | 56 |
1 files changed, 38 insertions, 18 deletions
diff --git a/src/devices/ovs/nm-ovsdb.c b/src/devices/ovs/nm-ovsdb.c index 5a18c32734..b52cf0b645 100644 --- a/src/devices/ovs/nm-ovsdb.c +++ b/src/devices/ovs/nm-ovsdb.c @@ -53,7 +53,7 @@ typedef struct { size_t bufp; /* Last decoded byte in the input buffer. */ GString * input; /* JSON stream waiting for decoding. */ GString * output; /* JSON stream to be sent. */ - gint64 seq; + guint64 call_id_counter; GArray * calls; /* Method calls waiting for a response. */ GHashTable * interfaces; /* interface uuid => OpenvswitchInterface */ GHashTable * ports; /* port uuid => OpenvswitchPort */ @@ -104,9 +104,10 @@ typedef enum { OVSDB_SET_INTERFACE_MTU, } OvsdbCommand; +#define CALL_ID_UNSPEC G_MAXUINT64 + typedef struct { - gint64 id; -#define COMMAND_PENDING -1 /* id not yet assigned */ + guint64 call_id; OvsdbCommand command; OvsdbMethodCallback callback; gpointer user_data; @@ -207,7 +208,7 @@ ovsdb_call_method(NMOvsdb * self, g_array_set_size(priv->calls, priv->calls->len + 1); call = &g_array_index(priv->calls, OvsdbMethodCall, priv->calls->len - 1); } - call->id = COMMAND_PENDING; + call->call_id = CALL_ID_UNSPEC; call->command = command; call->callback = callback; call->user_data = user_data; @@ -975,20 +976,21 @@ ovsdb_next_command(NMOvsdb *self) if (!priv->calls->len) return; call = &g_array_index(priv->calls, OvsdbMethodCall, 0); - if (call->id != COMMAND_PENDING) + if (call->call_id != CALL_ID_UNSPEC) return; - call->id = priv->seq++; + + call->call_id = ++priv->call_id_counter; switch (call->command) { case OVSDB_MONITOR: - msg = json_pack("{s:i, s:s, s:[s, n, {" + msg = json_pack("{s:I, s:s, s:[s, n, {" " s:[{s:[s, s, s]}]," " s:[{s:[s, s, s]}]," " s:[{s:[s, s, s, s]}]," " s:[{s:[]}]" "}]}", "id", - call->id, + (json_int_t) call->call_id, "method", "monitor", "params", @@ -1025,7 +1027,13 @@ ovsdb_next_command(NMOvsdb *self) call->bridge_device, call->interface_device); - msg = json_pack("{s:i, s:s, s:o}", "id", call->id, "method", "transact", "params", params); + msg = json_pack("{s:I, s:s, s:o}", + "id", + (json_int_t) call->call_id, + "method", + "transact", + "params", + params); break; case OVSDB_DEL_INTERFACE: params = json_array(); @@ -1034,7 +1042,13 @@ ovsdb_next_command(NMOvsdb *self) _delete_interface(self, params, call->ifname); - msg = json_pack("{s:i, s:s, s:o}", "id", call->id, "method", "transact", "params", params); + msg = json_pack("{s:I, s:s, s:o}", + "id", + (json_int_t) call->call_id, + "method", + "transact", + "params", + params); break; case OVSDB_SET_INTERFACE_MTU: params = json_array(); @@ -1055,7 +1069,13 @@ ovsdb_next_command(NMOvsdb *self) "==", call->ifname)); - msg = json_pack("{s:i, s:s, s:o}", "id", call->id, "method", "transact", "params", params); + msg = json_pack("{s:I, s:s, s:o}", + "id", + (json_int_t) call->call_id, + "method", + "transact", + "params", + params); break; } @@ -1437,7 +1457,7 @@ ovsdb_got_msg(NMOvsdb *self, json_t *msg) 0, }; json_t * json_id = NULL; - gint64 id = -1; + json_int_t id = (json_int_t) -1; const char * method = NULL; json_t * params = NULL; json_t * result = NULL; @@ -1490,18 +1510,18 @@ ovsdb_got_msg(NMOvsdb *self, json_t *msg) return; } - if (id > -1) { + if (id >= 0) { /* This is a response to a method call. */ if (!priv->calls->len) { - _LOGE("there are no queued calls expecting response %" G_GUINT64_FORMAT, id); + _LOGE("there are no queued calls expecting response %" G_GUINT64_FORMAT, (guint64) id); ovsdb_disconnect(self, FALSE, FALSE); return; } call = &g_array_index(priv->calls, OvsdbMethodCall, 0); - if (call->id != id) { + if (call->call_id != id) { _LOGE("expected a response to call %" G_GUINT64_FORMAT ", not %" G_GUINT64_FORMAT, - call->id, - id); + call->call_id, + (guint64) id); ovsdb_disconnect(self, FALSE, FALSE); return; } @@ -1705,7 +1725,7 @@ ovsdb_disconnect(NMOvsdb *self, gboolean retry, gboolean is_disposing) if (retry) { if (priv->calls->len != 0) - g_array_index(priv->calls, OvsdbMethodCall, 0).id = COMMAND_PENDING; + g_array_index(priv->calls, OvsdbMethodCall, 0).call_id = CALL_ID_UNSPEC; } else { nm_utils_error_set_cancelled(&error, is_disposing, "NMOvsdb"); |