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; |
} |