Looking at the logs of uml1, uml1 is always routing to uml9 via uml2. The problem here i think is to do with the asymetric links algorithms. When sending out an OGM, the node uses the TQ for its best link to the originator, not the link the OGM came in on. If the OGM from uml1 origionally from UML3 reported the TQ via that route, the TQ would very likely be lower. uml2 would then not of choosen to swap to uml1. However, uml1 reports its best route, which is via uml2. uml2 does not know this, decides to use uml1, and we have a loop.
Does this all hang together correctly? I'm i interpreting this all right...
How would you suggest fix this?
I would tend to say it is a bug in the routing selection code. UML2 switches the route because it compare thes "negative" TQ message of seqno N with a TQ of seqno N - x. I suggest the following fix:
If we receive a TQ value via a neighbor that is smaller than the previous TQ that we received via that neighbor we don't change the route to a neighbor which did not send us the same or newer seqno.
That way your scenario should not happen because uml2 would not switch. On the other hand if uml1 really has a better route uml2 would switch as soon as the packet with a new seqno via uml1 arrives. What do you think ?
I attached a patch that should do exactly that. As I'm travelling right now I'm not able to test it before next week. If you find the time to do so, please let me know about your findings. This patch is not as strict as it could be. It might be necessary to rework it as soon as the concept has been proven.
Thanks again for this thorough analysis. Let us know if you find more. :-)