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