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