Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/il/ip/ip_client.c

    raadf01e rf1848d6  
    4848#include "ip_header.h"
    4949
    50 int ip_client_prepare_packet(packet_t packet, ip_protocol_t protocol, ip_ttl_t ttl, ip_tos_t tos, int dont_fragment, size_t ipopt_length){
    51         ip_header_ref header;
    52         uint8_t * data;
    53         size_t padding;
     50int ip_client_prepare_packet( packet_t packet, ip_protocol_t protocol, ip_ttl_t ttl, ip_tos_t tos, int dont_fragment, size_t ipopt_length ){
     51        ip_header_ref   header;
     52        uint8_t *               data;
     53        size_t                  padding;
    5454
    5555        padding =  ipopt_length % 4;
    56         if(padding){
     56        if( padding ){
    5757                padding = 4 - padding;
    5858                ipopt_length += padding;
    5959        }
    60         data = (uint8_t *) packet_prefix(packet, sizeof(ip_header_t) + padding);
    61         if(! data){
    62                 return ENOMEM;
    63         }
    64         while(padding --){
    65                 data[sizeof(ip_header_t) + padding] = IPOPT_NOOP;
    66         }
    67         header = (ip_header_ref) data;
    68         header->header_length = IP_COMPUTE_HEADER_LENGTH(sizeof(ip_header_t) + ipopt_length);
    69         header->ttl = (ttl ? ttl : IPDEFTTL); //(((ttl) <= MAXTTL) ? ttl : MAXTTL) : IPDEFTTL;
     60        data = ( uint8_t * ) packet_prefix( packet, sizeof( ip_header_t ) + padding );
     61        if( ! data ) return ENOMEM;
     62        while( padding -- ) data[ sizeof( ip_header_t ) + padding ] = IPOPT_NOOP;
     63        header = ( ip_header_ref ) data;
     64        header->header_length = IP_COMPUTE_HEADER_LENGTH( sizeof( ip_header_t ) + ipopt_length );
     65        header->ttl = ( ttl ? ttl : IPDEFTTL ); //((( ttl ) <= MAXTTL ) ? ttl : MAXTTL ) : IPDEFTTL;
    7066        header->tos = tos;
    7167        header->protocol = protocol;
    72         if(dont_fragment){
    73                 header->flags = IPFLAG_DONT_FRAGMENT;
    74         }
     68        if( dont_fragment ) header->flags = IPFLAG_DONT_FRAGMENT;
    7569        return EOK;
    7670}
    7771
    78 int ip_client_process_packet(packet_t packet, ip_protocol_t * protocol, ip_ttl_t * ttl, ip_tos_t * tos, int * dont_fragment, size_t * ipopt_length){
    79         ip_header_ref header;
     72int ip_client_process_packet( packet_t packet, ip_protocol_t * protocol, ip_ttl_t * ttl, ip_tos_t * tos, int * dont_fragment, size_t * ipopt_length ){
     73        ip_header_ref   header;
    8074
    81         header = (ip_header_ref) packet_get_data(packet);
    82         if((! header)
    83                 || (packet_get_data_length(packet) < sizeof(ip_header_t))){
     75        header = ( ip_header_ref ) packet_get_data( packet );
     76        if(( ! header )
     77        || ( packet_get_data_length( packet ) < sizeof( ip_header_t ))){
    8478                return ENOMEM;
    8579        }
    86         if(protocol){
    87                 *protocol = header->protocol;
    88         }
    89         if(ttl){
    90                 *ttl = header->ttl;
    91         }
    92         if(tos){
    93                 *tos = header->tos;
    94         }
    95         if(dont_fragment){
    96                 *dont_fragment = header->flags &IPFLAG_DONT_FRAGMENT;
    97         }
    98         if(ipopt_length){
    99                 *ipopt_length = IP_HEADER_LENGTH(header) - sizeof(ip_header_t);
    100                 return sizeof(ip_header_t);
     80        if( protocol ) * protocol = header->protocol;
     81        if( ttl ) * ttl = header->ttl;
     82        if( tos ) * tos = header->tos;
     83        if( dont_fragment ) * dont_fragment = header->flags & IPFLAG_DONT_FRAGMENT;
     84        if( ipopt_length ){
     85                * ipopt_length = IP_HEADER_LENGTH( header ) - sizeof( ip_header_t );
     86                return sizeof( ip_header_t );
    10187        }else{
    102                 return IP_HEADER_LENGTH(header);
     88                return IP_HEADER_LENGTH( header );
    10389        }
    10490}
    10591
    106 size_t ip_client_header_length(packet_t packet){
    107         ip_header_ref header;
     92size_t ip_client_header_length( packet_t packet ){
     93        ip_header_ref   header;
    10894
    109         header = (ip_header_ref) packet_get_data(packet);
    110         if((! header)
    111                 || (packet_get_data_length(packet) < sizeof(ip_header_t))){
     95        header = ( ip_header_ref ) packet_get_data( packet );
     96        if(( ! header )
     97        || ( packet_get_data_length( packet ) < sizeof( ip_header_t ))){
    11298                return 0;
    11399        }
    114         return IP_HEADER_LENGTH(header);
     100        return IP_HEADER_LENGTH( header );
    115101}
    116102
    117 int ip_client_set_pseudo_header_data_length(ip_pseudo_header_ref header, size_t headerlen, size_t data_length){
    118         ipv4_pseudo_header_ref header_in;
     103int ip_client_set_pseudo_header_data_length( ip_pseudo_header_ref header, size_t headerlen, size_t data_length ){
     104        ipv4_pseudo_header_ref  header_in;
    119105
    120         if(! header){
    121                 return EBADMEM;
    122         }
    123         if(headerlen == sizeof(ipv4_pseudo_header_t)){
    124                 header_in = (ipv4_pseudo_header_ref) header;
    125                 header_in->data_length = htons(data_length);
     106        if( ! header ) return EBADMEM;
     107        if( headerlen == sizeof( ipv4_pseudo_header_t )){
     108                header_in = ( ipv4_pseudo_header_ref ) header;
     109                header_in->data_length = htons( data_length );
    126110                return EOK;
    127111        }else{
     
    130114}
    131115
    132 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){
    133         ipv4_pseudo_header_ref header_in;
    134         struct sockaddr_in * address_in;
     116int 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 ){
     117        ipv4_pseudo_header_ref  header_in;
     118        struct sockaddr_in *    address_in;
    135119
    136         if(!(header && headerlen)){
    137                 return EBADMEM;
    138         }
    139         if(!(src && dest && (srclen > 0) && ((size_t) srclen >= sizeof(struct sockaddr)) && (srclen == destlen) && (src->sa_family == dest->sa_family))){
    140                 return EINVAL;
    141         }
    142         switch(src->sa_family){
     120        if( !( header && headerlen )) return EBADMEM;
     121        if( !( src && dest && ( srclen > 0 ) && (( size_t ) srclen >= sizeof( struct sockaddr )) && ( srclen == destlen ) && ( src->sa_family == dest->sa_family ))) return EINVAL;
     122        switch( src->sa_family ){
    143123                case AF_INET:
    144                         if(srclen != sizeof(struct sockaddr_in)){
    145                                 return EINVAL;
    146                         }
    147                         *headerlen = sizeof(*header_in);
    148                         header_in = (ipv4_pseudo_header_ref) malloc(*headerlen);
    149                         if(! header_in){
    150                                 return ENOMEM;
    151                         }
    152                         bzero(header_in, * headerlen);
    153                         address_in = (struct sockaddr_in *) dest;
     124                        if( srclen != sizeof( struct sockaddr_in )) return EINVAL;
     125                        * headerlen = sizeof( * header_in );
     126                        header_in = ( ipv4_pseudo_header_ref ) malloc( * headerlen );
     127                        if( ! header_in ) return ENOMEM;
     128                        bzero( header_in, * headerlen );
     129                        address_in = ( struct sockaddr_in * ) dest;
    154130                        header_in->destination_address = address_in->sin_addr.s_addr;
    155                         address_in = (struct sockaddr_in *) src;
     131                        address_in = ( struct sockaddr_in * ) src;
    156132                        header_in->source_address = address_in->sin_addr.s_addr;
    157133                        header_in->protocol = protocol;
    158                         header_in->data_length = htons(data_length);
    159                         *header = (ip_pseudo_header_ref) header_in;
     134                        header_in->data_length = htons( data_length );
     135                        * header = ( ip_pseudo_header_ref ) header_in;
    160136                        return EOK;
    161137                // TODO IPv6
    162138/*              case AF_INET6:
    163                         if(addrlen != sizeof(struct sockaddr_in6)){
    164                                 return EINVAL;
    165                         }
    166                         address_in6 = (struct sockaddr_in6 *) addr;
     139                        if( addrlen != sizeof( struct sockaddr_in6 )) return EINVAL;
     140                        address_in6 = ( struct sockaddr_in6 * ) addr;
    167141                        return EOK;
    168142*/              default:
Note: See TracChangeset for help on using the changeset viewer.