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