Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 4721 → Rev 4722

/branches/network/uspace/srv/net/il/ip/ip_client.c
40,6 → 40,7
#include <sys/types.h>
 
#include "../../include/ip_client.h"
#include "../../include/socket_errno.h"
 
#include "../../structures/packet/packet.h"
#include "../../structures/packet/packet_client.h"
99,5 → 100,48
return header->ihl * 4u;
}
 
int ip_client_set_pseudo_header_data_length( ip_pseudo_header_ref header, size_t headerlen, size_t data_length ){
ipv4_pseudo_header_ref header_in;
 
if( headerlen == sizeof( ipv4_pseudo_header_t )){
header_in = ( ipv4_pseudo_header_ref ) header;
header_in->data_length = htons( data_length );
return EOK;
}else{
return EINVAL;
}
}
 
int ip_client_get_pseudo_header( ip_protocol_t protocol, struct sockaddr * src, socklen_t srclen, struct sockaddr * dest, socklen_t destlen, size_t data_length, ip_pseudo_header_ref * header, size_t * headerlen ){
ipv4_pseudo_header_ref header_in;
struct sockaddr_in * address_in;
 
if( !( header && headerlen )) return EBADMEM;
if( !( src && dest && ( srclen >= sizeof( struct sockaddr )) && ( srclen == destlen ) && ( src->sa_family == dest->sa_family ))) return EINVAL;
switch( src->sa_family ){
case AF_INET:
if( srclen != sizeof( struct sockaddr_in )) return EINVAL;
* headerlen = sizeof( * header_in );
header_in = ( ipv4_pseudo_header_ref ) malloc( * headerlen );
if( ! header_in ) return ENOMEM;
bzero( header_in, * headerlen );
address_in = ( struct sockaddr_in * ) dest;
header_in->destination_address = address_in->sin_addr.s_addr;
address_in = ( struct sockaddr_in * ) src;
header_in->source_address = address_in->sin_addr.s_addr;
header_in->protocol = protocol;
header_in->data_length = htons( data_length );
* header = ( ip_pseudo_header_ref ) header_in;
return EOK;
// TODO IPv6
/* case AF_INET6:
if( addrlen != sizeof( struct sockaddr_in6 )) return EINVAL;
address_in6 = ( struct sockaddr_in6 * ) addr;
return EOK;
*/ default:
return EAFNOSUPPORT;
}
}
 
/** @}
*/