Ignore:
File:
1 edited

Legend:

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

    r9cd8165 rfd6bd6d  
    11/*
    22 * Copyright (c) 2009 Lukas Mejdrech
     3 * Copyright (c) 2011 Radim Vansa
    34 * All rights reserved.
    45 *
     
    3233
    3334/** @file
    34  * Network device.
    35  */
    36 
    37 #ifndef LIBC_NET_DEVICE_H_
    38 #define LIBC_NET_DEVICE_H_
     35 * Device identifier, state and usage statistics.
     36 */
     37
     38#ifndef LIBC_DEVICE_ID_TYPE_H_
     39#define LIBC_DEVICE_ID_TYPE_H_
    3940
    4041#include <adt/int_map.h>
    41 #include <nic/nic.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)
    4262
    4363/** Device identifier to generic type map declaration. */
     
    4767#define DEVICE_MAP_IMPLEMENT  INT_MAP_IMPLEMENT
    4868
     69/** Max length of any hw nic address (currently only eth) */
     70#define NIC_MAX_ADDRESS_LENGTH  16
     71
     72/** 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#define NIC_DEFECTIVE_LONG               0x0001
     81#define NIC_DEFECTIVE_SHORT              0x0002
     82#define NIC_DEFECTIVE_BAD_CRC            0x0010
     83#define NIC_DEFECTIVE_BAD_IPV4_CHECKSUM  0x0020
     84#define NIC_DEFECTIVE_BAD_IPV6_CHECKSUM  0x0040
     85#define NIC_DEFECTIVE_BAD_TCP_CHECKSUM   0x0080
     86#define NIC_DEFECTIVE_BAD_UDP_CHECKSUM   0x0100
     87
     88/**
     89 * The bitmap uses single bit for each of the 2^12 = 4096 possible VLAN tags.
     90 * This means its size is 4096/8 = 512 bytes.
     91 */
     92#define NIC_VLAN_BITMAP_SIZE  512
     93
     94#define NIC_DEVICE_PRINT_FMT  "%x"
     95
    4996/** Device identifier type. */
    5097typedef int nic_device_id_t;
    5198
    52 /** Invalid device identifier. */
    53 #define NIC_DEVICE_INVALID_ID  (-1)
     99/**
     100 * Structure covering the MAC address.
     101 */
     102typedef struct nic_address {
     103        uint8_t address[ETH_ADDR];
     104} nic_address_t;
     105
     106/** Device state. */
     107typedef enum nic_device_state {
     108        /**
     109         * Device present and stopped. Moving device to this state means to discard
     110         * all settings and WOL virtues, rebooting the NIC to state as if the
     111         * computer just booted (or the NIC was just inserted in case of removable
     112         * NIC).
     113         */
     114        NIC_STATE_STOPPED,
     115        /**
     116         * If the NIC is in this state no packets (frames) are transmitted nor
     117         * received. However, the settings are not restarted. You can use this state
     118         * to temporarily disable transmition/reception or atomically (with respect
     119         * to incoming/outcoming packets) change frames acceptance etc.
     120         */
     121        NIC_STATE_DOWN,
     122        /** Device is normally operating. */
     123        NIC_STATE_ACTIVE,
     124        /** Just a constant to limit the state numbers */
     125        NIC_STATE_MAX,
     126} nic_device_state_t;
     127
     128/**
     129 * Channel operating mode used on the medium.
     130 */
     131typedef enum {
     132        NIC_CM_UNKNOWN,
     133        NIC_CM_FULL_DUPLEX,
     134        NIC_CM_HALF_DUPLEX,
     135        NIC_CM_SIMPLEX
     136} nic_channel_mode_t;
     137
     138/**
     139 * Role for the device (used e.g. for 1000Gb ethernet)
     140 */
     141typedef enum {
     142        NIC_ROLE_UNKNOWN,
     143        NIC_ROLE_AUTO,
     144        NIC_ROLE_MASTER,
     145        NIC_ROLE_SLAVE
     146} nic_role_t;
     147
     148/**
     149 * Current state of the cable in the device
     150 */
     151typedef enum {
     152        NIC_CS_UNKNOWN,
     153        NIC_CS_PLUGGED,
     154        NIC_CS_UNPLUGGED
     155} nic_cable_state_t;
     156
     157/**
     158 * Result of the requested operation
     159 */
     160typedef enum {
     161        /** Successfully disabled */
     162        NIC_RESULT_DISABLED,
     163        /** Successfully enabled */
     164        NIC_RESULT_ENABLED,
     165        /** Not supported at all */
     166        NIC_RESULT_NOT_SUPPORTED,
     167        /** Temporarily not available */
     168        NIC_RESULT_NOT_AVAILABLE,
     169        /** Result extensions */
     170        NIC_RESULT_FIRST_EXTENSION
     171} nic_result_t;
     172
     173/** Device usage statistics. */
     174typedef struct nic_device_stats {
     175        /** Total packets received (accepted). */
     176        unsigned long receive_packets;
     177        /** Total packets transmitted. */
     178        unsigned long send_packets;
     179        /** Total bytes received (accepted). */
     180        unsigned long receive_bytes;
     181        /** Total bytes transmitted. */
     182        unsigned long send_bytes;
     183        /** Bad packets received counter. */
     184        unsigned long receive_errors;
     185        /** Packet transmition problems counter. */
     186        unsigned long send_errors;
     187        /** Number of frames dropped due to insufficient space in RX buffers */
     188        unsigned long receive_dropped;
     189        /** Number of frames dropped due to insufficient space in TX buffers */
     190        unsigned long send_dropped;
     191        /** Total multicast packets received (accepted). */
     192        unsigned long receive_multicast;
     193        /** Total broadcast packets received (accepted). */
     194        unsigned long receive_broadcast;
     195        /** The number of collisions due to congestion on the medium. */
     196        unsigned long collisions;
     197        /** Unicast packets received but not accepted (filtered) */
     198        unsigned long receive_filtered_unicast;
     199        /** Multicast packets received but not accepted (filtered) */
     200        unsigned long receive_filtered_multicast;
     201        /** Broadcast packets received but not accepted (filtered) */
     202        unsigned long receive_filtered_broadcast;
     203
     204        /* detailed receive_errors */
     205
     206        /** Received packet length error counter. */
     207        unsigned long receive_length_errors;
     208        /** Receiver buffer overflow counter. */
     209        unsigned long receive_over_errors;
     210        /** Received packet with crc error counter. */
     211        unsigned long receive_crc_errors;
     212        /** Received frame alignment error counter. */
     213        unsigned long receive_frame_errors;
     214        /** Receiver fifo overrun counter. */
     215        unsigned long receive_fifo_errors;
     216        /** Receiver missed packet counter. */
     217        unsigned long receive_missed_errors;
     218
     219        /* detailed send_errors */
     220
     221        /** Transmitter aborted counter. */
     222        unsigned long send_aborted_errors;
     223        /** Transmitter carrier errors counter. */
     224        unsigned long send_carrier_errors;
     225        /** Transmitter fifo overrun counter. */
     226        unsigned long send_fifo_errors;
     227        /** Transmitter carrier errors counter. */
     228        unsigned long send_heartbeat_errors;
     229        /** Transmitter window errors counter. */
     230        unsigned long send_window_errors;
     231
     232        /* for cslip etc */
     233       
     234        /** Total compressed packets received. */
     235        unsigned long receive_compressed;
     236        /** Total compressed packet transmitted. */
     237        unsigned long send_compressed;
     238} nic_device_stats_t;
     239
     240/** Errors corresponding to those in the nic_device_stats_t */
     241typedef enum {
     242        NIC_SEC_BUFFER_FULL,
     243        NIC_SEC_ABORTED,
     244        NIC_SEC_CARRIER_LOST,
     245        NIC_SEC_FIFO_OVERRUN,
     246        NIC_SEC_HEARTBEAT,
     247        NIC_SEC_WINDOW_ERROR,
     248        /* Error encountered during TX but with other type of error */
     249        NIC_SEC_OTHER
     250} nic_send_error_cause_t;
     251
     252/** Errors corresponding to those in the nic_device_stats_t */
     253typedef enum {
     254        NIC_REC_BUFFER_FULL,
     255        NIC_REC_LENGTH,
     256        NIC_REC_BUFFER_OVERFLOW,
     257        NIC_REC_CRC,
     258        NIC_REC_FRAME_ALIGNMENT,
     259        NIC_REC_FIFO_OVERRUN,
     260        NIC_REC_MISSED,
     261        /* Error encountered during RX but with other type of error */
     262        NIC_REC_OTHER
     263} nic_receive_error_cause_t;
     264
     265/**
     266 * Information about the NIC that never changes - name, vendor, model,
     267 * capabilites and so on.
     268 */
     269typedef struct nic_device_info {
     270        /* Device identification */
     271        char vendor_name[NIC_VENDOR_MAX_LENGTH];
     272        char model_name[NIC_MODEL_MAX_LENGTH];
     273        char part_number[NIC_PART_NUMBER_MAX_LENGTH];
     274        char serial_number[NIC_SERIAL_NUMBER_MAX_LENGTH];
     275        uint16_t vendor_id;
     276        uint16_t device_id;
     277        uint16_t subsystem_vendor_id;
     278        uint16_t subsystem_id;
     279        /* Device capabilities */
     280        uint16_t ethernet_support[ETH_PHYS_LAYERS];
     281
     282        /** The mask of all modes which the device can advertise
     283         *
     284         *  see ETH_AUTONEG_ macros in net/eth_phys.h of libc
     285         */
     286        uint32_t autoneg_support;
     287} nic_device_info_t;
     288
     289/**
     290 * Type of the ethernet frame
     291 */
     292typedef enum nic_frame_type {
     293        NIC_FRAME_UNICAST,
     294        NIC_FRAME_MULTICAST,
     295        NIC_FRAME_BROADCAST
     296} nic_frame_type_t;
     297
     298/**
     299 * Specifies which unicast frames is the NIC receiving.
     300 */
     301typedef enum nic_unicast_mode {
     302        NIC_UNICAST_UNKNOWN,
     303        /** No unicast frames are received */
     304        NIC_UNICAST_BLOCKED,
     305        /** Only the frames with this NIC's MAC as destination are received */
     306        NIC_UNICAST_DEFAULT,
     307        /**
     308         * Both frames with this NIC's MAC and those specified in the list are
     309         * received
     310         */
     311        NIC_UNICAST_LIST,
     312        /** All unicast frames are received */
     313        NIC_UNICAST_PROMISC
     314} nic_unicast_mode_t;
     315
     316typedef enum nic_multicast_mode {
     317        NIC_MULTICAST_UNKNOWN,
     318        /** No multicast frames are received */
     319        NIC_MULTICAST_BLOCKED,
     320        /** Frames with multicast addresses specified in this list are received */
     321        NIC_MULTICAST_LIST,
     322        /** All multicast frames are received */
     323        NIC_MULTICAST_PROMISC
     324} nic_multicast_mode_t;
     325
     326typedef enum nic_broadcast_mode {
     327        NIC_BROADCAST_UNKNOWN,
     328        /** Broadcast frames are dropped */
     329        NIC_BROADCAST_BLOCKED,
     330        /** Broadcast frames are received */
     331        NIC_BROADCAST_ACCEPTED
     332} nic_broadcast_mode_t;
     333
     334/**
     335 * Structure covering the bitmap with VLAN tags.
     336 */
     337typedef struct nic_vlan_mask {
     338        uint8_t bitmap[NIC_VLAN_BITMAP_SIZE];
     339} nic_vlan_mask_t;
     340
     341/* WOL virtue identifier */
     342typedef unsigned int nic_wv_id_t;
     343
     344/**
     345 * Structure passed as argument for virtue NIC_WV_MAGIC_PACKET.
     346 */
     347typedef struct nic_wv_magic_packet_data {
     348        uint8_t password[6];
     349} nic_wv_magic_packet_data_t;
     350
     351/**
     352 * Structure passed as argument for virtue NIC_WV_DIRECTED_IPV4
     353 */
     354typedef struct nic_wv_ipv4_data {
     355        uint8_t address[4];
     356} nic_wv_ipv4_data_t;
     357
     358/**
     359 * Structure passed as argument for virtue NIC_WV_DIRECTED_IPV6
     360 */
     361typedef struct nic_wv_ipv6_data {
     362        uint8_t address[16];
     363} nic_wv_ipv6_data_t;
     364
     365/**
     366 * WOL virtue types defining the interpretation of data passed to the virtue.
     367 * Those tagged with S can have only single virtue active at one moment, those
     368 * tagged with M can have multiple ones.
     369 */
     370typedef enum nic_wv_type {
     371        /**
     372         * Used for deletion of the virtue - in this case the mask, data and length
     373         * arguments are ignored.
     374         */
     375        NIC_WV_NONE,
     376        /** S
     377         * Enabled <=> wakeup upon link change
     378         */
     379        NIC_WV_LINK_CHANGE,
     380        /** S
     381         * If this virtue is set up, wakeup can be issued by a magic packet frame.
     382         * If the data argument is not NULL, it must contain
     383         * nic_wv_magic_packet_data structure with the SecureOn password.
     384         */
     385        NIC_WV_MAGIC_PACKET,
     386        /** M
     387         * If the virtue is set up, wakeup can be issued by a frame targeted to
     388         * device with MAC address specified in data. The data must contain
     389         * nic_address_t structure.
     390         */
     391        NIC_WV_DESTINATION,
     392        /** S
     393         * Enabled <=> wakeup upon receiving broadcast frame
     394         */
     395        NIC_WV_BROADCAST,
     396        /** S
     397         * Enabled <=> wakeup upon receiving ARP Request
     398         */
     399        NIC_WV_ARP_REQUEST,
     400        /** M
     401         * If enabled, the wakeup is issued upon receiving frame with an IPv4 packet
     402         * with IPv4 address specified in data. The data must contain
     403         * nic_wv_ipv4_data structure.
     404         */
     405        NIC_WV_DIRECTED_IPV4,
     406        /** M
     407         * If enabled, the wakeup is issued upon receiving frame with an IPv4 packet
     408         * with IPv6 address specified in data. The data must contain
     409         * nic_wv_ipv6_data structure.
     410         */
     411        NIC_WV_DIRECTED_IPV6,
     412        /** M
     413         * First length/2 bytes in the argument are interpreted as mask, second
     414         * length/2 bytes are interpreted as content.
     415         * If enabled, the wakeup is issued upon receiving frame where the bytes
     416         * with non-zero value in the mask equal to those in the content.
     417         */
     418        NIC_WV_FULL_MATCH,
     419        /**
     420         * Dummy value, do not use.
     421         */
     422        NIC_WV_MAX
     423} nic_wv_type_t;
     424
     425/**
     426 * Specifies the interrupt/polling mode used by the driver and NIC
     427 */
     428typedef enum nic_poll_mode {
     429        /**
     430         * NIC issues interrupts upon events.
     431         */
     432        NIC_POLL_IMMEDIATE,
     433        /**
     434         * Some uspace app calls nic_poll_now(...) in order to check the NIC state
     435         * - no interrupts are received from the NIC.
     436         */
     437        NIC_POLL_ON_DEMAND,
     438        /**
     439         * The driver itself issues a poll request in a periodic manner. It is
     440         * allowed to use hardware timer if the NIC supports it.
     441         */
     442        NIC_POLL_PERIODIC,
     443        /**
     444         * The driver itself issued a poll request in a periodic manner. The driver
     445         * must create software timer, internal hardware timer of NIC must not be
     446         * used even if the NIC supports it.
     447         */
     448        NIC_POLL_SOFTWARE_PERIODIC
     449} nic_poll_mode_t;
     450
     451/**
     452 * Says if this virtue type is a multi-virtue (there can be multiple virtues of
     453 * this type at once).
     454 *
     455 * @param type
     456 *
     457 * @return true or false
     458 */
     459static inline int nic_wv_is_multi(nic_wv_type_t type) {
     460        switch (type) {
     461        case NIC_WV_FULL_MATCH:
     462        case NIC_WV_DESTINATION:
     463        case NIC_WV_DIRECTED_IPV4:
     464        case NIC_WV_DIRECTED_IPV6:
     465                return true;
     466        default:
     467                return false;
     468        }
     469}
     470
     471static inline const char *nic_device_state_to_string(nic_device_state_t state)
     472{
     473        switch (state) {
     474        case NIC_STATE_STOPPED:
     475                return "stopped";
     476        case NIC_STATE_DOWN:
     477                return "down";
     478        case NIC_STATE_ACTIVE:
     479                return "active";
     480        default:
     481                return "undefined";
     482        }
     483}
    54484
    55485#endif
Note: See TracChangeset for help on using the changeset viewer.