xref: /openbmc/linux/include/net/ieee802154_netdev.h (revision f0166e5e3cdab66d5a31f796ce18e21fd3ce99dc)
1*f0166e5eSDmitry Eremin-Solenikov /*
2*f0166e5eSDmitry Eremin-Solenikov  * An interface between IEEE802.15.4 device and rest of the kernel.
3*f0166e5eSDmitry Eremin-Solenikov  *
4*f0166e5eSDmitry Eremin-Solenikov  * Copyright (C) 2007, 2008, 2009 Siemens AG
5*f0166e5eSDmitry Eremin-Solenikov  *
6*f0166e5eSDmitry Eremin-Solenikov  * This program is free software; you can redistribute it and/or modify
7*f0166e5eSDmitry Eremin-Solenikov  * it under the terms of the GNU General Public License version 2
8*f0166e5eSDmitry Eremin-Solenikov  * as published by the Free Software Foundation.
9*f0166e5eSDmitry Eremin-Solenikov  *
10*f0166e5eSDmitry Eremin-Solenikov  * This program is distributed in the hope that it will be useful,
11*f0166e5eSDmitry Eremin-Solenikov  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12*f0166e5eSDmitry Eremin-Solenikov  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13*f0166e5eSDmitry Eremin-Solenikov  * GNU General Public License for more details.
14*f0166e5eSDmitry Eremin-Solenikov  *
15*f0166e5eSDmitry Eremin-Solenikov  * You should have received a copy of the GNU General Public License along
16*f0166e5eSDmitry Eremin-Solenikov  * with this program; if not, write to the Free Software Foundation, Inc.,
17*f0166e5eSDmitry Eremin-Solenikov  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18*f0166e5eSDmitry Eremin-Solenikov  *
19*f0166e5eSDmitry Eremin-Solenikov  * Written by:
20*f0166e5eSDmitry Eremin-Solenikov  * Pavel Smolenskiy <pavel.smolenskiy@gmail.com>
21*f0166e5eSDmitry Eremin-Solenikov  * Maxim Gorbachyov <maxim.gorbachev@siemens.com>
22*f0166e5eSDmitry Eremin-Solenikov  * Maxim Osipov <maxim.osipov@siemens.com>
23*f0166e5eSDmitry Eremin-Solenikov  * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
24*f0166e5eSDmitry Eremin-Solenikov  */
25*f0166e5eSDmitry Eremin-Solenikov 
26*f0166e5eSDmitry Eremin-Solenikov #ifndef IEEE802154_NETDEVICE_H
27*f0166e5eSDmitry Eremin-Solenikov #define IEEE802154_NETDEVICE_H
28*f0166e5eSDmitry Eremin-Solenikov 
29*f0166e5eSDmitry Eremin-Solenikov /*
30*f0166e5eSDmitry Eremin-Solenikov  * A control block of skb passed between the ARPHRD_IEEE802154 device
31*f0166e5eSDmitry Eremin-Solenikov  * and other stack parts.
32*f0166e5eSDmitry Eremin-Solenikov  */
33*f0166e5eSDmitry Eremin-Solenikov struct ieee802154_mac_cb {
34*f0166e5eSDmitry Eremin-Solenikov 	u8 lqi;
35*f0166e5eSDmitry Eremin-Solenikov 	struct ieee802154_addr sa;
36*f0166e5eSDmitry Eremin-Solenikov 	struct ieee802154_addr da;
37*f0166e5eSDmitry Eremin-Solenikov 	u8 flags;
38*f0166e5eSDmitry Eremin-Solenikov 	u8 seq;
39*f0166e5eSDmitry Eremin-Solenikov };
40*f0166e5eSDmitry Eremin-Solenikov 
41*f0166e5eSDmitry Eremin-Solenikov static inline struct ieee802154_mac_cb *mac_cb(struct sk_buff *skb)
42*f0166e5eSDmitry Eremin-Solenikov {
43*f0166e5eSDmitry Eremin-Solenikov 	return (struct ieee802154_mac_cb *)skb->cb;
44*f0166e5eSDmitry Eremin-Solenikov }
45*f0166e5eSDmitry Eremin-Solenikov 
46*f0166e5eSDmitry Eremin-Solenikov #define MAC_CB_FLAG_TYPEMASK		((1 << 3) - 1)
47*f0166e5eSDmitry Eremin-Solenikov 
48*f0166e5eSDmitry Eremin-Solenikov #define MAC_CB_FLAG_ACKREQ		(1 << 3)
49*f0166e5eSDmitry Eremin-Solenikov #define MAC_CB_FLAG_SECEN		(1 << 4)
50*f0166e5eSDmitry Eremin-Solenikov #define MAC_CB_FLAG_INTRAPAN		(1 << 5)
51*f0166e5eSDmitry Eremin-Solenikov 
52*f0166e5eSDmitry Eremin-Solenikov static inline int mac_cb_is_ackreq(struct sk_buff *skb)
53*f0166e5eSDmitry Eremin-Solenikov {
54*f0166e5eSDmitry Eremin-Solenikov 	return mac_cb(skb)->flags & MAC_CB_FLAG_ACKREQ;
55*f0166e5eSDmitry Eremin-Solenikov }
56*f0166e5eSDmitry Eremin-Solenikov 
57*f0166e5eSDmitry Eremin-Solenikov static inline int mac_cb_is_secen(struct sk_buff *skb)
58*f0166e5eSDmitry Eremin-Solenikov {
59*f0166e5eSDmitry Eremin-Solenikov 	return mac_cb(skb)->flags & MAC_CB_FLAG_SECEN;
60*f0166e5eSDmitry Eremin-Solenikov }
61*f0166e5eSDmitry Eremin-Solenikov 
62*f0166e5eSDmitry Eremin-Solenikov static inline int mac_cb_is_intrapan(struct sk_buff *skb)
63*f0166e5eSDmitry Eremin-Solenikov {
64*f0166e5eSDmitry Eremin-Solenikov 	return mac_cb(skb)->flags & MAC_CB_FLAG_INTRAPAN;
65*f0166e5eSDmitry Eremin-Solenikov }
66*f0166e5eSDmitry Eremin-Solenikov 
67*f0166e5eSDmitry Eremin-Solenikov static inline int mac_cb_type(struct sk_buff *skb)
68*f0166e5eSDmitry Eremin-Solenikov {
69*f0166e5eSDmitry Eremin-Solenikov 	return mac_cb(skb)->flags & MAC_CB_FLAG_TYPEMASK;
70*f0166e5eSDmitry Eremin-Solenikov }
71*f0166e5eSDmitry Eremin-Solenikov 
72*f0166e5eSDmitry Eremin-Solenikov #define IEEE802154_MAC_SCAN_ED		0
73*f0166e5eSDmitry Eremin-Solenikov #define IEEE802154_MAC_SCAN_ACTIVE	1
74*f0166e5eSDmitry Eremin-Solenikov #define IEEE802154_MAC_SCAN_PASSIVE	2
75*f0166e5eSDmitry Eremin-Solenikov #define IEEE802154_MAC_SCAN_ORPHAN	3
76*f0166e5eSDmitry Eremin-Solenikov 
77*f0166e5eSDmitry Eremin-Solenikov /*
78*f0166e5eSDmitry Eremin-Solenikov  * This should be located at net_device->ml_priv
79*f0166e5eSDmitry Eremin-Solenikov  */
80*f0166e5eSDmitry Eremin-Solenikov struct ieee802154_mlme_ops {
81*f0166e5eSDmitry Eremin-Solenikov 	int (*assoc_req)(struct net_device *dev,
82*f0166e5eSDmitry Eremin-Solenikov 			struct ieee802154_addr *addr,
83*f0166e5eSDmitry Eremin-Solenikov 			u8 channel, u8 cap);
84*f0166e5eSDmitry Eremin-Solenikov 	int (*assoc_resp)(struct net_device *dev,
85*f0166e5eSDmitry Eremin-Solenikov 			struct ieee802154_addr *addr,
86*f0166e5eSDmitry Eremin-Solenikov 			u16 short_addr, u8 status);
87*f0166e5eSDmitry Eremin-Solenikov 	int (*disassoc_req)(struct net_device *dev,
88*f0166e5eSDmitry Eremin-Solenikov 			struct ieee802154_addr *addr,
89*f0166e5eSDmitry Eremin-Solenikov 			u8 reason);
90*f0166e5eSDmitry Eremin-Solenikov 	int (*start_req)(struct net_device *dev,
91*f0166e5eSDmitry Eremin-Solenikov 			struct ieee802154_addr *addr,
92*f0166e5eSDmitry Eremin-Solenikov 			u8 channel, u8 bcn_ord, u8 sf_ord,
93*f0166e5eSDmitry Eremin-Solenikov 			u8 pan_coord, u8 blx, u8 coord_realign);
94*f0166e5eSDmitry Eremin-Solenikov 	int (*scan_req)(struct net_device *dev,
95*f0166e5eSDmitry Eremin-Solenikov 			u8 type, u32 channels, u8 duration);
96*f0166e5eSDmitry Eremin-Solenikov 
97*f0166e5eSDmitry Eremin-Solenikov 	/*
98*f0166e5eSDmitry Eremin-Solenikov 	 * FIXME: these should become the part of PIB/MIB interface.
99*f0166e5eSDmitry Eremin-Solenikov 	 * However we still don't have IB interface of any kind
100*f0166e5eSDmitry Eremin-Solenikov 	 */
101*f0166e5eSDmitry Eremin-Solenikov 	u16 (*get_pan_id)(struct net_device *dev);
102*f0166e5eSDmitry Eremin-Solenikov 	u16 (*get_short_addr)(struct net_device *dev);
103*f0166e5eSDmitry Eremin-Solenikov 	u8 (*get_dsn)(struct net_device *dev);
104*f0166e5eSDmitry Eremin-Solenikov 	u8 (*get_bsn)(struct net_device *dev);
105*f0166e5eSDmitry Eremin-Solenikov };
106*f0166e5eSDmitry Eremin-Solenikov 
107*f0166e5eSDmitry Eremin-Solenikov static inline struct ieee802154_mlme_ops *ieee802154_mlme_ops(
108*f0166e5eSDmitry Eremin-Solenikov 		struct net_device *dev)
109*f0166e5eSDmitry Eremin-Solenikov {
110*f0166e5eSDmitry Eremin-Solenikov 	return dev->ml_priv;
111*f0166e5eSDmitry Eremin-Solenikov }
112*f0166e5eSDmitry Eremin-Solenikov 
113*f0166e5eSDmitry Eremin-Solenikov #endif
114*f0166e5eSDmitry Eremin-Solenikov 
115*f0166e5eSDmitry Eremin-Solenikov 
116