Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 36432dae authored by Patrick McHardy's avatar Patrick McHardy
Browse files
parents 440f0d58 bb400801
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -437,3 +437,10 @@ Why: Superseded by tdfxfb. I2C/DDC support used to live in a separate
	driver but this caused driver conflicts.
Who:	Jean Delvare <khali@linux-fr.org>
	Krzysztof Helt <krzysztof.h1@wp.pl>

---------------------------

What:	CONFIG_RFKILL_INPUT
When:	2.6.33
Why:	Should be implemented in userspace, policy daemon.
Who:	Johannes Berg <johannes@sipsolutions.net>
+90 −4
Original line number Diff line number Diff line
@@ -45,7 +45,7 @@ From then on, Kernel CAPI may call the registered callback functions for the
device.

If the device becomes unusable for any reason (shutdown, disconnect ...), the
driver has to call capi_ctr_reseted(). This will prevent further calls to the
driver has to call capi_ctr_down(). This will prevent further calls to the
callback functions by Kernel CAPI.


@@ -114,20 +114,36 @@ char *driver_name
int (*load_firmware)(struct capi_ctr *ctrlr, capiloaddata *ldata)
	(optional) pointer to a callback function for sending firmware and
	configuration data to the device
	Return value: 0 on success, error code on error
	Called in process context.

void (*reset_ctr)(struct capi_ctr *ctrlr)
	pointer to a callback function for performing a reset on the device,
	releasing all registered applications
	(optional) pointer to a callback function for performing a reset on
	the device, releasing all registered applications
	Called in process context.

void (*register_appl)(struct capi_ctr *ctrlr, u16 applid,
			capi_register_params *rparam)
void (*release_appl)(struct capi_ctr *ctrlr, u16 applid)
	pointers to callback functions for registration and deregistration of
	applications with the device
	Calls to these functions are serialized by Kernel CAPI so that only
	one call to any of them is active at any time.

u16  (*send_message)(struct capi_ctr *ctrlr, struct sk_buff *skb)
	pointer to a callback function for sending a CAPI message to the
	device
	Return value: CAPI error code
	If the method returns 0 (CAPI_NOERROR) the driver has taken ownership
	of the skb and the caller may no longer access it. If it returns a
	non-zero (error) value then ownership of the skb returns to the caller
	who may reuse or free it.
	The return value should only be used to signal problems with respect
	to accepting or queueing the message. Errors occurring during the
	actual processing of the message should be signaled with an
	appropriate reply message.
	Calls to this function are not serialized by Kernel CAPI, ie. it must
	be prepared to be re-entered.

char *(*procinfo)(struct capi_ctr *ctrlr)
	pointer to a callback function returning the entry for the device in
@@ -138,6 +154,8 @@ read_proc_t *ctr_read_proc
	system entry, /proc/capi/controllers/<n>; will be called with a
	pointer to the device's capi_ctr structure as the last (data) argument

Note: Callback functions are never called in interrupt context.

- to be filled in before calling capi_ctr_ready():

u8 manu[CAPI_MANUFACTURER_LEN]
@@ -153,6 +171,45 @@ u8 serial[CAPI_SERIAL_LEN]
	value to return for CAPI_GET_SERIAL


4.3 The _cmsg Structure

(declared in <linux/isdn/capiutil.h>)

The _cmsg structure stores the contents of a CAPI 2.0 message in an easily
accessible form. It contains members for all possible CAPI 2.0 parameters, of
which only those appearing in the message type currently being processed are
actually used. Unused members should be set to zero.

Members are named after the CAPI 2.0 standard names of the parameters they
represent. See <linux/isdn/capiutil.h> for the exact spelling. Member data
types are:

u8          for CAPI parameters of type 'byte'

u16         for CAPI parameters of type 'word'

u32         for CAPI parameters of type 'dword'

_cstruct    for CAPI parameters of type 'struct' not containing any
	    variably-sized (struct) subparameters (eg. 'Called Party Number')
	    The member is a pointer to a buffer containing the parameter in
	    CAPI encoding (length + content). It may also be NULL, which will
	    be taken to represent an empty (zero length) parameter.

_cmstruct   for CAPI parameters of type 'struct' containing 'struct'
	    subparameters ('Additional Info' and 'B Protocol')
	    The representation is a single byte containing one of the values:
	    CAPI_DEFAULT: the parameter is empty
	    CAPI_COMPOSE: the values of the subparameters are stored
	    individually in the corresponding _cmsg structure members

Functions capi_cmsg2message() and capi_message2cmsg() are provided to convert
messages between their transport encoding described in the CAPI 2.0 standard
and their _cmsg structure representation. Note that capi_cmsg2message() does
not know or check the size of its destination buffer. The caller must make
sure it is big enough to accomodate the resulting CAPI message.


5. Lower Layer Interface Functions

(declared in <linux/isdn/capilli.h>)
@@ -166,7 +223,7 @@ int detach_capi_ctr(struct capi_ctr *ctrlr)
	register/unregister a device (controller) with Kernel CAPI

void capi_ctr_ready(struct capi_ctr *ctrlr)
void capi_ctr_reseted(struct capi_ctr *ctrlr)
void capi_ctr_down(struct capi_ctr *ctrlr)
	signal controller ready/not ready

void capi_ctr_suspend_output(struct capi_ctr *ctrlr)
@@ -211,3 +268,32 @@ CAPIMSG_CONTROL(m) CAPIMSG_SETCONTROL(m, contr) Controller/PLCI/NCCI
							(u32)
CAPIMSG_DATALEN(m)	CAPIMSG_SETDATALEN(m, len)	Data Length (u16)


Library functions for working with _cmsg structures
(from <linux/isdn/capiutil.h>):

unsigned capi_cmsg2message(_cmsg *cmsg, u8 *msg)
	Assembles a CAPI 2.0 message from the parameters in *cmsg, storing the
	result in *msg.

unsigned capi_message2cmsg(_cmsg *cmsg, u8 *msg)
	Disassembles the CAPI 2.0 message in *msg, storing the parameters in
	*cmsg.

unsigned capi_cmsg_header(_cmsg *cmsg, u16 ApplId, u8 Command, u8 Subcommand,
			  u16 Messagenumber, u32 Controller)
	Fills the header part and address field of the _cmsg structure *cmsg
	with the given values, zeroing the remainder of the structure so only
	parameters with non-default values need to be changed before sending
	the message.

void capi_cmsg_answer(_cmsg *cmsg)
	Sets the low bit of the Subcommand field in *cmsg, thereby converting
	_REQ to _CONF and _IND to _RESP.

char *capi_cmd2str(u8 Command, u8 Subcommand)
	Returns the CAPI 2.0 message name corresponding to the given command
	and subcommand values, as a static ASCII string. The return value may
	be NULL if the command/subcommand is not one of those defined in the
	CAPI 2.0 standard.
+76 −0
Original line number Diff line number Diff line

		Linux IEEE 802.15.4 implementation


Introduction
============

The Linux-ZigBee project goal is to provide complete implementation
of IEEE 802.15.4 / ZigBee / 6LoWPAN protocols. IEEE 802.15.4 is a stack
of protocols for organizing Low-Rate Wireless Personal Area Networks.

Currently only IEEE 802.15.4 layer is implemented. We have choosen
to use plain Berkeley socket API, the generic Linux networking stack
to transfer IEEE 802.15.4 messages and a special protocol over genetlink
for configuration/management


Socket API
==========

int sd = socket(PF_IEEE802154, SOCK_DGRAM, 0);
.....

The address family, socket addresses etc. are defined in the
include/net/ieee802154/af_ieee802154.h header or in the special header
in our userspace package (see either linux-zigbee sourceforge download page
or git tree at git://linux-zigbee.git.sourceforge.net/gitroot/linux-zigbee).

One can use SOCK_RAW for passing raw data towards device xmit function. YMMV.


MLME - MAC Level Management
============================

Most of IEEE 802.15.4 MLME interfaces are directly mapped on netlink commands.
See the include/net/ieee802154/nl802154.h header. Our userspace tools package
(see above) provides CLI configuration utility for radio interfaces and simple
coordinator for IEEE 802.15.4 networks as an example users of MLME protocol.


Kernel side
=============

Like with WiFi, there are several types of devices implementing IEEE 802.15.4.
1) 'HardMAC'. The MAC layer is implemented in the device itself, the device
   exports MLME and data API.
2) 'SoftMAC' or just radio. These types of devices are just radio transceivers
   possibly with some kinds of acceleration like automatic CRC computation and
   comparation, automagic ACK handling, address matching, etc.

Those types of devices require different approach to be hooked into Linux kernel.


HardMAC
=======

See the header include/net/ieee802154/netdevice.h. You have to implement Linux
net_device, with .type = ARPHRD_IEEE802154. Data is exchanged with socket family
code via plain sk_buffs. The control block of sk_buffs will contain additional
info as described in the struct ieee802154_mac_cb.

To hook the MLME interface you have to populate the ml_priv field of your
net_device with a pointer to struct ieee802154_mlme_ops instance. All fields are
required.

We provide an example of simple HardMAC driver at drivers/ieee802154/fakehard.c


SoftMAC
=======

We are going to provide intermediate layer impelementing IEEE 802.15.4 MAC
in software. This is currently WIP.

See header include/net/ieee802154/mac802154.h and several drivers in
drivers/ieee802154/
+7 −0
Original line number Diff line number Diff line
@@ -1057,6 +1057,13 @@ disable_ipv6 - BOOLEAN
	address.
	Default: FALSE (enable IPv6 operation)

	When this value is changed from 1 to 0 (IPv6 is being enabled),
	it will dynamically create a link-local address on the given
	interface and start Duplicate Address Detection, if necessary.

	When this value is changed from 0 to 1 (IPv6 is being disabled),
	it will dynamically delete all address on the given interface.

accept_dad - INTEGER
	Whether to accept DAD (Duplicate Address Detection).
	0: Disable DAD
+37 −0
Original line number Diff line number Diff line
@@ -33,3 +33,40 @@ disable

		A reboot is required to enable IPv6.

autoconf

	Specifies whether to enable IPv6 address autoconfiguration
	on all interfaces.  This might be used when one does not wish
	for addresses to be automatically generated from prefixes
	received in Router Advertisements.

	The possible values and their effects are:

	0
		IPv6 address autoconfiguration is disabled on all interfaces.

		Only the IPv6 loopback address (::1) and link-local addresses
		will be added to interfaces.

	1
		IPv6 address autoconfiguration is enabled on all interfaces.

		This is the default value.

disable_ipv6

	Specifies whether to disable IPv6 on all interfaces.
	This might be used when no IPv6 addresses are desired.

	The possible values and their effects are:

	0
		IPv6 is enabled on all interfaces.

		This is the default value.

	1
		IPv6 is disabled on all interfaces.

		No IPv6 addresses will be added to interfaces.
Loading