ovs/ovsdb: support changing the MTU of an ovs interface

Introduce a nm_ovsdb_set_interface_mtu() function to update the MTU of
an ovs interface in the ovsdb.

(cherry picked from commit a4c2c1a843)
(cherry picked from commit c1be15a66e)
(cherry picked from commit 990f46505d)
This commit is contained in:
Beniamino Galvani 2020-03-09 11:19:47 +01:00 committed by Thomas Haller
parent a85c231b0c
commit 021141481e
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
2 changed files with 65 additions and 17 deletions

View file

@ -118,6 +118,7 @@ typedef enum {
OVSDB_MONITOR,
OVSDB_ADD_INTERFACE,
OVSDB_DEL_INTERFACE,
OVSDB_SET_INTERFACE_MTU,
} OvsdbCommand;
typedef struct {
@ -127,7 +128,10 @@ typedef struct {
OvsdbMethodCallback callback;
gpointer user_data;
union {
char *ifname;
struct {
char *ifname;
guint32 mtu;
};
struct {
NMConnection *bridge;
NMConnection *port;
@ -169,6 +173,13 @@ _call_trace (const char *comment, OvsdbMethodCall *call, json_t *msg)
msg ? ": " : "",
msg ? str : "");
break;
case OVSDB_SET_INTERFACE_MTU:
_LOGT ("%s: set-iface-mtu interface=%s%s%s mtu=%u",
comment, call->ifname,
msg ? ": " : "",
msg ? str : "",
call->mtu);
break;
}
if (msg)
@ -187,7 +198,7 @@ ovsdb_call_method (NMOvsdb *self, OvsdbCommand command,
const char *ifname,
NMConnection *bridge, NMConnection *port, NMConnection *interface,
NMDevice *bridge_device, NMDevice *interface_device,
OvsdbMethodCallback callback, gpointer user_data)
guint32 mtu, OvsdbMethodCallback callback, gpointer user_data)
{
NMOvsdbPrivate *priv = NM_OVSDB_GET_PRIVATE (self);
OvsdbMethodCall *call;
@ -215,6 +226,10 @@ ovsdb_call_method (NMOvsdb *self, OvsdbCommand command,
case OVSDB_DEL_INTERFACE:
call->ifname = g_strdup (ifname);
break;
case OVSDB_SET_INTERFACE_MTU:
call->ifname = g_strdup (ifname);
call->mtu = mtu;
break;
}
_call_trace ("enqueue", call, NULL);
@ -817,6 +832,22 @@ 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);
break;
case OVSDB_SET_INTERFACE_MTU:
params = json_array ();
json_array_append_new (params, json_string ("Open_vSwitch"));
json_array_append_new (params, _inc_next_cfg (priv->db_uuid));
json_array_append_new (params,
json_pack ("{s:s, s:s, s:{s: i}, s:[[s, s, s]]}",
"op", "update",
"table", "Interface",
"row", "mtu_request", call->mtu,
"where", "name", "==", call->ifname));
msg = json_pack ("{s:i, s:s, s:o}",
"id", call->id,
"method", "transact", "params", params);
@ -1462,7 +1493,7 @@ ovsdb_try_connect (NMOvsdb *self)
/* Queue a monitor call before any other command, ensuring that we have an up
* to date view of existing bridged that we need for add and remove ops. */
ovsdb_call_method (self, OVSDB_MONITOR, NULL,
NULL, NULL, NULL, NULL, NULL, _monitor_bridges_cb, NULL);
NULL, NULL, NULL, NULL, NULL, 0, _monitor_bridges_cb, NULL);
}
/*****************************************************************************/
@ -1500,36 +1531,49 @@ out:
g_slice_free (OvsdbCall, call);
}
static OvsdbCall *
ovsdb_call_new (NMOvsdbCallback callback, gpointer user_data)
{
OvsdbCall *call;
call = g_slice_new (OvsdbCall);
call->callback = callback;
call->user_data = user_data;
return call;
}
void
nm_ovsdb_add_interface (NMOvsdb *self,
NMConnection *bridge, NMConnection *port, NMConnection *interface,
NMDevice *bridge_device, NMDevice *interface_device,
NMOvsdbCallback callback, gpointer user_data)
{
OvsdbCall *call;
call = g_slice_new (OvsdbCall);
call->callback = callback;
call->user_data = user_data;
ovsdb_call_method (self, OVSDB_ADD_INTERFACE, NULL,
bridge, port, interface,
bridge_device, interface_device,
_transact_cb, call);
0,
_transact_cb,
ovsdb_call_new (callback, user_data));
}
void
nm_ovsdb_del_interface (NMOvsdb *self, const char *ifname,
NMOvsdbCallback callback, gpointer user_data)
{
OvsdbCall *call;
call = g_slice_new (OvsdbCall);
call->callback = callback;
call->user_data = user_data;
ovsdb_call_method (self, OVSDB_DEL_INTERFACE, ifname,
NULL, NULL, NULL, NULL, NULL, _transact_cb, call);
NULL, NULL, NULL, NULL, NULL, 0,
_transact_cb,
ovsdb_call_new (callback, user_data));
}
void nm_ovsdb_set_interface_mtu (NMOvsdb *self, const char *ifname, guint32 mtu,
NMOvsdbCallback callback, gpointer user_data)
{
ovsdb_call_method (self, OVSDB_SET_INTERFACE_MTU, ifname,
NULL, NULL, NULL, NULL, NULL, mtu,
_transact_cb,
ovsdb_call_new (callback, user_data));
}
/*****************************************************************************/
@ -1550,6 +1594,7 @@ _clear_call (gpointer data)
g_clear_object (&call->interface_device);
break;
case OVSDB_DEL_INTERFACE:
case OVSDB_SET_INTERFACE_MTU:
g_clear_pointer (&call->ifname, g_free);
break;
}

View file

@ -48,4 +48,7 @@ void nm_ovsdb_add_interface (NMOvsdb *self,
void nm_ovsdb_del_interface (NMOvsdb *self, const char *ifname,
NMOvsdbCallback callback, gpointer user_data);
void nm_ovsdb_set_interface_mtu (NMOvsdb *self, const char *ifname, guint32 mtu,
NMOvsdbCallback callback, gpointer user_data);
#endif /* __NETWORKMANAGER_OVSDB_H__ */