]>
Commit | Line | Data |
---|---|---|
1802d0be | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
5d637d5a PB |
2 | /* |
3 | * Copyright (C) 2014 Fraunhofer ITWM | |
4 | * | |
5d637d5a PB |
5 | * Written by: |
6 | * Phoebe Buckheister <[email protected]> | |
7 | */ | |
8 | ||
9 | #ifndef MAC802154_LLSEC_H | |
10 | #define MAC802154_LLSEC_H | |
11 | ||
12 | #include <linux/slab.h> | |
13 | #include <linux/hashtable.h> | |
5d637d5a PB |
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]; | |
3103f4a7 | 24 | struct crypto_sync_skcipher *tfm0; |
5d637d5a PB |
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 | ||
03556e4d | 96 | int mac802154_llsec_encrypt(struct mac802154_llsec *sec, struct sk_buff *skb); |
4c14a2fb | 97 | int mac802154_llsec_decrypt(struct mac802154_llsec *sec, struct sk_buff *skb); |
03556e4d | 98 | |
5d637d5a | 99 | #endif /* MAC802154_LLSEC_H */ |