11010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com/* 21010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * Copyright (C) 2007-2012 Siemens AG 31010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * 41010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * This program is free software; you can redistribute it and/or modify 51010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * it under the terms of the GNU General Public License version 2 61010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * as published by the Free Software Foundation. 71010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * 81010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * This program is distributed in the hope that it will be useful, 91010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * but WITHOUT ANY WARRANTY; without even the implied warranty of 101010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 111010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * GNU General Public License for more details. 121010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * 131010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * You should have received a copy of the GNU General Public License along 141010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * with this program; if not, write to the Free Software Foundation, Inc., 151010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 161010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * 171010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * Written by: 181010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * Pavel Smolenskiy <pavel.smolenskiy@gmail.com> 191010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * Maxim Gorbachyov <maxim.gorbachev@siemens.com> 201010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> 211010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * Alexander Smirnov <alex.bluesman.smirnov@gmail.com> 221010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com */ 231010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com#ifndef MAC802154_H 241010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com#define MAC802154_H 251010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com 26f30be4d53cada48598dab0983866ae4b16af46dcPhoebe Buckheister#include <linux/mutex.h> 275d637d5aabd85132bd85779677d8acb708e0ed90Phoebe Buckheister#include <net/mac802154.h> 28e462ded699aa2cca04b68fbf203ea4675d4c44d4Phoebe Buckheister#include <net/ieee802154_netdev.h> 29e462ded699aa2cca04b68fbf203ea4675d4c44d4Phoebe Buckheister 30f30be4d53cada48598dab0983866ae4b16af46dcPhoebe Buckheister#include "llsec.h" 31f30be4d53cada48598dab0983866ae4b16af46dcPhoebe Buckheister 321010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com/* mac802154 device private data */ 331010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.comstruct mac802154_priv { 341010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com struct ieee802154_dev hw; 351010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com struct ieee802154_ops *ops; 361010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com 371010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com /* ieee802154 phy */ 381010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com struct wpan_phy *phy; 391010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com 401010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com int open_count; 411010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com 421010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com /* As in mac80211 slaves list is modified: 431010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * 1) under the RTNL 441010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * 2) protected by slaves_mtx; 451010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * 3) in an RCU manner 461010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * 471010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * So atomic readers can use any of this protection methods. 481010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com */ 491010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com struct list_head slaves; 501010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com struct mutex slaves_mtx; 511010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com 521010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com /* This one is used for scanning and other jobs not to be interfered 531010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * with serial driver. 541010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com */ 551010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com struct workqueue_struct *dev_workqueue; 561010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com 571010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com /* SoftMAC device is registered and running. One can add subinterfaces. 581010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * This flag should be modified under slaves_mtx and RTNL, so you can 591010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com * read them using any of protection methods. 601010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com */ 611010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com bool running; 621010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com}; 631010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com 641010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com#define MAC802154_DEVICE_STOPPED 0x00 651010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com#define MAC802154_DEVICE_RUN 0x01 661010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com 674d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com/* Slave interface definition. 684d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com * 694d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com * Slaves represent typical network interfaces available from userspace. 704d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com * Each ieee802154 device/transceiver may have several slaves and able 714d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com * to be associated with several networks at the same time. 724d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com */ 734d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.comstruct mac802154_sub_if_data { 744d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com struct list_head list; /* the ieee802154_priv->slaves list */ 754d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com 764d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com struct mac802154_priv *hw; 774d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com struct net_device *dev; 784d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com 794d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com int type; 80336908f6d73ca297bd46948eb5d04d2020a88606Phoebe Buckheister bool running; 814d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com 824d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com spinlock_t mib_lock; 834d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com 844d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com __le16 pan_id; 854d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com __le16 short_addr; 86b70ab2e87f17176d18f67ef331064441a032b5f3Phoebe Buckheister __le64 extended_addr; 874d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com 884d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com u8 chan; 894d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com u8 page; 904d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com 91e462ded699aa2cca04b68fbf203ea4675d4c44d4Phoebe Buckheister struct ieee802154_mac_params mac_params; 92e462ded699aa2cca04b68fbf203ea4675d4c44d4Phoebe Buckheister 934d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com /* MAC BSN field */ 944d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com u8 bsn; 954d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com /* MAC DSN field */ 964d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com u8 dsn; 97f30be4d53cada48598dab0983866ae4b16af46dcPhoebe Buckheister 98f30be4d53cada48598dab0983866ae4b16af46dcPhoebe Buckheister /* protects sec from concurrent access by netlink. access by 99f30be4d53cada48598dab0983866ae4b16af46dcPhoebe Buckheister * encrypt/decrypt/header_create safe without additional protection. 100f30be4d53cada48598dab0983866ae4b16af46dcPhoebe Buckheister */ 101f30be4d53cada48598dab0983866ae4b16af46dcPhoebe Buckheister struct mutex sec_mtx; 102f30be4d53cada48598dab0983866ae4b16af46dcPhoebe Buckheister 103f30be4d53cada48598dab0983866ae4b16af46dcPhoebe Buckheister struct mac802154_llsec sec; 1044d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com}; 1054d23c9cc075e778584aa74da402f6bf968ad92b7alex.bluesman.smirnov@gmail.com 1061010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com#define mac802154_to_priv(_hw) container_of(_hw, struct mac802154_priv, hw) 1071010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com 1082c1bbbffa0b644fab4f91878cde0c2e8f52e2dccChen Gang#define MAC802154_CHAN_NONE 0xff /* No channel is assigned */ 1090606069d9ef538687957d41ed6387d665af7a643alex.bluesman.smirnov@gmail.com 1106e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.comextern struct ieee802154_reduced_mlme_ops mac802154_mlme_reduced; 11132bad7e30f113a8a5cebe4704bf6519ab4383e1balex.bluesman.smirnov@gmail.comextern struct ieee802154_mlme_ops mac802154_mlme_wpan; 1126e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com 11362610ad21870a8cf842d4a48f07c3a964e1d2622alex.bluesman.smirnov@gmail.comint mac802154_slave_open(struct net_device *dev); 11462610ad21870a8cf842d4a48f07c3a964e1d2622alex.bluesman.smirnov@gmail.comint mac802154_slave_close(struct net_device *dev); 11562610ad21870a8cf842d4a48f07c3a964e1d2622alex.bluesman.smirnov@gmail.com 1160606069d9ef538687957d41ed6387d665af7a643alex.bluesman.smirnov@gmail.comvoid mac802154_monitors_rx(struct mac802154_priv *priv, struct sk_buff *skb); 1170606069d9ef538687957d41ed6387d665af7a643alex.bluesman.smirnov@gmail.comvoid mac802154_monitor_setup(struct net_device *dev); 1180606069d9ef538687957d41ed6387d665af7a643alex.bluesman.smirnov@gmail.com 11932bad7e30f113a8a5cebe4704bf6519ab4383e1balex.bluesman.smirnov@gmail.comvoid mac802154_wpans_rx(struct mac802154_priv *priv, struct sk_buff *skb); 12032bad7e30f113a8a5cebe4704bf6519ab4383e1balex.bluesman.smirnov@gmail.comvoid mac802154_wpan_setup(struct net_device *dev); 12132bad7e30f113a8a5cebe4704bf6519ab4383e1balex.bluesman.smirnov@gmail.com 1225b641ebeec348761c9ebac9454c672d4d2d3ef91alex.bluesman.smirnov@gmail.comnetdev_tx_t mac802154_tx(struct mac802154_priv *priv, struct sk_buff *skb, 1235b641ebeec348761c9ebac9454c672d4d2d3ef91alex.bluesman.smirnov@gmail.com u8 page, u8 chan); 1245b641ebeec348761c9ebac9454c672d4d2d3ef91alex.bluesman.smirnov@gmail.com 125ef2486f5538b886ad4f0d1ac0857b518291b48f7alex.bluesman.smirnov@gmail.com/* MIB callbacks */ 126b70ab2e87f17176d18f67ef331064441a032b5f3Phoebe Buckheistervoid mac802154_dev_set_short_addr(struct net_device *dev, __le16 val); 127b70ab2e87f17176d18f67ef331064441a032b5f3Phoebe Buckheister__le16 mac802154_dev_get_short_addr(const struct net_device *dev); 128ef2486f5538b886ad4f0d1ac0857b518291b48f7alex.bluesman.smirnov@gmail.comvoid mac802154_dev_set_ieee_addr(struct net_device *dev); 129b70ab2e87f17176d18f67ef331064441a032b5f3Phoebe Buckheister__le16 mac802154_dev_get_pan_id(const struct net_device *dev); 130b70ab2e87f17176d18f67ef331064441a032b5f3Phoebe Buckheistervoid mac802154_dev_set_pan_id(struct net_device *dev, __le16 val); 13166b69d4d7fe3026a4add368b72905b4d7878c320alex.bluesman.smirnov@gmail.comvoid mac802154_dev_set_page_channel(struct net_device *dev, u8 page, u8 chan); 1320483546a3de329cad7705d42962edb09a28794c6Tony Cheneauu8 mac802154_dev_get_dsn(const struct net_device *dev); 133ef2486f5538b886ad4f0d1ac0857b518291b48f7alex.bluesman.smirnov@gmail.com 134e462ded699aa2cca04b68fbf203ea4675d4c44d4Phoebe Buckheisterint mac802154_set_mac_params(struct net_device *dev, 135e462ded699aa2cca04b68fbf203ea4675d4c44d4Phoebe Buckheister const struct ieee802154_mac_params *params); 136e462ded699aa2cca04b68fbf203ea4675d4c44d4Phoebe Buckheistervoid mac802154_get_mac_params(struct net_device *dev, 137e462ded699aa2cca04b68fbf203ea4675d4c44d4Phoebe Buckheister struct ieee802154_mac_params *params); 138e462ded699aa2cca04b68fbf203ea4675d4c44d4Phoebe Buckheister 13929e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheisterint mac802154_get_params(struct net_device *dev, 14029e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister struct ieee802154_llsec_params *params); 14129e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheisterint mac802154_set_params(struct net_device *dev, 14229e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister const struct ieee802154_llsec_params *params, 14329e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister int changed); 14429e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister 14529e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheisterint mac802154_add_key(struct net_device *dev, 14629e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister const struct ieee802154_llsec_key_id *id, 14729e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister const struct ieee802154_llsec_key *key); 14829e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheisterint mac802154_del_key(struct net_device *dev, 14929e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister const struct ieee802154_llsec_key_id *id); 15029e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister 15129e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheisterint mac802154_add_dev(struct net_device *dev, 15229e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister const struct ieee802154_llsec_device *llsec_dev); 15329e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheisterint mac802154_del_dev(struct net_device *dev, __le64 dev_addr); 15429e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister 15529e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheisterint mac802154_add_devkey(struct net_device *dev, 15629e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister __le64 device_addr, 15729e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister const struct ieee802154_llsec_device_key *key); 15829e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheisterint mac802154_del_devkey(struct net_device *dev, 15929e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister __le64 device_addr, 16029e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister const struct ieee802154_llsec_device_key *key); 16129e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister 16229e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheisterint mac802154_add_seclevel(struct net_device *dev, 16329e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister const struct ieee802154_llsec_seclevel *sl); 16429e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheisterint mac802154_del_seclevel(struct net_device *dev, 16529e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister const struct ieee802154_llsec_seclevel *sl); 16629e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister 16729e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheistervoid mac802154_lock_table(struct net_device *dev); 16829e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheistervoid mac802154_get_table(struct net_device *dev, 16929e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister struct ieee802154_llsec_table **t); 17029e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheistervoid mac802154_unlock_table(struct net_device *dev); 17129e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister 1721010f540181b00c7013eeb04d1bf8aedd5a56835alex.bluesman.smirnov@gmail.com#endif /* MAC802154_H */ 173