Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/include/net/device.h

    r00d7e1b rf772bc55  
    11/*
    22 * Copyright (c) 2009 Lukas Mejdrech
    3  * Copyright (c) 2011 Radim Vansa
    43 * All rights reserved.
    54 *
     
    4039
    4140#include <adt/int_map.h>
    42 #include <net/eth_phys.h>
    43 #include <bool.h>
    44 
    45 /** Ethernet address length. */
    46 #define ETH_ADDR  6
    47 
    48 /** MAC printing format */
    49 #define PRIMAC  "%02x:%02x:%02x:%02x:%02x:%02x"
    50 
    51 /** MAC arguments */
    52 #define ARGSMAC(__a) \
    53         (__a)[0], (__a)[1], (__a)[2], (__a)[3], (__a)[4], (__a)[5]
    54 
    55 /* Compare MAC address with specific value */
    56 #define MAC_EQUALS_VALUE(__a, __a0, __a1, __a2, __a3, __a4, __a5) \
    57         ((__a)[0] == (__a0) && (__a)[1] == (__a1) && (__a)[2] == (__a2) \
    58         && (__a)[3] == (__a3) && (__a)[4] == (__a4) && (__a)[5] == (__a5))
    59 
    60 #define MAC_IS_ZERO(__x) \
    61         MAC_EQUALS_VALUE(__x, 0, 0, 0, 0, 0, 0)
    6241
    6342/** Device identifier to generic type map declaration. */
    64 #define DEVICE_MAP_DECLARE  INT_MAP_DECLARE
     43#define DEVICE_MAP_DECLARE      INT_MAP_DECLARE
    6544
    6645/** Device identifier to generic type map implementation. */
    67 #define DEVICE_MAP_IMPLEMENT  INT_MAP_IMPLEMENT
    68 
    69 /** Max length of any hw nic address (currently only eth) */
    70 #define NIC_MAX_ADDRESS_LENGTH  16
     46#define DEVICE_MAP_IMPLEMENT    INT_MAP_IMPLEMENT
    7147
    7248/** Invalid device identifier. */
    73 #define NIC_DEVICE_INVALID_ID  (-1)
    74 
    75 #define NIC_VENDOR_MAX_LENGTH         64
    76 #define NIC_MODEL_MAX_LENGTH          64
    77 #define NIC_PART_NUMBER_MAX_LENGTH    64
    78 #define NIC_SERIAL_NUMBER_MAX_LENGTH  64
    79 
    80 /**
    81  * The bitmap uses single bit for each of the 2^12 = 4096 possible VLAN tags.
    82  * This means its size is 4096/8 = 512 bytes.
    83  */
    84 #define NIC_VLAN_BITMAP_SIZE  512
    85 
    86 #define NIC_DEVICE_PRINT_FMT  "%x"
     49#define DEVICE_INVALID_ID       (-1)
    8750
    8851/** Device identifier type. */
    89 typedef int nic_device_id_t;
     52typedef int device_id_t;
    9053
    91 /**
    92  * Structure covering the MAC address.
     54/** Device state type. */
     55typedef enum device_state device_state_t;
     56
     57/** Type definition of the device usage statistics.
     58 * @see device_stats
    9359 */
    94 typedef struct nic_address {
    95         uint8_t address[ETH_ADDR];
    96 } nic_address_t;
     60typedef struct device_stats device_stats_t;
    9761
    9862/** Device state. */
    99 typedef enum nic_device_state {
    100         /**
    101          * Device present and stopped. Moving device to this state means to discard
    102          * all settings and WOL virtues, rebooting the NIC to state as if the
    103          * computer just booted (or the NIC was just inserted in case of removable
    104          * NIC).
    105          */
    106         NIC_STATE_STOPPED,
    107         /**
    108          * If the NIC is in this state no packets (frames) are transmitted nor
    109          * received. However, the settings are not restarted. You can use this state
    110          * to temporarily disable transmition/reception or atomically (with respect
    111          * to incoming/outcoming packets) change frames acceptance etc.
    112          */
    113         NIC_STATE_DOWN,
    114         /** Device is normally operating. */
    115         NIC_STATE_ACTIVE,
    116         /** Just a constant to limit the state numbers */
    117         NIC_STATE_MAX,
    118 } nic_device_state_t;
    119 
    120 /**
    121  * Channel operating mode used on the medium.
    122  */
    123 typedef enum {
    124         NIC_CM_UNKNOWN,
    125         NIC_CM_FULL_DUPLEX,
    126         NIC_CM_HALF_DUPLEX,
    127         NIC_CM_SIMPLEX
    128 } nic_channel_mode_t;
    129 
    130 /**
    131  * Role for the device (used e.g. for 1000Gb ethernet)
    132  */
    133 typedef enum {
    134         NIC_ROLE_UNKNOWN,
    135         NIC_ROLE_AUTO,
    136         NIC_ROLE_MASTER,
    137         NIC_ROLE_SLAVE
    138 } nic_role_t;
    139 
    140 /**
    141  * Current state of the cable in the device
    142  */
    143 typedef enum {
    144         NIC_CS_UNKNOWN,
    145         NIC_CS_PLUGGED,
    146         NIC_CS_UNPLUGGED
    147 } nic_cable_state_t;
    148 
    149 /**
    150  * Result of the requested operation
    151  */
    152 typedef enum {
    153         /** Successfully disabled */
    154         NIC_RESULT_DISABLED,
    155         /** Successfully enabled */
    156         NIC_RESULT_ENABLED,
    157         /** Not supported at all */
    158         NIC_RESULT_NOT_SUPPORTED,
    159         /** Temporarily not available */
    160         NIC_RESULT_NOT_AVAILABLE,
    161         /** Result extensions */
    162         NIC_RESULT_FIRST_EXTENSION
    163 } nic_result_t;
     63enum device_state {
     64        /** Device not present or not initialized. */
     65        NETIF_NULL = 0,
     66        /** Device present and stopped. */
     67        NETIF_STOPPED,
     68        /** Device present and active. */
     69        NETIF_ACTIVE,
     70        /** Device present but unable to transmit. */
     71        NETIF_CARRIER_LOST
     72};
    16473
    16574/** Device usage statistics. */
    166 typedef struct nic_device_stats {
    167         /** Total packets received (accepted). */
     75struct device_stats {
     76        /** Total packets received. */
    16877        unsigned long receive_packets;
    16978        /** Total packets transmitted. */
    17079        unsigned long send_packets;
    171         /** Total bytes received (accepted). */
     80        /** Total bytes received. */
    17281        unsigned long receive_bytes;
    17382        /** Total bytes transmitted. */
     
    17786        /** Packet transmition problems counter. */
    17887        unsigned long send_errors;
    179         /** Number of frames dropped due to insufficient space in RX buffers */
     88        /** No space in buffers counter. */
    18089        unsigned long receive_dropped;
    181         /** Number of frames dropped due to insufficient space in TX buffers */
     90        /** No space available counter. */
    18291        unsigned long send_dropped;
    183         /** Total multicast packets received (accepted). */
    184         unsigned long receive_multicast;
    185         /** Total broadcast packets received (accepted). */
    186         unsigned long receive_broadcast;
     92        /** Total multicast packets received. */
     93        unsigned long multicast;
    18794        /** The number of collisions due to congestion on the medium. */
    18895        unsigned long collisions;
    189         /** Unicast packets received but not accepted (filtered) */
    190         unsigned long receive_filtered_unicast;
    191         /** Multicast packets received but not accepted (filtered) */
    192         unsigned long receive_filtered_multicast;
    193         /** Broadcast packets received but not accepted (filtered) */
    194         unsigned long receive_filtered_broadcast;
    19596
    19697        /* detailed receive_errors */
     
    228129        /** Total compressed packet transmitted. */
    229130        unsigned long send_compressed;
    230 } nic_device_stats_t;
    231 
    232 /** Errors corresponding to those in the nic_device_stats_t */
    233 typedef enum {
    234         NIC_SEC_BUFFER_FULL,
    235         NIC_SEC_ABORTED,
    236         NIC_SEC_CARRIER_LOST,
    237         NIC_SEC_FIFO_OVERRUN,
    238         NIC_SEC_HEARTBEAT,
    239         NIC_SEC_WINDOW_ERROR,
    240         /* Error encountered during TX but with other type of error */
    241         NIC_SEC_OTHER
    242 } nic_send_error_cause_t;
    243 
    244 /** Errors corresponding to those in the nic_device_stats_t */
    245 typedef enum {
    246         NIC_REC_BUFFER_FULL,
    247         NIC_REC_LENGTH,
    248         NIC_REC_BUFFER_OVERFLOW,
    249         NIC_REC_CRC,
    250         NIC_REC_FRAME_ALIGNMENT,
    251         NIC_REC_FIFO_OVERRUN,
    252         NIC_REC_MISSED,
    253         /* Error encountered during RX but with other type of error */
    254         NIC_REC_OTHER
    255 } nic_receive_error_cause_t;
    256 
    257 /**
    258  * Information about the NIC that never changes - name, vendor, model,
    259  * capabilites and so on.
    260  */
    261 typedef struct nic_device_info {
    262         /* Device identification */
    263         char vendor_name[NIC_VENDOR_MAX_LENGTH];
    264         char model_name[NIC_MODEL_MAX_LENGTH];
    265         char part_number[NIC_PART_NUMBER_MAX_LENGTH];
    266         char serial_number[NIC_SERIAL_NUMBER_MAX_LENGTH];
    267         uint16_t vendor_id;
    268         uint16_t device_id;
    269         uint16_t subsystem_vendor_id;
    270         uint16_t subsystem_id;
    271         /* Device capabilities */
    272         uint16_t ethernet_support[ETH_PHYS_LAYERS];
    273 
    274         /** The mask of all modes which the device can advertise
    275          *
    276          *  see ETH_AUTONEG_ macros in net/eth_phys.h of libc
    277          */
    278         uint32_t autoneg_support;
    279 } nic_device_info_t;
    280 
    281 /**
    282  * Type of the ethernet frame
    283  */
    284 typedef enum nic_frame_type {
    285         NIC_FRAME_UNICAST,
    286         NIC_FRAME_MULTICAST,
    287         NIC_FRAME_BROADCAST
    288 } nic_frame_type_t;
    289 
    290 /**
    291  * Specifies which unicast frames is the NIC receiving.
    292  */
    293 typedef enum nic_unicast_mode {
    294         NIC_UNICAST_UNKNOWN,
    295         /** No unicast frames are received */
    296         NIC_UNICAST_BLOCKED,
    297         /** Only the frames with this NIC's MAC as destination are received */
    298         NIC_UNICAST_DEFAULT,
    299         /**
    300          * Both frames with this NIC's MAC and those specified in the list are
    301          * received
    302          */
    303         NIC_UNICAST_LIST,
    304         /** All unicast frames are received */
    305         NIC_UNICAST_PROMISC
    306 } nic_unicast_mode_t;
    307 
    308 typedef enum nic_multicast_mode {
    309         NIC_MULTICAST_UNKNOWN,
    310         /** No multicast frames are received */
    311         NIC_MULTICAST_BLOCKED,
    312         /** Frames with multicast addresses specified in this list are received */
    313         NIC_MULTICAST_LIST,
    314         /** All multicast frames are received */
    315         NIC_MULTICAST_PROMISC
    316 } nic_multicast_mode_t;
    317 
    318 typedef enum nic_broadcast_mode {
    319         NIC_BROADCAST_UNKNOWN,
    320         /** Broadcast frames are dropped */
    321         NIC_BROADCAST_BLOCKED,
    322         /** Broadcast frames are received */
    323         NIC_BROADCAST_ACCEPTED
    324 } nic_broadcast_mode_t;
    325 
    326 /**
    327  * Structure covering the bitmap with VLAN tags.
    328  */
    329 typedef struct nic_vlan_mask {
    330         uint8_t bitmap[NIC_VLAN_BITMAP_SIZE];
    331 } nic_vlan_mask_t;
    332 
    333 /* WOL virtue identifier */
    334 typedef unsigned int nic_wv_id_t;
    335 
    336 /**
    337  * Structure passed as argument for virtue NIC_WV_MAGIC_PACKET.
    338  */
    339 typedef struct nic_wv_magic_packet_data {
    340         uint8_t password[6];
    341 } nic_wv_magic_packet_data_t;
    342 
    343 /**
    344  * Structure passed as argument for virtue NIC_WV_DIRECTED_IPV4
    345  */
    346 typedef struct nic_wv_ipv4_data {
    347         uint8_t address[4];
    348 } nic_wv_ipv4_data_t;
    349 
    350 /**
    351  * Structure passed as argument for virtue NIC_WV_DIRECTED_IPV6
    352  */
    353 typedef struct nic_wv_ipv6_data {
    354         uint8_t address[16];
    355 } nic_wv_ipv6_data_t;
    356 
    357 /**
    358  * WOL virtue types defining the interpretation of data passed to the virtue.
    359  * Those tagged with S can have only single virtue active at one moment, those
    360  * tagged with M can have multiple ones.
    361  */
    362 typedef enum nic_wv_type {
    363         /**
    364          * Used for deletion of the virtue - in this case the mask, data and length
    365          * arguments are ignored.
    366          */
    367         NIC_WV_NONE,
    368         /** S
    369          * Enabled <=> wakeup upon link change
    370          */
    371         NIC_WV_LINK_CHANGE,
    372         /** S
    373          * If this virtue is set up, wakeup can be issued by a magic packet frame.
    374          * If the data argument is not NULL, it must contain
    375          * nic_wv_magic_packet_data structure with the SecureOn password.
    376          */
    377         NIC_WV_MAGIC_PACKET,
    378         /** M
    379          * If the virtue is set up, wakeup can be issued by a frame targeted to
    380          * device with MAC address specified in data. The data must contain
    381          * nic_address_t structure.
    382          */
    383         NIC_WV_DESTINATION,
    384         /** S
    385          * Enabled <=> wakeup upon receiving broadcast frame
    386          */
    387         NIC_WV_BROADCAST,
    388         /** S
    389          * Enabled <=> wakeup upon receiving ARP Request
    390          */
    391         NIC_WV_ARP_REQUEST,
    392         /** M
    393          * If enabled, the wakeup is issued upon receiving frame with an IPv4 packet
    394          * with IPv4 address specified in data. The data must contain
    395          * nic_wv_ipv4_data structure.
    396          */
    397         NIC_WV_DIRECTED_IPV4,
    398         /** M
    399          * If enabled, the wakeup is issued upon receiving frame with an IPv4 packet
    400          * with IPv6 address specified in data. The data must contain
    401          * nic_wv_ipv6_data structure.
    402          */
    403         NIC_WV_DIRECTED_IPV6,
    404         /** M
    405          * First length/2 bytes in the argument are interpreted as mask, second
    406          * length/2 bytes are interpreted as content.
    407          * If enabled, the wakeup is issued upon receiving frame where the bytes
    408          * with non-zero value in the mask equal to those in the content.
    409          */
    410         NIC_WV_FULL_MATCH,
    411         /**
    412          * Dummy value, do not use.
    413          */
    414         NIC_WV_MAX
    415 } nic_wv_type_t;
    416 
    417 /**
    418  * Specifies the interrupt/polling mode used by the driver and NIC
    419  */
    420 typedef enum nic_poll_mode {
    421         /**
    422          * NIC issues interrupts upon events.
    423          */
    424         NIC_POLL_IMMEDIATE,
    425         /**
    426          * Some uspace app calls nic_poll_now(...) in order to check the NIC state
    427          * - no interrupts are received from the NIC.
    428          */
    429         NIC_POLL_ON_DEMAND,
    430         /**
    431          * The driver itself issues a poll request in a periodic manner. It is
    432          * allowed to use hardware timer if the NIC supports it.
    433          */
    434         NIC_POLL_PERIODIC,
    435         /**
    436          * The driver itself issued a poll request in a periodic manner. The driver
    437          * must create software timer, internal hardware timer of NIC must not be
    438          * used even if the NIC supports it.
    439          */
    440         NIC_POLL_SOFTWARE_PERIODIC
    441 } nic_poll_mode_t;
    442 
    443 /**
    444  * Says if this virtue type is a multi-virtue (there can be multiple virtues of
    445  * this type at once).
    446  *
    447  * @param type
    448  *
    449  * @return true or false
    450  */
    451 static inline int nic_wv_is_multi(nic_wv_type_t type) {
    452         switch (type) {
    453         case NIC_WV_FULL_MATCH:
    454         case NIC_WV_DESTINATION:
    455         case NIC_WV_DIRECTED_IPV4:
    456         case NIC_WV_DIRECTED_IPV6:
    457                 return true;
    458         default:
    459                 return false;
    460         }
    461 }
    462 
    463 static inline const char *nic_device_state_to_string(nic_device_state_t state)
    464 {
    465         switch (state) {
    466         case NIC_STATE_STOPPED:
    467                 return "stopped";
    468         case NIC_STATE_DOWN:
    469                 return "down";
    470         case NIC_STATE_ACTIVE:
    471                 return "active";
    472         default:
    473                 return "undefined";
    474         }
    475 }
     131};
    476132
    477133#endif
Note: See TracChangeset for help on using the changeset viewer.