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

diff --git a/net/mac802154/llsec.c b/net/mac802154/llsec.c
index 930d150..6c801f9 100644
--- a/net/mac802154/llsec.c
+++ b/net/mac802154/llsec.c
@@ -496,3 +496,60 @@ int mac802154_llsec_devkey_del(struct mac802154_llsec *sec,
        kfree_rcu(devkey, rcu);
        return 0;
 }
+
+
+
+static struct mac802154_llsec_seclevel*
+llsec_find_seclevel(const struct mac802154_llsec *sec,
+                   const struct ieee802154_llsec_seclevel *sl)
+{
+       struct ieee802154_llsec_seclevel *pos;
+
+       list_for_each_entry(pos, &sec->table.security_levels, list) {
+               if (pos->frame_type != sl->frame_type ||
+                   (pos->frame_type == IEEE802154_FC_TYPE_MAC_CMD &&
+                    pos->cmd_frame_id != sl->cmd_frame_id) ||
+                   pos->device_override != sl->device_override ||
+                   pos->sec_levels != sl->sec_levels)
+                       continue;
+
+               return container_of(pos, struct mac802154_llsec_seclevel,
+                                   level);
+       }
+
+       return NULL;
+}
+
+int mac802154_llsec_seclevel_add(struct mac802154_llsec *sec,
+                                const struct ieee802154_llsec_seclevel *sl)
+{
+       struct mac802154_llsec_seclevel *entry;
+
+       if (llsec_find_seclevel(sec, sl))
+               return -EEXIST;
+
+       entry = kmalloc(sizeof(*entry), GFP_KERNEL);
+       if (!entry)
+               return -ENOMEM;
+
+       entry->level = *sl;
+
+       list_add_tail_rcu(&entry->level.list, &sec->table.security_levels);
+
+       return 0;
+}
+
+int mac802154_llsec_seclevel_del(struct mac802154_llsec *sec,
+                                const struct ieee802154_llsec_seclevel *sl)
+{
+       struct mac802154_llsec_seclevel *pos;
+
+       pos = llsec_find_seclevel(sec, sl);
+       if (!pos)
+               return -ENOENT;
+
+       list_del_rcu(&pos->level.list);
+       kfree_rcu(pos, rcu);
+
+       return 0;
+}
diff --git a/net/mac802154/llsec.h b/net/mac802154/llsec.h
index 23db644..2266bf4 100644
--- a/net/mac802154/llsec.h
+++ b/net/mac802154/llsec.h
@@ -101,4 +101,9 @@ int mac802154_llsec_devkey_del(struct mac802154_llsec *sec,
                               __le64 dev_addr,
                               const struct ieee802154_llsec_device_key *key);
 
+int mac802154_llsec_seclevel_add(struct mac802154_llsec *sec,
+                                const struct ieee802154_llsec_seclevel *sl);
+int mac802154_llsec_seclevel_del(struct mac802154_llsec *sec,
+                                const struct ieee802154_llsec_seclevel *sl);
+
 #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