1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#ifndef __IEEE802154_I_H
20#define __IEEE802154_I_H
21
22#include <linux/interrupt.h>
23#include <linux/mutex.h>
24#include <linux/hrtimer.h>
25#include <net/cfg802154.h>
26#include <net/mac802154.h>
27#include <net/nl802154.h>
28#include <net/ieee802154_netdev.h>
29
30#include "llsec.h"
31
32
33struct ieee802154_local {
34 struct ieee802154_hw hw;
35 const struct ieee802154_ops *ops;
36
37
38 struct wpan_phy *phy;
39
40 int open_count;
41
42
43
44
45
46
47
48
49 struct list_head interfaces;
50 struct mutex iflist_mtx;
51
52
53
54
55 struct workqueue_struct *workqueue;
56
57 struct hrtimer ifs_timer;
58
59 bool started;
60 bool suspended;
61
62 struct tasklet_struct tasklet;
63 struct sk_buff_head skb_queue;
64
65 struct sk_buff *tx_skb;
66 struct work_struct tx_work;
67};
68
69enum {
70 IEEE802154_RX_MSG = 1,
71};
72
73enum ieee802154_sdata_state_bits {
74 SDATA_STATE_RUNNING,
75};
76
77
78
79
80
81
82
83struct ieee802154_sub_if_data {
84 struct list_head list;
85
86 struct wpan_dev wpan_dev;
87
88 struct ieee802154_local *local;
89 struct net_device *dev;
90
91 unsigned long state;
92 char name[IFNAMSIZ];
93
94
95
96
97 struct mutex sec_mtx;
98
99 struct mac802154_llsec sec;
100};
101
102
103extern const void *const mac802154_wpan_phy_privid;
104
105static inline struct ieee802154_local *
106hw_to_local(struct ieee802154_hw *hw)
107{
108 return container_of(hw, struct ieee802154_local, hw);
109}
110
111static inline struct ieee802154_sub_if_data *
112IEEE802154_DEV_TO_SUB_IF(const struct net_device *dev)
113{
114 return netdev_priv(dev);
115}
116
117static inline struct ieee802154_sub_if_data *
118IEEE802154_WPAN_DEV_TO_SUB_IF(struct wpan_dev *wpan_dev)
119{
120 return container_of(wpan_dev, struct ieee802154_sub_if_data, wpan_dev);
121}
122
123static inline bool
124ieee802154_sdata_running(struct ieee802154_sub_if_data *sdata)
125{
126 return test_bit(SDATA_STATE_RUNNING, &sdata->state);
127}
128
129extern struct ieee802154_mlme_ops mac802154_mlme_wpan;
130
131void ieee802154_rx(struct ieee802154_local *local, struct sk_buff *skb);
132void ieee802154_xmit_worker(struct work_struct *work);
133netdev_tx_t
134ieee802154_monitor_start_xmit(struct sk_buff *skb, struct net_device *dev);
135netdev_tx_t
136ieee802154_subif_start_xmit(struct sk_buff *skb, struct net_device *dev);
137enum hrtimer_restart ieee802154_xmit_ifs_timer(struct hrtimer *timer);
138
139
140void mac802154_dev_set_page_channel(struct net_device *dev, u8 page, u8 chan);
141
142int mac802154_get_params(struct net_device *dev,
143 struct ieee802154_llsec_params *params);
144int mac802154_set_params(struct net_device *dev,
145 const struct ieee802154_llsec_params *params,
146 int changed);
147
148int mac802154_add_key(struct net_device *dev,
149 const struct ieee802154_llsec_key_id *id,
150 const struct ieee802154_llsec_key *key);
151int mac802154_del_key(struct net_device *dev,
152 const struct ieee802154_llsec_key_id *id);
153
154int mac802154_add_dev(struct net_device *dev,
155 const struct ieee802154_llsec_device *llsec_dev);
156int mac802154_del_dev(struct net_device *dev, __le64 dev_addr);
157
158int mac802154_add_devkey(struct net_device *dev,
159 __le64 device_addr,
160 const struct ieee802154_llsec_device_key *key);
161int mac802154_del_devkey(struct net_device *dev,
162 __le64 device_addr,
163 const struct ieee802154_llsec_device_key *key);
164
165int mac802154_add_seclevel(struct net_device *dev,
166 const struct ieee802154_llsec_seclevel *sl);
167int mac802154_del_seclevel(struct net_device *dev,
168 const struct ieee802154_llsec_seclevel *sl);
169
170void mac802154_lock_table(struct net_device *dev);
171void mac802154_get_table(struct net_device *dev,
172 struct ieee802154_llsec_table **t);
173void mac802154_unlock_table(struct net_device *dev);
174
175int mac802154_wpan_update_llsec(struct net_device *dev);
176
177
178int ieee802154_iface_init(void);
179void ieee802154_iface_exit(void);
180void ieee802154_if_remove(struct ieee802154_sub_if_data *sdata);
181struct net_device *
182ieee802154_if_add(struct ieee802154_local *local, const char *name,
183 unsigned char name_assign_type, enum nl802154_iftype type,
184 __le64 extended_addr);
185void ieee802154_remove_interfaces(struct ieee802154_local *local);
186void ieee802154_stop_device(struct ieee802154_local *local);
187
188#endif
189