source: mainline/uspace/lib/c/include/net/device.h@ 8d7ec69d

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 8d7ec69d was fd6bd6d, checked in by Martin Decky <martin@…>, 14 years ago

add stubs for DMA memory management functions (not working yet)

  • Property mode set to 100644
File size: 13.6 KB
Line 
1/*
2 * Copyright (c) 2009 Lukas Mejdrech
3 * Copyright (c) 2011 Radim Vansa
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * - Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * - The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30/** @addtogroup libc
31 * @{
32 */
33
34/** @file
35 * Device identifier, state and usage statistics.
36 */
37
38#ifndef LIBC_DEVICE_ID_TYPE_H_
39#define LIBC_DEVICE_ID_TYPE_H_
40
41#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)
62
63/** Device identifier to generic type map declaration. */
64#define DEVICE_MAP_DECLARE INT_MAP_DECLARE
65
66/** 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
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
96/** Device identifier type. */
97typedef int nic_device_id_t;
98
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}
484
485#endif
486
487/** @}
488 */
Note: See TracBrowser for help on using the repository browser.