Changeset e9caf47 in mainline
- Timestamp:
- 2010-10-27T23:06:48Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- e8199d77
- Parents:
- 0a3fbc7
- Location:
- uspace/srv/net/il/arp
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/il/arp/arp.c
r0a3fbc7 re9caf47 28 28 29 29 /** @addtogroup arp 30 * 30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * ARP module implementation. 35 * @see arp.h 36 */ 34 * ARP module implementation. 35 * @see arp.h 36 */ 37 38 #include "arp.h" 39 #include "arp_header.h" 40 #include "arp_oc.h" 41 #include "arp_module.h" 37 42 38 43 #include <async.h> … … 43 48 #include <str.h> 44 49 #include <task.h> 50 #include <adt/measured_strings.h> 45 51 #include <ipc/ipc.h> 46 52 #include <ipc/services.h> … … 53 59 #include <net/modules.h> 54 60 #include <net/device.h> 55 #include <arp_interface.h> 61 #include <net/packet.h> 62 56 63 #include <nil_interface.h> 57 64 #include <protocol_map.h> 58 #include <adt/measured_strings.h>59 #include <net/packet.h>60 65 #include <packet_client.h> 61 66 #include <packet_remote.h> … … 63 68 #include <il_local.h> 64 69 65 #include "arp.h" 66 #include "arp_header.h" 67 #include "arp_oc.h" 68 #include "arp_module.h" 69 70 71 /** ARP module name. 72 */ 70 71 /** ARP module name. */ 73 72 #define NAME "arp" 74 73 75 /** ARP global data. 76 */ 77 arp_globals_t arp_globals; 74 /** ARP global data. */ 75 arp_globals_t arp_globals; 76 77 DEVICE_MAP_IMPLEMENT(arp_cache, arp_device_t); 78 INT_MAP_IMPLEMENT(arp_protos, arp_proto_t); 79 GENERIC_CHAR_MAP_IMPLEMENT(arp_addr, measured_string_t); 78 80 79 81 /** Clears the device specific data. 80 * @param[in] device The device specific data. 81 */ 82 void arp_clear_device(arp_device_ref device); 83 84 /** Creates new protocol specific data. 85 * Allocates and returns the needed memory block as the proto parameter. 86 * @param[out] proto The allocated protocol specific data. 87 * @param[in] service The protocol module service. 88 * @param[in] address The actual protocol device address. 89 * @returns EOK on success. 90 * @returns ENOMEM if there is not enough memory left. 91 */ 92 int arp_proto_create(arp_proto_ref * proto, services_t service, measured_string_ref address); 93 94 /** @name Message processing functions 95 */ 96 /*@{*/ 97 98 /** Registers the device. 99 * Creates new device entry in the cache or updates the protocol address if the device with the device identifier and the driver service exists. 100 * @param[in] device_id The device identifier. 101 * @param[in] service The device driver service. 102 * @param[in] protocol The protocol service. 103 * @param[in] address The actual device protocol address. 104 * @returns EOK on success. 105 * @returns EEXIST if another device with the same device identifier and different driver service exists. 106 * @returns ENOMEM if there is not enough memory left. 107 * @returns Other error codes as defined for the measured_strings_return() function. 108 */ 109 int arp_device_message(device_id_t device_id, services_t service, services_t protocol, measured_string_ref address); 110 111 /** Updates the device content length according to the new MTU value. 112 * @param[in] device_id The device identifier. 113 * @param[in] mtu The new mtu value. 114 * @returns ENOENT if device is not found. 115 * @returns EOK on success. 116 */ 117 int arp_mtu_changed_message(device_id_t device_id, size_t mtu); 118 119 /** Processes the received ARP packet. 120 * Updates the source hardware address if the source entry exists or the packet is targeted to my protocol address. 121 * Responses to the ARP request if the packet is the ARP request and is targeted to my address. 122 * @param[in] device_id The source device identifier. 123 * @param[in,out] packet The received packet. 124 * @returns EOK on success and the packet is no longer needed. 125 * @returns 1 on success and the packet has been reused. 126 * @returns EINVAL if the packet is too small to carry an ARP packet. 127 * @returns EINVAL if the received address lengths differs from the registered values. 128 * @returns ENOENT if the device is not found in the cache. 129 * @returns ENOENT if the protocol for the device is not found in the cache. 130 * @returns ENOMEM if there is not enough memory left. 131 */ 132 int arp_receive_message(device_id_t device_id, packet_t packet); 133 134 /** Returns the hardware address for the given protocol address. 135 * Sends the ARP request packet if the hardware address is not found in the cache. 136 * @param[in] device_id The device identifier. 137 * @param[in] protocol The protocol service. 138 * @param[in] target The target protocol address. 139 * @returns The hardware address of the target. 140 * @returns NULL if the target parameter is NULL. 141 * @returns NULL if the device is not found. 142 * @returns NULL if the device packet is too small to send a request. 143 * @returns NULL if the hardware address is not found in the cache. 144 */ 145 measured_string_ref arp_translate_message(device_id_t device_id, services_t protocol, measured_string_ref target); 146 147 /*@}*/ 148 149 DEVICE_MAP_IMPLEMENT(arp_cache, arp_device_t) 150 151 INT_MAP_IMPLEMENT(arp_protos, arp_proto_t) 152 153 GENERIC_CHAR_MAP_IMPLEMENT(arp_addr, measured_string_t) 154 155 int arp_clean_cache_req(int arp_phone){ 82 * 83 * @param[in] device The device specific data. 84 */ 85 static void arp_clear_device(arp_device_ref device) 86 { 87 int count; 88 arp_proto_ref proto; 89 90 for (count = arp_protos_count(&device->protos) - 1; count >= 0; 91 count--) { 92 proto = arp_protos_get_index(&device->protos, count); 93 if (proto) { 94 if (proto->addr) 95 free(proto->addr); 96 if (proto->addr_data) 97 free(proto->addr_data); 98 arp_addr_destroy(&proto->addresses); 99 } 100 } 101 arp_protos_clear(&device->protos); 102 } 103 104 static int arp_clean_cache_req(int arp_phone) 105 { 156 106 int count; 157 107 arp_device_ref device; 158 108 159 109 fibril_rwlock_write_lock(&arp_globals.lock); 160 for(count = arp_cache_count(&arp_globals.cache) - 1; count >= 0; -- count){ 110 for (count = arp_cache_count(&arp_globals.cache) - 1; count >= 0; 111 count--) { 161 112 device = arp_cache_get_index(&arp_globals.cache, count); 162 if (device){113 if (device) { 163 114 arp_clear_device(device); 164 if (device->addr_data){115 if (device->addr_data) 165 116 free(device->addr_data); 166 } 167 if(device->broadcast_data){ 117 if (device->broadcast_data) 168 118 free(device->broadcast_data); 169 }170 119 } 171 120 } … … 176 125 } 177 126 178 int arp_clear_address_req(int arp_phone, device_id_t device_id, services_t protocol, measured_string_ref address){ 127 static int 128 arp_clear_address_req(int arp_phone, device_id_t device_id, services_t protocol, 129 measured_string_ref address) 130 { 179 131 arp_device_ref device; 180 132 arp_proto_ref proto; … … 182 134 fibril_rwlock_write_lock(&arp_globals.lock); 183 135 device = arp_cache_find(&arp_globals.cache, device_id); 184 if (! device){136 if (!device) { 185 137 fibril_rwlock_write_unlock(&arp_globals.lock); 186 138 return ENOENT; 187 139 } 188 140 proto = arp_protos_find(&device->protos, protocol); 189 if (! proto){141 if (!proto) { 190 142 fibril_rwlock_write_unlock(&arp_globals.lock); 191 143 return ENOENT; … … 196 148 } 197 149 198 void arp_clear_device(arp_device_ref device){ 199 int count; 200 arp_proto_ref proto; 201 202 for(count = arp_protos_count(&device->protos) - 1; count >= 0; -- count){ 203 proto = arp_protos_get_index(&device->protos, count); 204 if(proto){ 205 if(proto->addr){ 206 free(proto->addr); 207 } 208 if(proto->addr_data){ 209 free(proto->addr_data); 210 } 211 arp_addr_destroy(&proto->addresses); 212 } 213 } 214 arp_protos_clear(&device->protos); 215 } 216 217 int arp_clear_device_req(int arp_phone, device_id_t device_id){ 150 151 static int arp_clear_device_req(int arp_phone, device_id_t device_id) 152 { 218 153 arp_device_ref device; 219 154 220 155 fibril_rwlock_write_lock(&arp_globals.lock); 221 156 device = arp_cache_find(&arp_globals.cache, device_id); 222 if (! device){157 if (!device) { 223 158 fibril_rwlock_write_unlock(&arp_globals.lock); 224 159 return ENOENT; … … 230 165 } 231 166 232 int arp_device_message(device_id_t device_id, services_t service, services_t protocol, measured_string_ref address){ 167 /** Creates new protocol specific data. 168 * 169 * Allocates and returns the needed memory block as the proto parameter. 170 * 171 * @param[out] proto The allocated protocol specific data. 172 * @param[in] service The protocol module service. 173 * @param[in] address The actual protocol device address. 174 * @returns EOK on success. 175 * @returns ENOMEM if there is not enough memory left. 176 */ 177 static int 178 arp_proto_create(arp_proto_ref *proto, services_t service, 179 measured_string_ref address) 180 { 181 ERROR_DECLARE; 182 183 *proto = (arp_proto_ref) malloc(sizeof(arp_proto_t)); 184 if (!*proto) 185 return ENOMEM; 186 (*proto)->service = service; 187 (*proto)->addr = address; 188 (*proto)->addr_data = address->value; 189 if (ERROR_OCCURRED(arp_addr_initialize(&(*proto)->addresses))) { 190 free(*proto); 191 return ERROR_CODE; 192 } 193 return EOK; 194 } 195 196 /** Registers the device. 197 * 198 * Creates new device entry in the cache or updates the protocol address if the 199 * device with the device identifier and the driver service exists. 200 * 201 * @param[in] device_id The device identifier. 202 * @param[in] service The device driver service. 203 * @param[in] protocol The protocol service. 204 * @param[in] address The actual device protocol address. 205 * @returns EOK on success. 206 * @returns EEXIST if another device with the same device identifier 207 * and different driver service exists. 208 * @returns ENOMEM if there is not enough memory left. 209 * @returns Other error codes as defined for the 210 * measured_strings_return() function. 211 */ 212 static int 213 arp_device_message(device_id_t device_id, services_t service, 214 services_t protocol, measured_string_ref address) 215 { 233 216 ERROR_DECLARE; 234 217 … … 241 224 // an existing device? 242 225 device = arp_cache_find(&arp_globals.cache, device_id); 243 if (device){244 if (device->service != service){226 if (device) { 227 if (device->service != service) { 245 228 printf("Device %d already exists\n", device->device_id); 246 229 fibril_rwlock_write_unlock(&arp_globals.lock); … … 248 231 } 249 232 proto = arp_protos_find(&device->protos, protocol); 250 if (proto){233 if (proto) { 251 234 free(proto->addr); 252 235 free(proto->addr_data); 253 236 proto->addr = address; 254 237 proto->addr_data = address->value; 255 }else{ 256 if(ERROR_OCCURRED(arp_proto_create(&proto, protocol, address))){ 238 } else { 239 if (ERROR_OCCURRED(arp_proto_create(&proto, protocol, 240 address))) { 257 241 fibril_rwlock_write_unlock(&arp_globals.lock); 258 242 return ERROR_CODE; 259 243 } 260 index = arp_protos_add(&device->protos, proto->service, proto); 261 if(index < 0){ 244 index = arp_protos_add(&device->protos, proto->service, 245 proto); 246 if (index < 0) { 262 247 fibril_rwlock_write_unlock(&arp_globals.lock); 263 248 free(proto); 264 249 return index; 265 250 } 266 printf("New protocol added:\n\tdevice id\t= %d\n\tproto\t= %d", device_id, protocol); 267 } 268 }else{ 251 printf("New protocol added:\n\tdevice id\t= " 252 "%d\n\tproto\t= %d", device_id, protocol); 253 } 254 } else { 269 255 hardware = hardware_map(service); 270 if (! hardware){256 if (!hardware) 271 257 return ENOENT; 272 }258 273 259 // create a new device 274 260 device = (arp_device_ref) malloc(sizeof(arp_device_t)); 275 if (! device){261 if (!device) { 276 262 fibril_rwlock_write_unlock(&arp_globals.lock); 277 263 return ENOMEM; … … 279 265 device->hardware = hardware; 280 266 device->device_id = device_id; 281 if(ERROR_OCCURRED(arp_protos_initialize(&device->protos)) 282 || ERROR_OCCURRED(arp_proto_create(&proto, protocol, address))){ 267 if (ERROR_OCCURRED(arp_protos_initialize(&device->protos)) || 268 ERROR_OCCURRED(arp_proto_create(&proto, protocol, 269 address))) { 283 270 fibril_rwlock_write_unlock(&arp_globals.lock); 284 271 free(device); … … 286 273 } 287 274 index = arp_protos_add(&device->protos, proto->service, proto); 288 if (index < 0){275 if (index < 0) { 289 276 fibril_rwlock_write_unlock(&arp_globals.lock); 290 277 arp_protos_destroy(&device->protos); … … 293 280 } 294 281 device->service = service; 282 295 283 // bind the new one 296 device->phone = nil_bind_service(device->service, (ipcarg_t) device->device_id, SERVICE_ARP, arp_globals.client_connection); 297 if(device->phone < 0){ 284 device->phone = nil_bind_service(device->service, 285 (ipcarg_t) device->device_id, SERVICE_ARP, 286 arp_globals.client_connection); 287 if (device->phone < 0) { 298 288 fibril_rwlock_write_unlock(&arp_globals.lock); 299 289 arp_protos_destroy(&device->protos); … … 301 291 return EREFUSED; 302 292 } 293 303 294 // get packet dimensions 304 if(ERROR_OCCURRED(nil_packet_size_req(device->phone, device_id, &device->packet_dimension))){ 295 if (ERROR_OCCURRED(nil_packet_size_req(device->phone, device_id, 296 &device->packet_dimension))) { 305 297 fibril_rwlock_write_unlock(&arp_globals.lock); 306 298 arp_protos_destroy(&device->protos); … … 308 300 return ERROR_CODE; 309 301 } 302 310 303 // get hardware address 311 if(ERROR_OCCURRED(nil_get_addr_req(device->phone, device_id, &device->addr, &device->addr_data))){ 304 if (ERROR_OCCURRED(nil_get_addr_req(device->phone, device_id, 305 &device->addr, &device->addr_data))) { 312 306 fibril_rwlock_write_unlock(&arp_globals.lock); 313 307 arp_protos_destroy(&device->protos); … … 315 309 return ERROR_CODE; 316 310 } 311 317 312 // get broadcast address 318 if(ERROR_OCCURRED(nil_get_broadcast_addr_req(device->phone, device_id, &device->broadcast_addr, &device->broadcast_data))){ 313 if (ERROR_OCCURRED(nil_get_broadcast_addr_req(device->phone, 314 device_id, &device->broadcast_addr, 315 &device->broadcast_data))) { 319 316 fibril_rwlock_write_unlock(&arp_globals.lock); 320 317 free(device->addr); … … 324 321 return ERROR_CODE; 325 322 } 326 if(ERROR_OCCURRED(arp_cache_add(&arp_globals.cache, device->device_id, device))){ 323 324 if (ERROR_OCCURRED(arp_cache_add(&arp_globals.cache, 325 device->device_id, device))) { 327 326 fibril_rwlock_write_unlock(&arp_globals.lock); 328 327 free(device->addr); … … 334 333 return ERROR_CODE; 335 334 } 336 printf("%s: Device registered (id: %d, type: 0x%x, service: %d, proto: %d)\n", 337 NAME, device->device_id, device->hardware, device->service, protocol); 335 printf("%s: Device registered (id: %d, type: 0x%x, service: %d," 336 " proto: %d)\n", NAME, device->device_id, device->hardware, 337 device->service, protocol); 338 338 } 339 339 fibril_rwlock_write_unlock(&arp_globals.lock); 340 return EOK; 341 } 342 343 int arp_device_req(int arp_phone, device_id_t device_id, services_t protocol, services_t netif, measured_string_ref address){ 344 ERROR_DECLARE; 345 346 measured_string_ref tmp; 347 348 // copy the given address for exclusive use 349 tmp = measured_string_copy(address); 350 if(ERROR_OCCURRED(arp_device_message(device_id, netif, protocol, tmp))){ 351 free(tmp->value); 352 free(tmp); 353 } 354 return ERROR_CODE; 355 } 356 357 int arp_initialize(async_client_conn_t client_connection){ 340 341 return EOK; 342 } 343 344 /** Initializes the ARP module. 345 * 346 * @param[in] client_connection The client connection processing function. 347 * The module skeleton propagates its own one. 348 * @returns EOK on success. 349 * @returns ENOMEM if there is not enough memory left. 350 */ 351 int arp_initialize(async_client_conn_t client_connection) 352 { 358 353 ERROR_DECLARE; 359 354 … … 366 361 } 367 362 368 int arp_message_standalone(ipc_callid_t callid, ipc_call_t *call, 369 ipc_call_t *answer, int *answer_count) 370 { 371 ERROR_DECLARE; 372 373 measured_string_ref address; 374 measured_string_ref translation; 375 char * data; 376 packet_t packet; 377 packet_t next; 378 379 *answer_count = 0; 380 switch (IPC_GET_METHOD(*call)) { 381 case IPC_M_PHONE_HUNGUP: 382 return EOK; 383 case NET_ARP_DEVICE: 384 ERROR_PROPAGATE(measured_strings_receive(&address, &data, 1)); 385 if(ERROR_OCCURRED(arp_device_message(IPC_GET_DEVICE(call), IPC_GET_SERVICE(call), ARP_GET_NETIF(call), address))){ 386 free(address); 387 free(data); 388 } 389 return ERROR_CODE; 390 case NET_ARP_TRANSLATE: 391 ERROR_PROPAGATE(measured_strings_receive(&address, &data, 1)); 392 fibril_rwlock_read_lock(&arp_globals.lock); 393 translation = arp_translate_message(IPC_GET_DEVICE(call), IPC_GET_SERVICE(call), address); 394 free(address); 395 free(data); 396 if(! translation){ 397 fibril_rwlock_read_unlock(&arp_globals.lock); 398 return ENOENT; 399 } 400 ERROR_CODE = measured_strings_reply(translation, 1); 401 fibril_rwlock_read_unlock(&arp_globals.lock); 402 return ERROR_CODE; 403 case NET_ARP_CLEAR_DEVICE: 404 return arp_clear_device_req(0, IPC_GET_DEVICE(call)); 405 case NET_ARP_CLEAR_ADDRESS: 406 ERROR_PROPAGATE(measured_strings_receive(&address, &data, 1)); 407 arp_clear_address_req(0, IPC_GET_DEVICE(call), IPC_GET_SERVICE(call), address); 408 free(address); 409 free(data); 410 return EOK; 411 case NET_ARP_CLEAN_CACHE: 412 return arp_clean_cache_req(0); 413 case NET_IL_DEVICE_STATE: 414 // do nothing - keep the cache 415 return EOK; 416 case NET_IL_RECEIVED: 417 if(! ERROR_OCCURRED(packet_translate_remote(arp_globals.net_phone, &packet, IPC_GET_PACKET(call)))){ 418 fibril_rwlock_read_lock(&arp_globals.lock); 419 do{ 420 next = pq_detach(packet); 421 ERROR_CODE = arp_receive_message(IPC_GET_DEVICE(call), packet); 422 if(ERROR_CODE != 1){ 423 pq_release_remote(arp_globals.net_phone, packet_get_id(packet)); 424 } 425 packet = next; 426 }while(packet); 427 fibril_rwlock_read_unlock(&arp_globals.lock); 428 } 429 return ERROR_CODE; 430 case NET_IL_MTU_CHANGED: 431 return arp_mtu_changed_message(IPC_GET_DEVICE(call), IPC_GET_MTU(call)); 432 } 433 434 return ENOTSUP; 435 } 436 437 int arp_mtu_changed_message(device_id_t device_id, size_t mtu){ 363 /** Updates the device content length according to the new MTU value. 364 * 365 * @param[in] device_id The device identifier. 366 * @param[in] mtu The new mtu value. 367 * @returns ENOENT if device is not found. 368 * @returns EOK on success. 369 */ 370 static int arp_mtu_changed_message(device_id_t device_id, size_t mtu) 371 { 438 372 arp_device_ref device; 439 373 440 374 fibril_rwlock_write_lock(&arp_globals.lock); 441 375 device = arp_cache_find(&arp_globals.cache, device_id); 442 if (! device){376 if (!device) { 443 377 fibril_rwlock_write_unlock(&arp_globals.lock); 444 378 return ENOENT; 445 379 } 446 380 device->packet_dimension.content = mtu; 381 fibril_rwlock_write_unlock(&arp_globals.lock); 447 382 printf("arp - device %d changed mtu to %d\n\n", device_id, mtu); 448 fibril_rwlock_write_unlock(&arp_globals.lock); 449 return EOK; 450 } 451 452 int arp_proto_create(arp_proto_ref * proto, services_t service, measured_string_ref address){ 453 ERROR_DECLARE; 454 455 *proto = (arp_proto_ref) malloc(sizeof(arp_proto_t)); 456 if(!(*proto)){ 457 return ENOMEM; 458 } 459 (** proto).service = service; 460 (** proto).addr = address; 461 (** proto).addr_data = address->value; 462 if(ERROR_OCCURRED(arp_addr_initialize(&(** proto).addresses))){ 463 free(*proto); 464 return ERROR_CODE; 465 } 466 return EOK; 467 } 468 469 int arp_receive_message(device_id_t device_id, packet_t packet){ 383 return EOK; 384 } 385 386 /** Processes the received ARP packet. 387 * 388 * Updates the source hardware address if the source entry exists or the packet 389 * is targeted to my protocol address. 390 * Responses to the ARP request if the packet is the ARP request and is 391 * targeted to my address. 392 * 393 * @param[in] device_id The source device identifier. 394 * @param[in,out] packet The received packet. 395 * @returns EOK on success and the packet is no longer needed. 396 * @returns One on success and the packet has been reused. 397 * @returns EINVAL if the packet is too small to carry an ARP 398 * packet. 399 * @returns EINVAL if the received address lengths differs from 400 * the registered values. 401 * @returns ENOENT if the device is not found in the cache. 402 * @returns ENOENT if the protocol for the device is not found in 403 * the cache. 404 * @returns ENOMEM if there is not enough memory left. 405 */ 406 static int arp_receive_message(device_id_t device_id, packet_t packet) 407 { 470 408 ERROR_DECLARE; 471 409 … … 475 413 arp_proto_ref proto; 476 414 measured_string_ref hw_source; 477 uint8_t * 478 uint8_t * 479 uint8_t * 480 uint8_t * 415 uint8_t *src_hw; 416 uint8_t *src_proto; 417 uint8_t *des_hw; 418 uint8_t *des_proto; 481 419 482 420 length = packet_get_data_length(packet); 483 if (length <= sizeof(arp_header_t)){421 if (length <= sizeof(arp_header_t)) 484 422 return EINVAL; 485 } 423 486 424 device = arp_cache_find(&arp_globals.cache, device_id); 487 if (! device){425 if (!device) 488 426 return ENOENT; 489 } 427 490 428 header = (arp_header_ref) packet_get_data(packet); 491 if((ntohs(header->hardware) != device->hardware) 492 || (length < sizeof(arp_header_t) + header->hardware_length * 2u + header->protocol_length * 2u)){ 429 if ((ntohs(header->hardware) != device->hardware) || 430 (length < sizeof(arp_header_t) + header->hardware_length * 2U + 431 header->protocol_length * 2U)) { 493 432 return EINVAL; 494 433 } 495 proto = arp_protos_find(&device->protos, protocol_unmap(device->service, ntohs(header->protocol))); 496 if(! proto){ 434 435 proto = arp_protos_find(&device->protos, 436 protocol_unmap(device->service, ntohs(header->protocol))); 437 if (!proto) 497 438 return ENOENT; 498 } 439 499 440 src_hw = ((uint8_t *) header) + sizeof(arp_header_t); 500 441 src_proto = src_hw + header->hardware_length; 501 442 des_hw = src_proto + header->protocol_length; 502 443 des_proto = des_hw + header->hardware_length; 503 hw_source = arp_addr_find(&proto->addresses, (char *) src_proto, CONVERT_SIZE(uint8_t, char, header->protocol_length)); 444 hw_source = arp_addr_find(&proto->addresses, (char *) src_proto, 445 CONVERT_SIZE(uint8_t, char, header->protocol_length)); 504 446 // exists? 505 if(hw_source){ 506 if(hw_source->length != CONVERT_SIZE(uint8_t, char, header->hardware_length)){ 447 if (hw_source) { 448 if (hw_source->length != CONVERT_SIZE(uint8_t, char, 449 header->hardware_length)) { 507 450 return EINVAL; 508 451 } … … 510 453 } 511 454 // is my protocol address? 512 if(proto->addr->length != CONVERT_SIZE(uint8_t, char, header->protocol_length)){ 455 if (proto->addr->length != CONVERT_SIZE(uint8_t, char, 456 header->protocol_length)) { 513 457 return EINVAL; 514 458 } 515 if(! str_lcmp(proto->addr->value, (char *) des_proto, proto->addr->length)){ 459 if (!str_lcmp(proto->addr->value, (char *) des_proto, 460 proto->addr->length)) { 516 461 // not already upadted? 517 if(! hw_source){ 518 hw_source = measured_string_create_bulk((char *) src_hw, CONVERT_SIZE(uint8_t, char, header->hardware_length)); 519 if(! hw_source){ 462 if (!hw_source) { 463 hw_source = measured_string_create_bulk((char *) src_hw, 464 CONVERT_SIZE(uint8_t, char, 465 header->hardware_length)); 466 if (!hw_source) 520 467 return ENOMEM; 521 } 522 ERROR_PROPAGATE(arp_addr_add(&proto->addresses, (char *) src_proto, CONVERT_SIZE(uint8_t, char, header->protocol_length), hw_source)); 523 } 524 if(ntohs(header->operation) == ARPOP_REQUEST){ 468 469 ERROR_PROPAGATE(arp_addr_add(&proto->addresses, 470 (char *) src_proto, CONVERT_SIZE(uint8_t, char, 471 header->protocol_length), hw_source)); 472 } 473 if (ntohs(header->operation) == ARPOP_REQUEST) { 525 474 header->operation = htons(ARPOP_REPLY); 526 475 memcpy(des_proto, src_proto, header->protocol_length); 527 memcpy(src_proto, proto->addr->value, header->protocol_length); 528 memcpy(src_hw, device->addr->value, device->packet_dimension.addr_len); 529 memcpy(des_hw, hw_source->value, header->hardware_length); 530 ERROR_PROPAGATE(packet_set_addr(packet, src_hw, des_hw, header->hardware_length)); 531 nil_send_msg(device->phone, device_id, packet, SERVICE_ARP); 476 memcpy(src_proto, proto->addr->value, 477 header->protocol_length); 478 memcpy(src_hw, device->addr->value, 479 device->packet_dimension.addr_len); 480 memcpy(des_hw, hw_source->value, 481 header->hardware_length); 482 ERROR_PROPAGATE(packet_set_addr(packet, src_hw, des_hw, 483 header->hardware_length)); 484 nil_send_msg(device->phone, device_id, packet, 485 SERVICE_ARP); 532 486 return 1; 533 487 } 534 488 } 535 return EOK; 536 } 537 538 measured_string_ref arp_translate_message(device_id_t device_id, services_t protocol, measured_string_ref target){ 489 490 return EOK; 491 } 492 493 494 /** Returns the hardware address for the given protocol address. 495 * 496 * Sends the ARP request packet if the hardware address is not found in the 497 * cache. 498 * 499 * @param[in] device_id The device identifier. 500 * @param[in] protocol The protocol service. 501 * @param[in] target The target protocol address. 502 * @returns The hardware address of the target. 503 * @returns NULL if the target parameter is NULL. 504 * @returns NULL if the device is not found. 505 * @returns NULL if the device packet is too small to send a 506 * request. 507 * @returns NULL if the hardware address is not found in the cache. 508 */ 509 static measured_string_ref 510 arp_translate_message(device_id_t device_id, services_t protocol, 511 measured_string_ref target) 512 { 539 513 arp_device_ref device; 540 514 arp_proto_ref proto; … … 544 518 arp_header_ref header; 545 519 546 if (! target){520 if (!target) 547 521 return NULL; 548 } 522 549 523 device = arp_cache_find(&arp_globals.cache, device_id); 550 if (! device){524 if (!device) 551 525 return NULL; 552 } 526 553 527 proto = arp_protos_find(&device->protos, protocol); 554 if ((! proto) || (proto->addr->length != target->length)){528 if (!proto || (proto->addr->length != target->length)) 555 529 return NULL; 556 } 530 557 531 addr = arp_addr_find(&proto->addresses, target->value, target->length); 558 if (addr){532 if (addr) 559 533 return addr; 560 } 534 561 535 // ARP packet content size = header + (address + translation) * 2 562 length = 8 + (CONVERT_SIZE(char, uint8_t, proto->addr->length) + CONVERT_SIZE(char, uint8_t, device->addr->length)) * 2; 563 if(length > device->packet_dimension.content){ 536 length = 8 + 2 * (CONVERT_SIZE(char, uint8_t, proto->addr->length) + 537 CONVERT_SIZE(char, uint8_t, device->addr->length)); 538 if (length > device->packet_dimension.content) 564 539 return NULL; 565 } 566 packet = packet_get_4_remote(arp_globals.net_phone, device->packet_dimension.addr_len, device->packet_dimension.prefix, length, device->packet_dimension.suffix); 567 if(! packet){ 540 541 packet = packet_get_4_remote(arp_globals.net_phone, 542 device->packet_dimension.addr_len, device->packet_dimension.prefix, 543 length, device->packet_dimension.suffix); 544 if (!packet) 568 545 return NULL; 569 } 546 570 547 header = (arp_header_ref) packet_suffix(packet, length); 571 if (! header){548 if (!header) { 572 549 pq_release_remote(arp_globals.net_phone, packet_get_id(packet)); 573 550 return NULL; 574 551 } 552 575 553 header->hardware = htons(device->hardware); 576 554 header->hardware_length = (uint8_t) device->addr->length; … … 579 557 header->operation = htons(ARPOP_REQUEST); 580 558 length = sizeof(arp_header_t); 581 memcpy(((uint8_t *) header) + length, device->addr->value, device->addr->length); 559 memcpy(((uint8_t *) header) + length, device->addr->value, 560 device->addr->length); 582 561 length += device->addr->length; 583 memcpy(((uint8_t *) header) + length, proto->addr->value, proto->addr->length); 562 memcpy(((uint8_t *) header) + length, proto->addr->value, 563 proto->addr->length); 584 564 length += proto->addr->length; 585 565 bzero(((uint8_t *) header) + length, device->addr->length); 586 566 length += device->addr->length; 587 567 memcpy(((uint8_t *) header) + length, target->value, target->length); 588 if(packet_set_addr(packet, (uint8_t *) device->addr->value, (uint8_t *) device->broadcast_addr->value, CONVERT_SIZE(char, uint8_t, device->addr->length)) != EOK){ 568 569 if (packet_set_addr(packet, (uint8_t *) device->addr->value, 570 (uint8_t *) device->broadcast_addr->value, 571 CONVERT_SIZE(char, uint8_t, device->addr->length)) != EOK) { 589 572 pq_release_remote(arp_globals.net_phone, packet_get_id(packet)); 590 573 return NULL; 591 574 } 575 592 576 nil_send_msg(device->phone, device_id, packet, SERVICE_ARP); 593 577 return NULL; 594 578 } 595 579 580 581 /** Processes the ARP message. 582 * 583 * @param[in] callid The message identifier. 584 * @param[in] call The message parameters. 585 * @param[out] answer The message answer parameters. 586 * @param[out] answer_count The last parameter for the actual answer in the 587 * answer parameter. 588 * @returns EOK on success. 589 * @returns ENOTSUP if the message is not known. 590 * 591 * @see arp_interface.h 592 * @see IS_NET_ARP_MESSAGE() 593 */ 594 int 595 arp_message_standalone(ipc_callid_t callid, ipc_call_t *call, 596 ipc_call_t *answer, int *answer_count) 597 { 598 ERROR_DECLARE; 599 600 measured_string_ref address; 601 measured_string_ref translation; 602 char *data; 603 packet_t packet; 604 packet_t next; 605 606 *answer_count = 0; 607 switch (IPC_GET_METHOD(*call)) { 608 case IPC_M_PHONE_HUNGUP: 609 return EOK; 610 611 case NET_ARP_DEVICE: 612 ERROR_PROPAGATE(measured_strings_receive(&address, &data, 1)); 613 if (ERROR_OCCURRED(arp_device_message(IPC_GET_DEVICE(call), 614 IPC_GET_SERVICE(call), ARP_GET_NETIF(call), address))) { 615 free(address); 616 free(data); 617 } 618 return ERROR_CODE; 619 620 case NET_ARP_TRANSLATE: 621 ERROR_PROPAGATE(measured_strings_receive(&address, &data, 1)); 622 fibril_rwlock_read_lock(&arp_globals.lock); 623 translation = arp_translate_message(IPC_GET_DEVICE(call), 624 IPC_GET_SERVICE(call), address); 625 free(address); 626 free(data); 627 if (!translation) { 628 fibril_rwlock_read_unlock(&arp_globals.lock); 629 return ENOENT; 630 } 631 ERROR_CODE = measured_strings_reply(translation, 1); 632 fibril_rwlock_read_unlock(&arp_globals.lock); 633 return ERROR_CODE; 634 635 case NET_ARP_CLEAR_DEVICE: 636 return arp_clear_device_req(0, IPC_GET_DEVICE(call)); 637 638 case NET_ARP_CLEAR_ADDRESS: 639 ERROR_PROPAGATE(measured_strings_receive(&address, &data, 1)); 640 arp_clear_address_req(0, IPC_GET_DEVICE(call), 641 IPC_GET_SERVICE(call), address); 642 free(address); 643 free(data); 644 return EOK; 645 646 case NET_ARP_CLEAN_CACHE: 647 return arp_clean_cache_req(0); 648 649 case NET_IL_DEVICE_STATE: 650 // do nothing - keep the cache 651 return EOK; 652 653 case NET_IL_RECEIVED: 654 if (ERROR_NONE(packet_translate_remote(arp_globals.net_phone, 655 &packet, IPC_GET_PACKET(call)))) { 656 fibril_rwlock_read_lock(&arp_globals.lock); 657 do { 658 next = pq_detach(packet); 659 ERROR_CODE = 660 arp_receive_message(IPC_GET_DEVICE(call), 661 packet); 662 if (ERROR_CODE != 1) { 663 pq_release_remote(arp_globals.net_phone, 664 packet_get_id(packet)); 665 } 666 packet = next; 667 } while (packet); 668 fibril_rwlock_read_unlock(&arp_globals.lock); 669 } 670 return ERROR_CODE; 671 672 case NET_IL_MTU_CHANGED: 673 return arp_mtu_changed_message(IPC_GET_DEVICE(call), 674 IPC_GET_MTU(call)); 675 } 676 677 return ENOTSUP; 678 } 679 596 680 /** Default thread for new connections. 597 681 * 598 * @param[in] iid The initial message identifier. 599 * @param[in] icall The initial message call structure. 600 * 601 */ 602 static void il_client_connection(ipc_callid_t iid, ipc_call_t * icall) 682 * @param[in] iid The initial message identifier. 683 * @param[in] icall The initial message call structure. 684 */ 685 static void il_client_connection(ipc_callid_t iid, ipc_call_t *icall) 603 686 { 604 687 /* … … 608 691 ipc_answer_0(iid, EOK); 609 692 610 while (true) {693 while (true) { 611 694 ipc_call_t answer; 612 695 int answer_count; … … 623 706 &answer_count); 624 707 625 /* End if said to either by the message or the processing result */ 626 if ((IPC_GET_METHOD(call) == IPC_M_PHONE_HUNGUP) || (res == EHANGUP)) 708 /* 709 * End if told to either by the message or the processing 710 * result. 711 */ 712 if ((IPC_GET_METHOD(call) == IPC_M_PHONE_HUNGUP) || 713 (res == EHANGUP)) 627 714 return; 628 715 … … 634 721 /** Starts the module. 635 722 * 636 * @param argc The count of the command line arguments. Ignored parameter. 637 * @param argv The command line parameters. Ignored parameter. 638 * 639 * @returns EOK on success. 640 * @returns Other error codes as defined for each specific module start function. 641 * 723 * @returns EOK on success. 724 * @returns Other error codes as defined for each specific module 725 * start function. 642 726 */ 643 727 int main(int argc, char *argv[]) … … 646 730 647 731 /* Start the module */ 648 if (ERROR_OCCURRED(il_module_start_standalone(il_client_connection))) 649 return ERROR_CODE; 650 732 ERROR_PROPAGATE(il_module_start_standalone(il_client_connection)); 651 733 return EOK; 652 734 } … … 654 736 /** @} 655 737 */ 738 -
uspace/srv/net/il/arp/arp.h
r0a3fbc7 re9caf47 28 28 29 29 /** @addtogroup arp 30 * 30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * 34 * ARP module. 35 35 */ 36 36 37 #ifndef __NET_ARP_H__38 #define __NET_ARP_H__37 #ifndef NET_ARP_H_ 38 #define NET_ARP_H_ 39 39 40 40 #include <fibril_synch.h> … … 44 44 45 45 #include <net/device.h> 46 #include <net/packet.h> 46 47 #include <net_hardware.h> 47 48 #include <adt/generic_char_map.h> … … 49 50 #include <adt/measured_strings.h> 50 51 51 52 52 /** Type definition of the ARP device specific data. 53 * 53 * @see arp_device 54 54 */ 55 typedef struct arp_device 55 typedef struct arp_device arp_device_t; 56 56 57 57 /** Type definition of the ARP device specific data pointer. 58 * 58 * @see arp_device 59 59 */ 60 typedef arp_device_t * 60 typedef arp_device_t *arp_device_ref; 61 61 62 62 /** Type definition of the ARP global data. 63 * 63 * @see arp_globals 64 64 */ 65 typedef struct arp_globals 65 typedef struct arp_globals arp_globals_t; 66 66 67 67 /** Type definition of the ARP protocol specific data. 68 * 68 * @see arp_proto 69 69 */ 70 typedef struct arp_proto 70 typedef struct arp_proto arp_proto_t; 71 71 72 72 /** Type definition of the ARP protocol specific data pointer. 73 * 73 * @see arp_proto 74 74 */ 75 typedef arp_proto_t * 75 typedef arp_proto_t *arp_proto_ref; 76 76 77 77 /** ARP address map. 78 * Translates addresses. 79 * @see generic_char_map.h 78 * 79 * Translates addresses. 80 * @see generic_char_map.h 80 81 */ 81 GENERIC_CHAR_MAP_DECLARE(arp_addr, measured_string_t) 82 GENERIC_CHAR_MAP_DECLARE(arp_addr, measured_string_t); 82 83 83 84 /** ARP address cache. 84 * Maps devices to the ARP device specific data. 85 * @see device.h 85 * 86 * Maps devices to the ARP device specific data. 87 * @see device.h 86 88 */ 87 DEVICE_MAP_DECLARE(arp_cache, arp_device_t) 89 DEVICE_MAP_DECLARE(arp_cache, arp_device_t); 88 90 89 91 /** ARP protocol map. 90 * Maps protocol identifiers to the ARP protocol specific data. 91 * @see int_map.h 92 * 93 * Maps protocol identifiers to the ARP protocol specific data. 94 * @see int_map.h 92 95 */ 93 INT_MAP_DECLARE(arp_protos, arp_proto_t) 96 INT_MAP_DECLARE(arp_protos, arp_proto_t); 94 97 95 /** ARP device specific data. 96 */ 97 struct arp_device{ 98 /** Actual device hardware address. 99 */ 98 /** ARP device specific data. */ 99 struct arp_device { 100 /** Actual device hardware address. */ 100 101 measured_string_ref addr; 101 /** Actual device hardware address data. 102 */ 103 char * addr_data; 104 /** Broadcast device hardware address. 105 */ 102 /** Actual device hardware address data. */ 103 char *addr_data; 104 /** Broadcast device hardware address. */ 106 105 measured_string_ref broadcast_addr; 107 /** Broadcast device hardware address data. 108 */ 109 char * broadcast_data; 110 /** Device identifier. 111 */ 106 /** Broadcast device hardware address data. */ 107 char *broadcast_data; 108 /** Device identifier. */ 112 109 device_id_t device_id; 113 /** Hardware type. 114 */ 110 /** Hardware type. */ 115 111 hw_type_t hardware; 116 /** Packet dimension. 117 */ 112 /** Packet dimension. */ 118 113 packet_dimension_t packet_dimension; 119 /** Device module phone. 120 */ 114 /** Device module phone. */ 121 115 int phone; 122 /** Protocol map. 123 * Address map for each protocol. 116 117 /** 118 * Protocol map. 119 * Address map for each protocol. 124 120 */ 125 121 arp_protos_t protos; 126 /** Device module service.127 */122 123 /** Device module service. */ 128 124 services_t service; 129 125 }; 130 126 131 /** ARP global data. 132 */ 133 struct arp_globals{ 134 /** ARP address cache. 135 */ 127 /** ARP global data. */ 128 struct arp_globals { 129 /** ARP address cache. */ 136 130 arp_cache_t cache; 137 /** The client connection processing function. 138 * The module skeleton propagates its own one. 131 132 /** 133 * The client connection processing function. 134 * The module skeleton propagates its own one. 139 135 */ 140 136 async_client_conn_t client_connection; 141 /** Networking module phone.142 */137 138 /** Networking module phone. */ 143 139 int net_phone; 144 /** Safety lock. 145 */ 140 /** Safety lock. */ 146 141 fibril_rwlock_t lock; 147 142 }; 148 143 149 /** ARP protocol specific data. 150 */ 151 struct arp_proto{ 152 /** Actual device protocol address. 153 */ 144 /** ARP protocol specific data. */ 145 struct arp_proto { 146 /** Actual device protocol address. */ 154 147 measured_string_ref addr; 155 /** Actual device protocol address data. 156 */ 157 char * addr_data; 158 /** Address map. 159 */ 148 /** Actual device protocol address data. */ 149 char *addr_data; 150 /** Address map. */ 160 151 arp_addr_t addresses; 161 /** Protocol service. 162 */ 152 /** Protocol service. */ 163 153 services_t service; 164 154 }; -
uspace/srv/net/il/arp/arp_header.h
r0a3fbc7 re9caf47 32 32 33 33 /** @file 34 * 35 * Based on the RFC~826.34 * ARP protocol header. 35 * Based on the RFC 826. 36 36 */ 37 37 38 #ifndef __NET_ARP_HEADER_H__39 #define __NET_ARP_HEADER_H__38 #ifndef NET_ARP_HEADER_H_ 39 #define NET_ARP_HEADER_H_ 40 40 41 41 #include <sys/types.h> 42 42 43 43 /** Type definition of an ARP protocol header. 44 * 44 * @see arp_header 45 45 */ 46 typedef struct arp_header 46 typedef struct arp_header arp_header_t; 47 47 48 48 /** Type definition of an ARP protocol header pointer. 49 * 49 * @see arp_header 50 50 */ 51 typedef arp_header_t * 51 typedef arp_header_t *arp_header_ref; 52 52 53 /** ARP protocol header. 54 */ 55 struct arp_header{ 56 /** Hardware type identifier.57 * 53 /** ARP protocol header. */ 54 struct arp_header { 55 /** 56 * Hardware type identifier. 57 * @see hardware.h 58 58 */ 59 59 uint16_t hardware; 60 /** Protocol identifier.61 */60 61 /** Protocol identifier. */ 62 62 uint16_t protocol; 63 /** Hardware address length in bytes. 64 */ 63 /** Hardware address length in bytes. */ 65 64 uint8_t hardware_length; 66 /** Protocol address length in bytes. 67 */ 65 /** Protocol address length in bytes. */ 68 66 uint8_t protocol_length; 69 /** ARP packet type. 70 * @see arp_oc.h 67 68 /** 69 * ARP packet type. 70 * @see arp_oc.h 71 71 */ 72 72 uint16_t operation; -
uspace/srv/net/il/arp/arp_module.c
r0a3fbc7 re9caf47 32 32 33 33 /** @file 34 * ARP standalone module implementation. 35 * Contains skeleton module functions mapping. 36 * The functions are used by the module skeleton as module specific entry points. 37 * @see module.c 34 * ARP standalone module implementation. 35 * Contains skeleton module functions mapping. 36 * The functions are used by the module skeleton as module specific entry 37 * points. 38 * @see module.c 38 39 */ 39 40 … … 53 54 #include "arp_module.h" 54 55 55 /** ARP module global data. 56 */ 57 extern arp_globals_t arp_globals; 56 /** ARP module global data. */ 57 extern arp_globals_t arp_globals; 58 58 59 int il_module_message_standalone(ipc_callid_t callid, ipc_call_t * call, ipc_call_t * answer, int * answer_count){ 59 int 60 il_module_message_standalone(ipc_callid_t callid, ipc_call_t *call, 61 ipc_call_t *answer, int *answer_count) 62 { 60 63 return arp_message_standalone(callid, call, answer, answer_count); 61 64 } 62 65 63 int il_module_start_standalone(async_client_conn_t client_connection){ 66 int il_module_start_standalone(async_client_conn_t client_connection) 67 { 64 68 ERROR_DECLARE; 65 69 … … 69 73 70 74 ipcarg_t phonehash; 71 if (ERROR_OCCURRED(arp_initialize(client_connection)) 72 ||ERROR_OCCURRED(REGISTER_ME(SERVICE_ARP, &phonehash))) {75 if (ERROR_OCCURRED(arp_initialize(client_connection)) || 76 ERROR_OCCURRED(REGISTER_ME(SERVICE_ARP, &phonehash))) { 73 77 pm_destroy(); 74 78 return ERROR_CODE; -
uspace/srv/net/il/arp/arp_module.h
r0a3fbc7 re9caf47 28 28 29 29 /** @addtogroup arp 30 * 30 * @{ 31 31 */ 32 32 33 33 /** @file 34 * 35 * 34 * ARP module functions. 35 * The functions are used as ARP module entry points. 36 36 */ 37 37 38 #ifndef __NET_ARP_MODULE_H__39 #define __NET_ARP_MODULE_H__38 #ifndef NET_ARP_MODULE_H_ 39 #define NET_ARP_MODULE_H_ 40 40 41 41 #include <ipc/ipc.h> 42 #include <async.h> 42 43 43 /** Initializes the ARP module. 44 * @param[in] client_connection The client connection processing function. The module skeleton propagates its own one. 45 * @returns EOK on success. 46 * @returns ENOMEM if there is not enough memory left. 47 */ 48 int arp_initialize(async_client_conn_t client_connection); 49 50 /** Processes the ARP message. 51 * @param[in] callid The message identifier. 52 * @param[in] call The message parameters. 53 * @param[out] answer The message answer parameters. 54 * @param[out] answer_count The last parameter for the actual answer in the answer parameter. 55 * @returns EOK on success. 56 * @returns ENOTSUP if the message is not known. 57 * @see arp_interface.h 58 * @see IS_NET_ARP_MESSAGE() 59 */ 60 int arp_message_standalone(ipc_callid_t callid, ipc_call_t * call, ipc_call_t * answer, int * answer_count); 44 extern int arp_initialize(async_client_conn_t); 45 extern int arp_message_standalone(ipc_callid_t, ipc_call_t *, ipc_call_t *, 46 int *); 61 47 62 48 #endif -
uspace/srv/net/il/arp/arp_oc.h
r0a3fbc7 re9caf47 32 32 33 33 /** @file 34 * ARP operation codes according to the on-line IANA - Address Resolution Protocol (ARP) Parameters - <http://www.iana.org/assignments/arp-parameters/arp-parameters.xml>, cited January 14 2009. 34 * ARP operation codes according to the on-line IANA - Address Resolution 35 * Protocol (ARP) Parameters 36 * http://www.iana.org/assignments/arp-parameters/arp-parameters.xml 37 * cited January 14 2009. 35 38 */ 36 39 37 #ifndef __NET_ARP_ARPOP_H__38 #define __NET_ARP_ARPOP_H__40 #ifndef NET_ARP_ARPOP_H_ 41 #define NET_ARP_ARPOP_H_ 39 42 40 /** @name ARP operation codes definitions 41 */ 43 /** @name ARP operation codes definitions */ 42 44 /*@{*/ 43 45 44 /** REQUEST operation code. 45 */ 46 #define ARPOP_REQUEST 1 46 /** REQUEST operation code. */ 47 #define ARPOP_REQUEST 1 47 48 48 /** REPLY operation code. 49 */ 50 #define ARPOP_REPLY 2 51 52 /** Reverse request operation code. 53 */ 54 #define ARPOP_RREQUEST 3 55 56 /** Reverse reply operation code. 57 */ 58 #define ARPOP_RREPLY 4 59 60 /** DRARP-Request operation code. 61 */ 62 #define ARPOP_DRARP_Request 5 63 64 /** DRARP-Reply operation code. 65 */ 66 #define ARPOP_DRARP_Reply 6 67 68 /** DRARP-Error operation code. 69 */ 70 #define ARPOP_DRARP_Error 7 71 72 /** InARP-Request operation code. 73 */ 74 #define ARPOP_InREQUEST 8 75 76 /** InARP-Reply operation code. 77 */ 78 #define ARPOP_InREPLY 9 79 80 /** ARP-NAK operation code. 81 */ 82 #define ARPOP_NAK 10 83 84 /** MARS-Request operation code. 85 */ 86 #define ARPOP_MARS_Request 11 87 88 /** MARS-Multi operation code. 89 */ 90 #define ARPOP_MARS_Multi 12 91 92 /** MARS-MServ operation code. 93 */ 94 #define ARPOP_MARS_MServ 13 95 96 /** MARS-Join operation code. 97 */ 98 #define ARPOP_MARS_Join 14 99 100 /** MARS-Leave operation code. 101 */ 102 #define ARPOP_MARS_Leave 15 103 104 /** MARS-NAK operation code. 105 */ 106 #define ARPOP_MARS_NAK 16 107 108 /** MARS-Unserv operation code. 109 */ 110 #define ARPOP_MARS_Unserv 17 111 112 /** MARS-SJoin operation code. 113 */ 114 #define ARPOP_MARS_SJoin 18 115 116 /** MARS-SLeave operation code. 117 */ 118 #define ARPOP_MARS_SLeave 19 119 120 /** MARS-Grouplist-Request operation code. 121 */ 122 #define ARPOP_MARS_Grouplist_Request 20 123 124 /** MARS-Grouplist-Reply operation code. 125 */ 126 #define ARPOP_MARS_Grouplist_Reply 21 127 128 /** MARS-Redirect-Map operation code. 129 */ 130 #define ARPOP_MARS_Redirect_Map 22 131 132 /** MAPOS-UNARP operation code. 133 */ 134 #define ARPOP_MAPOS_UNARP 23 49 /** REPLY operation code. */ 50 #define ARPOP_REPLY 2 135 51 136 52 /*@}*/
Note:
See TracChangeset
for help on using the changeset viewer.