Keith Welter writes: > A recognized (old) notify type like NO_PROPOSAL_CHOSEN may be used > as a hint to do something special like try again later, a notion the > RFC 4718 authors exploited because they didn't have the luxury of > introducing new notify types. So, sending a new notify type to a > peer that does not recognize it could be viewed as preventing the > peer from making the most informed decision.
The RFC4718 didn't give any specific instructions what to do when implementation receives those notify types. Also when telling which error to send it uses terms like: "... thus failing the request with something non-fatal such as NO_PROPOSAL_CHOSEN seems like a reasonable approach." "In both cases, NO_PROPOSAL_CHOSEN is probably fine." "... replying with NO_PROPOSAL_CHOSEN is probably reasonable:" "Our proposal is as follows: if a host receives a request to rekey the IKE_SA when it has CHILD_SAs in "half-open" state (currently being created or rekeyed), it should reply with NO_PROPOSAL_CHOSEN. If a host receives a request to create or rekey a CHILD_SA after it has started rekeying the IKE_SA, it should reply with NO_ADDITIONAL_SAS." "Our recommendation is that if a host receives a request to rekey the IKE_SA when it has CHILD_SAs in "half-closed" state (currently being closed), it should reply with NO_PROPOSAL_CHOSEN." "At this point, host B should probably reply with NO_PROPOSAL_CHOSEN, and host A should reply as usual, close the IKE_SA, and stop retransmitting req1." All these uses terms where NO_PROPOSAL_CHOSEN is given out more like and example than specific error. The summary section does not use "probably / such as / our proposal / our recommendation" anymore, it summarizes what has been said in other sections before. As the RFC4718 didn't give any instructions what to do when you receive any of those error notifications, I assumed it expected the normal non-fatal (to IKE SA) error notification processing, i.e. it really does not matter what non-fatal error notification you use, as it should cause the exchange to fail which is the only meaning for sending that error notification. That was the reason I wanted to have new notification, so we can actually define some other processing to happen when those are received. I.e. we can say "When a peer receives a TEMPORARY_FAILURE notification, it MUST NOT immediately retry the operation...". That kind of behavior cannot be specified for NO_PROPOSAL_CHOSEN and that kind of behavior is NOT specified for it. On the other hand as only behavior which is defined for NO_PROPOSAL_CHOSEN is the generic non-fatal error notification behavior, meaning the exchange failed, but nothing else, that means any new error notification will get same behavior from complient implementations. If implementation do add some extra handling for the NO_PROPOSAL_CHOSEN error notifications, that is their own decision and it is not required or specified in the standard. > > > If the minor number was changed an implementation could check the > > > minor version and send the new notify types when the minor version > > > was 1 and send the notify types recommended in RFC 4718 if the minor > > > number was 0. > > > > There is no point of supporting old RFC4718 error notifications after > > you implement IKEv2bis as new error notifications are backward > > compatible with old ones. > I think there is a point to supporting the old notifies. If you have a > deployed implementation then you have to consider patching it to at least > recognize the new notification types. This is something you can do, i.e. if you already support old NO_PROPOSAL_CHOSEN notifications and recognize them based on the current state to be caused by exchange collisions you can (and should) still do that. On the other hand new implementations does not need to do that. For them it should be enough to do special processing for TEMPORARY_FAILURE only, for all other non-fatal error notifications they can do default processing (which will still take care of the RFC4718 way of doing things, as the default processing is to make that exchange fail). > If you have an undeployed implementation in development you still > might have to interoperate with unpatched peers. Regadless what error notification you use, you WILL interoperate with unpatched peers (unless they did something against RFC4306). Note, that there are implementations out there which do not implement RFC4718 exchange collisions at all, which means you still need to make sure you handle those cases too if you really want optimal processing with all implementations out there.. > On the other hand, if ikev2bis increments the minor version number > then you may code the ikev2bis implementation to not send the new > notify types to down-level peers rather than patching already > deployed implementations. There is no need for that, as someone might have already disagreed with RFC4718 and selected some other error notifications, as RFC4718 uses text like "...something non-fatal such as..." or "is probably fine", so you shouldn't really be looking at the specific error (NO_PROPOSAL_CHOSEN) but the fact that you got any non-fatal (to IKE SA) error back when you were at state where there might be collisions. > I also think that calling the new error notifications "backwards > compatible" is misleading. If you send a new notification to a peer > that does not recognize it then the behavior may be different, > possibly worse, than if you had sent an old, recognized > notification. Not really, as RFC4306 or RFC4718 didn't give you any instructions what to do when you receive such error notifications, and those error notifications given in RFC4718 were mostly given out as examples, thus your code should work similarly regardless what error notification you get. As none of the RFC gaven any specific instructions what to do when you receive those error messages that means the new error notifications are backward compatible. Some implementations might have special behavior not specified in the RFCs which might need to be changed, but document modifications we are proposing would still be backward compatible. The reason RFC4718 selected NO_PROPOSAL_CHOSEN was not to add some special processing for it, but because it happened to be non-fatal error code which didn't really have any special meaning for it. Most of the other non-fatal error codes had some special handling attached to it (UNSUPPORTED_CRITICAL_PAYLOAD, INVALID_IKE_SPI, INVALID_MAJOR_VERSION, INVALID_MESSAGE_ID, INVALID_SPI, INVALID_KE_PAYLOAD, SINGLE_PAIR_REQUIRED, NO_ADDITIONAL_SAS, INTERNAL_ADDRESS_FAILURE, FAILED_CP_REQUIRED, INVALID_SELECTORS). The other option could have been TS_UNACCEPTABLE, but NO_PROPOSAL_CHOSEN was selected. There was no way of adding new meaning to the error notification, which is why RFC4718 didn't specify any special handling when you receive the error notification, it just assumed the default processing is ok. > The quoted RFC 4718 text suggested using a "non-fatal" notify type. > However, a new notify type if it is unrecognized by the peer > constitutes a fatal notify type. The recipient will probably not > process NO_PROPOSAL_CHOSEN and an unrecognized error-type notify the > same way. New error notifications are non-fatal just as NO_PROPOSAL_CHOSEN. Only fatal notification types are those which cause IKEv2 SA to be teared down, i.e. AUTHENTICATION_FAILED and INVALID_SYNTAX error notifications are considered fatal. All other error notifications are non-fatal, and only cause the current exchange to be considered as failed. RFC4306 (or RFC4718) didn't specify which error notifications are fatal and which are not, but we already added that text to the IKEv2bis. > Certainly an RFC 4306 compliant implementation would fail a > "request" entirely if it got an unknown error notification in the > response. However, an RFC 4306 compliant implementation might also > retry the request later with a different message ID after receiving > NO_PROPOSAL_CHOSEN whereas it almost certainly would not do such a > thing after receiving an unknown error notification. For TEMPORARY_FAILURE it should try again, for NO_PROPOSAL_CHOSEN that might not be case. If you really think that you get NO_PROPOSAL_CHOSEN only when you have mismatching policy, that means that you should only try again when your configuration has changed, or when the other ends configuration has changed. As configuration changes are not something that happens very often, it would be completely fine to retry after much longer timeout after NO_PROPOSAL_CHOSEN (for example 5 minutes). As most of the implementations do not really care about that, I think most will simply fail the exchange and they will retry when the next packet arrives that will trigger new Child SA to be created for the same policy rule. There is nothing in the documents which says you should not try again (or text which says how often you should retry). > I think this thread has been heading in the direction that > it is not necessary to increment the minor version based on the > incorrect assertion that old implementations will work just as > well when they receive the new notify types as they did before. Yes. Old implementations should work regardless which error notify they get. > Old implementations will continue to work but they may not work > *as well* when the new notify types are introduced unless the old > implementations are patched. Some old implementations may even > work worse if they receive the new notifications rather than those > originally suggested in RFC 4718 section 5.11.10. That might be case. And old implementations might have bugs processing unknown error notifications, but on the other hand old implementations might also have bugs in the processing of new minor version number. > I think there is a tangible benefit to be gained from incrementing > the minor version number. Specifically, to enable an implementation > to avoid sending the new notify types to a peer that won't recognize > them. I understand the potential risk of incrementing the minor version > but I think we ought to weigh that against the potential benefits. All of these exchange collision cases are quite rare. There are really only two of those which are bit more common and one of them is important, i.e. simultaneous IKE SA rekey, and simultaneous Child SA rekey. For both of them there is already text which says how to handle them. Also for simultaneous Child SA rekey even if it is not handled properly only thing that happens is that we have one extra Child SA, but traffic continues to flow and everything works. Only one where it is important to handle it properly is the simultaneous IKE SA rekey, as it is important to know that both ends agree on where the child SAs are moved. As I said these exchange collisions are not something you see very often (if ever) and I do not think the optimal behavior in all of those cases between RFC4718 and IKEv2 bis versions is needed that much that people would need to care about that. RFC4718 and IKEv2bis versions will interoperate and work together, there might be some extra packets going on in case the RFC4718 version do not understand new error notifications coming from the IKEv2bis version and does not delay retrying at all but would delay retrying if it would receive NO_PROPOSAL_CHOSEN. There might also be broken versions which do not retry at all if they receive any other error notification than NO_PROPOSAL_CHOSEN, but I would consider those versions broken. -- kivi...@iki.fi _______________________________________________ IPsec mailing list IPsec@ietf.org https://www.ietf.org/mailman/listinfo/ipsec