release: update TODO with enhanced connectivity check ideas
[NetworkManager.git] / TODO
1 So you're interested in hacking on NetworkManager?  Here's some cool
2 stuff you could do...
3
4 * Internet Connectivity Detection Enhancements
5
6 Current connectivity checking is global, while what we really want is to check
7 connectivity per-interface and update the global state based on the composite
8 of each device's state.  Unfortunately that requires two things:
9
10 1) latest libsoup and glib for using libsoup connection state signals, which
11    allow us to set socket options before the actual connection is made; here
12    we'd bind the socket to the specific IP address of the interface we're
13    using, and possibly set SO_BINDTODEVICE as well
14 2) setting /proc/sys/net/ipv4/conf/<iface>/rp_filter to "2" which tells the
15    kernel to route the incoming and outgoing packet properly even though the
16    interface may not have the necessary routes
17
18 The first is the largest obstacle, but ideally we implement this and enable it
19 when we have the required glib and libsoup versions available.  One other
20 complication is that this checking should be done during the
21 NM_DEVICE_STATE_IP_CHECK phase (along with other operations like WiFi hotspot
22 auto-login) while the current checks are done globally in nm-manager.c, so 
23 keeping both code paths might be complex.
24
25 But ideally, once the device has successfully gotten an IPv4 or IPv6 address, it
26 should enter the state NM_DEVICE_STATE_IP_CHECK, where a connectivity check is
27 started.  After the check returns, the device would set a property in
28 NMDevicePrivate to indicate whether Internet access was successful or not, and
29 advance to the NM_DEVICE_STATE_ACTIVATED state.
30
31 The NMManager object, when determining the overall NM_STATE_* state in the
32 nm_manager_update_state() function, would query this property and set
33 NM_STATE_CONNECTED_LOCAL, NM_STATE_CONNECTED_SITE, or NM_STATE_CONNECTED_GLOBAL
34 based on it and the device's state.
35
36
37 * ADSL support
38
39 NetworkManager should natively support ADSL modems using one of the 3 main
40 connection methods, PPP over ATM (pppoa), PPP over Ethernet (pppoe), or
41 IP over ATM (ipoatm).  Initial support could be targeted at just pppoa and
42 pppoe, and there is some code in NetworkManager already for pppoe.  More info
43 about ADSL configuration on Linux in general is here:
44
45 http://atm.eagle-usb.org/wakka.php?wiki=UeagleAtmDoc
46
47 Big thanks to Pantelis Koukousoulas for getting ADSL working for PPPoA and PPPoE
48 methods in the 'adsl' branch in NetworkManager git.  We need more testing, IPv6
49 PPP support, and also support for multiple ADSL devices (by reading the "atmindex"
50 attribute from the sysfs directory for the ATM interface on 2.6.38.8 and later
51 kernels).
52
53
54 * Real Access Point mode support
55
56 Now that NetworkManager requires wpa_supplicant 0.7.x or later, we can add
57 full Access Point (AP) mode support.  NetworkManager currently implements
58 connection sharing via AdHoc mode support, which has some limitations.  Instead,
59 we should check whether the wifi device supports AP mode, and if so, use
60 that mode instead.  wpa_supplicant has support for a "lightweight AP" mode which
61 we should use.  Witold Sowa started this support a while ago and wrote the new
62 D-Bus API for wpa_supplicant that makes all this possible, but some NM pieces
63 are still missing.  If the wifi driver supports AP mode, then in
64 src/supplicant-manager/ NM should send an AP-mode config instead of sending
65 the adhoc config.
66
67 Note that some devices (airo, ipw2100, ipw2200, iwl3945, iwl4965, atmel, zd1201)
68 will never support AP mode due to firmware limitations, so we clearly must still
69 provide Ad-Hoc connection sharing support for those devices and switch between
70 Ad-Hoc and AP mode depending on device capabilities.
71
72
73 * On-Demand WiFi Scan support
74
75 Single-user and embedded devices often use a continuous wifi scan when the
76 networking configuration interface is open to quickly allow users to find their
77 wifi network.  NM periodically scans, but this could take as long as 2 mintues
78 to update the list.  Note that WiFi scans require 2 - 10 seconds to complete,
79 and during this time normal traffic (video, VOIP, streaming music, downloads,
80 etc) is not transmitted, so a WiFi scan is a disruptive operation to the user.
81
82 A D-Bus method should be added to the NMDeviceWifi device to allow user
83 applications to request a scan.  This request should be rate-limited to no
84 more than once every 10 seconds to give time for traffic to resume when the
85 scan is done, and to lessen the effect of any DDoS by malicious user
86 applications.  This request should also be restricted by one or more PolicyKit
87 permissions like org.freedesktop.NetworkManager.network-control.
88
89 To begin, a new method definition should be added to the
90 introspection/nm-device-wifi.xml for a method called "RequestScan" which takes
91 an argument called "options" of type of "a{sv}".  This argument will be used
92 later.  An annotation (like the other functions have) should be added so that
93 the method will be called "impl_device_request_scan".
94
95 Next, the corresponding method implementation should be added to
96 src/nm-device-wifi.c by adding the prototype for impl_device_request_scan
97 near the top of the file, and implementing it below.  The implementation will
98 recieve a GHashTable corresponding to the "a{sv}" argument list from the XML
99 file, but we can ignore that for now.
100
101 The incoming request should be authenticated using nm_auth_get_caller_uid()
102 and additionally starting a PolicyKit authentication check with
103 with nm_auth_chain_new().  See the function manager_device_disconnect_request()
104 in src/nm-manager.c for an example of this.
105
106 Only after the caller is authorized to scan should the request be checked
107 against the last scan timestamp, and if the last scan was 10 seconds or more
108 ago, a new scan should be requested.
109
110
111 * Reconnect to WiFi Networks Only If They Succeeded Once
112
113 Currently, NetworkManager will attempt to connect to a previously attempted
114 WiFi network even if that network was never successfully connected to.  This
115 causes confusion because sometimes users will randomly try various WiFi networks
116 hoping to find an open AP, and then wonder why NM tries to reconnect to any of
117 those APs later when none of them worked originally due to AP-side MAC filtering
118 or other failures.  What should happen is that NetworkManager should set a flag
119 on a connection when that connection is successfully connected at least once,
120 and only autoconnect the wifi network if that flag is present *and* the
121 NMSettingConnection's 'autoconnect' property is TRUE.
122
123 This is a bit tricky because we want to consider all connections that don't have
124 this flag as having succeeded so that we don't break users' existing connections,
125 while holding all newly created connections to this policy.  This flag should
126 be determined and set for all connections, even if we only use it to determine
127 WiFi behavior for now.
128
129 This flag should be a new gboolean property on the NMSettingConnection object
130 called "connect-success", with a default value of TRUE.  It should default to
131 TRUE to ensure that existing connections are assumed to have connected
132 successfully in the past.  New connections created via the AddConnection and
133 AddAndActivateConnection D-Bus method calls should have the 'connect-success'
134 property explicitly set to FALSE.  Then, in nm-device.c's device_state_changed()
135 function where the NM_DEVICE_STATE_ACTIVATED state is handled, the
136 'connect-success' property should be set to TRUE.
137
138 For WiFi then, in nm-device-wifi.c's get_best_auto_connection() method, the
139 'connect-success' property should be checked and if it is FALSE, the connection
140 is not considered for auto-activation.
141
142
143 * Implement NM_DEVICE_STATE_DISCONNECTING
144
145 To allow for "pre-down" scenarios, this state should be implemented before a
146 device is taken down while it still has connectivity.  If the device is
147 taken down because it's ethernet carrier was dropped, or because the WiFi
148 connection was terminated by the supplicant, this state is pointless and should
149 be skipped.  But if the user requested a manual "disconnect", or NM is dropping
150 connections on exit, etc, then this state should be entered.  In the future
151 this state should hook into a new dispatcher action in src/NetworkManagerUtils.c
152 to exectue dispatcher scripts during the disconnection, and to wait a limited
153 amount of time for each script to complete before allowing the device to
154 proceed to the NM_DEVICE_STATE_DISCONNECTED state, fully implementing pre-down.
155
156
157 * Ethernet Network Auto-detection
158
159 There are various methods we can use to autodetect which wired network connection
160 to use if the user connects to more than one wired network on a frequent basis.
161 First, 802.1x enterprise switches broadcast frames which can be used to indicate
162 that the switch supports 802.1x and thus allow NetworkManager to select an
163 802.1x connection instead of blindly trying DHCP.  Second, NetworkManager could
164 listen for traffic from a list of MAC addresses.  Third, NetworkManager could
165 integrate 'arping' functionality to determine if a given IP address matches a
166 given MAC address, and thus automatically select that connection.  All these
167 methods can co-exist and be used in parallel.
168
169 One small caveat is that MAC addresses are trivial to spoof, so just because
170 NetworkManager has discovered a certain MAC address does not mean the network
171 is authenticated; only 802.1x security can assure that a network is the network
172 the user expects it to be.
173
174 In any case, a new 'anchor-addresses' property of type string-array should be
175 added to the NMSettingWired setting.  Each string element of this property
176 should be of the format "<ip>/<mac>" or simply "<mac>".  The first format with
177 an IP address would indicate that "arping"-type behavior should be used to
178 actively detect the given MAC address; obviously if the given MAC address is
179 used for passive discovery as well.  The second format simply lists a MAC
180 address to passively listen for.
181
182 One drawback of listening or probing for known MAC addresses is an increase in
183 latency during connections to ethernet networks.  The probing/listening delay
184 should be a reasonable amount of time, like 4 - 5 seconds or so, and should
185 only be used when a visible connection has anchor addresses.
186
187 Next a gboolean 'anchor-probing' variable should be added to the
188 NMDeviceEthernetPrivate structure in src/nm-device-ethernet.c.  This variable
189 should be set to TRUE whenever the device's carrier turns on *and* there are
190 visible NMConnections with anchor addresses (ie, connections which are system-
191 wide or where one of the allowed users of that connection is logged in).  Then
192 probing and listening are started, which involves opening a low-level socket
193 on the interface and starting the arping run or listening for MAC addresses.
194 A timer is also started (don't forget to cache the timer's source ID in the
195 NMDeviceEthernetPrivate data, and to cancel the timer whenever the device
196 transitions to any state other than DISCONNECTED).
197
198 If a known MAC address is discovered as a result of probing or listening, the
199 probe/listen socket, timeout, and data are cleaned up, and NetworkManager
200 would begin activation of the NMConnection that specified the found MAC address
201 in the 'anchor-addresses' property.  If two or more connections specify the
202 same MAC address, the connection with the most recent timestamp should be
203 preferred.
204
205 Similarly, if the probing/listening process detects 802.1x frames the device
206 should be marked as requring 802.1x authentication until the carrier drops.
207 This would be accomplished by adding a new property to the NMDeviceEthernet
208 object and exporting that property through the
209 introspection/nm-device-ethernet.xml file.  This would allow clients like
210 applets to ensure that users are aware that the device will not allow
211 un-authenticated connections and that additional credentials are required to
212 successfully connect to this network.
213
214
215 * VPN re-connect
216
217 NM should remember whether a VPN was connected if a connection disconnects
218 (like WiFi drops out or short carrier drop) or if the laptop goes to sleep.
219 Upon reconnect, if the same Connection is again active, the previously
220 connected VPN should be activated again as well.  Basically, don't just drop
221 the VPN because WiFi choked for 10 seconds, but reconnect the VPN if it was
222 connected before the drop.
223
224
225 * VPN autoconnect
226
227 We should add a property to the NMSettingConnection object in
228 libnm-util/nm-setting-connection.c called "vpns" that is a string list,
229 containing a list of Connection UUIDs that should be activated when the base
230 connection itself is activated.  This will allow a VPN connection to be
231 started every time another connection is started, so that if you choose you're
232 always on the VPN in your favorite coffee shop.
233
234 The NM_DEVICE_STATE_SECONDARIES state was added specifically for cases like
235 this.  Thus, after the base device has IP connectivity, but before it has
236 signaled that it's fully activated, the device should enter the SECONDARIES
237 state and kick off activation of the given VPN connection.  Only after this
238 VPN connection has successfully connected should the base device to the
239 NM_DEVICE_STATE_ACTIVATED state.
240
241
242 * VPN and IPv6
243
244 The internal VPN capability should support IPv6.  Essentially, the D-Bus
245 interface between NetworkManager and the VPN service daemons should be extended
246 with an IP6Config signal that passes up the IPv6 addressing and routing details
247 if the VPN daemon is IPv6 capable.  NM should then process those details like it
248 does with IPv4.  include/NetworkManagerVPN.h should be updated with key/value
249 pairs defining the various IPv6 attributes much like the IPv4 ones are defined.
250
251
252 * VPN IP Methods
253
254 Some VPNs (openvpn with TAP for example) require that DHCP is run on a
255 pseudo-ethernet device to obtain addressing information.  This is not currently
256 possible, but NM already has all the code for DHCP.  Thus, a new "method"
257 key should be defined in include/NetworkManagerVPN.h to allow for DHCP to
258 be performed if the VPN service daemon requests it in the IP4Config or IP6Config
259 signals.  A patch here:
260
261 http://cgit.freedesktop.org/NetworkManager/NetworkManager/commit/?h=vpn-ip-method
262
263 shows that.  In nm-vpn-connection.c, upon receipt of the D-Bus Ip4Config signal
264 from the VPN plugin, NetworkManager would inspect the "method" property of the
265 ip4 config dictionary.  If that property was present and set to "auto" then
266 DHCP would be started using the network interface returned in the dict.  The
267 nm_vpn_connection_ip4_config_get() function should be split up into two
268 functions, one containing the existing code for static configuration, and a
269 second for handling DHCP kickoff.  Minimal parsing of the response should be
270 handled in the newly reduced nm_vpn_connection_ip4_config_get() function.
271
272 To handle DHCP, the NMVPNConnectionPrivate structure should have two members
273 added:
274
275     NMDHCPManager *dhcp_manager;
276     NMDHCPClient  *dhcp4_client;
277
278 which would be initialized in the new DHCP handler code split off from
279 nm_vpn_connection_ip4_config_get().  These new members would be disposed of in
280 both vpn_cleanup() and dispose(), though remember to stop any ongoing DHCP
281 transaction when doing so (see dhcp4_cleanup() in nm-device.c for example code).
282 For basic code to start the DHCP transaction, see dhcp4_start() in nm-device.c
283 as well.  After calling nm_dhcp_manager_start_ip4() and connecting the signals
284 to monitor success and failure, the VPN IP4 config handler would simply return
285 without changing VPN state, unless a failure occurred.
286
287 Then, when the DHCP transaction succeeds, which we'd know by checking the
288 DHCP client state changes in the "state-changed" signal handler we attached to
289 the DHCP client object returned from nm_dhcp_manager_start_ip4(), the code
290 would retrieve the completed NMIP4Config object from the DHCP client using the
291 nm_dhcp_client_get_ip4_config() function, and then proceed to execute
292 essentially the bottom-half of the existing nm_vpn_connection_ip4_config_get()
293 function to merge that config with user overrides and apply it to the VPN
294 tunnel interface.  Other state changes from the DHCP client might trigger a
295 failure of the VPN connection, just like DHCP timeouts and lease-renewal
296 failures do for other devices (see dhcp_state_changed() in nm-device.c).
297
298
299 * VPN Service Daemon Secret Requests
300
301 In addition to NM asking the service daemons whether more secrets are required,
302 VPN service daemons (like nm-vpnc-service, nm-openvpn-service, etc) should be
303 able to ask NetworkManager to provide secrets during the connection attempt. To
304 do this, the plugin should advertise its ability to handle out-of-band secrets
305 in its .service file via the key 'async-secrets=true'.  NetworkManager would
306 check that key and if present activate the VPN as normal, but skip the explicit
307 NeedSecrets calls.
308
309 Instead, a new "SecretsRequired" signal would be added to
310 introspection/nm-vpn-plugin.xml (and corresponding helper code added to
311 libnm-glib/nm-vpn-plugin.c) that would be emitted when the plugin determined
312 that secrets were required.  This signal would have D-Bus signature of "sas"
313 for the arguments [ <s:uuid>, <as:secrets> ] with the <uuid> obviously being
314 the connection UUID, and <secrets> being an array of strings of plugin-specific
315 strings the plugin requires secrets for.  This array of strings would then be
316 passed as the "hints" parameter in nm-vpn-connection.c when secrets are
317 requested from agents in a subsequent nm_settings_connection_get_secrets() call.
318 At this time the agent code only allows one hint per request, so we may need to
319 extend that to allow more than one hint.
320
321 Thus when connecting if the plugin supported async secrets NetworkManager would
322 still request existing secrets (without interactivity) and send them to the
323 VPN service daemon in the Connect D-Bus method, then wait for the service daemon
324 to either request secrets asynchronously via the SecretsRequired signal or to
325 signal successful connection via the Ip4Config signal.
326
327 The vpnc plugin would need to be reworked to open a pipe to vpnc's stdout and
328 stdin file descriptors to capture any authentication messages, and to match
329 these messages to known secrets request strings.  When receiving one of these
330 strings the plugin would determine which secret was being requested and then
331 emit the SecretsRequired signal to NetworkManager.  This would also imply that
332 nm-vpnc-service exectutes vpnc with the "--xauth-inter" argument to enable
333 challenge-response and does not use the "--non-inter" flag which suppresses that
334 behavior.
335
336
337 * WPS
338
339 wpa_supplicant has support for WPS (Wifi Protected Setup, basically Bluetooth-
340 like PIN codes for setting up a wifi connection) and we should add support for
341 this to NetworkManager too.  APs that support WPS will say so in their beacon
342 IEs which are contained in the "WPA" and "RSN" properties of the BSS object
343 exported by the supplicant, and can be processed in src/nm-wifi-ap.c's
344 foreach_property_cb() function.  We should add some private fields to the
345 NMAccessPoint object (defined in nm-wifi-ap.c) to remember whether a specific
346 AP supports WPS and what WPS methods it supports, and expose that over D-Bus to
347 GUI clients as well.
348
349 There are two common WPS setup methods: PIN and button.  For PIN, the router
350 either displays a random PIN on an LCD or the router's web UI, or a static PIN
351 is printed on the router itself.  The user enters that PIN instead of a PSK
352 when connecting.  For the "button" method, the router has a physical button that
353 when pushed, allows any client to connect for a short period of time.
354
355 We'll then need to add some properties to the NMSettingWirelessSecurity setting
356 for the WPS PIN code so that when the user enters it through the GUI, it can
357 be passed back to NM.  And we'll need to figure out some mechanism for passing
358 back an indication that the user pushed the button on the router for the
359 pushbutton method.
360
361 When connecting to a new access point that supports WPS, the GUI client would
362 call the AddAndActivateConnection method and wait for NM to request secrets.
363 NM would determine that the AP supports WPS, and request WPS secrets from the
364 applet.  The applet would ask the user for a PIN, or to push the button on the
365 AP, instead of asking for a passphrase or PSK.  When the user has entered the
366 PIN or pushed the button, the applet returns this information to NM, which
367 proceeds with the connection.
368
369 NM sends the correct wpa_supplicant config for WPS to the supplicant, and waits
370 for the connection to occur.  WPS can only be used the *first* time, so after a
371 first successfull connection, NM must request the actual hexadecimal PSK from 
372 wpa_supplicant via D-Bus, and store that PSK in the connection, clear any WPS
373 PIN code from the connection, and save the connection to backing storage.
374
375 Any applet GUI should also allow the user to enter the PSK instead of completing
376 association using WPS, since quite a few routers out there are broken, or
377 because the user has no physical access to the router itself, but has been given
378 as passphrase/PSK instead.
379
380
381 * Proxies
382
383 HTTP and other proxies are per-connection configuration.  It's highly unlikely
384 that the same proxy you need to use at work is used at home or in a coffee shop.
385 Thus, it makes sense that which proxy settings to use should be updated when
386 network connections change.  NetworkManager is a perfect place to do this since
387 it tracks which network connections are active, and it already queries the
388 network for automatic proxy configuration via DHCP and WPAD.
389
390 We should add a new NMSetting subclass called NMSettingProxy that holds
391 necessary proxy configuration.  The properties of this setting should be a
392 superset of what is provided in the Firefox proxy configuration screen and the
393 various desktop environment proxy configuration tools like the GNOME Network
394 Proxy control panel; this should include at a minimum:
395
396   method: "auto", "manual", "none"
397   default-proxy: string
398   default-proxy-port: uint
399   default-always: boolean (use default proxy for all protocols)
400   ssl-proxy: string
401   ssl-proxy-port: uint
402   ftp-proxy: string
403   ftp-proxy-port: uint
404   socks-proxy: string
405   socks-proxy-port: uint
406   socks-version: uint, either 4 or 5
407   no-proxy-for: array of strings (things not to use the proxy for, ie ".foobar.com",
408                  "192.168.0.1/24", an IPv6 address, etc)
409   pac-url: string (URL of PAC file, overrides DHCP-provided WPAD value)
410   (FIXME: proxy authentication?  do we need separate user/pass properties for
411     each protocol type?  should NM handle proxy auth or should it be punted
412     to each application?)
413
414 After completing IP configuration but still during the NM_DEVICE_STATE_IP_CONFIG
415 activation stage, NetworkManager would merge the automatically supplied proxy
416 configuration (from DHCP's WPAD option) with user-provided overrides from the
417 NMSettingProxy and send the results to the system.  The 'default' connection's
418 proxy configuration would be preferred, so we'd have to update proxy
419 configuration from nm-policy.c the same time we update DNS information and the
420 default route.
421
422 The merged proxy configuration would then be sent to the system.  There is no
423 canonical proxy daemon in-use, so we should have plugins (if not separate
424 shared libraries, then certainly encapsulated source files that implement a
425 common glib GInterface or are subclasses of eg a parent NMProxyHandler class)
426 that handle different system proxy handlers.  Some of the proxy handlers are:
427
428   libproxy: need to figure out how it gets proxy info and have NM write merged
429              proxy config out to that location
430   pacrunner: a D-Bus enabled daemon, NM would call D-Bus methods of the
431                pacrunner service with the proxy information
432   GNOME/KDE: how do these desktop environments retrieve proxy configuration?
433
434
435 * Bridging and Bonding Support
436
437 The largest complication here is that NetworkManager normally operates on
438 physical interfaces, while bridging and bonding involve tying multiple physical
439 interfaces together into a logical interface.  This has interesting implications
440 for the D-Bus API and the NM device model.  The first complication is that
441 we may need to do 802.1x port authentication on an interface before it can
442 communicate with the other side of the link, and those credentials may be
443 different for each interface; thus we may need to do separate 802.1x
444 operations on each interface that is part of a bridge/bond before adding each
445 one to the master bridge/bond interface.
446
447 In this way bridge/bond interfaces may be treated the same way as NetworkManager
448 treats VPN interfaces already; one or more physical interface NMConnections must
449 be activated before the master bridge/bond interface's NMConnection can be
450 activated, though this all happens internally.
451
452 To enable bridging and bonding in the NMConnection itself, we should create
453 new NMSettingBridge and NMSettingBond classes that contain information specific
454 to each.  Both settings would contain a 'components' property with an
455 'array of string' type which would contain the UUIDs of the Connections of
456 physical interfaces that compose the bridge or bond.  Thus NetworkManager would
457 have the necessary information to tie lower-level interface configuration
458 (802.1x, MTU, MAC address locking, duplex mode, speed, etc) to each physical
459 interface that will be part of the bridge/bond, configure the interface with
460 it, and then configure the master bridge/bond interface at upper layers using
461 configuration specific for the bridge/bond interface (like IP details).  Thus
462 for a single active bridge, two or more NMConnections would be activated; one
463 for each physical interface component of the bridge/bond, and one for the master
464 bridge/bond interface itself.
465
466 NMSettingBridge would contain at least the following keys:
467
468   components: (array of string) UUIDs of component connections
469   stp:        (boolean) on to enable STP, off to disable
470
471 NMSettingBond would contain at least the following keys:
472
473   components: (array of string) UUIDs of component connections
474   mode:       (string) one of "balance-rr", "active-backup", "balance-xor",
475                   "broadcast", "802.3ad", "balance-tlb", or "balance-alb"
476   monitor-interval: (uint) Specifies link monitoring interval (in milliseconds);
477                        NM will always enable netlink carrier monitoring if this
478                        value is non-zero so this property only affects speed and
479                        duplex checking
480
481 In the future we may consider adding other bonding parameters like "up-delay"
482 and "down-delay".
483
484 Then we'd add a 'component' (boolean) property to NMSettingConnection to
485 indicate that the component interface connections were in fact components of
486 a bridge or bond and shouldn't be automatically started by NetworkManager or
487 displayed as separate connections in the user interface.
488
489 TO BE CONTINUED
490
491
492 * Better Tablet/Mobile Behavior
493
494 There are a few components to this:
495
496 1) kernel driver and hardware capabilities: most mobile devices use periodic
497 background scanning to quickly determine whether a known SSID is available and
498 notify the connection manager to connect to it.  This typically requires special
499 capabilities and good powersave/sleep support from the WiFi kernel driver.
500 There is a background scanning API in nl80211, but we need to determine how many
501 SSIDs each driver allows for background scanning, and based on that number, give
502 the driver the most recent N SSIDs.  We still need to periodically wake the
503 device up and do a full scan just in case the user is near a known SSID that was
504 not in the N top recently used networks.  This is also beneficial to normal
505 desktop use-cases.
506
507 wpa_supplicant doesn't currently provide an explicit interface for sending SSIDs
508 to the driver for background scanning, but could simply send a list using
509 configured networks.  However, NM currently does not send *all* configured
510 connections' SSIDs to the supplicant, so that's something we should do first
511 to optimize connection times.  To do this, NM would need to order all networks
512 using the NM timestamp and convert that into a supplicant priority number, which
513 would need to be adjusted periodically when the timestamp was updated.  This
514 would involve tracking each network (exposed by the supplicant as a D-Bus
515 object) and making sure they were added, deleted, and updated when the backing
516 NMConnection objects changed.  One complication is that the supplicant
517 requires secrets for various network types when the network is added via D-Bus,
518 and NetworkManager might not have those secrets yet.  We may need to modify
519 the supplicant allow for *all* secrets (PSKs, WEP keys, etc) to be requested
520 on-demand, not just EAP secrets like 802.1x passwords.  We then need to fix
521 up the supplicant's D-Bus interface to actually send requests for secrets out
522 over D-Bus (like wpa_supplicant_eap_param_needed() does for the socket-based
523 control interface) and to handle the resulting reply from a D-Bus client like
524 wpa_supplicant_ctrl_iface_ctrl_rsp() does.
525
526 With the secrets request stuff and priority handling in place, wpa_supplicant
527 would control network selection and roaming (based on the priorities NM gave it
528 of course) instead of NetworkManager itself, and hopefully lead to a faster WiFi
529 connection process.
530
531 2) single-device-at-a-time with overlapping connections: this is also probably
532 the best route to go for desktop use-cases as well.  Instead of bringing all
533 available connections up, only bring up the "best" connection at any given
534 time based on the current priority list (which is rougly Ethernet > WiFi >
535 3G/Bluetooth/WiMAX).  However, to ensure seamless connectivity, when one
536 connection begins to degrade, the next-best connection should be started before
537 the current one is terminated, such that there is a small amount of overlap.
538 Consequently the same behavior should be used when a better connection becomes
539 available.  This behavior should be suspended when special connections like
540 Internet Connection Sharing ones are started, where clearly the priorities
541 are different (ie, for Mobile Hotspot 3G > WiFi).
542
543
544 * IP over Infiniband (IPoIB)
545
546 These interfaces are similar to Ethernet interfaces with a few distinct
547 differences:
548
549   1) they have 64-bit MAC addresses (GUIDs in Infiniband parlance)
550   2) DHCP clients need to be modified to handle IPoIB
551   3) they have a different ARP type and different L2 options
552
553 By default the interfaces do not have IP capability, but they gain that
554 capability when certain kernel modules (ib_ipoib.ko) are loaded, which causes
555 the IP-capable interface is created.  The IP-capable interfaces apparently have
556 ARPHRD_INFINIBAND set, which is likely what NM should use to identify them.
557
558 One outstanding question is whether NM should (a) detect all Infiniband
559 interfaces and load ib_ipoib.ko only when there is a defined NMConnection for
560 an Infiniband interface, or (b) whether NM should automatically load ib_ipoib.ko
561 for every Infiniband interface, or (c) whether NM should only manage Infiniband
562 interfaces that already have associated IP-capable interfaces (ie, something
563 else is responsible for loading ib_ipoib.ko).  Depending on our implementation,
564 (a) might not be possible, because if IPoIB connections are treated similar to
565 plain Ethernet connections, we may not have any information about whether a
566 specific NMConnection is Infiniband other than the MAC address.
567
568 It turns out that on some distros other components (like system services) may
569 load ib_ipoib.ko for us.  For exmaple, the 'rdma' package on Fedora/RHEL systems
570 contains /etc/rc.d/init.d/rdma which uses values in /etc/rdma/rdma.conf to load
571 ib_ipoib.ko at system startup if the user has requested it via IPOIB_LOAD=yes.
572 For the time being, if the some other component of the system loads IP for us,
573 NetworkManager should probably still recognize the Infiniband interface, but
574 leave it in unmanaged mode if there is no available IPoIB interface associated
575 with the Infiniband one.  i.e. for now, NM should not automatically load
576 ib_ipoib.ko.
577
578 The second question is whether to fold IPoIB support into the NMDeviceEthernet
579 class as was done for s390 network interfaces, or whether to create a subclass
580 of NMDevice:
581
582 1) extend NMDeviceEthernet: this would involve loosening the assumption that
583 hardware addresses (the 'hw-address'/'perm-hw-address' properties of
584 NMDeviceEthernet and the 'mac-address'/'cloned-mac-address' properties of
585 NMSettingWired) are 48 bits wide and instead can be either 48 or 64 bits wide.
586
587 2) create a new NMDevice subclass for Infiniband devices tailored to Infiniband
588 specific behavior and attributes.  This would be a lot more code since we'd have
589 to duplicate much of what NMDeviceEthernet already does, plus add the
590 Infiniband device class to libnm-glib.  This also would be the least invasive
591 from an API standpoint since the existing API would be unchanged, except for
592 the addition of a new value in the NMDeviceType enum, which clients should
593 ignore if they don't understand it.  (Need to coordinate additions to this enum
594 between 0.8.x and 0.9.x since 0.9.x has more device types, but we want to make
595 sure new device types get the same number for both branches).
596
597 For Infiniband specific options we could either fold them into NMSettingEthernet
598 or create a new NMSettingInfiniband class.  Current Infiniband specific options
599 are partitions/P_Keys, datagram vs. connected mode, and MTU.  The default MTU
600 varies with the 'mode'; for datagram it is currently 2044, while for connected
601 mode it is currently 65520.  Given that we only have 2 IB-specific options
602 we should probably just fold them into NMSettingEthernet similar to what was
603 done for s390-specific options.
604
605 For some general (and also Red Hat/Fedora specific) information see:
606
607 http://tools.ietf.org/html/rfc4392
608 http://rhkernel.org/#RHEL6+2.6.32-71.18.2.el6/Documentation/infiniband/ipoib.txt
609