netopt.h 17.9 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518
/*
 * Copyright (C) 2015 Freie Universität Berlin
 *               2015 Kaspar Schleiser <kaspar@schleiser.de>
 *
 * This file is subject to the terms and conditions of the GNU Lesser
 * General Public License v2.1. See the file LICENSE in the top level
 * directory for more details.
 */

/**
 * @defgroup    net_netopt   Configuration options for network APIs
 * @ingroup     net
 * @brief       List of available configuration options for the
 *              @ref net_gnrc_netdev and the @ref net_gnrc_netapi
 * @{
 *
 * @file
 * @brief       Definition of global configuration options
 *
 * @author      Hauke Petersen <hauke.petersen@fu-berlin.de>
 * @author      Oliver Hahm <oliver.hahm@inria.fr>
 * @author      Kaspar Schleiser <kaspar@schleiser.de>
 */

#ifndef NET_NETOPT_H
#define NET_NETOPT_H

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief   Global list of configuration options available throughout the
 *          network stack, e.g. by netdev and netapi
 */
typedef enum {
    NETOPT_CHANNEL,             /**< get/set channel as uint16_t in host
                                 *   byte order */
    NETOPT_IS_CHANNEL_CLR,      /**< check if channel is clear */
    NETOPT_ADDRESS,             /**< get/set address in host byte order */

    /**
     * @brief    get/set long address in host byte order
     *
     * Examples for this include the EUI-64 in IEEE 802.15.4
     */
    NETOPT_ADDRESS_LONG,
    NETOPT_ADDR_LEN,            /**< get the default address length a
                                 *   network device expects as uint16_t in
                                 *   host byte order */
    NETOPT_SRC_LEN,             /**< get/set the address length to choose
                                 *   for the network device's source address
                                 *   as uint16_t in host byte order */
    /**
     * @brief    get/set the network ID as uint16_t in host byte order
     *
     * Examples for this include the PAN ID in IEEE 802.15.4
     */
    NETOPT_NID,

    /**
     * @brief   get/set hop limit as uint8_t
     */
    NETOPT_HOP_LIMIT,

    /**
     * @brief   get the IPv6 interface identifier of a network interface as
     *          eui64_t.
     *
     * @see <a href="https://tools.ietf.org/html/rfc4291#section-2.5.1">
     *          RFC 4291, section 2.5.1
     *      </a>
     *
     * The generation of the interface identifier is dependent on the link-layer.
     * Please refer to the appropriate IPv6 over `<link>` specification for
     * further implementation details (such as
     * <a href="https://tools.ietf.org/html/rfc2464">RFC 2464</a> or
     * <a href="https://tools.ietf.org/html/rfc4944">RFC 4944</a>).
     */
    NETOPT_IPV6_IID,

    /**
     * @brief   get IPv6 addresses of an interface as array of @ref ipv6_addr_t
     *          or add an IPv6 address as @ref ipv6_addr_t to an  interface
     *
     * When adding an IPv6 address to a GNRC interface using
     * @ref GNRC_NETAPI_MSG_TYPE_SET, the gnrc_netapi_opt_t::context field can
     * be used to pass the prefix length (8 MSB) and some flags (8 LSB)
     * according to @ref net_gnrc_netif2_ipv6_addrs_flags. The address is however always
     * considered to be manually added.
     * When getting the option you can pass an array of @ref ipv6_addr_t of any
     * length greater than 0 to the getter. The array will be filled up to to
     * its maximum and the remaining addresses on the interface will be ignored
     */
    NETOPT_IPV6_ADDR,
    /**
     * @brief   Removes an IPv6 address as @ref ipv6_addr_t from an interface
     */
    NETOPT_IPV6_ADDR_REMOVE,
    /**
     * @brief   get the flags to the addresses returned by @ref NETOPT_IPV6_ADDR
     *          as array of uint8_t
     *
     * The information contained in the array is very specific to the
     * interface's API. For GNRC e.g. the values are according to
     * @ref net_gnrc_netif2_ipv6_addrs_flags.
     */
    NETOPT_IPV6_ADDR_FLAGS,
    /**
     * @brief   get IPv6 multicast groups of an interface as array of
     *          @ref ipv6_addr_t or join an IPv6 multicast group as
     *          @ref ipv6_addr_t on an interface
     *
     * When adding an IPv6 address to a GNRC interface using
     * @ref GNRC_NETAPI_MSG_TYPE_SET, the gnrc_netapi_opt_t::context field can
     * be used to pass the prefix length (8 MSB) and some flags (8 LSB)
     * according to @ref net_gnrc_netif2_ipv6_addrs_flags. The address is however always
     * considered to be manually added.
     * When getting the option you can pass an array of @ref ipv6_addr_t of any
     * length greater than 0 to the getter. The array will be filled up to to
     * its maximum and the remaining addresses on the interface will be ignored
     */
    NETOPT_IPV6_GROUP,
    /**
     * @brief   Leaves an IPv6 multicast group as @ref ipv6_addr_t on an
     *          interface
     */
    NETOPT_IPV6_GROUP_LEAVE,
    NETOPT_IPV6_FORWARDING,     /**< en/disable IPv6 forwarding or read the
                                 *   current state */
    NETOPT_IPV6_SND_RTR_ADV,    /**< en/disable sending of IPv6 router
                                 *   advertisements or read the current state */
    NETOPT_TX_POWER,            /**< get/set the output power for radio
                                 *   devices in dBm as int16_t in host byte
                                 *   order */
    NETOPT_MAX_PACKET_SIZE,     /**< get/set the maximum packet size a
                                 *   network module can handle as uint16_t
                                 *   in host byte order */
    /**
     * @brief en/disable preloading or read the current state.
     *
     * Preload using gnrc_netdev_driver_t::send_data() or gnrc_netapi_send()
     * respectively, send setting state to @ref NETOPT_STATE_TX
     */
    NETOPT_PRELOADING,
    NETOPT_PROMISCUOUSMODE,     /**< en/disable promiscuous mode or read
                                 *   the current state */
    NETOPT_AUTOACK,             /**< en/disable link layer auto ACKs or read
                                 *   the current state */
    NETOPT_ACK_REQ,             /**< en/disable acknowledgement requests or
                                 *   read the current state */
    NETOPT_RETRANS,             /**< get/set the maximum number of
                                 *   retransmissions. */
    NETOPT_PROTO,               /**< get/set the protocol for the layer
                                 *   as type gnrc_nettype_t. */
    NETOPT_STATE,               /**< get/set the state of network devices as
                                 *   type netopt_state_t */
    NETOPT_RAWMODE,             /**< en/disable the pre-processing of data
                                 *   in a network device driver as type
                                 *   gnrc_nettype_t */
    /**
     * @brief en/disable the interrupt at reception start.
     *
     * It is mostly triggered after the preamble is correctly received
     *
     * @note not all transceivers may support this interrupt
     */
    NETOPT_RX_START_IRQ,

    /**
     * @brief en/disable the interrupt after packet reception.
     *
     * This interrupt is triggered after a complete packet is received.
     *
     * @note in case a transceiver does not support this interrupt, the event
     *       may be triggered by the driver
     */
    NETOPT_RX_END_IRQ,

    /**
     * @brief en/disable the interrupt right in the beginning of transmission.
     *
     * This interrupt is triggered when the transceiver starts to send out the
     * packet.
     *
     * @note in case a transceiver does not support this interrupt, the event
     *       may be triggered by the driver
     */
    NETOPT_TX_START_IRQ,

    /**
     * @brief en/disable the interrupt after packet transmission.
     *
     * This interrupt is triggered when the full packet is transmitted.
     *
     * @note not all transceivers may support this interrupt
     */
    NETOPT_TX_END_IRQ,

    /**
     * @brief Check automatically before sending if the channel is clear.
     *
     * This may be a hardware feature of the given transceiver, or might be
     * otherwise implemented in software. If the device supports CSMA this
     * option will enable CSMA with a certain set of parameters to emulate the
     * desired behaviour.
     *
     * @note Be sure not to set NETOPT_CSMA simultaneously.
     *
     * TODO: How to get feedback?
     */
    NETOPT_AUTOCCA,

    /**
     * @brief en/disable CSMA/CA support
     *
     * If the device supports CSMA in hardware, this option enables it with
     * default parameters. For further configuration refer to the other
     * NETOPT_CSMA_* options.
     */
    NETOPT_CSMA,

    /**
     * @brief get/set the maximum number of CSMA retries
     *
     * (uint8_t)
     * The maximum number of backoffs the CSMA-CA algorithm will attempt before
     * declaring a channel access failure. Named macMaxCsmaBackoffs in
     * IEEE Std 802.15.4-2015.
     *
     * 802.15.4 default: 4
     */
    NETOPT_CSMA_RETRIES,

    /**
     * @brief get/set the maximum backoff exponent for the CSMA-CA algorithm
     *
     * (uint8_t) Named macMaxBE in IEEE Std 802.15.4-2015.
     *
     * 802.15.4 default: 5
     */
    NETOPT_CSMA_MAXBE,

    /**
     * @brief get/set the minimum backoff exponent for the CSMA-CA algorithm
     *
     * (uint8_t) Named macMinBE in IEEE Std 802.15.4-2015.
     *
     * 802.15.4 default: 3
     */
    NETOPT_CSMA_MINBE,

    /**
     * @brief en/disable blocking of radio sleep when running a duty cycling MAC layer
     *
     * (netopt_enable_t) Enabling this option tells the MAC layer to never put
     * the radio to sleep. Useful in gateways and routers not running on
     * batteries to improve responsiveness and allow battery powered nodes on
     * the same network to sleep more often.
     */
    NETOPT_MAC_NO_SLEEP,

    /**
     * @brief read-only check for a wired interface.
     *
     * If the interface is wireless this function will return -ENOTSUP, a
     * positive value otherwise.
     *
     * @note Setting this option will always return -ENOTSUP.
     */
    NETOPT_IS_WIRED,

    /**
     * @brief get a device's "type", e.g., ethernet, 802.15.4, ...
     */
    NETOPT_DEVICE_TYPE,

    /**
     * @brief get/set the channel page as defined by IEEE 802.15.4
     */
    NETOPT_CHANNEL_PAGE,

    /**
     * @brief get/set the CCA threshold for the radio transceiver
     *
     * This is the value, in dBm, that the radio transceiver uses to decide
     * if the channel is clear or not (CCA). If the current signal strength
     * (RSSI/ED) is stronger than this CCA threshold value, the transceiver
     * usually considers that the radio medium is busy. Otherwise, i.e.
     * if RSSI/ED value is less than the CCA threshold value, the radio
     * medium is supposed to be free (the possibly received weak signal
     * is considered to be background, meaningless noise).
     *
     * Most transceivers allow to set this CCA threshold value.
     * Some research work has proven that dynamically adapting it
     * to network environment can improve QoS, especially in WSN.
     */
    NETOPT_CCA_THRESHOLD,

    /**
     * @brief CCA mode for the radio transceiver
     *
     * Get/set the CCA mode as uint8_t
     * corresponding to the respective PHY standard.
     * - IEEE 802.15.4: @ref netdev_ieee802154_cca_mode_t
     */
    NETOPT_CCA_MODE,

    /**
     * @brief get statistics about sent and received packets and data of the device or protocol
     *
     * Expects a pointer to a @ref netstats_t struct that will be pointed to
     * the corresponding @ref netstats_t of the module.
     */
    NETOPT_STATS,

    /**
     * @brief en/disable encryption.
     */
    NETOPT_ENCRYPTION,        /**< en/disable encryption */
    NETOPT_ENCRYPTION_KEY,    /**< set encryption key */

    /**
     * @brief Test mode for the radio, e.g. for CE or FCC certification
     *
     * Get/set the test mode as type @ref netopt_rf_testmode_t or as uint8_t
     * if the radio supports other vendor specific test modes.
     *
     * @note Setting this option should always return -ENOTSUP,
     * unless it was explicitly allowed at build time,
     * therefore it should be secured with an additional macro in the device driver.
     * For development and certification purposes only, this test modes can disturb
     * normal radio communications and exceed the limits, established by
     * the regulatory authority.
     *
     */
    NETOPT_RF_TESTMODE,

    /**
     * @brief   add an address to a link layer filter list
     *
     * 'Getting' this option from a device will return a pointer of type
     * @ref l2filter_t to the first entry of a filter list.
     * When 'Setting' this option a pointer to an link layer address as well as
     * the length of the address are expected as parameters.
     */
    NETOPT_L2FILTER,

    /**
     * @brief   remove an address from a link layer filter list
     *
     * 'Getting' this value always returns -ENOTSUP.
     * When 'Setting' this option a pointer to an link layer address as well as
     * the length of the address are expected as parameters. 'Setting' this
     * option will lead to the given address being removed from the filer list.
     */
    NETOPT_L2FILTER_RM,

    /**
     * @brief   Energy level during the last performed CCA or RX frame
     *
     * Get the last ED level available as an int8_t. The source of the
     * measurement is unspecified and may come from the latest CCA
     * measurement (CCA mode 1), or from the last received frame.
     */
    NETOPT_LAST_ED_LEVEL,

    /**
     * @brief   Get/Set preamble length as uint16_t in host byte order.
     */
    NETOPT_PREAMBLE_LENGTH,

    /**
     * @brief   Enable/disable integrity check (e.g CRC).
     */
    NETOPT_INTEGRITY_CHECK,

    /**
     * @brief   Enable/disable channel hopping.
     */
    NETOPT_CHANNEL_HOP,

    /**
     * @brief   Get/Set channel hopping period as uint8_t.
     */
    NETOPT_CHANNEL_HOP_PERIOD,

    /**
      * @brief   Enable/disable single packet reception.
      *
      * If enabled, RX is turned off upon reception of a packet
      */
    NETOPT_SINGLE_RECEIVE,

    /**
     * @brief   Get/Set the reception timeout of a packet.
     *
     * Values are retrieved/passed as uint32_t in host byte order.
     */
    NETOPT_RX_TIMEOUT,

    /**
     * @brief   Get/Set the transmission timeout of a packet.
     *
     * Values are retrieved/passed as uint32_t in host byte order.
     */
    NETOPT_TX_TIMEOUT,

    /**
     * @brief   Get/Set the radio modem type as uint8_t.
     */
    NETOPT_DEVICE_MODE,

    /**
     * @brief   Get/Set the radio modulation bandwidth as uint8_t.
     */
    NETOPT_BANDWIDTH,

    /**
     * @brief   Get/Set the radio spreading factor as uint8_t.
     */
    NETOPT_SPREADING_FACTOR,

    /**
     * @brief   Get/Set the radio coding rate as uint8_t.
     */
    NETOPT_CODING_RATE,

    /**
     * @brief   Enable/disable fixed header mode.
     */
    NETOPT_FIXED_HEADER,

    /**
     * @brief   Enable/disable IQ inverted.
     */
    NETOPT_IQ_INVERT,

    NETOPT_6LO_IPHC,            /**< en/disable header compression according to
                                 *   [RFC 6282](https://tools.ietf.org/html/rfc6282)
                                 *   or read the current state */

    /**
     * @brief   Get retry amount from missing ACKs of the last transmission
     *
     * This retrieves the number of retries needed for the last transmissions.
     * Only retransmissions due to missing ACK packets are considered.
     * Retries due to CCA failures are not counted.
     */
    NETOPT_TX_RETRIES_NEEDED,

    /* add more options if needed */

    /**
     * @brief   maximum number of options defined here.
     *
     * @note    Interfaces are not meant to respond to that.
     */
    NETOPT_NUMOF,
} netopt_t;

/**
 * @brief   Binary parameter for enabling and disabling options
 */
typedef enum {
    NETOPT_DISABLE = 0,         /**< disable a given option */
    NETOPT_ENABLE = 1,          /**< enable a given option */
} netopt_enable_t;

/**
 * @brief   Option parameter to be used with @ref NETOPT_STATE to set or get
 *          the state of a network device or protocol implementation
 */
typedef enum {
    NETOPT_STATE_OFF = 0,       /**< powered off */
    NETOPT_STATE_SLEEP,         /**< sleep mode */
    NETOPT_STATE_IDLE,          /**< idle mode,
                                 *   the device listens to receive packets */
    NETOPT_STATE_RX,            /**< receive mode,
                                 *   the device currently receives a packet */
    NETOPT_STATE_TX,            /**< transmit mode,
                                 *   set: triggers transmission of a preloaded packet
                                 *   (see @ref NETOPT_PRELOADING*). The resulting
                                 *   state of the network device is @ref NETOPT_STATE_IDLE
                                 *   get: the network device is in the process of
                                 *   transmitting a packet */
    NETOPT_STATE_RESET,         /**< triggers a hardware reset. The resulting
                                 *   state of the network device is @ref NETOPT_STATE_IDLE */
    NETOPT_STATE_STANDBY,       /**< standby mode. The devices is awake but
                                 *   not listening to packets. */
    /* add other states if needed */
} netopt_state_t;

/**
 * @brief   Option parameter to be used with @ref NETOPT_RF_TESTMODE
 */
typedef enum {
    NETOPT_RF_TESTMODE_IDLE = 0,    /**< idle mode, radio off */
    NETOPT_RF_TESTMODE_CRX,         /**< continuous rx mode */
    NETOPT_RF_TESTMODE_CTX_CW,      /**< carrier wave continuous tx mode */
    NETOPT_RF_TESTMODE_CTX_PRBS9,   /**< PRBS9 continuous tx mode */
} netopt_rf_testmode_t;

/**
 * @brief   Get a string ptr corresponding to opt, for debugging
 *
 * @param[in] opt   The option to get a string representation for
 *
 * @return          ptr to string representation for given option or "unknown"
 */
const char *netopt2str(netopt_t opt);

#ifdef __cplusplus
}
#endif

#endif /* NET_NETOPT_H */
/** @} */