Rev 4735 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4735 | Rev 4743 | ||
---|---|---|---|
Line 51... | Line 51... | ||
51 | #include "../../messages.h" |
51 | #include "../../messages.h" |
52 | #include "../../modules.h" |
52 | #include "../../modules.h" |
53 | 53 | ||
54 | #include "../../include/arp_interface.h" |
54 | #include "../../include/arp_interface.h" |
55 | #include "../../include/byteorder.h" |
55 | #include "../../include/byteorder.h" |
56 | #include "../../include/crc.h" |
56 | #include "../../include/checksum.h" |
57 | #include "../../include/device.h" |
57 | #include "../../include/device.h" |
58 | #include "../../include/icmp_client.h" |
58 | #include "../../include/icmp_client.h" |
59 | #include "../../include/icmp_codes.h" |
59 | #include "../../include/icmp_codes.h" |
60 | #include "../../include/icmp_interface.h" |
60 | #include "../../include/icmp_interface.h" |
61 | #include "../../include/il_interface.h" |
61 | #include "../../include/il_interface.h" |
Line 269... | Line 269... | ||
269 | inet_ntop( AF_INET, ( uint8_t * ) & route->gateway.s_addr, data, INET_ADDRSTRLEN ); |
269 | inet_ntop( AF_INET, ( uint8_t * ) & route->gateway.s_addr, data, INET_ADDRSTRLEN ); |
270 | printf( "\t\tgateway\t= %s\n", data ); |
270 | printf( "\t\tgateway\t= %s\n", data ); |
271 | } |
271 | } |
272 | } |
272 | } |
273 | inet_ntop( AF_INET, ( uint8_t * ) & ip_netif->broadcast.s_addr, data, INET_ADDRSTRLEN ); |
273 | inet_ntop( AF_INET, ( uint8_t * ) & ip_netif->broadcast.s_addr, data, INET_ADDRSTRLEN ); |
274 | printf( "\tbroadcast\t= %s\n", data ); |
274 | printf( "\t\tbroadcast\t= %s\n", data ); |
275 | inet_ntop( AF_INET, ( uint8_t * ) & ip_netif->dns1, data, INET_ADDRSTRLEN ); |
- | |
276 | printf( "\tdns1\t= %s\n", data ); |
- | |
277 | inet_ntop( AF_INET, ( uint8_t * ) & ip_netif->dns2, data, INET_ADDRSTRLEN ); |
- | |
278 | printf( "\tdns2\t= %s\n", data ); |
- | |
279 | free( data ); |
275 | free( data ); |
280 | } |
276 | } |
281 | fibril_rwlock_write_unlock( & ip_globals.netifs_lock ); |
277 | fibril_rwlock_write_unlock( & ip_globals.netifs_lock ); |
282 | return EOK; |
278 | return EOK; |
283 | } |
279 | } |
284 | 280 | ||
285 | int ip_netif_initialize( ip_netif_ref ip_netif ){ |
281 | int ip_netif_initialize( ip_netif_ref ip_netif ){ |
286 | ERROR_DECLARE; |
282 | ERROR_DECLARE; |
287 | 283 | ||
288 | measured_string_t names[] = {{ "IPV", 3 }, { "IP_CONFIG", 9 }, { "IP_ADDR", 7 }, { "NETMASK", 7 }, { "GATEWAY", 7 }, { "BROADCAST", 9 }, { "DNS1", 4 }, { "DNS2", 4 }, { "ARP", 3 }, { "IP_ROUTING", 10 }}; |
284 | measured_string_t names[] = {{ "IPV", 3 }, { "IP_CONFIG", 9 }, { "IP_ADDR", 7 }, { "IP_NETMASK", 10 }, { "IP_GATEWAY", 10 }, { "IP_BROADCAST", 12 }, { "ARP", 3 }, { "IP_ROUTING", 10 }}; |
289 | measured_string_ref configuration; |
285 | measured_string_ref configuration; |
290 | size_t count = sizeof( names ) / sizeof( measured_string_t ); |
286 | size_t count = sizeof( names ) / sizeof( measured_string_t ); |
291 | char * data; |
287 | char * data; |
292 | measured_string_t address; |
288 | measured_string_t address; |
293 | int index; |
289 | int index; |
Line 328... | Line 324... | ||
328 | return index; |
324 | return index; |
329 | } |
325 | } |
330 | if( ERROR_OCCURRED( inet_pton( AF_INET, configuration[ 2 ].value, ( uint8_t * ) & route->address.s_addr )) |
326 | if( ERROR_OCCURRED( inet_pton( AF_INET, configuration[ 2 ].value, ( uint8_t * ) & route->address.s_addr )) |
331 | || ERROR_OCCURRED( inet_pton( AF_INET, configuration[ 3 ].value, ( uint8_t * ) & route->netmask.s_addr )) |
327 | || ERROR_OCCURRED( inet_pton( AF_INET, configuration[ 3 ].value, ( uint8_t * ) & route->netmask.s_addr )) |
332 | || ( inet_pton( AF_INET, configuration[ 4 ].value, ( uint8_t * ) & gateway.s_addr ) == EINVAL ) |
328 | || ( inet_pton( AF_INET, configuration[ 4 ].value, ( uint8_t * ) & gateway.s_addr ) == EINVAL ) |
333 | || ( inet_pton( AF_INET, configuration[ 5 ].value, ( uint8_t * ) & ip_netif->broadcast.s_addr ) == EINVAL ) |
329 | || ( inet_pton( AF_INET, configuration[ 5 ].value, ( uint8_t * ) & ip_netif->broadcast.s_addr ) == EINVAL )){ |
334 | || ( inet_pton( AF_INET, configuration[ 6 ].value, ( uint8_t * ) & ip_netif->dns1 ) == EINVAL ) |
- | |
335 | || ( inet_pton( AF_INET, configuration[ 7 ].value, ( uint8_t * ) & ip_netif->dns2 ) == EINVAL )){ |
- | |
336 | net_free_settings( configuration, data ); |
330 | net_free_settings( configuration, data ); |
337 | return EINVAL; |
331 | return EINVAL; |
338 | } |
332 | } |
339 | }else{ |
333 | }else{ |
340 | // TODO ipv6 in separate module |
334 | // TODO ipv6 in separate module |
341 | net_free_settings( configuration, data ); |
335 | net_free_settings( configuration, data ); |
342 | return ENOTSUP; |
336 | return ENOTSUP; |
343 | } |
337 | } |
344 | if( configuration[ 8 ].value ){ |
338 | if( configuration[ 6 ].value ){ |
345 | ip_netif->arp = get_running_module( & ip_globals.modules, configuration[ 8 ].value ); |
339 | ip_netif->arp = get_running_module( & ip_globals.modules, configuration[ 6 ].value ); |
346 | if( ! ip_netif->arp ){ |
340 | if( ! ip_netif->arp ){ |
347 | printf( "Failed to start the arp %s\n", configuration[ 8 ].value ); |
341 | printf( "Failed to start the arp %s\n", configuration[ 6 ].value ); |
348 | net_free_settings( configuration, data ); |
342 | net_free_settings( configuration, data ); |
349 | return EINVAL; |
343 | return EINVAL; |
350 | } |
344 | } |
351 | } |
345 | } |
352 | if( configuration[ 9 ].value ){ |
346 | if( configuration[ 7 ].value ){ |
353 | ip_netif->routing = ( configuration[ 9 ].value[ 0 ] == 'y' ); |
347 | ip_netif->routing = ( configuration[ 7 ].value[ 0 ] == 'y' ); |
354 | } |
348 | } |
355 | net_free_settings( configuration, data ); |
349 | net_free_settings( configuration, data ); |
356 | } |
350 | } |
357 | // binds the netif service which also initializes the device |
351 | // binds the netif service which also initializes the device |
358 | ip_netif->phone = bind_service( ip_netif->service, ( ipcarg_t ) ip_netif->device_id, SERVICE_IP, 0, ip_globals.client_connection ); |
352 | ip_netif->phone = nil_bind_service( ip_netif->service, ( ipcarg_t ) ip_netif->device_id, SERVICE_IP, ip_globals.client_connection ); |
359 | if( ip_netif->phone < 0 ){ |
353 | if( ip_netif->phone < 0 ){ |
360 | printf( "Failed to contact the nil service %d\n", ip_netif->service ); |
354 | printf( "Failed to contact the nil service %d\n", ip_netif->service ); |
361 | return ip_netif->phone; |
355 | return ip_netif->phone; |
362 | } |
356 | } |
363 | // has to be after the device netif module initialization |
357 | // has to be after the device netif module initialization |
Line 467... | Line 461... | ||
467 | // should be the next hop address or the target destination address |
461 | // should be the next hop address or the target destination address |
468 | addrlen = packet_get_addr( packet, NULL, ( uint8_t ** ) & addr ); |
462 | addrlen = packet_get_addr( packet, NULL, ( uint8_t ** ) & addr ); |
469 | if( addrlen < 0 ){ |
463 | if( addrlen < 0 ){ |
470 | return ip_release_and_return( packet, addrlen ); |
464 | return ip_release_and_return( packet, addrlen ); |
471 | } |
465 | } |
472 | if( addrlen < sizeof( struct sockaddr )){ |
466 | if(( size_t ) addrlen < sizeof( struct sockaddr )){ |
473 | return ip_release_and_return( packet, EINVAL ); |
467 | return ip_release_and_return( packet, EINVAL ); |
474 | } |
468 | } |
475 | switch( addr->sa_family ){ |
469 | switch( addr->sa_family ){ |
476 | case AF_INET: |
470 | case AF_INET: |
477 | if( addrlen != sizeof( struct sockaddr_in )){ |
471 | if( addrlen != sizeof( struct sockaddr_in )){ |
Line 1288... | Line 1282... | ||
1288 | ip_route_ref route; |
1282 | ip_route_ref route; |
1289 | ipv4_pseudo_header_ref header_in; |
1283 | ipv4_pseudo_header_ref header_in; |
1290 | 1284 | ||
1291 | if( !( destination && ( addrlen > 0 ))) return EINVAL; |
1285 | if( !( destination && ( addrlen > 0 ))) return EINVAL; |
1292 | if( !( device_id && header && headerlen )) return EBADMEM; |
1286 | if( !( device_id && header && headerlen )) return EBADMEM; |
1293 | if( addrlen < sizeof( struct sockaddr )){ |
1287 | if(( size_t ) addrlen < sizeof( struct sockaddr )){ |
1294 | return EINVAL; |
1288 | return EINVAL; |
1295 | } |
1289 | } |
1296 | switch( destination->sa_family ){ |
1290 | switch( destination->sa_family ){ |
1297 | case AF_INET: |
1291 | case AF_INET: |
1298 | if( addrlen != sizeof( struct sockaddr_in )){ |
1292 | if( addrlen != sizeof( struct sockaddr_in )){ |