Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 4727 → Rev 4728

/branches/network/uspace/srv/net/il/arp/arp_header.h
32,6 → 32,7
 
/** @file
* ARP protocol header.
* Based on the RFC~826.
*/
 
#ifndef __NET_ARP_HEADER_H__
/branches/network/uspace/srv/net/il/arp/arp_oc.h
32,7 → 32,6
 
/** @file
* ARP operation codes according to the on-line IANA - Address Resolution Protocol (ARP) Parameters - <http://www.iana.org/assignments/arp-parameters/arp-parameters.xml>, cited January 14 2009.
* Names according to the linux src/include/linux/if_arp.h header file.
*/
 
#ifndef __NET_ARP_ARPOP_H__
/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;
}