* Allocating an SA entry for an *INBOUND* or *OUTBOUND* TCP packet, signed * or should be signed by MD5 signature. * We don't use key_allocsa() for such lookups, because we don't know SPI. * Unlike ESP and AH protocols, SPI isn't transmitted in the TCP header with * signed packet. We use SADB only as storage for password. * OUT: positive: corresponding SA for given saidx found. * NULL: SA n
| 958 | * NULL: SA not found |
| 959 | */ |
| 960 | struct secasvar * |
| 961 | key_allocsa_tcpmd5(struct secasindex *saidx) |
| 962 | { |
| 963 | SAHTREE_RLOCK_TRACKER; |
| 964 | struct secashead *sah; |
| 965 | struct secasvar *sav; |
| 966 | |
| 967 | IPSEC_ASSERT(saidx->proto == IPPROTO_TCP, |
| 968 | ("unexpected security protocol %u", saidx->proto)); |
| 969 | IPSEC_ASSERT(saidx->mode == IPSEC_MODE_TCPMD5, |
| 970 | ("unexpected mode %u", saidx->mode)); |
| 971 | |
| 972 | SAHTREE_RLOCK(); |
| 973 | LIST_FOREACH(sah, SAHADDRHASH_HASH(saidx), addrhash) { |
| 974 | KEYDBG(IPSEC_DUMP, |
| 975 | printf("%s: checking SAH\n", __func__); |
| 976 | kdebug_secash(sah, " ")); |
| 977 | if (sah->saidx.proto != IPPROTO_TCP) |
| 978 | continue; |
| 979 | if (!key_sockaddrcmp(&saidx->dst.sa, &sah->saidx.dst.sa, 0) && |
| 980 | !key_sockaddrcmp(&saidx->src.sa, &sah->saidx.src.sa, 0)) |
| 981 | break; |
| 982 | } |
| 983 | if (sah != NULL) { |
| 984 | if (V_key_preferred_oldsa) |
| 985 | sav = TAILQ_LAST(&sah->savtree_alive, secasvar_queue); |
| 986 | else |
| 987 | sav = TAILQ_FIRST(&sah->savtree_alive); |
| 988 | if (sav != NULL) |
| 989 | SAV_ADDREF(sav); |
| 990 | } else |
| 991 | sav = NULL; |
| 992 | SAHTREE_RUNLOCK(); |
| 993 | |
| 994 | if (sav != NULL) { |
| 995 | KEYDBG(IPSEC_STAMP, |
| 996 | printf("%s: return SA(%p)\n", __func__, sav)); |
| 997 | KEYDBG(IPSEC_DATA, kdebug_secasv(sav)); |
| 998 | } else { |
| 999 | KEYDBG(IPSEC_STAMP, |
| 1000 | printf("%s: SA not found\n", __func__)); |
| 1001 | KEYDBG(IPSEC_DATA, kdebug_secasindex(saidx, NULL)); |
| 1002 | } |
| 1003 | return (sav); |
| 1004 | } |
| 1005 | |
| 1006 | /* |
| 1007 | * Allocating an SA entry for an *OUTBOUND* packet. |
no test coverage detected