staticinlineunsignedshort from64to16(unsignedlong x)
{ /* Using extract instructions is a bit more efficient
than the original shift/bitmask version. */
/* Since the bits of tmp_v.sh[3] are going to always be zero,
we don't have to bother to add that in. */
out_v.ul = (unsignedlong) tmp_v.us[0] + (unsignedlong) tmp_v.us[1]
+ (unsignedlong) tmp_v.us[2];
/* Similarly, out_v.us[2] is always zero for the final add. */ return out_v.us[0] + out_v.us[1];
}
/* Fold down to 32-bits so we don't lose in the typedef-less
network stack. */ /* 64 to 33 */
result = (result & 0xffffffff) + (result >> 32); /* 33 to 32 */
result = (result & 0xffffffff) + (result >> 32); return (__force __wsum)result;
}
EXPORT_SYMBOL(csum_tcpudp_nofold);
/* *Doa64-bitchecksumonanarbitrarymemoryarea.. * *Thisisn'tagreatroutine,butit'snot_horrible_either.The *innerloopcouldbeunrolledabitfurther,andtherearebetter *waystodothecarry,butthisisreasonable.
*/ staticinlineunsignedlong do_csum(constunsignedchar * buff, int len)
{ int odd, count; unsignedlong result = 0;
if (len <= 0) goto out;
odd = 1 & (unsignedlong) buff; if (odd) {
result = *buff << 8;
len--;
buff++;
}
count = len >> 1; /* nr of 16-bit words.. */ if (count) { if (2 & (unsignedlong) buff) {
result += *(unsignedshort *) buff;
count--;
len -= 2;
buff += 2;
}
count >>= 1; /* nr of 32-bit words.. */ if (count) { if (4 & (unsignedlong) buff) {
result += *(unsignedint *) buff;
count--;
len -= 4;
buff += 4;
}
count >>= 1; /* nr of 64-bit words.. */ if (count) { unsignedlong carry = 0; do { unsignedlong w = *(unsignedlong *) buff;
count--;
buff += 8;
result += carry;
result += w;
carry = (w > result);
} while (count);
result += carry;
result = (result & 0xffffffff) + (result >> 32);
} if (len & 4) {
result += *(unsignedint *) buff;
buff += 4;
}
} if (len & 2) {
result += *(unsignedshort *) buff;
buff += 2;
}
} if (len & 1)
result += *buff;
result = from64to16(result); if (odd)
result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);
out: return result;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.