]> git.puffer.fish Git - mirror/frr.git/commitdiff
bfdd: fix BGP unnumbered peer setup 3299/head
authorRafael Zalamena <rzalamena@opensourcerouting.org>
Sat, 3 Nov 2018 22:08:33 +0000 (19:08 -0300)
committerRafael Zalamena <rzalamena@opensourcerouting.org>
Fri, 9 Nov 2018 12:04:34 +0000 (10:04 -0200)
The session key uses the scope id to figure out which interface we are
using with that link-local address, so if we don't set it when
registering a session we'll end up with multiple IPv6 sessions.

This bug was spotted by Sandro Bolliger.

Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
(cherry picked from commit de61f256d68bc792a3823193fa8a49fdcaf77d3c)

bfdd/ptm_adapter.c

index a5fae3383cd7248ba0994f318e2e877dd90f283f..aac4487f39e09ed29753bbd73c88da5910d0988b 100644 (file)
@@ -381,6 +381,21 @@ static int _ptm_msg_read(struct stream *msg, int command,
                if (bpc->bpc_has_localif) {
                        STREAM_GET(bpc->bpc_localif, msg, ifnamelen);
                        bpc->bpc_localif[ifnamelen] = 0;
+
+                       /*
+                        * IPv6 link-local addresses must use scope id,
+                        * otherwise the session lookup will always fail
+                        * and we'll have multiple sessions showing up.
+                        *
+                        * This problem only happens with single hop
+                        * since it is not possible to have link-local
+                        * address for multi hop sessions.
+                        */
+                       if (bpc->bpc_ipv4 == false
+                           && IN6_IS_ADDR_LINKLOCAL(
+                                      &bpc->bpc_peer.sa_sin6.sin6_addr))
+                               bpc->bpc_peer.sa_sin6.sin6_scope_id =
+                                       ptm_bfd_fetch_ifindex(bpc->bpc_localif);
                }
        }