Changeset d7ff048 in mainline for uspace/lib/c
- Timestamp:
- 2011-10-08T13:08:53Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- bf08ff0
- Parents:
- 8367d1d (diff), 80099c19 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- uspace/lib/c
- Files:
-
- 7 added
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/Makefile
r8367d1d rd7ff048 67 67 generic/devman.c \ 68 68 generic/device/hw_res.c \ 69 generic/device/hw_res_parsed.c \ 69 70 generic/device/char_dev.c \ 71 generic/device/nic.c \ 70 72 generic/elf/elf_load.c \ 71 73 generic/event.c \ … … 103 105 generic/adt/list.c \ 104 106 generic/adt/hash_table.c \ 107 generic/adt/hash_set.c \ 105 108 generic/adt/dynamic_fifo.c \ 106 109 generic/adt/measured_strings.c \ -
uspace/lib/c/generic/adt/hash_table.c
r8367d1d rd7ff048 76 76 77 77 return true; 78 } 79 80 /** Remove all elements from the hash table 81 * 82 * @param h Hash table to be cleared 83 */ 84 void hash_table_clear(hash_table_t *h) 85 { 86 for (hash_count_t chain = 0; chain < h->entries; ++chain) { 87 link_t *cur; 88 link_t *next; 89 90 for (cur = h->entry[chain].head.next; 91 cur != &h->entry[chain].head; 92 cur = next) { 93 next = cur->next; 94 list_remove(cur); 95 h->op->remove_callback(cur); 96 } 97 } 78 98 } 79 99 … … 198 218 */ 199 219 void hash_table_apply(hash_table_t *h, void (*f)(link_t *, void *), void *arg) 200 { 201 hash_index_t bucket; 202 203 for (bucket = 0; bucket < h->entries; bucket++) { 204 list_foreach(h->entry[bucket], cur) { 220 { 221 for (hash_index_t bucket = 0; bucket < h->entries; bucket++) { 222 link_t *cur; 223 link_t *next; 224 225 for (cur = h->entry[bucket].head.next; cur != &h->entry[bucket].head; 226 cur = next) { 227 /* 228 * The next pointer must be stored prior to the functor 229 * call to allow using destructor as the functor (the 230 * free function could overwrite the cur->next pointer). 231 */ 232 next = cur->next; 205 233 f(cur, arg); 206 234 } -
uspace/lib/c/generic/async.c
r8367d1d rd7ff048 1847 1847 fibril_mutex_lock(&async_sess_mutex); 1848 1848 1849 int rc = async_hangup_internal(sess->phone);1850 if (rc == EOK)1851 free(sess);1852 1853 1849 while (!list_empty(&sess->exch_list)) { 1854 1850 exch = (async_exch_t *) … … 1861 1857 free(exch); 1862 1858 } 1859 1860 int rc = async_hangup_internal(sess->phone); 1861 free(sess); 1863 1862 1864 1863 fibril_mutex_unlock(&async_sess_mutex); -
uspace/lib/c/generic/net/packet.c
r8367d1d rd7ff048 36 36 */ 37 37 38 #include <assert.h> 38 39 #include <malloc.h> 39 40 #include <mem.h> … … 44 45 #include <sys/mman.h> 45 46 46 #include <adt/ generic_field.h>47 #include <adt/hash_table.h> 47 48 #include <net/packet.h> 48 49 #include <net/packet_header.h> 49 50 50 /** Packet map page size. */ 51 #define PACKET_MAP_SIZE 100 52 53 /** Returns the packet map page index. 54 * @param[in] packet_id The packet identifier. 55 */ 56 #define PACKET_MAP_PAGE(packet_id) (((packet_id) - 1) / PACKET_MAP_SIZE) 57 58 /** Returns the packet index in the corresponding packet map page. 59 * @param[in] packet_id The packet identifier. 60 */ 61 #define PACKET_MAP_INDEX(packet_id) (((packet_id) - 1) % PACKET_MAP_SIZE) 62 63 /** Type definition of the packet map page. */ 64 typedef packet_t *packet_map_t[PACKET_MAP_SIZE]; 65 66 /** Packet map. 67 * Maps packet identifiers to the packet references. 68 * @see generic_field.h 69 */ 70 GENERIC_FIELD_DECLARE(gpm, packet_map_t); 51 /** Packet hash table size. */ 52 #define PACKET_HASH_TABLE_SIZE 128 71 53 72 54 /** Packet map global data. */ … … 75 57 fibril_rwlock_t lock; 76 58 /** Packet map. */ 77 gpm_t packet_map; 59 hash_table_t packet_map; 60 /** Packet map operations */ 61 hash_table_operations_t operations; 78 62 } pm_globals; 79 63 80 GENERIC_FIELD_IMPLEMENT(gpm, packet_map_t); 64 typedef struct { 65 link_t link; 66 packet_t *packet; 67 } pm_entry_t; 68 69 /** 70 * Hash function for the packet mapping hash table 71 */ 72 static hash_index_t pm_hash(unsigned long key[]) 73 { 74 return (hash_index_t) key[0] % PACKET_HASH_TABLE_SIZE; 75 } 76 77 /** 78 * Key compare function for the packet mapping hash table 79 */ 80 static int pm_compare(unsigned long key[], hash_count_t keys, link_t *link) 81 { 82 pm_entry_t *entry = list_get_instance(link, pm_entry_t, link); 83 return entry->packet->packet_id == key[0]; 84 } 85 86 /** 87 * Remove callback for the packet mapping hash table 88 */ 89 static void pm_remove_callback(link_t *link) 90 { 91 pm_entry_t *entry = list_get_instance(link, pm_entry_t, link); 92 free(entry); 93 } 94 95 /** 96 * Wrapper used when destroying the whole table 97 */ 98 static void pm_free_wrapper(link_t *link, void *ignored) 99 { 100 pm_entry_t *entry = list_get_instance(link, pm_entry_t, link); 101 free(entry); 102 } 103 81 104 82 105 /** Initializes the packet map. … … 87 110 int pm_init(void) 88 111 { 89 int rc ;112 int rc = EOK; 90 113 91 114 fibril_rwlock_initialize(&pm_globals.lock); 92 115 93 116 fibril_rwlock_write_lock(&pm_globals.lock); 94 rc = gpm_initialize(&pm_globals.packet_map); 117 118 pm_globals.operations.hash = pm_hash; 119 pm_globals.operations.compare = pm_compare; 120 pm_globals.operations.remove_callback = pm_remove_callback; 121 122 if (!hash_table_create(&pm_globals.packet_map, PACKET_HASH_TABLE_SIZE, 1, 123 &pm_globals.operations)) 124 rc = ENOMEM; 125 95 126 fibril_rwlock_write_unlock(&pm_globals.lock); 96 127 … … 100 131 /** Finds the packet mapping. 101 132 * 102 * @param[in] packet_id The packet identifier to be found. 103 * @return The found packet reference. 104 * @return NULL if the mapping does not exist. 133 * @param[in] packet_id Packet identifier to be found. 134 * 135 * @return The found packet reference. 136 * @return NULL if the mapping does not exist. 137 * 105 138 */ 106 139 packet_t *pm_find(packet_id_t packet_id) 107 140 { 108 packet_map_t *map;109 packet_t *packet;110 111 141 if (!packet_id) 112 142 return NULL; 113 143 114 144 fibril_rwlock_read_lock(&pm_globals.lock); 115 if (packet_id > PACKET_MAP_SIZE * gpm_count(&pm_globals.packet_map)) { 116 fibril_rwlock_read_unlock(&pm_globals.lock); 117 return NULL; 118 } 119 map = gpm_get_index(&pm_globals.packet_map, PACKET_MAP_PAGE(packet_id)); 120 if (!map) { 121 fibril_rwlock_read_unlock(&pm_globals.lock); 122 return NULL; 123 } 124 packet = (*map) [PACKET_MAP_INDEX(packet_id)]; 145 146 unsigned long key = packet_id; 147 link_t *link = hash_table_find(&pm_globals.packet_map, &key); 148 149 packet_t *packet; 150 if (link != NULL) { 151 pm_entry_t *entry = 152 hash_table_get_instance(link, pm_entry_t, link); 153 packet = entry->packet; 154 } else 155 packet = NULL; 156 125 157 fibril_rwlock_read_unlock(&pm_globals.lock); 126 158 return packet; … … 129 161 /** Adds the packet mapping. 130 162 * 131 * @param[in] packet The packet to be remembered. 132 * @return EOK on success. 133 * @return EINVAL if the packet is not valid. 134 * @return EINVAL if the packet map is not initialized. 135 * @return ENOMEM if there is not enough memory left. 163 * @param[in] packet Packet to be remembered. 164 * 165 * @return EOK on success. 166 * @return EINVAL if the packet is not valid. 167 * @return ENOMEM if there is not enough memory left. 168 * 136 169 */ 137 170 int pm_add(packet_t *packet) 138 171 { 139 packet_map_t *map;140 int rc;141 142 172 if (!packet_is_valid(packet)) 143 173 return EINVAL; 144 174 145 175 fibril_rwlock_write_lock(&pm_globals.lock); 146 147 if (PACKET_MAP_PAGE(packet->packet_id) < 148 gpm_count(&pm_globals.packet_map)) { 149 map = gpm_get_index(&pm_globals.packet_map, 150 PACKET_MAP_PAGE(packet->packet_id)); 151 } else { 152 do { 153 map = (packet_map_t *) malloc(sizeof(packet_map_t)); 154 if (!map) { 155 fibril_rwlock_write_unlock(&pm_globals.lock); 156 return ENOMEM; 157 } 158 bzero(map, sizeof(packet_map_t)); 159 rc = gpm_add(&pm_globals.packet_map, map); 160 if (rc < 0) { 161 fibril_rwlock_write_unlock(&pm_globals.lock); 162 free(map); 163 return rc; 164 } 165 } while (PACKET_MAP_PAGE(packet->packet_id) >= 166 gpm_count(&pm_globals.packet_map)); 176 177 pm_entry_t *entry = malloc(sizeof(pm_entry_t)); 178 if (entry == NULL) { 179 fibril_rwlock_write_unlock(&pm_globals.lock); 180 return ENOMEM; 167 181 } 168 169 (*map) [PACKET_MAP_INDEX(packet->packet_id)] = packet; 182 183 entry->packet = packet; 184 185 unsigned long key = packet->packet_id; 186 hash_table_insert(&pm_globals.packet_map, &key, &entry->link); 187 170 188 fibril_rwlock_write_unlock(&pm_globals.lock); 189 171 190 return EOK; 172 191 } 173 192 174 /** Releases the packet map. */ 193 /** Remove the packet mapping 194 * 195 * @param[in] packet The packet to be removed 196 * 197 */ 198 void pm_remove(packet_t *packet) 199 { 200 assert(packet_is_valid(packet)); 201 202 fibril_rwlock_write_lock(&pm_globals.lock); 203 204 unsigned long key = packet->packet_id; 205 hash_table_remove(&pm_globals.packet_map, &key, 1); 206 207 fibril_rwlock_write_unlock(&pm_globals.lock); 208 } 209 210 /** Release the packet map. */ 175 211 void pm_destroy(void) 176 212 { 177 int count;178 int index;179 packet_map_t *map;180 packet_t *packet;181 182 213 fibril_rwlock_write_lock(&pm_globals.lock); 183 count = gpm_count(&pm_globals.packet_map); 184 while (count > 0) { 185 map = gpm_get_index(&pm_globals.packet_map, count - 1); 186 for (index = PACKET_MAP_SIZE - 1; index >= 0; --index) { 187 packet = (*map)[index]; 188 if (packet_is_valid(packet)) 189 munmap(packet, packet->length); 190 } 191 } 192 gpm_destroy(&pm_globals.packet_map, free); 193 /* leave locked */ 214 hash_table_apply(&pm_globals.packet_map, pm_free_wrapper, NULL); 215 hash_table_destroy(&pm_globals.packet_map); 216 /* Leave locked */ 194 217 } 195 218 … … 199 222 * The packet is inserted right before the packets of the same order value. 200 223 * 201 * @param[in,out] first The first packet of the queue. Sets the first packet of 202 * the queue. The original first packet may be shifted by 203 * the new packet. 204 * @param[in] packet The packet to be added. 205 * @param[in] order The packet order value. 206 * @param[in] metric The metric value of the packet. 207 * @return EOK on success. 208 * @return EINVAL if the first parameter is NULL. 209 * @return EINVAL if the packet is not valid. 224 * @param[in,out] first First packet of the queue. Sets the first 225 * packet of the queue. The original first packet 226 * may be shifted by the new packet. 227 * @param[in] packet Packet to be added. 228 * @param[in] order Packet order value. 229 * @param[in] metric Metric value of the packet. 230 * 231 * @return EOK on success. 232 * @return EINVAL if the first parameter is NULL. 233 * @return EINVAL if the packet is not valid. 234 * 210 235 */ 211 236 int pq_add(packet_t **first, packet_t *packet, size_t order, size_t metric) 212 237 { 213 packet_t *item; 214 215 if (!first || !packet_is_valid(packet)) 238 if ((!first) || (!packet_is_valid(packet))) 216 239 return EINVAL; 217 240 218 241 pq_set_order(packet, order, metric); 219 242 if (packet_is_valid(*first)) { 220 item = * first; 243 packet_t *cur = *first; 244 221 245 do { 222 if (item->order < order) { 223 if (item->next) { 224 item = pm_find(item->next); 225 } else { 226 item->next = packet->packet_id; 227 packet->previous = item->packet_id; 246 if (cur->order < order) { 247 if (cur->next) 248 cur = pm_find(cur->next); 249 else { 250 cur->next = packet->packet_id; 251 packet->previous = cur->packet_id; 252 228 253 return EOK; 229 254 } 230 255 } else { 231 packet->previous = item->previous; 232 packet->next = item->packet_id; 233 item->previous = packet->packet_id; 234 item = pm_find(packet->previous); 235 if (item) 236 item->next = packet->packet_id; 256 packet->previous = cur->previous; 257 packet->next = cur->packet_id; 258 259 cur->previous = packet->packet_id; 260 cur = pm_find(packet->previous); 261 262 if (cur) 263 cur->next = packet->packet_id; 237 264 else 238 265 *first = packet; 266 239 267 return EOK; 240 268 } 241 } while (packet_is_valid( item));269 } while (packet_is_valid(cur)); 242 270 } 271 243 272 *first = packet; 244 273 return EOK; … … 312 341 313 342 next = pm_find(packet->next); 314 if (next) {343 if (next) 315 344 next->previous = packet->previous; 316 previous = pm_find(next->previous); 317 if (previous) 318 previous->next = next->packet_id; 319 } 345 346 previous = pm_find(packet->previous); 347 if (previous) 348 previous->next = packet->next ; 349 320 350 packet->previous = 0; 321 351 packet->next = 0; -
uspace/lib/c/generic/ns.c
r8367d1d rd7ff048 54 54 if (!exch) 55 55 return NULL; 56 56 57 async_sess_t *sess = 57 58 async_connect_me_to(mgmt, exch, service, arg2, arg3); 58 59 async_exchange_end(exch); 59 60 60 61 if (!sess) 61 62 return NULL; … … 75 76 { 76 77 async_exch_t *exch = async_exchange_begin(session_ns); 78 if (!exch) 79 return NULL; 77 80 async_sess_t *sess = 78 81 async_connect_me_to_blocking(mgmt, exch, service, arg2, arg3); 79 82 async_exchange_end(exch); 83 84 if (!sess) 85 return NULL; 80 86 81 87 /* -
uspace/lib/c/include/adt/hash_table.h
r8367d1d rd7ff048 86 86 extern bool hash_table_create(hash_table_t *, hash_count_t, hash_count_t, 87 87 hash_table_operations_t *); 88 extern void hash_table_clear(hash_table_t *); 88 89 extern void hash_table_insert(hash_table_t *, unsigned long [], link_t *); 89 90 extern link_t *hash_table_find(hash_table_t *, unsigned long []); -
uspace/lib/c/include/ipc/dev_iface.h
r8367d1d rd7ff048 36 36 typedef enum { 37 37 HW_RES_DEV_IFACE = 0, 38 /** Character device interface */ 38 39 CHAR_DEV_IFACE, 39 40 41 /** Network interface controller interface */ 42 NIC_DEV_IFACE, 43 40 44 /** Interface provided by any PCI device. */ 41 45 PCI_DEV_IFACE, -
uspace/lib/c/include/ipc/devman.h
r8367d1d rd7ff048 146 146 typedef enum { 147 147 DRIVER_DEV_ADD = IPC_FIRST_USER_METHOD, 148 DRIVER_DEV_ADDED, 148 149 DRIVER_DEV_REMOVE, 149 150 DRIVER_DEV_GONE, -
uspace/lib/c/include/ipc/il.h
r8367d1d rd7ff048 54 54 NET_IL_MTU_CHANGED, 55 55 56 /** 57 * Device address changed message 58 * @see il_addr_changed_msg() 59 */ 60 NET_IL_ADDR_CHANGED, 61 56 62 /** Packet received message. 57 63 * @see il_received_msg() -
uspace/lib/c/include/ipc/net.h
r8367d1d rd7ff048 277 277 * 278 278 */ 279 #define IPC_GET_DEVICE(call) (( device_id_t) IPC_GET_ARG1(call))279 #define IPC_GET_DEVICE(call) ((nic_device_id_t) IPC_GET_ARG1(call)) 280 280 281 281 /** Return the packet identifier message argument. … … 298 298 * 299 299 */ 300 #define IPC_GET_STATE(call) ((device_state_t) IPC_GET_ARG2(call)) 300 #define IPC_GET_STATE(call) ((nic_device_state_t) IPC_GET_ARG2(call)) 301 302 /** Return the device handle argument 303 * 304 * @param[in] call Message call structure 305 * 306 */ 307 #define IPC_GET_DEVICE_HANDLE(call) ((devman_handle_t) IPC_GET_ARG2(call)) 308 309 /** Return the device driver service message argument. 310 * 311 * @param[in] call Message call structure. 312 * 313 */ 314 #define IPC_GET_SERVICE(call) ((services_t) IPC_GET_ARG3(call)) 315 316 /** Return the target service message argument. 317 * 318 * @param[in] call Message call structure. 319 * 320 */ 321 #define IPC_GET_TARGET(call) ((services_t) IPC_GET_ARG3(call)) 322 323 /** Return the sender service message argument. 324 * 325 * @param[in] call Message call structure. 326 * 327 */ 328 #define IPC_GET_SENDER(call) ((services_t) IPC_GET_ARG3(call)) 301 329 302 330 /** Return the maximum transmission unit message argument. … … 305 333 * 306 334 */ 307 #define IPC_GET_MTU(call) ((size_t) IPC_GET_ARG2(call)) 308 309 /** Return the device driver service message argument. 310 * 311 * @param[in] call Message call structure. 312 * 313 */ 314 #define IPC_GET_SERVICE(call) ((services_t) IPC_GET_ARG3(call)) 315 316 /** Return the target service message argument. 317 * 318 * @param[in] call Message call structure. 319 * 320 */ 321 #define IPC_GET_TARGET(call) ((services_t) IPC_GET_ARG3(call)) 322 323 /** Return the sender service message argument. 324 * 325 * @param[in] call Message call structure. 326 * 327 */ 328 #define IPC_GET_SENDER(call) ((services_t) IPC_GET_ARG3(call)) 335 #define IPC_GET_MTU(call) ((size_t) IPC_GET_ARG3(call)) 329 336 330 337 /** Return the error service message argument. -
uspace/lib/c/include/ipc/net_net.h
r8367d1d rd7ff048 43 43 /** Networking subsystem central module messages. */ 44 44 typedef enum { 45 /** Return s thegeneral configuration45 /** Return general configuration 46 46 * @see net_get_conf_req() 47 47 */ 48 48 NET_NET_GET_CONF = NET_FIRST, 49 /** Return s thedevice specific configuration49 /** Return device specific configuration 50 50 * @see net_get_device_conf_req() 51 51 */ 52 52 NET_NET_GET_DEVICE_CONF, 53 /** Starts the networking stack. */ 54 NET_NET_STARTUP, 53 /** Return number of mastered devices */ 54 NET_NET_GET_DEVICES_COUNT, 55 /** Return names and device IDs of all devices */ 56 NET_NET_GET_DEVICES, 57 /** Notify the networking service about a ready device */ 58 NET_NET_DRIVER_READY 55 59 } net_messages; 56 60 -
uspace/lib/c/include/ipc/nil.h
r8367d1d rd7ff048 70 70 */ 71 71 NET_NIL_BROADCAST_ADDR, 72 /** Device has changed address 73 * @see nil_addr_changed_msg() 74 */ 75 NET_NIL_ADDR_CHANGED 72 76 } nil_messages; 73 77 -
uspace/lib/c/include/ipc/services.h
r8367d1d rd7ff048 49 49 SERVICE_CLIPBOARD = FOURCC('c', 'l', 'i', 'p'), 50 50 SERVICE_NETWORKING = FOURCC('n', 'e', 't', ' '), 51 SERVICE_LO = FOURCC('l', 'o', ' ', ' '),52 SERVICE_NE2000 = FOURCC('n', 'e', '2', 'k'),53 51 SERVICE_ETHERNET = FOURCC('e', 't', 'h', ' '), 54 52 SERVICE_NILDUMMY = FOURCC('n', 'i', 'l', 'd'), -
uspace/lib/c/include/net/device.h
r8367d1d rd7ff048 1 1 /* 2 2 * Copyright (c) 2009 Lukas Mejdrech 3 * Copyright (c) 2011 Radim Vansa 3 4 * All rights reserved. 4 5 * … … 39 40 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) 41 62 42 63 /** Device identifier to generic type map declaration. */ 43 #define DEVICE_MAP_DECLARE 64 #define DEVICE_MAP_DECLARE INT_MAP_DECLARE 44 65 45 66 /** Device identifier to generic type map implementation. */ 46 #define DEVICE_MAP_IMPLEMENT INT_MAP_IMPLEMENT 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 47 71 48 72 /** Invalid device identifier. */ 49 #define DEVICE_INVALID_ID (-1) 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" 50 87 51 88 /** Device identifier type. */ 52 typedef int device_id_t; 53 54 /** Device state type. */ 55 typedef enum device_state device_state_t; 56 57 /** Type definition of the device usage statistics. 58 * @see device_stats 59 */ 60 typedef struct device_stats device_stats_t; 89 typedef int nic_device_id_t; 90 91 /** 92 * Structure covering the MAC address. 93 */ 94 typedef struct nic_address { 95 uint8_t address[ETH_ADDR]; 96 } nic_address_t; 61 97 62 98 /** Device state. */ 63 enum 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 }; 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; 73 164 74 165 /** Device usage statistics. */ 75 structdevice_stats {76 /** Total packets received . */166 typedef struct nic_device_stats { 167 /** Total packets received (accepted). */ 77 168 unsigned long receive_packets; 78 169 /** Total packets transmitted. */ 79 170 unsigned long send_packets; 80 /** Total bytes received . */171 /** Total bytes received (accepted). */ 81 172 unsigned long receive_bytes; 82 173 /** Total bytes transmitted. */ … … 86 177 /** Packet transmition problems counter. */ 87 178 unsigned long send_errors; 88 /** N o space in buffers counter.*/179 /** Number of frames dropped due to insufficient space in RX buffers */ 89 180 unsigned long receive_dropped; 90 /** N o space available counter.*/181 /** Number of frames dropped due to insufficient space in TX buffers */ 91 182 unsigned long send_dropped; 92 /** Total multicast packets received. */ 93 unsigned long multicast; 183 /** Total multicast packets received (accepted). */ 184 unsigned long receive_multicast; 185 /** Total broadcast packets received (accepted). */ 186 unsigned long receive_broadcast; 94 187 /** The number of collisions due to congestion on the medium. */ 95 188 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; 96 195 97 196 /* detailed receive_errors */ … … 129 228 /** Total compressed packet transmitted. */ 130 229 unsigned long send_compressed; 131 }; 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 } 132 476 133 477 #endif -
uspace/lib/c/include/net/packet.h
r8367d1d rd7ff048 38 38 #define LIBC_PACKET_H_ 39 39 40 #include <sys/types.h> 41 40 42 /** Packet identifier type. 41 43 * Value zero is used as an invalid identifier. 42 44 */ 43 typedef int packet_id_t;45 typedef sysarg_t packet_id_t; 44 46 45 47 /** Type definition of the packet. … … 51 53 * @see packet_dimension 52 54 */ 53 typedef struct packet_dimension 55 typedef struct packet_dimension packet_dimension_t; 54 56 55 57 /** Packet dimension. */ … … 71 73 extern packet_t *pm_find(packet_id_t); 72 74 extern int pm_add(packet_t *); 75 extern void pm_remove(packet_t *); 73 76 extern int pm_init(void); 74 77 extern void pm_destroy(void); -
uspace/lib/c/include/net/packet_header.h
r8367d1d rd7ff048 61 61 #define PACKET_MAGIC_VALUE 0x11227788 62 62 63 /** Maximum total length of the packet */ 64 #define PACKET_MAX_LENGTH 65536 65 63 66 /** Packet header. */ 64 67 struct packet { … … 85 88 */ 86 89 size_t length; 90 91 /** Offload info provided by the NIC */ 92 uint32_t offload_info; 93 94 /** Mask which bits in offload info are valid */ 95 uint32_t offload_mask; 87 96 88 97 /** Stored source and destination addresses length. */
Note:
See TracChangeset
for help on using the changeset viewer.