Device hierarchy
================

Service		org.chromium.flimflam
Interface	org.chromium.flimflam.Device
Object path	[variable prefix]/{device0,device1,...}

Methods		dict GetProperties()

			Returns properties for the device object. See
			the properties section for available properties.

		void SetProperty(string name, variant value)

			Changes the value of the specified property. Only
			properties that are listed as read-write are
			changeable. On success a PropertyChanged signal
			will be emitted.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.InvalidProperty

		void ClearProperty(string name)

			Reset the specified parameter to its "factory"
			value and remove any previously set value from
			the profile. Only properties that are listed as
			read-write are changeable.

		void Enable()

		        Enable the device.

			Possible Errors: [service].Error.PermissionDenied

		void Disable()

		        Disable the device.

		void RequirePin(string pin, boolean require)

			(Cellular only) Enable or disable PIN protection for
			a cellular modem's SIM card. If 'require' is true,
			then a PIN will need to be supplied (by calling
			EnterPin) before the modem is usable. If 'require'
			is false, a PIN will not be required.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.NotSupported
					 [service].Error.PinError

			In the case of PinError, the error message gives
			more detail: [interface].PinRequired
				     [interface].PinBlocked
				     [interface].IncorrectPin

		void EnterPin(string pin)

			(Cellular only) Provide a PIN to unlock a SIM card.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.NotSupported
					 [service].Error.PinError

			In the case of PinError, the error message gives
			more detail: [interface].PinRequired
				     [interface].PinBlocked
				     [interface].IncorrectPin

		void UnblockPin(string puk, string pin)

			(Cellular only) Provide a PUK code to unblock a PIN.
			When an incorrect PIN has been entered too many times
			(three is generally the number of tries allowed), the
			PIN becomes "blocked", and the SIM card can only be
			unlocked by providing a PUK code provided by the
			carrier. At the same time, a new PIN must be specified.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.NotSupported
					 [service].Error.PinError

			In the case of PinError, the error message gives
			more detail: [interface].PinRequired
				     [interface].PinBlocked
				     [interface].IncorrectPin

		void ChangePin(string old_pin, string new_pin)

			(Cellular only) Change the PIN used to unlock a SIM
			card. The existing PIN must be provided along with
			the new PIN.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.NotSupported
					 [service].Error.PinError

			In the case of PinError, the error message gives
			more detail: [interface].PinRequired
				     [interface].PinBlocked
				     [interface].IncorrectPin

		void Register(string network_id)

			(Cellular only) Initiate registration on the network
			specified by network_id, which is in the form MCCMNC.
			If the network ID is the empty string, then switch
			back to automatic registration mode before initiating
			registration.

			If registration succeeds, the network_id is remembered,
			and is saved in the profile, so that the same network
			will be tried again if the modem is disabled and then
			re-enabled, or if the system is restarted or resumed.

			If registration fails, the network_id is not
			remembered, and is not saved in the profile. If it was
			already in the profile, it is deleted. In addtion, one
			more attempt is made to register, after switching back
			to automatic registration mode.

		void SetCarrier(string carrier)

			(Cellular only) Set the modem carrier firmware. For
			example, switch between CDMA (Verizon Wireless/Sprint)
			and Generic UMTS. The Cellular.SupportedCarriers
			property lists all supported carriers.

			Possible Errors: [service].Error.Failure
					 [service].Error.NotSupported

		void Reset()

			Reset the device. The implementation is device-
                        dependent. In some cases, the device and its associated
                        service(s) may be destroyed after the physical device
                        is reset. In such case, a new device is expected to be
                        created after the physical device reappears on the
                        system. Currently, device reset is only supported by
                        cellular devices managed by ModemManager.

			Possible Errors: [service].Error.Failure
					 [service].Error.NotSupported

		void ResetByteCounters()

			Reset the device's persisted counters of transmitted

		string PerformTDLSOperation(string operation,
					    string peer) [readwrite]

			(WiFi only) Perform a TDLS operation on a peer
			station.  The |peer| argument should be a mac
			address specified in traditional colon-separated
			hexidecimal notation, e.g., "aa:bb:cc:dd:ee:ff",
			or an IPv4 address on the same subnet of this
			device, e.g., "192.168.1.1".  The |operation|
			parameter should be one of the following:

				"Discover" : Perform TDLS discovery with |peer|.
				"Setup" : Setup TDLS peering with |peer|.
				"Status" : Return TDLS status for |peer|.
				"Teardown" : Tear down TDLS peering with |peer|.

			The method returns without an error if the operation
			is initiated successfully with the supplicant, but
			before it is clear whether the operation actually
			succeeded.

			All methods except "Status" return an empty string.
			For "Status", the returned string can be one of:

				"Connected" : The TDLS link is active.
				"Disabled" : TDLS is disabled on this device.
				"Disconnected" : The TDLS link has been
						 disconnected.
				"Nonexistent" : No information is known
						about this TDLS peer.
				"Unknown" : The TDLS link is in an unknown
					    state.

			Possible Errors:
				[service].Error.InProgress
					An IP-to-MAC address lookup is being
					performed.  The caller should retry
					this operation.
				[service].Error.InvalidArguments
					The |operation| is unknown or the
					|peer| address is misformatted or
					does not belong to the local subnet.
				[service].Error.OperationFailed
					The TDLS or ARP operation failed.

Signals		PropertyChanged(string name, variant value)

			This signal indicates a changed value of the given
			property.

Properties	string Address [readonly]

			The low-level (physical) address of the device.

		string BgscanMethod [readwrite]

			(WiFi only) A string identifying the background scan
			algorithm.
			Possible values:
				"simple" [default]
				"learn"

			A change to this property takes affect on the next
			association.

		uint16 BgscanShortInterval [readwrite]

			(WiFi only) Time in seconds between background scans
			when actively searching for better APs (e.g., when
			roaming).

			A change to this property takes affect on the next
			association.

		int32 BgscanSignalThreshold [readwrite]

			(WiFi only) Receive signal strength threshold (in dBm),
			for the currently connected network, below which
			roaming is triggered.

			A change to this property takes affect on the next
			association.

		boolean Cellular.AllowRoaming [readwrite]

			(Celluar only) Whether cellular data connections
			are allowed when the device is roaming (i.e,
			not registered on the home network). When this
			property is false, data connections are not
			allowed while roaming (regardless of the AutoConnect
			setting of associated services).

			If a connection was established while on the home
			network, and the device begins roaming, the data
			connection is terminated.

			If the property is true, and a data connection was
			established while roaming, and then the property is
			set to false, the connection is terminated.

			If the Cellular.ProviderRequiresRoaming property
			is true, that setting will override this property's
			setting.

			By default Cellular.AllowRoaming is false.

		string Cellular.Carrier [readonly]

			(Cellular only) The name of the carrier for
			which the device is configured.

		dict Cellular.HomeProvider [readonly] [GSM only]

			(Cellular only) Description of the operator that
			issued the SIM card currently installed in the modem.
			The dictionary may contain the following string-valued
			properties:

			"name"       The operator name
			"country"    The two-letter country code.
			"network_id" The MCC (Mobile Country Code)
				     and MNC (Mobile Network Code) of the
				     operator on whose network the device is
				     registered. The value of the property is
				     the simple concatenation of the MCC and
				     the MNC, with no separator. The first
				     three digits are always the MCC, and
				     the following two or three digits are the
				     MNC.

		string Cellular.MEID [readonly]

			(Cellular only) For CDMA modems, the Mobile
			Equipment Identifer of the modem.

		string Cellular.IMEI [readonly]

			(Cellular only) The International Mobile Equipment
			Identity of the modem.

		string Cellular.ICCID [readonly]

			(Cellular only) For GSM / LTE modems, the Integrated
			Circuit Card Identifer of the SIM card installed in
			the device. Blank otherwise.

		string Cellular.IMSI [readonly]

			(Cellular only) For GSM modems, the International
			Mobile Subscriber Identity of the SIM card
			installed in the device.

		string Cellular.ESN [readonly]

			(Cellular only) The Electronic Serial Number of
			the modem.

		string Cellular.MDN [readonly]

			(Cellular only) The Mobile Directory Number
			(i.e., phone number) of the device.

		string Cellular.MIN [readonly]

			(Cellular only) The Mobile Identification Number
			of the device. The MIN is often the same as
			the MDN, but may change if a user changes to a
			different service provider.

		string Cellular.ModelID [readonly]

			(Cellular only) The hardware model of the modem. The
			contents of this property are unspecified, and are
			useful primarily as a diagnostic aid.

		string Cellular.Manufacturer [readonly]

			(Cellular only) The manufacturer of the modem. The
			contents of this property are unspecified,
			and are useful primarily as a diagnostic aid.

		string Cellular.FirmwareRevision [readonly]

			(Cellular only) The revision of firmware that is
			loaded in the modem. The contents of this property
			are unspecified, and are useful primarily as a
			diagnostic aid.

		string Cellular.HardwareRevision [readonly]

			(Cellular only) The hardware revision of
			the modem. The contents of this property are
			unspecified, and are useful primarily as a
			diagnostic aid.

		int16 Cellular.PRLVersion [readonly]

			(Cellular only) The revision of the Preferred
			Roaming List that is loaded in the modem.
			Cellular.PRLVersion is primarily useful as a
			diagnostic aid.

		boolean Cellular.ProviderRequiresRoaming [readonly]

			(Celluar only) Indicates that the cellular
			provider (determined based on IMSI and SPN)
			requires roaming.  This is important to
			certain MVNOs which have no home network and
			wish to provide network services without
			regard to the Cellular.AllowRoaming setting.

		dict Cellular.SIMLockStatus [readonly]

			(Cellular only) For GSM modems, a dictionary
			containing two properties describing the state
			of the SIM card lock. The two properties are:

			string LockType

				If this string is empty, the SIM card is not
				PIN-locked. Otherwise, it specifies the type
				of lock in effect: "sim-pin" or "sim-puk".

			int32 RetriesLeft

				If LockType is empty or is "sim-pin", then
				this property gives the number of attempts
				remaining to supply a correct PIN before the
				PIN becomes blocked, at which point a PUK
				provided by the carrier would be necessary
				to unlock the SIM (and the LockType changes to
				"sim-puk").

				If LockType is "sim-puk", then this property
				gives the number of attempts remaining to supply
				a correct PUK before the SIM card becomes
				permanently locked, at which point the SIM
				card must be replaced. This state is indicated
				when LockType is "sim-puk" and RetriesLeft is
				zero.

			boolean LockEnabled

				Indicates whether SIM locking is enabled,
				i.e., whether, when the device is powered
				on, a PIN or PUK will need to be entered to
				unlock the SIM. This differs from the
				LockType property, which indicates whether
				the device is currently waiting for a PIN
				to be entered. The SIM can currently be
				unlocked (LockType is ""), but at the same
				time locking can be enabled (LockEnabled is
				True).

		boolean Cellular.SIMPresent [readonly]

			(Cellular only) For GSM or LTE modems, indicates
			whether a SIM card is present or not.

		array{string} Cellular.SupportedCarriers [readonly]

			(Cellular only) A list of supported carriers. Each
			carrier can be used as an argument to the SetCarrier
			method.

		array{dict} Cellular.FoundNetworks [readonly] [GSM only]

			(Cellular only) The result of the most recent
			scan operation. The property is an array
			of dictionaries, with each (string, string) entry
			from the following properties:

			"status"     The availability of the network. Values
				     are "unknown", "available", "current",
				     and "forbidden".
			"network_id" The network id in the form MCC/MNC
				     (without the '/')
			"short_name" Short-format name of the network operator
			"long_name"  Long-format name of the network operator
			"technology" Access technology used by the network, e.g.
				     "GSM", "UMTS", "EDGE", "HSPA", etc.

		array{dict} Cellular.APNList [readonly] [GSM only]

			(Cellular only) The list of APNs associated with
			the home provider (ref. Cellular.HomeProvider property)
			The property is an array of dictionaries, with each
			(string, string) entry from the following properties:

			"apn"        The APN, to be used when making
				     connections.
			"username"   The username to be passed along with the
				     APN when making connections. This property
				     is present only if a username is required.
			"password"   The password to be passed along with the
				     APN when making connections. This property
				     is present only if a password is required.
			"name"       Optional description of the APN, not localized.
			"localized_name"
				     Optional description of the APN, localized.
			"language"
				     If the "localized_name" property is present, this
				     gives the two-letter language code for the locale
				     of the localized name. If "localized_name" exists,
				     then this property will always exist as well.

		bool EapAuthenticatorDetected [readonly]

			(Ethernet only) Indicates whether an EAP (802.1X)
			authenticator has been detected on this link.
			This may mean that EAP credentials are necessary
			to gain full access to this network.

		bool EapAuthenticationCompleted [readonly]

			(Ethernet only) Indicates whether an EAP (802.1X)
			authentication is currently valid on this interface.

		bool Ethernet.LinkUp [readonly]

			(Ethernet only) Indicates whether the underlying
			device has detected the presence of a physical link.

		bool Ethernet.PPPoE

			(Ethernet only) Configures an Ethernet device to be
			the carrier for a PPPoE connection.  Changing this
			property can tear down the Ethernet/PPPoE service
			associated with the Ethernet device.

		string Interface [readonly]

			The device interface (for example "eth0" etc.)

			This value is for pure informational purposes. It
			is not guaranteed that it is always present.

		object SelectedService [readonly]

			Object path of the currently selected service path.
			The selected service of a device is the service for
			which it is currently receiving link events.  WiFi
			is slightly different in that it sets the link event
			immediately after requesting a connection so that
			failures to connect are correctly attributed.

			The device guarantees that if it is connected, the
			connected service will appear in SelectedService.
			However, SelectedService could be just "/", indicating
			no selected service.  The SelectedService is also
			not guaranteed to be online (e.g. it could be in the
			process of being connected, or an error state).

		array{object} IPConfigs [readonly]

			List of IPConfig objects paths. Every object path
			represents a Layer 3 configuration record for
			the device.  In shill, for a connected device,
			the IPv4 configuration is represented in the
			first object path in this array.  This object is also
			referenced in the the "IPConfig" property of the
			connected Service.  If the kernel has assigned a
			globally scoped IPv6 address to this interface, it
			is reported as an additional object path in this
			array.

			Whenever either the IPv4 or IPv6 state changes
			in a way that modifies the contents of either of
			these IPConfigs, a PropertyChanged signal will be
			emitted for the Device's IPConfig property.

		int32 LinkMonitorResponseTime [readonly]

			Latest running average of the link monitor response
			for this device in milliseconds, if the link monitor
			is active.

		dict LinkStatistics [readonly]

			(WiFi only) A dictionary providing current link
			statitistics.  This can include the following
			properties, depending on whether the system is
			connected and the capabilities of the specific
			WiFi device.

				int8 AverageReceiveSignalDbm

                                Reports the running average of signal
				strength to the connected AP.

				uint32 InactiveTimeMilliseconds

                                Reports the time in milliseconds since
				the last activity by the station.

				int8 LastReceiveSignalDbm

				Reports the signal strength of the last
				received packet.

				uint32 PacketReceiveSuccesses

				Reports the number of successfully received
				packets.

				uint32 PacketTransmitFailures

				Reports the number of failed packet
				transmission attempts.

				uint32 PacketTrasmitSuccesses

				Reports the number of successful packet
				transmission attempts.

				string TransmitBitrate

				Reports the transmit bitrate of the last
				successful outbound packet in a textual format
				which includes additional 802.11n transmit
				parameters.

				uint32 TransmitRetries

				Reports the number of times the system has had
				to retry an outgoing packet.


		boolean MACAddressRandomization

			Deprecated; see MACAddressRandomizationEnabled.

		boolean MACAddressRandomizationSupported [readonly]

			True if the device supports randomizing its MAC
			address during scans when not connected to any APs
			already.

		boolean MACAddressRandomizationEnabled

			Indicates whether the device is currently configured
			to randomize its MAC address during scans while not
			already connected to any APs. Setting this value will
			configure the device to act appropriately.

			This was formerly named MACAddressRandomization; users
			of shill should use this property now.

			Possible errors:
					 [service].Error.NotSupported

		string Name [readonly]

			The device name (for example "Wireless" etc.)

			This name can be used for directly displaying it in
			the application. It has pure informational purpose
			and there is not guarantee that it is present.

		boolean Powered [readonly]

			Indicates whether the device is on or off.

			This value does not influence the value of the
			Policy property.

			The value of this property can be changed by other
			parts of the system (including the kernel). An
			example would be modifications via the "ifconfig"
			command line utility.

		uint64 ReceiveByteCount [readonly]

			The number of bytes received on this interface.
			This value is persisted and accumulated across
			connection manager restarts.  Shill retrieves
			these counters from all interfaces every 60 seconds
			so this value returned might be slightly old.

		uint16 RoamThreshold [readwrite]

			(Defined in WiFi)

			The roam threshold is the AP signal-to-noise value (in
			dB) below which wpa_supplicant will attempt to roam to
			a new AP. This property applies to all WiFi services
			except those that have their per-service RoamThreshold
			set. Changes to this property will take effect immediately
			if the current service does not have its RoamThreshold
			property set. Otherwise, it will take effect the next time
			we connect to a WiFi service that does not have its
			RoamThreshold property set.

		uint16 ScanInterval [readwrite]

                        (Defined in WiFi and Cellular)

			The scan interval is the time in seconds between
			automated scan attempts. Setting this value to
			0 will disable the periodic scanning.

			The default value is 180 and so every 3 minutes
			a scan procedure will be triggered.

			This property is not available with all types
			of devices. Some may not support background
			scanning at all.

		boolean Scanning [readonly]

			(Defined in Cellular, WiFi and WiMAX)

			Indicates that a device is currently performing a
			network scan.

		uint64 TransmitByteCount [readonly]

			The number of bytes transmitted on this interface.
			This value is persisted and accumulated across
			connection manager restarts.  Shill retrieves
			these counters from all interfaces every 60 seconds
			so this value returned might be slightly old.

		string Type [readonly]

			The device type (for example "ethernet", "wifi" etc.)

		string WakeOnWiFiFeaturesEnabled [readwrite]

			(Defined in WiFi)

			The wake on WiFi features that are currently enabled.
			The value of this property is "packet" if only the
			packet feature is enabled, "darkconnect" if only the dark
			connect feature is enabled, "packet_and_darkconnect" if both
			the packet and dark connect features are enabled, and "none"
			if all wake on WiFi features are disabled.

			Possible errors: [service].Error.NotSupported (wake on WiFi not supported)
					 [service].Error.InvalidArguments (invalid wake on WiFi feature)

		uint32 WakeToScanPeriodSeconds [readwrite]

			(Defined in WiFi)

			The length of time (in seconds) between each instance where the system
			is woken from suspend to scan for networks in dark resume. Changes to this
			property will take effect at the next system suspend.

		uint32 NetDetectScanPeriodSeconds [readwrite]

			(Defined in WiFi)

			The length of time (in seconds) between each instance where the wireless
			NIC performs Net Detect scans while the system is suspended. Changes to
			this property will take effect at the next system suspend.

		boolean ForceWakeToScanTimer [readwrite]

			(Defined in WiFi)

			If true, forces shill to start an RTC timer that wakes the system
			periodically to scan for networks if the system is going into suspend
			while disconnected. This will likely be used for testing only. Otherwise,
			if this property is false, shill will only start this timer if it has more
			SSIDs to whitelist than the NIC supports for net detect. Changes to this
			property will take effect at the next system suspend.

		void AddWakeOnPacketConnection(string endpoint)

			(WiFi only) Program a wake-on-packet rule into the NIC to wake
			the system from suspend upon receiving packets from the source IP
			address in the string argument. The format of the argument is:

			<source_ip>

			where <source_ip> is the source IP address of the TCP
			connection. IPV4 and IPV6 addresses are specified with
			the standard conventions for IPV4 and IPV6 addresses.
			The following are a few non-exhaustive examples:

			IPV4: 1.2.3.4, 192.142.3.10
			IPV6: a::bc:f:5:6d:7:8, abd::20

			The request is valid until removed.  However, on shill
			restart, any wake-on-packet rules are cleared.

			Possible errors: [service].Error.InvalidArguments (argument parsing error)
					 [service].Error.NotFound (there is no such connection)
					 [service].Error.NotSupported (wake-on-packet not supported)

		void AddWakeOnPacketOfTypes(array(string) packet_types)

			(WiFi only) Program a wake-on-packet rule into the NIC to wake
			the system from suspend upon receiving IPV4/IPV6 packets
			with the next higher level service in the protocol stack belonging
			to |packet_types|.

  			possible packet_types:
				Look for "Wake on WiFi Packet Type Constants" in
				system_api/dbus/shill/dbus-constants.h for the set of possible
				packet types.

			Possible errors:
			 	[service].Error.InvalidArgument (argument parsing error)
				[service].Error.NotSupported (wake-on-packet not supported)

		void RemoveWakeOnPacketConnection(string endpoint)

			(WiFi only) Removes a wake-on-packet rule previously programmed into the
			NIC to wake the system from suspend upon receiving packets from the
			source IP address in the string argument. The argument format is the
			same as that of AddWakeOnPacketConnection.

			Possible errors: [service].Error.InvalidArgument (argument parsing error)
					 [service].Error.NotFound (no such request is active)
					 [service].Error.NotSupported (wake-on-packet not supported)

		void RemoveWakeOnPacketOfTypes(array(string) packet_types)

			(WiFi only) Remove a wake-on-packet rule previously programmed into the
			NIC to wake the system from suspend upon receiving IPV4/IPV6 packets
			with the next higher level service in the protocol stack belonging
			to |packet_types|. If any of the passed arguments does not match the
			below mentioned protocols, it will return an error of type
			kInvalidArguments. If wake on packets of given argument type is not
			enabled before, the argument will be ignored silently.

  			possible packet_types:
  		  		Look for "Wake on WiFi Packet Type Constants" in
  		  		system_api/dbus/shill/dbus-constants.h for the set of possible
  		  		packet types.

			Possible errors:
			 	[service].Error.InvalidArgument (argument parsing error)
				[service].Error.NotSupported (wake-on-packet not supported)

		void RemoveAllWakeOnPacketConnections()

			(WiFi only) Removes all wake-on-packet rules programmed into the NIC.
			This is useful to ensure the NIC is in a known state.

			Possible errors:
					 [service].Error.NotSupported (wake-on-packet not supported)
