1  /* SPDX-License-Identifier: GPL-2.0-only */
2  /*
3   * Copyright (C) 2007, 2008, 2009 Siemens AG
4   *
5   * Written by:
6   * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
7   */
8  
9  #ifndef __NET_CFG802154_H
10  #define __NET_CFG802154_H
11  
12  #include <linux/ieee802154.h>
13  #include <linux/netdevice.h>
14  #include <linux/spinlock.h>
15  #include <linux/bug.h>
16  
17  #include <net/nl802154.h>
18  
19  struct wpan_phy;
20  struct wpan_phy_cca;
21  struct cfg802154_scan_request;
22  struct cfg802154_beacon_request;
23  struct ieee802154_addr;
24  
25  #ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL
26  struct ieee802154_llsec_device_key;
27  struct ieee802154_llsec_seclevel;
28  struct ieee802154_llsec_params;
29  struct ieee802154_llsec_device;
30  struct ieee802154_llsec_table;
31  struct ieee802154_llsec_key_id;
32  struct ieee802154_llsec_key;
33  #endif /* CONFIG_IEEE802154_NL802154_EXPERIMENTAL */
34  
35  struct cfg802154_ops {
36  	struct net_device * (*add_virtual_intf_deprecated)(struct wpan_phy *wpan_phy,
37  							   const char *name,
38  							   unsigned char name_assign_type,
39  							   int type);
40  	void	(*del_virtual_intf_deprecated)(struct wpan_phy *wpan_phy,
41  					       struct net_device *dev);
42  	int	(*suspend)(struct wpan_phy *wpan_phy);
43  	int	(*resume)(struct wpan_phy *wpan_phy);
44  	int	(*add_virtual_intf)(struct wpan_phy *wpan_phy,
45  				    const char *name,
46  				    unsigned char name_assign_type,
47  				    enum nl802154_iftype type,
48  				    __le64 extended_addr);
49  	int	(*del_virtual_intf)(struct wpan_phy *wpan_phy,
50  				    struct wpan_dev *wpan_dev);
51  	int	(*set_channel)(struct wpan_phy *wpan_phy, u8 page, u8 channel);
52  	int	(*set_cca_mode)(struct wpan_phy *wpan_phy,
53  				const struct wpan_phy_cca *cca);
54  	int     (*set_cca_ed_level)(struct wpan_phy *wpan_phy, s32 ed_level);
55  	int     (*set_tx_power)(struct wpan_phy *wpan_phy, s32 power);
56  	int	(*set_pan_id)(struct wpan_phy *wpan_phy,
57  			      struct wpan_dev *wpan_dev, __le16 pan_id);
58  	int	(*set_short_addr)(struct wpan_phy *wpan_phy,
59  				  struct wpan_dev *wpan_dev, __le16 short_addr);
60  	int	(*set_backoff_exponent)(struct wpan_phy *wpan_phy,
61  					struct wpan_dev *wpan_dev, u8 min_be,
62  					u8 max_be);
63  	int	(*set_max_csma_backoffs)(struct wpan_phy *wpan_phy,
64  					 struct wpan_dev *wpan_dev,
65  					 u8 max_csma_backoffs);
66  	int	(*set_max_frame_retries)(struct wpan_phy *wpan_phy,
67  					 struct wpan_dev *wpan_dev,
68  					 s8 max_frame_retries);
69  	int	(*set_lbt_mode)(struct wpan_phy *wpan_phy,
70  				struct wpan_dev *wpan_dev, bool mode);
71  	int	(*set_ackreq_default)(struct wpan_phy *wpan_phy,
72  				      struct wpan_dev *wpan_dev, bool ackreq);
73  	int	(*trigger_scan)(struct wpan_phy *wpan_phy,
74  				struct cfg802154_scan_request *request);
75  	int	(*abort_scan)(struct wpan_phy *wpan_phy,
76  			      struct wpan_dev *wpan_dev);
77  	int	(*send_beacons)(struct wpan_phy *wpan_phy,
78  				struct cfg802154_beacon_request *request);
79  	int	(*stop_beacons)(struct wpan_phy *wpan_phy,
80  				struct wpan_dev *wpan_dev);
81  	int	(*associate)(struct wpan_phy *wpan_phy,
82  			     struct wpan_dev *wpan_dev,
83  			     struct ieee802154_addr *coord);
84  	int	(*disassociate)(struct wpan_phy *wpan_phy,
85  				struct wpan_dev *wpan_dev,
86  				struct ieee802154_addr *target);
87  #ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL
88  	void	(*get_llsec_table)(struct wpan_phy *wpan_phy,
89  				   struct wpan_dev *wpan_dev,
90  				   struct ieee802154_llsec_table **table);
91  	void	(*lock_llsec_table)(struct wpan_phy *wpan_phy,
92  				    struct wpan_dev *wpan_dev);
93  	void	(*unlock_llsec_table)(struct wpan_phy *wpan_phy,
94  				      struct wpan_dev *wpan_dev);
95  	/* TODO remove locking/get table callbacks, this is part of the
96  	 * nl802154 interface and should be accessible from ieee802154 layer.
97  	 */
98  	int	(*get_llsec_params)(struct wpan_phy *wpan_phy,
99  				    struct wpan_dev *wpan_dev,
100  				    struct ieee802154_llsec_params *params);
101  	int	(*set_llsec_params)(struct wpan_phy *wpan_phy,
102  				    struct wpan_dev *wpan_dev,
103  				    const struct ieee802154_llsec_params *params,
104  				    int changed);
105  	int	(*add_llsec_key)(struct wpan_phy *wpan_phy,
106  				 struct wpan_dev *wpan_dev,
107  				 const struct ieee802154_llsec_key_id *id,
108  				 const struct ieee802154_llsec_key *key);
109  	int	(*del_llsec_key)(struct wpan_phy *wpan_phy,
110  				 struct wpan_dev *wpan_dev,
111  				 const struct ieee802154_llsec_key_id *id);
112  	int	(*add_seclevel)(struct wpan_phy *wpan_phy,
113  				 struct wpan_dev *wpan_dev,
114  				 const struct ieee802154_llsec_seclevel *sl);
115  	int	(*del_seclevel)(struct wpan_phy *wpan_phy,
116  				 struct wpan_dev *wpan_dev,
117  				 const struct ieee802154_llsec_seclevel *sl);
118  	int	(*add_device)(struct wpan_phy *wpan_phy,
119  			      struct wpan_dev *wpan_dev,
120  			      const struct ieee802154_llsec_device *dev);
121  	int	(*del_device)(struct wpan_phy *wpan_phy,
122  			      struct wpan_dev *wpan_dev, __le64 extended_addr);
123  	int	(*add_devkey)(struct wpan_phy *wpan_phy,
124  			      struct wpan_dev *wpan_dev,
125  			      __le64 extended_addr,
126  			      const struct ieee802154_llsec_device_key *key);
127  	int	(*del_devkey)(struct wpan_phy *wpan_phy,
128  			      struct wpan_dev *wpan_dev,
129  			      __le64 extended_addr,
130  			      const struct ieee802154_llsec_device_key *key);
131  #endif /* CONFIG_IEEE802154_NL802154_EXPERIMENTAL */
132  };
133  
134  static inline bool
wpan_phy_supported_bool(bool b,enum nl802154_supported_bool_states st)135  wpan_phy_supported_bool(bool b, enum nl802154_supported_bool_states st)
136  {
137  	switch (st) {
138  	case NL802154_SUPPORTED_BOOL_TRUE:
139  		return b;
140  	case NL802154_SUPPORTED_BOOL_FALSE:
141  		return !b;
142  	case NL802154_SUPPORTED_BOOL_BOTH:
143  		return true;
144  	default:
145  		WARN_ON(1);
146  	}
147  
148  	return false;
149  }
150  
151  struct wpan_phy_supported {
152  	u32 channels[IEEE802154_MAX_PAGE + 1],
153  	    cca_modes, cca_opts, iftypes;
154  	enum nl802154_supported_bool_states lbt;
155  	u8 min_minbe, max_minbe, min_maxbe, max_maxbe,
156  	   min_csma_backoffs, max_csma_backoffs;
157  	s8 min_frame_retries, max_frame_retries;
158  	size_t tx_powers_size, cca_ed_levels_size;
159  	const s32 *tx_powers, *cca_ed_levels;
160  };
161  
162  struct wpan_phy_cca {
163  	enum nl802154_cca_modes mode;
164  	enum nl802154_cca_opts opt;
165  };
166  
167  static inline bool
wpan_phy_cca_cmp(const struct wpan_phy_cca * a,const struct wpan_phy_cca * b)168  wpan_phy_cca_cmp(const struct wpan_phy_cca *a, const struct wpan_phy_cca *b)
169  {
170  	if (a->mode != b->mode)
171  		return false;
172  
173  	if (a->mode == NL802154_CCA_ENERGY_CARRIER)
174  		return a->opt == b->opt;
175  
176  	return true;
177  }
178  
179  /**
180   * enum wpan_phy_flags - WPAN PHY state flags
181   * @WPAN_PHY_FLAG_TXPOWER: Indicates that transceiver will support
182   *	transmit power setting.
183   * @WPAN_PHY_FLAG_CCA_ED_LEVEL: Indicates that transceiver will support cca ed
184   *	level setting.
185   * @WPAN_PHY_FLAG_CCA_MODE: Indicates that transceiver will support cca mode
186   *	setting.
187   * @WPAN_PHY_FLAG_STATE_QUEUE_STOPPED: Indicates that the transmit queue was
188   *	temporarily stopped.
189   * @WPAN_PHY_FLAG_DATAGRAMS_ONLY: Indicates that transceiver is only able to
190   *	send/receive datagrams.
191   */
192  enum wpan_phy_flags {
193  	WPAN_PHY_FLAG_TXPOWER		= BIT(1),
194  	WPAN_PHY_FLAG_CCA_ED_LEVEL	= BIT(2),
195  	WPAN_PHY_FLAG_CCA_MODE		= BIT(3),
196  	WPAN_PHY_FLAG_STATE_QUEUE_STOPPED = BIT(4),
197  	WPAN_PHY_FLAG_DATAGRAMS_ONLY	= BIT(5),
198  };
199  
200  struct wpan_phy {
201  	/* If multiple wpan_phys are registered and you're handed e.g.
202  	 * a regular netdev with assigned ieee802154_ptr, you won't
203  	 * know whether it points to a wpan_phy your driver has registered
204  	 * or not. Assign this to something global to your driver to
205  	 * help determine whether you own this wpan_phy or not.
206  	 */
207  	const void *privid;
208  
209  	unsigned long flags;
210  
211  	/*
212  	 * This is a PIB according to 802.15.4-2011.
213  	 * We do not provide timing-related variables, as they
214  	 * aren't used outside of driver
215  	 */
216  	u8 current_channel;
217  	u8 current_page;
218  	struct wpan_phy_supported supported;
219  	/* current transmit_power in mBm */
220  	s32 transmit_power;
221  	struct wpan_phy_cca cca;
222  
223  	__le64 perm_extended_addr;
224  
225  	/* current cca ed threshold in mBm */
226  	s32 cca_ed_level;
227  
228  	/* PHY depended MAC PIB values */
229  
230  	/* 802.15.4 acronym: Tdsym in nsec */
231  	u32 symbol_duration;
232  	/* lifs and sifs periods timing */
233  	u16 lifs_period;
234  	u16 sifs_period;
235  
236  	struct device dev;
237  
238  	/* the network namespace this phy lives in currently */
239  	possible_net_t _net;
240  
241  	/* Transmission monitoring and control */
242  	spinlock_t queue_lock;
243  	atomic_t ongoing_txs;
244  	atomic_t hold_txs;
245  	wait_queue_head_t sync_txq;
246  
247  	/* Current filtering level on reception.
248  	 * Only allowed to be changed if phy is not operational.
249  	 */
250  	enum ieee802154_filtering_level filtering;
251  
252  	char priv[] __aligned(NETDEV_ALIGN);
253  };
254  
wpan_phy_net(struct wpan_phy * wpan_phy)255  static inline struct net *wpan_phy_net(struct wpan_phy *wpan_phy)
256  {
257  	return read_pnet(&wpan_phy->_net);
258  }
259  
wpan_phy_net_set(struct wpan_phy * wpan_phy,struct net * net)260  static inline void wpan_phy_net_set(struct wpan_phy *wpan_phy, struct net *net)
261  {
262  	write_pnet(&wpan_phy->_net, net);
263  }
264  
ieee802154_chan_is_valid(struct wpan_phy * phy,u8 page,u8 channel)265  static inline bool ieee802154_chan_is_valid(struct wpan_phy *phy,
266  					    u8 page, u8 channel)
267  {
268  	if (page > IEEE802154_MAX_PAGE ||
269  	    channel > IEEE802154_MAX_CHANNEL ||
270  	    !(phy->supported.channels[page] & BIT(channel)))
271  		return false;
272  
273  	return true;
274  }
275  
276  /**
277   * struct ieee802154_addr - IEEE802.15.4 device address
278   * @mode: Address mode from frame header. Can be one of:
279   *        - @IEEE802154_ADDR_NONE
280   *        - @IEEE802154_ADDR_SHORT
281   *        - @IEEE802154_ADDR_LONG
282   * @pan_id: The PAN ID this address belongs to
283   * @short_addr: address if @mode is @IEEE802154_ADDR_SHORT
284   * @extended_addr: address if @mode is @IEEE802154_ADDR_LONG
285   */
286  struct ieee802154_addr {
287  	u8 mode;
288  	__le16 pan_id;
289  	union {
290  		__le16 short_addr;
291  		__le64 extended_addr;
292  	};
293  };
294  
295  /**
296   * struct ieee802154_coord_desc - Coordinator descriptor
297   * @addr: PAN ID and coordinator address
298   * @page: page this coordinator is using
299   * @channel: channel this coordinator is using
300   * @superframe_spec: SuperFrame specification as received
301   * @link_quality: link quality indicator at which the beacon was received
302   * @gts_permit: the coordinator accepts GTS requests
303   */
304  struct ieee802154_coord_desc {
305  	struct ieee802154_addr addr;
306  	u8 page;
307  	u8 channel;
308  	u16 superframe_spec;
309  	u8 link_quality;
310  	bool gts_permit;
311  };
312  
313  /**
314   * struct ieee802154_pan_device - PAN device information
315   * @pan_id: the PAN ID of this device
316   * @mode: the preferred mode to reach the device
317   * @short_addr: the short address of this device
318   * @extended_addr: the extended address of this device
319   * @node: the list node
320   */
321  struct ieee802154_pan_device {
322  	__le16 pan_id;
323  	u8 mode;
324  	__le16 short_addr;
325  	__le64 extended_addr;
326  	struct list_head node;
327  };
328  
329  /**
330   * struct cfg802154_scan_request - Scan request
331   *
332   * @type: type of scan to be performed
333   * @page: page on which to perform the scan
334   * @channels: channels in te %page to be scanned
335   * @duration: time spent on each channel, calculated with:
336   *            aBaseSuperframeDuration * (2 ^ duration + 1)
337   * @wpan_dev: the wpan device on which to perform the scan
338   * @wpan_phy: the wpan phy on which to perform the scan
339   */
340  struct cfg802154_scan_request {
341  	enum nl802154_scan_types type;
342  	u8 page;
343  	u32 channels;
344  	u8 duration;
345  	struct wpan_dev *wpan_dev;
346  	struct wpan_phy *wpan_phy;
347  };
348  
349  /**
350   * struct cfg802154_beacon_request - Beacon request descriptor
351   *
352   * @interval: interval n between sendings, in multiple order of the super frame
353   *            duration: aBaseSuperframeDuration * (2^n) unless the interval
354   *            order is greater or equal to 15, in this case beacons won't be
355   *            passively sent out at a fixed rate but instead inform the device
356   *            that it should answer beacon requests as part of active scan
357   *            procedures
358   * @wpan_dev: the concerned wpan device
359   * @wpan_phy: the wpan phy this was for
360   */
361  struct cfg802154_beacon_request {
362  	u8 interval;
363  	struct wpan_dev *wpan_dev;
364  	struct wpan_phy *wpan_phy;
365  };
366  
367  /**
368   * struct cfg802154_mac_pkt - MAC packet descriptor (beacon/command)
369   * @node: MAC packets to process list member
370   * @skb: the received sk_buff
371   * @sdata: the interface on which @skb was received
372   * @page: page configuration when @skb was received
373   * @channel: channel configuration when @skb was received
374   */
375  struct cfg802154_mac_pkt {
376  	struct list_head node;
377  	struct sk_buff *skb;
378  	struct ieee802154_sub_if_data *sdata;
379  	u8 page;
380  	u8 channel;
381  };
382  
383  struct ieee802154_llsec_key_id {
384  	u8 mode;
385  	u8 id;
386  	union {
387  		struct ieee802154_addr device_addr;
388  		__le32 short_source;
389  		__le64 extended_source;
390  	};
391  };
392  
393  #define IEEE802154_LLSEC_KEY_SIZE 16
394  
395  struct ieee802154_llsec_key {
396  	u8 frame_types;
397  	u32 cmd_frame_ids;
398  	/* TODO replace with NL802154_KEY_SIZE */
399  	u8 key[IEEE802154_LLSEC_KEY_SIZE];
400  };
401  
402  struct ieee802154_llsec_key_entry {
403  	struct list_head list;
404  	struct rcu_head rcu;
405  
406  	struct ieee802154_llsec_key_id id;
407  	struct ieee802154_llsec_key *key;
408  };
409  
410  struct ieee802154_llsec_params {
411  	bool enabled;
412  
413  	__be32 frame_counter;
414  	u8 out_level;
415  	struct ieee802154_llsec_key_id out_key;
416  
417  	__le64 default_key_source;
418  
419  	__le16 pan_id;
420  	__le64 hwaddr;
421  	__le64 coord_hwaddr;
422  	__le16 coord_shortaddr;
423  };
424  
425  struct ieee802154_llsec_table {
426  	struct list_head keys;
427  	struct list_head devices;
428  	struct list_head security_levels;
429  };
430  
431  struct ieee802154_llsec_seclevel {
432  	struct list_head list;
433  
434  	u8 frame_type;
435  	u8 cmd_frame_id;
436  	bool device_override;
437  	u32 sec_levels;
438  };
439  
440  struct ieee802154_llsec_device {
441  	struct list_head list;
442  
443  	__le16 pan_id;
444  	__le16 short_addr;
445  	__le64 hwaddr;
446  	u32 frame_counter;
447  	bool seclevel_exempt;
448  
449  	u8 key_mode;
450  	struct list_head keys;
451  };
452  
453  struct ieee802154_llsec_device_key {
454  	struct list_head list;
455  
456  	struct ieee802154_llsec_key_id key_id;
457  	u32 frame_counter;
458  };
459  
460  struct wpan_dev_header_ops {
461  	/* TODO create callback currently assumes ieee802154_mac_cb inside
462  	 * skb->cb. This should be changed to give these information as
463  	 * parameter.
464  	 */
465  	int	(*create)(struct sk_buff *skb, struct net_device *dev,
466  			  const struct ieee802154_addr *daddr,
467  			  const struct ieee802154_addr *saddr,
468  			  unsigned int len);
469  };
470  
471  struct wpan_dev {
472  	struct wpan_phy *wpan_phy;
473  	int iftype;
474  
475  	/* the remainder of this struct should be private to cfg802154 */
476  	struct list_head list;
477  	struct net_device *netdev;
478  
479  	const struct wpan_dev_header_ops *header_ops;
480  
481  	/* lowpan interface, set when the wpan_dev belongs to one lowpan_dev */
482  	struct net_device *lowpan_dev;
483  
484  	u32 identifier;
485  
486  	/* MAC PIB */
487  	__le16 pan_id;
488  	__le16 short_addr;
489  	__le64 extended_addr;
490  
491  	/* MAC BSN field */
492  	atomic_t bsn;
493  	/* MAC DSN field */
494  	atomic_t dsn;
495  
496  	u8 min_be;
497  	u8 max_be;
498  	u8 csma_retries;
499  	s8 frame_retries;
500  
501  	bool lbt;
502  
503  	/* fallback for acknowledgment bit setting */
504  	bool ackreq;
505  
506  	/* Associations */
507  	struct mutex association_lock;
508  	struct ieee802154_pan_device *parent;
509  	struct list_head children;
510  	unsigned int max_associations;
511  	unsigned int nchildren;
512  };
513  
514  #define to_phy(_dev)	container_of(_dev, struct wpan_phy, dev)
515  
516  #if IS_ENABLED(CONFIG_IEEE802154) || IS_ENABLED(CONFIG_6LOWPAN)
517  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)518  wpan_dev_hard_header(struct sk_buff *skb, struct net_device *dev,
519  		     const struct ieee802154_addr *daddr,
520  		     const struct ieee802154_addr *saddr,
521  		     unsigned int len)
522  {
523  	struct wpan_dev *wpan_dev = dev->ieee802154_ptr;
524  
525  	return wpan_dev->header_ops->create(skb, dev, daddr, saddr, len);
526  }
527  #endif
528  
529  struct wpan_phy *
530  wpan_phy_new(const struct cfg802154_ops *ops, size_t priv_size);
wpan_phy_set_dev(struct wpan_phy * phy,struct device * dev)531  static inline void wpan_phy_set_dev(struct wpan_phy *phy, struct device *dev)
532  {
533  	phy->dev.parent = dev;
534  }
535  
536  int wpan_phy_register(struct wpan_phy *phy);
537  void wpan_phy_unregister(struct wpan_phy *phy);
538  void wpan_phy_free(struct wpan_phy *phy);
539  /* Same semantics as for class_for_each_device */
540  int wpan_phy_for_each(int (*fn)(struct wpan_phy *phy, void *data), void *data);
541  
wpan_phy_priv(struct wpan_phy * phy)542  static inline void *wpan_phy_priv(struct wpan_phy *phy)
543  {
544  	BUG_ON(!phy);
545  	return &phy->priv;
546  }
547  
548  struct wpan_phy *wpan_phy_find(const char *str);
549  
wpan_phy_put(struct wpan_phy * phy)550  static inline void wpan_phy_put(struct wpan_phy *phy)
551  {
552  	put_device(&phy->dev);
553  }
554  
wpan_phy_name(struct wpan_phy * phy)555  static inline const char *wpan_phy_name(struct wpan_phy *phy)
556  {
557  	return dev_name(&phy->dev);
558  }
559  
560  void ieee802154_configure_durations(struct wpan_phy *phy,
561  				    unsigned int page, unsigned int channel);
562  
563  /**
564   * cfg802154_device_is_associated - Checks whether we are associated to any device
565   * @wpan_dev: the wpan device
566   * @return: true if we are associated
567   */
568  bool cfg802154_device_is_associated(struct wpan_dev *wpan_dev);
569  
570  /**
571   * cfg802154_device_is_parent - Checks if a device is our coordinator
572   * @wpan_dev: the wpan device
573   * @target: the expected parent
574   * @return: true if @target is our coordinator
575   */
576  bool cfg802154_device_is_parent(struct wpan_dev *wpan_dev,
577  				struct ieee802154_addr *target);
578  
579  /**
580   * cfg802154_device_is_child - Checks whether a device is associated to us
581   * @wpan_dev: the wpan device
582   * @target: the expected child
583   * @return: the PAN device
584   */
585  struct ieee802154_pan_device *
586  cfg802154_device_is_child(struct wpan_dev *wpan_dev,
587  			  struct ieee802154_addr *target);
588  
589  /**
590   * cfg802154_set_max_associations - Limit the number of future associations
591   * @wpan_dev: the wpan device
592   * @max: the maximum number of devices we accept to associate
593   * @return: the old maximum value
594   */
595  unsigned int cfg802154_set_max_associations(struct wpan_dev *wpan_dev,
596  					    unsigned int max);
597  
598  /**
599   * cfg802154_get_free_short_addr - Get a free address among the known devices
600   * @wpan_dev: the wpan device
601   * @return: a random short address expectedly unused on our PAN
602   */
603  __le16 cfg802154_get_free_short_addr(struct wpan_dev *wpan_dev);
604  
605  #endif /* __NET_CFG802154_H */
606