1*5d637d5aSPhoebe Buckheister /* 2*5d637d5aSPhoebe Buckheister * Copyright (C) 2014 Fraunhofer ITWM 3*5d637d5aSPhoebe Buckheister * 4*5d637d5aSPhoebe Buckheister * This program is free software; you can redistribute it and/or modify 5*5d637d5aSPhoebe Buckheister * it under the terms of the GNU General Public License version 2 6*5d637d5aSPhoebe Buckheister * as published by the Free Software Foundation. 7*5d637d5aSPhoebe Buckheister * 8*5d637d5aSPhoebe Buckheister * This program is distributed in the hope that it will be useful, 9*5d637d5aSPhoebe Buckheister * but WITHOUT ANY WARRANTY; without even the implied warranty of 10*5d637d5aSPhoebe Buckheister * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11*5d637d5aSPhoebe Buckheister * GNU General Public License for more details. 12*5d637d5aSPhoebe Buckheister * 13*5d637d5aSPhoebe Buckheister * Written by: 14*5d637d5aSPhoebe Buckheister * Phoebe Buckheister <phoebe.buckheister@itwm.fraunhofer.de> 15*5d637d5aSPhoebe Buckheister */ 16*5d637d5aSPhoebe Buckheister 17*5d637d5aSPhoebe Buckheister #ifndef MAC802154_LLSEC_H 18*5d637d5aSPhoebe Buckheister #define MAC802154_LLSEC_H 19*5d637d5aSPhoebe Buckheister 20*5d637d5aSPhoebe Buckheister #include <linux/slab.h> 21*5d637d5aSPhoebe Buckheister #include <linux/hashtable.h> 22*5d637d5aSPhoebe Buckheister #include <linux/crypto.h> 23*5d637d5aSPhoebe Buckheister #include <linux/kref.h> 24*5d637d5aSPhoebe Buckheister #include <linux/spinlock.h> 25*5d637d5aSPhoebe Buckheister #include <net/af_ieee802154.h> 26*5d637d5aSPhoebe Buckheister #include <net/ieee802154_netdev.h> 27*5d637d5aSPhoebe Buckheister 28*5d637d5aSPhoebe Buckheister struct mac802154_llsec_key { 29*5d637d5aSPhoebe Buckheister struct ieee802154_llsec_key key; 30*5d637d5aSPhoebe Buckheister 31*5d637d5aSPhoebe Buckheister /* one tfm for each authsize (4/8/16) */ 32*5d637d5aSPhoebe Buckheister struct crypto_aead *tfm[3]; 33*5d637d5aSPhoebe Buckheister struct crypto_blkcipher *tfm0; 34*5d637d5aSPhoebe Buckheister 35*5d637d5aSPhoebe Buckheister struct kref ref; 36*5d637d5aSPhoebe Buckheister }; 37*5d637d5aSPhoebe Buckheister 38*5d637d5aSPhoebe Buckheister struct mac802154_llsec_device_key { 39*5d637d5aSPhoebe Buckheister struct ieee802154_llsec_device_key devkey; 40*5d637d5aSPhoebe Buckheister 41*5d637d5aSPhoebe Buckheister struct rcu_head rcu; 42*5d637d5aSPhoebe Buckheister }; 43*5d637d5aSPhoebe Buckheister 44*5d637d5aSPhoebe Buckheister struct mac802154_llsec_device { 45*5d637d5aSPhoebe Buckheister struct ieee802154_llsec_device dev; 46*5d637d5aSPhoebe Buckheister 47*5d637d5aSPhoebe Buckheister struct hlist_node bucket_s; 48*5d637d5aSPhoebe Buckheister struct hlist_node bucket_hw; 49*5d637d5aSPhoebe Buckheister 50*5d637d5aSPhoebe Buckheister /* protects dev.frame_counter and the elements of dev.keys */ 51*5d637d5aSPhoebe Buckheister spinlock_t lock; 52*5d637d5aSPhoebe Buckheister 53*5d637d5aSPhoebe Buckheister struct rcu_head rcu; 54*5d637d5aSPhoebe Buckheister }; 55*5d637d5aSPhoebe Buckheister 56*5d637d5aSPhoebe Buckheister struct mac802154_llsec_seclevel { 57*5d637d5aSPhoebe Buckheister struct ieee802154_llsec_seclevel level; 58*5d637d5aSPhoebe Buckheister 59*5d637d5aSPhoebe Buckheister struct rcu_head rcu; 60*5d637d5aSPhoebe Buckheister }; 61*5d637d5aSPhoebe Buckheister 62*5d637d5aSPhoebe Buckheister struct mac802154_llsec { 63*5d637d5aSPhoebe Buckheister struct ieee802154_llsec_params params; 64*5d637d5aSPhoebe Buckheister struct ieee802154_llsec_table table; 65*5d637d5aSPhoebe Buckheister 66*5d637d5aSPhoebe Buckheister DECLARE_HASHTABLE(devices_short, 6); 67*5d637d5aSPhoebe Buckheister DECLARE_HASHTABLE(devices_hw, 6); 68*5d637d5aSPhoebe Buckheister 69*5d637d5aSPhoebe Buckheister /* protects params, all other fields are fine with RCU */ 70*5d637d5aSPhoebe Buckheister rwlock_t lock; 71*5d637d5aSPhoebe Buckheister }; 72*5d637d5aSPhoebe Buckheister 73*5d637d5aSPhoebe Buckheister void mac802154_llsec_init(struct mac802154_llsec *sec); 74*5d637d5aSPhoebe Buckheister void mac802154_llsec_destroy(struct mac802154_llsec *sec); 75*5d637d5aSPhoebe Buckheister 76*5d637d5aSPhoebe Buckheister int mac802154_llsec_get_params(struct mac802154_llsec *sec, 77*5d637d5aSPhoebe Buckheister struct ieee802154_llsec_params *params); 78*5d637d5aSPhoebe Buckheister int mac802154_llsec_set_params(struct mac802154_llsec *sec, 79*5d637d5aSPhoebe Buckheister const struct ieee802154_llsec_params *params, 80*5d637d5aSPhoebe Buckheister int changed); 81*5d637d5aSPhoebe Buckheister 82*5d637d5aSPhoebe Buckheister int mac802154_llsec_key_add(struct mac802154_llsec *sec, 83*5d637d5aSPhoebe Buckheister const struct ieee802154_llsec_key_id *id, 84*5d637d5aSPhoebe Buckheister const struct ieee802154_llsec_key *key); 85*5d637d5aSPhoebe Buckheister int mac802154_llsec_key_del(struct mac802154_llsec *sec, 86*5d637d5aSPhoebe Buckheister const struct ieee802154_llsec_key_id *key); 87*5d637d5aSPhoebe Buckheister 88*5d637d5aSPhoebe Buckheister int mac802154_llsec_dev_add(struct mac802154_llsec *sec, 89*5d637d5aSPhoebe Buckheister const struct ieee802154_llsec_device *dev); 90*5d637d5aSPhoebe Buckheister int mac802154_llsec_dev_del(struct mac802154_llsec *sec, 91*5d637d5aSPhoebe Buckheister __le64 device_addr); 92*5d637d5aSPhoebe Buckheister 93*5d637d5aSPhoebe Buckheister int mac802154_llsec_devkey_add(struct mac802154_llsec *sec, 94*5d637d5aSPhoebe Buckheister __le64 dev_addr, 95*5d637d5aSPhoebe Buckheister const struct ieee802154_llsec_device_key *key); 96*5d637d5aSPhoebe Buckheister int mac802154_llsec_devkey_del(struct mac802154_llsec *sec, 97*5d637d5aSPhoebe Buckheister __le64 dev_addr, 98*5d637d5aSPhoebe Buckheister const struct ieee802154_llsec_device_key *key); 99*5d637d5aSPhoebe Buckheister 100*5d637d5aSPhoebe Buckheister int mac802154_llsec_seclevel_add(struct mac802154_llsec *sec, 101*5d637d5aSPhoebe Buckheister const struct ieee802154_llsec_seclevel *sl); 102*5d637d5aSPhoebe Buckheister int mac802154_llsec_seclevel_del(struct mac802154_llsec *sec, 103*5d637d5aSPhoebe Buckheister const struct ieee802154_llsec_seclevel *sl); 104*5d637d5aSPhoebe Buckheister 105*5d637d5aSPhoebe Buckheister #endif /* MAC802154_LLSEC_H */ 106