about summary refs log tree commit diff
path: root/docs/libnm/libnm-docs.xml
diff options
context:
space:
mode:
Diffstat (limited to 'docs/libnm/libnm-docs.xml')
-rw-r--r--docs/libnm/libnm-docs.xml153
1 files changed, 134 insertions, 19 deletions
diff --git a/docs/libnm/libnm-docs.xml b/docs/libnm/libnm-docs.xml
index fdc83666..b03efc33 100644
--- a/docs/libnm/libnm-docs.xml
+++ b/docs/libnm/libnm-docs.xml
@@ -14,7 +14,12 @@
     </releaseinfo>
 
     <copyright>
-      <year>2012-2014</year>
+      <year>2012</year>
+      <year>2013</year>
+      <year>2014</year>
+      <year>2015</year>
+      <year>2016</year>
+      <year>2017</year>
       <holder>The NetworkManager Authors</holder>
     </copyright>
 
@@ -43,24 +48,130 @@
 
   <chapter id="ref-overview">
     <title>Overview</title>
-    <para>
-      libnm maps fairly closely to the actual D-Bus API that NetworkManager
-      provides, wrapping the remote D-Bus objects as native GObjects,
-      mapping D-Bus signals and properties to GObject signals and properties,
-      and providing helpful accessor and utility functions.  However, unlike
-      the old libnm-util/libnm-glib API, the mapping to the D-Bus API is not
-      exact, and various inconveniences and historical anomolies of the D-Bus
-      API are papered over.
-    </para>
-    <para>
-      The following is a rough overview of the libnm object structure and
-      how to use the various parts of it:
-      <mediaobject  id="libnm-overview">
-        <imageobject>
-          <imagedata fileref="libnm.png" format="PNG"/>
-        </imageobject>
-      </mediaobject>
-    </para>
+    <section id="intro">
+      <title>Introduction to libnm</title>
+      <para>
+        libnm is a client library for NetworkManager, the standard Linux network
+        management service. NetworkManager supports a wide variety of network
+        configuration scenarios, hardware devices and protocol families. Most of
+        the functionality is exposed on a
+        <ulink url="https://developer.gnome.org/NetworkManager/stable/spec.html">D-Bus API</ulink>,
+        allowing other tools to use the functionality provided by NetworkManager.
+      </para>
+      <para>
+        libnm provides C language bindings for functionality provided by
+        NetworkManager, optionally useful from other language runtimes as well.
+      </para>
+      <para>
+        libnm maps fairly closely to the actual D-Bus API that NetworkManager
+        provides, wrapping the remote D-Bus objects as native GObjects,
+        mapping D-Bus signals and properties to GObject signals and properties,
+        and providing helpful accessor and utility functions.  However, unlike
+        the old libnm-util/libnm-glib API, the mapping to the D-Bus API is not
+        exact, and various inconveniences and historical anomolies of the D-Bus
+        API are papered over.
+      </para>
+      <para>
+        The following is a rough overview of the libnm object structure and
+        how to use the various parts of it:
+        <mediaobject  id="libnm-overview">
+          <imageobject>
+            <imagedata fileref="libnm.png" format="PNG"/>
+          </imageobject>
+        </mediaobject>
+      </para>
+    </section>
+
+    <section id="usage">
+      <title>Using libnm</title>
+      <simplesect>
+        <title>When to use libnm</title>
+        <para>
+          libnm is fairly simple to use from C. It's based on glib and GObject.
+          If your project uses these already you'll find integration libnm with your
+          project rather convenient. In fact, the <command>nmcli</command> tool shipped
+          with NetworkManager is based on libnm.
+        </para>
+        <para>
+          libnm should be also the way to go if your project does something non-trivial
+          with NetworkManager, such as manipulating the connection profiles.
+          That is, if you're writing a specialized networking control tool or a desktop
+          environment, libnm is probably the right choice. The popular desktop
+          environments in fact all use libnm directly or with nm-applet and
+          nm-connection-editor that are all based on libnm.
+        </para>
+        <para>
+          An alternative to use of libnm is the use of the
+          <ulink url="https://developer.gnome.org/NetworkManager/stable/spec.html">D-Bus API</ulink>
+          directly.  This gives you larger flexibility and reduces the overhead of linking
+          with the libnm library. This makes sense if your task is simple and you have a good
+          D-Bus library at your disposal. Activating a particular connection profile
+          from a Python script is a good example of a task that is perfectly simple
+          without using libnm.
+        </para>
+      </simplesect>
+
+      <simplesect>
+        <title>How to use libnm</title>
+        <para>
+          You can use the libnm's C API directly. To do so, all libnm programs need to
+          include <filename>NetworkManager.h</filename> that provides necessary definitions.
+          The rest of the API is documented in the reference manual.
+        </para>
+        <informalexample><programlisting><![CDATA[#include <glib.h>
+#include <NetworkManager.h>
+
+int
+main (int argc, char *argv[])
+{
+	NMClient *client;
+
+	client = nm_client_new (NULL, NULL);
+	if (client)
+		g_print ("NetworkManager version: %s\n", nm_client_get_version (client));
+}]]></programlisting></informalexample>
+        <para>
+          Use <command>pkg-config</command> for <varname>libnm</varname> to discover the necessary
+          compiler flags.
+        </para>
+  <screen><prompt>$ </prompt><userinput>cc $(pkg-config --libs --cflags libnm) -o hello-nm hello-nm.c</userinput>
+  <prompt>$ </prompt><userinput>./hello-nm</userinput>
+  NetworkManager version: &version;
+  <prompt>$ </prompt></screen>
+        <para>
+          Utilize the <varname>PKG_CHECK_MODULES</varname> macro to integrate with an
+          autoconf-based build system. It's also recommended to use
+          <varname>NM_VERSION_MIN_REQUIRED</varname> and <varname>NM_VERSION_MAX_ALLOWED</varname>
+          macros to tell libnm headers which API version does your application need to work with.
+          If you use them, the compiler will warn you when you use functionality that is not
+          available in the versions you specified.
+        </para>
+        <informalexample><programlisting><![CDATA[PKG_CHECK_MODULES(LIBNM, libnm >= 1.8)
+LIBNM_CFLAGS="$LIBNM_CFLAGS -DNM_VERSION_MIN_REQUIRED=NM_VERSION_1_8"
+LIBNM_CFLAGS="$LIBNM_CFLAGS -DNM_VERSION_MAX_ALLOWED=NM_VERSION_1_8"]]></programlisting></informalexample>
+        <para>
+          You can use libnm from other languages than C with the use of GObject introspection.
+          This includes Perl, Python, Javascript, Lua, Ruby and more. The example below shows what the
+          typical libnm use in Python would look like.
+        </para>
+        <informalexample><programlisting><![CDATA[import gi
+gi.require_version('NM', '1.0')
+from gi.repository import NM
+
+client = NM.Client.new(None)
+print ("NetworkManager version " + client.get_version())]]></programlisting></informalexample>
+        <para>
+          There's <ulink url="https://lazka.github.io/pgi-docs/#NM-1.0">NM-1.0 Python API Reference</ulink>
+          maintained a third party that is generated from the introspection metadata.
+        </para>
+        <para>
+          In general, the C API documentation applies to the use GObject introspection
+          from other languages, with the calling convention respecting the language's
+          customs. Consult the source tree for
+          <ulink url="https://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/examples">some examples</ulink>.
+        </para>
+      </simplesect>
+    </section>
   </chapter>
 
   <chapter>
@@ -87,6 +198,7 @@
     <xi:include href="xml/nm-setting-bridge-port.xml"/>
     <xi:include href="xml/nm-setting-cdma.xml"/>
     <xi:include href="xml/nm-setting-dcb.xml"/>
+    <xi:include href="xml/nm-setting-dummy.xml"/>
     <xi:include href="xml/nm-setting-generic.xml"/>
     <xi:include href="xml/nm-setting-gsm.xml"/>
     <xi:include href="xml/nm-setting-infiniband.xml"/>
@@ -94,6 +206,7 @@
     <xi:include href="xml/nm-setting-ip6-config.xml"/>
     <xi:include href="xml/nm-setting-ip-config.xml"/>
     <xi:include href="xml/nm-setting-ip-tunnel.xml"/>
+    <xi:include href="xml/nm-setting-macsec.xml"/>
     <xi:include href="xml/nm-setting-macvlan.xml"/>
     <xi:include href="xml/nm-setting-olpc-mesh.xml"/>
     <xi:include href="xml/nm-setting-ppp.xml"/>
@@ -120,10 +233,12 @@
     <xi:include href="xml/nm-device-bond.xml"/>
     <xi:include href="xml/nm-device-bridge.xml"/>
     <xi:include href="xml/nm-device-bt.xml"/>
+    <xi:include href="xml/nm-device-dummy.xml"/>
     <xi:include href="xml/nm-device-ethernet.xml"/>
     <xi:include href="xml/nm-device-generic.xml"/>
     <xi:include href="xml/nm-device-infiniband.xml"/>
     <xi:include href="xml/nm-device-ip-tunnel.xml"/>
+    <xi:include href="xml/nm-device-macsec.xml"/>
     <xi:include href="xml/nm-device-macvlan.xml"/>
     <xi:include href="xml/nm-device-modem.xml"/>
     <xi:include href="xml/nm-device-olpc-mesh.xml"/>