Rev 4707 | Rev 4711 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4707 | Rev 4708 | ||
|---|---|---|---|
| Line 231... | Line 231... | ||
| 231 | uint16_t checksum; |
231 | uint16_t checksum; |
| 232 | 232 | ||
| 233 | checksum = compact_checksum(compute_checksum( 0, data, length )); |
233 | checksum = compact_checksum(compute_checksum( 0, data, length )); |
| 234 | 234 | ||
| 235 | // flip, zero is returned as 0xFFFF (not flipped) |
235 | // flip, zero is returned as 0xFFFF (not flipped) |
| 236 | return ( ~ checksum ) ? ~ checksum : IP_HEADER_CHECKSUM_ZERO; |
236 | return ( ~ checksum ) ? ( uint16_t ) ( ~ checksum ) : IP_HEADER_CHECKSUM_ZERO; |
| 237 | } |
237 | } |
| 238 | 238 | ||
| 239 | int ip_initialize( async_client_conn_t client_connection ){ |
239 | int ip_initialize( async_client_conn_t client_connection ){ |
| 240 | ERROR_DECLARE; |
240 | ERROR_DECLARE; |
| 241 | 241 | ||
| Line 904... | Line 904... | ||
| 904 | ip_header_ref header; |
904 | ip_header_ref header; |
| 905 | ip_header_ref middle_header; |
905 | ip_header_ref middle_header; |
| 906 | ip_header_ref last_header; |
906 | ip_header_ref last_header; |
| 907 | uint8_t * src; |
907 | uint8_t * src; |
| 908 | uint8_t * dest; |
908 | uint8_t * dest; |
| 909 | int address_length; |
909 | size_t address_length; |
| - | 910 | int result; |
|
| 910 | 911 | ||
| 911 | address_length = packet_get_addr( packet, & src, & dest ); |
912 | result = packet_get_addr( packet, & src, & dest ); |
| 912 | if( address_length <= 0 ) return EINVAL; |
913 | if( result <= 0 ) return EINVAL; |
| - | 914 | address_length = ( size_t ) result; |
|
| 913 | if( packet_get_data_length( packet ) <= sizeof( ip_header_t )) return ENOMEM; |
915 | if( packet_get_data_length( packet ) <= sizeof( ip_header_t )) return ENOMEM; |
| 914 | // get header |
916 | // get header |
| 915 | header = ( ip_header_ref ) packet_get_data( packet ); |
917 | header = ( ip_header_ref ) packet_get_data( packet ); |
| 916 | if( ! header ) return EINVAL; |
918 | if( ! header ) return EINVAL; |
| 917 | // fragmentation forbidden? |
919 | // fragmentation forbidden? |
| Line 992... | Line 994... | ||
| 992 | memcpy( last, first, sizeof( ip_header_t )); |
994 | memcpy( last, first, sizeof( ip_header_t )); |
| 993 | length = sizeof( ip_header_t ); |
995 | length = sizeof( ip_header_t ); |
| 994 | next = sizeof( ip_header_t ); |
996 | next = sizeof( ip_header_t ); |
| 995 | // process all ip options |
997 | // process all ip options |
| 996 | while( next < first->ihl ){ |
998 | while( next < first->ihl ){ |
| 997 | option = ( ip_option_ref ) ((( void * ) first ) + next ); |
999 | option = ( ip_option_ref ) ((( uint8_t * ) first ) + next ); |
| 998 | // skip end or noop |
1000 | // skip end or noop |
| 999 | if(( option->type == IPOPT_END ) || ( option->type == IPOPT_NOOP )){ |
1001 | if(( option->type == IPOPT_END ) || ( option->type == IPOPT_NOOP )){ |
| 1000 | ++ next; |
1002 | ++ next; |
| 1001 | }else{ |
1003 | }else{ |
| 1002 | // copy if said so or skip |
1004 | // copy if said so or skip |
| 1003 | if( IPOPT_COPIED( option->type )){ |
1005 | if( IPOPT_COPIED( option->type )){ |
| 1004 | memcpy((( void * ) last ) + length, (( void * ) first ) + next, option->length ); |
1006 | memcpy((( uint8_t * ) last ) + length, (( uint8_t * ) first ) + next, option->length ); |
| 1005 | length += option->length; |
1007 | length += option->length; |
| 1006 | } |
1008 | } |
| 1007 | // next option |
1009 | // next option |
| 1008 | next += option->length; |
1010 | next += option->length; |
| 1009 | } |
1011 | } |
| 1010 | } |
1012 | } |
| 1011 | // align 4 byte boundary |
1013 | // align 4 byte boundary |
| 1012 | if( length % 4 ){ |
1014 | if( length % 4 ){ |
| 1013 | bzero((( void * ) last ) + length, 4 - ( length % 4 )); |
1015 | bzero((( uint8_t * ) last ) + length, 4 - ( length % 4 )); |
| 1014 | last->ihl = length / 4 + 1; |
1016 | last->ihl = length / 4 + 1; |
| 1015 | }else{ |
1017 | }else{ |
| 1016 | last->ihl = length / 4; |
1018 | last->ihl = length / 4; |
| 1017 | } |
1019 | } |
| 1018 | last->header_checksum = 0; |
1020 | last->header_checksum = 0; |