From ca7f714fc8c9981eda5d85594333f955f75510f7 Mon Sep 17 00:00:00 2001 From: Xiangfu Date: Tue, 5 Jun 2012 11:32:43 +0800 Subject: [PATCH 1/3] 002 --- drivers/ieee802154/Kconfig | 55 +++++++++++++++++++++++++++++++++++++-- drivers/ieee802154/Makefile | 11 ++++++++ drivers/ieee802154/fakehard.c | 12 ++++++++- include/linux/if.h | 2 ++ include/linux/if_arp.h | 2 ++ include/linux/nl802154.h | 10 +++++-- include/net/ieee802154_netdev.h | 17 +++++++++--- include/net/wpan-phy.h | 8 +++--- net/Kconfig | 2 ++ net/Makefile | 1 + net/ieee802154/Kconfig | 8 ++++++ net/ieee802154/Makefile | 3 +++ net/ieee802154/dgram.c | 3 +-- net/ieee802154/ieee802154.h | 4 +++ net/ieee802154/nl-mac.c | 2 +- net/ieee802154/nl-phy.c | 20 +++++++++++--- net/ieee802154/nl_policy.c | 1 + net/ieee802154/wpan-class.c | 2 +- 18 files changed, 145 insertions(+), 18 deletions(-) diff --git a/drivers/ieee802154/Kconfig b/drivers/ieee802154/Kconfig index 9b9f43a..5345e40 100644 --- a/drivers/ieee802154/Kconfig +++ b/drivers/ieee802154/Kconfig @@ -10,13 +10,64 @@ menuconfig IEEE802154_DRIVERS If you say N, all options in this submenu will be skipped and disabled. +config IEEE802154_DRIVER_DEBUG + bool "Driver debugging messages" + depends on IEEE802154_DRIVERS + default y + help + Say Y here to make the IEEE 802.15.4 drivers generate extensive + debugging messages. + config IEEE802154_FAKEHARD tristate "Fake LR-WPAN driver with several interconnected devices" depends on IEEE802154_DRIVERS ---help--- Say Y here to enable the fake driver that serves as an example - of HardMAC device driver. + of HardMAC device driver. - This driver can also be built as a module. To do so say M here. + 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 "Fake LR-WPAN driver with several interconnected devices" + ---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'. + +config IEEE802154_SERIAL + depends on IEEE802154_DRIVERS && MAC802154 + tristate "Simple LR-WPAN UART driver" + +config IEEE802154_AT86RF230 + depends on IEEE802154_DRIVERS && MAC802154 + tristate "AT86RF230 transceiver driver" + depends on SPI + +config SPI_ATBEN + tristate "ATBEN 8:10 SPI interface" + depends on JZ4740_QI_LB60 && IEEE802154_AT86RF230 + help + Bit-banging SPI driver for the 8:10 interface of the Ben NanoNote + when equipped with an ATBEN board. + +config SPI_ATUSB + tristate "ATUSB SPI interface" + depends on USB && IEEE802154_AT86RF230 + help + SPI-over-USB driver for the ATUSB IEEE 802.15.4 board. + +config IEEE802154_CC2420 + tristate "CC2420 driver" + depends on SPI + depends on IEEE802154_DRIVERS + +config IEEE802154_ADF7242 + tristate "ADF7242 transceiver driver" + depends on IEEE802154_DRIVERS && MAC802154 + depends on SPI + diff --git a/drivers/ieee802154/Makefile b/drivers/ieee802154/Makefile index 800a389..4f669bc 100644 --- a/drivers/ieee802154/Makefile +++ b/drivers/ieee802154/Makefile @@ -1 +1,12 @@ obj-$(CONFIG_IEEE802154_FAKEHARD) += fakehard.o +obj-$(CONFIG_IEEE802154_FAKELB) += fakelb.o +obj-$(CONFIG_IEEE802154_SERIAL) += serial.o +obj-$(CONFIG_IEEE802154_AT86RF230) += at86rf230.o +obj-$(CONFIG_IEEE802154_CC2420) += cc2420.o +obj-$(CONFIG_IEEE802154_ADF7242) += adf7242.o +obj-$(CONFIG_SPI_ATBEN) += spi_atben.o +obj-$(CONFIG_SPI_ATUSB) += spi_atusb.o + +ccflags-y := -DDEBUG -DCONFIG_FFD +ccflags-$(CONFIG_IEEE802154_DRIVER_DEBUG) += -DDEBUG +ccflags-y += -DCONFIG_FFD diff --git a/drivers/ieee802154/fakehard.c b/drivers/ieee802154/fakehard.c index 73d4531..996e1db 100644 --- a/drivers/ieee802154/fakehard.c +++ b/drivers/ieee802154/fakehard.c @@ -259,7 +259,7 @@ static struct ieee802154_mlme_ops fake_mlme = { .start_req = fake_start_req, .scan_req = fake_scan_req, - .get_phy = fake_get_phy, + .wpan_ops.get_phy = fake_get_phy, .get_pan_id = fake_get_pan_id, .get_short_addr = fake_get_short_addr, @@ -391,6 +391,16 @@ static int __devinit ieee802154fake_probe(struct platform_device *pdev) priv = netdev_priv(dev); priv->phy = phy; + /* + * If the name is a format string the caller wants us to do a + * name allocation. + */ + if (strchr(dev->name, '%')) { + err = dev_alloc_name(dev, dev->name); + if (err < 0) + goto out; + } + wpan_phy_set_dev(phy, &pdev->dev); SET_NETDEV_DEV(dev, &phy->dev); diff --git a/include/linux/if.h b/include/linux/if.h index cffa754..9f402a1 100644 --- a/include/linux/if.h +++ b/include/linux/if.h @@ -82,6 +82,8 @@ #define IFF_TEAM_PORT 0x40000 /* device used as team port */ #define IFF_NO_IP_ALIGN 0x80000 /* do not ip-align allocated rx pkts */ +#define IFF_IEEE802154_COORD 0x400 /* IEEE802.15.4 PAN coordinator */ + #define IF_GET_IFACE 0x0001 /* for querying only */ #define IF_GET_PROTO 0x0002 diff --git a/include/linux/if_arp.h b/include/linux/if_arp.h index 6d722f4..47a57d8 100644 --- a/include/linux/if_arp.h +++ b/include/linux/if_arp.h @@ -87,6 +87,8 @@ #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 +#define ARPHRD_SMAC 806 /* Freescale Simple MAC */ #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 33d9f51..a379fc7 100644 --- a/include/linux/nl802154.h +++ b/include/linux/nl802154.h @@ -68,14 +68,13 @@ enum { IEEE802154_ATTR_CHANNEL_PAGE_LIST, IEEE802154_ATTR_PHY_NAME, + IEEE802154_ATTR_DEV_TYPE, __IEEE802154_ATTR_MAX, }; #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 @@ -126,4 +125,11 @@ enum { #define IEEE802154_CMD_MAX (__IEEE802154_CMD_MAX - 1) +enum { + IEEE802154_DEV_WPAN, + IEEE802154_DEV_MONITOR, + IEEE802154_DEV_SMAC, + __IEEE802154_DEV_MAX, +}; + #endif diff --git a/include/net/ieee802154_netdev.h b/include/net/ieee802154_netdev.h index 5743055..e12ce9a 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 + /* * A control block of skb passed between the ARPHRD_IEEE802154 device * and other stack parts. @@ -81,7 +83,12 @@ struct wpan_phy; * get_phy should increment the reference counting on returned phy. * Use wpan_wpy_put to put that reference. */ +struct simple_mlme_ops { + struct wpan_phy *(*get_phy)(const struct net_device *dev); +}; struct ieee802154_mlme_ops { + struct simple_mlme_ops wpan_ops; + int (*assoc_req)(struct net_device *dev, struct ieee802154_addr *addr, u8 channel, u8 page, u8 cap); @@ -98,8 +105,6 @@ struct ieee802154_mlme_ops { int (*scan_req)(struct net_device *dev, u8 type, u32 channels, u8 page, u8 duration); - struct wpan_phy *(*get_phy)(const struct net_device *dev); - /* * FIXME: these should become the part of PIB/MIB interface. * However we still don't have IB interface of any kind @@ -110,12 +115,18 @@ struct ieee802154_mlme_ops { u8 (*get_bsn)(const struct net_device *dev); }; -static inline struct ieee802154_mlme_ops *ieee802154_mlme_ops( +static inline struct simple_mlme_ops *simple_mlme_ops( const struct net_device *dev) { return dev->ml_priv; } +static inline struct ieee802154_mlme_ops *ieee802154_mlme_ops( + const struct net_device *dev) +{ + return container_of(dev->ml_priv, struct ieee802154_mlme_ops, wpan_ops); +} + #endif diff --git a/include/net/wpan-phy.h b/include/net/wpan-phy.h index d86fffd..9e119c5 100644 --- a/include/net/wpan-phy.h +++ b/include/net/wpan-phy.h @@ -24,17 +24,19 @@ #include #include +#define WPAN_NUM_PAGES 32 + struct wpan_phy { struct mutex pib_lock; /* - * This is a PIB according to 802.15.4-2006. + * This is a PIB acording to 802.15.4-2006. * We do not provide timing-related variables, as they * aren't used outside of driver */ u8 current_channel; u8 current_page; - u32 channels_supported[32]; + u32 channels_supported[WPAN_NUM_PAGES]; u8 transmit_power; u8 cca_mode; @@ -42,7 +44,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/Kconfig b/net/Kconfig index b3904e8..578eb11 100644 --- a/net/Kconfig +++ b/net/Kconfig @@ -217,6 +217,8 @@ source "net/econet/Kconfig" source "net/wanrouter/Kconfig" source "net/phonet/Kconfig" source "net/ieee802154/Kconfig" +source "net/mac802154/Kconfig" +source "net/zigbee/Kconfig" source "net/sched/Kconfig" source "net/dcb/Kconfig" source "net/dns_resolver/Kconfig" diff --git a/net/Makefile b/net/Makefile index ad432fa..2a97cde 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/ieee802154/Kconfig b/net/ieee802154/Kconfig index 7dee650..3dea3c1 100644 --- a/net/ieee802154/Kconfig +++ b/net/ieee802154/Kconfig @@ -16,3 +16,11 @@ config IEEE802154_6LOWPAN depends on IEEE802154 && IPV6 ---help--- IPv6 compression over IEEE 802.15.4. + +config IEEE802154_PROTO_DEBUG + bool "IEEE 802.15.4 protocol stack debugging messages" + depends on IEEE802154 + default y + help + Say Y here to make the IEEE 802.15.4 protocol stack generate + extensive debugging messages. diff --git a/net/ieee802154/Makefile b/net/ieee802154/Makefile index d7716d6..e2b6735 100644 --- a/net/ieee802154/Makefile +++ b/net/ieee802154/Makefile @@ -3,3 +3,6 @@ obj-$(CONFIG_IEEE802154_6LOWPAN) += 6lowpan.o ieee802154-y := netlink.o nl-mac.o nl-phy.o nl_policy.o wpan-class.o af_802154-y := af_ieee802154.o raw.o dgram.o + +ccflags-$(CONFIG_IEEE802154_PROTO_DEBUG) += -DDEBUG +ccflags-y += -Wall diff --git a/net/ieee802154/dgram.c b/net/ieee802154/dgram.c index 1b09eaa..7883fa6 100644 --- a/net/ieee802154/dgram.c +++ b/net/ieee802154/dgram.c @@ -130,8 +130,7 @@ static int dgram_ioctl(struct sock *sk, int cmd, unsigned long arg) switch (cmd) { case SIOCOUTQ: { - int amount = sk_wmem_alloc_get(sk); - + int amount = atomic_read(&sk->sk_wmem_alloc); return put_user(amount, (int __user *)arg); } diff --git a/net/ieee802154/ieee802154.h b/net/ieee802154/ieee802154.h index aadec42..e78d6c6 100644 --- a/net/ieee802154/ieee802154.h +++ b/net/ieee802154/ieee802154.h @@ -21,6 +21,10 @@ int __init ieee802154_nl_init(void); void __exit ieee802154_nl_exit(void); +#include + +extern const struct nla_policy ieee802154_policy[]; + #define IEEE802154_OP(_cmd, _func) \ { \ .cmd = _cmd, \ diff --git a/net/ieee802154/nl-mac.c b/net/ieee802154/nl-mac.c index adaf462..1d23aa6 100644 --- a/net/ieee802154/nl-mac.c +++ b/net/ieee802154/nl-mac.c @@ -263,7 +263,7 @@ static int ieee802154_nl_fill_iface(struct sk_buff *msg, u32 pid, if (!hdr) goto out; - phy = ieee802154_mlme_ops(dev)->get_phy(dev); + phy = simple_mlme_ops(dev)->get_phy(dev); BUG_ON(!phy); NLA_PUT_STRING(msg, IEEE802154_ATTR_DEV_NAME, dev->name); diff --git a/net/ieee802154/nl-phy.c b/net/ieee802154/nl-phy.c index c64a38d..76ef7a3 100644 --- a/net/ieee802154/nl-phy.c +++ b/net/ieee802154/nl-phy.c @@ -57,7 +57,7 @@ static int ieee802154_nl_fill_phy(struct sk_buff *msg, u32 pid, NLA_PUT_U8(msg, IEEE802154_ATTR_PAGE, phy->current_page); NLA_PUT_U8(msg, IEEE802154_ATTR_CHANNEL, phy->current_channel); - for (i = 0; i < 32; i++) { + for (i = 0; i < WPAN_NUM_PAGES; i++) { if (phy->channels_supported[i]) buf[pages++] = phy->channels_supported[i] | (i << 27); } @@ -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 = IEEE802154_DEV_WPAN; pr_debug("%s\n", __func__); @@ -201,6 +202,19 @@ static int ieee802154_add_iface(struct sk_buff *skb, if (strlen(devname) >= IFNAMSIZ) return -ENAMETOOLONG; + if (info->attrs[IEEE802154_ATTR_HW_ADDR] && + nla_len(info->attrs[IEEE802154_ATTR_HW_ADDR]) != + IEEE802154_ADDR_LEN) { + return -EINVAL; + } + + if (info->attrs[IEEE802154_ATTR_DEV_TYPE]) { + type = nla_get_u8(info->attrs[IEEE802154_ATTR_DEV_TYPE]); + if (type > __IEEE802154_DEV_MAX) { + return -EINVAL; + } + } + phy = wpan_phy_find(name); if (!phy) return -ENODEV; @@ -221,7 +235,7 @@ static int ieee802154_add_iface(struct sk_buff *skb, goto nla_put_failure; } - dev = phy->add_iface(phy, devname); + dev = phy->add_iface(phy, devname, type); if (IS_ERR(dev)) { rc = PTR_ERR(dev); goto nla_put_failure; @@ -288,7 +302,7 @@ static int ieee802154_del_iface(struct sk_buff *skb, if (!dev) return -ENODEV; - phy = ieee802154_mlme_ops(dev)->get_phy(dev); + phy = simple_mlme_ops(dev)->get_phy(dev); BUG_ON(!phy); rc = -EINVAL; diff --git a/net/ieee802154/nl_policy.c b/net/ieee802154/nl_policy.c index 6adda4d..235cd65 100644 --- a/net/ieee802154/nl_policy.c +++ b/net/ieee802154/nl_policy.c @@ -28,6 +28,7 @@ const struct nla_policy ieee802154_policy[IEEE802154_ATTR_MAX + 1] = { [IEEE802154_ATTR_DEV_NAME] = { .type = NLA_STRING, }, [IEEE802154_ATTR_DEV_INDEX] = { .type = NLA_U32, }, [IEEE802154_ATTR_PHY_NAME] = { .type = NLA_STRING, }, + [IEEE802154_ATTR_DEV_TYPE] = { .type = NLA_U8, }, [IEEE802154_ATTR_STATUS] = { .type = NLA_U8, }, [IEEE802154_ATTR_SHORT_ADDR] = { .type = NLA_U16, }, diff --git a/net/ieee802154/wpan-class.c b/net/ieee802154/wpan-class.c index 1627ef2..380fe1a 100644 --- a/net/ieee802154/wpan-class.c +++ b/net/ieee802154/wpan-class.c @@ -56,7 +56,7 @@ static ssize_t channels_supported_show(struct device *dev, int i, len = 0; mutex_lock(&phy->pib_lock); - for (i = 0; i < 32; i++) { + for (i = 0; i < WPAN_NUM_PAGES; i++) { ret = snprintf(buf + len, PAGE_SIZE - len, "%#09x\n", phy->channels_supported[i]); if (ret < 0) -- 1.7.9.5