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