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)
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

index d44e654..287f4b4 100644 (file)
@@ -326,7 +326,7 @@ serialize_common(struct olsr_common *comm)
 static void
 serialize_lq_hello(struct lq_hello_message *lq_hello, struct interface_olsr *outif)
 {
-  static const int LINK_ORDER[] = { SYM_LINK, UNSPEC_LINK, ASYM_LINK, LOST_LINK };
+  static const int LINK_ORDER[] = { UNSPEC_LINK, LOST_LINK, ASYM_LINK, SYM_LINK };
   int rem, size, req, expected_size = 0;
   struct lq_hello_info_header *info_head;
   struct lq_hello_neighbor *neigh;