mlme reset functionality has been added for netlink socket interface
attributes mentioned are as per the IEEE 802.15.4 - 2006 specification

Tested on SAM9G20-EK board

Signed-off-by: Prajosh Premdas <premdas.praj...@gmail.com>
---
 include/linux/nl802154.h        |    2 +
 include/net/ieee802154_netdev.h |    2 +
 include/net/nl802154.h          |    9 ++++++
 net/ieee802154/nl-mac.c         |   57 +++++++++++++++++++++++++++++++++++++-
 net/ieee802154/nl_policy.c      |    2 +
 5 files changed, 70 insertions(+), 2 deletions(-)

diff --git a/include/linux/nl802154.h b/include/linux/nl802154.h
index fbd0fdf..69fe03a 100644
--- a/include/linux/nl802154.h
+++ b/include/linux/nl802154.h
@@ -70,6 +70,8 @@ enum {
        IEEE802154_ATTR_PHY_NAME,
        IEEE802154_ATTR_DEV_TYPE,
 
+       IEEE802154_ATTR_SET_DEFAULT_PIB,
+
        __IEEE802154_ATTR_MAX,
 };
 
diff --git a/include/net/ieee802154_netdev.h b/include/net/ieee802154_netdev.h
index b27730e..25cb045 100644
--- a/include/net/ieee802154_netdev.h
+++ b/include/net/ieee802154_netdev.h
@@ -92,6 +92,8 @@ struct wpan_phy;
  * So 2 sets of mlme operations are needed
  */
 struct ieee802154_mlme_ops {
+       int (*reset_req)(struct net_device *dev,
+                        u8 SetDefaultPIB);
        int (*assoc_req)(struct net_device *dev,
                        struct ieee802154_addr *addr,
                        u8 channel, u8 page, u8 cap);
diff --git a/include/net/nl802154.h b/include/net/nl802154.h
index 99d2ba1..23c2302 100644
--- a/include/net/nl802154.h
+++ b/include/net/nl802154.h
@@ -123,4 +123,13 @@ int ieee802154_nl_beacon_indic(struct net_device *dev, u16 
panid,
  */
 int ieee802154_nl_start_confirm(struct net_device *dev, u8 status);
 
+/**
+ * ieee802154_reset_confirm - Notify userland of completion of reset.
+ * @dev: The device which was instructed to scan.
+ * @status: The status of the scan operation.
+ *
+ * Note: This is in section 7.1.9.2 of the IEEE 802.15.4 document.
+ */
+int ieee802154_reset_confirm(struct net_device *dev, u8 status);
+
 #endif
diff --git a/net/ieee802154/nl-mac.c b/net/ieee802154/nl-mac.c
index adaf462..2ace28b 100644
--- a/net/ieee802154/nl-mac.c
+++ b/net/ieee802154/nl-mac.c
@@ -1,8 +1,6 @@
 /*
  * Netlink inteface for IEEE 802.15.4 stack
  *
- * Copyright 2007, 2008 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.
@@ -20,6 +18,8 @@
  * Sergey Lapin <sla...@ossfans.org>
  * Dmitry Eremin-Solenikov <dbarysh...@gmail.com>
  * Maxim Osipov <maxim.osi...@siemens.com>
+ * Felix Varghese <felix.vargh...@atmel.com>
+ * Prajosh Premdas <prajosh.prem...@atmel.com>
  */
 
 #include <linux/gfp.h>
@@ -519,6 +519,58 @@ static int ieee802154_scan_req(struct sk_buff *skb, struct 
genl_info *info)
        return ret;
 }
 
+static int ieee802154_reset_req(struct sk_buff *skb, struct genl_info *info)
+{
+       struct net_device *dev;
+       u8 SetDefaultPIB;
+       int ret = -EINVAL;
+
+       if (!info->attrs[IEEE802154_ATTR_SET_DEFAULT_PIB])
+               return -EINVAL;
+
+       dev = ieee802154_nl_get_dev(info);
+       if (!dev)
+               return -ENODEV;
+
+       if (nla_get_u8(info->attrs[IEEE802154_ATTR_SET_DEFAULT_PIB]))
+               SetDefaultPIB = 1;
+       else
+               SetDefaultPIB = 0;
+
+       ret = ieee802154_mlme_ops(dev)->reset_req(dev, SetDefaultPIB);
+
+       if (ret == 0)
+               ieee802154_reset_confirm(dev, IEEE802154_SUCCESS);
+       else
+               ieee802154_reset_confirm(dev, IEEE802154_INVALID_PARAMETER);
+
+       dev_put(dev);
+       return ret;
+}
+
+int ieee802154_reset_confirm(struct net_device *dev, u8 status)
+{
+       struct sk_buff *msg;
+
+       msg = ieee802154_nl_create(0, IEEE802154_RESET_CONF);
+       if (!msg)
+               return -ENOBUFS;
+
+       NLA_PUT_STRING(msg, IEEE802154_ATTR_DEV_NAME, dev->name);
+       NLA_PUT_U32(msg, IEEE802154_ATTR_DEV_INDEX, dev->ifindex);
+       NLA_PUT(msg, IEEE802154_ATTR_HW_ADDR, IEEE802154_ADDR_LEN,
+                       dev->dev_addr);
+
+       NLA_PUT_U8(msg, IEEE802154_ATTR_STATUS, status);
+
+       return ieee802154_nl_mcast(msg, ieee802154_coord_mcgrp.id);
+
+nla_put_failure:
+       nlmsg_free(msg);
+       return -ENOBUFS;
+}
+EXPORT_SYMBOL(ieee802154_reset_confirm);
+
 static int ieee802154_list_iface(struct sk_buff *skb,
        struct genl_info *info)
 {
@@ -581,6 +633,7 @@ cont:
 }
 
 static struct genl_ops ieee802154_coordinator_ops[] = {
+       IEEE802154_OP(IEEE802154_RESET_REQ, ieee802154_reset_req),
        IEEE802154_OP(IEEE802154_ASSOCIATE_REQ, ieee802154_associate_req),
        IEEE802154_OP(IEEE802154_ASSOCIATE_RESP, ieee802154_associate_resp),
        IEEE802154_OP(IEEE802154_DISASSOCIATE_REQ, ieee802154_disassociate_req),
diff --git a/net/ieee802154/nl_policy.c b/net/ieee802154/nl_policy.c
index 6adda4d..9da1d72 100644
--- a/net/ieee802154/nl_policy.c
+++ b/net/ieee802154/nl_policy.c
@@ -52,5 +52,7 @@ const struct nla_policy ieee802154_policy[IEEE802154_ATTR_MAX 
+ 1] = {
        [IEEE802154_ATTR_DURATION] = { .type = NLA_U8, },
        [IEEE802154_ATTR_ED_LIST] = { .len = 27 },
        [IEEE802154_ATTR_CHANNEL_PAGE_LIST] = { .len = 32 * 4, },
+
+       [IEEE802154_ATTR_SET_DEFAULT_PIB] = { .type = NLA_U8, },
 };
 
-- 
1.7.4.1


------------------------------------------------------------------------------
Virtualization & Cloud Management Using Capacity Planning
Cloud computing makes use of virtualization - but cloud computing 
also focuses on allowing computing to be delivered as a service.
http://www.accelacomm.com/jaw/sfnl/114/51521223/
_______________________________________________
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel

Reply via email to