1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) 2014 Fraunhofer ITWM 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Written by: 6*4882a593Smuzhiyun * Phoebe Buckheister <phoebe.buckheister@itwm.fraunhofer.de> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef MAC802154_LLSEC_H 10*4882a593Smuzhiyun #define MAC802154_LLSEC_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <linux/slab.h> 13*4882a593Smuzhiyun #include <linux/hashtable.h> 14*4882a593Smuzhiyun #include <linux/kref.h> 15*4882a593Smuzhiyun #include <linux/spinlock.h> 16*4882a593Smuzhiyun #include <net/af_ieee802154.h> 17*4882a593Smuzhiyun #include <net/ieee802154_netdev.h> 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun struct mac802154_llsec_key { 20*4882a593Smuzhiyun struct ieee802154_llsec_key key; 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /* one tfm for each authsize (4/8/16) */ 23*4882a593Smuzhiyun struct crypto_aead *tfm[3]; 24*4882a593Smuzhiyun struct crypto_sync_skcipher *tfm0; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun struct kref ref; 27*4882a593Smuzhiyun }; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun struct mac802154_llsec_device_key { 30*4882a593Smuzhiyun struct ieee802154_llsec_device_key devkey; 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun struct rcu_head rcu; 33*4882a593Smuzhiyun }; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun struct mac802154_llsec_device { 36*4882a593Smuzhiyun struct ieee802154_llsec_device dev; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun struct hlist_node bucket_s; 39*4882a593Smuzhiyun struct hlist_node bucket_hw; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun /* protects dev.frame_counter and the elements of dev.keys */ 42*4882a593Smuzhiyun spinlock_t lock; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun struct rcu_head rcu; 45*4882a593Smuzhiyun }; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun struct mac802154_llsec_seclevel { 48*4882a593Smuzhiyun struct ieee802154_llsec_seclevel level; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun struct rcu_head rcu; 51*4882a593Smuzhiyun }; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun struct mac802154_llsec { 54*4882a593Smuzhiyun struct ieee802154_llsec_params params; 55*4882a593Smuzhiyun struct ieee802154_llsec_table table; 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun DECLARE_HASHTABLE(devices_short, 6); 58*4882a593Smuzhiyun DECLARE_HASHTABLE(devices_hw, 6); 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun /* protects params, all other fields are fine with RCU */ 61*4882a593Smuzhiyun rwlock_t lock; 62*4882a593Smuzhiyun }; 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun void mac802154_llsec_init(struct mac802154_llsec *sec); 65*4882a593Smuzhiyun void mac802154_llsec_destroy(struct mac802154_llsec *sec); 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun int mac802154_llsec_get_params(struct mac802154_llsec *sec, 68*4882a593Smuzhiyun struct ieee802154_llsec_params *params); 69*4882a593Smuzhiyun int mac802154_llsec_set_params(struct mac802154_llsec *sec, 70*4882a593Smuzhiyun const struct ieee802154_llsec_params *params, 71*4882a593Smuzhiyun int changed); 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun int mac802154_llsec_key_add(struct mac802154_llsec *sec, 74*4882a593Smuzhiyun const struct ieee802154_llsec_key_id *id, 75*4882a593Smuzhiyun const struct ieee802154_llsec_key *key); 76*4882a593Smuzhiyun int mac802154_llsec_key_del(struct mac802154_llsec *sec, 77*4882a593Smuzhiyun const struct ieee802154_llsec_key_id *key); 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun int mac802154_llsec_dev_add(struct mac802154_llsec *sec, 80*4882a593Smuzhiyun const struct ieee802154_llsec_device *dev); 81*4882a593Smuzhiyun int mac802154_llsec_dev_del(struct mac802154_llsec *sec, 82*4882a593Smuzhiyun __le64 device_addr); 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun int mac802154_llsec_devkey_add(struct mac802154_llsec *sec, 85*4882a593Smuzhiyun __le64 dev_addr, 86*4882a593Smuzhiyun const struct ieee802154_llsec_device_key *key); 87*4882a593Smuzhiyun int mac802154_llsec_devkey_del(struct mac802154_llsec *sec, 88*4882a593Smuzhiyun __le64 dev_addr, 89*4882a593Smuzhiyun const struct ieee802154_llsec_device_key *key); 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun int mac802154_llsec_seclevel_add(struct mac802154_llsec *sec, 92*4882a593Smuzhiyun const struct ieee802154_llsec_seclevel *sl); 93*4882a593Smuzhiyun int mac802154_llsec_seclevel_del(struct mac802154_llsec *sec, 94*4882a593Smuzhiyun const struct ieee802154_llsec_seclevel *sl); 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun int mac802154_llsec_encrypt(struct mac802154_llsec *sec, struct sk_buff *skb); 97*4882a593Smuzhiyun int mac802154_llsec_decrypt(struct mac802154_llsec *sec, struct sk_buff *skb); 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun #endif /* MAC802154_LLSEC_H */ 100