Subversion Repositories HelenOS

Rev

Rev 4350 | Rev 4394 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4350 Rev 4351
Line 137... Line 137...
137
/** Clears the device specific data.
137
/** Clears the device specific data.
138
 *  @param device The device specific data.
138
 *  @param device The device specific data.
139
 */
139
 */
140
void    clear_device( arp_device_ref device );
140
void    clear_device( arp_device_ref device );
141
 
141
 
142
/** Processes IPC messages from the registered device driver modules in an infinite loop.
-
 
143
 *  @param iid The message identifier. Input parameter.
-
 
144
 *  @param icall The message parameters. Input/output parameter.
-
 
145
 */
-
 
146
void    arp_receiver( ipc_callid_t iid, ipc_call_t * icall );
-
 
147
 
-
 
148
DEVICE_MAP_IMPLEMENT( arp_cache, arp_device_t )
142
DEVICE_MAP_IMPLEMENT( arp_cache, arp_device_t )
149
 
143
 
150
INT_MAP_IMPLEMENT( arp_protos, arp_proto_t )
144
INT_MAP_IMPLEMENT( arp_protos, arp_proto_t )
151
 
145
 
152
GENERIC_CHAR_MAP_IMPLEMENT( arp_addr, measured_string_t )
146
GENERIC_CHAR_MAP_IMPLEMENT( arp_addr, measured_string_t )
Line 220... Line 214...
220
        rwlock_read_unlock( & arp_globals.lock );
214
        rwlock_read_unlock( & arp_globals.lock );
221
        return ENOENT;
215
        return ENOENT;
222
    }
216
    }
223
}
217
}
224
 
218
 
225
int arp_initialize( void ){
219
int arp_initialize( async_client_conn_t client_connection ){
226
    ERROR_DECLARE;
220
    ERROR_DECLARE;
227
 
221
 
228
    rwlock_initialize( & arp_globals.lock );
222
    rwlock_initialize( & arp_globals.lock );
229
    rwlock_write_lock( & arp_globals.lock );
223
    rwlock_write_lock( & arp_globals.lock );
-
 
224
    arp_globals.client_connection = client_connection;
230
    ERROR_PROPAGATE( arp_cache_initialize( & arp_globals.cache ));
225
    ERROR_PROPAGATE( arp_cache_initialize( & arp_globals.cache ));
231
    rwlock_write_unlock( & arp_globals.lock );
226
    rwlock_write_unlock( & arp_globals.lock );
232
    return EOK;
227
    return EOK;
233
}
228
}
234
 
229
 
Line 306... Line 301...
306
            free( device );
301
            free( device );
307
            return index;
302
            return index;
308
        }
303
        }
309
        device->service = service;
304
        device->service = service;
310
        // bind the new one
305
        // bind the new one
311
        device->phone = bind_service( device->service, device->device_id, SERVICE_ARP, 0, arp_receiver );
306
        device->phone = bind_service( device->service, device->device_id, SERVICE_ARP, 0, arp_globals.client_connection );
312
        if( device->phone < 0 ){
307
        if( device->phone < 0 ){
313
            rwlock_write_unlock( & arp_globals.lock );
308
            rwlock_write_unlock( & arp_globals.lock );
314
            arp_protos_destroy( & device->protos );
309
            arp_protos_destroy( & device->protos );
315
            free( device );
310
            free( device );
316
            return EREFUSED;
311
            return EREFUSED;
Line 478... Line 473...
478
    ERROR_DECLARE;
473
    ERROR_DECLARE;
479
 
474
 
480
    measured_string_ref address;
475
    measured_string_ref address;
481
    measured_string_ref translation;
476
    measured_string_ref translation;
482
    char *              data;
477
    char *              data;
-
 
478
    packet_t            packet;
483
 
479
 
484
//  printf( "message %d - %d\n", IPC_GET_METHOD( * call ), NET_ARP_FIRST );
480
//  printf( "message %d - %d\n", IPC_GET_METHOD( * call ), NET_ARP_FIRST );
485
    * answer_count = 0;
481
    * answer_count = 0;
486
    switch( IPC_GET_METHOD( * call )){
482
    switch( IPC_GET_METHOD( * call )){
487
        case IPC_M_PHONE_HUNGUP:
483
        case IPC_M_PHONE_HUNGUP:
Line 508... Line 504...
508
            return ERROR_CODE;
504
            return ERROR_CODE;
509
        case NET_ARP_CLEAR_DEVICE:
505
        case NET_ARP_CLEAR_DEVICE:
510
            return arp_clear_device_req( 0, IPC_GET_DEVICE( call ));
506
            return arp_clear_device_req( 0, IPC_GET_DEVICE( call ));
511
        case NET_ARP_CLEAN_CACHE:
507
        case NET_ARP_CLEAN_CACHE:
512
            return arp_clean_cache_req( 0 );
508
            return arp_clean_cache_req( 0 );
-
 
509
        case NET_IL_DEVICE_STATE:
-
 
510
            // do nothing - keep the cache
-
 
511
            return EOK;
-
 
512
        case NET_IL_RECEIVED:
-
 
513
            if( ! ERROR_OCCURRED( packet_translate( arp_globals.net_phone, & packet, IPC_GET_PACKET( call )))){
-
 
514
                rwlock_read_lock( & arp_globals.lock );
-
 
515
                ERROR_CODE = arp_receive_message( IPC_GET_DEVICE( call ), packet );
-
 
516
                rwlock_read_unlock( & arp_globals.lock );
-
 
517
            }
-
 
518
            return ERROR_CODE;
513
    }
519
    }
514
    return ENOTSUP;
520
    return ENOTSUP;
515
}
521
}
516
 
522
 
517
void arp_receiver( ipc_callid_t iid, ipc_call_t * icall ){
-
 
518
    ERROR_DECLARE;
-
 
519
 
-
 
520
    packet_t        packet;
-
 
521
 
-
 
522
    while( true ){
-
 
523
        switch( IPC_GET_METHOD( * icall )){
-
 
524
            case NET_IL_DEVICE_STATE:
-
 
525
                // do nothing - keep the cache
-
 
526
                ipc_answer_0( iid, EOK );
-
 
527
                break;
-
 
528
            case NET_IL_RECEIVED:
-
 
529
                if( ! ERROR_OCCURRED( packet_translate( arp_globals.net_phone, & packet, IPC_GET_PACKET( icall )))){
-
 
530
                    rwlock_read_lock( & arp_globals.lock );
-
 
531
                    ERROR_CODE = arp_receive_message( IPC_GET_DEVICE( icall ), packet );
-
 
532
                    rwlock_read_unlock( & arp_globals.lock );
-
 
533
                }
-
 
534
                ipc_answer_0( iid, ERROR_CODE );
-
 
535
                break;
-
 
536
            default:
-
 
537
                ipc_answer_0( iid, ENOTSUP );
-
 
538
        }
-
 
539
        iid = async_get_call( icall );
-
 
540
    }
-
 
541
}
-
 
542
 
-
 
543
/** @}
523
/** @}
544
 */
524
 */