summaryrefslogtreecommitdiff
path: root/src/platform/nm-platform.c
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2018-12-25 18:41:28 +0100
committerThomas Haller <thaller@redhat.com>2019-01-08 10:48:52 +0100
commit2fab3da78b9ff4ad273cb54834ad584408260770 (patch)
tree8cf8143594932bd4ee06c12826b0928878123e3f /src/platform/nm-platform.c
parent756aec8d9259a371915f46935f978cfef923f030 (diff)
downloadNetworkManager-th/wireguard-pt2.tar.gz
platform: create wireguard netdev interfaceth/wireguard-pt2
The netlink code for WG_CMD_SET_DEVICE is strongly inspired by WireGuard ([1]) and systemd ([2]). Currently, nm_platform_link_wireguard_change() always aims to reset all peers and allowed-ips settings. I think that should be improved in the future, to support only partial updates. [1] https://git.zx2c4.com/WireGuard/tree/contrib/examples/embeddable-wg-library/wireguard.c?id=5e99a6d43fe2351adf36c786f5ea2086a8fe7ab8#n1073 [2] https://github.com/systemd/systemd/blob/04ca4d191b13e79e5701ed22dc972f08628d7bcc/src/network/netdev/wireguard.c#L48
Diffstat (limited to 'src/platform/nm-platform.c')
-rw-r--r--src/platform/nm-platform.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c
index c750caf567..d097186ef7 100644
--- a/src/platform/nm-platform.c
+++ b/src/platform/nm-platform.c
@@ -1985,6 +1985,61 @@ nm_platform_link_get_lnk_wireguard (NMPlatform *self, int ifindex, const NMPlatf
/*****************************************************************************/
+int
+nm_platform_link_wireguard_add (NMPlatform *self,
+ const char *name,
+ const NMPlatformLink **out_link)
+{
+ return nm_platform_link_add (self, name, NM_LINK_TYPE_WIREGUARD, NULL, NULL, 0, out_link);
+}
+
+int
+nm_platform_link_wireguard_change (NMPlatform *self,
+ int ifindex,
+ const NMPlatformLnkWireGuard *lnk_wireguard,
+ const struct _NMPWireGuardPeer *peers,
+ guint peers_len)
+{
+ _CHECK_SELF (self, klass, -NME_BUG);
+
+ nm_assert (klass->link_wireguard_change);
+
+ if (_LOGD_ENABLED ()) {
+ char buf_lnk[256];
+ char buf_peers[512];
+
+ buf_peers[0] = '\0';
+ if (peers_len > 0) {
+ char *b = buf_peers;
+ gsize len = sizeof (buf_peers);
+ guint i;
+
+ nm_utils_strbuf_append_str (&b, &len, " { ");
+ for (i = 0; i < peers_len; i++) {
+ nm_utils_strbuf_append_str (&b, &len, " { ");
+ nm_platform_wireguard_peer_to_string (&peers[i], b, len);
+ nm_utils_strbuf_seek_end (&b, &len);
+ nm_utils_strbuf_append_str (&b, &len, " } ");
+ }
+ nm_utils_strbuf_append_str (&b, &len, "}");
+ }
+
+ _LOG3D ("link: change wireguard ifindex %d, %s, %u peers%s",
+ ifindex,
+ nm_platform_lnk_wireguard_to_string (lnk_wireguard, buf_lnk, sizeof (buf_lnk)),
+ peers_len,
+ buf_peers);
+ }
+
+ return klass->link_wireguard_change (self,
+ ifindex,
+ lnk_wireguard,
+ peers,
+ peers_len);
+}
+
+/*****************************************************************************/
+
/**
* nm_platform_link_bridge_add:
* @self: platform instance