Changes in uspace/srv/net/netif/netif.c [21580dd:aadf01e] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/netif/netif.c
r21580dd raadf01e 64 64 extern netif_globals_t netif_globals; 65 65 66 DEVICE_MAP_IMPLEMENT( device_map, device_t)66 DEVICE_MAP_IMPLEMENT(device_map, device_t) 67 67 68 68 /** @name Message processing functions … … 77 77 * @returns ELIMIT if there is another module registered. 78 78 */ 79 int register_message( device_id_t device_id, int phone);79 int register_message(device_id_t device_id, int phone); 80 80 81 81 /*@}*/ 82 82 83 int netif_probe_req( int netif_phone, device_id_t device_id, int irq, int io){84 int 85 86 fibril_rwlock_write_lock( & netif_globals.lock);87 result = netif_probe_message( device_id, irq, io);88 fibril_rwlock_write_unlock( & netif_globals.lock);89 return result; 90 } 91 92 int netif_send_msg( int netif_phone, device_id_t device_id, packet_t packet, services_t sender){93 int 94 95 fibril_rwlock_write_lock( & netif_globals.lock);96 result = netif_send_message( device_id, packet, sender);97 fibril_rwlock_write_unlock( & netif_globals.lock);98 return result; 99 } 100 101 int netif_start_req( int netif_phone, device_id_t device_id){102 ERROR_DECLARE; 103 104 device_ref 105 int 106 int 107 108 fibril_rwlock_write_lock( & netif_globals.lock);109 if( ERROR_OCCURRED( find_device( device_id, & device))){110 fibril_rwlock_write_unlock( & netif_globals.lock);83 int netif_probe_req(int netif_phone, device_id_t device_id, int irq, int io){ 84 int result; 85 86 fibril_rwlock_write_lock(&netif_globals.lock); 87 result = netif_probe_message(device_id, irq, io); 88 fibril_rwlock_write_unlock(&netif_globals.lock); 89 return result; 90 } 91 92 int netif_send_msg(int netif_phone, device_id_t device_id, packet_t packet, services_t sender){ 93 int result; 94 95 fibril_rwlock_write_lock(&netif_globals.lock); 96 result = netif_send_message(device_id, packet, sender); 97 fibril_rwlock_write_unlock(&netif_globals.lock); 98 return result; 99 } 100 101 int netif_start_req(int netif_phone, device_id_t device_id){ 102 ERROR_DECLARE; 103 104 device_ref device; 105 int result; 106 int phone; 107 108 fibril_rwlock_write_lock(&netif_globals.lock); 109 if(ERROR_OCCURRED(find_device(device_id, &device))){ 110 fibril_rwlock_write_unlock(&netif_globals.lock); 111 111 return ERROR_CODE; 112 112 } 113 result = netif_start_message( device);114 if( result > NETIF_NULL){113 result = netif_start_message(device); 114 if(result > NETIF_NULL){ 115 115 phone = device->nil_phone; 116 fibril_rwlock_write_unlock( & netif_globals.lock);117 nil_device_state_msg( phone, device_id, result);116 fibril_rwlock_write_unlock(&netif_globals.lock); 117 nil_device_state_msg(phone, device_id, result); 118 118 return EOK; 119 119 }else{ 120 fibril_rwlock_write_unlock( & netif_globals.lock);121 } 122 return result; 123 } 124 125 int netif_stop_req( int netif_phone, device_id_t device_id){126 ERROR_DECLARE; 127 128 device_ref 129 int 130 int 131 132 fibril_rwlock_write_lock( & netif_globals.lock);133 if( ERROR_OCCURRED( find_device( device_id, & device))){134 fibril_rwlock_write_unlock( & netif_globals.lock);120 fibril_rwlock_write_unlock(&netif_globals.lock); 121 } 122 return result; 123 } 124 125 int netif_stop_req(int netif_phone, device_id_t device_id){ 126 ERROR_DECLARE; 127 128 device_ref device; 129 int result; 130 int phone; 131 132 fibril_rwlock_write_lock(&netif_globals.lock); 133 if(ERROR_OCCURRED(find_device(device_id, &device))){ 134 fibril_rwlock_write_unlock(&netif_globals.lock); 135 135 return ERROR_CODE; 136 136 } 137 result = netif_stop_message( device);138 if( result > NETIF_NULL){137 result = netif_stop_message(device); 138 if(result > NETIF_NULL){ 139 139 phone = device->nil_phone; 140 fibril_rwlock_write_unlock( & netif_globals.lock);141 nil_device_state_msg( phone, device_id, result);140 fibril_rwlock_write_unlock(&netif_globals.lock); 141 nil_device_state_msg(phone, device_id, result); 142 142 return EOK; 143 143 }else{ 144 fibril_rwlock_write_unlock( & netif_globals.lock);145 } 146 return result; 147 } 148 149 int netif_stats_req( int netif_phone, device_id_t device_id, device_stats_ref stats){144 fibril_rwlock_write_unlock(&netif_globals.lock); 145 } 146 return result; 147 } 148 149 int netif_stats_req(int netif_phone, device_id_t device_id, device_stats_ref stats){ 150 150 int res; 151 151 152 fibril_rwlock_read_lock( & netif_globals.lock);153 res = netif_get_device_stats( device_id, stats);154 fibril_rwlock_read_unlock( & netif_globals.lock);152 fibril_rwlock_read_lock(&netif_globals.lock); 153 res = netif_get_device_stats(device_id, stats); 154 fibril_rwlock_read_unlock(&netif_globals.lock); 155 155 return res; 156 156 } 157 157 158 int netif_get_addr_req( int netif_phone, device_id_t device_id, measured_string_ref * address, char ** data ){ 159 ERROR_DECLARE; 160 161 measured_string_t translation; 162 163 if( !( address && data )) return EBADMEM; 164 fibril_rwlock_read_lock( & netif_globals.lock ); 165 if( ! ERROR_OCCURRED( netif_get_addr_message( device_id, & translation ))){ 166 * address = measured_string_copy( & translation ); 167 ERROR_CODE = ( * address ) ? EOK : ENOMEM; 168 } 169 fibril_rwlock_read_unlock( & netif_globals.lock ); 170 * data = ( ** address ).value; 158 int netif_get_addr_req(int netif_phone, device_id_t device_id, measured_string_ref * address, char ** data){ 159 ERROR_DECLARE; 160 161 measured_string_t translation; 162 163 if(!(address && data)){ 164 return EBADMEM; 165 } 166 fibril_rwlock_read_lock(&netif_globals.lock); 167 if(! ERROR_OCCURRED(netif_get_addr_message(device_id, &translation))){ 168 *address = measured_string_copy(&translation); 169 ERROR_CODE = (*address) ? EOK : ENOMEM; 170 } 171 fibril_rwlock_read_unlock(&netif_globals.lock); 172 *data = (** address).value; 171 173 return ERROR_CODE; 172 174 } 173 175 174 int netif_bind_service( services_t service, device_id_t device_id, services_t me, async_client_conn_t receiver ){ 175 return EOK; 176 } 177 178 int find_device( device_id_t device_id, device_ref * device ){ 179 if( ! device ) return EBADMEM; 180 * device = device_map_find( & netif_globals.device_map, device_id ); 181 if( ! * device ) return ENOENT; 182 if(( ** device ).state == NETIF_NULL ) return EPERM; 183 return EOK; 184 } 185 186 void null_device_stats( device_stats_ref stats ){ 187 bzero( stats, sizeof( device_stats_t )); 188 } 189 190 int register_message( device_id_t device_id, int phone ){ 191 ERROR_DECLARE; 192 193 device_ref device; 194 195 ERROR_PROPAGATE( find_device( device_id, & device )); 196 if( device->nil_phone > 0 ) return ELIMIT; 176 int netif_bind_service(services_t service, device_id_t device_id, services_t me, async_client_conn_t receiver){ 177 return EOK; 178 } 179 180 int find_device(device_id_t device_id, device_ref * device){ 181 if(! device){ 182 return EBADMEM; 183 } 184 *device = device_map_find(&netif_globals.device_map, device_id); 185 if(! * device){ 186 return ENOENT; 187 } 188 if((** device).state == NETIF_NULL) return EPERM; 189 return EOK; 190 } 191 192 void null_device_stats(device_stats_ref stats){ 193 bzero(stats, sizeof(device_stats_t)); 194 } 195 196 int register_message(device_id_t device_id, int phone){ 197 ERROR_DECLARE; 198 199 device_ref device; 200 201 ERROR_PROPAGATE(find_device(device_id, &device)); 202 if(device->nil_phone > 0){ 203 return ELIMIT; 204 } 197 205 device->nil_phone = phone; 198 printf( "New receiver of the device %d registered:\n\tphone\t= %d\n", device->device_id, device->nil_phone);199 return EOK; 200 } 201 202 int netif_message( ipc_callid_t callid, ipc_call_t * call, ipc_call_t * answer, int * answer_count){203 ERROR_DECLARE; 204 205 size_t 206 device_stats_t 207 packet_t 208 measured_string_t 209 210 // printf( "message %d - %d\n", IPC_GET_METHOD( * call ), NET_NETIF_FIRST);211 * 212 switch( IPC_GET_METHOD( * call)){206 printf("New receiver of the device %d registered:\n\tphone\t= %d\n", device->device_id, device->nil_phone); 207 return EOK; 208 } 209 210 int netif_message(ipc_callid_t callid, ipc_call_t * call, ipc_call_t * answer, int * answer_count){ 211 ERROR_DECLARE; 212 213 size_t length; 214 device_stats_t stats; 215 packet_t packet; 216 measured_string_t address; 217 218 // printf("message %d - %d\n", IPC_GET_METHOD(*call), NET_NETIF_FIRST); 219 *answer_count = 0; 220 switch(IPC_GET_METHOD(*call)){ 213 221 case IPC_M_PHONE_HUNGUP: 214 222 return EOK; 215 223 case NET_NETIF_PROBE: 216 return netif_probe_req( 0, IPC_GET_DEVICE( call ), NETIF_GET_IRQ( call ), NETIF_GET_IO( call));224 return netif_probe_req(0, IPC_GET_DEVICE(call), NETIF_GET_IRQ(call), NETIF_GET_IO(call)); 217 225 case IPC_M_CONNECT_TO_ME: 218 fibril_rwlock_write_lock( & netif_globals.lock);219 ERROR_CODE = register_message( IPC_GET_DEVICE( call ), IPC_GET_PHONE( call));220 fibril_rwlock_write_unlock( & netif_globals.lock);226 fibril_rwlock_write_lock(&netif_globals.lock); 227 ERROR_CODE = register_message(IPC_GET_DEVICE(call), IPC_GET_PHONE(call)); 228 fibril_rwlock_write_unlock(&netif_globals.lock); 221 229 return ERROR_CODE; 222 230 case NET_NETIF_SEND: 223 ERROR_PROPAGATE( packet_translate( netif_globals.net_phone, & packet, IPC_GET_PACKET( call)));224 return netif_send_msg( 0, IPC_GET_DEVICE( call ), packet, IPC_GET_SENDER( call));231 ERROR_PROPAGATE(packet_translate(netif_globals.net_phone, &packet, IPC_GET_PACKET(call))); 232 return netif_send_msg(0, IPC_GET_DEVICE(call), packet, IPC_GET_SENDER(call)); 225 233 case NET_NETIF_START: 226 return netif_start_req( 0, IPC_GET_DEVICE( call));234 return netif_start_req(0, IPC_GET_DEVICE(call)); 227 235 case NET_NETIF_STATS: 228 fibril_rwlock_read_lock( & netif_globals.lock);229 if( ! ERROR_OCCURRED( async_data_read_receive( & callid, & length))){230 if( length < sizeof( device_stats_t)){236 fibril_rwlock_read_lock(&netif_globals.lock); 237 if(! ERROR_OCCURRED(async_data_read_receive(&callid, &length))){ 238 if(length < sizeof(device_stats_t)){ 231 239 ERROR_CODE = EOVERFLOW; 232 240 }else{ 233 if( ! ERROR_OCCURRED( netif_get_device_stats( IPC_GET_DEVICE( call ), & stats))){234 ERROR_CODE = async_data_read_finalize( callid, & stats, sizeof( device_stats_t));241 if(! ERROR_OCCURRED(netif_get_device_stats(IPC_GET_DEVICE(call), &stats))){ 242 ERROR_CODE = async_data_read_finalize(callid, &stats, sizeof(device_stats_t)); 235 243 } 236 244 } 237 245 } 238 fibril_rwlock_read_unlock( & netif_globals.lock);246 fibril_rwlock_read_unlock(&netif_globals.lock); 239 247 return ERROR_CODE; 240 248 case NET_NETIF_STOP: 241 return netif_stop_req( 0, IPC_GET_DEVICE( call));249 return netif_stop_req(0, IPC_GET_DEVICE(call)); 242 250 case NET_NETIF_GET_ADDR: 243 fibril_rwlock_read_lock( & netif_globals.lock);244 if( ! ERROR_OCCURRED( netif_get_addr_message( IPC_GET_DEVICE( call ), & address))){245 ERROR_CODE = measured_strings_reply( & address, 1);251 fibril_rwlock_read_lock(&netif_globals.lock); 252 if(! ERROR_OCCURRED(netif_get_addr_message(IPC_GET_DEVICE(call), &address))){ 253 ERROR_CODE = measured_strings_reply(&address, 1); 246 254 } 247 fibril_rwlock_read_unlock( & netif_globals.lock);255 fibril_rwlock_read_unlock(&netif_globals.lock); 248 256 return ERROR_CODE; 249 257 } 250 return netif_specific_message( callid, call, answer, answer_count);251 } 252 253 int netif_init_module( async_client_conn_t client_connection){254 ERROR_DECLARE; 255 256 async_set_client_connection( client_connection);257 netif_globals.net_phone = connect_to_service( SERVICE_NETWORKING);258 device_map_initialize( & netif_globals.device_map);259 ERROR_PROPAGATE( 260 fibril_rwlock_initialize( & netif_globals.lock);261 if( ERROR_OCCURRED(netif_initialize())){258 return netif_specific_message(callid, call, answer, answer_count); 259 } 260 261 int netif_init_module(async_client_conn_t client_connection){ 262 ERROR_DECLARE; 263 264 async_set_client_connection(client_connection); 265 netif_globals.net_phone = connect_to_service(SERVICE_NETWORKING); 266 device_map_initialize(&netif_globals.device_map); 267 ERROR_PROPAGATE(pm_init()); 268 fibril_rwlock_initialize(&netif_globals.lock); 269 if(ERROR_OCCURRED(netif_initialize())){ 262 270 pm_destroy(); 263 271 return ERROR_CODE; … … 266 274 } 267 275 268 int netif_run_module( void){276 int netif_run_module(void){ 269 277 async_manager(); 270 278 … … 273 281 } 274 282 275 void netif_pq_release( packet_id_t packet_id){276 pq_release( netif_globals.net_phone, packet_id);277 } 278 279 packet_t netif_packet_get_1( size_t content){280 return packet_get_1( netif_globals.net_phone, content);283 void netif_pq_release(packet_id_t packet_id){ 284 pq_release(netif_globals.net_phone, packet_id); 285 } 286 287 packet_t netif_packet_get_1(size_t content){ 288 return packet_get_1(netif_globals.net_phone, content); 281 289 } 282 290
Note:
See TracChangeset
for help on using the changeset viewer.