Dave Johnson
1d464c26b5
[MIPS] Fix wrong checksum for split TCP packets on 64-bit MIPS
...
I've traced down an off-by-one TCP checksum calculation error under
the following conditions:
1) The TCP code needs to split a full-sized packet due to a reduced
MSS (typically due to the addition of TCP options mid-stream like
SACK).
_AND_
2) The checksum of the 2nd fragment is larger than the checksum of the
original packet. After subtraction this results in a checksum for
the 1st fragment with bits 16..31 set to 1. (this is ok)
_AND_
3) The checksum of the 1st fragment's TCP header plus the previously
32bit checksum of the 1st fragment DOES NOT cause a 32bit overflow
when added together. This results in a checksum of the TCP header
plus TCP data that still has the upper 16 bits as 1's.
_THEN_
4) The TCP+data checksum is added to the checksum of the pseudo IP
header with csum_tcpudp_nofold() incorrectly (the bug).
The problem is the checksum of the TCP+data is passed to
csum_tcpudp_nofold() as an 32bit unsigned value, however the assembly
code acts on it as if it is a 64bit unsigned value.
This causes an incorrect 32->64bit extension if the sum has bit 31
set. The resulting checksum is off by one.
This problems is data and TCP header dependent due to #2 and #3
above so it doesn't occur on every TCP packet split.
Signed-off-by: Dave Johnson <djohnson+linux-mips@sw.starentnetworks.com>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
2007-04-20 14:58:37 +01:00
..
2006-04-26 12:56:16 +01:00
2007-02-06 16:53:09 +00:00
2007-02-09 16:23:16 +00:00
2007-02-06 16:53:08 +00:00
2006-04-26 12:56:16 +01:00
2007-03-04 19:02:34 +00:00
2007-03-04 19:02:37 +00:00
2007-03-04 19:02:31 +00:00
2007-03-17 21:57:24 +01:00
2007-02-06 16:53:08 +00:00
2006-06-23 07:42:56 -07:00
2006-07-10 13:24:25 -07:00
2007-02-06 16:53:08 +00:00
2006-10-01 23:16:59 +01:00
2006-09-27 13:37:57 +01:00
2007-03-04 19:02:39 +00:00
2006-06-20 15:10:08 -07:00
2007-03-17 01:03:24 +00:00
2007-03-17 01:03:24 +00:00
2006-07-13 21:26:04 +01:00
2007-02-13 22:40:50 +00:00
2007-03-04 19:02:34 +00:00
2007-03-04 19:02:31 +00:00
2006-07-13 21:26:04 +01:00
2006-04-26 12:56:16 +01:00
2006-10-04 18:06:15 +01:00
2006-09-27 13:37:49 +01:00
2007-03-04 19:02:38 +00:00
2006-07-13 21:26:04 +01:00
2006-07-13 21:26:04 +01:00
2007-02-06 16:53:09 +00:00
2006-06-19 17:39:18 +01:00
2006-07-13 21:26:04 +01:00
2007-03-04 19:02:37 +00:00
2006-06-19 17:39:24 +01:00
2007-02-06 16:53:08 +00:00
2007-04-20 14:58:37 +01:00
2006-12-12 01:46:24 +00:00
2006-04-26 12:56:16 +01:00
2006-10-03 23:01:26 +02:00
2007-02-06 16:53:09 +00:00
2006-04-26 12:56:16 +01:00
2007-02-18 21:31:35 +00:00
2006-11-30 01:14:43 +00:00
2006-11-01 17:46:09 +00:00
2006-06-19 17:39:13 +01:00
2006-06-19 17:39:13 +01:00
2006-06-29 21:10:49 +01:00
2007-03-17 01:03:29 +00:00
2005-09-07 16:57:21 -07:00
2006-12-04 22:43:14 +00:00
2006-04-26 12:56:16 +01:00
2007-03-17 01:03:29 +00:00
2007-02-06 16:53:09 +00:00
2005-10-29 19:30:34 +01:00
2007-04-20 14:58:37 +01:00
2006-04-26 12:56:16 +01:00
2006-04-26 12:56:16 +01:00
2006-04-26 12:56:16 +01:00
2007-03-24 17:01:49 +00:00
2007-04-20 14:58:37 +01:00
2007-02-18 21:31:35 +00:00
2006-12-12 01:46:24 +00:00
2007-03-17 01:03:26 +00:00
2007-03-17 01:03:26 +00:00
2006-07-13 21:26:04 +01:00
2006-04-26 12:56:16 +01:00
2007-03-24 17:01:49 +00:00
2006-12-01 14:52:01 -08:00
2006-10-31 20:13:23 +00:00
2007-02-13 22:40:50 +00:00
2007-03-08 01:10:30 +00:00
2007-02-18 21:31:37 +00:00
2006-01-10 13:39:04 +00:00
2006-04-26 12:56:16 +01:00
2005-11-07 18:05:40 +00:00
2006-09-27 13:37:48 +01:00
2006-10-21 23:17:35 +01:00
2005-09-05 00:06:07 -07:00
2006-06-19 17:39:18 +01:00
2007-04-20 14:58:37 +01:00
2006-12-07 08:39:21 -08:00
2006-11-30 01:14:43 +00:00
2007-03-24 17:01:49 +00:00
2006-12-07 08:39:21 -08:00
2006-06-29 10:26:23 -07:00
2007-02-06 16:53:09 +00:00
2006-07-13 21:26:08 +01:00
2005-10-29 19:30:57 +01:00
2007-02-18 21:31:34 +00:00
2007-02-26 23:06:06 +00:00
2007-02-06 16:53:08 +00:00
2006-10-08 02:38:28 +01:00
2007-02-06 16:53:09 +00:00
2007-03-29 23:46:36 +01:00
2006-04-26 12:56:16 +01:00
2006-09-27 13:37:56 +01:00
2006-11-30 01:14:44 +00:00
2006-04-26 12:56:16 +01:00
2006-04-19 04:14:27 +02:00
2006-03-24 07:33:25 -08:00
2006-04-26 12:56:16 +01:00
2007-03-29 23:46:35 +01:00
2006-03-28 09:16:00 -08:00
2007-03-07 00:07:15 +00:00
2007-02-06 16:53:24 +00:00
2006-11-30 01:14:45 +00:00
2007-02-11 10:51:17 -08:00
2006-09-27 13:37:49 +01:00
2006-06-23 07:42:52 -07:00
2006-04-26 12:56:16 +01:00
2006-10-08 02:38:28 +01:00
2006-04-26 12:56:16 +01:00
2006-01-09 15:59:19 -08:00
2006-04-26 12:56:16 +01:00
2007-02-06 16:53:13 +00:00
2006-06-19 17:39:27 +01:00
2007-02-18 21:31:34 +00:00
2007-02-18 21:31:36 +00:00
2006-12-06 20:16:08 +00:00
2007-03-24 17:01:49 +00:00
2006-04-26 12:56:16 +01:00
2007-03-24 17:01:49 +00:00
2006-03-25 08:22:56 -08:00
2006-04-26 12:56:16 +01:00
2006-06-20 15:10:08 -07:00
2007-02-22 00:50:44 +00:00
2006-06-19 17:39:19 +01:00
2006-04-19 04:14:28 +02:00
2006-02-07 13:30:22 +00:00
2006-04-26 12:56:16 +01:00
2006-04-26 12:56:16 +01:00
2006-06-19 17:39:26 +01:00
2006-04-19 04:14:22 +02:00
2007-03-17 01:03:29 +00:00
2007-02-06 16:53:15 +00:00
2005-10-30 17:37:27 -08:00
2006-10-03 17:59:17 +01:00
2006-12-07 08:39:46 -08:00
2007-03-04 19:02:37 +00:00
2007-03-24 17:01:49 +00:00
2007-02-22 00:50:44 +00:00
2006-04-26 12:56:16 +01:00
2007-02-18 21:31:35 +00:00
2006-04-26 12:56:16 +01:00
2006-06-20 15:10:08 -07:00
2007-03-29 23:46:36 +01:00
2006-04-19 04:14:28 +02:00
2007-03-07 00:07:16 +00:00
2007-02-26 23:06:06 +00:00
2006-06-29 16:58:06 -07:00
2006-06-06 00:15:20 +01:00
2005-09-10 10:06:21 -07:00
2007-03-07 00:07:17 +00:00
2007-02-22 00:50:44 +00:00
2006-10-01 23:16:59 +01:00
2005-09-05 00:06:07 -07:00
2006-04-26 12:56:16 +01:00
2007-03-17 01:03:29 +00:00
2006-12-08 08:28:56 -08:00
2007-02-11 10:51:26 -08:00
2007-04-20 14:58:37 +01:00
2006-11-30 01:14:49 +00:00
2006-09-27 13:37:40 +01:00
2005-09-05 00:06:07 -07:00
2006-04-26 12:56:16 +01:00
2005-10-29 19:31:53 +01:00
2006-12-04 19:41:15 -08:00
2007-03-07 00:07:17 +00:00
2007-03-07 00:07:18 +00:00
2006-09-27 13:37:40 +01:00
2006-06-22 15:05:58 -07:00
2006-04-19 04:14:27 +02:00
2006-12-09 01:03:58 +00:00
2006-04-26 12:56:16 +01:00
2005-09-05 00:06:07 -07:00