Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/net/generic/net_checksum.c

    r8d601db r849ed54  
    2727 */
    2828
    29 /** @addtogroup libnet
    30  * @{
     29/** @addtogroup net
     30 *  @{
    3131 */
    3232
    3333/** @file
    34  * General CRC and checksum computation implementation.
     34 *  General CRC and checksum computation implementation.
    3535 */
    3636
     
    3939#include <net_checksum.h>
    4040
    41 /** Big-endian encoding CRC divider. */
    42 #define CRC_DIVIDER_BE  0x04c11db7
     41/** Big-endian encoding CRC divider.
     42 */
     43#define CRC_DIVIDER_BE  0x04C11DB7
    4344
    44 /** Little-endian encoding CRC divider. */
    45 #define CRC_DIVIDER_LE  0xedb88320
     45/** Little-endian encoding CRC divider.
     46 */
     47#define CRC_DIVIDER_LE  0xEDB88320
    4648
    47 /** Compacts the computed checksum to the 16 bit number adding the carries.
    48  *
    49  * @param[in] sum       Computed checksum.
    50  * @returns             Compacted computed checksum to the 16 bits.
    51  */
    52 uint16_t compact_checksum(uint32_t sum)
    53 {
     49uint16_t compact_checksum(uint32_t sum){
    5450        // shorten to the 16 bits
    55         while (sum >> 16)
    56                 sum = (sum & 0xffff) + (sum >> 16);
     51        while(sum >> 16){
     52                sum = (sum &0xFFFF) + (sum >> 16);
     53        }
    5754
    5855        return (uint16_t) sum;
    5956}
    6057
    61 /** Computes sum of the 2 byte fields.
    62  *
    63  * Padds one zero (0) byte if odd.
    64  *
    65  * @param[in] seed      Initial value. Often used as 0 or ~0.
    66  * @param[in] data      Pointer to the beginning of data to process.
    67  * @param[in] length    Length of the data in bytes.
    68  * @returns             The computed checksum of the length bytes of the data.
    69  */
    70 uint32_t compute_checksum(uint32_t seed, uint8_t *data, size_t length)
    71 {
     58uint32_t compute_checksum(uint32_t seed, uint8_t * data, size_t length){
    7259        size_t index;
    7360
    7461        // sum all the 16 bit fields
    75         for (index = 0; index + 1 < length; index += 2)
     62        for(index = 0; index + 1 < length; index += 2){
    7663                seed += (data[index] << 8) + data[index + 1];
     64        }
    7765
    7866        // last odd byte with zero padding
    79         if (index + 1 == length)
     67        if(index + 1 == length){
    8068                seed += data[index] << 8;
     69        }
    8170
    8271        return seed;
    8372}
    8473
    85 /** Computes CRC32 value in the big-endian environment.
    86  *
    87  * @param[in] seed      Initial value. Often used as 0 or ~0.
    88  * @param[in] data      Pointer to the beginning of data to process.
    89  * @param[in] length    Length of the data in bits.
    90  * @returns             The computed CRC32 of the length bits of the data.
    91  */
    92 uint32_t compute_crc32_be(uint32_t seed, uint8_t * data, size_t length)
    93 {
     74uint32_t compute_crc32_be(uint32_t seed, uint8_t * data, size_t length){
    9475        size_t index;
    9576
    9677        // process full bytes
    97         while (length >= 8) {
     78        while(length >= 8){
    9879                // add the data
    9980                seed ^= (*data) << 24;
    100                
    10181                // for each added bit
    102                 for (index = 0; index < 8; ++index) {
     82                for(index = 0; index < 8; ++ index){
    10383                        // if the first bit is set
    104                         if (seed & 0x80000000) {
     84                        if(seed &0x80000000){
    10585                                // shift and divide the checksum
    10686                                seed = (seed << 1) ^ ((uint32_t) CRC_DIVIDER_BE);
    107                         } else {
     87                        }else{
    10888                                // shift otherwise
    10989                                seed <<= 1;
    11090                        }
    11191                }
    112                
    11392                // move to the next byte
    114                 ++data;
     93                ++ data;
    11594                length -= 8;
    11695        }
    11796
    11897        // process the odd bits
    119         if (length > 0) {
     98        if(length > 0){
    12099                // add the data with zero padding
    121                 seed ^= ((*data) & (0xff << (8 - length))) << 24;
    122                
     100                seed ^= ((*data) &(0xFF << (8 - length))) << 24;
    123101                // for each added bit
    124                 for (index = 0; index < length; ++index) {
     102                for(index = 0; index < length; ++ index){
    125103                        // if the first bit is set
    126                         if (seed & 0x80000000) {
     104                        if(seed &0x80000000){
    127105                                // shift and divide the checksum
    128106                                seed = (seed << 1) ^ ((uint32_t) CRC_DIVIDER_BE);
    129                         } else {
     107                        }else{
    130108                                // shift otherwise
    131109                                seed <<= 1;
     
    137115}
    138116
    139 /** Computes CRC32 value in the little-endian environment.
    140  *
    141  * @param[in] seed      Initial value. Often used as 0 or ~0.
    142  * @param[in] data      Pointer to the beginning of data to process.
    143  * @param[in] length    Length of the data in bits.
    144  * @returns             The computed CRC32 of the length bits of the data.
    145  */
    146 uint32_t compute_crc32_le(uint32_t seed, uint8_t * data, size_t length)
    147 {
     117uint32_t compute_crc32_le(uint32_t seed, uint8_t * data, size_t length){
    148118        size_t index;
    149119
    150120        // process full bytes
    151         while (length >= 8) {
     121        while(length >= 8){
    152122                // add the data
    153123                seed ^= (*data);
    154                
    155124                // for each added bit
    156                 for (index = 0; index < 8; ++index) {
     125                for(index = 0; index < 8; ++ index){
    157126                        // if the last bit is set
    158                         if (seed & 1) {
     127                        if(seed &1){
    159128                                // shift and divide the checksum
    160129                                seed = (seed >> 1) ^ ((uint32_t) CRC_DIVIDER_LE);
    161                         } else {
     130                        }else{
    162131                                // shift otherwise
    163132                                seed >>= 1;
    164133                        }
    165134                }
    166                
    167135                // move to the next byte
    168                 ++data;
     136                ++ data;
    169137                length -= 8;
    170138        }
    171139
    172140        // process the odd bits
    173         if (length > 0) {
     141        if(length > 0){
    174142                // add the data with zero padding
    175143                seed ^= (*data) >> (8 - length);
    176                
    177                 for (index = 0; index < length; ++index) {
     144                for(index = 0; index < length; ++ index){
    178145                        // if the last bit is set
    179                         if (seed & 1) {
     146                        if(seed &1){
    180147                                // shift and divide the checksum
    181148                                seed = (seed >> 1) ^ ((uint32_t) CRC_DIVIDER_LE);
    182                         } else {
     149                        }else{
    183150                                // shift otherwise
    184151                                seed >>= 1;
     
    190157}
    191158
    192 /** Returns or flips the checksum if zero.
    193  *
    194  * @param[in] checksum  The computed checksum.
    195  * @returns             The internet protocol header checksum.
    196  * @returns             0xFFFF if the computed checksum is zero.
    197  */
    198 uint16_t flip_checksum(uint16_t checksum)
    199 {
     159uint16_t flip_checksum(uint16_t checksum){
    200160        // flip, zero is returned as 0xFFFF (not flipped)
    201         checksum = ~checksum;
     161        checksum = ~ checksum;
    202162        return checksum ? checksum : IP_CHECKSUM_ZERO;
    203163}
    204164
    205 /** Computes the ip header checksum.
    206  *
    207  * To compute the checksum of a new packet, the checksum header field must be
    208  * zero. To check the checksum of a received packet, the checksum may be left
    209  * set. Zero will be returned in this case if valid.
    210  *
    211  * @param[in] data      The header data.
    212  * @param[in] length    The header length in bytes.
    213  * @returns             The internet protocol header checksum.
    214  * @returns             0xFFFF if the computed checksum is zero.
    215  */
    216 uint16_t ip_checksum(uint8_t *data, size_t length)
    217 {
     165uint16_t ip_checksum(uint8_t * data, size_t length){
    218166        // compute, compact and flip the data checksum
    219         return flip_checksum(compact_checksum(compute_checksum(0, data,
    220             length)));
     167        return flip_checksum(compact_checksum(compute_checksum(0, data, length)));
    221168}
    222169
Note: See TracChangeset for help on using the changeset viewer.