* [PATCH series v1] IEEE 802.15.4 MAC layer basic implementation
@ 2011-12-19 16:31 Alexander Smirnov
2011-12-19 16:33 ` [PATCH 01/14] mac802154: basic ieee802.15.4 device structures Alexander Smirnov
` (5 more replies)
0 siblings, 6 replies; 27+ messages in thread
From: Alexander Smirnov @ 2011-12-19 16:31 UTC (permalink / raw)
To: davem; +Cc: netdev, dbaryshkov, linux-zigbee-devel, alex.bluesman.smirnov
Hi all,
the following patch series add basic support for IEEE 802.15.4 Medium Access
Control layer.
The IEEE 802.15.4 Working Group focuses on the standardization of the
bottom two layers of ISO/OSI protocol stack: Physical (PHY) and MAC.
The MAC layer provides access control to a shared channel and reliable
data delivery.
This series provide only basic features:
- interface for drivers registration
- RX/TX datapaths
- reduced mlme operations
- monitor device type support (used by network sniffers, e.g. Wireshark)
- IEEE 802.15.4 loopback driver
- documentation update
--
Since last post, series has been reworked to provide support for monitor device
and loopback driver only.
--
The following changes since commit d1d182e00d72300e05b18e28372fab003d8d4a58:
wimax/i2400m: remove an unused variable (2011-12-16 15:57:03 -0500)
are available in the git repository at:
git://linux-zigbee.git.sourceforge.net/gitroot/linux-zigbee/kernel to_upstream
Alexander Smirnov (14):
mac802154: basic ieee802.15.4 device structures
mac802154: allocation of ieee802154 device
mac802154: RX data path
mac802154: TX data path
mac802154: define reduced mlme operations
mac802154: slave interfaces definition
mac802154: reduced mlme operations
mac802154: basic mib support
ieee802154: remove ieee802154 policy from globals
ieee802154: interface type to be added
mac802154: slaves manipulation routine
mac802154: monitor device support
drivers/ieee802154: IEEE 802.15.4 loopback driver
Documentation/networking/ieee802154: update MAC chapter
Documentation/networking/ieee802154.txt | 57 ++++++-
drivers/ieee802154/Kconfig | 8 +
drivers/ieee802154/Makefile | 1 +
drivers/ieee802154/fakelb.c | 287 +++++++++++++++++++++++++++++++
include/linux/if_arp.h | 1 +
include/linux/nl802154.h | 8 +-
include/net/ieee802154_netdev.h | 22 ++-
include/net/mac802154.h | 153 ++++++++++++++++
include/net/wpan-phy.h | 4 +-
net/Kconfig | 1 +
net/Makefile | 1 +
net/ieee802154/ieee802154.h | 2 +
net/ieee802154/nl-phy.c | 10 +-
net/ieee802154/wpan-class.c | 1 +
net/mac802154/Kconfig | 16 ++
net/mac802154/Makefile | 2 +
net/mac802154/ieee802154_dev.c | 265 ++++++++++++++++++++++++++++
net/mac802154/mac802154.h | 102 +++++++++++
net/mac802154/mac_cmd.c | 43 +++++
net/mac802154/mib.c | 96 ++++++++++
net/mac802154/monitor.c | 115 ++++++++++++
net/mac802154/rx.c | 107 ++++++++++++
net/mac802154/tx.c | 113 ++++++++++++
23 files changed, 1402 insertions(+), 13 deletions(-)
create mode 100644 drivers/ieee802154/fakelb.c
create mode 100644 include/net/mac802154.h
create mode 100644 net/mac802154/Kconfig
create mode 100644 net/mac802154/Makefile
create mode 100644 net/mac802154/ieee802154_dev.c
create mode 100644 net/mac802154/mac802154.h
create mode 100644 net/mac802154/mac_cmd.c
create mode 100644 net/mac802154/mib.c
create mode 100644 net/mac802154/monitor.c
create mode 100644 net/mac802154/rx.c
create mode 100644 net/mac802154/tx.c
With best regards,
Alexander Smirnov
^ permalink raw reply [flat|nested] 27+ messages in thread* [PATCH 01/14] mac802154: basic ieee802.15.4 device structures 2011-12-19 16:31 [PATCH series v1] IEEE 802.15.4 MAC layer basic implementation Alexander Smirnov @ 2011-12-19 16:33 ` Alexander Smirnov 2011-12-19 19:32 ` David Miller 2011-12-19 16:33 ` [PATCH 02/14] mac802154: allocation of ieee802154 device Alexander Smirnov ` (4 subsequent siblings) 5 siblings, 1 reply; 27+ messages in thread From: Alexander Smirnov @ 2011-12-19 16:33 UTC (permalink / raw) To: davem; +Cc: dbaryshkov, linux-zigbee-devel, netdev, Alexander Smirnov The IEEE 802.15.4 Working Group focuses on the standardization of the bottom two layers of ISO/OSI protocol stack: Physical (PHY) and MAC. The MAC layer provides access control to a shared channel and reliable data delivery. The main functions performed by the MAC sublayer are: association and disassociation, security control, optional star network topology functions, such as beacon generation and Guaranteed Time Slots (GTSs) management, generation of ACK frames (if used), and, finally, application support for the two possible network topologies described in the standard. This is an initial commit which describes main data structures needed for ieee802.15.4 compatible devices representation in MAC layer and callbacks that the driver may, or in some cases, must handle, for example to transmit a frame Signed-off-by: Alexander Smirnov <alex.bluesman.smirnov@gmail.com> --- include/net/mac802154.h | 145 +++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 145 insertions(+), 0 deletions(-) create mode 100644 include/net/mac802154.h diff --git a/include/net/mac802154.h b/include/net/mac802154.h new file mode 100644 index 0000000..2733dab --- /dev/null +++ b/include/net/mac802154.h @@ -0,0 +1,145 @@ +/* + * IEEE802.15.4-2003 specification + * + * Copyright (C) 2007-2011 Siemens AG + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef NET_MAC802154_H +#define NET_MAC802154_H + +#include <net/af_ieee802154.h> + +/** + * enum ieee802154_hw_addr_filt_flags - hardware flags + * + * These flags are used to indicate changed address settings from + * the stack to the hardware. + * + * @IEEE802515_SADDR_CHANGED: + * Indicates that the Short Address changed + * + * @IEEE802515_IEEEADDR_CHANGED: + * Indicates that the IEEE Address changed + * + * @IEEE802515_PANID_CHANGED: + * Indicates that the PAN ID changed + * + * @IEEE802515_PANC_CHANGED: + * Indicates that PAN Coordinator status changed + */ +enum ieee802154_hw_addr_filt_flags { + IEEE802515_SADDR_CHANGED = 1 << 0, + IEEE802515_IEEEADDR_CHANGED = 1 << 1, + IEEE802515_PANID_CHANGED = 1 << 2, + IEEE802515_PANC_CHANGED = 1 << 3, +}; + +struct ieee802154_hw_addr_filt { + u16 pan_id; + u16 short_addr; + u8 ieee_addr[IEEE802154_ADDR_LEN]; + u8 pan_coord; +}; + +struct ieee802154_dev { + /* filled by the driver */ + int extra_tx_headroom; /* headroom to reserve for tx skb */ + u32 flags; /* Flags for device to set */ + struct device *parent; + + /* filled by mac802154 core */ + struct ieee802154_hw_addr_filt hw_filt; + void *priv; /* driver-specific data */ + struct wpan_phy *phy; +}; + +/* Checksum is in hardware and is omitted from packet */ +/** + * enum ieee802154_hw_flags - hardware flags + * + * These flags are used to indicate hardware capabilities to + * the stack. Generally, flags here should have their meaning + * done in a way that the simplest hardware doesn't need setting + * any particular flags. There are some exceptions to this rule, + * however, so you are advised to review these flags carefully. + * + * @IEEE802154_HW_OMIT_CKSUM: + * Indicates that receiver omits FCS and transmitter will add + * FCS on it's own. + * + * @IEEE802154_HW_AACK: + * Indicates that receiver will autorespond with ACK frames. + */ +enum ieee802154_hw_flags { + IEEE802154_HW_OMIT_CKSUM = 1 << 0, + IEEE802154_HW_AACK = 1 << 1, +}; + +/** + * struct ieee802154_ops - callbacks from mac802154 to the driver + * + * This structure contains various callbacks that the driver may + * handle or, in some cases, must handle, for example to transmit + * a frame. + * + * @start: Handler that 802.15.4 module calls for device initialisation. + * This function is called before the first interface is attached. + * + * @stop: Handler that 802.15.4 module calls for device cleanup + * This function is called after the last interface is removed. + * + * @xmit: Handler that 802.15.4 module calls for each transmitted frame. + * skb cntains the buffer starting from the IEEE 802.15.4 header. + * The low-level driver should send the frame based on available + * configuration. + * This function should return zero or negative errno. + * Called with pib_lock held. + * + * @ed: Handler that 802.15.4 module calls for Energy Detection. + * This function should place the value for detected energy + * (usually device-dependant) in the level pointer and return + * either zero or negative errno. + * Called with pib_lock held. + * + * @set_channel: Set radio for listening on specific channel. + * Set the device for listening on specified channel. + * Returns either zero, or negative errno. + * Called with pib_lock held. + * + * @set_hw_addr_filt: Set radio for listening on specific address. + * Set the device for listening on specified address. + * Returns either zero, or negative errno. + */ +struct ieee802154_ops { + struct module *owner; + int (*start)(struct ieee802154_dev *dev); + void (*stop)(struct ieee802154_dev *dev); + int (*xmit)(struct ieee802154_dev *dev, + struct sk_buff *skb); + int (*ed)(struct ieee802154_dev *dev, u8 *level); + int (*set_channel)(struct ieee802154_dev *dev, + int page, + int channel); + int (*set_hw_addr_filt)(struct ieee802154_dev *dev, + struct ieee802154_hw_addr_filt *filt, + unsigned long changed); + int (*ieee_addr)(struct ieee802154_dev *dev, + u8 addr[IEEE802154_ADDR_LEN]); +}; + +int ieee802154_register_device(struct ieee802154_dev *dev); +void ieee802154_unregister_device(struct ieee802154_dev *dev); + +#endif /* NET_MAC802154_H */ -- 1.7.2.3 ^ permalink raw reply related [flat|nested] 27+ messages in thread
* Re: [PATCH 01/14] mac802154: basic ieee802.15.4 device structures 2011-12-19 16:33 ` [PATCH 01/14] mac802154: basic ieee802.15.4 device structures Alexander Smirnov @ 2011-12-19 19:32 ` David Miller 0 siblings, 0 replies; 27+ messages in thread From: David Miller @ 2011-12-19 19:32 UTC (permalink / raw) To: alex.bluesman.smirnov; +Cc: dbaryshkov, linux-zigbee-devel, netdev From: Alexander Smirnov <alex.bluesman.smirnov@gmail.com> Date: Mon, 19 Dec 2011 19:33:41 +0300 > +struct ieee802154_hw_addr_filt { > + u16 pan_id; > + u16 short_addr; > + u8 ieee_addr[IEEE802154_ADDR_LEN]; > + u8 pan_coord; > +}; What is the endianness of pan_id and short_addr objects? You should use the appropriate endianness types "__be16, __le16" and accessors to represent this. If you're storing them in cpu byte order, why? ^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 02/14] mac802154: allocation of ieee802154 device 2011-12-19 16:31 [PATCH series v1] IEEE 802.15.4 MAC layer basic implementation Alexander Smirnov 2011-12-19 16:33 ` [PATCH 01/14] mac802154: basic ieee802.15.4 device structures Alexander Smirnov @ 2011-12-19 16:33 ` Alexander Smirnov [not found] ` <1324312434-13151-2-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 2011-12-19 16:33 ` [PATCH 03/14] mac802154: RX data path Alexander Smirnov ` (3 subsequent siblings) 5 siblings, 1 reply; 27+ messages in thread From: Alexander Smirnov @ 2011-12-19 16:33 UTC (permalink / raw) To: davem; +Cc: dbaryshkov, linux-zigbee-devel, netdev, Alexander Smirnov Interface for device drivers to allocate and register ieee802154 compatible devices. Signed-off-by: Alexander Smirnov <alex.bluesman.smirnov@gmail.com> --- net/Kconfig | 1 + net/Makefile | 1 + net/mac802154/Kconfig | 16 +++++ net/mac802154/Makefile | 2 + net/mac802154/ieee802154_dev.c | 124 ++++++++++++++++++++++++++++++++++++++++ net/mac802154/mac802154.h | 61 ++++++++++++++++++++ 6 files changed, 205 insertions(+), 0 deletions(-) create mode 100644 net/mac802154/Kconfig create mode 100644 net/mac802154/Makefile create mode 100644 net/mac802154/ieee802154_dev.c create mode 100644 net/mac802154/mac802154.h diff --git a/net/Kconfig b/net/Kconfig index 2d99873..b8d4590 100644 --- a/net/Kconfig +++ b/net/Kconfig @@ -211,6 +211,7 @@ source "net/econet/Kconfig" source "net/wanrouter/Kconfig" source "net/phonet/Kconfig" source "net/ieee802154/Kconfig" +source "net/mac802154/Kconfig" source "net/sched/Kconfig" source "net/dcb/Kconfig" source "net/dns_resolver/Kconfig" diff --git a/net/Makefile b/net/Makefile index acdde49..1969e93 100644 --- a/net/Makefile +++ b/net/Makefile @@ -60,6 +60,7 @@ ifneq ($(CONFIG_DCB),) obj-y += dcb/ endif obj-$(CONFIG_IEEE802154) += ieee802154/ +obj-$(CONFIG_MAC802154) += mac802154/ ifeq ($(CONFIG_NET),y) obj-$(CONFIG_SYSCTL) += sysctl_net.o diff --git a/net/mac802154/Kconfig b/net/mac802154/Kconfig new file mode 100644 index 0000000..a967dda --- /dev/null +++ b/net/mac802154/Kconfig @@ -0,0 +1,16 @@ +config MAC802154 + tristate "Generic IEEE 802.15.4 Soft Networking Stack (mac802154)" + depends on IEEE802154 && EXPERIMENTAL + select CRC_CCITT + ---help--- + This option enables the hardware independent IEEE 802.15.4 + networking stack for SoftMAC devices (the ones implementing + only PHY level of IEEE 802.15.4 standard). + + Note: this implementation is neither certified, nor feature + complete! Compatibility with other implementations hasn't + been tested yet! + + If you plan to use HardMAC IEEE 802.15.4 devices, you can + say N here. Alternatievly you can say M to compile it as + module. diff --git a/net/mac802154/Makefile b/net/mac802154/Makefile new file mode 100644 index 0000000..cda9393 --- /dev/null +++ b/net/mac802154/Makefile @@ -0,0 +1,2 @@ +obj-$(CONFIG_MAC802154) += mac802154.o +mac802154-objs := ieee802154_dev.o diff --git a/net/mac802154/ieee802154_dev.c b/net/mac802154/ieee802154_dev.c new file mode 100644 index 0000000..2bd1034 --- /dev/null +++ b/net/mac802154/ieee802154_dev.c @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2007-2011 Siemens AG + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + +#include <linux/kernel.h> +#include <linux/netdevice.h> +#include <net/route.h> + +#include <net/mac802154.h> +#include <net/wpan-phy.h> + +#include "mac802154.h" + +struct ieee802154_dev *ieee802154_alloc_device(size_t priv_size, + struct ieee802154_ops *ops) +{ + struct wpan_phy *phy; + struct mac802154_priv *priv; + + if (!ops || !ops->xmit || !ops->ed || !ops->start || + !ops->stop || !ops->set_channel) { + printk(KERN_ERR + "undefined IEEE802.15.4 device operations\n"); + return NULL; + } + + phy = wpan_phy_alloc(ALIGN(sizeof(*priv), NETDEV_ALIGN) + priv_size); + if (!phy) { + printk(KERN_ERR + "failure to allocate master IEEE802.15.4 device\n"); + return NULL; + } + + priv = wpan_phy_priv(phy); + priv->hw.phy = priv->phy = phy; + priv->hw.priv = (char *)priv + ALIGN(sizeof(*priv), NETDEV_ALIGN); + priv->ops = ops; + + INIT_LIST_HEAD(&priv->slaves); + mutex_init(&priv->slaves_mtx); + + return &priv->hw; +} +EXPORT_SYMBOL(ieee802154_alloc_device); + +void ieee802154_free_device(struct ieee802154_dev *hw) +{ + struct mac802154_priv *priv = mac802154_to_priv(hw); + + wpan_phy_free(priv->phy); + + mutex_destroy(&priv->slaves_mtx); +} +EXPORT_SYMBOL(ieee802154_free_device); + + +int ieee802154_register_device(struct ieee802154_dev *dev) +{ + struct mac802154_priv *priv = mac802154_to_priv(dev); + int rc = -ENOMEM; + + priv->dev_workqueue = + create_singlethread_workqueue(wpan_phy_name(priv->phy)); + if (!priv->dev_workqueue) + goto out; + + wpan_phy_set_dev(priv->phy, priv->hw.parent); + + rc = wpan_phy_register(priv->phy); + if (rc < 0) + goto out_wq; + + rtnl_lock(); + + mutex_lock(&priv->slaves_mtx); + priv->running = MAC802154_DEVICE_RUN; + mutex_unlock(&priv->slaves_mtx); + + rtnl_unlock(); + + return 0; + +out_wq: + destroy_workqueue(priv->dev_workqueue); +out: + return rc; +} +EXPORT_SYMBOL(ieee802154_register_device); + +void ieee802154_unregister_device(struct ieee802154_dev *dev) +{ + struct mac802154_priv *priv = mac802154_to_priv(dev); + + flush_workqueue(priv->dev_workqueue); + destroy_workqueue(priv->dev_workqueue); + + rtnl_lock(); + + mutex_lock(&priv->slaves_mtx); + priv->running = MAC802154_DEVICE_STOPPED; + mutex_unlock(&priv->slaves_mtx); + + rtnl_unlock(); + + wpan_phy_unregister(priv->phy); +} +EXPORT_SYMBOL(ieee802154_unregister_device); + +MODULE_DESCRIPTION("IEEE 802.15.4 implementation"); +MODULE_LICENSE("GPL v2"); diff --git a/net/mac802154/mac802154.h b/net/mac802154/mac802154.h new file mode 100644 index 0000000..16f96f1 --- /dev/null +++ b/net/mac802154/mac802154.h @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2007-2011 Siemens AG + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Written by: + * Pavel Smolenskiy <pavel.smolenskiy@gmail.com> + * Maxim Gorbachyov <maxim.gorbachev@siemens.com> + * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> + * Alexander Smirnov <alex.bluesman.smirnov@gmail.com> + */ +#ifndef MAC802154_H +#define MAC802154_H + +struct mac802154_priv { + struct ieee802154_dev hw; + struct ieee802154_ops *ops; + + struct wpan_phy *phy; + + int open_count; + /* As in mac80211 slaves list is modified: + * 1) under the RTNL + * 2) protected by slaves_mtx; + * 3) in an RCU manner + * + * So atomic readers can use any of this protection methods + */ + struct list_head slaves; + struct mutex slaves_mtx; + /* This one is used for scanning and other + * jobs not to be interfered with serial driver */ + struct workqueue_struct *dev_workqueue; + + /* + * These flags are also modified under slaves_mtx and RTNL, + * so you can read them using any of protection methods. + */ + /* SoftMAC device is registered and running. One can add subinterfaces. */ + unsigned running: 1; +}; + +enum { + MAC802154_DEVICE_STOPPED, + MAC802154_DEVICE_RUN, +}; + +#define mac802154_to_priv(_hw) container_of(_hw, struct mac802154_priv, hw) + +#endif /* MAC802154_H */ -- 1.7.2.3 ^ permalink raw reply related [flat|nested] 27+ messages in thread
[parent not found: <1324312434-13151-2-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>]
* Re: [PATCH 02/14] mac802154: allocation of ieee802154 device [not found] ` <1324312434-13151-2-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> @ 2011-12-19 19:34 ` David Miller 0 siblings, 0 replies; 27+ messages in thread From: David Miller @ 2011-12-19 19:34 UTC (permalink / raw) To: alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w Cc: netdev-u79uwXL29TY76Z2rM5mHXA, linux-zigbee-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f From: Alexander Smirnov <alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> Date: Mon, 19 Dec 2011 19:33:42 +0300 > + phy = wpan_phy_alloc(ALIGN(sizeof(*priv), NETDEV_ALIGN) + priv_size); WHy make the call sites have to be cognizant of all of these crazy alignment calculations? Make wpan_phy_alloc() take care of it, and just pass the minimum amount of information necessary for it to calculate the right size. ------------------------------------------------------------------------------ Learn Windows Azure Live! Tuesday, Dec 13, 2011 Microsoft is holding a special Learn Windows Azure training event for developers. It will provide a great way to learn Windows Azure and what it provides. You can attend the event by watching it streamed LIVE online. Learn more at http://p.sf.net/sfu/ms-windowsazure ^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 03/14] mac802154: RX data path 2011-12-19 16:31 [PATCH series v1] IEEE 802.15.4 MAC layer basic implementation Alexander Smirnov 2011-12-19 16:33 ` [PATCH 01/14] mac802154: basic ieee802.15.4 device structures Alexander Smirnov 2011-12-19 16:33 ` [PATCH 02/14] mac802154: allocation of ieee802154 device Alexander Smirnov @ 2011-12-19 16:33 ` Alexander Smirnov [not found] ` <1324312434-13151-3-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 2011-12-19 16:33 ` [PATCH 04/14] mac802154: TX " Alexander Smirnov ` (2 subsequent siblings) 5 siblings, 1 reply; 27+ messages in thread From: Alexander Smirnov @ 2011-12-19 16:33 UTC (permalink / raw) To: davem; +Cc: dbaryshkov, linux-zigbee-devel, netdev, Alexander Smirnov Main RX data path implementation between physical and mac layers. Both contexts are supported: interrupt (data processed via worker) and non-interrupt (data processed directly). Signed-off-by: Alexander Smirnov <alex.bluesman.smirnov@gmail.com> --- include/net/ieee802154_netdev.h | 2 + include/net/mac802154.h | 4 ++ net/mac802154/Makefile | 2 +- net/mac802154/rx.c | 106 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 113 insertions(+), 1 deletions(-) create mode 100644 net/mac802154/rx.c diff --git a/include/net/ieee802154_netdev.h b/include/net/ieee802154_netdev.h index 5743055..12a7ee4 100644 --- a/include/net/ieee802154_netdev.h +++ b/include/net/ieee802154_netdev.h @@ -26,6 +26,8 @@ #ifndef IEEE802154_NETDEVICE_H #define IEEE802154_NETDEVICE_H +#include <net/af_ieee802154.h> + /* * A control block of skb passed between the ARPHRD_IEEE802154 device * and other stack parts. diff --git a/include/net/mac802154.h b/include/net/mac802154.h index 2733dab..4e9f042 100644 --- a/include/net/mac802154.h +++ b/include/net/mac802154.h @@ -142,4 +142,8 @@ struct ieee802154_ops { int ieee802154_register_device(struct ieee802154_dev *dev); void ieee802154_unregister_device(struct ieee802154_dev *dev); +void ieee802154_rx(struct ieee802154_dev *dev, struct sk_buff *skb, u8 lqi); +void ieee802154_rx_irqsafe(struct ieee802154_dev *dev, struct sk_buff *skb, + u8 lqi); + #endif /* NET_MAC802154_H */ diff --git a/net/mac802154/Makefile b/net/mac802154/Makefile index cda9393..e00fe47 100644 --- a/net/mac802154/Makefile +++ b/net/mac802154/Makefile @@ -1,2 +1,2 @@ obj-$(CONFIG_MAC802154) += mac802154.o -mac802154-objs := ieee802154_dev.o +mac802154-objs := ieee802154_dev.o rx.o diff --git a/net/mac802154/rx.c b/net/mac802154/rx.c new file mode 100644 index 0000000..d469bef --- /dev/null +++ b/net/mac802154/rx.c @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2007-2011 Siemens AG + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Written by: + * Pavel Smolenskiy <pavel.smolenskiy@gmail.com> + * Maxim Gorbachyov <maxim.gorbachev@siemens.com> + * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> + * Alexander Smirnov <alex.bluesman.smirnov@gmail.com> + */ + +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/workqueue.h> +#include <linux/netdevice.h> +#include <linux/crc-ccitt.h> + +#include <net/mac802154.h> +#include <net/ieee802154_netdev.h> + +#include "mac802154.h" + +static void +mac802154_subif_rx(struct ieee802154_dev *hw, struct sk_buff *skb, u8 lqi) +{ + struct mac802154_priv *priv = mac802154_to_priv(hw); + + BUG_ON(!skb); + + mac_cb(skb)->lqi = lqi; + skb->protocol = htons(ETH_P_IEEE802154); + skb_reset_mac_header(skb); + + BUILD_BUG_ON(sizeof(struct ieee802154_mac_cb) > sizeof(skb->cb)); + + if (!(priv->hw.flags & IEEE802154_HW_OMIT_CKSUM)) { + u16 crc; + + if (skb->len < 2) { + pr_debug("(%s): got invalid frame\n", __func__); + goto out; + } + crc = crc_ccitt(0, skb->data, skb->len); + if (crc) { + pr_debug("(%s): CRC mismatch\n", __func__); + goto out; + } + skb_trim(skb, skb->len - 2); /* CRC */ + } + +out: + dev_kfree_skb(skb); + return; +} + +struct rx_work { + struct sk_buff *skb; + struct work_struct work; + struct ieee802154_dev *dev; + u8 lqi; +}; + +static void mac802154_rx_worker(struct work_struct *work) +{ + struct rx_work *rw = container_of(work, struct rx_work, work); + struct sk_buff *skb = rw->skb; + + mac802154_subif_rx(rw->dev, skb, rw->lqi); + kfree(rw); +} + +void ieee802154_rx_irqsafe(struct ieee802154_dev *dev, + struct sk_buff *skb, u8 lqi) +{ + struct mac802154_priv *priv = mac802154_to_priv(dev); + struct rx_work *work = kzalloc(sizeof(struct rx_work), GFP_ATOMIC); + + if (!work) + return; + + INIT_WORK(&work->work, mac802154_rx_worker); + work->skb = skb; + work->dev = dev; + work->lqi = lqi; + + queue_work(priv->dev_workqueue, &work->work); +} +EXPORT_SYMBOL(ieee802154_rx_irqsafe); + +void mac802154_rx(struct ieee802154_dev *dev, struct sk_buff *skb, u8 lqi) +{ + mac802154_subif_rx(dev, skb, lqi); +} +EXPORT_SYMBOL(mac802154_rx); -- 1.7.2.3 ^ permalink raw reply related [flat|nested] 27+ messages in thread
[parent not found: <1324312434-13151-3-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>]
* Re: [PATCH 03/14] mac802154: RX data path [not found] ` <1324312434-13151-3-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> @ 2011-12-19 19:36 ` David Miller 0 siblings, 0 replies; 27+ messages in thread From: David Miller @ 2011-12-19 19:36 UTC (permalink / raw) To: alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w Cc: netdev-u79uwXL29TY76Z2rM5mHXA, linux-zigbee-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f From: Alexander Smirnov <alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> Date: Mon, 19 Dec 2011 19:33:43 +0300 > +void ieee802154_rx(struct ieee802154_dev *dev, struct sk_buff *skb, u8 lqi); > +void ieee802154_rx_irqsafe(struct ieee802154_dev *dev, struct sk_buff *skb, > + u8 lqi); Line up the "u8 lqi" argument with the openning parenthesis on the previous line. > +static void > +mac802154_subif_rx(struct ieee802154_dev *hw, struct sk_buff *skb, u8 lqi) > +{ > + struct mac802154_priv *priv = mac802154_to_priv(hw); > + > + BUG_ON(!skb); This assertion is excessive. You are adding all of the call sites, therefore you can see if the SKB argument is NULL or not. ------------------------------------------------------------------------------ Learn Windows Azure Live! Tuesday, Dec 13, 2011 Microsoft is holding a special Learn Windows Azure training event for developers. It will provide a great way to learn Windows Azure and what it provides. You can attend the event by watching it streamed LIVE online. Learn more at http://p.sf.net/sfu/ms-windowsazure ^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 04/14] mac802154: TX data path 2011-12-19 16:31 [PATCH series v1] IEEE 802.15.4 MAC layer basic implementation Alexander Smirnov ` (2 preceding siblings ...) 2011-12-19 16:33 ` [PATCH 03/14] mac802154: RX data path Alexander Smirnov @ 2011-12-19 16:33 ` Alexander Smirnov [not found] ` <1324312434-13151-4-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> [not found] ` <20111219163117.GA13123-AUGNqIMGY+bGcXpsla5Oef8+0UxHXcjY@public.gmane.org> 2011-12-19 16:33 ` [PATCH 14/14] Documentation/networking/ieee802154: update MAC chapter Alexander Smirnov 5 siblings, 1 reply; 27+ messages in thread From: Alexander Smirnov @ 2011-12-19 16:33 UTC (permalink / raw) To: davem; +Cc: dbaryshkov, linux-zigbee-devel, netdev, Alexander Smirnov Main TX data path implementation between upper and physical layers. Signed-off-by: Alexander Smirnov <alex.bluesman.smirnov@gmail.com> --- net/mac802154/Makefile | 2 +- net/mac802154/mac802154.h | 5 ++ net/mac802154/tx.c | 113 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 119 insertions(+), 1 deletions(-) create mode 100644 net/mac802154/tx.c diff --git a/net/mac802154/Makefile b/net/mac802154/Makefile index e00fe47..490beef 100644 --- a/net/mac802154/Makefile +++ b/net/mac802154/Makefile @@ -1,2 +1,2 @@ obj-$(CONFIG_MAC802154) += mac802154.o -mac802154-objs := ieee802154_dev.o rx.o +mac802154-objs := ieee802154_dev.o rx.o tx.o diff --git a/net/mac802154/mac802154.h b/net/mac802154/mac802154.h index 16f96f1..97f9155 100644 --- a/net/mac802154/mac802154.h +++ b/net/mac802154/mac802154.h @@ -58,4 +58,9 @@ enum { #define mac802154_to_priv(_hw) container_of(_hw, struct mac802154_priv, hw) +#define MAC802154_MAX_XMIT_ATTEMPTS 3 + +netdev_tx_t mac802154_tx(struct mac802154_priv *priv, struct sk_buff *skb, + u8 page, u8 chan); + #endif /* MAC802154_H */ diff --git a/net/mac802154/tx.c b/net/mac802154/tx.c new file mode 100644 index 0000000..ee0a9ed --- /dev/null +++ b/net/mac802154/tx.c @@ -0,0 +1,113 @@ +/* + * Copyright 2007-2011 Siemens AG + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Written by: + * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> + * Sergey Lapin <slapin@ossfans.org> + * Maxim Gorbachyov <maxim.gorbachev@siemens.com> + * Alexander Smirnov <alex.bluesman.smirnov@gmail.com> + */ + +#include <linux/netdevice.h> +#include <linux/if_arp.h> +#include <linux/crc-ccitt.h> + +#include <net/mac802154.h> +#include <net/wpan-phy.h> + +#include "mac802154.h" + +struct xmit_work { + struct sk_buff *skb; + struct work_struct work; + struct mac802154_priv *priv; + u8 page; + u8 chan; + u8 xmit_attempts; +}; + +static void mac802154_xmit_worker(struct work_struct *work) +{ + struct xmit_work *xw = container_of(work, struct xmit_work, work); + int res; + + mutex_lock(&xw->priv->phy->pib_lock); + if (xw->priv->phy->current_channel != xw->chan || + xw->priv->phy->current_page != xw->page) { + res = xw->priv->ops->set_channel(&xw->priv->hw, + xw->page, + xw->chan); + if (res) { + pr_debug("(%s): set_channel failed\n", __func__); + goto out; + } + } + + res = xw->priv->ops->xmit(&xw->priv->hw, xw->skb); + +out: + mutex_unlock(&xw->priv->phy->pib_lock); + + if (res) { + if (xw->xmit_attempts++ < MAC802154_MAX_XMIT_ATTEMPTS) { + queue_work(xw->priv->dev_workqueue, &xw->work); + return; + } else + pr_debug("(%s): transmission failed for %d times", + __func__, MAC802154_MAX_XMIT_ATTEMPTS); + } + + dev_kfree_skb(xw->skb); + + kfree(xw); +} + +netdev_tx_t mac802154_tx(struct mac802154_priv *priv, struct sk_buff *skb, + u8 page, u8 chan) +{ + struct xmit_work *work; + + if (WARN_ON(!(priv->phy->channels_supported[page] & + (1 << chan)))) + return NETDEV_TX_OK; + + if (!(priv->hw.flags & IEEE802154_HW_OMIT_CKSUM)) { + u16 crc = crc_ccitt(0, skb->data, skb->len); + u8 *data = skb_put(skb, 2); + data[0] = crc & 0xff; + data[1] = crc >> 8; + } + + if (skb_cow_head(skb, priv->hw.extra_tx_headroom)) { + dev_kfree_skb(skb); + return NETDEV_TX_OK; + } + + work = kzalloc(sizeof(struct xmit_work), GFP_ATOMIC); + if (!work) + return NETDEV_TX_BUSY; + + INIT_WORK(&work->work, mac802154_xmit_worker); + work->skb = skb; + work->priv = priv; + work->page = page; + work->chan = chan; + work->xmit_attempts = 0; + + queue_work(priv->dev_workqueue, &work->work); + + return NETDEV_TX_OK; +} -- 1.7.2.3 ^ permalink raw reply related [flat|nested] 27+ messages in thread
[parent not found: <1324312434-13151-4-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>]
* Re: [PATCH 04/14] mac802154: TX data path [not found] ` <1324312434-13151-4-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> @ 2011-12-19 19:38 ` David Miller 0 siblings, 0 replies; 27+ messages in thread From: David Miller @ 2011-12-19 19:38 UTC (permalink / raw) To: alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w Cc: netdev-u79uwXL29TY76Z2rM5mHXA, linux-zigbee-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f From: Alexander Smirnov <alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> Date: Mon, 19 Dec 2011 19:33:44 +0300 > +netdev_tx_t mac802154_tx(struct mac802154_priv *priv, struct sk_buff *skb, > + u8 page, u8 chan); Line up these arguments on the second line correctly! If you can't do it properly by hand, use something like emacs's "C mode" to do it for you automatically. > + res = xw->priv->ops->set_channel(&xw->priv->hw, > + xw->page, > + xw->chan); Line up the arguments properly. > + pr_debug("(%s): set_channel failed\n", __func__); Putting __func__ into the debugging printk's is excessive, take these out. > + if (WARN_ON(!(priv->phy->channels_supported[page] & > + (1 << chan)))) More poor formatting. ------------------------------------------------------------------------------ Learn Windows Azure Live! Tuesday, Dec 13, 2011 Microsoft is holding a special Learn Windows Azure training event for developers. It will provide a great way to learn Windows Azure and what it provides. You can attend the event by watching it streamed LIVE online. Learn more at http://p.sf.net/sfu/ms-windowsazure ^ permalink raw reply [flat|nested] 27+ messages in thread
[parent not found: <20111219163117.GA13123-AUGNqIMGY+bGcXpsla5Oef8+0UxHXcjY@public.gmane.org>]
* [PATCH 05/14] mac802154: define reduced mlme operations [not found] ` <20111219163117.GA13123-AUGNqIMGY+bGcXpsla5Oef8+0UxHXcjY@public.gmane.org> @ 2011-12-19 16:33 ` Alexander Smirnov 2011-12-19 16:33 ` [PATCH 06/14] mac802154: slave interfaces definition Alexander Smirnov ` (7 subsequent siblings) 8 siblings, 0 replies; 27+ messages in thread From: Alexander Smirnov @ 2011-12-19 16:33 UTC (permalink / raw) To: davem-fT/PcQaiUtIeIZ0/mPfg9Q Cc: netdev-u79uwXL29TY76Z2rM5mHXA, linux-zigbee-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f According IEEE 802.15.4 standard each node can be either full functionality device (FFD) or reduce functionality device (RFD). So 2 sets of operations are needed. This patch define RFD operations structure. Signed-off-by: Alexander Smirnov <alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> --- include/net/ieee802154_netdev.h | 20 ++++++++++++++++++-- 1 files changed, 18 insertions(+), 2 deletions(-) diff --git a/include/net/ieee802154_netdev.h b/include/net/ieee802154_netdev.h index 12a7ee4..f74c5db 100644 --- a/include/net/ieee802154_netdev.h +++ b/include/net/ieee802154_netdev.h @@ -83,6 +83,14 @@ struct wpan_phy; * get_phy should increment the reference counting on returned phy. * Use wpan_wpy_put to put that reference. */ + +/* + * The IEEE 802.15.4 standard defines 2 type of devices: + * - FFD - full functionality device + * - RFD - reduce functionality device + * + * So 2 sets of mlme operations are needed + */ struct ieee802154_mlme_ops { int (*assoc_req)(struct net_device *dev, struct ieee802154_addr *addr, @@ -112,12 +120,20 @@ struct ieee802154_mlme_ops { u8 (*get_bsn)(const struct net_device *dev); }; +struct ieee802154_reduced_mlme_ops { + struct wpan_phy *(*get_phy)(const struct net_device *dev); +}; + static inline struct ieee802154_mlme_ops *ieee802154_mlme_ops( const struct net_device *dev) { return dev->ml_priv; } -#endif - +static inline struct ieee802154_reduced_mlme_ops *ieee802154_reduced_mlme_ops( + const struct net_device *dev) +{ + return dev->ml_priv; +} +#endif -- 1.7.2.3 ------------------------------------------------------------------------------ Learn Windows Azure Live! Tuesday, Dec 13, 2011 Microsoft is holding a special Learn Windows Azure training event for developers. It will provide a great way to learn Windows Azure and what it provides. You can attend the event by watching it streamed LIVE online. Learn more at http://p.sf.net/sfu/ms-windowsazure ^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 06/14] mac802154: slave interfaces definition [not found] ` <20111219163117.GA13123-AUGNqIMGY+bGcXpsla5Oef8+0UxHXcjY@public.gmane.org> 2011-12-19 16:33 ` [PATCH 05/14] mac802154: define reduced mlme operations Alexander Smirnov @ 2011-12-19 16:33 ` Alexander Smirnov [not found] ` <1324312434-13151-6-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 2011-12-19 16:33 ` [PATCH 07/14] mac802154: reduced mlme operations Alexander Smirnov ` (6 subsequent siblings) 8 siblings, 1 reply; 27+ messages in thread From: Alexander Smirnov @ 2011-12-19 16:33 UTC (permalink / raw) To: davem-fT/PcQaiUtIeIZ0/mPfg9Q Cc: netdev-u79uwXL29TY76Z2rM5mHXA, linux-zigbee-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f Slaves represent typical network interfaces available from userspace. Each ieee802154 device/transceiver may have several slaves and able to be associated with several networks at the same time. Signed-off-by: Alexander Smirnov <alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> --- net/mac802154/mac802154.h | 25 +++++++++++++++++++++++++ 1 files changed, 25 insertions(+), 0 deletions(-) diff --git a/net/mac802154/mac802154.h b/net/mac802154/mac802154.h index 97f9155..cef6a4f 100644 --- a/net/mac802154/mac802154.h +++ b/net/mac802154/mac802154.h @@ -56,6 +56,31 @@ enum { MAC802154_DEVICE_RUN, }; +/* + * Slave interface definition + */ +struct mac802154_sub_if_data { + struct list_head list; /* the ieee802154_priv->slaves list */ + + struct mac802154_priv *hw; + struct net_device *dev; + + int type; + + spinlock_t mib_lock; + + u16 pan_id; + u16 short_addr; + + u8 chan; + u8 page; + + /* MAC BSN field */ + u8 bsn; + /* MAC DSN field */ + u8 dsn; +}; + #define mac802154_to_priv(_hw) container_of(_hw, struct mac802154_priv, hw) #define MAC802154_MAX_XMIT_ATTEMPTS 3 -- 1.7.2.3 ------------------------------------------------------------------------------ Learn Windows Azure Live! Tuesday, Dec 13, 2011 Microsoft is holding a special Learn Windows Azure training event for developers. It will provide a great way to learn Windows Azure and what it provides. You can attend the event by watching it streamed LIVE online. Learn more at http://p.sf.net/sfu/ms-windowsazure ^ permalink raw reply related [flat|nested] 27+ messages in thread
[parent not found: <1324312434-13151-6-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>]
* Re: [PATCH 06/14] mac802154: slave interfaces definition [not found] ` <1324312434-13151-6-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> @ 2011-12-19 19:38 ` David Miller 0 siblings, 0 replies; 27+ messages in thread From: David Miller @ 2011-12-19 19:38 UTC (permalink / raw) To: alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w Cc: netdev-u79uwXL29TY76Z2rM5mHXA, linux-zigbee-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f From: Alexander Smirnov <alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> Date: Mon, 19 Dec 2011 19:33:46 +0300 > + u16 pan_id; > + u16 short_addr; Again, endianness of these values, use the proper types and accessors etc. ------------------------------------------------------------------------------ Learn Windows Azure Live! Tuesday, Dec 13, 2011 Microsoft is holding a special Learn Windows Azure training event for developers. It will provide a great way to learn Windows Azure and what it provides. You can attend the event by watching it streamed LIVE online. Learn more at http://p.sf.net/sfu/ms-windowsazure ^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 07/14] mac802154: reduced mlme operations [not found] ` <20111219163117.GA13123-AUGNqIMGY+bGcXpsla5Oef8+0UxHXcjY@public.gmane.org> 2011-12-19 16:33 ` [PATCH 05/14] mac802154: define reduced mlme operations Alexander Smirnov 2011-12-19 16:33 ` [PATCH 06/14] mac802154: slave interfaces definition Alexander Smirnov @ 2011-12-19 16:33 ` Alexander Smirnov 2011-12-19 16:33 ` [PATCH 08/14] mac802154: basic mib support Alexander Smirnov ` (5 subsequent siblings) 8 siblings, 0 replies; 27+ messages in thread From: Alexander Smirnov @ 2011-12-19 16:33 UTC (permalink / raw) To: davem-fT/PcQaiUtIeIZ0/mPfg9Q Cc: netdev-u79uwXL29TY76Z2rM5mHXA, linux-zigbee-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f Initialize set of reduced operations. Signed-off-by: Alexander Smirnov <alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> --- net/mac802154/Makefile | 2 +- net/mac802154/mac802154.h | 2 ++ net/mac802154/mac_cmd.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletions(-) create mode 100644 net/mac802154/mac_cmd.c diff --git a/net/mac802154/Makefile b/net/mac802154/Makefile index 490beef..4d9dd0f 100644 --- a/net/mac802154/Makefile +++ b/net/mac802154/Makefile @@ -1,2 +1,2 @@ obj-$(CONFIG_MAC802154) += mac802154.o -mac802154-objs := ieee802154_dev.o rx.o tx.o +mac802154-objs := ieee802154_dev.o rx.o tx.o mac_cmd.o diff --git a/net/mac802154/mac802154.h b/net/mac802154/mac802154.h index cef6a4f..fc0aa75 100644 --- a/net/mac802154/mac802154.h +++ b/net/mac802154/mac802154.h @@ -85,6 +85,8 @@ struct mac802154_sub_if_data { #define MAC802154_MAX_XMIT_ATTEMPTS 3 +extern struct ieee802154_reduced_mlme_ops mac802154_mlme_reduced; + netdev_tx_t mac802154_tx(struct mac802154_priv *priv, struct sk_buff *skb, u8 page, u8 chan); diff --git a/net/mac802154/mac_cmd.c b/net/mac802154/mac_cmd.c new file mode 100644 index 0000000..941c3e4 --- /dev/null +++ b/net/mac802154/mac_cmd.c @@ -0,0 +1,43 @@ +/* + * MAC commands interface + * + * Copyright 2007-2011 Siemens AG + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Written by: + * Sergey Lapin <slapin-9cOl001CZnBAfugRpC6u6w@public.gmane.org> + * Dmitry Eremin-Solenikov <dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> + */ + +#include <linux/skbuff.h> +#include <linux/if_arp.h> +#include <net/ieee802154_netdev.h> +#include <net/wpan-phy.h> +#include <net/mac802154.h> + +#include "mac802154.h" + +struct wpan_phy *mac802154_get_phy(const struct net_device *dev) +{ + struct mac802154_sub_if_data *priv = netdev_priv(dev); + + BUG_ON(dev->type != ARPHRD_IEEE802154); + + return to_phy(get_device(&priv->hw->phy->dev)); +} + +struct ieee802154_reduced_mlme_ops mac802154_mlme_reduced = { + .get_phy = mac802154_get_phy, +}; -- 1.7.2.3 ------------------------------------------------------------------------------ Learn Windows Azure Live! Tuesday, Dec 13, 2011 Microsoft is holding a special Learn Windows Azure training event for developers. It will provide a great way to learn Windows Azure and what it provides. You can attend the event by watching it streamed LIVE online. Learn more at http://p.sf.net/sfu/ms-windowsazure ^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 08/14] mac802154: basic mib support [not found] ` <20111219163117.GA13123-AUGNqIMGY+bGcXpsla5Oef8+0UxHXcjY@public.gmane.org> ` (2 preceding siblings ...) 2011-12-19 16:33 ` [PATCH 07/14] mac802154: reduced mlme operations Alexander Smirnov @ 2011-12-19 16:33 ` Alexander Smirnov [not found] ` <1324312434-13151-8-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 2011-12-19 16:33 ` [PATCH 09/14] ieee802154: remove ieee802154 policy from globals Alexander Smirnov ` (4 subsequent siblings) 8 siblings, 1 reply; 27+ messages in thread From: Alexander Smirnov @ 2011-12-19 16:33 UTC (permalink / raw) To: davem-fT/PcQaiUtIeIZ0/mPfg9Q Cc: netdev-u79uwXL29TY76Z2rM5mHXA, linux-zigbee-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f Basic support for IEEE 802.15.4 management information base. Currently setting of HW address is implemented only. Signed-off-by: Alexander Smirnov <alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> --- net/mac802154/Makefile | 2 +- net/mac802154/mac802154.h | 3 + net/mac802154/mib.c | 96 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+), 1 deletions(-) create mode 100644 net/mac802154/mib.c diff --git a/net/mac802154/Makefile b/net/mac802154/Makefile index 4d9dd0f..6b348b0 100644 --- a/net/mac802154/Makefile +++ b/net/mac802154/Makefile @@ -1,2 +1,2 @@ obj-$(CONFIG_MAC802154) += mac802154.o -mac802154-objs := ieee802154_dev.o rx.o tx.o mac_cmd.o +mac802154-objs := ieee802154_dev.o rx.o tx.o mac_cmd.o mib.o diff --git a/net/mac802154/mac802154.h b/net/mac802154/mac802154.h index fc0aa75..d0e3d8d 100644 --- a/net/mac802154/mac802154.h +++ b/net/mac802154/mac802154.h @@ -90,4 +90,7 @@ extern struct ieee802154_reduced_mlme_ops mac802154_mlme_reduced; netdev_tx_t mac802154_tx(struct mac802154_priv *priv, struct sk_buff *skb, u8 page, u8 chan); +/* MIB callbacks */ +void mac802154_dev_set_ieee_addr(struct net_device *dev); + #endif /* MAC802154_H */ diff --git a/net/mac802154/mib.c b/net/mac802154/mib.c new file mode 100644 index 0000000..1a3c913 --- /dev/null +++ b/net/mac802154/mib.c @@ -0,0 +1,96 @@ +/* + * Copyright 2007, 2008, 2009 Siemens AG + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Written by: + * Dmitry Eremin-Solenikov <dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> + * Sergey Lapin <slapin-9cOl001CZnBAfugRpC6u6w@public.gmane.org> + * Maxim Gorbachyov <maxim.gorbachev-kv7WeFo6aLtBDgjK7y7TUQ@public.gmane.org> + */ + +#include <linux/if_arp.h> + +#include <net/mac802154.h> +#include <net/wpan-phy.h> + +#include "mac802154.h" + +struct phy_chan_notify_work { + struct work_struct work; + struct net_device *dev; +}; + +struct hw_addr_filt_notify_work { + struct work_struct work; + struct net_device *dev; + unsigned long changed; +}; + +struct mac802154_priv *mac802154_slave_get_priv(struct net_device *dev) +{ + struct mac802154_sub_if_data *priv = netdev_priv(dev); + + BUG_ON(dev->type != ARPHRD_IEEE802154); + + return priv->hw; +} + +static void hw_addr_notify(struct work_struct *work) +{ + struct hw_addr_filt_notify_work *nw = container_of(work, + struct hw_addr_filt_notify_work, work); + struct mac802154_priv *hw = mac802154_slave_get_priv(nw->dev); + int res; + + res = hw->ops->set_hw_addr_filt(&hw->hw, + &hw->hw.hw_filt, nw->changed); + if (res) + pr_debug("%s: failed changed mask %lx\n", + __func__, nw->changed); + + kfree(nw); + + return; +} + +static void set_hw_addr_filt(struct net_device *dev, unsigned long changed) +{ + struct mac802154_sub_if_data *priv = netdev_priv(dev); + struct hw_addr_filt_notify_work *work; + + work = kzalloc(sizeof(*work), GFP_ATOMIC); + if (!work) + return; + + INIT_WORK(&work->work, hw_addr_notify); + work->dev = dev; + work->changed = changed; + queue_work(priv->hw->dev_workqueue, &work->work); + + return; +} + +void mac802154_dev_set_ieee_addr(struct net_device *dev) +{ + struct mac802154_sub_if_data *priv = netdev_priv(dev); + + if (priv->hw->ops->set_hw_addr_filt && + memcmp(priv->hw->hw.hw_filt.ieee_addr, + dev->dev_addr, IEEE802154_ADDR_LEN)) { + memcpy(priv->hw->hw.hw_filt.ieee_addr, + dev->dev_addr, IEEE802154_ADDR_LEN); + set_hw_addr_filt(dev, IEEE802515_IEEEADDR_CHANGED); + } +} -- 1.7.2.3 ------------------------------------------------------------------------------ Learn Windows Azure Live! Tuesday, Dec 13, 2011 Microsoft is holding a special Learn Windows Azure training event for developers. It will provide a great way to learn Windows Azure and what it provides. You can attend the event by watching it streamed LIVE online. Learn more at http://p.sf.net/sfu/ms-windowsazure ^ permalink raw reply related [flat|nested] 27+ messages in thread
[parent not found: <1324312434-13151-8-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>]
* Re: [PATCH 08/14] mac802154: basic mib support [not found] ` <1324312434-13151-8-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> @ 2011-12-19 19:39 ` David Miller 0 siblings, 0 replies; 27+ messages in thread From: David Miller @ 2011-12-19 19:39 UTC (permalink / raw) To: alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w Cc: netdev-u79uwXL29TY76Z2rM5mHXA, linux-zigbee-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f From: Alexander Smirnov <alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> Date: Mon, 19 Dec 2011 19:33:48 +0300 > + res = hw->ops->set_hw_addr_filt(&hw->hw, > + &hw->hw.hw_filt, nw->changed); Line up the arguments. > + pr_debug("%s: failed changed mask %lx\n", > + __func__, nw->changed); Get rid of __func__. > + if (priv->hw->ops->set_hw_addr_filt && > + memcmp(priv->hw->hw.hw_filt.ieee_addr, > + dev->dev_addr, IEEE802154_ADDR_LEN)) { More bad formatting. ------------------------------------------------------------------------------ Learn Windows Azure Live! Tuesday, Dec 13, 2011 Microsoft is holding a special Learn Windows Azure training event for developers. It will provide a great way to learn Windows Azure and what it provides. You can attend the event by watching it streamed LIVE online. Learn more at http://p.sf.net/sfu/ms-windowsazure ^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 09/14] ieee802154: remove ieee802154 policy from globals [not found] ` <20111219163117.GA13123-AUGNqIMGY+bGcXpsla5Oef8+0UxHXcjY@public.gmane.org> ` (3 preceding siblings ...) 2011-12-19 16:33 ` [PATCH 08/14] mac802154: basic mib support Alexander Smirnov @ 2011-12-19 16:33 ` Alexander Smirnov [not found] ` <1324312434-13151-9-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 2011-12-19 16:33 ` [PATCH 10/14] ieee802154: interface type to be added Alexander Smirnov ` (3 subsequent siblings) 8 siblings, 1 reply; 27+ messages in thread From: Alexander Smirnov @ 2011-12-19 16:33 UTC (permalink / raw) To: davem-fT/PcQaiUtIeIZ0/mPfg9Q Cc: netdev-u79uwXL29TY76Z2rM5mHXA, linux-zigbee-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f Move ieee802154 netlink policy array definition inside ieee802154 layer. Signed-off-by: Alexander Smirnov <alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> --- include/linux/nl802154.h | 2 -- net/ieee802154/ieee802154.h | 2 ++ net/ieee802154/wpan-class.c | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/include/linux/nl802154.h b/include/linux/nl802154.h index 33d9f51..d2b5ae2 100644 --- a/include/linux/nl802154.h +++ b/include/linux/nl802154.h @@ -74,8 +74,6 @@ enum { #define IEEE802154_ATTR_MAX (__IEEE802154_ATTR_MAX - 1) -extern const struct nla_policy ieee802154_policy[]; - /* commands */ /* REQ should be responded with CONF * and INDIC with RESP diff --git a/net/ieee802154/ieee802154.h b/net/ieee802154/ieee802154.h index aadec42..e9799af 100644 --- a/net/ieee802154/ieee802154.h +++ b/net/ieee802154/ieee802154.h @@ -21,6 +21,8 @@ int __init ieee802154_nl_init(void); void __exit ieee802154_nl_exit(void); +extern const struct nla_policy ieee802154_policy[]; + #define IEEE802154_OP(_cmd, _func) \ { \ .cmd = _cmd, \ diff --git a/net/ieee802154/wpan-class.c b/net/ieee802154/wpan-class.c index 1627ef2..36d32e2 100644 --- a/net/ieee802154/wpan-class.c +++ b/net/ieee802154/wpan-class.c @@ -21,6 +21,7 @@ #include <linux/module.h> #include <linux/device.h> +#include <net/netlink.h> #include <net/wpan-phy.h> #include "ieee802154.h" -- 1.7.2.3 ------------------------------------------------------------------------------ Learn Windows Azure Live! Tuesday, Dec 13, 2011 Microsoft is holding a special Learn Windows Azure training event for developers. It will provide a great way to learn Windows Azure and what it provides. You can attend the event by watching it streamed LIVE online. Learn more at http://p.sf.net/sfu/ms-windowsazure ^ permalink raw reply related [flat|nested] 27+ messages in thread
[parent not found: <1324312434-13151-9-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>]
* Re: [PATCH 09/14] ieee802154: remove ieee802154 policy from globals [not found] ` <1324312434-13151-9-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> @ 2011-12-19 19:40 ` David Miller 0 siblings, 0 replies; 27+ messages in thread From: David Miller @ 2011-12-19 19:40 UTC (permalink / raw) To: alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w Cc: netdev-u79uwXL29TY76Z2rM5mHXA, linux-zigbee-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f From: Alexander Smirnov <alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> Date: Mon, 19 Dec 2011 19:33:49 +0300 > Move ieee802154 netlink policy array definition inside ieee802154 layer. > > Signed-off-by: Alexander Smirnov <alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> Then mark the thing static at it's definition, don't just remove all the externs like this. ------------------------------------------------------------------------------ Learn Windows Azure Live! Tuesday, Dec 13, 2011 Microsoft is holding a special Learn Windows Azure training event for developers. It will provide a great way to learn Windows Azure and what it provides. You can attend the event by watching it streamed LIVE online. Learn more at http://p.sf.net/sfu/ms-windowsazure ^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 10/14] ieee802154: interface type to be added [not found] ` <20111219163117.GA13123-AUGNqIMGY+bGcXpsla5Oef8+0UxHXcjY@public.gmane.org> ` (4 preceding siblings ...) 2011-12-19 16:33 ` [PATCH 09/14] ieee802154: remove ieee802154 policy from globals Alexander Smirnov @ 2011-12-19 16:33 ` Alexander Smirnov [not found] ` <1324312434-13151-10-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 2011-12-19 16:33 ` [PATCH 11/14] mac802154: slaves manipulation routine Alexander Smirnov ` (2 subsequent siblings) 8 siblings, 1 reply; 27+ messages in thread From: Alexander Smirnov @ 2011-12-19 16:33 UTC (permalink / raw) To: davem-fT/PcQaiUtIeIZ0/mPfg9Q Cc: netdev-u79uwXL29TY76Z2rM5mHXA, Alexander Smirnov (none), linux-zigbee-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f From: Alexander Smirnov <alexander@Lenovo.(none)> This stack supports several types of slaves interfaces. Another parameter to 'add_iface_ function added. Signed-off-by: Alexander Smirnov <alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> --- include/linux/nl802154.h | 5 +++++ include/net/wpan-phy.h | 2 +- net/ieee802154/nl-phy.c | 10 +++++++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/include/linux/nl802154.h b/include/linux/nl802154.h index d2b5ae2..8fa29ff 100644 --- a/include/linux/nl802154.h +++ b/include/linux/nl802154.h @@ -68,6 +68,7 @@ enum { IEEE802154_ATTR_CHANNEL_PAGE_LIST, IEEE802154_ATTR_PHY_NAME, + IEEE802154_ATTR_DEV_TYPE, __IEEE802154_ATTR_MAX, }; @@ -124,4 +125,8 @@ enum { #define IEEE802154_CMD_MAX (__IEEE802154_CMD_MAX - 1) +enum { + __IEEE802154_DEV_MAX, +}; + #endif diff --git a/include/net/wpan-phy.h b/include/net/wpan-phy.h index d86fffd..0c2c931 100644 --- a/include/net/wpan-phy.h +++ b/include/net/wpan-phy.h @@ -42,7 +42,7 @@ struct wpan_phy { int idx; struct net_device *(*add_iface)(struct wpan_phy *phy, - const char *name); + const char *name, int type); void (*del_iface)(struct wpan_phy *phy, struct net_device *dev); char priv[0] __attribute__((__aligned__(NETDEV_ALIGN))); diff --git a/net/ieee802154/nl-phy.c b/net/ieee802154/nl-phy.c index c64a38d..cf3cd71 100644 --- a/net/ieee802154/nl-phy.c +++ b/net/ieee802154/nl-phy.c @@ -179,6 +179,7 @@ static int ieee802154_add_iface(struct sk_buff *skb, const char *devname; int rc = -ENOBUFS; struct net_device *dev; + int type = -EINVAL; pr_debug("%s\n", __func__); @@ -221,7 +222,14 @@ static int ieee802154_add_iface(struct sk_buff *skb, goto nla_put_failure; } - dev = phy->add_iface(phy, devname); + if (info->attrs[IEEE802154_ATTR_DEV_TYPE]) { + type = nla_get_u8(info->attrs[IEEE802154_ATTR_DEV_TYPE]); + if (type > __IEEE802154_DEV_MAX) { + return -EINVAL; + } + } + + dev = phy->add_iface(phy, devname, type); if (IS_ERR(dev)) { rc = PTR_ERR(dev); goto nla_put_failure; -- 1.7.2.3 ------------------------------------------------------------------------------ Learn Windows Azure Live! Tuesday, Dec 13, 2011 Microsoft is holding a special Learn Windows Azure training event for developers. It will provide a great way to learn Windows Azure and what it provides. You can attend the event by watching it streamed LIVE online. Learn more at http://p.sf.net/sfu/ms-windowsazure ^ permalink raw reply related [flat|nested] 27+ messages in thread
[parent not found: <1324312434-13151-10-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>]
* Re: [PATCH 10/14] ieee802154: interface type to be added [not found] ` <1324312434-13151-10-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> @ 2011-12-19 19:42 ` David Miller 0 siblings, 0 replies; 27+ messages in thread From: David Miller @ 2011-12-19 19:42 UTC (permalink / raw) To: alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w Cc: netdev-u79uwXL29TY76Z2rM5mHXA, linux-zigbee-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, alexander From: Alexander Smirnov <alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> Date: Mon, 19 Dec 2011 19:33:50 +0300 > int rc = -ENOBUFS; > struct net_device *dev; > + int type = -EINVAL; Bad indentation. Or do you mean to tell me this doesn't look like total garbage and stand out like a sore thumb on your computer screen? > + if (type > __IEEE802154_DEV_MAX) { > + return -EINVAL; > + } No need for openning and closing braces here, there is simply one statement in the basic block. If you'll need them later, add them later, not now. ------------------------------------------------------------------------------ Learn Windows Azure Live! Tuesday, Dec 13, 2011 Microsoft is holding a special Learn Windows Azure training event for developers. It will provide a great way to learn Windows Azure and what it provides. You can attend the event by watching it streamed LIVE online. Learn more at http://p.sf.net/sfu/ms-windowsazure ^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 11/14] mac802154: slaves manipulation routine [not found] ` <20111219163117.GA13123-AUGNqIMGY+bGcXpsla5Oef8+0UxHXcjY@public.gmane.org> ` (5 preceding siblings ...) 2011-12-19 16:33 ` [PATCH 10/14] ieee802154: interface type to be added Alexander Smirnov @ 2011-12-19 16:33 ` Alexander Smirnov [not found] ` <1324312434-13151-11-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 2011-12-19 16:33 ` [PATCH 12/14] mac802154: monitor device support Alexander Smirnov 2011-12-19 16:33 ` [PATCH 13/14] drivers/ieee802154: IEEE 802.15.4 loopback driver Alexander Smirnov 8 siblings, 1 reply; 27+ messages in thread From: Alexander Smirnov @ 2011-12-19 16:33 UTC (permalink / raw) To: davem-fT/PcQaiUtIeIZ0/mPfg9Q Cc: netdev-u79uwXL29TY76Z2rM5mHXA, Alexander Smirnov (none), linux-zigbee-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f From: Alexander Smirnov <alexander@Lenovo.(none)> This patch adds interface for registration and removing slaves in the system. Signed-off-by: Alexander Smirnov <alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> --- include/net/mac802154.h | 4 + net/mac802154/ieee802154_dev.c | 140 +++++++++++++++++++++++++++++++++++++++- net/mac802154/mac802154.h | 3 + 3 files changed, 146 insertions(+), 1 deletions(-) diff --git a/include/net/mac802154.h b/include/net/mac802154.h index 4e9f042..4854885 100644 --- a/include/net/mac802154.h +++ b/include/net/mac802154.h @@ -139,6 +139,10 @@ struct ieee802154_ops { u8 addr[IEEE802154_ADDR_LEN]); }; +struct ieee802154_dev *ieee802154_alloc_device(size_t priv_size, + struct ieee802154_ops *ops); +void ieee802154_free_device(struct ieee802154_dev *dev); + int ieee802154_register_device(struct ieee802154_dev *dev); void ieee802154_unregister_device(struct ieee802154_dev *dev); diff --git a/net/mac802154/ieee802154_dev.c b/net/mac802154/ieee802154_dev.c index 2bd1034..649409c 100644 --- a/net/mac802154/ieee802154_dev.c +++ b/net/mac802154/ieee802154_dev.c @@ -18,13 +18,137 @@ #include <linux/kernel.h> #include <linux/netdevice.h> +#include <linux/nl802154.h> #include <net/route.h> - #include <net/mac802154.h> #include <net/wpan-phy.h> #include "mac802154.h" +int mac802154_slave_open(struct net_device *dev) +{ + struct mac802154_sub_if_data *priv = netdev_priv(dev); + int res = 0; + + if (priv->hw->open_count++ == 0) { + res = priv->hw->ops->start(&priv->hw->hw); + WARN_ON(res); + if (res) + goto err; + } + + if (priv->hw->ops->ieee_addr) { + res = priv->hw->ops->ieee_addr(&priv->hw->hw, dev->dev_addr); + WARN_ON(res); + if (res) + goto err; + mac802154_dev_set_ieee_addr(dev); + } + + netif_start_queue(dev); + return 0; +err: + priv->hw->open_count--; + + return res; +} + +int mac802154_slave_close(struct net_device *dev) +{ + struct mac802154_sub_if_data *priv = netdev_priv(dev); + + netif_stop_queue(dev); + + if ((--priv->hw->open_count) == 0) + priv->hw->ops->stop(&priv->hw->hw); + + return 0; +} + +static int mac802154_netdev_register(struct wpan_phy *phy, + struct net_device *dev) +{ + struct mac802154_sub_if_data *priv; + struct mac802154_priv *ipriv; + int err; + + ipriv = wpan_phy_priv(phy); + + priv = netdev_priv(dev); + priv->dev = dev; + priv->hw = ipriv; + + dev->needed_headroom = ipriv->hw.extra_tx_headroom; + + SET_NETDEV_DEV(dev, &ipriv->phy->dev); + + mutex_lock(&ipriv->slaves_mtx); + if (!ipriv->running) { + mutex_unlock(&ipriv->slaves_mtx); + return -ENODEV; + } + mutex_unlock(&ipriv->slaves_mtx); + + err = register_netdev(dev); + if (err < 0) + return err; + + rtnl_lock(); + mutex_lock(&ipriv->slaves_mtx); + list_add_tail_rcu(&priv->list, &ipriv->slaves); + mutex_unlock(&ipriv->slaves_mtx); + rtnl_unlock(); + + return 0; +} + +static void mac802154_del_iface(struct wpan_phy *phy, + struct net_device *dev) +{ + struct mac802154_sub_if_data *sdata; + ASSERT_RTNL(); + + sdata = netdev_priv(dev); + + BUG_ON(sdata->hw->phy != phy); + + mutex_lock(&sdata->hw->slaves_mtx); + list_del_rcu(&sdata->list); + mutex_unlock(&sdata->hw->slaves_mtx); + + synchronize_rcu(); + unregister_netdevice(sdata->dev); +} + +static struct net_device *mac802154_add_iface(struct wpan_phy *phy, + const char *name, int type) +{ + struct net_device *dev; + int err = -ENOMEM; + + /* No devices is currently supported */ + switch (type) { + default: + dev = NULL; + err = -EINVAL; + break; + } + if (!dev) + goto err; + + err = mac802154_netdev_register(phy, dev); + if (err) + goto err_free; + + dev_hold(dev); /* we return a device w/ incremented refcount */ + return dev; + +err_free: + free_netdev(dev); +err: + return ERR_PTR(err); +} + struct ieee802154_dev *ieee802154_alloc_device(size_t priv_size, struct ieee802154_ops *ops) { @@ -61,6 +185,8 @@ void ieee802154_free_device(struct ieee802154_dev *hw) { struct mac802154_priv *priv = mac802154_to_priv(hw); + BUG_ON(!list_empty(&priv->slaves)); + wpan_phy_free(priv->phy); mutex_destroy(&priv->slaves_mtx); @@ -80,6 +206,9 @@ int ieee802154_register_device(struct ieee802154_dev *dev) wpan_phy_set_dev(priv->phy, priv->hw.parent); + priv->phy->add_iface = mac802154_add_iface; + priv->phy->del_iface = mac802154_del_iface; + rc = wpan_phy_register(priv->phy); if (rc < 0) goto out_wq; @@ -104,6 +233,7 @@ EXPORT_SYMBOL(ieee802154_register_device); void ieee802154_unregister_device(struct ieee802154_dev *dev) { struct mac802154_priv *priv = mac802154_to_priv(dev); + struct mac802154_sub_if_data *sdata, *next; flush_workqueue(priv->dev_workqueue); destroy_workqueue(priv->dev_workqueue); @@ -114,6 +244,14 @@ void ieee802154_unregister_device(struct ieee802154_dev *dev) priv->running = MAC802154_DEVICE_STOPPED; mutex_unlock(&priv->slaves_mtx); + list_for_each_entry_safe(sdata, next, &priv->slaves, list) { + mutex_lock(&sdata->hw->slaves_mtx); + list_del(&sdata->list); + mutex_unlock(&sdata->hw->slaves_mtx); + + unregister_netdevice(sdata->dev); + } + rtnl_unlock(); wpan_phy_unregister(priv->phy); diff --git a/net/mac802154/mac802154.h b/net/mac802154/mac802154.h index d0e3d8d..f6f6f0a 100644 --- a/net/mac802154/mac802154.h +++ b/net/mac802154/mac802154.h @@ -87,6 +87,9 @@ struct mac802154_sub_if_data { extern struct ieee802154_reduced_mlme_ops mac802154_mlme_reduced; +int mac802154_slave_open(struct net_device *dev); +int mac802154_slave_close(struct net_device *dev); + netdev_tx_t mac802154_tx(struct mac802154_priv *priv, struct sk_buff *skb, u8 page, u8 chan); -- 1.7.2.3 ------------------------------------------------------------------------------ Learn Windows Azure Live! Tuesday, Dec 13, 2011 Microsoft is holding a special Learn Windows Azure training event for developers. It will provide a great way to learn Windows Azure and what it provides. You can attend the event by watching it streamed LIVE online. Learn more at http://p.sf.net/sfu/ms-windowsazure ^ permalink raw reply related [flat|nested] 27+ messages in thread
[parent not found: <1324312434-13151-11-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>]
* Re: [PATCH 11/14] mac802154: slaves manipulation routine [not found] ` <1324312434-13151-11-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> @ 2011-12-19 19:43 ` David Miller 2011-12-20 1:08 ` Joe Perches 0 siblings, 1 reply; 27+ messages in thread From: David Miller @ 2011-12-19 19:43 UTC (permalink / raw) To: alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w Cc: netdev-u79uwXL29TY76Z2rM5mHXA, linux-zigbee-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, alexander From: Alexander Smirnov <alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> Date: Mon, 19 Dec 2011 19:33:51 +0300 > +struct ieee802154_dev *ieee802154_alloc_device(size_t priv_size, > + struct ieee802154_ops *ops); Line up the arguments properly. > + if (priv->hw->open_count++ == 0) { > + res = priv->hw->ops->start(&priv->hw->hw); That's terrible, fix up the indentation. > + if ((--priv->hw->open_count) == 0) This is more canonical as "if (!--priv->hw->open_count)". ------------------------------------------------------------------------------ Learn Windows Azure Live! Tuesday, Dec 13, 2011 Microsoft is holding a special Learn Windows Azure training event for developers. It will provide a great way to learn Windows Azure and what it provides. You can attend the event by watching it streamed LIVE online. Learn more at http://p.sf.net/sfu/ms-windowsazure ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH 11/14] mac802154: slaves manipulation routine 2011-12-19 19:43 ` David Miller @ 2011-12-20 1:08 ` Joe Perches 0 siblings, 0 replies; 27+ messages in thread From: Joe Perches @ 2011-12-20 1:08 UTC (permalink / raw) To: David Miller Cc: alex.bluesman.smirnov, dbaryshkov, linux-zigbee-devel, netdev, alexander On Mon, 2011-12-19 at 14:43 -0500, David Miller wrote: > From: Alexander Smirnov <alex.bluesman.smirnov@gmail.com> > > + if ((--priv->hw->open_count) == 0) > This is more canonical as "if (!--priv->hw->open_count)". Shrug. I think this is more readable and intelligible with the == 0. A test of a non-bool or non-ptr to a specific value seems reasonable to me. ^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 12/14] mac802154: monitor device support [not found] ` <20111219163117.GA13123-AUGNqIMGY+bGcXpsla5Oef8+0UxHXcjY@public.gmane.org> ` (6 preceding siblings ...) 2011-12-19 16:33 ` [PATCH 11/14] mac802154: slaves manipulation routine Alexander Smirnov @ 2011-12-19 16:33 ` Alexander Smirnov 2011-12-19 19:47 ` David Miller 2011-12-19 16:33 ` [PATCH 13/14] drivers/ieee802154: IEEE 802.15.4 loopback driver Alexander Smirnov 8 siblings, 1 reply; 27+ messages in thread From: Alexander Smirnov @ 2011-12-19 16:33 UTC (permalink / raw) To: davem-fT/PcQaiUtIeIZ0/mPfg9Q Cc: netdev-u79uwXL29TY76Z2rM5mHXA, Alexander Smirnov (none), linux-zigbee-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f From: Alexander Smirnov <alexander@Lenovo.(none)> Support for monitor device intended to capture all the network activity. This interface could be used by networks sniffers. Signed-off-by: Alexander Smirnov <alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> --- include/linux/if_arp.h | 1 + include/linux/nl802154.h | 1 + include/net/wpan-phy.h | 2 + net/mac802154/Makefile | 2 +- net/mac802154/ieee802154_dev.c | 5 ++- net/mac802154/mac802154.h | 3 + net/mac802154/monitor.c | 115 ++++++++++++++++++++++++++++++++++++++++ net/mac802154/rx.c | 1 + 8 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 net/mac802154/monitor.c diff --git a/include/linux/if_arp.h b/include/linux/if_arp.h index 6d722f4..f0e69c6 100644 --- a/include/linux/if_arp.h +++ b/include/linux/if_arp.h @@ -87,6 +87,7 @@ #define ARPHRD_IEEE80211_PRISM 802 /* IEEE 802.11 + Prism2 header */ #define ARPHRD_IEEE80211_RADIOTAP 803 /* IEEE 802.11 + radiotap header */ #define ARPHRD_IEEE802154 804 +#define ARPHRD_IEEE802154_MONITOR 805 /* IEEE 802.15.4 network monitor */ #define ARPHRD_PHONET 820 /* PhoNet media type */ #define ARPHRD_PHONET_PIPE 821 /* PhoNet pipe header */ diff --git a/include/linux/nl802154.h b/include/linux/nl802154.h index 8fa29ff..6152fc9 100644 --- a/include/linux/nl802154.h +++ b/include/linux/nl802154.h @@ -126,6 +126,7 @@ enum { #define IEEE802154_CMD_MAX (__IEEE802154_CMD_MAX - 1) enum { + IEEE802154_DEV_MONITOR = 1, /* for compatibility with WireShark */ __IEEE802154_DEV_MAX, }; diff --git a/include/net/wpan-phy.h b/include/net/wpan-phy.h index 0c2c931..368da0b 100644 --- a/include/net/wpan-phy.h +++ b/include/net/wpan-phy.h @@ -24,6 +24,8 @@ #include <linux/netdevice.h> #include <linux/mutex.h> +#define WPAN_NUM_PAGES 32 + struct wpan_phy { struct mutex pib_lock; diff --git a/net/mac802154/Makefile b/net/mac802154/Makefile index 6b348b0..ec1bd3f 100644 --- a/net/mac802154/Makefile +++ b/net/mac802154/Makefile @@ -1,2 +1,2 @@ obj-$(CONFIG_MAC802154) += mac802154.o -mac802154-objs := ieee802154_dev.o rx.o tx.o mac_cmd.o mib.o +mac802154-objs := ieee802154_dev.o rx.o tx.o mac_cmd.o mib.o monitor.o diff --git a/net/mac802154/ieee802154_dev.c b/net/mac802154/ieee802154_dev.c index 649409c..03330d3 100644 --- a/net/mac802154/ieee802154_dev.c +++ b/net/mac802154/ieee802154_dev.c @@ -126,8 +126,11 @@ static struct net_device *mac802154_add_iface(struct wpan_phy *phy, struct net_device *dev; int err = -ENOMEM; - /* No devices is currently supported */ switch (type) { + case IEEE802154_DEV_MONITOR: + dev = alloc_netdev(sizeof(struct mac802154_sub_if_data), + name, mac802154_monitor_setup); + break; default: dev = NULL; err = -EINVAL; diff --git a/net/mac802154/mac802154.h b/net/mac802154/mac802154.h index f6f6f0a..2a301d0 100644 --- a/net/mac802154/mac802154.h +++ b/net/mac802154/mac802154.h @@ -90,6 +90,9 @@ extern struct ieee802154_reduced_mlme_ops mac802154_mlme_reduced; int mac802154_slave_open(struct net_device *dev); int mac802154_slave_close(struct net_device *dev); +void mac802154_monitors_rx(struct mac802154_priv *priv, struct sk_buff *skb); +void mac802154_monitor_setup(struct net_device *dev); + netdev_tx_t mac802154_tx(struct mac802154_priv *priv, struct sk_buff *skb, u8 page, u8 chan); diff --git a/net/mac802154/monitor.c b/net/mac802154/monitor.c new file mode 100644 index 0000000..ccc5e81 --- /dev/null +++ b/net/mac802154/monitor.c @@ -0,0 +1,115 @@ +/* + * Copyright 2007, 2008, 2009 Siemens AG + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Written by: + * Dmitry Eremin-Solenikov <dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> + * Sergey Lapin <slapin-9cOl001CZnBAfugRpC6u6w@public.gmane.org> + * Maxim Gorbachyov <maxim.gorbachev-kv7WeFo6aLtBDgjK7y7TUQ@public.gmane.org> + */ + +#include <linux/netdevice.h> +#include <linux/skbuff.h> +#include <linux/if_arp.h> +#include <linux/crc-ccitt.h> +#include <linux/nl802154.h> +#include <net/ieee802154.h> +#include <net/mac802154.h> +#include <net/wpan-phy.h> + +#include "mac802154.h" + +static netdev_tx_t mac802154_monitor_xmit(struct sk_buff *skb, struct net_device *dev) +{ + struct mac802154_sub_if_data *priv; + u8 chan, page; + + priv = netdev_priv(dev); + + /* FIXME: locking */ + chan = priv->hw->phy->current_channel; + page = priv->hw->phy->current_page; + + if (chan == (u8)-1) /* not init */ + return NETDEV_TX_OK; + + BUG_ON(page >= WPAN_NUM_PAGES); + BUG_ON(chan >= 27); + + skb->skb_iif = dev->ifindex; + dev->stats.tx_packets++; + dev->stats.tx_bytes += skb->len; + + return mac802154_tx(priv->hw, skb, page, chan); +} + + +void mac802154_monitors_rx(struct mac802154_priv *priv, struct sk_buff *skb) +{ + struct sk_buff *skb2; + struct mac802154_sub_if_data *sdata; + u16 crc = crc_ccitt(0, skb->data, skb->len); + u8 *data; + + rcu_read_lock(); + list_for_each_entry_rcu(sdata, &priv->slaves, list) { + if (sdata->type != IEEE802154_DEV_MONITOR) + continue; + + skb2 = skb_clone(skb, GFP_ATOMIC); + skb2->dev = sdata->dev; + skb2->pkt_type = PACKET_HOST; + data = skb_put(skb2, 2); + data[0] = crc & 0xff; + data[1] = crc >> 8; + + if (in_interrupt()) + netif_rx(skb2); + else + netif_rx_ni(skb2); + } + rcu_read_unlock(); +} + +static const struct net_device_ops mac802154_monitor_ops = { + .ndo_open = mac802154_slave_open, + .ndo_stop = mac802154_slave_close, + .ndo_start_xmit = mac802154_monitor_xmit, +}; + +void mac802154_monitor_setup(struct net_device *dev) +{ + struct mac802154_sub_if_data *priv; + + dev->addr_len = 0; + dev->hard_header_len = 0; + dev->needed_tailroom = 2; /* FCS */ + dev->mtu = IEEE802154_MTU; + dev->tx_queue_len = 10; + dev->type = ARPHRD_IEEE802154_MONITOR; + dev->flags = IFF_NOARP | IFF_BROADCAST; + dev->watchdog_timeo = 0; + + dev->destructor = free_netdev; + dev->netdev_ops = &mac802154_monitor_ops; + dev->ml_priv = &mac802154_mlme_reduced; + + priv = netdev_priv(dev); + priv->type = IEEE802154_DEV_MONITOR; + + priv->chan = -1; /* not initialized */ + priv->page = 0; /* for compat */ +} + diff --git a/net/mac802154/rx.c b/net/mac802154/rx.c index d469bef..335efbf 100644 --- a/net/mac802154/rx.c +++ b/net/mac802154/rx.c @@ -60,6 +60,7 @@ mac802154_subif_rx(struct ieee802154_dev *hw, struct sk_buff *skb, u8 lqi) skb_trim(skb, skb->len - 2); /* CRC */ } + mac802154_monitors_rx(priv, skb); out: dev_kfree_skb(skb); return; -- 1.7.2.3 ------------------------------------------------------------------------------ Learn Windows Azure Live! Tuesday, Dec 13, 2011 Microsoft is holding a special Learn Windows Azure training event for developers. It will provide a great way to learn Windows Azure and what it provides. You can attend the event by watching it streamed LIVE online. Learn more at http://p.sf.net/sfu/ms-windowsazure ^ permalink raw reply related [flat|nested] 27+ messages in thread
* Re: [PATCH 12/14] mac802154: monitor device support 2011-12-19 16:33 ` [PATCH 12/14] mac802154: monitor device support Alexander Smirnov @ 2011-12-19 19:47 ` David Miller 0 siblings, 0 replies; 27+ messages in thread From: David Miller @ 2011-12-19 19:47 UTC (permalink / raw) To: alex.bluesman.smirnov; +Cc: dbaryshkov, linux-zigbee-devel, netdev, alexander From: Alexander Smirnov <alex.bluesman.smirnov@gmail.com> Date: Mon, 19 Dec 2011 19:33:52 +0300 > + IEEE802154_DEV_MONITOR = 1, /* for compatibility with WireShark */ What's this "compatability" all about? Explain it. > + dev = alloc_netdev(sizeof(struct mac802154_sub_if_data), > + name, mac802154_monitor_setup); Line up the arguments properly. > + break; > default: > dev = NULL; > err = -EINVAL; > diff --git a/net/mac802154/mac802154.h b/net/mac802154/mac802154.h > index f6f6f0a..2a301d0 100644 > --- a/net/mac802154/mac802154.h > +++ b/net/mac802154/mac802154.h > @@ -90,6 +90,9 @@ extern struct ieee802154_reduced_mlme_ops mac802154_mlme_reduced; > int mac802154_slave_open(struct net_device *dev); > int mac802154_slave_close(struct net_device *dev); > > +void mac802154_monitors_rx(struct mac802154_priv *priv, struct sk_buff *skb); > +void mac802154_monitor_setup(struct net_device *dev); > + > netdev_tx_t mac802154_tx(struct mac802154_priv *priv, struct sk_buff *skb, > u8 page, u8 chan); > > diff --git a/net/mac802154/monitor.c b/net/mac802154/monitor.c > new file mode 100644 > index 0000000..ccc5e81 > --- /dev/null > +++ b/net/mac802154/monitor.c > @@ -0,0 +1,115 @@ > +/* > + * Copyright 2007, 2008, 2009 Siemens AG > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License version 2 > + * as published by the Free Software Foundation. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License along > + * with this program; if not, write to the Free Software Foundation, Inc., > + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. > + * > + * Written by: > + * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> > + * Sergey Lapin <slapin@ossfans.org> > + * Maxim Gorbachyov <maxim.gorbachev@siemens.com> > + */ > + > +#include <linux/netdevice.h> > +#include <linux/skbuff.h> > +#include <linux/if_arp.h> > +#include <linux/crc-ccitt.h> > +#include <linux/nl802154.h> > +#include <net/ieee802154.h> > +#include <net/mac802154.h> > +#include <net/wpan-phy.h> > + > +#include "mac802154.h" > + > +static netdev_tx_t mac802154_monitor_xmit(struct sk_buff *skb, struct net_device *dev) > +{ > + struct mac802154_sub_if_data *priv; > + u8 chan, page; > + > + priv = netdev_priv(dev); > + > + /* FIXME: locking */ > + chan = priv->hw->phy->current_channel; > + page = priv->hw->phy->current_page; > + > + if (chan == (u8)-1) /* not init */ ... > + priv->chan = -1; /* not initialized */ This mixing of the integer "-1" value with a "u8" type is asking for trouble. Define something like: #define MAC802154_CHAN_NONE 0xff or #define MAC802154_CHAN_NONE (~(u8)0) and use it consistently. ^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 13/14] drivers/ieee802154: IEEE 802.15.4 loopback driver [not found] ` <20111219163117.GA13123-AUGNqIMGY+bGcXpsla5Oef8+0UxHXcjY@public.gmane.org> ` (7 preceding siblings ...) 2011-12-19 16:33 ` [PATCH 12/14] mac802154: monitor device support Alexander Smirnov @ 2011-12-19 16:33 ` Alexander Smirnov [not found] ` <1324312434-13151-13-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 8 siblings, 1 reply; 27+ messages in thread From: Alexander Smirnov @ 2011-12-19 16:33 UTC (permalink / raw) To: davem-fT/PcQaiUtIeIZ0/mPfg9Q Cc: netdev-u79uwXL29TY76Z2rM5mHXA, Alexander Smirnov (none), linux-zigbee-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f From: Alexander Smirnov <alexander@Lenovo.(none)> Add support for loopback driver. It's very useful tool for testing and development upper IEEE 802.15.4 layer. Signed-off-by: Alexander Smirnov <alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> --- drivers/ieee802154/Kconfig | 8 ++ drivers/ieee802154/Makefile | 1 + drivers/ieee802154/fakelb.c | 287 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 296 insertions(+), 0 deletions(-) create mode 100644 drivers/ieee802154/fakelb.c diff --git a/drivers/ieee802154/Kconfig b/drivers/ieee802154/Kconfig index 9b9f43a..15c0640 100644 --- a/drivers/ieee802154/Kconfig +++ b/drivers/ieee802154/Kconfig @@ -19,4 +19,12 @@ config IEEE802154_FAKEHARD This driver can also be built as a module. To do so say M here. The module will be called 'fakehard'. +config IEEE802154_FAKELB + depends on IEEE802154_DRIVERS && MAC802154 + tristate "IEEE 802.15.4 loopback driver" + ---help--- + Say Y here to enable the fake driver that can emulate a net + of several interconnected radio devices. + This driver can also be built as a module. To do so say M here. + The module will be called 'fakelb'. diff --git a/drivers/ieee802154/Makefile b/drivers/ieee802154/Makefile index 800a389..ea784ea 100644 --- a/drivers/ieee802154/Makefile +++ b/drivers/ieee802154/Makefile @@ -1 +1,2 @@ obj-$(CONFIG_IEEE802154_FAKEHARD) += fakehard.o +obj-$(CONFIG_IEEE802154_FAKELB) += fakelb.o diff --git a/drivers/ieee802154/fakelb.c b/drivers/ieee802154/fakelb.c new file mode 100644 index 0000000..35689e4 --- /dev/null +++ b/drivers/ieee802154/fakelb.c @@ -0,0 +1,287 @@ +/* + * Loopback IEEE 802.15.4 interface + * + * Copyright 2007-2011 Siemens AG + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Written by: + * Sergey Lapin <slapin-9cOl001CZnBAfugRpC6u6w@public.gmane.org> + * Dmitry Eremin-Solenikov <dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> + */ + +#include <linux/module.h> +#include <linux/timer.h> +#include <linux/platform_device.h> +#include <linux/netdevice.h> +#include <linux/spinlock.h> +#include <net/mac802154.h> +#include <net/wpan-phy.h> + +static int numlbs = 1; + +struct fakelb_dev_priv { + struct ieee802154_dev *dev; + + struct list_head list; + struct fakelb_priv *fake; + + unsigned int working:1; +}; + +struct fakelb_priv { + struct list_head list; + rwlock_t lock; +}; + +static int +fakelb_hw_ed(struct ieee802154_dev *dev, u8 *level) +{ + pr_debug("(%s)\n", __func__); + + might_sleep(); + BUG_ON(!level); + *level = 0xbe; + + return 0; +} + +static int +fakelb_hw_channel(struct ieee802154_dev *dev, int page, int channel) +{ + pr_debug("(%s): set channel %d\n", __func__, channel); + + might_sleep(); + dev->phy->current_page = page; + dev->phy->current_channel = channel; + + return 0; +} + +static void +fakelb_hw_deliver(struct fakelb_dev_priv *priv, struct sk_buff *skb) +{ + struct sk_buff *newskb; + + if (!priv->working) + return; + + newskb = pskb_copy(skb, GFP_ATOMIC); + + ieee802154_rx_irqsafe(priv->dev, newskb, 0xcc); +} + +static int +fakelb_hw_xmit(struct ieee802154_dev *dev, struct sk_buff *skb) +{ + struct fakelb_dev_priv *priv = dev->priv; + struct fakelb_priv *fake = priv->fake; + + might_sleep(); + + read_lock_bh(&fake->lock); + if (priv->list.next == priv->list.prev) { + /* we are the only one device */ + fakelb_hw_deliver(priv, skb); + } else { + struct fakelb_dev_priv *dp; + list_for_each_entry(dp, &priv->fake->list, list) + if (dp != priv && + dp->dev->phy->current_channel == + priv->dev->phy->current_channel) + fakelb_hw_deliver(dp, skb); + } + read_unlock_bh(&fake->lock); + + return 0; +} + +static int +fakelb_hw_start(struct ieee802154_dev *dev) { + struct fakelb_dev_priv *priv = dev->priv; + + if (priv->working) + return -EBUSY; + + priv->working = 1; + + return 0; +} + +static void +fakelb_hw_stop(struct ieee802154_dev *dev) { + struct fakelb_dev_priv *priv = dev->priv; + + priv->working = 0; +} + +static struct ieee802154_ops fakelb_ops = { + .owner = THIS_MODULE, + .xmit = fakelb_hw_xmit, + .ed = fakelb_hw_ed, + .set_channel = fakelb_hw_channel, + .start = fakelb_hw_start, + .stop = fakelb_hw_stop, +}; + +/* Number of dummy devices to be set up by this module. */ +module_param(numlbs, int, 0); +MODULE_PARM_DESC(numlbs, " number of pseudo devices"); + +static int fakelb_add_one(struct device *dev, struct fakelb_priv *fake) +{ + struct fakelb_dev_priv *priv; + int err; + struct ieee802154_dev *ieee; + + ieee = ieee802154_alloc_device(sizeof(*priv), &fakelb_ops); + if (!ieee) + return -ENOMEM; + + priv = ieee->priv; + priv->dev = ieee; + + /* 868 MHz BPSK 802.15.4-2003 */ + ieee->phy->channels_supported[0] |= 1; + /* 915 MHz BPSK 802.15.4-2003 */ + ieee->phy->channels_supported[0] |= 0x7fe; + /* 2.4 GHz O-QPSK 802.15.4-2003 */ + ieee->phy->channels_supported[0] |= 0x7FFF800; + /* 868 MHz ASK 802.15.4-2006 */ + ieee->phy->channels_supported[1] |= 1; + /* 915 MHz ASK 802.15.4-2006 */ + ieee->phy->channels_supported[1] |= 0x7fe; + /* 868 MHz O-QPSK 802.15.4-2006 */ + ieee->phy->channels_supported[2] |= 1; + /* 915 MHz O-QPSK 802.15.4-2006 */ + ieee->phy->channels_supported[2] |= 0x7fe; + /* 2.4 GHz CSS 802.15.4a-2007 */ + ieee->phy->channels_supported[3] |= 0x3fff; + /* UWB Sub-gigahertz 802.15.4a-2007 */ + ieee->phy->channels_supported[4] |= 1; + /* UWB Low band 802.15.4a-2007 */ + ieee->phy->channels_supported[4] |= 0x1e; + /* UWB High band 802.15.4a-2007 */ + ieee->phy->channels_supported[4] |= 0xffe0; + /* 750 MHz O-QPSK 802.15.4c-2009 */ + ieee->phy->channels_supported[5] |= 0xf; + /* 750 MHz MPSK 802.15.4c-2009 */ + ieee->phy->channels_supported[5] |= 0xf0; + /* 950 MHz BPSK 802.15.4d-2009 */ + ieee->phy->channels_supported[6] |= 0x3ff; + /* 950 MHz GFSK 802.15.4d-2009 */ + ieee->phy->channels_supported[6] |= 0x3ffc00; + + + INIT_LIST_HEAD(&priv->list); + priv->fake = fake; + + ieee->parent = dev; + + err = ieee802154_register_device(ieee); + if (err) + goto err_reg; + + write_lock_bh(&fake->lock); + list_add_tail(&priv->list, &fake->list); + write_unlock_bh(&fake->lock); + + return 0; + +err_reg: + ieee802154_free_device(priv->dev); + return err; +} + +static void fakelb_del(struct fakelb_dev_priv *priv) +{ + write_lock_bh(&priv->fake->lock); + list_del(&priv->list); + write_unlock_bh(&priv->fake->lock); + + ieee802154_unregister_device(priv->dev); + ieee802154_free_device(priv->dev); +} + +static int __devinit fakelb_probe(struct platform_device *pdev) +{ + struct fakelb_priv *priv; + struct fakelb_dev_priv *dp; + int err = -ENOMEM, i; + + priv = kzalloc(sizeof(struct fakelb_priv), GFP_KERNEL); + if (!priv) + goto err_alloc; + + INIT_LIST_HEAD(&priv->list); + rwlock_init(&priv->lock); + + for (i = 0; i < numlbs; i++) { + err = fakelb_add_one(&pdev->dev, priv); + if (err < 0) + goto err_slave; + } + + platform_set_drvdata(pdev, priv); + dev_info(&pdev->dev, "added ieee802154 hardware\n"); + return 0; + +err_slave: + list_for_each_entry(dp, &priv->list, list) + fakelb_del(dp); + kfree(priv); +err_alloc: + return err; +} + +static int __devexit fakelb_remove(struct platform_device *pdev) +{ + struct fakelb_priv *priv = platform_get_drvdata(pdev); + struct fakelb_dev_priv *dp, *temp; + + list_for_each_entry_safe(dp, temp, &priv->list, list) + fakelb_del(dp); + kfree(priv); + + return 0; +} + +static struct platform_device *ieee802154fake_dev; + +static struct platform_driver ieee802154fake_driver = { + .probe = fakelb_probe, + .remove = __devexit_p(fakelb_remove), + .driver = { + .name = "ieee802154fakelb", + .owner = THIS_MODULE, + }, +}; + +static __init int fakelb_init_module(void) +{ + ieee802154fake_dev = platform_device_register_simple( + "ieee802154fakelb", -1, NULL, 0); + return platform_driver_register(&ieee802154fake_driver); +} + +static __exit void fake_remove_module(void) +{ + platform_driver_unregister(&ieee802154fake_driver); + platform_device_unregister(ieee802154fake_dev); +} + +module_init(fakelb_init_module); +module_exit(fake_remove_module); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Dmitry Eremin-Solenikov, Sergey Lapin"); -- 1.7.2.3 ------------------------------------------------------------------------------ Learn Windows Azure Live! Tuesday, Dec 13, 2011 Microsoft is holding a special Learn Windows Azure training event for developers. It will provide a great way to learn Windows Azure and what it provides. You can attend the event by watching it streamed LIVE online. Learn more at http://p.sf.net/sfu/ms-windowsazure ^ permalink raw reply related [flat|nested] 27+ messages in thread
[parent not found: <1324312434-13151-13-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>]
* Re: [PATCH 13/14] drivers/ieee802154: IEEE 802.15.4 loopback driver [not found] ` <1324312434-13151-13-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> @ 2011-12-19 19:49 ` David Miller 0 siblings, 0 replies; 27+ messages in thread From: David Miller @ 2011-12-19 19:49 UTC (permalink / raw) To: alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w Cc: netdev-u79uwXL29TY76Z2rM5mHXA, linux-zigbee-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, alexander From: Alexander Smirnov <alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> Date: Mon, 19 Dec 2011 19:33:53 +0300 > + unsigned int working:1; Integer bit fields are troublesome, use a set of flags here, or if this is likely to be the only set of state use a "bool" type. > + list_for_each_entry(dp, &priv->fake->list, list) > + if (dp != priv && > + dp->dev->phy->current_channel == > + priv->dev->phy->current_channel) > + fakelb_hw_deliver(dp, skb); Format the if() statement properly: if (dp != priv && (dp->dev->phy->current_channel == priv->dev->phy->current_channel)) And use braces around the top-level list traversal since the basic block is taking up multiple lines. > +static int > +fakelb_hw_start(struct ieee802154_dev *dev) { > + struct fakelb_dev_priv *priv = dev->priv; > + > + if (priv->working) > + return -EBUSY; > + > + priv->working = 1; > + > + return 0; > +} What prevents this "test and set" sequence from running in parallel with whatever clears the ->working value and thus we end up losing the event? > + ieee->phy->channels_supported[6] |= 0x3ffc00; > + > + > + INIT_LIST_HEAD(&priv->list); Excess empty line, there is no need for two of them, get rid of the extra one. ------------------------------------------------------------------------------ Learn Windows Azure Live! Tuesday, Dec 13, 2011 Microsoft is holding a special Learn Windows Azure training event for developers. It will provide a great way to learn Windows Azure and what it provides. You can attend the event by watching it streamed LIVE online. Learn more at http://p.sf.net/sfu/ms-windowsazure ^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 14/14] Documentation/networking/ieee802154: update MAC chapter 2011-12-19 16:31 [PATCH series v1] IEEE 802.15.4 MAC layer basic implementation Alexander Smirnov ` (4 preceding siblings ...) [not found] ` <20111219163117.GA13123-AUGNqIMGY+bGcXpsla5Oef8+0UxHXcjY@public.gmane.org> @ 2011-12-19 16:33 ` Alexander Smirnov 5 siblings, 0 replies; 27+ messages in thread From: Alexander Smirnov @ 2011-12-19 16:33 UTC (permalink / raw) To: davem; +Cc: dbaryshkov, linux-zigbee-devel, netdev, Alexander Smirnov Update the documentation according to latest changes. Signed-off-by: Alexander Smirnov <alex.bluesman.smirnov@gmail.com> --- Documentation/networking/ieee802154.txt | 57 +++++++++++++++++++++++++++---- 1 files changed, 50 insertions(+), 7 deletions(-) diff --git a/Documentation/networking/ieee802154.txt b/Documentation/networking/ieee802154.txt index 1dc1c24..df41468 100644 --- a/Documentation/networking/ieee802154.txt +++ b/Documentation/networking/ieee802154.txt @@ -4,15 +4,22 @@ Introduction ============ +The IEEE 802.15.4 working group focuses on standartization of bottom +two layers: Medium Accsess Control (MAC) and Physical (PHY). And there +are mainly two options available for upper layers: + - ZigBee - proprietary protocol from ZigBee Alliance + - 6LowPAN - IPv6 networking over low rate personal area networks 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 IEEE 802.15.4 and 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 chosen -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 +The stack is composed of three main parts: + - IEEE 802.15.4 layer; We have chosen 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 + - MAC - provides access to shared channel and reliable data delivery + - PHY - represents device drivers Socket API @@ -73,11 +80,47 @@ We provide an example of simple HardMAC driver at drivers/ieee802154/fakehard.c SoftMAC ======= -We are going to provide intermediate layer implementing IEEE 802.15.4 MAC -in software. This is currently WIP. +The MAC is the middle layer in the IEEE 802.15.4 Linux stack. This moment it +provides interface for drivers registration and management of slave interfaces. + +NOTE: Currently the only monitor device type is supported - it's IEEE 802.15.4 +stack interface for network sniffers (e.g. WireShark). + +This layer is going to be extended soon. See header include/net/mac802154.h and several drivers in drivers/ieee802154/. + +Device drivers API +================== + +The include/net/mac802154.h defines following functions: + - struct ieee802154_dev *ieee802154_alloc_device + (size_t priv_size, struct ieee802154_ops *ops): + allocation of IEEE 802.15.4 compatible device + + - void ieee802154_free_device(struct ieee802154_dev *dev): + freeing allocated device + + - int ieee802154_register_device(struct ieee802154_dev *dev): + register PHY in the system + + - void ieee802154_unregister_device(struct ieee802154_dev *dev): + freeing registered PHY + +Moreover IEEE 802.15.4 device operations structure should be filled. + +Fake drivers +============ + +In addition there are two drivers available which simulate real devices with +HardMAC (fakehard) and SoftMAC (fakelb - IEEE 802.15.4 loopback driver) +interfaces. This option provides possibility to test and debug stack without +usage of real hardware. + +See sources in drivers/ieee802154 folder for more details. + + 6LoWPAN Linux implementation ============================ -- 1.7.2.3 ^ permalink raw reply related [flat|nested] 27+ messages in thread
end of thread, other threads:[~2011-12-20 1:08 UTC | newest]
Thread overview: 27+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-12-19 16:31 [PATCH series v1] IEEE 802.15.4 MAC layer basic implementation Alexander Smirnov
2011-12-19 16:33 ` [PATCH 01/14] mac802154: basic ieee802.15.4 device structures Alexander Smirnov
2011-12-19 19:32 ` David Miller
2011-12-19 16:33 ` [PATCH 02/14] mac802154: allocation of ieee802154 device Alexander Smirnov
[not found] ` <1324312434-13151-2-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2011-12-19 19:34 ` David Miller
2011-12-19 16:33 ` [PATCH 03/14] mac802154: RX data path Alexander Smirnov
[not found] ` <1324312434-13151-3-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2011-12-19 19:36 ` David Miller
2011-12-19 16:33 ` [PATCH 04/14] mac802154: TX " Alexander Smirnov
[not found] ` <1324312434-13151-4-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2011-12-19 19:38 ` David Miller
[not found] ` <20111219163117.GA13123-AUGNqIMGY+bGcXpsla5Oef8+0UxHXcjY@public.gmane.org>
2011-12-19 16:33 ` [PATCH 05/14] mac802154: define reduced mlme operations Alexander Smirnov
2011-12-19 16:33 ` [PATCH 06/14] mac802154: slave interfaces definition Alexander Smirnov
[not found] ` <1324312434-13151-6-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2011-12-19 19:38 ` David Miller
2011-12-19 16:33 ` [PATCH 07/14] mac802154: reduced mlme operations Alexander Smirnov
2011-12-19 16:33 ` [PATCH 08/14] mac802154: basic mib support Alexander Smirnov
[not found] ` <1324312434-13151-8-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2011-12-19 19:39 ` David Miller
2011-12-19 16:33 ` [PATCH 09/14] ieee802154: remove ieee802154 policy from globals Alexander Smirnov
[not found] ` <1324312434-13151-9-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2011-12-19 19:40 ` David Miller
2011-12-19 16:33 ` [PATCH 10/14] ieee802154: interface type to be added Alexander Smirnov
[not found] ` <1324312434-13151-10-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2011-12-19 19:42 ` David Miller
2011-12-19 16:33 ` [PATCH 11/14] mac802154: slaves manipulation routine Alexander Smirnov
[not found] ` <1324312434-13151-11-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2011-12-19 19:43 ` David Miller
2011-12-20 1:08 ` Joe Perches
2011-12-19 16:33 ` [PATCH 12/14] mac802154: monitor device support Alexander Smirnov
2011-12-19 19:47 ` David Miller
2011-12-19 16:33 ` [PATCH 13/14] drivers/ieee802154: IEEE 802.15.4 loopback driver Alexander Smirnov
[not found] ` <1324312434-13151-13-git-send-email-alex.bluesman.smirnov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2011-12-19 19:49 ` David Miller
2011-12-19 16:33 ` [PATCH 14/14] Documentation/networking/ieee802154: update MAC chapter Alexander Smirnov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).