Application programming interface
*********************************


Service basics
==============

Inside Connection Manager there exists one advanced interface to allow the
user interface an easy access to networking details and user chosen
preferences. This is the service list and interface.

The basic idea is that Connection Manager maintains a single flat and sorted
list of all available, preferred or previously used services. A service here
can be either a Ethernet device, a WiFi network or a remote Bluetooth device
(for example a mobile phone).

This list of service is sorted by Connection Manager and there is no need
for the user interface to implement its own sorting. User decisions will
need to be done via Connection Manager and it is then responsible to update
the order of services in this list.

	+---------------------------------------+
	| Ethernet                              |
	+---------------------------------------+
	| Bluetooth phone                       |
	+---------------------------------------+
	| Guest            (strength 90, none)  |
	+---------------------------------------+
	| My WiFi AP       (strength 80, rsn)   |
	+---------------------------------------+
	| Other AP         (strength 70, rsn)   |
	+---------------------------------------+
	| Friends AP       (strength 70, wep)   |
	+---------------------------------------+

If none of the services has been used before the sorting order will be done
with these priorities:

	1. Ethernet	(lower index numbers first)
	2. Bluetooth	(last used devices first)
	3. GSM/UTMS/3G	(if SIM card is present, activated and not roaming)
	3. WiFi		(signal strength first, then more secure network
			first)

The Ethernet devices are always sorted first since they are physically built
into the system and will be always present. In cases they are switched off
manually they will not be showing in this list.

Since every Bluetooth device has to be configured/paired first, the user
already made a choice here that these are important. Connection Manager will
only show devices with PAN or DUN profile support. While Bluetooth devices
do have a signal strength, it is mostly unknown since background scanning
in Bluetooth is too expensive. The choice here is to sort the last used
Bluetooth device before the others.

WiFi networks closer in the proximity should be shown first since it is more
likely they are selected. The signal strength value is normalized to 0-100
(effectively a percentage) and allows an easy sorting.

WiFi networks with the same signal strength are then sorted by their security
setting. WPA2 encrypted networks should be preferred over WPA/WEP and also
unencrypted ones. After that they will be sorted by the SSID in alphabetical
order.

In the case the WiFi network uses WPS for setup and it is clearly detectable
that a network waits for Connection Manager to connect to it (for example via
a push-to-connect button press on the AP), then this network should be shown
first before any other WiFi networks. The reason here is that the user already
made a choice via the access point. However this depends on technical details
if it is possible to detect these situations.


Service order
=============

All unused services will have the internal order number of 0 and then will
be sorted according to the rules above. For Bluetooth the user already made
the decision to setup their device and by that means select it. However
until the first connection attempt it might have been setup for total
different reason (like audio usage) and thus it still counts as unused from
a networking point of view.

Selecting the "My WiFi AP" and successfully connecting to it makes it a
favorite device and it will become an order number bigger than 0. All
order numbers are internally. They are given only to service that are marked
as favorite. For WiFi and Bluetooth a successful connection attempt makes
these services automatically a favorite. For Ethernet the plugging of a cable
makes it a favorite. Disconnecting from a network doesn't remove the favorite
setting. It is a manual operation and is equal to users pressing
delete/remove button.

	+---------------------------------------+
	| My WiFi AP       (strength 80, rsn)   |  order=1 - favorite=yes
	+---------------------------------------+
	| Ethernet                              |  order=0
	+---------------------------------------+
	| Guest            (strength 90, none)  |  order=0
	+---------------------------------------+
	|                                       |

Ethernet is special here since the unplugging of the network cable will
remove the service from the list

	+---------------------------------------+
	| Ethernet with cable                   |  order=1 - favorite=yes
	+---------------------------------------+
	| Guest            (strength 90, none)  |  order=0
	+---------------------------------------+
	|                                       |

This means that all services with an order > 0 have favorite=yes and all
others have favorite=no setting. The favorite setting is exposed via a
property over the service interface. As mentioned above, the order number
is only used internally.

Within Connection Manager many services can be connected at the same time and
also have an IP assignment. However only one can have the default route. The
service with the default route will always be sorted at the top of the
list.

	+---------------------------------------+
	| Ethernet                              |  order=2 - connected=yes
	+---------------------------------------+
	| My WiFi AP       (strength 80, rsn)   |  order=1 - connected=yes
	+---------------------------------------+
	| Guest            (strength 90, none)  |  order=0
	+---------------------------------------+
	|                                       |

To change the default connection to your access point, the user needs to
manually drag the access point service to the top of the list. Connection
Manager will not take down default routes if there is no reason to do so.
A working connection is considered top priority.

	+---------------------------------------+
	| My WiFi AP       (strength 80, rsn)   |  order=2 - connected=yes
	+---------------------------------------+
	| Ethernet                              |  order=1 - connected=yes
	+---------------------------------------+
	| Guest            (strength 90, none)  |  order=0
	+---------------------------------------+
	|                                       |

Another possible user interaction would be to disconnect the Ethernet service
and in this case the service falls back down in the list.

	+---------------------------------------+
	| My WiFi AP       (strength 80, rsn)   |  order=1 - connected=yes
	+---------------------------------------+
	| Ethernet                              |  order=1 - connected=no
	+---------------------------------------+
	| Guest            (strength 90, none)  |  order=0
	+---------------------------------------+
	|                                       |

If the service on the top of the list changes the default route will be
automatically adjusted as needed. The user can trigger this by disconnecting
from a network, if the network becomes unavailable (out of range) or if the
cable gets unplugged.

As described above, the pure case of disconnecting from a network will not
remove the favorite setting. So previously selected networks are still present
and are sorted above all others.

	+---------------------------------------+
	| Ethernet                              |  order=2 - connected=yes
	+---------------------------------------+
	| My WiFi AP       (strength 80, rsn)   |  order=1 - connected=no
	+---------------------------------------+
	| Guest            (strength 90, none)  |  order=0
	+---------------------------------------+
	|                                       |

Unplugging the Ethernet cable will remove the Ethernet service.

	+---------------------------------------+
	| My WiFi AP       (strength 80, rsn)   |  order=1 - connected=no
	+---------------------------------------+
	| Guest            (strength 90, none)  |  order=0
	+---------------------------------------+
	|                                       |


Service tweaks
==============

The interfaces of Connection Manager will always export all services that are
currently known. The Ethernet devices with no cable plugged are actually not
included in this list. They will only show up once a carrier is detected.

The service interface is not meant for basic device configuration task. So
switching a device on and off (via RFKILL for example) should be done via
the technology interface. See "Technology interfaces" chapter in this document.

Due to limited screen size of small devices and the big amount of WiFi
access points that are deployed right now it might be sensible to not show
certain WiFi networks in the user interface.

The choice to hide a WiFi network from the user interface should be purely
done by the signal strength. The optimal cut-off value here still has to be
determined, but in the end that is a user interface policy.


Service naming
==============

Every service will have a name property that allows the user interface to
display them directly. All names will be already converted into UTF-8. It
derives from the netork details.

In case of WiFi this will be the SSID value. The SSID is a binary array and
will be converted into printable form. Unprintable characters are replaced
with spaces.

In addition to WiFi naming, WiFi networks are subject to a grouping policy
performed around SSID and security type. This means that one service will be
seen for N WiFi networks providing the same SSID and the same security metod.
For instance, if 5 APs are servicing an SSID called "TEST" with WPA2
authentication and 3 APs are servicing the same SSID with open authentication
method, the user will see only two services listed with the name "TEST"
differentiated by their security type, which are "psk" and "none". Such
policy is also applied to hidden networks, where hidden services will have an
empty name and will be differentiated by the security type. The user has then
to select the one with the right security and the Agent API will request any
required information such as the SSID for the network (See "Application
basics" below).

For Bluetooth the device alias is used. The alias is different since it
can be overwritten by the user via the Bluetooth service. The identification
is still done based on its address, but the display name might change. In
most cases the alias is equal to the Bluetooth remote friendly name.

For Ethernet device no name will be provided. The type property will indicate
that this service is Ethernet and then it is up to the user interface to
provide a proper localized name for it.


Service states
==============

Every service can have multiple states that indicate what is currently
going on with it. The choice to have multiple states instead of a simple
connected yes/no value comes from the fact that it is important to let the
user interface name if a service is in process of connecting/disconnecting.

The basic state of every service is "idle". This means that this service
is not in use at all at the moment. It also is not attempting to connect
or do anything else.

The "association" state indicates that this service tries to establish a
low-level connection to the network. For example associating/connecting
with a WiFi access point.

With the "configuration" state the service indicates that it is trying
to retrieve/configure IP settings.

The "ready" state signals a successful connected device. This doesn't mean
it has the default route, but basic IP operations will succeed.

With the "disconnect" state a service indicates that it is going to terminate
the current connection and will return to the "idle" state.

In addition a "failure" state indicates a wrong behavior. It is similar to
the "idle" state since the service is not connected.

		+---------------+
		| idle          |<-------------------------------+
		+---------------+                                |
		      |                                          |
		      |                      +-------------+     |
		      +----------------------| failure     |     |
		      | service.Connect()    +-------------+     |
		      V                           A              |
		+---------------+                 |              |
		| association   |-----------------+              |
		+---------------+      error      |              |
		      |                           |              |
		      | success                   |              |
		      V                           |              |
		+---------------+                 |              |
		| configuration |-----------------+              |
		+---------------+      error                     |
		      |                                          |
		      | success                                  |
		      V                                          |
		+---------------+                                |
		| ready         |                                |
		+---------------+                                |
		      |                                          |
		      | success                                  |
		      |                                          |
		      V                                          |
		+---------------+                                |
		| online        |<----------------+              |
		+---------------+                 |              |
		      |                           |              |
		      | service.Disconnect()      |              |
		      V                           |              |
		+---------------+                 |              |
		| disconnect    |-----------------+              |
		+---------------+      error                     |
		      |                                          |
		      +------------------------------------------+

The different states should no be used by the user interface to trigger
advanced actions. The state transitions are provided for the sole purpose
to give the user feedback on what is currently going on. Especially in
cases where networks are flaky or DHCP servers take a long time these
information are helpful for the user.

Some services might require special authentication procedure like a web
based confirmation. The LoginRequired property should be used to check
for this.


Application basics
==================

All applications should use D-Bus to communicate with Connection Manager. The
main entry point is the manager object. Currently the manager object is
located at "/", but this might change to allow full namespacing of the API
in the future. The manager interface is documented in manager-api.txt and
contains a set of global properties and methods.

A simple way to retrieve all global properties looks like this:

	bus = dbus.SystemBus()

	manager = dbus.Interface(bus.get_object("net.connman", "/"),
						"net.connman.Manager")

	properties = manager.GetProperties()

Changing a global property is also pretty simple. For example enabling the
so called offline mode (aka flight mode) it is enough to just set that
property:

	manager.SetProperty("OfflineMode", dbus.Boolean(1))

The manager object contains references to profiles, devices, services and
connections. All these references represent other interfaces that allow
detailed control of Connection Manager. The profiles and devices interfaces
are more for advanced features and most applications don't need them at all.

The services are represented as a list of object paths. Every of these object
paths contains a service interface. A service is a global collection for
Ethernet devices, WiFi networks, Bluetooth services etc. and all these
different types are treated equally.

Every local Ethernet card will show up as exactly one service. WiFi networks
will be grouped by SSID, mode and security setting. Bluetooth PAN and DUN
service will show up per remote device. This creates a simple list that can
be directly displayed to the users since these are the exact details users
should care about.

	properties = manager.GetProperties()

	for path in properties["Services"]:
		service = dbus.Interface(bus.get_object("net.connman", path),
							"net.connman.Service")

		service_properties = service.GetProperties()

The service interface is documented in service-api.txt and contains common
properties valid for all services. It also contains method to connect or
disconnect a specific service. This allows users to select a specific service.
Connection Manager can also auto-connect services based on his policies or
via external events (like plugging in an Ethernet cable).

Connecting (or disconnecting) a specific service manually is as simple as
just telling it to actually connect:

	service.Connect()  or  service.Disconnect()

It is possible to connect multiple services if the underlying technology
allows it. For example it would be possible to connect to a WiFi network
and a Bluetooth service at the same time. Trying to connect to a second WiFi
network with the same WiFi hardware would result in an automatic disconnect
of the currently connected network. Connection Manager handles all of this
for the applications in the background. Trying to connect an Ethernet service
will result in an error if no cable is plugged in. All connection attempts
can fail for one reason or another. Application should be able to handle
such errors and will also be notified of changes via signals.

Connection Manager will interact with an agent via the Agent API to confirm
certain transactions with the user. If Connection Manager needs extra
information, it will ask the user for exactly the information it requires,
i.e. passphrase, network's name (for hidden WiFi networks) and more depending
on the use case (e.g. WPS, EAP). Therefore an application environment using
Connection Manager should implement one dedicated Connection Manager agent
according to the Agent API in order to interact with the user. Please see
agent-api.txt for implementation details.

To monitor the current status of a service the state property can be used. It
gives detailed information about the current progress.

	properties = service.GetProperties()

	print properties["State"]

All state changes are also sent via the PropertyChanged signal on the
service interface. This allows asynchronous monitoring without having to poll
Connection Manager for changes.


Technology interfaces
=====================

When ConnMan is started first time, all technologies except ethernet are
powered off by default. The reason is that the user needs to decide which
technologies are relevant to him and what bearers the user wants to use.
User can use the Technology Powered property to turn on or off a given
technology. See doc/technology-api.txt document for details.

User can activate offline (flight) mode via Manager OfflineMode property.
While in offline mode, all the technologies including ethernet are
powered off. During the offline mode, the user can temporarily activate
individual technologies by using the Technology Powered property or by
using the rfkill command or Fn-Fx key combination found in some laptops.

If the host supports rfkill switch, then all the radios can be turned off
by the kernel when the switch is activated. ConnMan will notice this and
remove corresponding technologies from D-Bus. Technologies cannot be
activated while rfkill switch is turned on. When rfkill switch is turned
off (radios are activated), then ConnMan restores the original Powered
status for each activated technology.

User can use the rfkill command from command line or indirectly via
some UI component to activate/deactivate individual radios found in
the host. ConnMan will listen these rfkill events and set the Powered
property accordingly. ConnMan will not save the rfkill status it has
received. This means that after restarting ConnMan, the original and
saved technology status is used when deciding which technologies should
be powered. If the user uses the Technology D-Bus API to set the Powered
property, then that information is saved and used when ConnMan is restarted.
