Blame view

include/net/cfg802154.h 10.5 KB
1802d0bee   Thomas Gleixner   treewide: Replace...
1
  /* SPDX-License-Identifier: GPL-2.0-only */
2bfb1070b   Dmitry Eremin-Solenikov   ieee802154: add a...
2
3
4
  /*
   * Copyright (C) 2007, 2008, 2009 Siemens AG
   *
2bfb1070b   Dmitry Eremin-Solenikov   ieee802154: add a...
5
6
7
   * Written by:
   * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
   */
5ad60d369   Alexander Aring   ieee802154: move ...
8
9
  #ifndef __NET_CFG802154_H
  #define __NET_CFG802154_H
2bfb1070b   Dmitry Eremin-Solenikov   ieee802154: add a...
10

cb41c8dd0   Alexander Aring   ieee802154: renam...
11
  #include <linux/ieee802154.h>
2bfb1070b   Dmitry Eremin-Solenikov   ieee802154: add a...
12
13
  #include <linux/netdevice.h>
  #include <linux/mutex.h>
187f1882b   Paul Gortmaker   BUG: headers with...
14
  #include <linux/bug.h>
2bfb1070b   Dmitry Eremin-Solenikov   ieee802154: add a...
15

f3ea5e442   Alexander Aring   ieee802154: add n...
16
  #include <net/nl802154.h>
a5dd1d72d   Alexander Aring   cfg802154: introd...
17
  struct wpan_phy;
ba2a9506a   Alexander Aring   nl802154: introdu...
18
  struct wpan_phy_cca;
a5dd1d72d   Alexander Aring   cfg802154: introd...
19

a26c5fd76   Alexander Aring   nl802154: add sup...
20
21
22
23
24
25
26
27
28
  #ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL
  struct ieee802154_llsec_device_key;
  struct ieee802154_llsec_seclevel;
  struct ieee802154_llsec_params;
  struct ieee802154_llsec_device;
  struct ieee802154_llsec_table;
  struct ieee802154_llsec_key_id;
  struct ieee802154_llsec_key;
  #endif /* CONFIG_IEEE802154_NL802154_EXPERIMENTAL */
a5dd1d72d   Alexander Aring   cfg802154: introd...
29
  struct cfg802154_ops {
4a9a816a4   Alexander Aring   cfg802154: conver...
30
31
  	struct net_device * (*add_virtual_intf_deprecated)(struct wpan_phy *wpan_phy,
  							   const char *name,
5b4a10390   Varka Bhadram   cfg802154: pass n...
32
  							   unsigned char name_assign_type,
4a9a816a4   Alexander Aring   cfg802154: conver...
33
  							   int type);
9d30a8cf9   Alexander Aring   ieee802154: clean...
34
35
  	void	(*del_virtual_intf_deprecated)(struct wpan_phy *wpan_phy,
  					       struct net_device *dev);
a6cb869b3   Varka Bhadram   cfg802154: add PM...
36
37
  	int	(*suspend)(struct wpan_phy *wpan_phy);
  	int	(*resume)(struct wpan_phy *wpan_phy);
f3ea5e442   Alexander Aring   ieee802154: add n...
38
39
  	int	(*add_virtual_intf)(struct wpan_phy *wpan_phy,
  				    const char *name,
5b4a10390   Varka Bhadram   cfg802154: pass n...
40
  				    unsigned char name_assign_type,
0e57547eb   Alexander Aring   ieee802154: setti...
41
42
  				    enum nl802154_iftype type,
  				    __le64 extended_addr);
b821ecd4c   Alexander Aring   ieee802154: add d...
43
44
  	int	(*del_virtual_intf)(struct wpan_phy *wpan_phy,
  				    struct wpan_dev *wpan_dev);
ab0bd5617   Alexander Aring   ieee820154: add c...
45
  	int	(*set_channel)(struct wpan_phy *wpan_phy, u8 page, u8 channel);
ba2a9506a   Alexander Aring   nl802154: introdu...
46
47
  	int	(*set_cca_mode)(struct wpan_phy *wpan_phy,
  				const struct wpan_phy_cca *cca);
b69644c1c   Alexander Aring   nl802154: add sup...
48
  	int     (*set_cca_ed_level)(struct wpan_phy *wpan_phy, s32 ed_level);
0f999b09f   Varka Bhadram   ieee802154: add s...
49
  	int     (*set_tx_power)(struct wpan_phy *wpan_phy, s32 power);
702bf3712   Alexander Aring   ieee820154: add p...
50
  	int	(*set_pan_id)(struct wpan_phy *wpan_phy,
ee7b9053b   Alexander Aring   ieee802154: fix b...
51
  			      struct wpan_dev *wpan_dev, __le16 pan_id);
9830c62a0   Alexander Aring   ieee820154: add s...
52
  	int	(*set_short_addr)(struct wpan_phy *wpan_phy,
ee7b9053b   Alexander Aring   ieee802154: fix b...
53
  				  struct wpan_dev *wpan_dev, __le16 short_addr);
656a999e8   Alexander Aring   ieee820154: add b...
54
55
56
  	int	(*set_backoff_exponent)(struct wpan_phy *wpan_phy,
  					struct wpan_dev *wpan_dev, u8 min_be,
  					u8 max_be);
a01ba7652   Alexander Aring   ieee820154: add m...
57
58
59
  	int	(*set_max_csma_backoffs)(struct wpan_phy *wpan_phy,
  					 struct wpan_dev *wpan_dev,
  					 u8 max_csma_backoffs);
17a3a46bf   Alexander Aring   ieee820154: add m...
60
61
62
  	int	(*set_max_frame_retries)(struct wpan_phy *wpan_phy,
  					 struct wpan_dev *wpan_dev,
  					 s8 max_frame_retries);
c8937a1d1   Alexander Aring   ieee820154: add l...
63
64
  	int	(*set_lbt_mode)(struct wpan_phy *wpan_phy,
  				struct wpan_dev *wpan_dev, bool mode);
c91208d81   Alexander Aring   ieee802154: add a...
65
66
  	int	(*set_ackreq_default)(struct wpan_phy *wpan_phy,
  				      struct wpan_dev *wpan_dev, bool ackreq);
a26c5fd76   Alexander Aring   nl802154: add sup...
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
  #ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL
  	void	(*get_llsec_table)(struct wpan_phy *wpan_phy,
  				   struct wpan_dev *wpan_dev,
  				   struct ieee802154_llsec_table **table);
  	void	(*lock_llsec_table)(struct wpan_phy *wpan_phy,
  				    struct wpan_dev *wpan_dev);
  	void	(*unlock_llsec_table)(struct wpan_phy *wpan_phy,
  				      struct wpan_dev *wpan_dev);
  	/* TODO remove locking/get table callbacks, this is part of the
  	 * nl802154 interface and should be accessible from ieee802154 layer.
  	 */
  	int	(*get_llsec_params)(struct wpan_phy *wpan_phy,
  				    struct wpan_dev *wpan_dev,
  				    struct ieee802154_llsec_params *params);
  	int	(*set_llsec_params)(struct wpan_phy *wpan_phy,
  				    struct wpan_dev *wpan_dev,
  				    const struct ieee802154_llsec_params *params,
  				    int changed);
  	int	(*add_llsec_key)(struct wpan_phy *wpan_phy,
  				 struct wpan_dev *wpan_dev,
  				 const struct ieee802154_llsec_key_id *id,
  				 const struct ieee802154_llsec_key *key);
  	int	(*del_llsec_key)(struct wpan_phy *wpan_phy,
  				 struct wpan_dev *wpan_dev,
  				 const struct ieee802154_llsec_key_id *id);
  	int	(*add_seclevel)(struct wpan_phy *wpan_phy,
  				 struct wpan_dev *wpan_dev,
  				 const struct ieee802154_llsec_seclevel *sl);
  	int	(*del_seclevel)(struct wpan_phy *wpan_phy,
  				 struct wpan_dev *wpan_dev,
  				 const struct ieee802154_llsec_seclevel *sl);
  	int	(*add_device)(struct wpan_phy *wpan_phy,
  			      struct wpan_dev *wpan_dev,
  			      const struct ieee802154_llsec_device *dev);
  	int	(*del_device)(struct wpan_phy *wpan_phy,
  			      struct wpan_dev *wpan_dev, __le64 extended_addr);
  	int	(*add_devkey)(struct wpan_phy *wpan_phy,
  			      struct wpan_dev *wpan_dev,
  			      __le64 extended_addr,
  			      const struct ieee802154_llsec_device_key *key);
  	int	(*del_devkey)(struct wpan_phy *wpan_phy,
  			      struct wpan_dev *wpan_dev,
  			      __le64 extended_addr,
  			      const struct ieee802154_llsec_device_key *key);
  #endif /* CONFIG_IEEE802154_NL802154_EXPERIMENTAL */
a5dd1d72d   Alexander Aring   cfg802154: introd...
112
  };
fea3318d2   Alexander Aring   ieee802154: add s...
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
  static inline bool
  wpan_phy_supported_bool(bool b, enum nl802154_supported_bool_states st)
  {
  	switch (st) {
  	case NL802154_SUPPORTED_BOOL_TRUE:
  		return b;
  	case NL802154_SUPPORTED_BOOL_FALSE:
  		return !b;
  	case NL802154_SUPPORTED_BOOL_BOTH:
  		return true;
  	default:
  		WARN_ON(1);
  	}
  
  	return false;
  }
72f655e44   Alexander Aring   ieee802154: intro...
129
  struct wpan_phy_supported {
fea3318d2   Alexander Aring   ieee802154: add s...
130
  	u32 channels[IEEE802154_MAX_PAGE + 1],
65318680c   Alexander Aring   ieee802154: add i...
131
  	    cca_modes, cca_opts, iftypes;
fea3318d2   Alexander Aring   ieee802154: add s...
132
133
134
135
136
137
  	enum nl802154_supported_bool_states lbt;
  	u8 min_minbe, max_minbe, min_maxbe, max_maxbe,
  	   min_csma_backoffs, max_csma_backoffs;
  	s8 min_frame_retries, max_frame_retries;
  	size_t tx_powers_size, cca_ed_levels_size;
  	const s32 *tx_powers, *cca_ed_levels;
72f655e44   Alexander Aring   ieee802154: intro...
138
  };
7fe9a3882   Alexander Aring   ieee802154: rewor...
139
140
141
142
  struct wpan_phy_cca {
  	enum nl802154_cca_modes mode;
  	enum nl802154_cca_opts opt;
  };
791021bf1   Alexander Aring   mac802154: check ...
143
144
145
146
147
148
149
150
151
152
153
  static inline bool
  wpan_phy_cca_cmp(const struct wpan_phy_cca *a, const struct wpan_phy_cca *b)
  {
  	if (a->mode != b->mode)
  		return false;
  
  	if (a->mode == NL802154_CCA_ENERGY_CARRIER)
  		return a->opt == b->opt;
  
  	return true;
  }
edea8f7c7   Alexander Aring   cfg802154: introd...
154
155
156
157
158
159
160
161
162
163
164
165
166
  /**
   * @WPAN_PHY_FLAG_TRANSMIT_POWER: Indicates that transceiver will support
   *	transmit power setting.
   * @WPAN_PHY_FLAG_CCA_ED_LEVEL: Indicates that transceiver will support cca ed
   *	level setting.
   * @WPAN_PHY_FLAG_CCA_MODE: Indicates that transceiver will support cca mode
   *	setting.
   */
  enum wpan_phy_flags {
  	WPAN_PHY_FLAG_TXPOWER		= BIT(1),
  	WPAN_PHY_FLAG_CCA_ED_LEVEL	= BIT(2),
  	WPAN_PHY_FLAG_CCA_MODE		= BIT(3),
  };
2bfb1070b   Dmitry Eremin-Solenikov   ieee802154: add a...
167
  struct wpan_phy {
6322d50d8   Alexander Aring   mac802154: add wp...
168
169
170
171
172
173
174
  	/* If multiple wpan_phys are registered and you're handed e.g.
  	 * a regular netdev with assigned ieee802154_ptr, you won't
  	 * know whether it points to a wpan_phy your driver has registered
  	 * or not. Assign this to something global to your driver to
  	 * help determine whether you own this wpan_phy or not.
  	 */
  	const void *privid;
edea8f7c7   Alexander Aring   cfg802154: introd...
175
  	u32 flags;
2bfb1070b   Dmitry Eremin-Solenikov   ieee802154: add a...
176
  	/*
9b2777d60   Phoebe Buckheister   ieee802154: add T...
177
  	 * This is a PIB according to 802.15.4-2011.
2bfb1070b   Dmitry Eremin-Solenikov   ieee802154: add a...
178
179
180
181
182
  	 * We do not provide timing-related variables, as they
  	 * aren't used outside of driver
  	 */
  	u8 current_channel;
  	u8 current_page;
72f655e44   Alexander Aring   ieee802154: intro...
183
  	struct wpan_phy_supported supported;
e2eb173aa   Alexander Aring   ieee802154: chang...
184
  	/* current transmit_power in mBm */
1a19cb680   Alexander Aring   ieee802154: chang...
185
  	s32 transmit_power;
7fe9a3882   Alexander Aring   ieee802154: rewor...
186
  	struct wpan_phy_cca cca;
dee56d147   Alexander Aring   mac802154: add su...
187
188
  
  	__le64 perm_extended_addr;
2bfb1070b   Dmitry Eremin-Solenikov   ieee802154: add a...
189

32b23550a   Alexander Aring   ieee802154: chang...
190
  	/* current cca ed threshold in mBm */
6ca001978   Phoebe Buckheister   ieee802154: add s...
191
  	s32 cca_ed_level;
84dda3c64   Phoebe Buckheister   ieee802154: add s...
192

61f2dcba9   Alexander Aring   mac802154: add in...
193
194
195
196
197
198
199
  	/* PHY depended MAC PIB values */
  
  	/* 802.15.4 acronym: Tdsym in usec */
  	u8 symbol_duration;
  	/* lifs and sifs periods timing */
  	u16 lifs_period;
  	u16 sifs_period;
2bfb1070b   Dmitry Eremin-Solenikov   ieee802154: add a...
200
  	struct device dev;
2bfb1070b   Dmitry Eremin-Solenikov   ieee802154: add a...
201

66e5c2672   Alexander Aring   ieee802154: add n...
202
203
  	/* the network namespace this phy lives in currently */
  	possible_net_t _net;
53cb2cfaa   Gustavo A. R. Silva   cfg802154: Replac...
204
  	char priv[] __aligned(NETDEV_ALIGN);
2bfb1070b   Dmitry Eremin-Solenikov   ieee802154: add a...
205
  };
66e5c2672   Alexander Aring   ieee802154: add n...
206
207
208
209
210
211
212
213
214
  static inline struct net *wpan_phy_net(struct wpan_phy *wpan_phy)
  {
  	return read_pnet(&wpan_phy->_net);
  }
  
  static inline void wpan_phy_net_set(struct wpan_phy *wpan_phy, struct net *net)
  {
  	write_pnet(&wpan_phy->_net, net);
  }
838b83d63   Alexander Aring   ieee802154: intro...
215
216
217
218
219
220
221
222
  struct ieee802154_addr {
  	u8 mode;
  	__le16 pan_id;
  	union {
  		__le16 short_addr;
  		__le64 extended_addr;
  	};
  };
a26c5fd76   Alexander Aring   nl802154: add sup...
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
  struct ieee802154_llsec_key_id {
  	u8 mode;
  	u8 id;
  	union {
  		struct ieee802154_addr device_addr;
  		__le32 short_source;
  		__le64 extended_source;
  	};
  };
  
  #define IEEE802154_LLSEC_KEY_SIZE 16
  
  struct ieee802154_llsec_key {
  	u8 frame_types;
  	u32 cmd_frame_ids;
  	/* TODO replace with NL802154_KEY_SIZE */
  	u8 key[IEEE802154_LLSEC_KEY_SIZE];
  };
  
  struct ieee802154_llsec_key_entry {
  	struct list_head list;
  
  	struct ieee802154_llsec_key_id id;
  	struct ieee802154_llsec_key *key;
  };
  
  struct ieee802154_llsec_params {
  	bool enabled;
  
  	__be32 frame_counter;
  	u8 out_level;
  	struct ieee802154_llsec_key_id out_key;
  
  	__le64 default_key_source;
  
  	__le16 pan_id;
  	__le64 hwaddr;
  	__le64 coord_hwaddr;
  	__le16 coord_shortaddr;
  };
  
  struct ieee802154_llsec_table {
  	struct list_head keys;
  	struct list_head devices;
  	struct list_head security_levels;
  };
  
  struct ieee802154_llsec_seclevel {
  	struct list_head list;
  
  	u8 frame_type;
  	u8 cmd_frame_id;
  	bool device_override;
  	u32 sec_levels;
  };
  
  struct ieee802154_llsec_device {
  	struct list_head list;
  
  	__le16 pan_id;
  	__le16 short_addr;
  	__le64 hwaddr;
  	u32 frame_counter;
  	bool seclevel_exempt;
  
  	u8 key_mode;
  	struct list_head keys;
  };
  
  struct ieee802154_llsec_device_key {
  	struct list_head list;
  
  	struct ieee802154_llsec_key_id key_id;
  	u32 frame_counter;
  };
838b83d63   Alexander Aring   ieee802154: intro...
298
299
300
301
302
303
304
305
306
307
  struct wpan_dev_header_ops {
  	/* TODO create callback currently assumes ieee802154_mac_cb inside
  	 * skb->cb. This should be changed to give these information as
  	 * parameter.
  	 */
  	int	(*create)(struct sk_buff *skb, struct net_device *dev,
  			  const struct ieee802154_addr *daddr,
  			  const struct ieee802154_addr *saddr,
  			  unsigned int len);
  };
d5ae67bac   Alexander Aring   ieee802154: rewor...
308
309
  struct wpan_dev {
  	struct wpan_phy *wpan_phy;
190ac1ca3   Alexander Aring   ieee802154: add i...
310
  	int iftype;
863e88f25   Alexander Aring   mac802154: move m...
311

fcf39e6e8   Alexander Aring   ieee802154: add w...
312
313
314
  	/* the remainder of this struct should be private to cfg802154 */
  	struct list_head list;
  	struct net_device *netdev;
838b83d63   Alexander Aring   ieee802154: intro...
315
  	const struct wpan_dev_header_ops *header_ops;
51e0e5d81   Alexander Aring   ieee802154: 6lowp...
316
317
  	/* lowpan interface, set when the wpan_dev belongs to one lowpan_dev */
  	struct net_device *lowpan_dev;
fcf39e6e8   Alexander Aring   ieee802154: add w...
318
  	u32 identifier;
863e88f25   Alexander Aring   mac802154: move m...
319
320
321
322
323
324
  	/* MAC PIB */
  	__le16 pan_id;
  	__le16 short_addr;
  	__le64 extended_addr;
  
  	/* MAC BSN field */
344f8c119   Alexander Aring   mac802154: use at...
325
  	atomic_t bsn;
863e88f25   Alexander Aring   mac802154: move m...
326
  	/* MAC DSN field */
344f8c119   Alexander Aring   mac802154: use at...
327
  	atomic_t dsn;
863e88f25   Alexander Aring   mac802154: move m...
328
329
330
331
332
333
334
335
336
  
  	u8 min_be;
  	u8 max_be;
  	u8 csma_retries;
  	s8 frame_retries;
  
  	bool lbt;
  
  	bool promiscuous_mode;
c91208d81   Alexander Aring   ieee802154: add a...
337
338
339
  
  	/* fallback for acknowledgment bit setting */
  	bool ackreq;
d5ae67bac   Alexander Aring   ieee802154: rewor...
340
  };
42723448b   Dmitry Eremin-Solenikov   ieee802154: add a...
341
  #define to_phy(_dev)	container_of(_dev, struct wpan_phy, dev)
838b83d63   Alexander Aring   ieee802154: intro...
342
343
344
345
346
347
348
349
350
351
  static inline int
  wpan_dev_hard_header(struct sk_buff *skb, struct net_device *dev,
  		     const struct ieee802154_addr *daddr,
  		     const struct ieee802154_addr *saddr,
  		     unsigned int len)
  {
  	struct wpan_dev *wpan_dev = dev->ieee802154_ptr;
  
  	return wpan_dev->header_ops->create(skb, dev, daddr, saddr, len);
  }
a5dd1d72d   Alexander Aring   cfg802154: introd...
352
  struct wpan_phy *
f601379fa   Alexander Aring   ieee802154: renam...
353
  wpan_phy_new(const struct cfg802154_ops *ops, size_t priv_size);
e9cf356c0   Dmitry Eremin-Solenikov   wpan-phy: follow ...
354
355
356
357
  static inline void wpan_phy_set_dev(struct wpan_phy *phy, struct device *dev)
  {
  	phy->dev.parent = dev;
  }
e72740d05   Alexander Aring   ieee802154: wpan-...
358

e9cf356c0   Dmitry Eremin-Solenikov   wpan-phy: follow ...
359
  int wpan_phy_register(struct wpan_phy *phy);
2bfb1070b   Dmitry Eremin-Solenikov   ieee802154: add a...
360
361
  void wpan_phy_unregister(struct wpan_phy *phy);
  void wpan_phy_free(struct wpan_phy *phy);
1c889f4db   Dmitry Eremin-Solenikov   wpan-phy: add wpa...
362
363
  /* Same semantics as for class_for_each_device */
  int wpan_phy_for_each(int (*fn)(struct wpan_phy *phy, void *data), void *data);
2bfb1070b   Dmitry Eremin-Solenikov   ieee802154: add a...
364
365
366
367
368
369
370
371
  
  static inline void *wpan_phy_priv(struct wpan_phy *phy)
  {
  	BUG_ON(!phy);
  	return &phy->priv;
  }
  
  struct wpan_phy *wpan_phy_find(const char *str);
69d9ab96f   Dmitry Eremin-Solenikov   wpan-phy: add a h...
372
373
374
375
376
  
  static inline void wpan_phy_put(struct wpan_phy *phy)
  {
  	put_device(&phy->dev);
  }
2bfb1070b   Dmitry Eremin-Solenikov   ieee802154: add a...
377
378
379
380
  static inline const char *wpan_phy_name(struct wpan_phy *phy)
  {
  	return dev_name(&phy->dev);
  }
5ad60d369   Alexander Aring   ieee802154: move ...
381
382
  
  #endif /* __NET_CFG802154_H */