15d637d5aSPhoebe Buckheister /* 25d637d5aSPhoebe Buckheister * Copyright (C) 2014 Fraunhofer ITWM 35d637d5aSPhoebe Buckheister * 45d637d5aSPhoebe Buckheister * This program is free software; you can redistribute it and/or modify 55d637d5aSPhoebe Buckheister * it under the terms of the GNU General Public License version 2 65d637d5aSPhoebe Buckheister * as published by the Free Software Foundation. 75d637d5aSPhoebe Buckheister * 85d637d5aSPhoebe Buckheister * This program is distributed in the hope that it will be useful, 95d637d5aSPhoebe Buckheister * but WITHOUT ANY WARRANTY; without even the implied warranty of 105d637d5aSPhoebe Buckheister * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 115d637d5aSPhoebe Buckheister * GNU General Public License for more details. 125d637d5aSPhoebe Buckheister * 135d637d5aSPhoebe Buckheister * Written by: 145d637d5aSPhoebe Buckheister * Phoebe Buckheister <phoebe.buckheister@itwm.fraunhofer.de> 155d637d5aSPhoebe Buckheister */ 165d637d5aSPhoebe Buckheister 175d637d5aSPhoebe Buckheister #ifndef MAC802154_LLSEC_H 185d637d5aSPhoebe Buckheister #define MAC802154_LLSEC_H 195d637d5aSPhoebe Buckheister 205d637d5aSPhoebe Buckheister #include <linux/slab.h> 215d637d5aSPhoebe Buckheister #include <linux/hashtable.h> 225d637d5aSPhoebe Buckheister #include <linux/kref.h> 235d637d5aSPhoebe Buckheister #include <linux/spinlock.h> 245d637d5aSPhoebe Buckheister #include <net/af_ieee802154.h> 255d637d5aSPhoebe Buckheister #include <net/ieee802154_netdev.h> 265d637d5aSPhoebe Buckheister 275d637d5aSPhoebe Buckheister struct mac802154_llsec_key { 285d637d5aSPhoebe Buckheister struct ieee802154_llsec_key key; 295d637d5aSPhoebe Buckheister 305d637d5aSPhoebe Buckheister /* one tfm for each authsize (4/8/16) */ 315d637d5aSPhoebe Buckheister struct crypto_aead *tfm[3]; 32*3103f4a7SKees Cook struct crypto_sync_skcipher *tfm0; 335d637d5aSPhoebe Buckheister 345d637d5aSPhoebe Buckheister struct kref ref; 355d637d5aSPhoebe Buckheister }; 365d637d5aSPhoebe Buckheister 375d637d5aSPhoebe Buckheister struct mac802154_llsec_device_key { 385d637d5aSPhoebe Buckheister struct ieee802154_llsec_device_key devkey; 395d637d5aSPhoebe Buckheister 405d637d5aSPhoebe Buckheister struct rcu_head rcu; 415d637d5aSPhoebe Buckheister }; 425d637d5aSPhoebe Buckheister 435d637d5aSPhoebe Buckheister struct mac802154_llsec_device { 445d637d5aSPhoebe Buckheister struct ieee802154_llsec_device dev; 455d637d5aSPhoebe Buckheister 465d637d5aSPhoebe Buckheister struct hlist_node bucket_s; 475d637d5aSPhoebe Buckheister struct hlist_node bucket_hw; 485d637d5aSPhoebe Buckheister 495d637d5aSPhoebe Buckheister /* protects dev.frame_counter and the elements of dev.keys */ 505d637d5aSPhoebe Buckheister spinlock_t lock; 515d637d5aSPhoebe Buckheister 525d637d5aSPhoebe Buckheister struct rcu_head rcu; 535d637d5aSPhoebe Buckheister }; 545d637d5aSPhoebe Buckheister 555d637d5aSPhoebe Buckheister struct mac802154_llsec_seclevel { 565d637d5aSPhoebe Buckheister struct ieee802154_llsec_seclevel level; 575d637d5aSPhoebe Buckheister 585d637d5aSPhoebe Buckheister struct rcu_head rcu; 595d637d5aSPhoebe Buckheister }; 605d637d5aSPhoebe Buckheister 615d637d5aSPhoebe Buckheister struct mac802154_llsec { 625d637d5aSPhoebe Buckheister struct ieee802154_llsec_params params; 635d637d5aSPhoebe Buckheister struct ieee802154_llsec_table table; 645d637d5aSPhoebe Buckheister 655d637d5aSPhoebe Buckheister DECLARE_HASHTABLE(devices_short, 6); 665d637d5aSPhoebe Buckheister DECLARE_HASHTABLE(devices_hw, 6); 675d637d5aSPhoebe Buckheister 685d637d5aSPhoebe Buckheister /* protects params, all other fields are fine with RCU */ 695d637d5aSPhoebe Buckheister rwlock_t lock; 705d637d5aSPhoebe Buckheister }; 715d637d5aSPhoebe Buckheister 725d637d5aSPhoebe Buckheister void mac802154_llsec_init(struct mac802154_llsec *sec); 735d637d5aSPhoebe Buckheister void mac802154_llsec_destroy(struct mac802154_llsec *sec); 745d637d5aSPhoebe Buckheister 755d637d5aSPhoebe Buckheister int mac802154_llsec_get_params(struct mac802154_llsec *sec, 765d637d5aSPhoebe Buckheister struct ieee802154_llsec_params *params); 775d637d5aSPhoebe Buckheister int mac802154_llsec_set_params(struct mac802154_llsec *sec, 785d637d5aSPhoebe Buckheister const struct ieee802154_llsec_params *params, 795d637d5aSPhoebe Buckheister int changed); 805d637d5aSPhoebe Buckheister 815d637d5aSPhoebe Buckheister int mac802154_llsec_key_add(struct mac802154_llsec *sec, 825d637d5aSPhoebe Buckheister const struct ieee802154_llsec_key_id *id, 835d637d5aSPhoebe Buckheister const struct ieee802154_llsec_key *key); 845d637d5aSPhoebe Buckheister int mac802154_llsec_key_del(struct mac802154_llsec *sec, 855d637d5aSPhoebe Buckheister const struct ieee802154_llsec_key_id *key); 865d637d5aSPhoebe Buckheister 875d637d5aSPhoebe Buckheister int mac802154_llsec_dev_add(struct mac802154_llsec *sec, 885d637d5aSPhoebe Buckheister const struct ieee802154_llsec_device *dev); 895d637d5aSPhoebe Buckheister int mac802154_llsec_dev_del(struct mac802154_llsec *sec, 905d637d5aSPhoebe Buckheister __le64 device_addr); 915d637d5aSPhoebe Buckheister 925d637d5aSPhoebe Buckheister int mac802154_llsec_devkey_add(struct mac802154_llsec *sec, 935d637d5aSPhoebe Buckheister __le64 dev_addr, 945d637d5aSPhoebe Buckheister const struct ieee802154_llsec_device_key *key); 955d637d5aSPhoebe Buckheister int mac802154_llsec_devkey_del(struct mac802154_llsec *sec, 965d637d5aSPhoebe Buckheister __le64 dev_addr, 975d637d5aSPhoebe Buckheister const struct ieee802154_llsec_device_key *key); 985d637d5aSPhoebe Buckheister 995d637d5aSPhoebe Buckheister int mac802154_llsec_seclevel_add(struct mac802154_llsec *sec, 1005d637d5aSPhoebe Buckheister const struct ieee802154_llsec_seclevel *sl); 1015d637d5aSPhoebe Buckheister int mac802154_llsec_seclevel_del(struct mac802154_llsec *sec, 1025d637d5aSPhoebe Buckheister const struct ieee802154_llsec_seclevel *sl); 1035d637d5aSPhoebe Buckheister 10403556e4dSPhoebe Buckheister int mac802154_llsec_encrypt(struct mac802154_llsec *sec, struct sk_buff *skb); 1054c14a2fbSPhoebe Buckheister int mac802154_llsec_decrypt(struct mac802154_llsec *sec, struct sk_buff *skb); 10603556e4dSPhoebe Buckheister 1075d637d5aSPhoebe Buckheister #endif /* MAC802154_LLSEC_H */ 108