summaryrefslogtreecommitdiff
path: root/proto/bgp
diff options
context:
space:
mode:
authorOndrej Zajicek (work) <santiago@crfreenet.org>2020-04-29 02:50:29 +0200
committerOndrej Zajicek (work) <santiago@crfreenet.org>2020-04-29 02:50:29 +0200
commit17de3a023f7bde293892b41bfafe5740c8553fc8 (patch)
treeabf6ea6675943bec8a34fccb52b8da11885cb86d /proto/bgp
parentb465604eb13fc57ebe240556ebf0d4469690c906 (diff)
BGP: Fix handling of strange IPv6 link-local-only next hops
There are three common ways how to encode IPv6 link-local-only next hops: (:: ll), (ll), and (ll ll). We use the first one but we should accept all three. The patch fixes handling of the last one. Thanks to Sebastian Hahn for the bugreport.
Diffstat (limited to 'proto/bgp')
-rw-r--r--proto/bgp/packets.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/proto/bgp/packets.c b/proto/bgp/packets.c
index ee031c05..78fdd1e0 100644
--- a/proto/bgp/packets.c
+++ b/proto/bgp/packets.c
@@ -1157,7 +1157,10 @@ bgp_decode_next_hop_ip(struct bgp_parse_state *s, byte *data, uint len, rta *a)
nh[0] = ipa_from_ip6(get_ip6(data));
nh[1] = ipa_from_ip6(get_ip6(data+16));
- if (ipa_is_ip4(nh[0]) || !ip6_is_link_local(nh[1]))
+ if (ipa_is_link_local(nh[0]))
+ { nh[1] = nh[0]; nh[0] = IPA_NONE; }
+
+ if (ipa_is_ip4(nh[0]) || !ipa_is_link_local(nh[1]))
nh[1] = IPA_NONE;
}
else