Rev 4582 | Rev 4704 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4582 | Rev 4695 | ||
---|---|---|---|
Line 197... | Line 197... | ||
197 | * @param phone The service phone. Input parameter. |
197 | * @param phone The service phone. Input parameter. |
198 | * @returns EOK on success. |
198 | * @returns EOK on success. |
199 | * @returns ENOENT if the service is not known. |
199 | * @returns ENOENT if the service is not known. |
200 | * @returns ENOMEM if there is not enough memory left. |
200 | * @returns ENOMEM if there is not enough memory left. |
201 | */ |
201 | */ |
202 | int nil_register_message( services_t service, int phone ); |
202 | int eth_register_message( services_t service, int phone ); |
203 | 203 | ||
204 | /** Returns the device packet dimensions for sending. |
204 | /** Returns the device packet dimensions for sending. |
205 | * @param device_id The device identifier. Input parameter. |
205 | * @param device_id The device identifier. Input parameter. |
206 | * @param addr_len The minimum reserved address length. Output parameter. |
206 | * @param addr_len The minimum reserved address length. Output parameter. |
207 | * @param prefix The minimum reserved prefix size. Output parameter. |
207 | * @param prefix The minimum reserved prefix size. Output parameter. |
Line 304... | Line 304... | ||
304 | int index; |
304 | int index; |
305 | measured_string_t names[ 2 ] = {{ "ETH_MODE", 8 }, { "ETH_DUMMY", 9 }}; |
305 | measured_string_t names[ 2 ] = {{ "ETH_MODE", 8 }, { "ETH_DUMMY", 9 }}; |
306 | measured_string_ref configuration; |
306 | measured_string_ref configuration; |
307 | size_t count = sizeof( names ) / sizeof( measured_string_t ); |
307 | size_t count = sizeof( names ) / sizeof( measured_string_t ); |
308 | char * data; |
308 | char * data; |
- | 309 | eth_proto_ref proto; |
|
309 | 310 | ||
310 | fibril_rwlock_write_lock( & eth_globals.devices_lock ); |
311 | fibril_rwlock_write_lock( & eth_globals.devices_lock ); |
311 | // an existing device? |
312 | // an existing device? |
312 | device = eth_devices_find( & eth_globals.devices, device_id ); |
313 | device = eth_devices_find( & eth_globals.devices, device_id ); |
313 | if( device ){ |
314 | if( device ){ |
Line 317... | Line 318... | ||
317 | return EEXIST; |
318 | return EEXIST; |
318 | }else{ |
319 | }else{ |
319 | // update mtu |
320 | // update mtu |
320 | device->mtu = mtu; |
321 | device->mtu = mtu; |
321 | printf( "Device %d already exists:\tMTU\t= %d\n", device->device_id, device->mtu ); |
322 | printf( "Device %d already exists:\tMTU\t= %d\n", device->device_id, device->mtu ); |
- | 323 | fibril_rwlock_write_unlock( & eth_globals.devices_lock ); |
|
- | 324 | // notify all upper layer modules |
|
- | 325 | fibril_rwlock_read_lock( & eth_globals.protos_lock ); |
|
- | 326 | for( index = 0; index < eth_protos_count( & eth_globals.protos ); ++ index ){ |
|
- | 327 | proto = eth_protos_get_index( & eth_globals.protos, index ); |
|
- | 328 | if ( proto->phone ){ |
|
- | 329 | il_mtu_changed_msg( proto->phone, device->device_id, device->mtu, proto->service ); |
|
- | 330 | } |
|
- | 331 | } |
|
- | 332 | fibril_rwlock_read_unlock( & eth_globals.protos_lock ); |
|
- | 333 | return EOK; |
|
322 | } |
334 | } |
323 | }else{ |
335 | }else{ |
324 | // create a new device |
336 | // create a new device |
325 | device = ( eth_device_ref ) malloc( sizeof( eth_device_t )); |
337 | device = ( eth_device_ref ) malloc( sizeof( eth_device_t )); |
326 | if( ! device ) return ENOMEM; |
338 | if( ! device ) return ENOMEM; |
Line 504... | Line 516... | ||
504 | fibril_rwlock_read_unlock( & eth_globals.devices_lock ); |
516 | fibril_rwlock_read_unlock( & eth_globals.devices_lock ); |
505 | } |
517 | } |
506 | return ( * address ) ? EOK : ENOENT; |
518 | return ( * address ) ? EOK : ENOENT; |
507 | } |
519 | } |
508 | 520 | ||
509 | int nil_register_message( services_t service, int phone ){ |
521 | int eth_register_message( services_t service, int phone ){ |
510 | eth_proto_ref proto; |
522 | eth_proto_ref proto; |
511 | int protocol; |
523 | int protocol; |
512 | int index; |
524 | int index; |
513 | 525 | ||
514 | protocol = protocol_map( SERVICE_ETHERNET, service ); |
526 | protocol = protocol_map( SERVICE_ETHERNET, service ); |
Line 646... | Line 658... | ||
646 | * answer_count = 0; |
658 | * answer_count = 0; |
647 | switch( IPC_GET_METHOD( * call )){ |
659 | switch( IPC_GET_METHOD( * call )){ |
648 | case IPC_M_PHONE_HUNGUP: |
660 | case IPC_M_PHONE_HUNGUP: |
649 | return EOK; |
661 | return EOK; |
650 | case NET_NIL_DEVICE: |
662 | case NET_NIL_DEVICE: |
651 | return eth_device_message( IPC_GET_DEVICE( call ), IPC_GET_SERVICE( call ), NIL_GET_MTU( call )); |
663 | return eth_device_message( IPC_GET_DEVICE( call ), IPC_GET_SERVICE( call ), IPC_GET_MTU( call )); |
652 | case NET_NIL_SEND: |
664 | case NET_NIL_SEND: |
653 | ERROR_PROPAGATE( packet_translate( eth_globals.net_phone, & packet, IPC_GET_PACKET( call ))); |
665 | ERROR_PROPAGATE( packet_translate( eth_globals.net_phone, & packet, IPC_GET_PACKET( call ))); |
654 | return eth_send_message( IPC_GET_DEVICE( call ), packet, IPC_GET_SERVICE( call )); |
666 | return eth_send_message( IPC_GET_DEVICE( call ), packet, IPC_GET_SERVICE( call )); |
655 | case NET_NIL_PACKET_SPACE: |
667 | case NET_NIL_PACKET_SPACE: |
656 | ERROR_PROPAGATE( eth_packet_space_message( IPC_GET_DEVICE( call ), IPC_SET_ADDR( answer ), IPC_SET_PREFIX( answer ), IPC_SET_CONTENT( answer ), IPC_SET_SUFFIX( answer ))); |
668 | ERROR_PROPAGATE( eth_packet_space_message( IPC_GET_DEVICE( call ), IPC_SET_ADDR( answer ), IPC_SET_PREFIX( answer ), IPC_SET_CONTENT( answer ), IPC_SET_SUFFIX( answer ))); |
Line 661... | Line 673... | ||
661 | return measured_strings_reply( address, 1 ); |
673 | return measured_strings_reply( address, 1 ); |
662 | case NET_NIL_BROADCAST_ADDR: |
674 | case NET_NIL_BROADCAST_ADDR: |
663 | ERROR_PROPAGATE( eth_addr_message( IPC_GET_DEVICE( call ), ETH_BROADCAST_ADDR, & address )); |
675 | ERROR_PROPAGATE( eth_addr_message( IPC_GET_DEVICE( call ), ETH_BROADCAST_ADDR, & address )); |
664 | return measured_strings_reply( address, 1 ); |
676 | return measured_strings_reply( address, 1 ); |
665 | case IPC_M_CONNECT_TO_ME: |
677 | case IPC_M_CONNECT_TO_ME: |
666 | return nil_register_message( NIL_GET_PROTO( call ), IPC_GET_PHONE( call )); |
678 | return eth_register_message( NIL_GET_PROTO( call ), IPC_GET_PHONE( call )); |
667 | } |
679 | } |
668 | return ENOTSUP; |
680 | return ENOTSUP; |
669 | } |
681 | } |
670 | 682 | ||
671 | void eth_receiver( ipc_callid_t iid, ipc_call_t * icall ){ |
683 | void eth_receiver( ipc_callid_t iid, ipc_call_t * icall ){ |