/branches/network/uspace/srv/net/il/ip/ip_header.h |
---|
32,7 → 32,7 |
/** @file |
* IP header and options definitions. |
* Names according to the linux src/include/linux/ip.h header file. |
* Based on the RFC~791. |
*/ |
#ifndef __NET_IP_HEADER_H__ |
41,6 → 41,36 |
#include <byteorder.h> |
#include <sys/types.h> |
/** Returns the actual IP header length. |
* @param header The IP packet header. Input parameter. |
*/ |
#define IP_HEADER_LENGTH( header ) (( header )->header_length * 4u ) |
/** Returns the actual IP header length. |
* @param header The IP packet header. Input parameter. |
*/ |
#define IP_COMPUTE_HEADER_LENGTH( length ) (( uint8_t ) (( length ) / 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_COMPUTE_FRAGMENT_OFFSET( length ) (( length ) / 8 ) |
/** Type definition of the internet header. |
* @see ip_header |
*/ |
62,12 → 92,12 |
/** Internet Header Length is the length of the internet header in 32~bit words, and thus points to the beginning of the data. |
* Note that the minimum value for a~correct header is~5. |
*/ |
uint8_t ihl:4; |
uint8_t header_length:4; |
#else |
/** Internet Header Length is the length of the internet header in 32~bit words, and thus points to the beginning of the data. |
* Note that the minimum value for a~correct header is~5. |
*/ |
uint8_t ihl:4; |
uint8_t header_length:4; |
/** The Version field indicates the format of the internet header. |
*/ |
uint8_t version:4; |
200,14 → 230,6 |
/*@}*/ |
/* |
#define IPOPT_OPTVAL 0 |
#define IPOPT_OLEN 1 |
#define IPOPT_OFFSET 2 |
#define IPOPT_MINOFF 4 |
#define MAX_IPOPTLEN 40 |
*/ |
/** Type definition of the internet version 4 pseudo header. |
* @see ipv4_pseudo_header |
*/ |
227,9 → 249,10 |
/** The destination address. |
*/ |
uint32_t destination_address; |
/** Zero byte. |
/** Reserved byte. |
* Must be zero. |
*/ |
uint8_t zero; |
uint8_t reserved; |
/** This field indicates the next level protocol used in the data portion of the internet datagram. |
*/ |
uint8_t protocol; |
/branches/network/uspace/srv/net/il/ip/ip_client.c |
---|
61,7 → 61,7 |
if( ! data ) return ENOMEM; |
while( padding -- ) data[ sizeof( ip_header_t ) + padding ] = IPOPT_NOOP; |
header = ( ip_header_ref ) data; |
header->ihl = ( uint8_t ) ( sizeof( ip_header_t ) + ipopt_length ) / 4; |
header->header_length = IP_COMPUTE_HEADER_LENGTH( sizeof( ip_header_t ) + ipopt_length ); |
header->ttl = ttl ? (( ttl <= MAXTTL ) ? ttl : MAXTTL ) : IPDEFTTL; |
header->tos = tos; |
header->protocol = protocol; |
82,10 → 82,10 |
if( tos ) * tos = header->tos; |
if( dont_fragment ) * dont_fragment = header->flags & IPFLAG_DONT_FRAGMENT; |
if( ipopt_length ){ |
* ipopt_length = header->ihl * 4 - sizeof( ip_header_t ); |
* ipopt_length = IP_HEADER_LENGTH( header ) - sizeof( ip_header_t ); |
return sizeof( ip_header_t ); |
}else{ |
return header->ihl * 4; |
return IP_HEADER_LENGTH( header ); |
} |
} |
97,7 → 97,7 |
|| ( packet_get_data_length( packet ) < sizeof( ip_header_t ))){ |
return 0; |
} |
return header->ihl * 4u; |
return IP_HEADER_LENGTH( header ); |
} |
int ip_client_set_pseudo_header_data_length( ip_pseudo_header_ref header, size_t headerlen, size_t data_length ){ |
/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; |
} |