Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 4727 → Rev 4728

/branches/network/uspace/srv/net/il/ip/ip.c
122,31 → 122,6
*/
#define IP_MAX_CONTENT 65535
 
/** Returns the actual IP header length.
* @param header The IP packet header. Input parameter.
*/
#define IP_HEADER_LENGTH( header ) (( header )->ihl * 4u )
 
/** Returns the actual IP packet total length.
* @param header The IP packet header. Input parameter.
*/
#define IP_TOTAL_LENGTH( header ) ntohs(( header )->total_length )
 
/** Returns the actual IP packet data length.
* @param header The IP packet header. Input parameter.
*/
#define IP_HEADER_DATA_LENGTH( header ) ( IP_TOTAL_LENGTH( header ) - IP_HEADER_LENGTH( header ))
 
/** Returns the IP packet header checksum.
* @param header The IP packet header. Input parameter.
*/
#define IP_HEADER_CHECKSUM( header ) ( htons( ip_checksum(( uint8_t * )( header ), IP_HEADER_LENGTH( header ))))
 
/** Returns the fragment offest.
* @param length The prefixed data total length. Input parameter.
*/
#define IP_FRAGMENT_OFFSET( length ) (( length ) / 8 )
 
/** The IP localhost address.
*/
#define IPV4_LOCALHOST_ADDRESS htonl(( 127 << 24 ) + 1 )
706,7 → 681,7
memcpy( middle_header, last_header, IP_HEADER_LENGTH( last_header ));
header->flags |= IPFLAG_MORE_FRAGMENTS;
middle_header->total_length = htons( packet_get_data_length( next ));
middle_header->fragment_offset = IP_FRAGMENT_OFFSET( length );
middle_header->fragment_offset = IP_COMPUTE_FRAGMENT_OFFSET( length );
middle_header->header_checksum = IP_HEADER_CHECKSUM( middle_header );
if( destination ){
ERROR_PROPAGATE( packet_set_addr( next, NULL, ( uint8_t * ) destination->value, CONVERT_SIZE( char, uint8_t, destination->length )));
718,7 → 693,7
if( ! middle_header ) return ENOMEM;
memcpy( middle_header, last_header, IP_HEADER_LENGTH( last_header ));
middle_header->total_length = htons( packet_get_data_length( next ));
middle_header->fragment_offset = IP_FRAGMENT_OFFSET( length );
middle_header->fragment_offset = IP_COMPUTE_FRAGMENT_OFFSET( length );
middle_header->header_checksum = IP_HEADER_CHECKSUM( middle_header );
if( destination ){
ERROR_PROPAGATE( packet_set_addr( next, NULL, ( uint8_t * ) destination->value, CONVERT_SIZE( char, uint8_t, destination->length )));
1033,7 → 1008,7
length = sizeof( ip_header_t );
next = sizeof( ip_header_t );
// process all ip options
while( next < first->ihl ){
while( next < first->header_length ){
option = ( ip_option_ref ) ((( uint8_t * ) first ) + next );
// skip end or noop
if(( option->type == IPOPT_END ) || ( option->type == IPOPT_NOOP )){
1051,9 → 1026,9
// align 4 byte boundary
if( length % 4 ){
bzero((( uint8_t * ) last ) + length, 4 - ( length % 4 ));
last->ihl = length / 4 + 1;
last->header_length = length / 4 + 1;
}else{
last->ihl = length / 4;
last->header_length = length / 4;
}
last->header_checksum = 0;
}