<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <font face="Times New Roman, Times, serif">Hi,<br>
      <br>
      There is a scenario during child SA rekeying collision where both
      peers de</font><font face="Times New Roman, Times, serif"><font
        face="Times New Roman, Times, serif">c</font>ide they have lost
      the collision. No new SA gets established, and when the old SA
      hits the hard expiration and is deleted, the application is not
      notified because the old SA is in REKEYING state.<br>
      <br>
      This happens when peer A rejects the Diffie-Hellman offered by
      peer B, yet it decides a collision winner based on nonces
      including from the failed rekey request. Meanwhile peer B decides
      the collision winner based on nonces including its re-request
      rather than the failed first request.<br>
      <br>
      There seems to be a fairly simple way to address this.  When peer
      A rejected the rekey request with INVAL_KE, it reset the old SA
      state to INSTALLED in child_rekey.c build_r(). Later child_reky.c
      collide() is used to determine whether the apparent collision
      between two child_rekey tasks is really a collision. Adding a
      check here to detect the INSTALLED state, and deleting the "other"
      rekey task in that case so no collision arbitration is done,
      allows the rekey to complete successfully. <br>
      <br>
      Are there other scenarios where this check for INSTALLED would
      create a problem?<br>
      <br>
      Regards,<br>
      Nancy<br>
      <br>
    </font>
  </body>
</html>