Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Copyright (C) 2014 Fraunhofer ITWM
0004  *
0005  * Written by:
0006  * Phoebe Buckheister <phoebe.buckheister@itwm.fraunhofer.de>
0007  */
0008 
0009 #ifndef MAC802154_LLSEC_H
0010 #define MAC802154_LLSEC_H
0011 
0012 #include <linux/slab.h>
0013 #include <linux/hashtable.h>
0014 #include <linux/kref.h>
0015 #include <linux/spinlock.h>
0016 #include <net/af_ieee802154.h>
0017 #include <net/ieee802154_netdev.h>
0018 
0019 struct mac802154_llsec_key {
0020     struct ieee802154_llsec_key key;
0021 
0022     /* one tfm for each authsize (4/8/16) */
0023     struct crypto_aead *tfm[3];
0024     struct crypto_sync_skcipher *tfm0;
0025 
0026     struct kref ref;
0027 };
0028 
0029 struct mac802154_llsec_device_key {
0030     struct ieee802154_llsec_device_key devkey;
0031 
0032     struct rcu_head rcu;
0033 };
0034 
0035 struct mac802154_llsec_device {
0036     struct ieee802154_llsec_device dev;
0037 
0038     struct hlist_node bucket_s;
0039     struct hlist_node bucket_hw;
0040 
0041     /* protects dev.frame_counter and the elements of dev.keys */
0042     spinlock_t lock;
0043 
0044     struct rcu_head rcu;
0045 };
0046 
0047 struct mac802154_llsec_seclevel {
0048     struct ieee802154_llsec_seclevel level;
0049 
0050     struct rcu_head rcu;
0051 };
0052 
0053 struct mac802154_llsec {
0054     struct ieee802154_llsec_params params;
0055     struct ieee802154_llsec_table table;
0056 
0057     DECLARE_HASHTABLE(devices_short, 6);
0058     DECLARE_HASHTABLE(devices_hw, 6);
0059 
0060     /* protects params, all other fields are fine with RCU */
0061     rwlock_t lock;
0062 };
0063 
0064 void mac802154_llsec_init(struct mac802154_llsec *sec);
0065 void mac802154_llsec_destroy(struct mac802154_llsec *sec);
0066 
0067 int mac802154_llsec_get_params(struct mac802154_llsec *sec,
0068                    struct ieee802154_llsec_params *params);
0069 int mac802154_llsec_set_params(struct mac802154_llsec *sec,
0070                    const struct ieee802154_llsec_params *params,
0071                    int changed);
0072 
0073 int mac802154_llsec_key_add(struct mac802154_llsec *sec,
0074                 const struct ieee802154_llsec_key_id *id,
0075                 const struct ieee802154_llsec_key *key);
0076 int mac802154_llsec_key_del(struct mac802154_llsec *sec,
0077                 const struct ieee802154_llsec_key_id *key);
0078 
0079 int mac802154_llsec_dev_add(struct mac802154_llsec *sec,
0080                 const struct ieee802154_llsec_device *dev);
0081 int mac802154_llsec_dev_del(struct mac802154_llsec *sec,
0082                 __le64 device_addr);
0083 
0084 int mac802154_llsec_devkey_add(struct mac802154_llsec *sec,
0085                    __le64 dev_addr,
0086                    const struct ieee802154_llsec_device_key *key);
0087 int mac802154_llsec_devkey_del(struct mac802154_llsec *sec,
0088                    __le64 dev_addr,
0089                    const struct ieee802154_llsec_device_key *key);
0090 
0091 int mac802154_llsec_seclevel_add(struct mac802154_llsec *sec,
0092                  const struct ieee802154_llsec_seclevel *sl);
0093 int mac802154_llsec_seclevel_del(struct mac802154_llsec *sec,
0094                  const struct ieee802154_llsec_seclevel *sl);
0095 
0096 int mac802154_llsec_encrypt(struct mac802154_llsec *sec, struct sk_buff *skb);
0097 int mac802154_llsec_decrypt(struct mac802154_llsec *sec, struct sk_buff *skb);
0098 
0099 #endif /* MAC802154_LLSEC_H */