Rev 4192 | Rev 4261 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4192 | Rev 4243 | ||
|---|---|---|---|
| Line 47... | Line 47... | ||
| 47 | 47 | ||
| 48 | #include "../structures/packet/packet.h" |
48 | #include "../structures/packet/packet.h" |
| 49 | #include "../structures/packet/packet_client.h" |
49 | #include "../structures/packet/packet_client.h" |
| 50 | #include "../structures/measured_strings.h" |
50 | #include "../structures/measured_strings.h" |
| 51 | 51 | ||
| 52 | #include "device.h" |
52 | #include "../include/device.h" |
| - | 53 | #include "../include/netif_messages.h" |
|
| - | 54 | ||
| 53 | #include "netif.h" |
55 | #include "netif.h" |
| 54 | #include "netif_interface.h" |
56 | #include "netif_interface.h" |
| 55 | - | ||
| 56 | #define IPC_GET_DEVICE( call ) ( device_id_t ) IPC_GET_ARG1( * call ) |
- | |
| 57 | #define IPC_GET_PACKET( call ) ( packet_id_t ) IPC_GET_ARG2( * call ) |
- | |
| 58 | #define IPC_GET_IRQ( call ) ( int ) IPC_GET_ARG2( * call ) |
- | |
| 59 | #define IPC_GET_IO( call ) ( int ) IPC_GET_ARG3( * call ) |
57 | #include "netif_wrappers.h" |
| 60 | #define IPC_GET_PHONE( call ) ( int ) IPC_GET_ARG5( * call ) |
- | |
| 61 | 58 | ||
| 62 | extern netif_globals_t netif_globals; |
59 | extern netif_globals_t netif_globals; |
| 63 | 60 | ||
| 64 | DEVICE_MAP_IMPLEMENT( device_map, device_t ) |
61 | DEVICE_MAP_IMPLEMENT( device_map, device_t ) |
| 65 | 62 | ||
| 66 | int module_message( ipc_callid_t callid, ipc_call_t * call, ipc_call_t * answer, int * answer_count ); |
63 | int module_message( ipc_callid_t callid, ipc_call_t * call, ipc_call_t * answer, int * answer_count ); |
| 67 | int netif_start_module( async_client_conn_t client_connection ); |
64 | int netif_start_module( async_client_conn_t client_connection ); |
| 68 | int register_message( device_id_t device_id, int phone ); |
65 | int register_message( device_id_t device_id, int phone ); |
| 69 | 66 | ||
| - | 67 | int netif_probe_wrapper( device_id_t device_id, int irq, int io ){ |
|
| - | 68 | int result; |
|
| - | 69 | ||
| - | 70 | rwlock_write_lock( & netif_globals.lock ); |
|
| - | 71 | result = netif_probe_message( device_id, irq, io ); |
|
| - | 72 | rwlock_write_unlock( & netif_globals.lock ); |
|
| - | 73 | return result; |
|
| - | 74 | } |
|
| - | 75 | ||
| - | 76 | int netif_send_wrapper( device_id_t device_id, packet_t packet ){ |
|
| - | 77 | int result; |
|
| - | 78 | ||
| - | 79 | rwlock_write_lock( & netif_globals.lock ); |
|
| - | 80 | result = netif_send_message( device_id, packet ); |
|
| - | 81 | rwlock_write_unlock( & netif_globals.lock ); |
|
| - | 82 | return result; |
|
| - | 83 | } |
|
| - | 84 | ||
| - | 85 | int netif_start_wrapper( device_id_t device_id ){ |
|
| - | 86 | int result; |
|
| - | 87 | ||
| - | 88 | rwlock_write_lock( & netif_globals.lock ); |
|
| - | 89 | result = netif_start_message( device_id ); |
|
| - | 90 | rwlock_write_unlock( & netif_globals.lock ); |
|
| - | 91 | return result; |
|
| - | 92 | } |
|
| - | 93 | ||
| - | 94 | int netif_stop_wrapper( device_id_t device_id ){ |
|
| - | 95 | int result; |
|
| - | 96 | ||
| - | 97 | rwlock_write_lock( & netif_globals.lock ); |
|
| - | 98 | result = netif_stop_message( device_id ); |
|
| - | 99 | rwlock_write_unlock( & netif_globals.lock ); |
|
| - | 100 | return result; |
|
| - | 101 | } |
|
| - | 102 | ||
| - | 103 | int netif_get_addr_wrapper( device_id_t device_id, measured_string_ref * address ){ |
|
| - | 104 | ERROR_DECLARE; |
|
| - | 105 | ||
| - | 106 | measured_string_t translation; |
|
| - | 107 | ||
| - | 108 | if( ! address ) return EBADMEM; |
|
| - | 109 | rwlock_read_lock( & netif_globals.lock ); |
|
| - | 110 | if( ! ERROR_OCCURRED( netif_get_addr_message( device_id, & translation ))){ |
|
| - | 111 | * address = measured_string_create_bulk( translation.value, translation.length ); |
|
| - | 112 | ERROR_CODE = ( * address ) ? EOK : ENOMEM; |
|
| - | 113 | } |
|
| - | 114 | rwlock_read_unlock( & netif_globals.lock ); |
|
| - | 115 | return ERROR_CODE; |
|
| - | 116 | } |
|
| - | 117 | ||
| 70 | int find_device( device_id_t device_id, device_ref * device ){ |
118 | int find_device( device_id_t device_id, device_ref * device ){ |
| 71 | if( ! device ) return EBADMEM; |
119 | if( ! device ) return EBADMEM; |
| 72 | * device = device_map_find( & netif_globals.device_map, device_id ); |
120 | * device = device_map_find( & netif_globals.device_map, device_id ); |
| 73 | if( ! * device ) return ENOENT; |
121 | if( ! * device ) return ENOENT; |
| 74 | if(( ** device ).state == NETIF_NULL ) return EPERM; |
122 | if(( ** device ).state == NETIF_NULL ) return EPERM; |
| Line 103... | Line 151... | ||
| 103 | switch( IPC_GET_METHOD( * call )){ |
151 | switch( IPC_GET_METHOD( * call )){ |
| 104 | case IPC_M_PHONE_HUNGUP: |
152 | case IPC_M_PHONE_HUNGUP: |
| 105 | return EOK; |
153 | return EOK; |
| 106 | case NET_NETIF_PROBE_AUTO: |
154 | case NET_NETIF_PROBE_AUTO: |
| 107 | rwlock_write_lock( & netif_globals.lock ); |
155 | rwlock_write_lock( & netif_globals.lock ); |
| 108 | ERROR_CODE = probe_auto_message(); |
156 | ERROR_CODE = netif_probe_auto_message(); |
| 109 | rwlock_write_unlock( & netif_globals.lock ); |
157 | rwlock_write_unlock( & netif_globals.lock ); |
| 110 | return ERROR_CODE; |
158 | return ERROR_CODE; |
| 111 | case NET_NETIF_PROBE: |
159 | case NET_NETIF_PROBE: |
| 112 | rwlock_write_lock( & netif_globals.lock ); |
- | |
| 113 | ERROR_CODE = probe_message( IPC_GET_DEVICE( call ), IPC_GET_IRQ( call ), IPC_GET_IO( call )); |
160 | return netif_probe_wrapper( NETIF_GET_DEVICE( call ), NETIF_GET_IRQ( call ), NETIF_GET_IO( call )); |
| 114 | rwlock_write_unlock( & netif_globals.lock ); |
- | |
| 115 | return ERROR_CODE; |
- | |
| 116 | case IPC_M_CONNECT_TO_ME: |
161 | case IPC_M_CONNECT_TO_ME: |
| 117 | rwlock_write_lock( & netif_globals.lock ); |
162 | rwlock_write_lock( & netif_globals.lock ); |
| 118 | ERROR_CODE = register_message( IPC_GET_DEVICE( call ), IPC_GET_PHONE( call )); |
163 | ERROR_CODE = register_message( NETIF_GET_DEVICE( call ), IPC_GET_PHONE( call )); |
| 119 | rwlock_write_unlock( & netif_globals.lock ); |
164 | rwlock_write_unlock( & netif_globals.lock ); |
| 120 | return ERROR_CODE; |
165 | return ERROR_CODE; |
| 121 | case NET_NETIF_SEND: |
166 | case NET_NETIF_SEND: |
| 122 | rwlock_write_lock( & netif_globals.lock ); |
- | |
| 123 | if( ! ERROR_OCCURRED( packet_translate( netif_globals.networking_phone, & packet, IPC_GET_PACKET( call )))){ |
167 | ERROR_PROPAGATE( packet_translate( netif_globals.networking_phone, & packet, NETIF_GET_PACKET( call ))); |
| 124 | ERROR_CODE = send_message( IPC_GET_DEVICE( call ), packet ); |
168 | return netif_send_wrapper( NETIF_GET_DEVICE( call ), packet ); |
| 125 | } |
- | |
| 126 | rwlock_write_unlock( & netif_globals.lock ); |
- | |
| 127 | return ERROR_CODE; |
- | |
| 128 | case NET_NETIF_START: |
169 | case NET_NETIF_START: |
| 129 | rwlock_write_lock( & netif_globals.lock ); |
- | |
| 130 | ERROR_CODE = start_message( IPC_GET_DEVICE( call )); |
170 | return netif_start_wrapper( NETIF_GET_DEVICE( call )); |
| 131 | rwlock_write_unlock( & netif_globals.lock ); |
- | |
| 132 | return ERROR_CODE; |
- | |
| 133 | case NET_NETIF_STATS: |
171 | case NET_NETIF_STATS: |
| 134 | rwlock_read_lock( & netif_globals.lock ); |
172 | rwlock_read_lock( & netif_globals.lock ); |
| 135 | if( ! ERROR_OCCURRED( ipc_data_read_receive( & callid, & length ))){ |
173 | if( ! ERROR_OCCURRED( ipc_data_read_receive( & callid, & length ))){ |
| 136 | if( length < sizeof( device_stats_t )){ |
174 | if( length < sizeof( device_stats_t )){ |
| 137 | ERROR_CODE = EOVERFLOW; |
175 | ERROR_CODE = EOVERFLOW; |
| 138 | }else{ |
176 | }else{ |
| 139 | if( ! ERROR_OCCURRED( get_device_stats( IPC_GET_DEVICE( call ), & stats ))){ |
177 | if( ! ERROR_OCCURRED( netif_get_device_stats( NETIF_GET_DEVICE( call ), & stats ))){ |
| 140 | ERROR_CODE = ipc_data_read_finalize( callid, & stats, sizeof( device_stats_t )); |
178 | ERROR_CODE = ipc_data_read_finalize( callid, & stats, sizeof( device_stats_t )); |
| 141 | } |
179 | } |
| 142 | } |
180 | } |
| 143 | } |
181 | } |
| 144 | rwlock_read_unlock( & netif_globals.lock ); |
182 | rwlock_read_unlock( & netif_globals.lock ); |
| 145 | return ERROR_CODE; |
183 | return ERROR_CODE; |
| 146 | case NET_NETIF_STOP: |
184 | case NET_NETIF_STOP: |
| 147 | rwlock_write_lock( & netif_globals.lock ); |
- | |
| 148 | ERROR_CODE = stop_message( IPC_GET_DEVICE( call )); |
185 | return netif_stop_wrapper( NETIF_GET_DEVICE( call )); |
| 149 | rwlock_write_unlock( & netif_globals.lock ); |
- | |
| 150 | return ERROR_CODE; |
- | |
| 151 | case NET_NETIF_GET_ADDR: |
186 | case NET_NETIF_GET_ADDR: |
| 152 | rwlock_read_lock( & netif_globals.lock ); |
187 | rwlock_read_lock( & netif_globals.lock ); |
| 153 | if( ! ERROR_OCCURRED( get_addr_message( IPC_GET_DEVICE( call ), & address ))){ |
188 | if( ! ERROR_OCCURRED( netif_get_addr_message( NETIF_GET_DEVICE( call ), & address ))){ |
| 154 | ERROR_CODE = measured_strings_reply( & address, 1 ); |
189 | ERROR_CODE = measured_strings_reply( & address, 1 ); |
| 155 | } |
190 | } |
| 156 | rwlock_read_unlock( & netif_globals.lock ); |
191 | rwlock_read_unlock( & netif_globals.lock ); |
| 157 | return ERROR_CODE; |
192 | return ERROR_CODE; |
| 158 | } |
193 | } |
| 159 | return specific_message( callid, call, answer, answer_count ); |
194 | return netif_specific_message( callid, call, answer, answer_count ); |
| 160 | } |
195 | } |
| 161 | 196 | ||
| 162 | int netif_start_module( async_client_conn_t client_connection ){ |
197 | int netif_start_module( async_client_conn_t client_connection ){ |
| 163 | ERROR_DECLARE; |
198 | ERROR_DECLARE; |
| 164 | 199 | ||
| 165 | async_set_client_connection( client_connection ); |
200 | async_set_client_connection( client_connection ); |
| 166 | netif_globals.networking_phone = connect_to_service( SERVICE_NETWORKING ); |
201 | netif_globals.networking_phone = connect_to_service( SERVICE_NETWORKING ); |
| 167 | device_map_initialize( & netif_globals.device_map ); |
202 | device_map_initialize( & netif_globals.device_map ); |
| 168 | ERROR_PROPAGATE( pm_init()); |
203 | ERROR_PROPAGATE( pm_init()); |
| 169 | rwlock_initialize( & netif_globals.lock ); |
204 | rwlock_initialize( & netif_globals.lock ); |
| 170 | if( ERROR_OCCURRED( initialize())){ |
205 | if( ERROR_OCCURRED( netif_initialize())){ |
| 171 | pm_destroy(); |
206 | pm_destroy(); |
| 172 | return ERROR_CODE; |
207 | return ERROR_CODE; |
| 173 | } |
208 | } |
| 174 | 209 | ||
| 175 | async_manager(); |
210 | async_manager(); |