A while back I reported that I sometimes saw double and triple SAs being created. The patch to check for protocol when deleting larval SA removed one obstacle in that I no longer see triple SAs. Now, once in a while double SAs. I think I have figured out the second obstacle.
The initiator installs his SAs into the kernel before the responder. As soon as they are installed, the blocked packet (which started the ACQUIRE) is sent. By this time the responder has installed his inbound SA(s) and so the newly arrived ipsec packet can be processed. In the case of tcp connections and a ping, a response may be warranted, and thus an outgoing packet results. >From what I can tell of the log file below, sometimes, this might happen before the responder has completed installing the outbound SAs. In the log file, the outbound AH has been added, but not the outbound ESP, which is the one the outgoing packet looks for first. Thus resulting in a second acquire. I think this becomes more problematic when using both AH AND ESP, rather than just using ESP with authentication. With the latter, only one SA needed thus reducing the latency in installing the SAs before incoming packet arrives. So far, the only solution I can think of besides mandating all userspace key daemons do SA maintenance is to perhaps add larval SAs for both directions when adding the SPI. Currently, responder does GETSPI for one way and initiator for opposite. When GETSPI is called, larval SA is created containing the SPI, but it is only for one direction. Perhaps we can add a larval SA (no SPI) for opposite direction to act as a placeholder indicating ACQUIRE occurring, since SAs are created for both directions during an ACQUIRE. The initiator may have larval SA from GETSPI and larval SA from the ACQUIRE depending that GETSPI is in opposite direction of ACQUIRE. Calling __find_acq_core() should ensure we don't create duplicate larval SAs. Also, should IKE negotiations return error, larval SAs should expire. They also should be removed when we do the xfrm_state_add() and xfrm_state_update() to add the new SAs. If this is not a good idea or there is a better way to do this, please let me know. I wanted to ask before coding and testing in case there is a better solution and I won't have wasted time. Regards, Joy mylogfile (it has been cut and pasted, so irrelevant sections left out) 2007-03-20 13:39:04: DEBUG: pfkey UPDATE succeeded: AH/Transport x.x.x.210[0]->x.x.x.55[0] spi=203125341(0xc1b725d) 2007-03-20 13:39:04: INFO: IPsec-SA established: AH/Transport x.x.x.210[0]->x.x.x.55[0] spi=203125341(0xc1b725d) 2007-03-20 13:39:04: DEBUG: pfkey UPDATE succeeded: ESP/Transport x.x.x.210[0]->x.x.x.55[0] spi=157349023(0x960f49f) 2007-03-20 13:39:04: INFO: IPsec-SA established: ESP/Transport x.x.x.210[0]->x.x.x.55[0] spi=157349023(0x960f49f) 2007-03-20 13:39:04: DEBUG: === 2007-03-20 13:39:04: DEBUG: get pfkey ADD message 2007-03-20 13:39:04: INFO: IPsec-SA established: AH/Transport x.x.x.55[0]->x.x.x.x.210[0] spi=196161037(0xbb12e0d) 2007-03-20 13:39:04: DEBUG: === 2007-03-20 13:39:04: DEBUG: get pfkey ACQUIRE message 2007-03-20 13:39:04: DEBUG: call pfkey_send_getspi 2007-03-20 13:39:04: DEBUG: pfkey GETSPI sent: AH/Transport x.x.x.210[0]->x.x.x.55[0] 2007-03-20 13:39:04: DEBUG: call pfkey_send_getspi 2007-03-20 13:39:04: DEBUG: pfkey GETSPI sent: ESP/Transport x.x.x.210[0]->x.x.x.55[0] 2007-03-20 13:39:04: DEBUG: pfkey getspi sent. 2007-03-20 13:39:04: DEBUG: get pfkey ADD message 2007-03-20 13:39:04: INFO: IPsec-SA established: ESP/Transport x.x.x.55[0]->x.x.x.210[0] spi=241180149(0xe601df5) - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html