The last update time of this post was: February 2nd, 2016.
Source code organizationSo, let us start with a source tree organization. If you take a look at the top level directory of the NetworkManager git tree, you'll find there some files and the set of directories. The files are build scripts and configuration files, there are also some documentation files. But, in the end all the interesting functionality is placed within the top level directories. There are the following top level directories:
Clients to control NM like nmcli or nmtui.
contains XML description of DBus interfaces provided by NetworkManager and its components. For example, VPN plugins are external to NetworkManager but they use DBus to communicate with NetworkManager and there is an XML file that describes VPN plugin's interfaces. All the descriptions are converted into C code stubs and skeletons using dbus-binding-tool. There is a lot of magic staff happening here.
Libraries intended to be used by clients accessing and using services provided by NetworkManager. This also includes application that control NetworkManager itself (like nmcli and nmtui)
Core NM libraries used by NetworkManager itself and all the other components, like command line utilities.
- libnm-glib, libnm-util
Old NM libraries that are deprecated starting with 1.0 release of NetworkManager. Still, it seems that at least some functionality is used from those libraries so probably until all the pieces of NetworkManager are converted to the new libraries they are to stay. Note that in my posts I ignore the content of those libraries as much as possible and I concentrate on the previous two libraries, libnm and libnm-core.
The directory with the code specific to the NetworkManager unlike the previous directories that contain code used by different programs. The src/ directory contains file and a number of subdirectories:
Classes and sub classes used to represent different networking devices, real and virtual, that can be managed by NetworkManager.
Manager class that manages and interfaces DHCP clients to NetworkManager.
Platform specific code that interfaces NetworkManager to particular operating system it is running on. For the moment there is a base class and derived Linux specific class.
Code to monitor and parse IPv6 router advertisement messages.
Code to keep track of connections. Since connections are read from configuration files that depend on particular distributions this directory also contains plugins, one plugin for each supported distribution.
VPN specific code. Here is a manager class that is used to manage all the VPN connections and also class that is used to represent each active VPN connection.
Run-time initialization behavior
When NM is started execution starts from main() function that can be found in src/main.c. The goal of the main function is to parse command line options, check some prerequisites for running NM, do initialization steps and start glib main loop. The most interesting are initialization steps which are:
- Initialize logging.
- Create configuration object singleton, NM_TYPE_CONFIG (defined in file src/nm-config.c).
- Creates a singleton for managing DBus connections and communication, NM_TYPE_BUS_MANAGER (defined in file src/nm-bus-manager.c).
- Creates a singleton that is platform dependent used for management of network subsystem, NM_TYPE_LINUX_PLATFORM (defined in file src/platform/nm-linux-platform.c).
- Creates a main singleton object of class NM_TYPE_MANAGER (defined in file src/nm-manager.c).
- Initializes loopback interface.