Rev 4351 | Rev 4396 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4351 | Rev 4394 | ||
|---|---|---|---|
| Line 123... | Line 123... | ||
| 123 | /** Processes the received ARP packet. |
123 | /** Processes the received ARP packet. |
| 124 | * Updates the source hardware address if the source entry exists or the packet is targeted to my protocol address. |
124 | * Updates the source hardware address if the source entry exists or the packet is targeted to my protocol address. |
| 125 | * Responses to the ARP request if the packet is the ARP request and is targeted to my address. |
125 | * Responses to the ARP request if the packet is the ARP request and is targeted to my address. |
| 126 | * @param device_id The source device identifier. Input parameter. |
126 | * @param device_id The source device identifier. Input parameter. |
| 127 | * @param packet The received packet. Input/output parameter. |
127 | * @param packet The received packet. Input/output parameter. |
| 128 | * @returns EOK on success. |
128 | * @returns EOK on success and the packet is no longer needed. |
| - | 129 | * @returns 1 on success and the packet has been reused. |
|
| 129 | * @returns EINVAL if the packet is too small to carry the ARP packet. |
130 | * @returns EINVAL if the packet is too small to carry the ARP packet. |
| 130 | * @returns EINVAL if the received address lengths differs from the registered values. |
131 | * @returns EINVAL if the received address lengths differs from the registered values. |
| 131 | * @returns ENOENT if the device is not found in the cache. |
132 | * @returns ENOENT if the device is not found in the cache. |
| 132 | * @returns ENOENT if the protocol for the device is not found in the cache. |
133 | * @returns ENOENT if the protocol for the device is not found in the cache. |
| 133 | * @returns ENOMEM if there is not enough memory left. |
134 | * @returns ENOMEM if there is not enough memory left. |
| Line 368... | Line 369... | ||
| 368 | length = 8 + ( CONVERT_SIZE( char, uint8_t, proto->addr->length ) + CONVERT_SIZE( char, uint8_t, device->addr->length )) * 2; |
369 | length = 8 + ( CONVERT_SIZE( char, uint8_t, proto->addr->length ) + CONVERT_SIZE( char, uint8_t, device->addr->length )) * 2; |
| 369 | if( length > device->content ) return NULL; |
370 | if( length > device->content ) return NULL; |
| 370 | packet = packet_get_4( arp_globals.net_phone, device->addr_len, device->prefix, length, device->suffix ); |
371 | packet = packet_get_4( arp_globals.net_phone, device->addr_len, device->prefix, length, device->suffix ); |
| 371 | if( ! packet ) return NULL; |
372 | if( ! packet ) return NULL; |
| 372 | header = ( arp_header_ref ) packet_suffix( packet, length ); |
373 | header = ( arp_header_ref ) packet_suffix( packet, length ); |
| - | 374 | if( ! header ){ |
|
| - | 375 | pq_release( packet ); |
|
| - | 376 | return NULL; |
|
| - | 377 | } |
|
| 373 | header->hardware = htons( device->hardware ); |
378 | header->hardware = htons( device->hardware ); |
| 374 | header->hardware_length = device->addr->length; |
379 | header->hardware_length = device->addr->length; |
| 375 | header->protocol = htons( protocol_map( device->service, protocol )); |
380 | header->protocol = htons( protocol_map( device->service, protocol )); |
| 376 | header->protocol_length = proto->addr->length; |
381 | header->protocol_length = proto->addr->length; |
| 377 | header->operation = htons( ARPOP_REQUEST ); |
382 | header->operation = htons( ARPOP_REQUEST ); |
| Line 381... | Line 386... | ||
| 381 | memcpy((( uint8_t * ) header ) + length, proto->addr->value, proto->addr->length ); |
386 | memcpy((( uint8_t * ) header ) + length, proto->addr->value, proto->addr->length ); |
| 382 | length += proto->addr->length; |
387 | length += proto->addr->length; |
| 383 | bzero((( uint8_t * ) header ) + length, device->addr->length ); |
388 | bzero((( uint8_t * ) header ) + length, device->addr->length ); |
| 384 | length += device->addr->length; |
389 | length += device->addr->length; |
| 385 | memcpy((( uint8_t * ) header ) + length, target->value, target->length ); |
390 | memcpy((( uint8_t * ) header ) + length, target->value, target->length ); |
| 386 | packet_set_addr( packet, ( uint8_t * ) device->addr->value, ( uint8_t * ) device->broadcast_addr->value, CONVERT_SIZE( char, uint8_t, device->addr->length )); |
391 | 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 ){ |
| - | 392 | pq_release( packet ); |
|
| - | 393 | return NULL; |
|
| - | 394 | } |
|
| 387 | nil_send_msg( device->phone, device_id, packet, SERVICE_ARP ); |
395 | nil_send_msg( device->phone, device_id, packet, SERVICE_ARP ); |
| 388 | return NULL; |
396 | return NULL; |
| 389 | } |
397 | } |
| 390 | 398 | ||
| 391 | int arp_receive_message( device_id_t device_id, packet_t packet ){ |
399 | int arp_receive_message( device_id_t device_id, packet_t packet ){ |
| Line 439... | Line 447... | ||
| 439 | header->operation = htons( ARPOP_REPLY ); |
447 | header->operation = htons( ARPOP_REPLY ); |
| 440 | memcpy( des_proto, src_proto, header->protocol_length ); |
448 | memcpy( des_proto, src_proto, header->protocol_length ); |
| 441 | memcpy( src_proto, proto->addr->value, header->protocol_length ); |
449 | memcpy( src_proto, proto->addr->value, header->protocol_length ); |
| 442 | memcpy( src_hw, device->addr->value, device->addr_len ); |
450 | memcpy( src_hw, device->addr->value, device->addr_len ); |
| 443 | memcpy( des_hw, hw_source->value, header->hardware_length ); |
451 | memcpy( des_hw, hw_source->value, header->hardware_length ); |
| 444 | packet_set_addr( packet, src_hw, des_hw, header->hardware_length ); |
452 | ERROR_PROPAGATE( packet_set_addr( packet, src_hw, des_hw, header->hardware_length )); |
| 445 | nil_send_msg( device->phone, device_id, packet, SERVICE_ARP ); |
453 | nil_send_msg( device->phone, device_id, packet, SERVICE_ARP ); |
| 446 | }else{ |
454 | return 1; |
| 447 | pq_release( arp_globals.net_phone, packet_get_id( packet )); |
- | |
| 448 | } |
455 | } |
| 449 | } |
456 | } |
| 450 | return EOK; |
457 | return EOK; |
| 451 | } |
458 | } |
| 452 | 459 | ||
| Line 474... | Line 481... | ||
| 474 | 481 | ||
| 475 | measured_string_ref address; |
482 | measured_string_ref address; |
| 476 | measured_string_ref translation; |
483 | measured_string_ref translation; |
| 477 | char * data; |
484 | char * data; |
| 478 | packet_t packet; |
485 | packet_t packet; |
| - | 486 | packet_t next; |
|
| 479 | 487 | ||
| 480 | // printf( "message %d - %d\n", IPC_GET_METHOD( * call ), NET_ARP_FIRST ); |
488 | // printf( "message %d - %d\n", IPC_GET_METHOD( * call ), NET_ARP_FIRST ); |
| 481 | * answer_count = 0; |
489 | * answer_count = 0; |
| 482 | switch( IPC_GET_METHOD( * call )){ |
490 | switch( IPC_GET_METHOD( * call )){ |
| 483 | case IPC_M_PHONE_HUNGUP: |
491 | case IPC_M_PHONE_HUNGUP: |
| Line 510... | Line 518... | ||
| 510 | // do nothing - keep the cache |
518 | // do nothing - keep the cache |
| 511 | return EOK; |
519 | return EOK; |
| 512 | case NET_IL_RECEIVED: |
520 | case NET_IL_RECEIVED: |
| 513 | if( ! ERROR_OCCURRED( packet_translate( arp_globals.net_phone, & packet, IPC_GET_PACKET( call )))){ |
521 | if( ! ERROR_OCCURRED( packet_translate( arp_globals.net_phone, & packet, IPC_GET_PACKET( call )))){ |
| 514 | rwlock_read_lock( & arp_globals.lock ); |
522 | rwlock_read_lock( & arp_globals.lock ); |
| - | 523 | do{ |
|
| - | 524 | next = pq_next( packet ); |
|
| - | 525 | packet_detach( packet ); |
|
| 515 | ERROR_CODE = arp_receive_message( IPC_GET_DEVICE( call ), packet ); |
526 | ERROR_CODE = arp_receive_message( IPC_GET_DEVICE( call ), packet ); |
| - | 527 | if( ERROR_CODE != 1 ) pq_release( arp_globals.net_phone, packet_get_id( packet )); |
|
| - | 528 | packet = next; |
|
| - | 529 | }while( packet ); |
|
| 516 | rwlock_read_unlock( & arp_globals.lock ); |
530 | rwlock_read_unlock( & arp_globals.lock ); |
| 517 | } |
531 | } |
| 518 | return ERROR_CODE; |
532 | return ERROR_CODE; |
| 519 | } |
533 | } |
| 520 | return ENOTSUP; |
534 | return ENOTSUP; |