Changes in uspace/srv/net/il/ip/ip_client.c [f1848d6:aadf01e] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/il/ip/ip_client.c
rf1848d6 raadf01e 48 48 #include "ip_header.h" 49 49 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 52 uint8_t * 53 size_t 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; 54 54 55 55 padding = ipopt_length % 4; 56 if( padding){56 if(padding){ 57 57 padding = 4 - padding; 58 58 ipopt_length += padding; 59 59 } 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; 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; 66 70 header->tos = tos; 67 71 header->protocol = protocol; 68 if( dont_fragment ) header->flags = IPFLAG_DONT_FRAGMENT; 72 if(dont_fragment){ 73 header->flags = IPFLAG_DONT_FRAGMENT; 74 } 69 75 return EOK; 70 76 } 71 77 72 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){73 ip_header_ref 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; 74 80 75 header = ( ip_header_ref ) packet_get_data( packet);76 if(( ! header)77 || ( packet_get_data_length( packet ) < sizeof( ip_header_t))){81 header = (ip_header_ref) packet_get_data(packet); 82 if((! header) 83 || (packet_get_data_length(packet) < sizeof(ip_header_t))){ 78 84 return ENOMEM; 79 85 } 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 ); 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); 87 101 }else{ 88 return IP_HEADER_LENGTH( header);102 return IP_HEADER_LENGTH(header); 89 103 } 90 104 } 91 105 92 size_t ip_client_header_length( packet_t packet){93 ip_header_ref 106 size_t ip_client_header_length(packet_t packet){ 107 ip_header_ref header; 94 108 95 header = ( ip_header_ref ) packet_get_data( packet);96 if(( ! header)97 || ( packet_get_data_length( packet ) < sizeof( ip_header_t))){109 header = (ip_header_ref) packet_get_data(packet); 110 if((! header) 111 || (packet_get_data_length(packet) < sizeof(ip_header_t))){ 98 112 return 0; 99 113 } 100 return IP_HEADER_LENGTH( header);114 return IP_HEADER_LENGTH(header); 101 115 } 102 116 103 int ip_client_set_pseudo_header_data_length( ip_pseudo_header_ref header, size_t headerlen, size_t data_length){104 ipv4_pseudo_header_ref 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; 105 119 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 ); 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); 110 126 return EOK; 111 127 }else{ … … 114 130 } 115 131 116 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){117 ipv4_pseudo_header_ref 118 struct sockaddr_in * 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; 119 135 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 ){ 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){ 123 143 case AF_INET: 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; 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; 130 154 header_in->destination_address = address_in->sin_addr.s_addr; 131 address_in = ( struct sockaddr_in *) src;155 address_in = (struct sockaddr_in *) src; 132 156 header_in->source_address = address_in->sin_addr.s_addr; 133 157 header_in->protocol = protocol; 134 header_in->data_length = htons( data_length);135 * header = ( ip_pseudo_header_ref) header_in;158 header_in->data_length = htons(data_length); 159 *header = (ip_pseudo_header_ref) header_in; 136 160 return EOK; 137 161 // TODO IPv6 138 162 /* case AF_INET6: 139 if( addrlen != sizeof( struct sockaddr_in6 )) return EINVAL; 140 address_in6 = ( struct sockaddr_in6 * ) addr; 163 if(addrlen != sizeof(struct sockaddr_in6)){ 164 return EINVAL; 165 } 166 address_in6 = (struct sockaddr_in6 *) addr; 141 167 return EOK; 142 168 */ default:
Note:
See TracChangeset
for help on using the changeset viewer.