linux/include/net/mac802154.h
<<
>>
Prefs
   1/*
   2 * IEEE802.15.4-2003 specification
   3 *
   4 * Copyright (C) 2007-2012 Siemens AG
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2
   8 * as published by the Free Software Foundation.
   9 *
  10 * This program is distributed in the hope that it will be useful,
  11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 * GNU General Public License for more details.
  14 *
  15 */
  16#ifndef NET_MAC802154_H
  17#define NET_MAC802154_H
  18
  19#include <net/af_ieee802154.h>
  20#include <linux/ieee802154.h>
  21#include <linux/skbuff.h>
  22#include <linux/unaligned/memmove.h>
  23
  24#include <net/cfg802154.h>
  25
  26/* General MAC frame format:
  27 *  2 bytes: Frame Control
  28 *  1 byte:  Sequence Number
  29 * 20 bytes: Addressing fields
  30 * 14 bytes: Auxiliary Security Header
  31 */
  32#define MAC802154_FRAME_HARD_HEADER_LEN         (2 + 1 + 20 + 14)
  33
  34/* The following flags are used to indicate changed address settings from
  35 * the stack to the hardware.
  36 */
  37
  38/* indicates that the Short Address changed */
  39#define IEEE802154_AFILT_SADDR_CHANGED          0x00000001
  40/* indicates that the IEEE Address changed */
  41#define IEEE802154_AFILT_IEEEADDR_CHANGED       0x00000002
  42/* indicates that the PAN ID changed */
  43#define IEEE802154_AFILT_PANID_CHANGED          0x00000004
  44/* indicates that PAN Coordinator status changed */
  45#define IEEE802154_AFILT_PANC_CHANGED           0x00000008
  46
  47struct ieee802154_hw_addr_filt {
  48        __le16  pan_id;         /* Each independent PAN selects a unique
  49                                 * identifier. This PAN id allows communication
  50                                 * between devices within a network using short
  51                                 * addresses and enables transmissions between
  52                                 * devices across independent networks.
  53                                 */
  54        __le16  short_addr;
  55        __le64  ieee_addr;
  56        u8      pan_coord;
  57};
  58
  59struct ieee802154_vif {
  60        int type;
  61
  62        /* must be last */
  63        u8 drv_priv[0] __aligned(sizeof(void *));
  64};
  65
  66struct ieee802154_hw {
  67        /* filled by the driver */
  68        int     extra_tx_headroom;
  69        u32     flags;
  70        struct  device *parent;
  71
  72        /* filled by mac802154 core */
  73        struct  ieee802154_hw_addr_filt hw_filt;
  74        void    *priv;
  75        struct  wpan_phy *phy;
  76        size_t vif_data_size;
  77};
  78
  79/* Checksum is in hardware and is omitted from a packet
  80 *
  81 * These following flags are used to indicate hardware capabilities to
  82 * the stack. Generally, flags here should have their meaning
  83 * done in a way that the simplest hardware doesn't need setting
  84 * any particular flags. There are some exceptions to this rule,
  85 * however, so you are advised to review these flags carefully.
  86 */
  87
  88/* Indicates that xmitter will add FCS on it's own. */
  89#define IEEE802154_HW_TX_OMIT_CKSUM     0x00000001
  90/* Indicates that receiver will autorespond with ACK frames. */
  91#define IEEE802154_HW_AACK              0x00000002
  92/* Indicates that transceiver will support transmit power setting. */
  93#define IEEE802154_HW_TXPOWER           0x00000004
  94/* Indicates that transceiver will support listen before transmit. */
  95#define IEEE802154_HW_LBT               0x00000008
  96/* Indicates that transceiver will support cca mode setting. */
  97#define IEEE802154_HW_CCA_MODE          0x00000010
  98/* Indicates that transceiver will support cca ed level setting. */
  99#define IEEE802154_HW_CCA_ED_LEVEL      0x00000020
 100/* Indicates that transceiver will support csma (max_be, min_be, csma retries)
 101 * settings. */
 102#define IEEE802154_HW_CSMA_PARAMS       0x00000040
 103/* Indicates that transceiver will support ARET frame retries setting. */
 104#define IEEE802154_HW_FRAME_RETRIES     0x00000080
 105/* Indicates that transceiver will support hardware address filter setting. */
 106#define IEEE802154_HW_AFILT             0x00000100
 107/* Indicates that transceiver will support promiscuous mode setting. */
 108#define IEEE802154_HW_PROMISCUOUS       0x00000200
 109/* Indicates that receiver omits FCS. */
 110#define IEEE802154_HW_RX_OMIT_CKSUM     0x00000400
 111/* Indicates that receiver will not filter frames with bad checksum. */
 112#define IEEE802154_HW_RX_DROP_BAD_CKSUM 0x00000800
 113
 114/* Indicates that receiver omits FCS and xmitter will add FCS on it's own. */
 115#define IEEE802154_HW_OMIT_CKSUM        (IEEE802154_HW_TX_OMIT_CKSUM | \
 116                                         IEEE802154_HW_RX_OMIT_CKSUM)
 117
 118/* This groups the most common CSMA support fields into one. */
 119#define IEEE802154_HW_CSMA              (IEEE802154_HW_CCA_MODE | \
 120                                         IEEE802154_HW_CCA_ED_LEVEL | \
 121                                         IEEE802154_HW_CSMA_PARAMS)
 122
 123/* This groups the most common ARET support fields into one. */
 124#define IEEE802154_HW_ARET              (IEEE802154_HW_CSMA | \
 125                                         IEEE802154_HW_FRAME_RETRIES)
 126
 127/* struct ieee802154_ops - callbacks from mac802154 to the driver
 128 *
 129 * This structure contains various callbacks that the driver may
 130 * handle or, in some cases, must handle, for example to transmit
 131 * a frame.
 132 *
 133 * start: Handler that 802.15.4 module calls for device initialization.
 134 *        This function is called before the first interface is attached.
 135 *
 136 * stop:  Handler that 802.15.4 module calls for device cleanup.
 137 *        This function is called after the last interface is removed.
 138 *
 139 * xmit_sync:
 140 *        Handler that 802.15.4 module calls for each transmitted frame.
 141 *        skb cntains the buffer starting from the IEEE 802.15.4 header.
 142 *        The low-level driver should send the frame based on available
 143 *        configuration. This is called by a workqueue and useful for
 144 *        synchronous 802.15.4 drivers.
 145 *        This function should return zero or negative errno.
 146 *
 147 *        WARNING:
 148 *        This will be deprecated soon. We don't accept synced xmit callbacks
 149 *        drivers anymore.
 150 *
 151 * xmit_async:
 152 *        Handler that 802.15.4 module calls for each transmitted frame.
 153 *        skb cntains the buffer starting from the IEEE 802.15.4 header.
 154 *        The low-level driver should send the frame based on available
 155 *        configuration.
 156 *        This function should return zero or negative errno.
 157 *
 158 * ed:    Handler that 802.15.4 module calls for Energy Detection.
 159 *        This function should place the value for detected energy
 160 *        (usually device-dependant) in the level pointer and return
 161 *        either zero or negative errno. Called with pib_lock held.
 162 *
 163 * set_channel:
 164 *        Set radio for listening on specific channel.
 165 *        Set the device for listening on specified channel.
 166 *        Returns either zero, or negative errno. Called with pib_lock held.
 167 *
 168 * set_hw_addr_filt:
 169 *        Set radio for listening on specific address.
 170 *        Set the device for listening on specified address.
 171 *        Returns either zero, or negative errno.
 172 *
 173 * set_txpower:
 174 *        Set radio transmit power in dB. Called with pib_lock held.
 175 *        Returns either zero, or negative errno.
 176 *
 177 * set_lbt
 178 *        Enables or disables listen before talk on the device. Called with
 179 *        pib_lock held.
 180 *        Returns either zero, or negative errno.
 181 *
 182 * set_cca_mode
 183 *        Sets the CCA mode used by the device. Called with pib_lock held.
 184 *        Returns either zero, or negative errno.
 185 *
 186 * set_cca_ed_level
 187 *        Sets the CCA energy detection threshold in dBm. Called with pib_lock
 188 *        held.
 189 *        Returns either zero, or negative errno.
 190 *
 191 * set_csma_params
 192 *        Sets the CSMA parameter set for the PHY. Called with pib_lock held.
 193 *        Returns either zero, or negative errno.
 194 *
 195 * set_frame_retries
 196 *        Sets the retransmission attempt limit. Called with pib_lock held.
 197 *        Returns either zero, or negative errno.
 198 *
 199 * set_promiscuous_mode
 200 *        Enables or disable promiscuous mode.
 201 */
 202struct ieee802154_ops {
 203        struct module   *owner;
 204        int             (*start)(struct ieee802154_hw *hw);
 205        void            (*stop)(struct ieee802154_hw *hw);
 206        int             (*xmit_sync)(struct ieee802154_hw *hw,
 207                                     struct sk_buff *skb);
 208        int             (*xmit_async)(struct ieee802154_hw *hw,
 209                                      struct sk_buff *skb);
 210        int             (*ed)(struct ieee802154_hw *hw, u8 *level);
 211        int             (*set_channel)(struct ieee802154_hw *hw, u8 page,
 212                                       u8 channel);
 213        int             (*set_hw_addr_filt)(struct ieee802154_hw *hw,
 214                                            struct ieee802154_hw_addr_filt *filt,
 215                                            unsigned long changed);
 216        int             (*set_txpower)(struct ieee802154_hw *hw, s8 dbm);
 217        int             (*set_lbt)(struct ieee802154_hw *hw, bool on);
 218        int             (*set_cca_mode)(struct ieee802154_hw *hw,
 219                                        const struct wpan_phy_cca *cca);
 220        int             (*set_cca_ed_level)(struct ieee802154_hw *hw,
 221                                            s32 level);
 222        int             (*set_csma_params)(struct ieee802154_hw *hw,
 223                                           u8 min_be, u8 max_be, u8 retries);
 224        int             (*set_frame_retries)(struct ieee802154_hw *hw,
 225                                             s8 retries);
 226        int             (*set_promiscuous_mode)(struct ieee802154_hw *hw,
 227                                                const bool on);
 228};
 229
 230/**
 231 * ieee802154_be64_to_le64 - copies and convert be64 to le64
 232 * @le64_dst: le64 destination pointer
 233 * @be64_src: be64 source pointer
 234 */
 235static inline void ieee802154_be64_to_le64(void *le64_dst, const void *be64_src)
 236{
 237        __put_unaligned_memmove64(swab64p(be64_src), le64_dst);
 238}
 239
 240/**
 241 * ieee802154_le64_to_be64 - copies and convert le64 to be64
 242 * @be64_dst: be64 destination pointer
 243 * @le64_src: le64 source pointer
 244 */
 245static inline void ieee802154_le64_to_be64(void *be64_dst, const void *le64_src)
 246{
 247        __put_unaligned_memmove64(swab64p(le64_src), be64_dst);
 248}
 249
 250/**
 251 * ieee802154_alloc_hw - Allocate a new hardware device
 252 *
 253 * This must be called once for each hardware device. The returned pointer
 254 * must be used to refer to this device when calling other functions.
 255 * mac802154 allocates a private data area for the driver pointed to by
 256 * @priv in &struct ieee802154_hw, the size of this area is given as
 257 * @priv_data_len.
 258 *
 259 * @priv_data_len: length of private data
 260 * @ops: callbacks for this device
 261 *
 262 * Return: A pointer to the new hardware device, or %NULL on error.
 263 */
 264struct ieee802154_hw *
 265ieee802154_alloc_hw(size_t priv_data_len, const struct ieee802154_ops *ops);
 266
 267/**
 268 * ieee802154_free_hw - free hardware descriptor
 269 *
 270 * This function frees everything that was allocated, including the
 271 * private data for the driver. You must call ieee802154_unregister_hw()
 272 * before calling this function.
 273 *
 274 * @hw: the hardware to free
 275 */
 276void ieee802154_free_hw(struct ieee802154_hw *hw);
 277
 278/**
 279 * ieee802154_register_hw - Register hardware device
 280 *
 281 * You must call this function before any other functions in
 282 * mac802154. Note that before a hardware can be registered, you
 283 * need to fill the contained wpan_phy's information.
 284 *
 285 * @hw: the device to register as returned by ieee802154_alloc_hw()
 286 *
 287 * Return: 0 on success. An error code otherwise.
 288 */
 289int ieee802154_register_hw(struct ieee802154_hw *hw);
 290
 291/**
 292 * ieee802154_unregister_hw - Unregister a hardware device
 293 *
 294 * This function instructs mac802154 to free allocated resources
 295 * and unregister netdevices from the networking subsystem.
 296 *
 297 * @hw: the hardware to unregister
 298 */
 299void ieee802154_unregister_hw(struct ieee802154_hw *hw);
 300
 301/**
 302 * ieee802154_rx - receive frame
 303 *
 304 * Use this function to hand received frames to mac802154. The receive
 305 * buffer in @skb must start with an IEEE 802.15.4 header. In case of a
 306 * paged @skb is used, the driver is recommended to put the ieee802154
 307 * header of the frame on the linear part of the @skb to avoid memory
 308 * allocation and/or memcpy by the stack.
 309 *
 310 * This function may not be called in IRQ context. Calls to this function
 311 * for a single hardware must be synchronized against each other.
 312 *
 313 * @hw: the hardware this frame came in on
 314 * @skb: the buffer to receive, owned by mac802154 after this call
 315 */
 316void ieee802154_rx(struct ieee802154_hw *hw, struct sk_buff *skb);
 317
 318/**
 319 * ieee802154_rx_irqsafe - receive frame
 320 *
 321 * Like ieee802154_rx() but can be called in IRQ context
 322 * (internally defers to a tasklet.)
 323 *
 324 * @hw: the hardware this frame came in on
 325 * @skb: the buffer to receive, owned by mac802154 after this call
 326 * @lqi: link quality indicator
 327 */
 328void ieee802154_rx_irqsafe(struct ieee802154_hw *hw, struct sk_buff *skb,
 329                           u8 lqi);
 330/**
 331 * ieee802154_wake_queue - wake ieee802154 queue
 332 * @hw: pointer as obtained from ieee802154_alloc_hw().
 333 *
 334 * Drivers should use this function instead of netif_wake_queue.
 335 */
 336void ieee802154_wake_queue(struct ieee802154_hw *hw);
 337
 338/**
 339 * ieee802154_stop_queue - stop ieee802154 queue
 340 * @hw: pointer as obtained from ieee802154_alloc_hw().
 341 *
 342 * Drivers should use this function instead of netif_stop_queue.
 343 */
 344void ieee802154_stop_queue(struct ieee802154_hw *hw);
 345
 346/**
 347 * ieee802154_xmit_complete - frame transmission complete
 348 *
 349 * @hw: pointer as obtained from ieee802154_alloc_hw().
 350 * @skb: buffer for transmission
 351 * @ifs_handling: indicate interframe space handling
 352 */
 353void ieee802154_xmit_complete(struct ieee802154_hw *hw, struct sk_buff *skb,
 354                              bool ifs_handling);
 355
 356#endif /* NET_MAC802154_H */
 357