Changes in uspace/lib/c/include/net/device.h [9cd8165:fd6bd6d] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/include/net/device.h
r9cd8165 rfd6bd6d 1 1 /* 2 2 * Copyright (c) 2009 Lukas Mejdrech 3 * Copyright (c) 2011 Radim Vansa 3 4 * All rights reserved. 4 5 * … … 32 33 33 34 /** @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_ 39 40 40 41 #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) 42 62 43 63 /** Device identifier to generic type map declaration. */ … … 47 67 #define DEVICE_MAP_IMPLEMENT INT_MAP_IMPLEMENT 48 68 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 49 96 /** Device identifier type. */ 50 97 typedef int nic_device_id_t; 51 98 52 /** Invalid device identifier. */ 53 #define NIC_DEVICE_INVALID_ID (-1) 99 /** 100 * Structure covering the MAC address. 101 */ 102 typedef struct nic_address { 103 uint8_t address[ETH_ADDR]; 104 } nic_address_t; 105 106 /** Device state. */ 107 typedef 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 */ 131 typedef 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 */ 141 typedef 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 */ 151 typedef 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 */ 160 typedef 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. */ 174 typedef 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 */ 241 typedef 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 */ 253 typedef 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 */ 269 typedef 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 */ 292 typedef 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 */ 301 typedef 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 316 typedef 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 326 typedef 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 */ 337 typedef struct nic_vlan_mask { 338 uint8_t bitmap[NIC_VLAN_BITMAP_SIZE]; 339 } nic_vlan_mask_t; 340 341 /* WOL virtue identifier */ 342 typedef unsigned int nic_wv_id_t; 343 344 /** 345 * Structure passed as argument for virtue NIC_WV_MAGIC_PACKET. 346 */ 347 typedef 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 */ 354 typedef 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 */ 361 typedef 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 */ 370 typedef 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 */ 428 typedef 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 */ 459 static 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 471 static 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 } 54 484 55 485 #endif
Note:
See TracChangeset
for help on using the changeset viewer.