xref: /openbmc/linux/include/net/ieee802154_netdev.h (revision 376b7bd3558eaf12d3e5c24aa71d0c162d2701fd)
1f0166e5eSDmitry Eremin-Solenikov /*
2f0166e5eSDmitry Eremin-Solenikov  * An interface between IEEE802.15.4 device and rest of the kernel.
3f0166e5eSDmitry Eremin-Solenikov  *
474a02fcfSalex.bluesman.smirnov@gmail.com  * Copyright (C) 2007-2012 Siemens AG
5f0166e5eSDmitry Eremin-Solenikov  *
6f0166e5eSDmitry Eremin-Solenikov  * This program is free software; you can redistribute it and/or modify
7f0166e5eSDmitry Eremin-Solenikov  * it under the terms of the GNU General Public License version 2
8f0166e5eSDmitry Eremin-Solenikov  * as published by the Free Software Foundation.
9f0166e5eSDmitry Eremin-Solenikov  *
10f0166e5eSDmitry Eremin-Solenikov  * This program is distributed in the hope that it will be useful,
11f0166e5eSDmitry Eremin-Solenikov  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12f0166e5eSDmitry Eremin-Solenikov  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13f0166e5eSDmitry Eremin-Solenikov  * GNU General Public License for more details.
14f0166e5eSDmitry Eremin-Solenikov  *
15f0166e5eSDmitry Eremin-Solenikov  * You should have received a copy of the GNU General Public License along
16f0166e5eSDmitry Eremin-Solenikov  * with this program; if not, write to the Free Software Foundation, Inc.,
17f0166e5eSDmitry Eremin-Solenikov  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18f0166e5eSDmitry Eremin-Solenikov  *
19f0166e5eSDmitry Eremin-Solenikov  * Written by:
20f0166e5eSDmitry Eremin-Solenikov  * Pavel Smolenskiy <pavel.smolenskiy@gmail.com>
21f0166e5eSDmitry Eremin-Solenikov  * Maxim Gorbachyov <maxim.gorbachev@siemens.com>
22f0166e5eSDmitry Eremin-Solenikov  * Maxim Osipov <maxim.osipov@siemens.com>
23f0166e5eSDmitry Eremin-Solenikov  * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
2474a02fcfSalex.bluesman.smirnov@gmail.com  * Alexander Smirnov <alex.bluesman.smirnov@gmail.com>
25f0166e5eSDmitry Eremin-Solenikov  */
26f0166e5eSDmitry Eremin-Solenikov 
27f0166e5eSDmitry Eremin-Solenikov #ifndef IEEE802154_NETDEVICE_H
28f0166e5eSDmitry Eremin-Solenikov #define IEEE802154_NETDEVICE_H
29f0166e5eSDmitry Eremin-Solenikov 
301cd829c8Salex.bluesman.smirnov@gmail.com #include <net/af_ieee802154.h>
311cd829c8Salex.bluesman.smirnov@gmail.com 
3289745c9cSAlexander Aring struct ieee802154_frag_info {
3389745c9cSAlexander Aring 	__be16 d_tag;
3489745c9cSAlexander Aring 	u16 d_size;
3589745c9cSAlexander Aring 	u8 d_offset;
3689745c9cSAlexander Aring };
3789745c9cSAlexander Aring 
38f0166e5eSDmitry Eremin-Solenikov /*
39f0166e5eSDmitry Eremin-Solenikov  * A control block of skb passed between the ARPHRD_IEEE802154 device
40f0166e5eSDmitry Eremin-Solenikov  * and other stack parts.
41f0166e5eSDmitry Eremin-Solenikov  */
42f0166e5eSDmitry Eremin-Solenikov struct ieee802154_mac_cb {
43f0166e5eSDmitry Eremin-Solenikov 	u8 lqi;
44*376b7bd3SPhoebe Buckheister 	struct ieee802154_addr_sa sa;
45*376b7bd3SPhoebe Buckheister 	struct ieee802154_addr_sa da;
46f0166e5eSDmitry Eremin-Solenikov 	u8 flags;
47f0166e5eSDmitry Eremin-Solenikov 	u8 seq;
4889745c9cSAlexander Aring 	struct ieee802154_frag_info frag_info;
49f0166e5eSDmitry Eremin-Solenikov };
50f0166e5eSDmitry Eremin-Solenikov 
51f0166e5eSDmitry Eremin-Solenikov static inline struct ieee802154_mac_cb *mac_cb(struct sk_buff *skb)
52f0166e5eSDmitry Eremin-Solenikov {
53f0166e5eSDmitry Eremin-Solenikov 	return (struct ieee802154_mac_cb *)skb->cb;
54f0166e5eSDmitry Eremin-Solenikov }
55f0166e5eSDmitry Eremin-Solenikov 
56f0166e5eSDmitry Eremin-Solenikov #define MAC_CB_FLAG_TYPEMASK		((1 << 3) - 1)
57f0166e5eSDmitry Eremin-Solenikov 
58f0166e5eSDmitry Eremin-Solenikov #define MAC_CB_FLAG_ACKREQ		(1 << 3)
59f0166e5eSDmitry Eremin-Solenikov #define MAC_CB_FLAG_SECEN		(1 << 4)
60f0166e5eSDmitry Eremin-Solenikov #define MAC_CB_FLAG_INTRAPAN		(1 << 5)
61f0166e5eSDmitry Eremin-Solenikov 
62f0166e5eSDmitry Eremin-Solenikov static inline int mac_cb_is_ackreq(struct sk_buff *skb)
63f0166e5eSDmitry Eremin-Solenikov {
64f0166e5eSDmitry Eremin-Solenikov 	return mac_cb(skb)->flags & MAC_CB_FLAG_ACKREQ;
65f0166e5eSDmitry Eremin-Solenikov }
66f0166e5eSDmitry Eremin-Solenikov 
67f0166e5eSDmitry Eremin-Solenikov static inline int mac_cb_is_secen(struct sk_buff *skb)
68f0166e5eSDmitry Eremin-Solenikov {
69f0166e5eSDmitry Eremin-Solenikov 	return mac_cb(skb)->flags & MAC_CB_FLAG_SECEN;
70f0166e5eSDmitry Eremin-Solenikov }
71f0166e5eSDmitry Eremin-Solenikov 
72f0166e5eSDmitry Eremin-Solenikov static inline int mac_cb_is_intrapan(struct sk_buff *skb)
73f0166e5eSDmitry Eremin-Solenikov {
74f0166e5eSDmitry Eremin-Solenikov 	return mac_cb(skb)->flags & MAC_CB_FLAG_INTRAPAN;
75f0166e5eSDmitry Eremin-Solenikov }
76f0166e5eSDmitry Eremin-Solenikov 
77f0166e5eSDmitry Eremin-Solenikov static inline int mac_cb_type(struct sk_buff *skb)
78f0166e5eSDmitry Eremin-Solenikov {
79f0166e5eSDmitry Eremin-Solenikov 	return mac_cb(skb)->flags & MAC_CB_FLAG_TYPEMASK;
80f0166e5eSDmitry Eremin-Solenikov }
81f0166e5eSDmitry Eremin-Solenikov 
82f0166e5eSDmitry Eremin-Solenikov #define IEEE802154_MAC_SCAN_ED		0
83f0166e5eSDmitry Eremin-Solenikov #define IEEE802154_MAC_SCAN_ACTIVE	1
84f0166e5eSDmitry Eremin-Solenikov #define IEEE802154_MAC_SCAN_PASSIVE	2
85f0166e5eSDmitry Eremin-Solenikov #define IEEE802154_MAC_SCAN_ORPHAN	3
86f0166e5eSDmitry Eremin-Solenikov 
8742723448SDmitry Eremin-Solenikov struct wpan_phy;
88f0166e5eSDmitry Eremin-Solenikov /*
89f0166e5eSDmitry Eremin-Solenikov  * This should be located at net_device->ml_priv
9042723448SDmitry Eremin-Solenikov  *
9142723448SDmitry Eremin-Solenikov  * get_phy should increment the reference counting on returned phy.
9242723448SDmitry Eremin-Solenikov  * Use wpan_wpy_put to put that reference.
93f0166e5eSDmitry Eremin-Solenikov  */
94f0166e5eSDmitry Eremin-Solenikov struct ieee802154_mlme_ops {
9556aa091dSWerner Almesberger 	/* The following fields are optional (can be NULL). */
9656aa091dSWerner Almesberger 
97f0166e5eSDmitry Eremin-Solenikov 	int (*assoc_req)(struct net_device *dev,
98*376b7bd3SPhoebe Buckheister 			struct ieee802154_addr_sa *addr,
9916eea493SDmitry Eremin-Solenikov 			u8 channel, u8 page, u8 cap);
100f0166e5eSDmitry Eremin-Solenikov 	int (*assoc_resp)(struct net_device *dev,
101*376b7bd3SPhoebe Buckheister 			struct ieee802154_addr_sa *addr,
102f0166e5eSDmitry Eremin-Solenikov 			u16 short_addr, u8 status);
103f0166e5eSDmitry Eremin-Solenikov 	int (*disassoc_req)(struct net_device *dev,
104*376b7bd3SPhoebe Buckheister 			struct ieee802154_addr_sa *addr,
105f0166e5eSDmitry Eremin-Solenikov 			u8 reason);
106f0166e5eSDmitry Eremin-Solenikov 	int (*start_req)(struct net_device *dev,
107*376b7bd3SPhoebe Buckheister 			struct ieee802154_addr_sa *addr,
10816eea493SDmitry Eremin-Solenikov 			u8 channel, u8 page, u8 bcn_ord, u8 sf_ord,
109f0166e5eSDmitry Eremin-Solenikov 			u8 pan_coord, u8 blx, u8 coord_realign);
110f0166e5eSDmitry Eremin-Solenikov 	int (*scan_req)(struct net_device *dev,
11116eea493SDmitry Eremin-Solenikov 			u8 type, u32 channels, u8 page, u8 duration);
112f0166e5eSDmitry Eremin-Solenikov 
11356aa091dSWerner Almesberger 	/* The fields below are required. */
11456aa091dSWerner Almesberger 
11542723448SDmitry Eremin-Solenikov 	struct wpan_phy *(*get_phy)(const struct net_device *dev);
11642723448SDmitry Eremin-Solenikov 
117f0166e5eSDmitry Eremin-Solenikov 	/*
118f0166e5eSDmitry Eremin-Solenikov 	 * FIXME: these should become the part of PIB/MIB interface.
119f0166e5eSDmitry Eremin-Solenikov 	 * However we still don't have IB interface of any kind
120f0166e5eSDmitry Eremin-Solenikov 	 */
121a9966b58SDmitry Eremin-Solenikov 	u16 (*get_pan_id)(const struct net_device *dev);
122a9966b58SDmitry Eremin-Solenikov 	u16 (*get_short_addr)(const struct net_device *dev);
123a9966b58SDmitry Eremin-Solenikov 	u8 (*get_dsn)(const struct net_device *dev);
124f0166e5eSDmitry Eremin-Solenikov };
125f0166e5eSDmitry Eremin-Solenikov 
12674a02fcfSalex.bluesman.smirnov@gmail.com /* The IEEE 802.15.4 standard defines 2 type of the devices:
12774a02fcfSalex.bluesman.smirnov@gmail.com  * - FFD - full functionality device
12874a02fcfSalex.bluesman.smirnov@gmail.com  * - RFD - reduce functionality device
12974a02fcfSalex.bluesman.smirnov@gmail.com  *
13074a02fcfSalex.bluesman.smirnov@gmail.com  * So 2 sets of mlme operations are needed
13174a02fcfSalex.bluesman.smirnov@gmail.com  */
13274a02fcfSalex.bluesman.smirnov@gmail.com struct ieee802154_reduced_mlme_ops {
13374a02fcfSalex.bluesman.smirnov@gmail.com 	struct wpan_phy *(*get_phy)(const struct net_device *dev);
13474a02fcfSalex.bluesman.smirnov@gmail.com };
13574a02fcfSalex.bluesman.smirnov@gmail.com 
13674a02fcfSalex.bluesman.smirnov@gmail.com static inline struct ieee802154_mlme_ops *
13774a02fcfSalex.bluesman.smirnov@gmail.com ieee802154_mlme_ops(const struct net_device *dev)
13874a02fcfSalex.bluesman.smirnov@gmail.com {
13974a02fcfSalex.bluesman.smirnov@gmail.com 	return dev->ml_priv;
14074a02fcfSalex.bluesman.smirnov@gmail.com }
14174a02fcfSalex.bluesman.smirnov@gmail.com 
14274a02fcfSalex.bluesman.smirnov@gmail.com static inline struct ieee802154_reduced_mlme_ops *
14374a02fcfSalex.bluesman.smirnov@gmail.com ieee802154_reduced_mlme_ops(const struct net_device *dev)
144f0166e5eSDmitry Eremin-Solenikov {
145f0166e5eSDmitry Eremin-Solenikov 	return dev->ml_priv;
146f0166e5eSDmitry Eremin-Solenikov }
147f0166e5eSDmitry Eremin-Solenikov 
148f0166e5eSDmitry Eremin-Solenikov #endif
149