lq_packet: change link status ordering in hello messages
authorFerry Huberts <ferry.huberts@pelagic.nl>
Fri, 20 Jan 2017 12:15:56 +0000 (13:15 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Fri, 20 Jan 2017 12:33:56 +0000 (13:33 +0100)
commit2f386136b0e93f59c89d78f3c52d3d515636fbc9
tree7ad1fe8b959a372a2a234a9c6920b957ee395b3a
parent822c9268c88aa7ecc609ac240aa5e6739750c450
lq_packet: change link status ordering in hello messages

A while ago we noticed that neighbours of nodes with multiple interfaces
on the same medium report infinite costs on their links to those nodes.

This problem is 100% reproducible, and was traced down to
commit 3d2fd73a5528a9c7cdccd088f2dcca80b37e66b9
Author: Henning Rogge <henning.rogge@fkie.fraunhofer.de>
Date:   Mon Mar 31 11:18:30 2014 +0200

    Fix processing error for fragmented hellos

Below is the setup in which we noticed the problem.

       wlan0                                                 wlan0
       172.31.175.97/16                           172.31.175.61/16
    (((*))) ------------------------------------------------- (((*)))
       |                                                         |
       |                                                         |
       |                                                         |
   ____|___   172.29.175.97/15   ________  172.29.175.61/15  ____|____
  |         |-eth1.2580---------|        |--------eth1.2580-|         |
  | Node 97 |                   | Switch |                  | Node 61 |
  |_________|-eth2.2580---------|________|                  |_________|
              172.28.175.97/15

In this setup node 97 will report normal link costs for its (wired) links
to node 61 (see the first table below), while node 61 will report infinite
link costs for both its (wired) links to node 97 (see the second table
below).

  Table: Links (node 97)
  Local IP       Remote IP       Hyst.   LQ      NLQ     Cost
  172.29.175.97  172.29.175.61   0.000   1.000   1.000   0.100
  172.28.175.97  172.29.175.61   0.000   1.000   1.000   0.100
  172.31.175.97  172.31.175.61   0.000   1.000   1.000   1.000

  Table: Links (node 61)
  Local IP       Remote IP       Hyst.   LQ      NLQ     Cost
  172.29.175.61  172.29.175.97   0.000   1.000   0.000   INFINITE
  172.29.175.61  172.28.175.97   0.000   1.000   0.000   INFINITE
  172.31.175.61  172.31.175.97   0.000   1.000   1.000   1.000

Checking the HELLO messages that are received on node 61 from node 97,
we see the following:

  [node 61] # tcpdump -vni eth1.2580 udp port 698
  tcpdump: listening on eth1.2580, link-type EN10MB (Ethernet), capture size 262144 bytes
  06:21:23.528204 IP (tos 0xc0, ttl 1, id 42455, offset 0, flags [DF], proto UDP (17), length 80)
      172.28.175.97.698 > 255.255.255.255.698: OLSRv4, seq 0xf7c0, length 52
     Hello-LQ Message (0xc9), originator 172.31.175.97, ttl 1, hop 0
       vtime 3.000s, msg-seq 0x533d, length 48
       hello-time 1.000s, MPR willingness 3
         link-type Symmetric, neighbor-type Symmetric, len 12
           neighbor 172.29.175.61, link-quality 0.00%, neighbor-link-quality 0.00%
         link-type Unspecified, neighbor-type Symmetric, len 20
           neighbor 172.31.175.61, link-quality 0.00%, neighbor-link-quality 0.00%
           neighbor 172.29.175.61, link-quality 0.00%, neighbor-link-quality 0.00%

Node 61 receives HELLO messages from node 97 that report (amongst others):
1- a  SYMMETRIC   link-type to node 61 (172.29.175.61)
2- an UNSPECIFIED link-type to node 61 (172.29.175.61)

Clearly, this is 'confusing' and the root cause of why node 61 reports
infinite costs for the links, as shown above.

On node 61 - the receiving side - an entry with link type SYMMETRIC is
processed, but then later overwritten with UNSPECIFIED from the duplicate
entry.

For now we fix this problem by letting the sending side order the link
type statuses differently. In a future follow-up patch we'll fix both
the sending and receiving sides more thoroughly.

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
Signed-off-by: Henning Rogge <henning.rogge@fkie.fraunhofer.de>
src/lq_packet.c