summaryrefslogtreecommitdiff
path: root/sys/src/9/ip
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2022-09-18 10:40:46 +0000
committercinap_lenrek <cinap_lenrek@felloff.net>2022-09-18 10:40:46 +0000
commitada1920a0e4787d46402dcdc3e9f3ad3ddae7f0e (patch)
tree2294759dfcc2dd71a9b6c68299df4b48f3194e97 /sys/src/9/ip
parent892008af7ca37124d61f3833f800675f6aa77f6b (diff)
devip: less stupid hnputs_csum()
Diffstat (limited to 'sys/src/9/ip')
-rw-r--r--sys/src/9/ip/ipaux.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/sys/src/9/ip/ipaux.c b/sys/src/9/ip/ipaux.c
index 9f413ca0e..731176782 100644
--- a/sys/src/9/ip/ipaux.c
+++ b/sys/src/9/ip/ipaux.c
@@ -556,16 +556,17 @@ void
hnputs_csum(void *p, ushort v, uchar *pcsum)
{
ulong csum;
+ ushort o;
+ csum = nhgets(pcsum)^0xFFFF;
+ o = nhgets(p);
+ hnputs(p, v);
if(((uchar*)p - pcsum) & 1){
- hnputs_csum((uchar*)p-1, (nhgets((uchar*)p-1) & 0xFF00) | v>>8, pcsum);
- hnputs_csum((uchar*)p+1, (nhgets((uchar*)p+1) & 0x00FF) | v<<8, pcsum);
- return;
+ o = o << 8 | o >> 8;
+ v = v << 8 | v >> 8;
}
- csum = nhgets(pcsum)^0xFFFF;
- csum += nhgets(p)^0xFFFF;
+ csum += o ^ 0xFFFF;
csum += v;
- hnputs(p, v);
while(v = csum >> 16)
csum = (csum & 0xFFFF) + v;
hnputs(pcsum, csum^0xFFFF);