2012-05-16 00:50:20 +04:00
/*
* Copyright ( C ) 2007 - 2012 Siemens AG
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* Written by :
* Pavel Smolenskiy < pavel . smolenskiy @ gmail . com >
* Maxim Gorbachyov < maxim . gorbachev @ siemens . com >
* Dmitry Eremin - Solenikov < dbaryshkov @ gmail . com >
* Alexander Smirnov < alex . bluesman . smirnov @ gmail . com >
*/
2014-10-25 11:41:00 +04:00
# ifndef __IEEE802154_I_H
# define __IEEE802154_I_H
2012-05-16 00:50:20 +04:00
2017-03-29 18:17:31 +03:00
# include <linux/interrupt.h>
2014-05-16 19:46:40 +04:00
# include <linux/mutex.h>
2014-11-12 21:51:56 +03:00
# include <linux/hrtimer.h>
2014-11-05 22:51:17 +03:00
# include <net/cfg802154.h>
2014-05-16 19:46:37 +04:00
# include <net/mac802154.h>
2014-11-17 10:20:49 +03:00
# include <net/nl802154.h>
2014-03-31 23:37:46 +04:00
# include <net/ieee802154_netdev.h>
2014-05-16 19:46:40 +04:00
# include "llsec.h"
2012-05-16 00:50:20 +04:00
/* mac802154 device private data */
2014-10-25 19:16:35 +04:00
struct ieee802154_local {
2014-10-25 19:16:34 +04:00
struct ieee802154_hw hw ;
2014-10-28 20:21:18 +03:00
const struct ieee802154_ops * ops ;
2012-05-16 00:50:20 +04:00
/* ieee802154 phy */
struct wpan_phy * phy ;
int open_count ;
/* As in mac80211 slaves list is modified:
* 1 ) under the RTNL
* 2 ) protected by slaves_mtx ;
* 3 ) in an RCU manner
*
* So atomic readers can use any of this protection methods .
*/
2014-10-25 19:16:38 +04:00
struct list_head interfaces ;
struct mutex iflist_mtx ;
2012-05-16 00:50:20 +04:00
/* This one is used for scanning and other jobs not to be interfered
* with serial driver .
*/
2014-10-25 19:16:41 +04:00
struct workqueue_struct * workqueue ;
2012-05-16 00:50:20 +04:00
2014-11-12 21:51:56 +03:00
struct hrtimer ifs_timer ;
2014-10-28 20:21:25 +03:00
bool started ;
2015-06-24 12:36:36 +03:00
bool suspended ;
2014-10-27 19:13:30 +03:00
struct tasklet_struct tasklet ;
struct sk_buff_head skb_queue ;
2015-07-21 17:44:47 +03:00
struct sk_buff * tx_skb ;
struct work_struct tx_work ;
2012-05-16 00:50:20 +04:00
} ;
2014-10-27 19:13:30 +03:00
enum {
IEEE802154_RX_MSG = 1 ,
} ;
2014-10-28 20:21:24 +03:00
enum ieee802154_sdata_state_bits {
SDATA_STATE_RUNNING ,
} ;
2012-05-16 00:50:24 +04:00
/* Slave interface definition.
*
* Slaves represent typical network interfaces available from userspace .
* Each ieee802154 device / transceiver may have several slaves and able
* to be associated with several networks at the same time .
*/
2014-10-25 19:16:36 +04:00
struct ieee802154_sub_if_data {
2012-05-16 00:50:24 +04:00
struct list_head list ; /* the ieee802154_priv->slaves list */
2014-11-05 22:51:17 +03:00
struct wpan_dev wpan_dev ;
2014-10-25 19:16:37 +04:00
struct ieee802154_local * local ;
2012-05-16 00:50:24 +04:00
struct net_device * dev ;
2014-10-28 20:21:24 +03:00
unsigned long state ;
2014-11-05 22:51:17 +03:00
char name [ IFNAMSIZ ] ;
2012-05-16 00:50:24 +04:00
2014-05-16 19:46:40 +04:00
/* protects sec from concurrent access by netlink. access by
* encrypt / decrypt / header_create safe without additional protection .
*/
struct mutex sec_mtx ;
struct mac802154_llsec sec ;
2012-05-16 00:50:24 +04:00
} ;
2014-11-12 05:36:51 +03:00
/* utility functions/constants */
extern const void * const mac802154_wpan_phy_privid ; /* for wpan_phy privid */
2014-10-25 19:16:39 +04:00
static inline struct ieee802154_local *
hw_to_local ( struct ieee802154_hw * hw )
{
return container_of ( hw , struct ieee802154_local , hw ) ;
}
2014-10-25 19:16:40 +04:00
static inline struct ieee802154_sub_if_data *
IEEE802154_DEV_TO_SUB_IF ( const struct net_device * dev )
{
return netdev_priv ( dev ) ;
}
2014-11-17 10:20:53 +03:00
static inline struct ieee802154_sub_if_data *
IEEE802154_WPAN_DEV_TO_SUB_IF ( struct wpan_dev * wpan_dev )
{
return container_of ( wpan_dev , struct ieee802154_sub_if_data , wpan_dev ) ;
}
2014-10-28 20:21:24 +03:00
static inline bool
ieee802154_sdata_running ( struct ieee802154_sub_if_data * sdata )
{
return test_bit ( SDATA_STATE_RUNNING , & sdata - > state ) ;
}
2012-06-26 03:24:48 +04:00
extern struct ieee802154_mlme_ops mac802154_mlme_wpan ;
2012-05-16 00:50:25 +04:00
2015-07-07 08:20:43 +03:00
void ieee802154_rx ( struct ieee802154_local * local , struct sk_buff * skb ) ;
2015-07-21 17:44:47 +03:00
void ieee802154_xmit_worker ( struct work_struct * work ) ;
2014-10-26 11:37:13 +03:00
netdev_tx_t
ieee802154_monitor_start_xmit ( struct sk_buff * skb , struct net_device * dev ) ;
netdev_tx_t
ieee802154_subif_start_xmit ( struct sk_buff * skb , struct net_device * dev ) ;
2014-11-12 21:51:56 +03:00
enum hrtimer_restart ieee802154_xmit_ifs_timer ( struct hrtimer * timer ) ;
2012-05-16 00:50:22 +04:00
2012-05-16 00:50:26 +04:00
/* MIB callbacks */
2012-06-26 03:24:51 +04:00
void mac802154_dev_set_page_channel ( struct net_device * dev , u8 page , u8 chan ) ;
2012-05-16 00:50:26 +04:00
2014-05-16 19:46:42 +04:00
int mac802154_get_params ( struct net_device * dev ,
struct ieee802154_llsec_params * params ) ;
int mac802154_set_params ( struct net_device * dev ,
const struct ieee802154_llsec_params * params ,
int changed ) ;
int mac802154_add_key ( struct net_device * dev ,
const struct ieee802154_llsec_key_id * id ,
const struct ieee802154_llsec_key * key ) ;
int mac802154_del_key ( struct net_device * dev ,
const struct ieee802154_llsec_key_id * id ) ;
int mac802154_add_dev ( struct net_device * dev ,
const struct ieee802154_llsec_device * llsec_dev ) ;
int mac802154_del_dev ( struct net_device * dev , __le64 dev_addr ) ;
int mac802154_add_devkey ( struct net_device * dev ,
__le64 device_addr ,
const struct ieee802154_llsec_device_key * key ) ;
int mac802154_del_devkey ( struct net_device * dev ,
__le64 device_addr ,
const struct ieee802154_llsec_device_key * key ) ;
int mac802154_add_seclevel ( struct net_device * dev ,
const struct ieee802154_llsec_seclevel * sl ) ;
int mac802154_del_seclevel ( struct net_device * dev ,
const struct ieee802154_llsec_seclevel * sl ) ;
void mac802154_lock_table ( struct net_device * dev ) ;
void mac802154_get_table ( struct net_device * dev ,
struct ieee802154_llsec_table * * t ) ;
void mac802154_unlock_table ( struct net_device * dev ) ;
2015-06-21 17:45:20 +03:00
int mac802154_wpan_update_llsec ( struct net_device * dev ) ;
2014-11-12 05:36:53 +03:00
/* interface handling */
int ieee802154_iface_init ( void ) ;
void ieee802154_iface_exit ( void ) ;
2014-11-05 22:51:14 +03:00
void ieee802154_if_remove ( struct ieee802154_sub_if_data * sdata ) ;
2014-11-05 22:51:15 +03:00
struct net_device *
ieee802154_if_add ( struct ieee802154_local * local , const char * name ,
2015-04-30 18:44:57 +03:00
unsigned char name_assign_type , enum nl802154_iftype type ,
__le64 extended_addr ) ;
2014-11-12 05:36:48 +03:00
void ieee802154_remove_interfaces ( struct ieee802154_local * local ) ;
2015-06-24 12:36:34 +03:00
void ieee802154_stop_device ( struct ieee802154_local * local ) ;
2014-11-02 06:18:38 +03:00
2014-10-25 11:41:00 +04:00
# endif /* __IEEE802154_I_H */