Exception encountered while processing vpnv6 route
Description
Environment
Activity

Ajay Lele January 6, 2020 at 6:39 PM
For IPv6 address-family, when next-hop address is an IPv4 address, it is encoded as IPv4-mapped IPv6 address as defined in https://tools.ietf.org/html/rfc4659#section-3.2.1.2. So this is how the route will be received from the router.
Now even in case of oxygen and prior where this exception was not seen, contents of operational RIB for such a route showed ipv6-next-hop with an IPv4 address value. This itself does not seem right
"attributes": {
"as-path": {},
"ipv6-next-hop": {
"global": "10.176.0.235"
},
What seems to be happening is that the code used to convert received byte array to IPv6 address uses https://docs.oracle.com/javase/7/docs/api/java/net/Inet6Address.html and as mentioned in its "Special IPv6 address section", it automatically converts IPv4-mapped IPv6 address into an IPv4 address
So the resultant Ipv6Address ends up having an IPv4 address in it (the validation is skipped during creation - refer to discussion in https://bugs.opendaylight.org/show_bug.cgi?id=2825, https://wiki.opendaylight.org/view/String_data_normalization_and_alternative_storage, https://git.opendaylight.org/gerrit/c/mdsal/+/34869)
Proposed fix is to change this logic such that an IPv4-mapped IPv6 address will get parsed into an IPv6 address. With this change, the operational RIB will show the corresponding IPv6 address in ipv6-next-hop field
"attributes": {
"as-path": {},
"ipv6-next-hop": {
"global": "::ffff:ab0:eb"
},
When Controller peers with a router that is advertising vpnv6 route with ipv4 next-hop address, below exception is seen during session establishment. Issue is seen in all releases Fluorine and beyond.
2020-01-02T11:47:30,092 | ERROR | opendaylight-cluster-data-notification-dispatcher-56 | DataTreeChangeListenerActor | 274 - org.opendaylight.controller.sal-clustering-commons - 1.8.1 | member-1-shard-default-operational: Error notifying listener org.opendaylight.controller.sal.core.compat.LegacyDOMDataBrokerAdapter$2$$Lambda$968/1234951622@264c7425 java.lang.IllegalArgumentException: Supplied value "10.176.0.235" does not match required pattern "((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(%[\p{N}\p{L}]+)?" at org.opendaylight.yangtools.yang.binding.CodeHelpers.checkPattern(CodeHelpers.java:130) ~[336:org.opendaylight.mdsal.yang-binding:0.13.1] at org.opendaylight.yangtools.yang.binding.CodeHelpers.checkPattern(CodeHelpers.java:149) ~[336:org.opendaylight.mdsal.yang-binding:0.13.1] at org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address.<init>(Ipv6Address.java:31) ~[322:org.opendaylight.mdsal.model.ietf-inet-types-2013-07-15:1.5.1] at org.opendaylight.mdsal.binding.dom.codec.impl.EncapsulatedValueCodec.deserialize(EncapsulatedValueCodec.java:73) ~[301:org.opendaylight.mdsal.binding-dom-codec:0.13.1] at org.opendaylight.mdsal.binding.dom.codec.impl.LeafNodeCodecContext.deserializeObject(LeafNodeCodecContext.java:196) ~[301:org.opendaylight.mdsal.binding-dom-codec:0.13.1] at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectCodecContext.getBindingChildValue(DataObjectCodecContext.java:370) ~[301:org.opendaylight.mdsal.binding-dom-codec:0.13.1] at org.opendaylight.mdsal.binding.dom.codec.impl.LazyDataObject.getBindingData(LazyDataObject.java:152) ~[301:org.opendaylight.mdsal.binding-dom-codec:0.13.1] at org.opendaylight.mdsal.binding.dom.codec.impl.LazyDataObject.invoke(LazyDataObject.java:75) ~[301:org.opendaylight.mdsal.binding-dom-codec:0.13.1] at com.sun.proxy.$Proxy360.getGlobal(Unknown Source) ~[203:org.opendaylight.bgpcep.bgp-concepts:0.10.1] at org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.ipv6.next.hop._case.Ipv6NextHop$StreamWriter.serialize(DataObjectSerializerPrototype.java) ~[203:org.opendaylight.bgpcep.bgp-concepts:0.10.1] at org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.Ipv6NextHopCase$StreamWriter.serialize(DataObjectSerializerPrototype.java) ~[203:org.opendaylight.bgpcep.bgp-concepts:0.10.1] at org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry$DataObjectSerializerProxy.serialize(BindingNormalizedNodeCodecRegistry.java:351) ~[301:org.opendaylight.mdsal.binding-dom-codec:0.13.1] at org.opendaylight.mdsal.binding.dom.codec.util.ChoiceDispatchSerializer.serialize(ChoiceDispatchSerializer.java:46) ~[301:org.opendaylight.mdsal.binding-dom-codec:0.13.1] at org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.Attributes$StreamWriter.serialize(DataObjectSerializerPrototype.java) ~[217:org.opendaylight.bgpcep.bgp-parser-api:0.10.1] at org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.vpn.rev180329.l3vpn.ip.route.VpnRoute$StreamWriter.serialize(DataObjectSerializerPrototype.java) ~[207:org.opendaylight.bgpcep.bgp-l3vpn:0.10.1] at org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry$DataObjectSerializerProxy.serialize(BindingNormalizedNodeCodecRegistry.java:351) ~[301:org.opendaylight.mdsal.binding-dom-codec:0.13.1] at org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry.toNormalizedNode(BindingNormalizedNodeCodecRegistry.java:117) ~[301:org.opendaylight.mdsal.binding-dom-codec:0.13.1] at org.opendaylight.mdsal.binding.dom.adapter.BindingToNormalizedNodeCodec.toNormalizedNode(BindingToNormalizedNodeCodec.java:162) ~[300:org.opendaylight.mdsal.binding-dom-adapter:2.5.1] at org.opendaylight.controller.md.sal.binding.impl.AbstractWriteTransaction.put(AbstractWriteTransaction.java:37) ~[269:org.opendaylight.controller.sal-binding-broker-impl:1.8.1] at org.opendaylight.controller.md.sal.binding.impl.BindingDOMWriteTransactionAdapter.put(BindingDOMWriteTransactionAdapter.java:34) ~[269:org.opendaylight.controller.sal-binding-broker-impl:1.8.1] at org.opendaylight.protocol.bgp.rib.impl.EffectiveRibInWriter.writeRoutes(EffectiveRibInWriter.java:277) ~[223:org.opendaylig