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