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; |
} |
} |
|
/** @} |
*/ |