Annotation of Gnu-Mach/linux/src/include/asm-i386/checksum.h, revision 1.1

1.1     ! root        1: #ifndef _I386_CHECKSUM_H
        !             2: #define _I386_CHECKSUM_H
        !             3: 
        !             4: /*
        !             5:  * computes the checksum of a memory block at buff, length len,
        !             6:  * and adds in "sum" (32-bit)
        !             7:  *
        !             8:  * returns a 32-bit number suitable for feeding into itself
        !             9:  * or csum_tcpudp_magic
        !            10:  *
        !            11:  * this function must be called with even lengths, except
        !            12:  * for the last fragment, which may be odd
        !            13:  *
        !            14:  * it's best to have buff aligned on a 32-bit boundary
        !            15:  */
        !            16: unsigned int csum_partial(const unsigned char * buff, int len, unsigned int sum);
        !            17: 
        !            18: /*
        !            19:  * the same as csum_partial, but copies from src while it
        !            20:  * checksums
        !            21:  *
        !            22:  * here even more important to align src and dst on a 32-bit (or even
        !            23:  * better 64-bit) boundary
        !            24:  */
        !            25: 
        !            26: unsigned int csum_partial_copy( const char *src, char *dst, int len, int sum);
        !            27: 
        !            28: 
        !            29: /*
        !            30:  * the same as csum_partial_copy, but copies from user space.
        !            31:  *
        !            32:  * here even more important to align src and dst on a 32-bit (or even
        !            33:  * better 64-bit) boundary
        !            34:  */
        !            35: 
        !            36: unsigned int csum_partial_copy_fromuser(const char *src, char *dst, int len, int sum);
        !            37: 
        !            38: /*
        !            39:  *     This is a version of ip_compute_csum() optimized for IP headers,
        !            40:  *     which always checksum on 4 octet boundaries.
        !            41:  *
        !            42:  *     By Jorge Cwik <[email protected]>, adapted for linux by
        !            43:  *     Arnt Gulbrandsen.
        !            44:  */
        !            45: static inline unsigned short ip_fast_csum(unsigned char * iph,
        !            46:                                          unsigned int ihl) {
        !            47:        unsigned int sum;
        !            48: 
        !            49:        __asm__ __volatile__("
        !            50:            movl (%1), %0
        !            51:            subl $4, %2
        !            52:            jbe 2f
        !            53:            addl 4(%1), %0
        !            54:            adcl 8(%1), %0
        !            55:            adcl 12(%1), %0
        !            56: 1:         adcl 16(%1), %0
        !            57:            lea 4(%1), %1
        !            58:            decl %2
        !            59:            jne 1b
        !            60:            adcl $0, %0
        !            61:            movl %0, %2
        !            62:            shrl $16, %0
        !            63:            addw %w2, %w0
        !            64:            adcl $0, %0
        !            65:            notl %0
        !            66: 2:
        !            67:            "
        !            68:        /* Since the input registers which are loaded with iph and ipl
        !            69:           are modified, we must also specify them as outputs, or gcc
        !            70:           will assume they contain their original values. */
        !            71:        : "=r" (sum), "=r" (iph), "=r" (ihl)
        !            72:        : "1" (iph), "2" (ihl));
        !            73:        return(sum);
        !            74: }
        !            75: 
        !            76: /*
        !            77:  *     Fold a partial checksum
        !            78:  */
        !            79: 
        !            80: static inline unsigned int csum_fold(unsigned int sum)
        !            81: {
        !            82:        __asm__("
        !            83:                addl %1, %0
        !            84:                adcl $0xffff, %0
        !            85:                "
        !            86:                : "=r" (sum)
        !            87:                : "r" (sum << 16), "0" (sum & 0xffff0000)
        !            88:        );
        !            89:        return (~sum) >> 16;
        !            90: }
        !            91:  
        !            92: /*
        !            93:  * computes the checksum of the TCP/UDP pseudo-header
        !            94:  * returns a 16-bit checksum, already complemented
        !            95:  */
        !            96: 
        !            97: static inline unsigned short int csum_tcpudp_magic(unsigned long saddr,
        !            98:                                                   unsigned long daddr,
        !            99:                                                   unsigned short len,
        !           100:                                                   unsigned short proto,
        !           101:                                                   unsigned int sum) {
        !           102:     __asm__("
        !           103:        addl %1, %0
        !           104:        adcl %2, %0
        !           105:        adcl %3, %0
        !           106:        adcl $0, %0
        !           107:        "
        !           108:        : "=r" (sum)
        !           109:        : "g" (daddr), "g"(saddr), "g"((ntohs(len)<<16)+proto*256), "0"(sum));
        !           110:        return csum_fold(sum);
        !           111: }
        !           112: /*
        !           113:  * this routine is used for miscellaneous IP-like checksums, mainly
        !           114:  * in icmp.c
        !           115:  */
        !           116: 
        !           117: static inline unsigned short ip_compute_csum(unsigned char * buff, int len) {
        !           118:     return csum_fold (csum_partial(buff, len, 0));
        !           119: }
        !           120: 
        !           121: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.