xref: /openbmc/linux/net/mac802154/ieee802154_i.h (revision 0f1556bc2b152fc5d2a6b929c579748ec90c55d0)
1*0f1556bcSAlexander Aring /*
2*0f1556bcSAlexander Aring  * Copyright (C) 2007-2012 Siemens AG
3*0f1556bcSAlexander Aring  *
4*0f1556bcSAlexander Aring  * This program is free software; you can redistribute it and/or modify
5*0f1556bcSAlexander Aring  * it under the terms of the GNU General Public License version 2
6*0f1556bcSAlexander Aring  * as published by the Free Software Foundation.
7*0f1556bcSAlexander Aring  *
8*0f1556bcSAlexander Aring  * This program is distributed in the hope that it will be useful,
9*0f1556bcSAlexander Aring  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10*0f1556bcSAlexander Aring  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11*0f1556bcSAlexander Aring  * GNU General Public License for more details.
12*0f1556bcSAlexander Aring  *
13*0f1556bcSAlexander Aring  * Written by:
14*0f1556bcSAlexander Aring  * Pavel Smolenskiy <pavel.smolenskiy@gmail.com>
15*0f1556bcSAlexander Aring  * Maxim Gorbachyov <maxim.gorbachev@siemens.com>
16*0f1556bcSAlexander Aring  * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
17*0f1556bcSAlexander Aring  * Alexander Smirnov <alex.bluesman.smirnov@gmail.com>
18*0f1556bcSAlexander Aring  */
19*0f1556bcSAlexander Aring #ifndef __IEEE802154_I_H
20*0f1556bcSAlexander Aring #define __IEEE802154_I_H
21*0f1556bcSAlexander Aring 
22*0f1556bcSAlexander Aring #include <linux/mutex.h>
23*0f1556bcSAlexander Aring #include <net/mac802154.h>
24*0f1556bcSAlexander Aring #include <net/ieee802154_netdev.h>
25*0f1556bcSAlexander Aring 
26*0f1556bcSAlexander Aring #include "llsec.h"
27*0f1556bcSAlexander Aring 
28*0f1556bcSAlexander Aring /* mac802154 device private data */
29*0f1556bcSAlexander Aring struct mac802154_priv {
30*0f1556bcSAlexander Aring 	struct ieee802154_dev hw;
31*0f1556bcSAlexander Aring 	struct ieee802154_ops *ops;
32*0f1556bcSAlexander Aring 
33*0f1556bcSAlexander Aring 	/* ieee802154 phy */
34*0f1556bcSAlexander Aring 	struct wpan_phy *phy;
35*0f1556bcSAlexander Aring 
36*0f1556bcSAlexander Aring 	int open_count;
37*0f1556bcSAlexander Aring 
38*0f1556bcSAlexander Aring 	/* As in mac80211 slaves list is modified:
39*0f1556bcSAlexander Aring 	 * 1) under the RTNL
40*0f1556bcSAlexander Aring 	 * 2) protected by slaves_mtx;
41*0f1556bcSAlexander Aring 	 * 3) in an RCU manner
42*0f1556bcSAlexander Aring 	 *
43*0f1556bcSAlexander Aring 	 * So atomic readers can use any of this protection methods.
44*0f1556bcSAlexander Aring 	 */
45*0f1556bcSAlexander Aring 	struct list_head	slaves;
46*0f1556bcSAlexander Aring 	struct mutex		slaves_mtx;
47*0f1556bcSAlexander Aring 
48*0f1556bcSAlexander Aring 	/* This one is used for scanning and other jobs not to be interfered
49*0f1556bcSAlexander Aring 	 * with serial driver.
50*0f1556bcSAlexander Aring 	 */
51*0f1556bcSAlexander Aring 	struct workqueue_struct	*dev_workqueue;
52*0f1556bcSAlexander Aring 
53*0f1556bcSAlexander Aring 	/* SoftMAC device is registered and running. One can add subinterfaces.
54*0f1556bcSAlexander Aring 	 * This flag should be modified under slaves_mtx and RTNL, so you can
55*0f1556bcSAlexander Aring 	 * read them using any of protection methods.
56*0f1556bcSAlexander Aring 	 */
57*0f1556bcSAlexander Aring 	bool running;
58*0f1556bcSAlexander Aring };
59*0f1556bcSAlexander Aring 
60*0f1556bcSAlexander Aring #define	MAC802154_DEVICE_STOPPED	0x00
61*0f1556bcSAlexander Aring #define MAC802154_DEVICE_RUN		0x01
62*0f1556bcSAlexander Aring 
63*0f1556bcSAlexander Aring /* Slave interface definition.
64*0f1556bcSAlexander Aring  *
65*0f1556bcSAlexander Aring  * Slaves represent typical network interfaces available from userspace.
66*0f1556bcSAlexander Aring  * Each ieee802154 device/transceiver may have several slaves and able
67*0f1556bcSAlexander Aring  * to be associated with several networks at the same time.
68*0f1556bcSAlexander Aring  */
69*0f1556bcSAlexander Aring struct mac802154_sub_if_data {
70*0f1556bcSAlexander Aring 	struct list_head list; /* the ieee802154_priv->slaves list */
71*0f1556bcSAlexander Aring 
72*0f1556bcSAlexander Aring 	struct mac802154_priv *hw;
73*0f1556bcSAlexander Aring 	struct net_device *dev;
74*0f1556bcSAlexander Aring 
75*0f1556bcSAlexander Aring 	int type;
76*0f1556bcSAlexander Aring 	bool running;
77*0f1556bcSAlexander Aring 
78*0f1556bcSAlexander Aring 	spinlock_t mib_lock;
79*0f1556bcSAlexander Aring 
80*0f1556bcSAlexander Aring 	__le16 pan_id;
81*0f1556bcSAlexander Aring 	__le16 short_addr;
82*0f1556bcSAlexander Aring 	__le64 extended_addr;
83*0f1556bcSAlexander Aring 
84*0f1556bcSAlexander Aring 	u8 chan;
85*0f1556bcSAlexander Aring 	u8 page;
86*0f1556bcSAlexander Aring 
87*0f1556bcSAlexander Aring 	struct ieee802154_mac_params mac_params;
88*0f1556bcSAlexander Aring 
89*0f1556bcSAlexander Aring 	/* MAC BSN field */
90*0f1556bcSAlexander Aring 	u8 bsn;
91*0f1556bcSAlexander Aring 	/* MAC DSN field */
92*0f1556bcSAlexander Aring 	u8 dsn;
93*0f1556bcSAlexander Aring 
94*0f1556bcSAlexander Aring 	/* protects sec from concurrent access by netlink. access by
95*0f1556bcSAlexander Aring 	 * encrypt/decrypt/header_create safe without additional protection.
96*0f1556bcSAlexander Aring 	 */
97*0f1556bcSAlexander Aring 	struct mutex sec_mtx;
98*0f1556bcSAlexander Aring 
99*0f1556bcSAlexander Aring 	struct mac802154_llsec sec;
100*0f1556bcSAlexander Aring };
101*0f1556bcSAlexander Aring 
102*0f1556bcSAlexander Aring #define mac802154_to_priv(_hw)	container_of(_hw, struct mac802154_priv, hw)
103*0f1556bcSAlexander Aring 
104*0f1556bcSAlexander Aring #define MAC802154_CHAN_NONE		0xff /* No channel is assigned */
105*0f1556bcSAlexander Aring 
106*0f1556bcSAlexander Aring extern struct ieee802154_reduced_mlme_ops mac802154_mlme_reduced;
107*0f1556bcSAlexander Aring extern struct ieee802154_mlme_ops mac802154_mlme_wpan;
108*0f1556bcSAlexander Aring 
109*0f1556bcSAlexander Aring int mac802154_slave_open(struct net_device *dev);
110*0f1556bcSAlexander Aring int mac802154_slave_close(struct net_device *dev);
111*0f1556bcSAlexander Aring 
112*0f1556bcSAlexander Aring void mac802154_monitors_rx(struct mac802154_priv *priv, struct sk_buff *skb);
113*0f1556bcSAlexander Aring void mac802154_monitor_setup(struct net_device *dev);
114*0f1556bcSAlexander Aring 
115*0f1556bcSAlexander Aring void mac802154_wpans_rx(struct mac802154_priv *priv, struct sk_buff *skb);
116*0f1556bcSAlexander Aring void mac802154_wpan_setup(struct net_device *dev);
117*0f1556bcSAlexander Aring 
118*0f1556bcSAlexander Aring netdev_tx_t mac802154_tx(struct mac802154_priv *priv, struct sk_buff *skb,
119*0f1556bcSAlexander Aring 			 u8 page, u8 chan);
120*0f1556bcSAlexander Aring 
121*0f1556bcSAlexander Aring /* MIB callbacks */
122*0f1556bcSAlexander Aring void mac802154_dev_set_short_addr(struct net_device *dev, __le16 val);
123*0f1556bcSAlexander Aring __le16 mac802154_dev_get_short_addr(const struct net_device *dev);
124*0f1556bcSAlexander Aring void mac802154_dev_set_ieee_addr(struct net_device *dev);
125*0f1556bcSAlexander Aring __le16 mac802154_dev_get_pan_id(const struct net_device *dev);
126*0f1556bcSAlexander Aring void mac802154_dev_set_pan_id(struct net_device *dev, __le16 val);
127*0f1556bcSAlexander Aring void mac802154_dev_set_page_channel(struct net_device *dev, u8 page, u8 chan);
128*0f1556bcSAlexander Aring u8 mac802154_dev_get_dsn(const struct net_device *dev);
129*0f1556bcSAlexander Aring 
130*0f1556bcSAlexander Aring int mac802154_set_mac_params(struct net_device *dev,
131*0f1556bcSAlexander Aring 			     const struct ieee802154_mac_params *params);
132*0f1556bcSAlexander Aring void mac802154_get_mac_params(struct net_device *dev,
133*0f1556bcSAlexander Aring 			      struct ieee802154_mac_params *params);
134*0f1556bcSAlexander Aring 
135*0f1556bcSAlexander Aring int mac802154_get_params(struct net_device *dev,
136*0f1556bcSAlexander Aring 			 struct ieee802154_llsec_params *params);
137*0f1556bcSAlexander Aring int mac802154_set_params(struct net_device *dev,
138*0f1556bcSAlexander Aring 			 const struct ieee802154_llsec_params *params,
139*0f1556bcSAlexander Aring 			 int changed);
140*0f1556bcSAlexander Aring 
141*0f1556bcSAlexander Aring int mac802154_add_key(struct net_device *dev,
142*0f1556bcSAlexander Aring 		      const struct ieee802154_llsec_key_id *id,
143*0f1556bcSAlexander Aring 		      const struct ieee802154_llsec_key *key);
144*0f1556bcSAlexander Aring int mac802154_del_key(struct net_device *dev,
145*0f1556bcSAlexander Aring 		      const struct ieee802154_llsec_key_id *id);
146*0f1556bcSAlexander Aring 
147*0f1556bcSAlexander Aring int mac802154_add_dev(struct net_device *dev,
148*0f1556bcSAlexander Aring 		      const struct ieee802154_llsec_device *llsec_dev);
149*0f1556bcSAlexander Aring int mac802154_del_dev(struct net_device *dev, __le64 dev_addr);
150*0f1556bcSAlexander Aring 
151*0f1556bcSAlexander Aring int mac802154_add_devkey(struct net_device *dev,
152*0f1556bcSAlexander Aring 			 __le64 device_addr,
153*0f1556bcSAlexander Aring 			 const struct ieee802154_llsec_device_key *key);
154*0f1556bcSAlexander Aring int mac802154_del_devkey(struct net_device *dev,
155*0f1556bcSAlexander Aring 			 __le64 device_addr,
156*0f1556bcSAlexander Aring 			 const struct ieee802154_llsec_device_key *key);
157*0f1556bcSAlexander Aring 
158*0f1556bcSAlexander Aring int mac802154_add_seclevel(struct net_device *dev,
159*0f1556bcSAlexander Aring 			   const struct ieee802154_llsec_seclevel *sl);
160*0f1556bcSAlexander Aring int mac802154_del_seclevel(struct net_device *dev,
161*0f1556bcSAlexander Aring 			   const struct ieee802154_llsec_seclevel *sl);
162*0f1556bcSAlexander Aring 
163*0f1556bcSAlexander Aring void mac802154_lock_table(struct net_device *dev);
164*0f1556bcSAlexander Aring void mac802154_get_table(struct net_device *dev,
165*0f1556bcSAlexander Aring 			 struct ieee802154_llsec_table **t);
166*0f1556bcSAlexander Aring void mac802154_unlock_table(struct net_device *dev);
167*0f1556bcSAlexander Aring 
168*0f1556bcSAlexander Aring #endif /* __IEEE802154_I_H */
169