104,7 → 104,7 |
int ip_netif_initialize( ip_netif_ref ip_netif ); |
|
int ip_send_route( packet_t packet, ip_netif_ref netif, ip_route_ref route, in_addr_t * src, in_addr_t dest ); |
int ip_prepare_packet( in_addr_t * source, packet_t packet, measured_string_ref destination ); |
int ip_prepare_packet( in_addr_t * source, in_addr_t dest, packet_t packet, measured_string_ref destination ); |
|
packet_t ip_split_packet( packet_t packet, size_t prefix, size_t content, size_t suffix, size_t addr_len ); |
int ip_fragment_packet( packet_t packet, size_t length, size_t prefix, size_t suffix, size_t addr_len ); |
424,12 → 424,12 |
int length; |
ip_netif_ref netif; |
ip_route_ref route; |
in_addr_t dest; |
in_addr_t * dest; |
in_addr_t * src; |
|
// addresses in the host byte order |
// should be the next hop address or the target destination address |
length = packet_get_addr( packet, NULL, ( void * )( & dest.s_addr )); |
length = packet_get_addr( packet, NULL, ( uint8_t ** ) & dest ); |
if( length < 0 ){ |
pq_release( ip_globals.net_phone, packet_get_id( packet )); |
return length; |
442,12 → 442,12 |
rwlock_read_lock( & ip_globals.netifs_lock ); |
// device specified? |
// dest.s_addr = ntohl( dest.s_addr ); |
if( device_id ){ |
if( device_id > 0 ){ |
netif = ip_netifs_find( & ip_globals.netifs, device_id ); |
route = ip_netif_find_route( netif, dest ); |
route = ip_netif_find_route( netif, * dest ); |
}else{ |
// TODO IPv6 |
route = ip_find_route( dest ); |
route = ip_find_route( * dest ); |
netif = route ? route->netif : NULL; |
} |
if( !( netif && route )){ |
456,7 → 456,7 |
return ENOENT; |
} |
// to me? |
if( route->address.s_addr == dest.s_addr ){ |
if( route->address.s_addr == dest->s_addr ){ |
// TODO loopback deliver |
rwlock_read_unlock( & ip_globals.netifs_lock ); |
return ip_deliver_local( -1, packet, ( ip_header_ref ) packet_get_data( packet )); |
468,7 → 468,7 |
pq_release( ip_globals.net_phone, packet_get_id( packet )); |
return ENOENT; |
} |
if( ERROR_OCCURRED( ip_send_route( packet, netif, route, src, dest ))){ |
if( ERROR_OCCURRED( ip_send_route( packet, netif, route, src, * dest ))){ |
pq_release( ip_globals.net_phone, packet_get_id( packet )); |
} |
rwlock_read_unlock( & ip_globals.netifs_lock ); |
491,12 → 491,9 |
measured_string_ref translation; |
char * data; |
|
if( route->gateway.s_addr ){ |
dest.s_addr = route->gateway.s_addr; |
} |
// get destination hardware address |
if( netif->arp ){ |
destination.value = ( char * ) & dest.s_addr; |
destination.value = route->gateway.s_addr ? ( char * ) & route->gateway.s_addr : ( char * ) & dest.s_addr; |
destination.length = CONVERT_SIZE( dest.s_addr, char, 1 ); |
if( ERROR_OCCURRED( arp_translate_req( netif->arp->phone, netif->device_id, SERVICE_IP, & destination, & translation, & data ))){ |
usleep( 200000 ); |
514,7 → 511,7 |
// process packet queue |
next = packet; |
do{ |
if( ERROR_OCCURRED( ip_prepare_packet( src, next, translation ))){ |
if( ERROR_OCCURRED( ip_prepare_packet( src, dest, next, translation ))){ |
// release invalid packet |
tmp = pq_detach( next ); |
if( next == packet ) packet = tmp; |
538,7 → 535,7 |
return EOK; |
} |
|
int ip_prepare_packet( in_addr_t * source, packet_t packet, measured_string_ref destination ){ |
int ip_prepare_packet( in_addr_t * source, in_addr_t dest, packet_t packet, measured_string_ref destination ){ |
ERROR_DECLARE; |
|
size_t length; |
553,7 → 550,8 |
header->version = 4; |
header->total_length = htons( length ); |
header->fragment_offset = 0; |
if( source ) header->source_address = source->s_addr;//htonl( source.s_addr ); |
if( source ) header->source_address = source->s_addr; |
header->destination_address = dest.s_addr; |
rwlock_write_lock( & ip_globals.lock ); |
++ ip_globals.packet_counter; |
header->identification = htons( ip_globals.packet_counter ); |
601,18 → 599,35 |
|
int ip_packet_size_req( int ip_phone, device_id_t device_id, size_t * addr_len, size_t * prefix, size_t * content, size_t * suffix ){ |
ip_netif_ref netif; |
int index; |
|
if( !( addr_len && prefix && content && suffix )) return EBADMEM; |
* content = IP_MAX_CONTENT - IP_PREFIX; |
rwlock_read_lock( & ip_globals.netifs_lock ); |
netif = ip_netifs_find( & ip_globals.netifs, device_id ); |
if( ! netif ){ |
rwlock_read_unlock( & ip_globals.netifs_lock ); |
return ENOENT; |
if( device_id < 0 ){ |
* addr_len = IP_ADDR; |
* prefix = 0; |
* suffix = 0; |
for( index = ip_netifs_count( & ip_globals.netifs ) - 1; index >= 0; -- index ){ |
netif = ip_netifs_get_index( & ip_globals.netifs, index ); |
if( netif ){ |
if( netif->addr_len > * addr_len ) * addr_len = netif->addr_len; |
if( netif->prefix > * prefix ) * prefix = netif->prefix; |
if( netif->suffix > * suffix ) * suffix = netif->suffix; |
} |
} |
* prefix = * prefix + IP_PREFIX; |
* suffix = * suffix + IP_SUFFIX; |
}else{ |
netif = ip_netifs_find( & ip_globals.netifs, device_id ); |
if( ! netif ){ |
rwlock_read_unlock( & ip_globals.netifs_lock ); |
return ENOENT; |
} |
* addr_len = ( netif->addr_len > IP_ADDR ) ? netif->addr_len : IP_ADDR; |
* prefix = netif->prefix + IP_PREFIX; |
* suffix = netif->suffix + IP_SUFFIX; |
} |
* content = IP_MAX_CONTENT - IP_PREFIX; |
* addr_len = ( netif->addr_len > IP_ADDR ) ? netif->addr_len : IP_ADDR; |
* prefix = netif->prefix + IP_PREFIX; |
* suffix = netif->suffix + IP_SUFFIX; |
rwlock_read_unlock( & ip_globals.netifs_lock ); |
return EOK; |
} |