Signed-off-by: Phoebe Buckheister <phoebe.buckheis...@itwm.fraunhofer.de>
---
 net/mac802154/llsec.c |   64 +++++++++++++++++++++++++++++++++++++++++++++++++
 net/mac802154/llsec.h |    7 ++++++
 2 files changed, 71 insertions(+)

diff --git a/net/mac802154/llsec.c b/net/mac802154/llsec.c
index 77966c1..930d150 100644
--- a/net/mac802154/llsec.c
+++ b/net/mac802154/llsec.c
@@ -432,3 +432,67 @@ int mac802154_llsec_dev_del(struct mac802154_llsec *sec, 
__le64 device_addr)
 
        return 0;
 }
+
+
+
+static struct mac802154_llsec_device_key*
+llsec_devkey_find(struct mac802154_llsec_device *dev,
+                 const struct ieee802154_llsec_key_id *key)
+{
+       struct ieee802154_llsec_device_key *devkey;
+
+       list_for_each_entry_rcu(devkey, &dev->dev.keys, list) {
+               if (!llsec_key_id_equal(key, &devkey->key_id))
+                       continue;
+               
+               return container_of(devkey, struct mac802154_llsec_device_key,
+                                   devkey);
+       }
+
+       return NULL;
+}
+
+int mac802154_llsec_devkey_add(struct mac802154_llsec *sec,
+                              __le64 dev_addr,
+                              const struct ieee802154_llsec_device_key *key)
+{
+       struct mac802154_llsec_device *dev;
+       struct mac802154_llsec_device_key *devkey;
+
+       dev = llsec_dev_find_long(sec, dev_addr);
+
+       if (!dev)
+               return -ENOENT;
+
+       if (llsec_devkey_find(dev, &key->key_id))
+               return -EEXIST;
+
+       devkey = kmalloc(sizeof(*devkey), GFP_KERNEL);
+       if (!devkey)
+               return -ENOMEM;
+
+       devkey->devkey = *key;
+       list_add_tail_rcu(&devkey->devkey.list, &dev->dev.keys);
+       return 0;
+}
+
+int mac802154_llsec_devkey_del(struct mac802154_llsec *sec,
+                              __le64 dev_addr,
+                              const struct ieee802154_llsec_device_key *key)
+{
+       struct mac802154_llsec_device *dev;
+       struct mac802154_llsec_device_key *devkey;
+
+       dev = llsec_dev_find_long(sec, dev_addr);
+
+       if (!dev)
+               return -ENOENT;
+
+       devkey = llsec_devkey_find(dev, &key->key_id);
+       if (!devkey)
+               return -ENOENT;
+
+       list_del_rcu(&devkey->devkey.list);
+       kfree_rcu(devkey, rcu);
+       return 0;
+}
diff --git a/net/mac802154/llsec.h b/net/mac802154/llsec.h
index 087a164..23db644 100644
--- a/net/mac802154/llsec.h
+++ b/net/mac802154/llsec.h
@@ -94,4 +94,11 @@ int mac802154_llsec_dev_add(struct mac802154_llsec *sec,
 int mac802154_llsec_dev_del(struct mac802154_llsec *sec,
                            __le64 device_addr);
 
+int mac802154_llsec_devkey_add(struct mac802154_llsec *sec,
+                              __le64 dev_addr,
+                              const struct ieee802154_llsec_device_key *key);
+int mac802154_llsec_devkey_del(struct mac802154_llsec *sec,
+                              __le64 dev_addr,
+                              const struct ieee802154_llsec_device_key *key);
+
 #endif /* MAC802154_LLSEC_H */
-- 
1.7.9.5


------------------------------------------------------------------------------
Is your legacy SCM system holding you back? Join Perforce May 7 to find out:
&#149; 3 signs your SCM is hindering your productivity
&#149; Requirements for releasing software faster
&#149; Expert tips and advice for migrating your SCM now
http://p.sf.net/sfu/perforce
_______________________________________________
Linux-zigbee-devel mailing list
Linux-zigbee-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel

Reply via email to