Changeset 40ffda8 in mainline
- Timestamp:
- 2011-05-28T12:15:34Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 7bf12387
- Parents:
- 55f81a39
- git-author:
- Jeff Rous <jeffrous@…> (2011-05-28 12:15:34)
- git-committer:
- Jakub Jermar <jakub@…> (2011-05-28 12:15:34)
- Location:
- uspace
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/net/il/ip_client.c
r55f81a39 r40ffda8 181 181 /* Set the header */ 182 182 header = (ip_header_t *) data; 183 header->header_length = IP_COMPUTE_HEADER_LENGTH(sizeof(ip_header_t) +184 ipopt_length);183 SET_HEADER_LENGTH(header, (IP_COMPUTE_HEADER_LENGTH(sizeof(ip_header_t) 184 + ipopt_length))); 185 185 header->ttl = (ttl ? ttl : IPDEFTTL); 186 186 header->tos = tos; … … 188 188 189 189 if (dont_fragment) 190 header->flags = IPFLAG_DONT_FRAGMENT;190 SET_HEADER_FLAGS(header, IPFLAG_DONT_FRAGMENT); 191 191 192 192 return EOK; … … 227 227 *tos = header->tos; 228 228 if (dont_fragment) 229 *dont_fragment = header->flags& IPFLAG_DONT_FRAGMENT;229 *dont_fragment = GET_HEADER_FLAGS(header) & IPFLAG_DONT_FRAGMENT; 230 230 if (ipopt_length) { 231 231 *ipopt_length = IP_HEADER_LENGTH(header) - sizeof(ip_header_t); -
uspace/lib/net/include/ip_header.h
r55f81a39 r40ffda8 64 64 */ 65 65 #define IP_FRAGMENT_OFFSET(header) \ 66 ((( (header)->fragment_offset_high<< 8) + \66 (((GET_HEADER_FRAGMENT_OFFSET_HIGH(header) << 8) + \ 67 67 (header)->fragment_offset_low) * 8U) 68 68 … … 83 83 */ 84 84 #define IP_HEADER_LENGTH(header) \ 85 ( (header)->header_length* 4U)85 (GET_HEADER_LENGTH(header) * 4U) 86 86 87 87 /** Returns the actual IP packet total length. … … 143 143 */ 144 144 struct ip_header { 145 #ifdef ARCH_IS_BIG_ENDIAN 146 uint8_t version : 4; 147 uint8_t header_length : 4; 148 #else 149 uint8_t header_length : 4; 150 uint8_t version : 4; 151 #endif 145 uint8_t vhl; /* version, header_length */ 146 147 #define GET_HEADER_VERSION(header) \ 148 (((header)->vhl & 0xf0) >> 4) 149 #define SET_HEADER_VERSION(header, version) \ 150 ((header)->vhl = \ 151 ((version & 0x0f) << 4) | ((header)->vhl & 0x0f)) 152 153 #define GET_HEADER_LENGTH(header) \ 154 ((header)->vhl & 0x0f) 155 #define SET_HEADER_LENGTH(header, length) \ 156 ((header)->vhl = \ 157 (length & 0x0f) | ((header)->vhl & 0xf0)) 152 158 153 159 uint8_t tos; … … 155 161 uint16_t identification; 156 162 157 #ifdef ARCH_IS_BIG_ENDIAN 158 uint8_t flags : 3; 159 uint8_t fragment_offset_high : 5; 160 #else 161 uint8_t fragment_offset_high : 5; 162 uint8_t flags : 3; 163 #endif 163 uint8_t ffoh; /* flags, fragment_offset_high */ 164 165 #define GET_HEADER_FLAGS(header) \ 166 (((header)->ffoh & 0xe0) >> 5) 167 #define SET_HEADER_FLAGS(header, flags) \ 168 ((header)->ffoh = \ 169 ((flags & 0x07) << 5) | ((header)->ffoh & 0x1f)) 170 171 #define GET_HEADER_FRAGMENT_OFFSET_HIGH(header) \ 172 ((header)->ffoh & 0x1f) 173 #define SET_HEADER_FRAGMENT_OFFSET_HIGH(header, fragment_offset_high) \ 174 ((header)->ffoh = \ 175 (fragment_offset_high & 0x1f) | ((header)->ffoh & 0xe0)) 164 176 165 177 uint8_t fragment_offset_low; … … 181 193 uint8_t pointer; 182 194 183 #ifdef ARCH_IS_BIG_ENDIAN 184 uint8_t overflow : 4; 185 uint8_t flags : 4; 186 #else 187 uint8_t flags : 4; 188 uint8_t overflow : 4; 189 #endif 195 uint8_t of; /* overflow, flags */ 196 197 #define GET_OPTION_OVERFLOW(option) \ 198 (((option)->of & 0xf0) >> 4) 199 #define SET_OPTION_OVERFLOW(option, overflow) \ 200 ((option)->of = \ 201 ((overflow & 0x0f) << 4) | ((option)->of & 0x0f)) 202 203 #define GET_OPTION_FLAGS(option) \ 204 ((option)->of & 0x0f) 205 #define SET_OPTION_FLAGS(option, flags) \ 206 ((option)->of = \ 207 (flags & 0x0f) | ((option)->of & 0xf0)) 208 190 209 } __attribute__ ((packed)); 191 210 -
uspace/srv/net/il/ip/ip.c
r55f81a39 r40ffda8 201 201 202 202 /* Set the destination address */ 203 switch ( header->version) {203 switch (GET_HEADER_VERSION(header)) { 204 204 case IPVERSION: 205 205 addrlen = sizeof(dest_in); … … 635 635 636 636 /* Process all IP options */ 637 while (next < first->header_length) {637 while (next < GET_HEADER_LENGTH(first)) { 638 638 option = (ip_option_t *) (((uint8_t *) first) + next); 639 639 /* Skip end or noop */ … … 656 656 if (length % 4) { 657 657 bzero(((uint8_t *) last) + length, 4 - (length % 4)); 658 last->header_length = length / 4 + 1;658 SET_HEADER_LENGTH(last, (length / 4 + 1)); 659 659 } else { 660 last->header_length = length / 4;660 SET_HEADER_LENGTH(last, (length / 4)); 661 661 } 662 662 … … 706 706 return rc; 707 707 708 header->version = IPV4;709 header->fragment_offset_high = 0;708 SET_HEADER_VERSION(header, IPV4); 709 SET_HEADER_FRAGMENT_OFFSET_HIGH(header, 0); 710 710 header->fragment_offset_low = 0; 711 711 header->header_checksum = 0; … … 735 735 memcpy(middle_header, last_header, 736 736 IP_HEADER_LENGTH(last_header)); 737 header->flags |= IPFLAG_MORE_FRAGMENTS; 737 SET_HEADER_FLAGS(header, 738 (GET_HEADER_FLAGS(header) | IPFLAG_MORE_FRAGMENTS)); 738 739 middle_header->total_length = 739 740 htons(packet_get_data_length(next)); 740 middle_header->fragment_offset_high =741 IP_COMPUTE_FRAGMENT_OFFSET_HIGH(length) ;741 SET_HEADER_FRAGMENT_OFFSET_HIGH(middle_header, 742 IP_COMPUTE_FRAGMENT_OFFSET_HIGH(length)); 742 743 middle_header->fragment_offset_low = 743 744 IP_COMPUTE_FRAGMENT_OFFSET_LOW(length); … … 768 769 middle_header->total_length = 769 770 htons(packet_get_data_length(next)); 770 middle_header->fragment_offset_high =771 IP_COMPUTE_FRAGMENT_OFFSET_HIGH(length) ;771 SET_HEADER_FRAGMENT_OFFSET_HIGH(middle_header, 772 IP_COMPUTE_FRAGMENT_OFFSET_HIGH(length)); 772 773 middle_header->fragment_offset_low = 773 774 IP_COMPUTE_FRAGMENT_OFFSET_LOW(length); … … 785 786 length += packet_get_data_length(next); 786 787 free(last_header); 787 header->flags |= IPFLAG_MORE_FRAGMENTS; 788 SET_HEADER_FLAGS(header, 789 (GET_HEADER_FLAGS(header) | IPFLAG_MORE_FRAGMENTS)); 788 790 } 789 791 … … 834 836 new_header->total_length = htons(IP_HEADER_LENGTH(new_header) + length); 835 837 offset = IP_FRAGMENT_OFFSET(header) + IP_HEADER_DATA_LENGTH(header); 836 new_header->fragment_offset_high =837 IP_COMPUTE_FRAGMENT_OFFSET_HIGH(offset) ;838 SET_HEADER_FRAGMENT_OFFSET_HIGH(new_header, 839 IP_COMPUTE_FRAGMENT_OFFSET_HIGH(offset)); 838 840 new_header->fragment_offset_low = 839 841 IP_COMPUTE_FRAGMENT_OFFSET_LOW(offset); … … 865 867 return NULL; 866 868 memcpy(middle, last, IP_HEADER_LENGTH(last)); 867 middle->flags |= IPFLAG_MORE_FRAGMENTS; 869 SET_HEADER_FLAGS(middle, 870 (GET_HEADER_FLAGS(middle) | IPFLAG_MORE_FRAGMENTS)); 868 871 return middle; 869 872 } … … 922 925 923 926 /* Fragmentation forbidden? */ 924 if( header->flags& IPFLAG_DONT_FRAGMENT)927 if(GET_HEADER_FLAGS(header) & IPFLAG_DONT_FRAGMENT) 925 928 return EPERM; 926 929 … … 958 961 959 962 /* Mark the first as fragmented */ 960 header->flags |= IPFLAG_MORE_FRAGMENTS; 963 SET_HEADER_FLAGS(header, 964 (GET_HEADER_FLAGS(header) | IPFLAG_MORE_FRAGMENTS)); 961 965 962 966 /* Create middle fragments */ … … 1319 1323 int rc; 1320 1324 1321 if (( header->flags& IPFLAG_MORE_FRAGMENTS) ||1325 if ((GET_HEADER_FLAGS(header) & IPFLAG_MORE_FRAGMENTS) || 1322 1326 IP_FRAGMENT_OFFSET(header)) { 1323 1327 // TODO fragmented … … 1325 1329 } 1326 1330 1327 switch ( header->version) {1331 switch (GET_HEADER_VERSION(header)) { 1328 1332 case IPVERSION: 1329 1333 addrlen = sizeof(src_in); … … 1447 1451 1448 1452 /* Set the destination address */ 1449 switch ( header->version) {1453 switch (GET_HEADER_VERSION(header)) { 1450 1454 case IPVERSION: 1451 1455 addrlen = sizeof(addr_in);
Note:
See TracChangeset
for help on using the changeset viewer.