Date: Tue, 30 Mar 2004 12:13:58 -0500 From: Mike Tancsa <mike@sentex.net> To: freebsd-hackers@freebsd.org Subject: FAST_IPSEC bug fix Message-ID: <6.0.3.0.0.20040330120751.10bf1180@209.112.4.2>
next in thread | raw e-mail | index | archive | help
Well, its not totally a bug, but missing functionality that looks like is there but is not and is pretty important to keep lossy links functioning with IPSEC. My colleague gabor@sentex.net created the patch below that implements net.key.prefered_oldsa when using FAST_IPSEC. The discussion has come up before about this, but no action. I know sam@freebsd.org is really busy and cannot help. Is there anyone out there who could review and commit the patch below ? It works against RELENG_4 I have bcc'd the last 2 committers to touch the code in the hopes that they might have the time and inclination to review / commit ? *** /usr/src/sys/netipsec/key.c Mon Mar 29 20:11:44 2004 --- ./key.c Tue Mar 30 12:00:31 2004 *************** *** 133,138 **** --- 133,139 ---- #endif static LIST_HEAD(_spacqtree, secspacq) spacqtree; /* SP acquiring list */ + #if 0 /* search order for SAs */ static u_int saorder_state_valid[] = { SADB_SASTATE_DYING, SADB_SASTATE_MATURE, *************** *** 141,146 **** --- 142,154 ---- * for outbound processing. For inbound, This is not important. */ }; + #endif + static const u_int saorder_state_valid_prefer_old[] = { + SADB_SASTATE_DYING, SADB_SASTATE_MATURE, + }; + static const u_int saorder_state_valid_prefer_new[] = { + SADB_SASTATE_MATURE, SADB_SASTATE_DYING, + }; static u_int saorder_state_alive[] = { /* except DEAD */ SADB_SASTATE_MATURE, SADB_SASTATE_DYING, SADB_SASTATE_LARVAL *************** *** 816,821 **** --- 824,831 ---- struct secashead *sah; struct secasvar *sav; u_int stateidx, state; + const u_int *saorder_state_valid; + int arraysize; LIST_FOREACH(sah, &sahtree, chain) { if (sah->state == SADB_SASTATE_DEAD) *************** *** 828,836 **** found: /* search valid state */ for (stateidx = 0; ! stateidx < _ARRAYLEN(saorder_state_valid); stateidx++) { state = saorder_state_valid[stateidx]; --- 838,853 ---- found: + if (key_prefered_oldsa) { + saorder_state_valid = saorder_state_valid_prefer_old; + arraysize = _ARRAYLEN(saorder_state_valid_prefer_old); + } else { + saorder_state_valid = saorder_state_valid_prefer_new; + arraysize = _ARRAYLEN(saorder_state_valid_prefer_new); + } /* search valid state */ for (stateidx = 0; ! stateidx < arraysize; stateidx++) { state = saorder_state_valid[stateidx]; *************** *** 997,1008 **** --- 1014,1034 ---- struct secasvar *sav; u_int stateidx, state; int s; + const u_int *saorder_state_valid; + int arraysize; KASSERT(dst != NULL, ("key_allocsa: null dst address")); KEYDEBUG(KEYDEBUG_IPSEC_STAMP, printf("DP key_allocsa from %s:%u\n", where, tag)); + if (key_prefered_oldsa) { + saorder_state_valid = saorder_state_valid_prefer_old; + arraysize = _ARRAYLEN(saorder_state_valid_prefer_old); + } else { + saorder_state_valid = saorder_state_valid_prefer_new; + arraysize = _ARRAYLEN(saorder_state_valid_prefer_new); + } /* * searching SAD. * XXX: to be checked internal IP header somewhere. Also when *************** *** 1013,1019 **** LIST_FOREACH(sah, &sahtree, chain) { /* search valid state */ for (stateidx = 0; ! stateidx < _ARRAYLEN(saorder_state_valid); stateidx++) { state = saorder_state_valid[stateidx]; LIST_FOREACH(sav, &sah->savtree[state], chain) { --- 1039,1045 ---- LIST_FOREACH(sah, &sahtree, chain) { /* search valid state */ for (stateidx = 0; ! stateidx < arraysize; stateidx++) { state = saorder_state_valid[stateidx]; LIST_FOREACH(sav, &sah->savtree[state], chain) { -------------------------------------------------------------------- Mike Tancsa, tel +1 519 651 3400 Sentex Communications, mike@sentex.net Providing Internet since 1994 www.sentex.net Cambridge, Ontario Canada www.sentex.net/mike
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6.0.3.0.0.20040330120751.10bf1180>