Linux Audio

Check our new training course

Loading...
v5.14.15
  1/* SPDX-License-Identifier: GPL-2.0-only */
  2/*
  3 * Copyright (C) 2007-2012 Siemens AG
 
 
 
 
 
 
 
 
 
  4 *
  5 * Written by:
  6 * Pavel Smolenskiy <pavel.smolenskiy@gmail.com>
  7 * Maxim Gorbachyov <maxim.gorbachev@siemens.com>
  8 * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
  9 * Alexander Smirnov <alex.bluesman.smirnov@gmail.com>
 10 */
 11#ifndef __IEEE802154_I_H
 12#define __IEEE802154_I_H
 13
 14#include <linux/interrupt.h>
 15#include <linux/mutex.h>
 16#include <linux/hrtimer.h>
 17#include <net/cfg802154.h>
 18#include <net/mac802154.h>
 19#include <net/nl802154.h>
 20#include <net/ieee802154_netdev.h>
 21
 22#include "llsec.h"
 23
 24/* mac802154 device private data */
 25struct ieee802154_local {
 26	struct ieee802154_hw hw;
 27	const struct ieee802154_ops *ops;
 28
 29	/* ieee802154 phy */
 30	struct wpan_phy *phy;
 31
 32	int open_count;
 33
 34	/* As in mac80211 slaves list is modified:
 35	 * 1) under the RTNL
 36	 * 2) protected by slaves_mtx;
 37	 * 3) in an RCU manner
 38	 *
 39	 * So atomic readers can use any of this protection methods.
 40	 */
 41	struct list_head	interfaces;
 42	struct mutex		iflist_mtx;
 43
 44	/* This one is used for scanning and other jobs not to be interfered
 45	 * with serial driver.
 46	 */
 47	struct workqueue_struct	*workqueue;
 48
 49	struct hrtimer ifs_timer;
 50
 51	bool started;
 52	bool suspended;
 53
 54	struct tasklet_struct tasklet;
 55	struct sk_buff_head skb_queue;
 56
 57	struct sk_buff *tx_skb;
 58	struct work_struct tx_work;
 59};
 60
 61enum {
 62	IEEE802154_RX_MSG        = 1,
 63};
 64
 65enum ieee802154_sdata_state_bits {
 66	SDATA_STATE_RUNNING,
 67};
 68
 69/* Slave interface definition.
 70 *
 71 * Slaves represent typical network interfaces available from userspace.
 72 * Each ieee802154 device/transceiver may have several slaves and able
 73 * to be associated with several networks at the same time.
 74 */
 75struct ieee802154_sub_if_data {
 76	struct list_head list; /* the ieee802154_priv->slaves list */
 77
 78	struct wpan_dev wpan_dev;
 79
 80	struct ieee802154_local *local;
 81	struct net_device *dev;
 82
 83	unsigned long state;
 84	char name[IFNAMSIZ];
 85
 86	/* protects sec from concurrent access by netlink. access by
 87	 * encrypt/decrypt/header_create safe without additional protection.
 88	 */
 89	struct mutex sec_mtx;
 90
 91	struct mac802154_llsec sec;
 92};
 93
 94/* utility functions/constants */
 95extern const void *const mac802154_wpan_phy_privid; /*  for wpan_phy privid */
 96
 97static inline struct ieee802154_local *
 98hw_to_local(struct ieee802154_hw *hw)
 99{
100	return container_of(hw, struct ieee802154_local, hw);
101}
102
103static inline struct ieee802154_sub_if_data *
104IEEE802154_DEV_TO_SUB_IF(const struct net_device *dev)
105{
106	return netdev_priv(dev);
107}
108
109static inline struct ieee802154_sub_if_data *
110IEEE802154_WPAN_DEV_TO_SUB_IF(struct wpan_dev *wpan_dev)
111{
112	return container_of(wpan_dev, struct ieee802154_sub_if_data, wpan_dev);
113}
114
115static inline bool
116ieee802154_sdata_running(struct ieee802154_sub_if_data *sdata)
117{
118	return test_bit(SDATA_STATE_RUNNING, &sdata->state);
119}
120
121extern struct ieee802154_mlme_ops mac802154_mlme_wpan;
122
123void ieee802154_rx(struct ieee802154_local *local, struct sk_buff *skb);
124void ieee802154_xmit_worker(struct work_struct *work);
125netdev_tx_t
126ieee802154_monitor_start_xmit(struct sk_buff *skb, struct net_device *dev);
127netdev_tx_t
128ieee802154_subif_start_xmit(struct sk_buff *skb, struct net_device *dev);
129enum hrtimer_restart ieee802154_xmit_ifs_timer(struct hrtimer *timer);
130
131/* MIB callbacks */
132void mac802154_dev_set_page_channel(struct net_device *dev, u8 page, u8 chan);
133
134int mac802154_get_params(struct net_device *dev,
135			 struct ieee802154_llsec_params *params);
136int mac802154_set_params(struct net_device *dev,
137			 const struct ieee802154_llsec_params *params,
138			 int changed);
139
140int mac802154_add_key(struct net_device *dev,
141		      const struct ieee802154_llsec_key_id *id,
142		      const struct ieee802154_llsec_key *key);
143int mac802154_del_key(struct net_device *dev,
144		      const struct ieee802154_llsec_key_id *id);
145
146int mac802154_add_dev(struct net_device *dev,
147		      const struct ieee802154_llsec_device *llsec_dev);
148int mac802154_del_dev(struct net_device *dev, __le64 dev_addr);
149
150int mac802154_add_devkey(struct net_device *dev,
151			 __le64 device_addr,
152			 const struct ieee802154_llsec_device_key *key);
153int mac802154_del_devkey(struct net_device *dev,
154			 __le64 device_addr,
155			 const struct ieee802154_llsec_device_key *key);
156
157int mac802154_add_seclevel(struct net_device *dev,
158			   const struct ieee802154_llsec_seclevel *sl);
159int mac802154_del_seclevel(struct net_device *dev,
160			   const struct ieee802154_llsec_seclevel *sl);
161
162void mac802154_lock_table(struct net_device *dev);
163void mac802154_get_table(struct net_device *dev,
164			 struct ieee802154_llsec_table **t);
165void mac802154_unlock_table(struct net_device *dev);
166
167int mac802154_wpan_update_llsec(struct net_device *dev);
168
169/* interface handling */
170int ieee802154_iface_init(void);
171void ieee802154_iface_exit(void);
172void ieee802154_if_remove(struct ieee802154_sub_if_data *sdata);
173struct net_device *
174ieee802154_if_add(struct ieee802154_local *local, const char *name,
175		  unsigned char name_assign_type, enum nl802154_iftype type,
176		  __le64 extended_addr);
177void ieee802154_remove_interfaces(struct ieee802154_local *local);
178void ieee802154_stop_device(struct ieee802154_local *local);
179
180#endif /* __IEEE802154_I_H */
v4.17
 
  1/*
  2 * Copyright (C) 2007-2012 Siemens AG
  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 * Pavel Smolenskiy <pavel.smolenskiy@gmail.com>
 15 * Maxim Gorbachyov <maxim.gorbachev@siemens.com>
 16 * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
 17 * Alexander Smirnov <alex.bluesman.smirnov@gmail.com>
 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/* mac802154 device private data */
 33struct ieee802154_local {
 34	struct ieee802154_hw hw;
 35	const struct ieee802154_ops *ops;
 36
 37	/* ieee802154 phy */
 38	struct wpan_phy *phy;
 39
 40	int open_count;
 41
 42	/* As in mac80211 slaves list is modified:
 43	 * 1) under the RTNL
 44	 * 2) protected by slaves_mtx;
 45	 * 3) in an RCU manner
 46	 *
 47	 * So atomic readers can use any of this protection methods.
 48	 */
 49	struct list_head	interfaces;
 50	struct mutex		iflist_mtx;
 51
 52	/* This one is used for scanning and other jobs not to be interfered
 53	 * with serial driver.
 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/* Slave interface definition.
 78 *
 79 * Slaves represent typical network interfaces available from userspace.
 80 * Each ieee802154 device/transceiver may have several slaves and able
 81 * to be associated with several networks at the same time.
 82 */
 83struct ieee802154_sub_if_data {
 84	struct list_head list; /* the ieee802154_priv->slaves 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	/* protects sec from concurrent access by netlink. access by
 95	 * encrypt/decrypt/header_create safe without additional protection.
 96	 */
 97	struct mutex sec_mtx;
 98
 99	struct mac802154_llsec sec;
100};
101
102/* utility functions/constants */
103extern const void *const mac802154_wpan_phy_privid; /*  for 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/* MIB callbacks */
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/* interface handling */
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 /* __IEEE802154_I_H */