From a397aa4828919cc643647c96f5c916ee211f597f Mon Sep 17 00:00:00 2001 From: Dana Kutenicsova Date: Sat, 7 Jun 2014 13:51:03 +0200 Subject: [PATCH] Removed checkstyle warnings. Change-Id: I040d5f047235ca2807fae021d21df85079104604 Signed-off-by: Dana Kutenicsova --- bgp/concepts/src/main/yang/bgp-types.yang | 460 ++-- .../src/main/resources/initial/31-bgp.xml | 216 +- .../main/resources/initial/41-bgp-example.xml | 266 +- .../yang/bgp/linkstate/LinkstateModule.java | 93 +- .../bgp/linkstate/LinkstateModuleFactory.java | 18 +- .../bgp/linkstate/LinkstateModuleTest.java | 8 +- .../protocol/bgp/linkstate/BGPActivator.java | 28 +- .../bgp/linkstate/LinkstateAdjRIBsIn.java | 291 +-- .../linkstate/LinkstateAttributeParser.java | 624 ++--- .../bgp/linkstate/LinkstateNlriParser.java | 859 ++++--- .../protocol/bgp/linkstate/RIBActivator.java | 24 +- .../protocol/bgp/linkstate/TlvCode.java | 94 +- .../src/main/yang/bgp-linkstate.yang | 1294 +++++----- .../protocol/bgp/linkstate/ActivatorTest.java | 40 +- .../bgp/linkstate/LinkstateAdjRIBsInTest.java | 301 +-- .../LinkstateAttributeParserTest.java | 218 +- .../linkstate/LinkstateNlriParserTest.java | 273 ++- .../protocol/bgp/parser/AsNumberUtil.java | 52 +- .../bgp/parser/BGPDocumentedException.java | 168 +- .../protocol/bgp/parser/BGPError.java | 342 +-- .../bgp/parser/BGPParsingException.java | 53 +- .../protocol/bgp/parser/BGPSession.java | 38 +- .../bgp/parser/BGPTerminationReason.java | 16 +- .../protocol/bgp/parser/BgpTableTypeImpl.java | 108 +- bgp/parser-api/src/main/yang/bgp-message.yang | 294 +-- .../src/main/yang/bgp-multiprotocol.yang | 260 +- .../protocol/bgp/parser/APITest.java | 64 +- .../protocol/bgp/parser/TableTypeTest.java | 44 +- .../bgp/parser/impl/BGPActivator.java | 140 +- .../message/BGPKeepAliveMessageParser.java | 34 +- .../message/BGPNotificationMessageParser.java | 140 +- .../impl/message/BGPOpenMessageParser.java | 316 +-- .../impl/message/BGPUpdateMessageParser.java | 122 +- .../message/open/As4CapabilityHandler.java | 28 +- .../open/CapabilityParameterParser.java | 68 +- .../open/GracefulCapabilityHandler.java | 208 +- .../open/MultiProtocolCapabilityHandler.java | 80 +- .../update/AS4AggregatorAttributeParser.java | 10 +- .../update/AS4PathAttributeParser.java | 10 +- .../update/AggregatorAttributeParser.java | 39 +- .../message/update/AsPathAttributeParser.java | 98 +- .../message/update/AsPathSegmentParser.java | 80 +- .../AtomicAggregateAttributeParser.java | 10 +- .../update/ClusterIdAttributeParser.java | 24 +- .../update/CommunitiesAttributeParser.java | 35 +- .../message/update/CommunitiesParser.java | 336 +-- .../impl/message/update/CommunityUtil.java | 143 +- .../ExtendedCommunitiesAttributeParser.java | 43 +- .../impl/message/update/IpNlriParser.java | 20 +- .../impl/message/update/Ipv4NlriParser.java | 10 +- .../impl/message/update/Ipv6NlriParser.java | 10 +- .../LocalPreferenceAttributeParser.java | 10 +- .../update/MPReachAttributeParser.java | 32 +- .../update/MPUnreachAttributeParser.java | 32 +- ...MultiExitDiscriminatorAttributeParser.java | 10 +- .../update/NextHopAttributeParser.java | 19 +- .../message/update/OriginAttributeParser.java | 25 +- .../update/OriginatorIdAttributeParser.java | 19 +- .../bgp/parser/impl/BGPParserTest.java | 2134 ++++++++--------- .../bgp/parser/impl/CommunityTest.java | 68 +- .../bgp/parser/impl/ComplementaryTest.java | 404 ++-- .../bgp/parser/impl/IPv4NextHopTest.java | 20 +- .../bgp/parser/impl/IPv6NextHopTest.java | 50 +- .../protocol/bgp/parser/impl/OpenTest.java | 33 +- .../protocol/bgp/parser/impl/ParserTest.java | 493 ++-- .../parser/impl/PathAttributeParserTest.java | 25 +- .../parser/impl/RouteOriginCommunityTest.java | 32 +- .../parser/impl/RouteTargetCommunityTest.java | 32 +- .../bgp/parser/mock/BGPMessageParserMock.java | 40 +- .../parser/mock/BGPMessageParserMockTest.java | 280 +-- ...mpleBGPExtensionProviderContextModule.java | 70 +- ...ExtensionProviderContextModuleFactory.java | 19 +- ...BGPExtensionProviderContextModuleTest.java | 6 +- bgp/parser-spi/pom.xml | 8 +- ...AbstractBGPExtensionProviderActivator.java | 56 +- .../parser/spi/AbstractMessageRegistry.java | 90 +- .../bgp/parser/spi/AddressFamilyRegistry.java | 5 +- .../bgp/parser/spi/AttributeParser.java | 12 +- .../bgp/parser/spi/AttributeRegistry.java | 5 +- .../bgp/parser/spi/AttributeSerializer.java | 2 +- .../spi/BGPExtensionConsumerActivator.java | 5 +- .../spi/BGPExtensionConsumerContext.java | 25 +- .../spi/BGPExtensionProviderActivator.java | 5 +- .../spi/BGPExtensionProviderContext.java | 49 +- .../bgp/parser/spi/CapabilityParser.java | 2 +- .../bgp/parser/spi/CapabilityRegistry.java | 5 +- .../bgp/parser/spi/CapabilitySerializer.java | 2 +- .../bgp/parser/spi/CapabilityUtil.java | 24 +- .../bgp/parser/spi/MessageParser.java | 2 +- .../bgp/parser/spi/MessageRegistry.java | 5 +- .../bgp/parser/spi/MessageSerializer.java | 2 +- .../protocol/bgp/parser/spi/MessageUtil.java | 50 +- .../protocol/bgp/parser/spi/NlriParser.java | 5 +- .../protocol/bgp/parser/spi/NlriRegistry.java | 5 +- .../bgp/parser/spi/NlriSerializer.java | 2 +- .../protocol/bgp/parser/spi/NlriUtil.java | 42 +- .../bgp/parser/spi/ParameterParser.java | 2 +- .../bgp/parser/spi/ParameterRegistry.java | 5 +- .../bgp/parser/spi/ParameterSerializer.java | 2 +- .../bgp/parser/spi/ParameterUtil.java | 20 +- .../spi/SubsequentAddressFamilyRegistry.java | 5 +- .../spi/pojo/AbstractFamilyRegistry.java | 58 +- ...viceLoaderBGPExtensionProviderContext.java | 3 +- .../spi/pojo/SimpleAddressFamilyRegistry.java | 28 +- .../spi/pojo/SimpleAttributeRegistry.java | 166 +- .../SimpleBGPExtensionConsumerContext.java | 84 +- .../SimpleBGPExtensionProviderContext.java | 225 +- .../spi/pojo/SimpleCapabilityRegistry.java | 62 +- .../spi/pojo/SimpleMessageRegistry.java | 58 +- .../parser/spi/pojo/SimpleNlriRegistry.java | 167 +- .../spi/pojo/SimpleParameterRegistry.java | 60 +- ...SimpleSubsequentAddressFamilyRegistry.java | 30 +- .../spi/AbstractMessageRegistryTest.java | 52 +- .../protocol/bgp/parser/spi/UtilsTest.java | 117 +- .../src/main/yang/config-bgp-rib.yang | 8 +- .../protocol/bgp/rib/DefaultRibReference.java | 6 +- bgp/rib-api/src/main/yang/bgp-rib.yang | 146 +- .../bgp/rib/impl/BGPDispatcherImplModule.java | 36 +- .../impl/BGPDispatcherImplModuleFactory.java | 5 +- .../yang/bgp/rib/impl/BGPPeerModule.java | 217 +- .../bgp/rib/impl/BGPPeerModuleFactory.java | 18 +- .../bgp/rib/impl/BGPTableTypeImplModule.java | 91 +- .../impl/BGPTableTypeImplModuleFactory.java | 19 +- .../bgp/rib/impl/BaseBGPParserModule.java | 36 +- .../rib/impl/BaseBGPParserModuleFactory.java | 18 +- .../yang/bgp/rib/impl/BaseBGPRIBModule.java | 35 +- .../bgp/rib/impl/BaseBGPRIBModuleFactory.java | 18 +- .../yang/bgp/rib/impl/RIBImplModule.java | 48 +- .../bgp/rib/impl/RIBImplModuleFactory.java | 7 +- .../rib/impl/AbstractRIBImplModuleTest.java | 82 +- .../rib/impl/BGPDispatcherImplModuleTest.java | 30 +- .../yang/bgp/rib/impl/BGPPeerModuleTest.java | 19 +- .../rib/impl/BGPTableTypeImplModuleTest.java | 34 +- .../yang/bgp/rib/impl/RIBImplModuleTest.java | 4 +- .../bgp/rib/impl/BGPByteToMessageDecoder.java | 33 +- .../bgp/rib/impl/BGPDispatcherImpl.java | 204 +- .../bgp/rib/impl/BGPHandlerFactory.java | 35 +- .../bgp/rib/impl/BGPMessageHeaderDecoder.java | 60 +- .../bgp/rib/impl/BGPMessageToByteEncoder.java | 30 +- .../bgp/rib/impl/BGPObjectComparator.java | 310 +-- .../protocol/bgp/rib/impl/BGPPeer.java | 223 +- .../protocol/bgp/rib/impl/BGPSessionImpl.java | 554 ++--- .../bgp/rib/impl/BGPSessionNegotiator.java | 298 +-- .../rib/impl/BGPSessionNegotiatorFactory.java | 30 +- .../bgp/rib/impl/BGPSessionProposalImpl.java | 86 +- .../bgp/rib/impl/BGPSynchronization.java | 208 +- .../protocol/bgp/rib/impl/Ipv4AdjRIBsIn.java | 52 +- .../protocol/bgp/rib/impl/Ipv6AdjRIBsIn.java | 52 +- .../protocol/bgp/rib/impl/RIBActivator.java | 39 +- .../protocol/bgp/rib/impl/RIBImpl.java | 461 ++-- .../protocol/bgp/rib/impl/RIBTables.java | 70 +- .../bgp/rib/impl/spi/BGPDispatcher.java | 30 +- .../rib/impl/spi/BGPSessionPreferences.java | 90 +- .../bgp/rib/impl/spi/BGPSessionProposal.java | 14 +- .../protocol/bgp/rib/impl/spi/RIB.java | 24 +- .../protocol/bgp/rib/impl/ApiTest.java | 14 +- .../bgp/rib/impl/BestPathSelectionTest.java | 158 +- .../protocol/bgp/rib/impl/FSMTest.java | 220 +- .../bgp/rib/impl/SimpleSessionListener.java | 56 +- .../bgp/rib/impl/SpeakerSessionListener.java | 60 +- .../bgp/rib/impl/SpeakerSessionMock.java | 20 +- .../bgp/rib/impl/SynchronizationTest.java | 163 +- .../protocol/bgp/rib/mock/BGPMock.java | 167 +- .../bgp/rib/mock/EventBusRegistration.java | 146 +- .../bgp/rib/mock/BGPListenerMock.java | 48 +- .../bgp/rib/spi/RIBExtensionsImplModule.java | 68 +- .../spi/RIBExtensionsImplModuleFactory.java | 19 +- .../rib/spi/RIBExtensionsImplModuleTest.java | 5 +- .../bgp/rib/spi/AbstractAdjRIBsIn.java | 387 ++- ...AbstractRIBExtensionProviderActivator.java | 56 +- .../protocol/bgp/rib/spi/AdjRIBsIn.java | 14 +- .../bgp/rib/spi/AdjRIBsInFactory.java | 2 +- .../protocol/bgp/rib/spi/Peer.java | 24 +- .../spi/RIBExtensionConsumerActivator.java | 5 +- .../rib/spi/RIBExtensionConsumerContext.java | 10 +- .../spi/RIBExtensionProviderActivator.java | 5 +- .../rib/spi/RIBExtensionProviderContext.java | 27 +- ...viceLoaderRIBExtensionConsumerContext.java | 60 +- .../SimpleRIBExtensionProviderContext.java | 58 +- .../protocol/bgp/testtool/Main.java | 115 +- .../bgp/testtool/TestingListener.java | 36 +- .../protocol/bgp/testtool/BGPSpeakerMock.java | 72 +- .../bgp/testtool/SpeakerSessionListener.java | 40 +- ...Ipv4ReachabilityTopologyBuilderModule.java | 75 +- ...chabilityTopologyBuilderModuleFactory.java | 5 +- ...Ipv6ReachabilityTopologyBuilderModule.java | 74 +- ...chabilityTopologyBuilderModuleFactory.java | 5 +- .../LinkstateTopologyBuilderModule.java | 75 +- ...LinkstateTopologyBuilderModuleFactory.java | 5 +- ...ReachabilityTopologyBuilderModuleTest.java | 6 +- ...ReachabilityTopologyBuilderModuleTest.java | 9 +- .../LinkstateTopologyBuilderModuleTest.java | 9 +- .../AbstractReachabilityTopologyBuilder.java | 163 +- .../provider/AbstractTopologyBuilder.java | 288 +-- .../Ipv4ReachabilityTopologyBuilder.java | 23 +- .../Ipv6ReachabilityTopologyBuilder.java | 23 +- .../provider/LinkstateTopologyBuilder.java | 1376 ++++++----- .../bgp/topology/provider/LocRIBListener.java | 18 +- .../bgp/topology/provider/UriBuilder.java | 184 +- .../config/yang/bgp/mock/BgpMockModule.java | 118 +- .../yang/bgp/mock/BgpMockModuleFactory.java | 4 +- .../src/main/yang/bgp-mock.yang | 46 +- .../yang/bgp/mock/BgpMockModuleTest.java | 118 +- .../bgp/util/BinaryBGPDumpFileParser.java | 98 +- .../bgp/util/HexDumpBGPFileParser.java | 126 +- .../bgp/util/BGPBinaryFileParserTest.java | 98 +- .../bgp/util/BGPHexFileParserTest.java | 71 +- .../concepts/AbstractRegistration.java | 35 +- .../concepts/DefaultInstanceReference.java | 20 +- .../protocol/concepts/HandlerRegistry.java | 28 +- .../protocol/concepts/InstanceReference.java | 12 +- .../protocol/concepts/Ipv4Util.java | 214 +- .../protocol/concepts/Ipv6Util.java | 182 +- .../protocol/concepts/MultiRegistry.java | 107 +- concepts/src/main/yang/iana.yang | 12 +- concepts/src/main/yang/ieee754.yang | 24 +- concepts/src/main/yang/network-concepts.yang | 114 +- .../protocol/concepts/ASNumberTest.java | 76 +- .../protocol/concepts/BandwidthTest.java | 66 +- .../concepts/IPAddressesAndPrefixesTest.java | 185 +- .../concepts/ISOSystemIdentifierTest.java | 22 +- .../protocol/concepts/MultiRegistryTest.java | 38 +- integration-tests/pom.xml | 6 +- .../integration/AbstractBundleTest.java | 188 +- .../integration/BgpConceptsBundleTest.java | 20 +- .../integration/BgpLinkstateBundleTest.java | 23 +- .../integration/BgpParserApiBundleTest.java | 20 +- .../integration/BgpParserImplBundleTest.java | 21 +- .../integration/BgpParserMockBundleTest.java | 21 +- .../integration/BgpParserSpiBundleTest.java | 20 +- .../integration/BgpRibApiBundleTest.java | 20 +- .../integration/BgpRibImplBundleTest.java | 23 +- .../integration/BgpRibMockBundleTest.java | 24 +- .../integration/BgpRibSpiBundleTest.java | 20 +- .../integration/BgpUtilBundleTest.java | 20 +- .../integration/ConceptsBundleTest.java | 20 +- .../integration/PcepApiBundleTest.java | 20 +- .../integration/PcepImplBundleTest.java | 24 +- .../integration/PcepSpiBundleTest.java | 20 +- .../integration/RsvpApiBundleTest.java | 20 +- .../protocol/integration/UtilBundleTest.java | 20 +- .../integration/bgp/ParserToSalTest.java | 362 ++- .../pcep/AbstractPcepOsgiTest.java | 163 +- .../pcep/PcepRpcServicesRoutingTest.java | 425 ++-- pcep/api-config/src/main/yang/pcep.yang | 8 +- .../protocol/pcep/PCEPCloseTermination.java | 42 +- .../protocol/pcep/PCEPDispatcher.java | 34 +- .../protocol/pcep/PCEPSession.java | 24 +- .../pcep/PCEPSessionProposalFactory.java | 18 +- .../protocol/pcep/PCEPTerminationReason.java | 14 +- .../protocol/pcep/TerminationReason.java | 64 +- .../pcep/types/rev131005/PceIdBuilder.java | 23 +- pcep/api/src/main/yang/pcep-message.yang | 80 +- pcep/api/src/main/yang/pcep-types.yang | 1824 +++++++------- .../src/main/resources/initial/32-pcep.xml | 4 +- ...ful02PCEPSessionProposalFactoryModule.java | 100 +- ...EPSessionProposalFactoryModuleFactory.java | 5 +- .../initiated00/InitiatedActivator.java | 30 +- .../initiated00/LSPCleanupTlvParser.java | 24 +- .../initiated00/PCEPOpenObjectParser.java | 107 +- .../PCEStatefulCapabilityTlvParser.java | 76 +- .../initiated00/PcinitiateMessageParser.java | 192 +- .../Stateful02LspDbVersionTlvParser.java | 34 +- .../stateful02/Stateful02LspObjectParser.java | 244 +- .../Stateful02LspSymbolicNameTlvParser.java | 34 +- .../Stateful02LspaObjectParser.java | 87 +- .../Stateful02NodeIdentifierTlvParser.java | 26 +- .../Stateful02OpenObjectParser.java | 115 +- .../Stateful02PCReplyMessageParser.java | 220 +- .../Stateful02PCReportMessageParser.java | 256 +- .../Stateful02PCRequestMessageParser.java | 331 ++- ...tateful02PCUpdateRequestMessageParser.java | 260 +- .../Stateful02RSVPErrorSpecTlvParser.java | 122 +- .../Stateful02SessionProposalFactory.java | 73 +- ...Stateful02StatefulCapabilityTlvParser.java | 68 +- .../ietf/stateful02/StatefulActivator.java | 72 +- .../yang/odl-pcep-crabbe-initiated00.yang | 178 +- .../main/yang/odl-pcep-ietf-stateful02.yang | 584 ++--- .../protocol/pcep/ietf/PCEPMessageTest.java | 419 ++-- .../pcep/ietf/PCEPObjectParserTest.java | 185 +- .../protocol/pcep/ietf/PCEPTlvParserTest.java | 132 +- ...2PCEPSessionProposalFactoryModuleTest.java | 34 +- pcep/ietf-stateful07/pom.xml | 2 +- ...ful07PCEPSessionProposalFactoryModule.java | 98 +- ...EPSessionProposalFactoryModuleFactory.java | 5 +- .../CInitiated00LspObjectParser.java | 132 +- .../CInitiated00PCInitiateMessageParser.java | 246 +- .../CInitiated00SrpObjectParser.java | 91 +- ...nitiated00StatefulCapabilityTlvParser.java | 64 +- .../initiated00/CrabbeInitiatedActivator.java | 33 +- .../Stateful07SessionProposalFactory.java | 64 +- .../Stateful07ErrorMessageParser.java | 314 +-- .../Stateful07LSPIdentifierIpv4TlvParser.java | 95 +- .../Stateful07LSPIdentifierIpv6TlvParser.java | 87 +- .../stateful07/Stateful07LspObjectParser.java | 288 ++- .../Stateful07LspSymbolicNameTlvParser.java | 34 +- .../Stateful07LspUpdateErrorTlvParser.java | 34 +- .../Stateful07LspaObjectParser.java | 87 +- .../Stateful07OpenObjectParser.java | 105 +- .../Stateful07PCReportMessageParser.java | 284 +-- ...tateful07PCUpdateRequestMessageParser.java | 276 +-- .../Stateful07RSVPErrorSpecTlvParser.java | 282 +-- .../stateful07/Stateful07SrpObjectParser.java | 116 +- ...Stateful07StatefulCapabilityTlvParser.java | 68 +- .../ietf/stateful07/StatefulActivator.java | 60 +- .../main/yang/odl-pcep-ietf-initiated00.yang | 224 +- .../main/yang/odl-pcep-ietf-stateful07.yang | 772 +++--- .../pcep/ietf/PCEPObjectParserTest.java | 205 +- .../protocol/pcep/ietf/PCEPTlvParserTest.java | 218 +- .../protocol/pcep/ietf/PCEPValidatorTest.java | 613 ++--- ...ful07SessionProposalFactoryModuleTest.java | 34 +- .../yang/pcep/impl/BasePCEPParserModule.java | 27 +- .../impl/BasePCEPParserModuleFactory.java | 18 +- .../CrabbeInitiated00PCEPParserModule.java | 28 +- ...bbeInitiated00PCEPParserModuleFactory.java | 19 +- .../impl/IetfInitiated00PCEPParserModule.java | 28 +- ...etfInitiated00PCEPParserModuleFactory.java | 2 +- .../impl/IetfStateful02PCEPParserModule.java | 28 +- ...IetfStateful02PCEPParserModuleFactory.java | 19 +- .../impl/IetfStateful07PCEPParserModule.java | 28 +- ...IetfStateful07PCEPParserModuleFactory.java | 2 +- .../pcep/impl/PCEPDispatcherImplModule.java | 71 +- .../impl/PCEPDispatcherImplModuleFactory.java | 5 +- .../PCEPSessionProposalFactoryImplModule.java | 84 +- ...ssionProposalFactoryImplModuleFactory.java | 5 +- .../pcep/impl/BasePCEPParserModuleTest.java | 9 +- ...CrabbeInitiated00PCEPParserModuleTest.java | 9 +- .../IetfInitiated00PCEPParserModuleTest.java | 9 +- .../IetfStateful02PCEPParserModuleTest.java | 9 +- .../IetfStateful07PCEPParserModuleTest.java | 9 +- .../impl/PCEPDispatcherImplModuleTest.java | 33 +- ...PSessionProposalFactoryImplModuleTest.java | 30 +- .../impl/AbstractPCEPSessionNegotiator.java | 522 ++-- .../AbstractPCEPSessionNegotiatorFactory.java | 283 ++- .../protocol/pcep/impl/Activator.java | 272 +-- .../impl/BasePCEPSessionProposalFactory.java | 68 +- .../impl/DefaultPCEPSessionNegotiator.java | 84 +- .../DefaultPCEPSessionNegotiatorFactory.java | 30 +- .../pcep/impl/PCEPByteToMessageDecoder.java | 88 +- .../pcep/impl/PCEPDispatcherImpl.java | 146 +- .../pcep/impl/PCEPHandlerFactory.java | 31 +- .../pcep/impl/PCEPMessageHeaderDecoder.java | 34 +- .../pcep/impl/PCEPMessageToByteEncoder.java | 26 +- .../protocol/pcep/impl/PCEPSessionImpl.java | 692 +++--- .../pcep/impl/PCEPSessionRuntimeMXBean.java | 16 +- .../protocol/pcep/impl/PeerRecord.java | 54 +- .../opendaylight/protocol/pcep/impl/Util.java | 32 +- .../impl/message/PCEPCloseMessageParser.java | 68 +- .../impl/message/PCEPErrorMessageParser.java | 268 +-- .../message/PCEPKeepAliveMessageParser.java | 40 +- .../PCEPNotificationMessageParser.java | 230 +- .../impl/message/PCEPOpenMessageParser.java | 67 +- .../impl/message/PCEPReplyMessageParser.java | 438 ++-- .../message/PCEPRequestMessageParser.java | 646 ++--- .../impl/object/AbstractBandwidthParser.java | 38 +- .../AbstractEROWithSubobjectsParser.java | 106 +- .../AbstractRROWithSubobjectsParser.java | 103 +- .../AbstractXROWithSubobjectsParser.java | 106 +- .../pcep/impl/object/EROSubobjectUtil.java | 20 +- .../object/PCEPBandwidthObjectParser.java | 28 +- .../object/PCEPClassTypeObjectParser.java | 106 +- .../impl/object/PCEPCloseObjectParser.java | 110 +- .../object/PCEPEndPointsIpv4ObjectParser.java | 94 +- .../object/PCEPEndPointsIpv6ObjectParser.java | 94 +- .../impl/object/PCEPErrorObjectParser.java | 112 +- .../object/PCEPExcludeRouteObjectParser.java | 72 +- .../PCEPExistingBandwidthObjectParser.java | 28 +- .../object/PCEPExplicitRouteObjectParser.java | 65 +- .../PCEPGlobalConstraintsObjectParser.java | 84 +- .../object/PCEPIncludeRouteObjectParser.java | 70 +- .../object/PCEPLoadBalancingObjectParser.java | 83 +- .../impl/object/PCEPLspaObjectParser.java | 200 +- .../impl/object/PCEPMetricObjectParser.java | 119 +- .../impl/object/PCEPNoPathObjectParser.java | 164 +- .../object/PCEPNotificationObjectParser.java | 124 +- .../PCEPObjectiveFunctionObjectParser.java | 72 +- .../impl/object/PCEPOpenObjectParser.java | 228 +- .../impl/object/PCEPPathKeyObjectParser.java | 78 +- .../object/PCEPReportedRouteObjectParser.java | 61 +- .../PCEPRequestParameterObjectParser.java | 292 +-- .../impl/object/PCEPSvecObjectParser.java | 173 +- .../pcep/impl/object/RROSubobjectUtil.java | 20 +- .../pcep/impl/object/XROSubobjectUtil.java | 20 +- .../subobject/EROAsNumberSubobjectParser.java | 58 +- ...ExplicitExclusionRouteSubobjectParser.java | 180 +- .../EROIpv4PrefixSubobjectParser.java | 81 +- .../EROIpv6PrefixSubobjectParser.java | 72 +- .../subobject/EROLabelSubobjectParser.java | 108 +- .../EROPathKey128SubobjectParser.java | 70 +- .../EROPathKey32SubobjectParser.java | 70 +- ...EROUnnumberedInterfaceSubobjectParser.java | 76 +- .../subobject/GeneralizedLabelParser.java | 34 +- .../RROIpv4PrefixSubobjectParser.java | 126 +- .../RROIpv6PrefixSubobjectParser.java | 93 +- .../subobject/RROLabelSubobjectParser.java | 90 +- .../RROPathKey128SubobjectParser.java | 68 +- .../RROPathKey32SubobjectParser.java | 68 +- ...RROUnnumberedInterfaceSubobjectParser.java | 92 +- .../pcep/impl/subobject/Type1LabelParser.java | 50 +- .../WavebandSwitchingLabelParser.java | 68 +- .../subobject/XROAsNumberSubobjectParser.java | 58 +- .../XROIpv4PrefixSubobjectParser.java | 93 +- .../XROIpv6PrefixSubobjectParser.java | 87 +- .../XROPathKey128SubobjectParser.java | 70 +- .../XROPathKey32SubobjectParser.java | 70 +- .../subobject/XROSRLGSubobjectParser.java | 72 +- ...XROUnnumberedInterfaceSubobjectParser.java | 84 +- .../tlv/AbstractVendorSpecificTlvParser.java | 91 +- .../pcep/impl/tlv/NoPathVectorTlvParser.java | 80 +- .../pcep/impl/tlv/OFListTlvParser.java | 64 +- .../pcep/impl/tlv/OrderTlvParser.java | 54 +- .../impl/tlv/OverloadedDurationTlvParser.java | 34 +- .../pcep/impl/tlv/ReqMissingTlvParser.java | 34 +- .../protocol/pcep/impl/tlv/TlvUtil.java | 39 +- .../pcep/impl/FiniteStateMachineTest.java | 393 ++- .../pcep/impl/LabelSubobjectParserTest.java | 65 +- .../protocol/pcep/impl/MockPCE.java | 80 +- .../pcep/impl/PCEPEROSubobjectParserTest.java | 263 +- .../pcep/impl/PCEPObjectParserTest.java | 1081 ++++----- .../protocol/pcep/impl/PCEPParserTest.java | 58 +- .../pcep/impl/PCEPRROSubobjectParserTest.java | 176 +- .../protocol/pcep/impl/PCEPTlvParserTest.java | 171 +- .../protocol/pcep/impl/PCEPValidatorTest.java | 724 +++--- .../pcep/impl/PCEPXROSubobjectParserTest.java | 188 +- .../protocol/pcep/impl/ServerSessionMock.java | 32 +- .../pcep/impl/SimpleSessionListener.java | 56 +- ...plePCEPExtensionProviderContextModule.java | 71 +- ...ExtensionProviderContextModuleFactory.java | 19 +- ...CEPExtensionProviderContextModuleTest.java | 9 +- .../pcep/spi/AbstractMessageParser.java | 200 +- .../spi/AbstractObjectWithTlvsParser.java | 94 +- .../protocol/pcep/spi/EROSubobjectParser.java | 2 +- .../pcep/spi/EROSubobjectRegistry.java | 32 +- .../pcep/spi/EROSubobjectSerializer.java | 2 +- .../protocol/pcep/spi/LabelParser.java | 2 +- .../protocol/pcep/spi/LabelRegistry.java | 34 +- .../protocol/pcep/spi/LabelSerializer.java | 2 +- .../protocol/pcep/spi/LabelUtil.java | 44 +- .../protocol/pcep/spi/MessageParser.java | 2 +- .../protocol/pcep/spi/MessageRegistry.java | 32 +- .../protocol/pcep/spi/MessageSerializer.java | 2 +- .../protocol/pcep/spi/MessageUtil.java | 34 +- .../protocol/pcep/spi/ObjectHeaderImpl.java | 114 +- .../protocol/pcep/spi/ObjectParser.java | 2 +- .../protocol/pcep/spi/ObjectRegistry.java | 33 +- .../protocol/pcep/spi/ObjectSerializer.java | 2 +- .../protocol/pcep/spi/ObjectUtil.java | 90 +- .../pcep/spi/PCEPDeserializerException.java | 39 +- .../protocol/pcep/spi/PCEPErrorMapping.java | 348 +-- .../protocol/pcep/spi/PCEPErrors.java | 480 ++-- .../spi/PCEPExtensionConsumerActivator.java | 5 +- .../spi/PCEPExtensionConsumerContext.java | 14 +- .../spi/PCEPExtensionProviderActivator.java | 5 +- .../spi/PCEPExtensionProviderContext.java | 32 +- .../pcep/spi/PCEPMessageConstants.java | 20 +- .../protocol/pcep/spi/RROSubobjectParser.java | 2 +- .../pcep/spi/RROSubobjectRegistry.java | 30 +- .../pcep/spi/RROSubobjectSerializer.java | 2 +- .../protocol/pcep/spi/TlvParser.java | 2 +- .../protocol/pcep/spi/TlvRegistry.java | 5 +- .../protocol/pcep/spi/TlvSerializer.java | 2 +- .../protocol/pcep/spi/UnknownObject.java | 77 +- .../protocol/pcep/spi/XROSubobjectParser.java | 2 +- .../pcep/spi/XROSubobjectRegistry.java | 32 +- .../pcep/spi/XROSubobjectSerializer.java | 2 +- ...bstractPCEPExtensionProviderActivator.java | 56 +- ...iceLoaderPCEPExtensionProviderContext.java | 46 +- .../spi/pojo/SimpleEROSubobjectRegistry.java | 64 +- .../pcep/spi/pojo/SimpleLabelRegistry.java | 62 +- .../pcep/spi/pojo/SimpleMessageRegistry.java | 70 +- .../pcep/spi/pojo/SimpleObjectRegistry.java | 86 +- .../SimplePCEPExtensionProviderContext.java | 246 +- .../spi/pojo/SimpleRROSubobjectRegistry.java | 64 +- .../pcep/spi/pojo/SimpleTlvRegistry.java | 62 +- .../spi/pojo/SimpleXROSubobjectRegistry.java | 64 +- .../protocol/pcep/spi/APITest.java | 16 +- .../protocol/pcep/spi/UtilsTest.java | 36 +- .../protocol/pcep/testtool/Main.java | 198 +- .../pcep/testtool/SimpleSessionListener.java | 48 +- .../pcep/testtool/TestingSessionListener.java | 58 +- .../TestingSessionListenerFactory.java | 8 +- .../protocol/pcep/testtool/PCCMock.java | 66 +- .../pcep/testtool/PCEPTestingToolTest.java | 26 +- .../network-topology-pcep-programming.yang | 38 +- .../src/main/yang/network-topology-pcep.yang | 8 +- .../provider/PCEPTopologyProviderModule.java | 207 +- .../PCEPTopologyProviderModuleFactory.java | 19 +- ...ateful02TopologySessionListenerModule.java | 61 +- ...2TopologySessionListenerModuleFactory.java | 19 +- ...ateful07TopologySessionListenerModule.java | 61 +- ...7TopologySessionListenerModuleFactory.java | 19 +- .../PCEPTopologyProviderModuleTest.java | 13 +- ...ul02TopologySessionListenerModuleTest.java | 3 +- .../AbstractTopologySessionListener.java | 666 +++-- .../topology/provider/OperationResults.java | 56 +- .../pcep/topology/provider/PCEPRequest.java | 36 +- .../provider/PCEPTopologyProvider.java | 114 +- .../provider/ServerSessionManager.java | 277 ++- .../Stateful02TopologySessionListener.java | 413 ++-- ...teful02TopologySessionListenerFactory.java | 8 +- .../Stateful07TopologySessionListener.java | 485 ++-- ...teful07TopologySessionListenerFactory.java | 8 +- .../topology/provider/TopologyNodeState.java | 88 +- .../provider/TopologyProgramming.java | 172 +- .../pcep/topology/provider/TopologyRPCs.java | 89 +- .../provider/TopologySessionListener.java | 4 +- .../TopologySessionListenerFactory.java | 2 +- .../provider/TopologySessionRPCs.java | 15 +- .../topology/provider/ParserToSalTest.java | 308 +-- .../spi/AbstractInstructionExecutor.java | 114 +- .../topology-tunnel-pcep-programming.yang | 64 +- .../src/main/yang/topology-tunnel-pcep.yang | 162 +- .../PCEPTunnelTopologyProviderModule.java | 89 +- ...EPTunnelTopologyProviderModuleFactory.java | 19 +- .../PCEPTunnelTopologyProviderModuleTest.java | 13 +- .../tunnel/provider/NodeChangedListener.java | 694 +++--- .../provider/PCEPTunnelTopologyProvider.java | 61 +- .../tunnel/provider/TunnelProgramming.java | 570 ++--- .../bgpcep/programming/NanotimeUtil.java | 78 +- .../api/src/main/yang/programming.yang | 764 +++--- .../bgpcep/programming/NanotimeUtilTest.java | 28 +- .../main/resources/initial/30-programming.xml | 82 +- .../impl/InstructionSchedulerImplModule.java | 86 +- ...InstructionSchedulerImplModuleFactory.java | 19 +- .../AbstractInstructionSchedulerTest.java | 76 +- .../InstructionSchedulerImplModuleTest.java | 4 +- .../programming/impl/InstructionImpl.java | 490 ++-- .../impl/ProgrammingServiceImpl.java | 571 ++--- .../programming/impl/QueueInstruction.java | 5 +- .../impl/MockedDataProviderWrapper.java | 266 +- .../impl/MockedExecutorWrapper.java | 83 +- .../MockedNotificationServiceWrapper.java | 64 +- .../impl/ProgrammingServiceImplTest.java | 624 +++-- .../programming/spi/ExecutionResult.java | 55 +- .../bgpcep/programming/spi/Instruction.java | 56 +- .../programming/spi/InstructionScheduler.java | 28 +- .../programming/spi/SchedulerException.java | 18 +- .../programming/spi/SuccessfulRpcResult.java | 48 +- .../topology/TopologyProgrammingUtil.java | 18 +- .../yang/network-topology-programming.yang | 72 +- .../tunnel/TunnelProgrammingUtil.java | 16 +- .../yang/topology-tunnel-programming.yang | 174 +- rsvp/api/src/main/yang/rsvp.yang | 756 +++--- .../bgpcep/tcpmd5/DummyKeyAccessFactory.java | 59 +- .../opendaylight/bgpcep/tcpmd5/KeyAccess.java | 33 +- .../bgpcep/tcpmd5/KeyAccessFactory.java | 38 +- .../bgpcep/tcpmd5/KeyMapping.java | 26 +- .../bgpcep/tcpmd5/MD5SocketOptions.java | 35 +- .../tcpmd5/DummyKeyAccessFactoryTest.java | 76 +- .../bgpcep/tcpmd5/MD5SocketOptionsTest.java | 16 +- .../jni/cfg/NativeKeyAccessFactoryModule.java | 91 +- .../NativeKeyAccessFactoryModuleFactory.java | 4 +- .../bgpcep/tcpmd5/jni/NativeKeyAccess.java | 84 +- .../tcpmd5/jni/NativeKeyAccessFactory.java | 208 +- .../NativeSupportUnavailableException.java | 17 +- .../tcpmd5/jni/BasicNativeKeyAccessTest.java | 158 +- .../jni/ConnectivityNativeKeyAccessTest.java | 130 +- .../cfg/MD5ClientChannelFactoryModule.java | 63 +- .../MD5ClientChannelFactoryModuleFactory.java | 4 +- .../cfg/MD5ServerChannelFactoryModule.java | 63 +- .../MD5ServerChannelFactoryModuleFactory.java | 4 +- tcp-md5/netty/pom.xml | 106 +- .../DefaultMD5ServerSocketChannelConfig.java | 250 +- .../netty/DefaultMD5SocketChannelConfig.java | 310 +-- .../tcpmd5/netty/MD5ChannelFactory.java | 1 - .../bgpcep/tcpmd5/netty/MD5ChannelOption.java | 16 +- .../netty/MD5NioServerSocketChannel.java | 216 +- .../MD5NioServerSocketChannelFactory.java | 20 +- .../tcpmd5/netty/MD5NioSocketChannel.java | 323 ++- .../netty/MD5NioSocketChannelFactory.java | 20 +- .../tcpmd5/netty/MD5ServerChannelFactory.java | 1 - .../netty/MD5ServerSocketChannelConfig.java | 48 +- .../tcpmd5/netty/MD5SocketChannelConfig.java | 68 +- .../bgpcep/tcpmd5/netty/NettyKeyAccess.java | 60 +- .../nio/DefaultKeyAccessFactoryFactory.java | 41 +- .../bgpcep/tcpmd5/nio/MD5ChannelOptions.java | 76 +- .../tcpmd5/nio/MD5SelectorProvider.java | 136 +- .../tcpmd5/nio/MD5ServerSocketChannel.java | 161 +- .../bgpcep/tcpmd5/nio/MD5SocketChannel.java | 250 +- .../bgpcep/tcpmd5/nio/ProxyChannel.java | 2 +- .../bgpcep/tcpmd5/nio/SelectorFacade.java | 90 +- .../tcpmd5/nio/MD5ChannelOptionsTest.java | 92 +- .../tcpmd5/nio/MD5SocketChannelTest.java | 70 +- .../topology/DefaultTopologyReference.java | 6 +- .../src/main/yang/odl-network-topology.yang | 102 +- .../src/main/yang/network-topology-sr.yang | 152 +- .../src/main/yang/topology-tunnel-sr.yang | 108 +- .../src/main/yang/topology-tunnel-p2p.yang | 112 +- .../src/main/yang/topology-tunnel.yang | 208 +- util/pom.xml | 8 +- .../opendaylight/protocol/util/ByteArray.java | 1094 +++++---- .../protocol/util/NoopReferenceCache.java | 24 +- .../protocol/util/PCEPHexDumpParser.java | 104 +- .../protocol/util/ReferenceCache.java | 24 +- .../opendaylight/protocol/util/Values.java | 28 +- .../protocol/util/ByteArrayTest.java | 749 +++--- .../protocol/util/PCEPHexDumpParserTest.java | 38 +- 597 files changed, 34219 insertions(+), 34271 deletions(-) diff --git a/bgp/concepts/src/main/yang/bgp-types.yang b/bgp/concepts/src/main/yang/bgp-types.yang index 17c9987e37..f860d9feb0 100644 --- a/bgp/concepts/src/main/yang/bgp-types.yang +++ b/bgp/concepts/src/main/yang/bgp-types.yang @@ -1,232 +1,232 @@ module bgp-types { - yang-version 1; - namespace "urn:opendaylight:params:xml:ns:yang:bgp-types"; - prefix "bgp-t"; - - import ietf-inet-types { prefix inet; revision-date 2010-09-24; } - - organization "Cisco Systems, Inc."; - contact "Dana Kutenicsova "; - - description - "This module contains the base concepts contained in RFC4271 and RFC4760. - - Copyright (c)2013 Cisco Systems, Inc. All rights reserved. - - This program and the accompanying materials are made available - under the terms of the Eclipse Public License v1.0 which - accompanies this distribution, and is available at - http://www.eclipse.org/legal/epl-v10.html"; - - revision "2013-09-19" { - description - "Initial revision."; - reference "RFC4271, RFC4760"; - } - - typedef bgp-origin { - reference "http://tools.ietf.org/html/rfc4271#section-5"; - description "Values of BGP Origin Path Attribute."; - type enumeration { - enum igp { - value 0; - } - enum egp { - value 1; - } - enum incomplete { - value 2; - } - } - } - - identity address-family { - reference "http://www.iana.org/assignments/address-family-numbers/address-family-numbers.xhtml#address-family-numbers-2"; - } - - identity ipv4-address-family { - base address-family; - } - - identity ipv6-address-family { - base address-family; - } - - identity subsequent-address-family { - reference "http://tools.ietf.org/html/rfc4760#section-6"; - } - - identity unicast-subsequent-address-family { - reference "http://tools.ietf.org/html/rfc4760#section-6"; - - base subsequent-address-family; - } - - identity mpls-labeled-vpn-subsequent-address-family { - reference "http://tools.ietf.org/html/rfc4760#section-6"; - - base subsequent-address-family; - } - - typedef cluster-identifier { - reference "http://tools.ietf.org/html/rfc4456#section-8"; - type inet:ipv4-address; - } - - typedef short-as-number { - type inet:as-number { - range 0..65535; - } - } - - grouping bgp-aggregator { - reference "http://tools.ietf.org/html/rfc4271#section-5.1.7"; - description "BGP Path Attribute AGGREGATOR."; - leaf as-number { - // We are acting as a NEW speaker, so only four bytes are allowed - type inet:as-number; - } - leaf network-address { - type inet:ipv4-address; - } - } - - grouping community { - reference "https://tools.ietf.org/html/rfc1997"; - description "Community Path Attribute"; - leaf as-number { - type inet:as-number; - } - leaf semantics { - type uint16; - } - } - - grouping extended-community { - leaf comm-type { - type uint8; - } - leaf comm-sub-type { - type uint8; - } - choice extended-community { - case as-specific-extended-community-case { - container as-specific-extended-community { - when "../comm-type = 0 and ../comm-sub-type = 0 or ../comm-type = 40 and ../comm-sub-type = 0"; - leaf transitive { - type boolean; - } - leaf global-administrator { - type short-as-number; - } - leaf local-administrator { - type binary { - length "4"; - } - } - } - } - case inet4-specific-extended-community-case { - container inet4-specific-extended-community { - when "../comm-type = 1 and ../comm-sub-type = 0 or ../comm-type = 41 and ../comm-sub-type = 0"; - leaf transitive { - type boolean; - } - leaf global-administrator { - type inet:ipv4-address; - } - leaf local-administrator { - type binary { - length "2"; - } - } - } - } - case opaque-extended-community-case { - container opaque-extended-community { - when "../comm-type = 3 and ../comm-sub-type = 0 or ../comm-type = 43 and ../comm-sub-type = 0"; - leaf transitive { - type boolean; - } - leaf value { - type binary { - length "6"; - } - } - } - } - case route-target-extended-community-case { - container route-target-extended-community { - when "../comm-type = 1 and ../comm-sub-type = 2 or ../comm-type = 2 and ../comm-sub-type = 2 or ../comm-type = 3 and ../comm-sub-type = 2"; - leaf global-administrator { - type short-as-number; - } - leaf local-administrator { - type binary { - length "4"; - } - } - } - } - case route-origin-extended-community-case { - container route-origin-extended-community { - when "../comm-type = 1 and ../comm-sub-type = 3 or ../comm-type = 2 and ../comm-sub-type = 3 or ../comm-type = 3 and ../comm-sub-type = 3"; - leaf global-administrator { - type short-as-number; - } - leaf local-administrator { - type binary { - length "4"; - } - } - } - } - } - } - - grouping next-hop { - choice c-next-hop { - case ipv4-next-hop-case { - container ipv4-next-hop { - reference "http://tools.ietf.org/html/rfc4271#section-5.1.3"; - leaf global { - type inet:ipv4-address; - } - } - } - case ipv6-next-hop-case { - container ipv6-next-hop { - reference "http://tools.ietf.org/html/rfc4760#section-3"; - leaf global { - type inet:ipv6-address; - } - leaf link-local { - type inet:ipv6-address; - } - } - } - } - } - - grouping as-path-segment { - reference "http://tools.ietf.org/html/rfc4271#section-5.1.2"; - choice c-segment { - case a-set-case { - container a-set { - leaf-list as-set { - type inet:as-number; - } - } - } - case a-list-case { - container a-list { - list as-sequence { - leaf as { - type inet:as-number; - } - } - } - } - } - } + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:bgp-types"; + prefix "bgp-t"; + + import ietf-inet-types { prefix inet; revision-date 2010-09-24; } + + organization "Cisco Systems, Inc."; + contact "Dana Kutenicsova "; + + description + "This module contains the base concepts contained in RFC4271 and RFC4760. + + Copyright (c)2013 Cisco Systems, Inc. All rights reserved. + + This program and the accompanying materials are made available + under the terms of the Eclipse Public License v1.0 which + accompanies this distribution, and is available at + http://www.eclipse.org/legal/epl-v10.html"; + + revision "2013-09-19" { + description + "Initial revision."; + reference "RFC4271, RFC4760"; + } + + typedef bgp-origin { + reference "http://tools.ietf.org/html/rfc4271#section-5"; + description "Values of BGP Origin Path Attribute."; + type enumeration { + enum igp { + value 0; + } + enum egp { + value 1; + } + enum incomplete { + value 2; + } + } + } + + identity address-family { + reference "http://www.iana.org/assignments/address-family-numbers/address-family-numbers.xhtml#address-family-numbers-2"; + } + + identity ipv4-address-family { + base address-family; + } + + identity ipv6-address-family { + base address-family; + } + + identity subsequent-address-family { + reference "http://tools.ietf.org/html/rfc4760#section-6"; + } + + identity unicast-subsequent-address-family { + reference "http://tools.ietf.org/html/rfc4760#section-6"; + + base subsequent-address-family; + } + + identity mpls-labeled-vpn-subsequent-address-family { + reference "http://tools.ietf.org/html/rfc4760#section-6"; + + base subsequent-address-family; + } + + typedef cluster-identifier { + reference "http://tools.ietf.org/html/rfc4456#section-8"; + type inet:ipv4-address; + } + + typedef short-as-number { + type inet:as-number { + range 0..65535; + } + } + + grouping bgp-aggregator { + reference "http://tools.ietf.org/html/rfc4271#section-5.1.7"; + description "BGP Path Attribute AGGREGATOR."; + leaf as-number { + // We are acting as a NEW speaker, so only four bytes are allowed + type inet:as-number; + } + leaf network-address { + type inet:ipv4-address; + } + } + + grouping community { + reference "https://tools.ietf.org/html/rfc1997"; + description "Community Path Attribute"; + leaf as-number { + type inet:as-number; + } + leaf semantics { + type uint16; + } + } + + grouping extended-community { + leaf comm-type { + type uint8; + } + leaf comm-sub-type { + type uint8; + } + choice extended-community { + case as-specific-extended-community-case { + container as-specific-extended-community { + when "../comm-type = 0 and ../comm-sub-type = 0 or ../comm-type = 40 and ../comm-sub-type = 0"; + leaf transitive { + type boolean; + } + leaf global-administrator { + type short-as-number; + } + leaf local-administrator { + type binary { + length "4"; + } + } + } + } + case inet4-specific-extended-community-case { + container inet4-specific-extended-community { + when "../comm-type = 1 and ../comm-sub-type = 0 or ../comm-type = 41 and ../comm-sub-type = 0"; + leaf transitive { + type boolean; + } + leaf global-administrator { + type inet:ipv4-address; + } + leaf local-administrator { + type binary { + length "2"; + } + } + } + } + case opaque-extended-community-case { + container opaque-extended-community { + when "../comm-type = 3 and ../comm-sub-type = 0 or ../comm-type = 43 and ../comm-sub-type = 0"; + leaf transitive { + type boolean; + } + leaf value { + type binary { + length "6"; + } + } + } + } + case route-target-extended-community-case { + container route-target-extended-community { + when "../comm-type = 1 and ../comm-sub-type = 2 or ../comm-type = 2 and ../comm-sub-type = 2 or ../comm-type = 3 and ../comm-sub-type = 2"; + leaf global-administrator { + type short-as-number; + } + leaf local-administrator { + type binary { + length "4"; + } + } + } + } + case route-origin-extended-community-case { + container route-origin-extended-community { + when "../comm-type = 1 and ../comm-sub-type = 3 or ../comm-type = 2 and ../comm-sub-type = 3 or ../comm-type = 3 and ../comm-sub-type = 3"; + leaf global-administrator { + type short-as-number; + } + leaf local-administrator { + type binary { + length "4"; + } + } + } + } + } + } + + grouping next-hop { + choice c-next-hop { + case ipv4-next-hop-case { + container ipv4-next-hop { + reference "http://tools.ietf.org/html/rfc4271#section-5.1.3"; + leaf global { + type inet:ipv4-address; + } + } + } + case ipv6-next-hop-case { + container ipv6-next-hop { + reference "http://tools.ietf.org/html/rfc4760#section-3"; + leaf global { + type inet:ipv6-address; + } + leaf link-local { + type inet:ipv6-address; + } + } + } + } + } + + grouping as-path-segment { + reference "http://tools.ietf.org/html/rfc4271#section-5.1.2"; + choice c-segment { + case a-set-case { + container a-set { + leaf-list as-set { + type inet:as-number; + } + } + } + case a-list-case { + container a-list { + list as-sequence { + leaf as { + type inet:as-number; + } + } + } + } + } + } } diff --git a/bgp/controller-config/src/main/resources/initial/31-bgp.xml b/bgp/controller-config/src/main/resources/initial/31-bgp.xml index 9a83bbb3cd..5e89626677 100644 --- a/bgp/controller-config/src/main/resources/initial/31-bgp.xml +++ b/bgp/controller-config/src/main/resources/initial/31-bgp.xml @@ -12,70 +12,70 @@ urn:opendaylight:params:xml:ns:yang:bgp-linkstate?module=bgp-linkstate&revision=2013-11-25 urn:opendaylight:params:xml:ns:yang:bgp-types?module=bgp-types&revision=2013-09-19 urn:opendaylight:params:xml:ns:yang:controller:bgp:linkstate?module=config-bgp-linkstate&revision=2013-11-15 - urn:opendaylight:params:xml:ns:yang:controller:bgp:parser:spi?module=config-bgp-parser-spi&revision=2013-11-15 - urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:spi?module=config-bgp-rib-spi&revision=2013-11-15 - urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl?module=bgp-rib-impl&revision=2013-04-09 - urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&revision=2013-10-28 - urn:opendaylight:params:xml:ns:yang:controller:netty?module=netty&revision=2013-11-19 - - + urn:opendaylight:params:xml:ns:yang:controller:bgp:parser:spi?module=config-bgp-parser-spi&revision=2013-11-15 + urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:spi?module=config-bgp-rib-spi&revision=2013-11-15 + urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl?module=bgp-rib-impl&revision=2013-04-09 + urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&revision=2013-10-28 + urn:opendaylight:params:xml:ns:yang:controller:netty?module=netty&revision=2013-11-19 + + - - - - prefix:bgp-extensions-impl - global-bgp-extensions - - bgpspi:extension - base-bgp-parser - - - bgpspi:extension - bgp-linkstate - - - - prefix:base-bgp-parser - base-bgp-parser - - - prefix:bgp-rib-extensions-impl - global-rib-extensions - - ribspi:extension - base-bgp-rib - - - ribspi:extension - bgp-linkstate - - - - prefix:base-bgp-rib - base-bgp-rib - - - prefix:bgp-linkstate - bgp-linkstate - - - prefix:bgp-dispatcher-impl - global-bgp-dispatcher - - bgpspi:extensions - global-bgp-extensions + + + + prefix:bgp-extensions-impl + global-bgp-extensions + + bgpspi:extension + base-bgp-parser + + + bgpspi:extension + bgp-linkstate + + + + prefix:base-bgp-parser + base-bgp-parser + + + prefix:bgp-rib-extensions-impl + global-rib-extensions + + ribspi:extension + base-bgp-rib + + + ribspi:extension + bgp-linkstate + + + + prefix:base-bgp-rib + base-bgp-rib + + + prefix:bgp-linkstate + bgp-linkstate + + + prefix:bgp-dispatcher-impl + global-bgp-dispatcher + + bgpspi:extensions + global-bgp-extensions - netty:netty-timer - global-timer + netty:netty-timer + global-timer - - netty:netty-threadgroup - global-boss-group - - - netty:netty-threadgroup - global-worker-group + + netty:netty-threadgroup + global-boss-group + + + netty:netty-threadgroup + global-worker-group - - urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:cfg?module=config-bgp-rib&revision=2013-07-01 - urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:spi?module=config-bgp-rib-spi&revision=2013-11-15 - urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl?module=bgp-rib-impl&revision=2013-04-09 - urn:opendaylight:params:xml:ns:yang:controller:bgp:topology:provider?module=config-bgp-topology-provider&revision=2013-11-15 - urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&revision=2013-10-28 - urn:opendaylight:params:xml:ns:yang:controller:netty?module=netty&revision=2013-11-19 - urn:opendaylight:params:xml:ns:yang:controller:protocol:framework?module=protocol-framework&revision=2014-03-13 - urn:opendaylight:params:xml:ns:yang:controller:topology?module=config-topology-api&revision=2013-11-15 - - + + urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:cfg?module=config-bgp-rib&revision=2013-07-01 + urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:spi?module=config-bgp-rib-spi&revision=2013-11-15 + urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl?module=bgp-rib-impl&revision=2013-04-09 + urn:opendaylight:params:xml:ns:yang:controller:bgp:topology:provider?module=config-bgp-topology-provider&revision=2013-11-15 + urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&revision=2013-10-28 + urn:opendaylight:params:xml:ns:yang:controller:netty?module=netty&revision=2013-11-19 + urn:opendaylight:params:xml:ns:yang:controller:protocol:framework?module=protocol-framework&revision=2014-03-13 + urn:opendaylight:params:xml:ns:yang:controller:topology?module=config-topology-api&revision=2013-11-15 + + - - - - prefix:timed-reconnect-strategy-factory - example-reconnect-strategy-factory - 1000 - 180000 - 2.00 - 5000 - - netty:netty-event-executor - global-event-executor - + + + + prefix:timed-reconnect-strategy-factory + example-reconnect-strategy-factory + 1000 + 180000 + 2.00 + 5000 + + netty:netty-event-executor + global-event-executor + - - prefix:rib-impl - example-bgp-rib - example-bgp-rib - 64496 - 192.0.2.2 + + prefix:rib-impl + example-bgp-rib + example-bgp-rib + 64496 + 192.0.2.2 prefix:bgp-table-type ipv4-unicast @@ -85,113 +85,113 @@ prefix:bgp-table-type linkstate - - ribspi:extensions - global-rib-extensions - + + ribspi:extensions + global-rib-extensions + prefix:bgp-dispatcher - global-bgp-dispatcher + global-bgp-dispatcher - - binding:binding-data-broker - binding-data-broker - - - prefix:reconnect-strategy-factory - example-reconnect-strategy-factory + + binding:binding-data-broker + binding-data-broker + + + prefix:reconnect-strategy-factory + example-reconnect-strategy-factory - - prefix:reconnect-strategy-factory - example-reconnect-strategy-factory - - - - prefix:bgp-reachability-ipv4 - example-ipv4-topology - - binding:binding-data-broker - binding-data-broker - - - prefix:rib - example-bgp-rib - - example-ipv4-topology - - - prefix:bgp-reachability-ipv6 - example-ipv6-topology - - binding:binding-data-broker - binding-data-broker - - - prefix:rib - example-bgp-rib - - example-ipv6-topology - - - prefix:bgp-linkstate-topology - example-linkstate-topology - - binding:binding-data-broker - binding-data-broker - - - prefix:rib - example-bgp-rib - - example-linkstate-topology - - + + prefix:reconnect-strategy-factory + example-reconnect-strategy-factory + + + + prefix:bgp-reachability-ipv4 + example-ipv4-topology + + binding:binding-data-broker + binding-data-broker + + + prefix:rib + example-bgp-rib + + example-ipv4-topology + + + prefix:bgp-reachability-ipv6 + example-ipv6-topology + + binding:binding-data-broker + binding-data-broker + + + prefix:rib + example-bgp-rib + + example-ipv6-topology + + + prefix:bgp-linkstate-topology + example-linkstate-topology + + binding:binding-data-broker + binding-data-broker + + + prefix:rib + example-bgp-rib + + example-linkstate-topology + + - - - prefix:reconnect-strategy-factory - - example-reconnect-strategy-factory - /config/modules/module[name='timed-reconnect-strategy-factory']/instance[name='example-reconnect-strategy-factory'] - - - - prefix:topology-reference - - example-ipv4-topology - /config/modules/module[name='bgp-reachability-ipv4']/instance[name='example-ipv4-topology'] - - - - prefix:rib - - example-bgp-rib - /config/modules/module[name='rib-impl']/instance[name='example-bgp-rib'] - - + + + prefix:reconnect-strategy-factory + + example-reconnect-strategy-factory + /config/modules/module[name='timed-reconnect-strategy-factory']/instance[name='example-reconnect-strategy-factory'] + + + + prefix:topology-reference + + example-ipv4-topology + /config/modules/module[name='bgp-reachability-ipv4']/instance[name='example-ipv4-topology'] + + + + prefix:rib + + example-bgp-rib + /config/modules/module[name='rib-impl']/instance[name='example-bgp-rib'] + + prefix:rib-instance example-bgp-rib - /config/modules/module[name='rib-impl']/instance[name='example-bgp-rib'] - - - - prefix:topology-reference - - example-ipv6-topology - /config/modules/module[name='bgp-reachability-ipv6']/instance[name='example-ipv6-topology'] - - - - prefix:topology-reference - - example-linkstate-topology - /config/modules/module[name='bgp-linkstate-topology']/instance[name='example-linkstate-topology'] - - - - + /config/modules/module[name='rib-impl']/instance[name='example-bgp-rib'] + + + + prefix:topology-reference + + example-ipv6-topology + /config/modules/module[name='bgp-reachability-ipv6']/instance[name='example-ipv6-topology'] + + + + prefix:topology-reference + + example-linkstate-topology + /config/modules/module[name='bgp-linkstate-topology']/instance[name='example-linkstate-topology'] + + + + - + diff --git a/bgp/linkstate-config/src/main/java/org/opendaylight/controller/config/yang/bgp/linkstate/LinkstateModule.java b/bgp/linkstate-config/src/main/java/org/opendaylight/controller/config/yang/bgp/linkstate/LinkstateModule.java index 9638e50f94..3e5209e7c9 100644 --- a/bgp/linkstate-config/src/main/java/org/opendaylight/controller/config/yang/bgp/linkstate/LinkstateModule.java +++ b/bgp/linkstate-config/src/main/java/org/opendaylight/controller/config/yang/bgp/linkstate/LinkstateModule.java @@ -26,60 +26,61 @@ import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderContext; /** * */ -public final class LinkstateModule extends org.opendaylight.controller.config.yang.bgp.linkstate.AbstractLinkstateModule -{ +public final class LinkstateModule extends org.opendaylight.controller.config.yang.bgp.linkstate.AbstractLinkstateModule { - public LinkstateModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { - super(identifier, dependencyResolver); - } + public LinkstateModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } - public LinkstateModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, final LinkstateModule oldModule, final java.lang.AutoCloseable oldInstance) { - super(identifier, dependencyResolver, oldModule, oldInstance); - } + public LinkstateModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, final LinkstateModule oldModule, + final java.lang.AutoCloseable oldInstance) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } - @Override - public void customValidation() { - // Add custom validation for module attributes here. - } + @Override + public void customValidation() { + // Add custom validation for module attributes here. + } - @Override - public java.lang.AutoCloseable createInstance() { - final class LinkstateExtension implements AutoCloseable, BGPExtensionProviderActivator, RIBExtensionProviderActivator { - final BGPExtensionProviderActivator bgpact = new BGPActivator(); - final RIBExtensionProviderActivator ribact = new RIBActivator(); + @Override + public java.lang.AutoCloseable createInstance() { + final class LinkstateExtension implements AutoCloseable, BGPExtensionProviderActivator, RIBExtensionProviderActivator { + final BGPExtensionProviderActivator bgpact = new BGPActivator(); + final RIBExtensionProviderActivator ribact = new RIBActivator(); - @Override - public void close() { - if (bgpact != null) { - bgpact.stop(); - } - if (ribact != null) { - ribact.stopRIBExtensionProvider(); - } - } + @Override + public void close() { + if (bgpact != null) { + bgpact.stop(); + } + if (ribact != null) { + ribact.stopRIBExtensionProvider(); + } + } - @Override - public void startRIBExtensionProvider( - final RIBExtensionProviderContext context) { - ribact.startRIBExtensionProvider(context); - } + @Override + public void startRIBExtensionProvider(final RIBExtensionProviderContext context) { + ribact.startRIBExtensionProvider(context); + } - @Override - public void stopRIBExtensionProvider() { - ribact.stopRIBExtensionProvider(); - } + @Override + public void stopRIBExtensionProvider() { + ribact.stopRIBExtensionProvider(); + } - @Override - public void start(final BGPExtensionProviderContext context) { - bgpact.start(context); - } + @Override + public void start(final BGPExtensionProviderContext context) { + bgpact.start(context); + } - @Override - public void stop() { - bgpact.stop(); - } - } + @Override + public void stop() { + bgpact.stop(); + } + } - return new LinkstateExtension(); - } + return new LinkstateExtension(); + } } diff --git a/bgp/linkstate-config/src/main/java/org/opendaylight/controller/config/yang/bgp/linkstate/LinkstateModuleFactory.java b/bgp/linkstate-config/src/main/java/org/opendaylight/controller/config/yang/bgp/linkstate/LinkstateModuleFactory.java index b9ccd3e3a0..c89eb20cc7 100644 --- a/bgp/linkstate-config/src/main/java/org/opendaylight/controller/config/yang/bgp/linkstate/LinkstateModuleFactory.java +++ b/bgp/linkstate-config/src/main/java/org/opendaylight/controller/config/yang/bgp/linkstate/LinkstateModuleFactory.java @@ -6,21 +6,19 @@ * and is available at http://www.eclipse.org/legal/epl-v10.html */ /** -* Generated file + * Generated file -* Generated from: yang module name: config-bgp-linkstate yang module local name: bgp-linkstate -* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator -* Generated at: Sat Nov 16 08:52:43 CET 2013 -* -* Do not modify this file unless it is present under src/main directory -*/ + * Generated from: yang module name: config-bgp-linkstate yang module local name: bgp-linkstate + * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator + * Generated at: Sat Nov 16 08:52:43 CET 2013 + * + * Do not modify this file unless it is present under src/main directory + */ package org.opendaylight.controller.config.yang.bgp.linkstate; /** * */ -public class LinkstateModuleFactory extends org.opendaylight.controller.config.yang.bgp.linkstate.AbstractLinkstateModuleFactory -{ - +public class LinkstateModuleFactory extends org.opendaylight.controller.config.yang.bgp.linkstate.AbstractLinkstateModuleFactory { } diff --git a/bgp/linkstate-config/src/test/java/org/opendaylight/controller/config/yang/bgp/linkstate/LinkstateModuleTest.java b/bgp/linkstate-config/src/test/java/org/opendaylight/controller/config/yang/bgp/linkstate/LinkstateModuleTest.java index efc2deada4..011f047be9 100644 --- a/bgp/linkstate-config/src/test/java/org/opendaylight/controller/config/yang/bgp/linkstate/LinkstateModuleTest.java +++ b/bgp/linkstate-config/src/test/java/org/opendaylight/controller/config/yang/bgp/linkstate/LinkstateModuleTest.java @@ -9,7 +9,9 @@ package org.opendaylight.controller.config.yang.bgp.linkstate; import com.google.common.collect.Lists; + import javax.management.ObjectName; + import org.junit.Before; import org.junit.Test; import org.opendaylight.controller.config.api.jmx.CommitStatus; @@ -28,9 +30,7 @@ public class LinkstateModuleTest extends AbstractConfigTest { @Before public void setUp() { - super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(mockedContext, - new LinkstateModuleFactory(), - new SimpleBGPExtensionProviderContextModuleFactory(), new RIBExtensionsImplModuleFactory())); + super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(mockedContext, new LinkstateModuleFactory(), new SimpleBGPExtensionProviderContextModuleFactory(), new RIBExtensionsImplModuleFactory())); } @Test @@ -52,7 +52,7 @@ public class LinkstateModuleTest extends AbstractConfigTest { private CommitStatus createLinkstateModuleInstance() throws Exception { final ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction(); - final ObjectName linkstateON = transaction.createModule(FACTORY_NAME, INSTANCE_NAME); + final ObjectName linkstateON = transaction.createModule(FACTORY_NAME, INSTANCE_NAME); SimpleBGPExtensionProviderContextModuleTest.createBGPExtensionsModuleInstance(transaction, Lists.newArrayList(linkstateON)); RIBExtensionsImplModuleTest.createRIBExtensionsModuleInstance(transaction, Lists.newArrayList(linkstateON)); diff --git a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/BGPActivator.java b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/BGPActivator.java index a2bb50dcc4..3b5f127439 100644 --- a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/BGPActivator.java +++ b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/BGPActivator.java @@ -21,24 +21,24 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type */ public final class BGPActivator extends AbstractBGPExtensionProviderActivator { - private static final int LINKSTATE_AFI = 16388; + private static final int LINKSTATE_AFI = 16388; - private static final int LINKSTATE_SAFI = 71; + private static final int LINKSTATE_SAFI = 71; - @Override - protected List startImpl(final BGPExtensionProviderContext context) { - final List regs = new ArrayList<>(); + @Override + protected List startImpl(final BGPExtensionProviderContext context) { + final List regs = new ArrayList<>(); - regs.add(context.registerAddressFamily(LinkstateAddressFamily.class, LINKSTATE_AFI)); - regs.add(context.registerSubsequentAddressFamily(LinkstateSubsequentAddressFamily.class, LINKSTATE_SAFI)); + regs.add(context.registerAddressFamily(LinkstateAddressFamily.class, LINKSTATE_AFI)); + regs.add(context.registerSubsequentAddressFamily(LinkstateSubsequentAddressFamily.class, LINKSTATE_SAFI)); - regs.add(context.registerNlriParser(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class, - new LinkstateNlriParser(false))); - regs.add(context.registerNlriParser(LinkstateAddressFamily.class, MplsLabeledVpnSubsequentAddressFamily.class, - new LinkstateNlriParser(true))); + regs.add(context.registerNlriParser(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class, + new LinkstateNlriParser(false))); + regs.add(context.registerNlriParser(LinkstateAddressFamily.class, MplsLabeledVpnSubsequentAddressFamily.class, + new LinkstateNlriParser(true))); - regs.add(context.registerAttributeParser(LinkstateAttributeParser.TYPE, new LinkstateAttributeParser())); + regs.add(context.registerAttributeParser(LinkstateAttributeParser.TYPE, new LinkstateAttributeParser())); - return regs; - } + return regs; + } } diff --git a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAdjRIBsIn.java b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAdjRIBsIn.java index 2d4288ee9d..1d9a4bc8f2 100644 --- a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAdjRIBsIn.java +++ b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAdjRIBsIn.java @@ -7,6 +7,9 @@ */ package org.opendaylight.protocol.bgp.linkstate; +import com.google.common.base.Objects.ToStringHelper; +import com.google.common.base.Preconditions; + import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction; import org.opendaylight.protocol.bgp.rib.RibReference; import org.opendaylight.protocol.bgp.rib.spi.AbstractAdjRIBsIn; @@ -53,151 +56,149 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Objects.ToStringHelper; -import com.google.common.base.Preconditions; - final class LinkstateAdjRIBsIn extends AbstractAdjRIBsIn { - private abstract static class LinkstateRIBEntryData extends - RIBEntryData { - private final A lsattr; - - protected LinkstateRIBEntryData(final PathAttributes attributes, final A lsattr) { - super(attributes); - this.lsattr = lsattr; - } - - protected abstract AttributeType createAttributes(A lsattr); - - protected abstract ObjectType createObject(CLinkstateDestination key); - - @Override - protected final LinkstateRoute getDataObject(final CLinkstateDestination key, final InstanceIdentifier id) { - final LinkstateRouteBuilder builder = new LinkstateRouteBuilder(); - - builder.setKey(InstanceIdentifier.keyOf(id)); - builder.setIdentifier(key.getIdentifier()); - builder.setProtocolId(key.getProtocolId()); - builder.setDistinguisher(key.getDistinguisher()); - builder.setAttributes(new AttributesBuilder(getPathAttributes()).addAugmentation(Attributes1.class, - new Attributes1Builder().setAttributeType(Preconditions.checkNotNull(createAttributes(this.lsattr))).build()).build()); - builder.setObjectType(Preconditions.checkNotNull(createObject(key))); - - return builder.build(); - } - - @Override - protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) { - return toStringHelper.add("lsattr", this.lsattr); - } - } - - private static final Logger LOG = LoggerFactory.getLogger(LinkstateAdjRIBsIn.class); - - LinkstateAdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) { - super(trans, rib, key); - } - - @Override - public InstanceIdentifier identifierForKey(final InstanceIdentifier basePath, final CLinkstateDestination key) { - return basePath.builder().child(LinkstateRoutes.class).child(LinkstateRoute.class, - new LinkstateRouteKey(LinkstateNlriParser.serializeNlri(key))).toInstance(); - } - - @Override - public void addRoutes(final DataModificationTransaction trans, final Peer peer, final MpReachNlri nlri, - final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributes attributes) { - LOG.debug("Passed nlri {}", nlri); - final LinkstateDestination keys = ((DestinationLinkstateCase) nlri.getAdvertizedRoutes().getDestinationType()).getDestinationLinkstate(); - if (keys == null) { - LOG.debug("No destinations present in advertized routes"); - return; - } - - LOG.debug("Iterating over route destinations {}", keys); - - for (final CLinkstateDestination key : keys.getCLinkstateDestination()) { - LOG.debug("Processing route key {}", key); - - LinkStateAttribute lsattr = null; - final PathAttributes1 pa = attributes.getAugmentation(PathAttributes1.class); - if (pa != null) { - final LinkstatePathAttribute lpa = pa.getLinkstatePathAttribute(); - if (lpa != null) { - lsattr = lpa.getLinkStateAttribute(); - } - } - - RIBEntryData data = null; - switch (key.getNlriType()) { - case Ipv4Prefix: - case Ipv6Prefix: - data = new LinkstateRIBEntryData(attributes, (PrefixAttributesCase) lsattr) { - @Override - protected AttributeType createAttributes(final PrefixAttributesCase lsattr) { - final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.PrefixCaseBuilder b = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.PrefixCaseBuilder(); - if (lsattr != null && lsattr.getPrefixAttributes() != null) { - b.setPrefixAttributes(new PrefixAttributesBuilder(lsattr.getPrefixAttributes()).build()); - } - return b.build(); - } - @Override - protected PrefixCase createObject(final CLinkstateDestination key) { - final PrefixCaseBuilder b = new PrefixCaseBuilder(key.getPrefixDescriptors()); - b.setAdvertisingNodeDescriptors(new AdvertisingNodeDescriptorsBuilder(key.getLocalNodeDescriptors()).build()); - return b.build(); - } - }; - break; - case Link: - data = new LinkstateRIBEntryData(attributes, (LinkAttributesCase) lsattr) { - @Override - protected AttributeType createAttributes(final LinkAttributesCase lsattr) { - final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.LinkCaseBuilder b = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.LinkCaseBuilder(); - if (lsattr != null && lsattr.getLinkAttributes() != null) { - b.setLinkAttributes(new LinkAttributesBuilder(lsattr.getLinkAttributes()).build()); - } - return b.build(); - } - - @Override - protected LinkCase createObject(final CLinkstateDestination key) { - final LinkCaseBuilder b = new LinkCaseBuilder(); - b.setLinkDescriptors(new LinkDescriptorsBuilder(key.getLinkDescriptors()).build()); - b.setLocalNodeDescriptors(new LocalNodeDescriptorsBuilder(key.getLocalNodeDescriptors()).build()); - b.setRemoteNodeDescriptors(new RemoteNodeDescriptorsBuilder(key.getRemoteNodeDescriptors()).build()); - return b.build(); - } - }; - break; - case Node: - data = new LinkstateRIBEntryData(attributes, (NodeAttributesCase) lsattr) { - @Override - protected AttributeType createAttributes(final NodeAttributesCase lsattr) { - final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.NodeCaseBuilder b = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.NodeCaseBuilder(); - if (lsattr != null && lsattr.getNodeAttributes() != null) { - b.setNodeAttributes(new NodeAttributesBuilder(lsattr.getNodeAttributes()).build()); - } - return b.build(); - } - - @Override - protected NodeCase createObject(final CLinkstateDestination key) { - return new NodeCaseBuilder().setNodeDescriptors(new NodeDescriptorsBuilder(key.getLocalNodeDescriptors()).build()).build(); - } - }; - break; - } - super.add(trans, peer, key, data); - } - } - - @Override - public void removeRoutes(final DataModificationTransaction trans, final Peer peer, final MpUnreachNlri nlri) { - final DestinationLinkstate keys = ((org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationLinkstateCase) nlri.getWithdrawnRoutes().getDestinationType()).getDestinationLinkstate(); - - for (final CLinkstateDestination key : keys.getCLinkstateDestination()) { - super.remove(trans, peer, key); - } - } + private abstract static class LinkstateRIBEntryData extends + RIBEntryData { + private final A lsattr; + + protected LinkstateRIBEntryData(final PathAttributes attributes, final A lsattr) { + super(attributes); + this.lsattr = lsattr; + } + + protected abstract AttributeType createAttributes(A lsattr); + + protected abstract ObjectType createObject(CLinkstateDestination key); + + @Override + protected final LinkstateRoute getDataObject(final CLinkstateDestination key, final InstanceIdentifier id) { + final LinkstateRouteBuilder builder = new LinkstateRouteBuilder(); + + builder.setKey(InstanceIdentifier.keyOf(id)); + builder.setIdentifier(key.getIdentifier()); + builder.setProtocolId(key.getProtocolId()); + builder.setDistinguisher(key.getDistinguisher()); + builder.setAttributes(new AttributesBuilder(getPathAttributes()).addAugmentation(Attributes1.class, + new Attributes1Builder().setAttributeType(Preconditions.checkNotNull(createAttributes(this.lsattr))).build()).build()); + builder.setObjectType(Preconditions.checkNotNull(createObject(key))); + + return builder.build(); + } + + @Override + protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) { + return toStringHelper.add("lsattr", this.lsattr); + } + } + + private static final Logger LOG = LoggerFactory.getLogger(LinkstateAdjRIBsIn.class); + + LinkstateAdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) { + super(trans, rib, key); + } + + @Override + public InstanceIdentifier identifierForKey(final InstanceIdentifier basePath, final CLinkstateDestination key) { + return basePath.builder().child(LinkstateRoutes.class).child(LinkstateRoute.class, + new LinkstateRouteKey(LinkstateNlriParser.serializeNlri(key))).toInstance(); + } + + @Override + public void addRoutes(final DataModificationTransaction trans, final Peer peer, final MpReachNlri nlri, + final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributes attributes) { + LOG.debug("Passed nlri {}", nlri); + final LinkstateDestination keys = ((DestinationLinkstateCase) nlri.getAdvertizedRoutes().getDestinationType()).getDestinationLinkstate(); + if (keys == null) { + LOG.debug("No destinations present in advertized routes"); + return; + } + + LOG.debug("Iterating over route destinations {}", keys); + + for (final CLinkstateDestination key : keys.getCLinkstateDestination()) { + LOG.debug("Processing route key {}", key); + + LinkStateAttribute lsattr = null; + final PathAttributes1 pa = attributes.getAugmentation(PathAttributes1.class); + if (pa != null) { + final LinkstatePathAttribute lpa = pa.getLinkstatePathAttribute(); + if (lpa != null) { + lsattr = lpa.getLinkStateAttribute(); + } + } + + RIBEntryData data = null; + switch (key.getNlriType()) { + case Ipv4Prefix: + case Ipv6Prefix: + data = new LinkstateRIBEntryData(attributes, (PrefixAttributesCase) lsattr) { + @Override + protected AttributeType createAttributes(final PrefixAttributesCase lsattr) { + final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.PrefixCaseBuilder b = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.PrefixCaseBuilder(); + if (lsattr != null && lsattr.getPrefixAttributes() != null) { + b.setPrefixAttributes(new PrefixAttributesBuilder(lsattr.getPrefixAttributes()).build()); + } + return b.build(); + } + + @Override + protected PrefixCase createObject(final CLinkstateDestination key) { + final PrefixCaseBuilder b = new PrefixCaseBuilder(key.getPrefixDescriptors()); + b.setAdvertisingNodeDescriptors(new AdvertisingNodeDescriptorsBuilder(key.getLocalNodeDescriptors()).build()); + return b.build(); + } + }; + break; + case Link: + data = new LinkstateRIBEntryData(attributes, (LinkAttributesCase) lsattr) { + @Override + protected AttributeType createAttributes(final LinkAttributesCase lsattr) { + final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.LinkCaseBuilder b = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.LinkCaseBuilder(); + if (lsattr != null && lsattr.getLinkAttributes() != null) { + b.setLinkAttributes(new LinkAttributesBuilder(lsattr.getLinkAttributes()).build()); + } + return b.build(); + } + + @Override + protected LinkCase createObject(final CLinkstateDestination key) { + final LinkCaseBuilder b = new LinkCaseBuilder(); + b.setLinkDescriptors(new LinkDescriptorsBuilder(key.getLinkDescriptors()).build()); + b.setLocalNodeDescriptors(new LocalNodeDescriptorsBuilder(key.getLocalNodeDescriptors()).build()); + b.setRemoteNodeDescriptors(new RemoteNodeDescriptorsBuilder(key.getRemoteNodeDescriptors()).build()); + return b.build(); + } + }; + break; + case Node: + data = new LinkstateRIBEntryData(attributes, (NodeAttributesCase) lsattr) { + @Override + protected AttributeType createAttributes(final NodeAttributesCase lsattr) { + final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.NodeCaseBuilder b = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.NodeCaseBuilder(); + if (lsattr != null && lsattr.getNodeAttributes() != null) { + b.setNodeAttributes(new NodeAttributesBuilder(lsattr.getNodeAttributes()).build()); + } + return b.build(); + } + + @Override + protected NodeCase createObject(final CLinkstateDestination key) { + return new NodeCaseBuilder().setNodeDescriptors(new NodeDescriptorsBuilder(key.getLocalNodeDescriptors()).build()).build(); + } + }; + break; + } + super.add(trans, peer, key, data); + } + } + + @Override + public void removeRoutes(final DataModificationTransaction trans, final Peer peer, final MpUnreachNlri nlri) { + final DestinationLinkstate keys = ((org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationLinkstateCase) nlri.getWithdrawnRoutes().getDestinationType()).getDestinationLinkstate(); + + for (final CLinkstateDestination key : keys.getCLinkstateDestination()) { + super.remove(trans, peer, key); + } + } } diff --git a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAttributeParser.java b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAttributeParser.java index 3e2da3c794..7caf6fcd40 100644 --- a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAttributeParser.java +++ b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAttributeParser.java @@ -7,6 +7,12 @@ */ package org.opendaylight.protocol.bgp.linkstate; +import com.google.common.base.Charsets; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Lists; +import com.google.common.collect.Multimap; +import com.google.common.primitives.UnsignedBytes; + import io.netty.buffer.ByteBuf; import java.util.Arrays; @@ -57,335 +63,329 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Charsets; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Lists; -import com.google.common.collect.Multimap; -import com.google.common.primitives.UnsignedBytes; - /** * Parser for Link State Path Attribute. - * + * * @see BGP-LS draft */ public class LinkstateAttributeParser implements AttributeParser { - // TODO: replace with actual values by IANA - public static final int TYPE = 99; + // TODO: replace with actual values by IANA + public static final int TYPE = 99; - private static final Logger LOG = LoggerFactory.getLogger(LinkstateAttributeParser.class); + private static final Logger LOG = LoggerFactory.getLogger(LinkstateAttributeParser.class); - private static final int ROUTE_TAG_LENGTH = 4; + private static final int ROUTE_TAG_LENGTH = 4; - private static final int EXTENDED_ROUTE_TAG_LENGTH = 8; + private static final int EXTENDED_ROUTE_TAG_LENGTH = 8; - private static final int SRLG_LENGTH = 4; + private static final int SRLG_LENGTH = 4; - private static final int UNRESERVED_BW_COUNT = 8; + private static final int UNRESERVED_BW_COUNT = 8; - private static final int BANDWIDTH_LENGTH = 4; + private static final int BANDWIDTH_LENGTH = 4; - private NlriType getNlriType(final PathAttributesBuilder pab) { - final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.PathAttributes1 mpr = pab.getAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.PathAttributes1.class); - if (mpr != null && mpr.getMpReachNlri() != null) { - final DestinationType dt = mpr.getMpReachNlri().getAdvertizedRoutes().getDestinationType(); - if (dt instanceof DestinationLinkstateCase) { - for (final CLinkstateDestination d : ((DestinationLinkstateCase) dt).getDestinationLinkstate().getCLinkstateDestination()) { - return d.getNlriType(); - } - } - } else { - LOG.debug("No MP_REACH attribute present"); - } - final PathAttributes2 mpu = pab.getAugmentation(PathAttributes2.class); - if (mpu != null && mpu.getMpUnreachNlri() != null) { - final DestinationType dt = mpu.getMpUnreachNlri().getWithdrawnRoutes().getDestinationType(); - if (dt instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationLinkstateCase) { - for (final CLinkstateDestination d : ((org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationLinkstateCase) dt).getDestinationLinkstate().getCLinkstateDestination()) { - return d.getNlriType(); - } - } - } else { - LOG.debug("No MP_UNREACH attribute present"); - } - return null; - } + private NlriType getNlriType(final PathAttributesBuilder pab) { + final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.PathAttributes1 mpr = pab.getAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.PathAttributes1.class); + if (mpr != null && mpr.getMpReachNlri() != null) { + final DestinationType dt = mpr.getMpReachNlri().getAdvertizedRoutes().getDestinationType(); + if (dt instanceof DestinationLinkstateCase) { + for (final CLinkstateDestination d : ((DestinationLinkstateCase) dt).getDestinationLinkstate().getCLinkstateDestination()) { + return d.getNlriType(); + } + } + } else { + LOG.debug("No MP_REACH attribute present"); + } + final PathAttributes2 mpu = pab.getAugmentation(PathAttributes2.class); + if (mpu != null && mpu.getMpUnreachNlri() != null) { + final DestinationType dt = mpu.getMpUnreachNlri().getWithdrawnRoutes().getDestinationType(); + if (dt instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationLinkstateCase) { + for (final CLinkstateDestination d : ((org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationLinkstateCase) dt).getDestinationLinkstate().getCLinkstateDestination()) { + return d.getNlriType(); + } + } + } else { + LOG.debug("No MP_UNREACH attribute present"); + } + return null; + } - @Override - public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) throws BGPParsingException { - final NlriType type = getNlriType(builder); - if (type == null) { - LOG.warn("No Linkstate NLRI found, not parsing Linkstate attribute"); - return; - } - final PathAttributes1 a = new PathAttributes1Builder().setLinkstatePathAttribute(parseLinkState(type, buffer)).build(); - builder.addAugmentation(PathAttributes1.class, a); - } + @Override + public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) throws BGPParsingException { + final NlriType type = getNlriType(builder); + if (type == null) { + LOG.warn("No Linkstate NLRI found, not parsing Linkstate attribute"); + return; + } + final PathAttributes1 a = new PathAttributes1Builder().setLinkstatePathAttribute(parseLinkState(type, buffer)).build(); + builder.addAugmentation(PathAttributes1.class, a); + } - private static LinkstatePathAttribute parseLinkState(final NlriType nlri, final ByteBuf buffer) throws BGPParsingException { - /* - * e.g. IS-IS Area Identifier TLV can occur multiple times - */ - final Multimap map = HashMultimap.create(); - while (buffer.isReadable()) { - final int type = buffer.readUnsignedShort(); - final int length = buffer.readUnsignedShort(); - final byte[] value = ByteArray.readBytes(buffer, length); - map.put(type, value); - } - final LinkstatePathAttributeBuilder builder = new LinkstatePathAttributeBuilder(); + private static LinkstatePathAttribute parseLinkState(final NlriType nlri, final ByteBuf buffer) throws BGPParsingException { + /* + * e.g. IS-IS Area Identifier TLV can occur multiple times + */ + final Multimap map = HashMultimap.create(); + while (buffer.isReadable()) { + final int type = buffer.readUnsignedShort(); + final int length = buffer.readUnsignedShort(); + final byte[] value = ByteArray.readBytes(buffer, length); + map.put(type, value); + } + final LinkstatePathAttributeBuilder builder = new LinkstatePathAttributeBuilder(); - switch (nlri) { - case Ipv4Prefix: - case Ipv6Prefix: - builder.setLinkStateAttribute(parsePrefixAttributes(map)); - return builder.build(); - case Link: - builder.setLinkStateAttribute(parseLinkAttributes(map)); - return builder.build(); - case Node: - builder.setLinkStateAttribute(parseNodeAttributes(map)); - return builder.build(); - } - throw new IllegalStateException("Unhandled NLRI type " + nlri); - } + switch (nlri) { + case Ipv4Prefix: + case Ipv6Prefix: + builder.setLinkStateAttribute(parsePrefixAttributes(map)); + return builder.build(); + case Link: + builder.setLinkStateAttribute(parseLinkAttributes(map)); + return builder.build(); + case Node: + builder.setLinkStateAttribute(parseNodeAttributes(map)); + return builder.build(); + } + throw new IllegalStateException("Unhandled NLRI type " + nlri); + } - /** - * Parse Link Attributes. - * - * @param attributes key is the tlv type and value is the value of the tlv - * @return {@link LinkStateAttribute} - */ - private static LinkStateAttribute parseLinkAttributes(final Multimap attributes) { - final LinkAttributesBuilder builder = new LinkAttributesBuilder(); - for (final Entry entry : attributes.entries()) { - LOG.trace("Link attribute TLV {}", entry.getKey()); - final int key = entry.getKey(); - final byte[] value = entry.getValue(); - switch (key) { - case TlvCode.LOCAL_IPV4_ROUTER_ID: - final Ipv4RouterIdentifier lipv4 = new Ipv4RouterIdentifier(Ipv4Util.addressForBytes(value)); - builder.setLocalIpv4RouterId(lipv4); - LOG.debug("Parsed IPv4 Router-ID of local node: {}", lipv4); - break; - case TlvCode.LOCAL_IPV6_ROUTER_ID: - final Ipv6RouterIdentifier lipv6 = new Ipv6RouterIdentifier(Ipv6Util.addressForBytes(value)); - builder.setLocalIpv6RouterId(lipv6); - LOG.debug("Parsed IPv6 Router-ID of local node: {}", lipv6); - break; - case TlvCode.REMOTE_IPV4_ROUTER_ID: - final Ipv4RouterIdentifier ripv4 = new Ipv4RouterIdentifier(Ipv4Util.addressForBytes(value)); - builder.setRemoteIpv4RouterId(ripv4); - LOG.debug("Parsed IPv4 Router-ID of remote node: {}", ripv4); - break; - case TlvCode.REMOTE_IPV6_ROUTER_ID: - final Ipv6RouterIdentifier ripv6 = new Ipv6RouterIdentifier(Ipv6Util.addressForBytes(value)); - builder.setRemoteIpv6RouterId(ripv6); - LOG.debug("Parsed IPv6 Router-ID of remote node: {}", ripv6); - break; - case TlvCode.ADMIN_GROUP: - builder.setAdminGroup(new AdministrativeGroup(ByteArray.bytesToLong(value))); - LOG.debug("Parsed Administrative Group {}", builder.getAdminGroup()); - break; - case TlvCode.MAX_BANDWIDTH: - builder.setMaxLinkBandwidth(new Bandwidth(value)); - LOG.debug("Parsed Max Bandwidth {}", builder.getMaxLinkBandwidth()); - break; - case TlvCode.MAX_RESERVABLE_BANDWIDTH: - builder.setMaxReservableBandwidth(new Bandwidth(value)); - LOG.debug("Parsed Max Reservable Bandwidth {}", builder.getMaxReservableBandwidth()); - break; - case TlvCode.UNRESERVED_BANDWIDTH: - int index = 0; - final List unreservedBandwidth = Lists.newArrayList(); - for (int i = 0; i < UNRESERVED_BW_COUNT; i++) { - final byte[] v = ByteArray.subByte(value, index, BANDWIDTH_LENGTH); - unreservedBandwidth.add(new UnreservedBandwidthBuilder().setBandwidth(new Bandwidth(v)).setPriority((short) i).build()); - index += BANDWIDTH_LENGTH; - } - builder.setUnreservedBandwidth(unreservedBandwidth); - LOG.debug("Parsed Unreserved Bandwidth {}", builder.getUnreservedBandwidth()); - break; - case TlvCode.TE_METRIC: - builder.setTeMetric(new TeMetric(ByteArray.bytesToLong(value))); - LOG.debug("Parsed Metric {}", builder.getTeMetric()); - break; - case TlvCode.LINK_PROTECTION_TYPE: - final LinkProtectionType lpt = LinkProtectionType.forValue(UnsignedBytes.toInt(value[0])); - if (lpt == null) { - LOG.warn("Link Protection Type not recognized: {}", UnsignedBytes.toInt(value[0])); - break; - } - builder.setLinkProtection(lpt); - LOG.debug("Parsed Link Protection Type {}", lpt); - break; - case TlvCode.MPLS_PROTOCOL: - final boolean[] bits = ByteArray.parseBits(value[0]); - builder.setMplsProtocol(new MplsProtocolMask(bits[0], bits[1])); - LOG.debug("Parsed MPLS Protocols: {}", builder.getMplsProtocol()); - break; - case TlvCode.METRIC: - builder.setMetric(new Metric(ByteArray.bytesToLong(value))); - LOG.debug("Parsed Metric {}", builder.getMetric()); - break; - case TlvCode.SHARED_RISK_LINK_GROUP: - int i = 0; - final List sharedRiskLinkGroups = Lists.newArrayList(); - while (i != value.length) { - sharedRiskLinkGroups.add(new SrlgId(ByteArray.bytesToLong(ByteArray.subByte(value, i, SRLG_LENGTH)))); - i += SRLG_LENGTH; - } - builder.setSharedRiskLinkGroups(sharedRiskLinkGroups); - LOG.debug("Parsed Shared Risk Link Groups {}", Arrays.toString(sharedRiskLinkGroups.toArray())); - break; - case TlvCode.LINK_OPAQUE: - final byte[] opaque = value; - LOG.debug("Parsed Opaque value : {}", Arrays.toString(opaque)); - break; - case TlvCode.LINK_NAME: - final String name = new String(value, Charsets.US_ASCII); - builder.setLinkName(name); - LOG.debug("Parsed Link Name : {}", name); - break; - default: - LOG.warn("TLV {} is not a valid link attribute, ignoring it", key); - } - } - LOG.trace("Finished parsing Link Attributes."); - return new LinkAttributesCaseBuilder().setLinkAttributes(builder.build()).build(); - } + /** + * Parse Link Attributes. + * + * @param attributes key is the tlv type and value is the value of the tlv + * @return {@link LinkStateAttribute} + */ + private static LinkStateAttribute parseLinkAttributes(final Multimap attributes) { + final LinkAttributesBuilder builder = new LinkAttributesBuilder(); + for (final Entry entry : attributes.entries()) { + LOG.trace("Link attribute TLV {}", entry.getKey()); + final int key = entry.getKey(); + final byte[] value = entry.getValue(); + switch (key) { + case TlvCode.LOCAL_IPV4_ROUTER_ID: + final Ipv4RouterIdentifier lipv4 = new Ipv4RouterIdentifier(Ipv4Util.addressForBytes(value)); + builder.setLocalIpv4RouterId(lipv4); + LOG.debug("Parsed IPv4 Router-ID of local node: {}", lipv4); + break; + case TlvCode.LOCAL_IPV6_ROUTER_ID: + final Ipv6RouterIdentifier lipv6 = new Ipv6RouterIdentifier(Ipv6Util.addressForBytes(value)); + builder.setLocalIpv6RouterId(lipv6); + LOG.debug("Parsed IPv6 Router-ID of local node: {}", lipv6); + break; + case TlvCode.REMOTE_IPV4_ROUTER_ID: + final Ipv4RouterIdentifier ripv4 = new Ipv4RouterIdentifier(Ipv4Util.addressForBytes(value)); + builder.setRemoteIpv4RouterId(ripv4); + LOG.debug("Parsed IPv4 Router-ID of remote node: {}", ripv4); + break; + case TlvCode.REMOTE_IPV6_ROUTER_ID: + final Ipv6RouterIdentifier ripv6 = new Ipv6RouterIdentifier(Ipv6Util.addressForBytes(value)); + builder.setRemoteIpv6RouterId(ripv6); + LOG.debug("Parsed IPv6 Router-ID of remote node: {}", ripv6); + break; + case TlvCode.ADMIN_GROUP: + builder.setAdminGroup(new AdministrativeGroup(ByteArray.bytesToLong(value))); + LOG.debug("Parsed Administrative Group {}", builder.getAdminGroup()); + break; + case TlvCode.MAX_BANDWIDTH: + builder.setMaxLinkBandwidth(new Bandwidth(value)); + LOG.debug("Parsed Max Bandwidth {}", builder.getMaxLinkBandwidth()); + break; + case TlvCode.MAX_RESERVABLE_BANDWIDTH: + builder.setMaxReservableBandwidth(new Bandwidth(value)); + LOG.debug("Parsed Max Reservable Bandwidth {}", builder.getMaxReservableBandwidth()); + break; + case TlvCode.UNRESERVED_BANDWIDTH: + int index = 0; + final List unreservedBandwidth = Lists.newArrayList(); + for (int i = 0; i < UNRESERVED_BW_COUNT; i++) { + final byte[] v = ByteArray.subByte(value, index, BANDWIDTH_LENGTH); + unreservedBandwidth.add(new UnreservedBandwidthBuilder().setBandwidth(new Bandwidth(v)).setPriority((short) i).build()); + index += BANDWIDTH_LENGTH; + } + builder.setUnreservedBandwidth(unreservedBandwidth); + LOG.debug("Parsed Unreserved Bandwidth {}", builder.getUnreservedBandwidth()); + break; + case TlvCode.TE_METRIC: + builder.setTeMetric(new TeMetric(ByteArray.bytesToLong(value))); + LOG.debug("Parsed Metric {}", builder.getTeMetric()); + break; + case TlvCode.LINK_PROTECTION_TYPE: + final LinkProtectionType lpt = LinkProtectionType.forValue(UnsignedBytes.toInt(value[0])); + if (lpt == null) { + LOG.warn("Link Protection Type not recognized: {}", UnsignedBytes.toInt(value[0])); + break; + } + builder.setLinkProtection(lpt); + LOG.debug("Parsed Link Protection Type {}", lpt); + break; + case TlvCode.MPLS_PROTOCOL: + final boolean[] bits = ByteArray.parseBits(value[0]); + builder.setMplsProtocol(new MplsProtocolMask(bits[0], bits[1])); + LOG.debug("Parsed MPLS Protocols: {}", builder.getMplsProtocol()); + break; + case TlvCode.METRIC: + builder.setMetric(new Metric(ByteArray.bytesToLong(value))); + LOG.debug("Parsed Metric {}", builder.getMetric()); + break; + case TlvCode.SHARED_RISK_LINK_GROUP: + int i = 0; + final List sharedRiskLinkGroups = Lists.newArrayList(); + while (i != value.length) { + sharedRiskLinkGroups.add(new SrlgId(ByteArray.bytesToLong(ByteArray.subByte(value, i, SRLG_LENGTH)))); + i += SRLG_LENGTH; + } + builder.setSharedRiskLinkGroups(sharedRiskLinkGroups); + LOG.debug("Parsed Shared Risk Link Groups {}", Arrays.toString(sharedRiskLinkGroups.toArray())); + break; + case TlvCode.LINK_OPAQUE: + final byte[] opaque = value; + LOG.debug("Parsed Opaque value : {}", Arrays.toString(opaque)); + break; + case TlvCode.LINK_NAME: + final String name = new String(value, Charsets.US_ASCII); + builder.setLinkName(name); + LOG.debug("Parsed Link Name : {}", name); + break; + default: + LOG.warn("TLV {} is not a valid link attribute, ignoring it", key); + } + } + LOG.trace("Finished parsing Link Attributes."); + return new LinkAttributesCaseBuilder().setLinkAttributes(builder.build()).build(); + } - /** - * Parse Node Attributes. - * - * @param attributes key is the tlv type and value is the value of the tlv - * @return {@link LinkStateAttribute} - */ - private static LinkStateAttribute parseNodeAttributes(final Multimap attributes) { - final List topologyMembership = Lists.newArrayList(); - final List areaMembership = Lists.newArrayList(); - final NodeAttributesBuilder builder = new NodeAttributesBuilder(); - for (final Entry entry : attributes.entries()) { - final int key = entry.getKey(); - final byte[] value = entry.getValue(); - LOG.trace("Node attribute TLV {}", key); - switch (key) { - case TlvCode.MULTI_TOPOLOGY_ID: - int i = 0; - while (i != value.length) { - final TopologyIdentifier topId = new TopologyIdentifier(ByteArray.bytesToInt(ByteArray.subByte(value, i, 2)) & 0x3fff); - topologyMembership.add(topId); - LOG.debug("Parsed Topology Identifier: {}", topId); - i += 2; - } - break; - case TlvCode.NODE_FLAG_BITS: - final boolean[] flags = ByteArray.parseBits(value[0]); - builder.setNodeFlags(new NodeFlagBits(flags[0], flags[1], flags[2], flags[3])); - LOG.debug("Parsed Overload bit: {}, attached bit: {}, external bit: {}, area border router: {}.", flags[0], flags[1], - flags[2], flags[3]); - break; - case TlvCode.NODE_OPAQUE: - LOG.debug("Ignoring opaque value: {}.", Arrays.toString(value)); - break; - case TlvCode.DYNAMIC_HOSTNAME: - builder.setDynamicHostname(new String(value, Charsets.US_ASCII)); - LOG.debug("Parsed Node Name {}", builder.getDynamicHostname()); - break; - case TlvCode.ISIS_AREA_IDENTIFIER: - final IsisAreaIdentifier ai = new IsisAreaIdentifier(value); - areaMembership.add(ai); - LOG.debug("Parsed AreaIdentifier {}", ai); - break; - case TlvCode.LOCAL_IPV4_ROUTER_ID: - final Ipv4RouterIdentifier ip4 = new Ipv4RouterIdentifier(Ipv4Util.addressForBytes(value)); - builder.setIpv4RouterId(ip4); - LOG.debug("Parsed IPv4 Router Identifier {}", ip4); - break; - case TlvCode.LOCAL_IPV6_ROUTER_ID: - final Ipv6RouterIdentifier ip6 = new Ipv6RouterIdentifier(Ipv6Util.addressForBytes(value)); - builder.setIpv6RouterId(ip6); - LOG.debug("Parsed IPv6 Router Identifier {}", ip6); - break; - default: - LOG.warn("TLV {} is not a valid node attribute, ignoring it", key); - } - } - LOG.trace("Finished parsing Node Attributes."); + /** + * Parse Node Attributes. + * + * @param attributes key is the tlv type and value is the value of the tlv + * @return {@link LinkStateAttribute} + */ + private static LinkStateAttribute parseNodeAttributes(final Multimap attributes) { + final List topologyMembership = Lists.newArrayList(); + final List areaMembership = Lists.newArrayList(); + final NodeAttributesBuilder builder = new NodeAttributesBuilder(); + for (final Entry entry : attributes.entries()) { + final int key = entry.getKey(); + final byte[] value = entry.getValue(); + LOG.trace("Node attribute TLV {}", key); + switch (key) { + case TlvCode.MULTI_TOPOLOGY_ID: + int i = 0; + while (i != value.length) { + final TopologyIdentifier topId = new TopologyIdentifier(ByteArray.bytesToInt(ByteArray.subByte(value, i, 2)) & 0x3fff); + topologyMembership.add(topId); + LOG.debug("Parsed Topology Identifier: {}", topId); + i += 2; + } + break; + case TlvCode.NODE_FLAG_BITS: + final boolean[] flags = ByteArray.parseBits(value[0]); + builder.setNodeFlags(new NodeFlagBits(flags[0], flags[1], flags[2], flags[3])); + LOG.debug("Parsed Overload bit: {}, attached bit: {}, external bit: {}, area border router: {}.", flags[0], flags[1], + flags[2], flags[3]); + break; + case TlvCode.NODE_OPAQUE: + LOG.debug("Ignoring opaque value: {}.", Arrays.toString(value)); + break; + case TlvCode.DYNAMIC_HOSTNAME: + builder.setDynamicHostname(new String(value, Charsets.US_ASCII)); + LOG.debug("Parsed Node Name {}", builder.getDynamicHostname()); + break; + case TlvCode.ISIS_AREA_IDENTIFIER: + final IsisAreaIdentifier ai = new IsisAreaIdentifier(value); + areaMembership.add(ai); + LOG.debug("Parsed AreaIdentifier {}", ai); + break; + case TlvCode.LOCAL_IPV4_ROUTER_ID: + final Ipv4RouterIdentifier ip4 = new Ipv4RouterIdentifier(Ipv4Util.addressForBytes(value)); + builder.setIpv4RouterId(ip4); + LOG.debug("Parsed IPv4 Router Identifier {}", ip4); + break; + case TlvCode.LOCAL_IPV6_ROUTER_ID: + final Ipv6RouterIdentifier ip6 = new Ipv6RouterIdentifier(Ipv6Util.addressForBytes(value)); + builder.setIpv6RouterId(ip6); + LOG.debug("Parsed IPv6 Router Identifier {}", ip6); + break; + default: + LOG.warn("TLV {} is not a valid node attribute, ignoring it", key); + } + } + LOG.trace("Finished parsing Node Attributes."); - builder.setTopologyIdentifier(topologyMembership); - builder.setIsisAreaId(areaMembership); - return new NodeAttributesCaseBuilder().setNodeAttributes(builder.build()).build(); - } + builder.setTopologyIdentifier(topologyMembership); + builder.setIsisAreaId(areaMembership); + return new NodeAttributesCaseBuilder().setNodeAttributes(builder.build()).build(); + } - /** - * Parse prefix attributes. - * - * @param attributes key is the tlv type and value are the value bytes of the tlv - * @return {@link LinkStateAttribute} - */ - private static LinkStateAttribute parsePrefixAttributes(final Multimap attributes) { - final PrefixAttributesBuilder builder = new PrefixAttributesBuilder(); - final List routeTags = Lists.newArrayList(); - final List exRouteTags = Lists.newArrayList(); - for (final Entry entry : attributes.entries()) { - final int key = entry.getKey(); - final byte[] value = entry.getValue(); - LOG.trace("Prefix attribute TLV {}", key); - switch (key) { - case TlvCode.IGP_FLAGS: - final boolean[] flags = ByteArray.parseBits(value[0]); - final boolean upDownBit = flags[2]; - builder.setIgpBits(new IgpBitsBuilder().setUpDown(new UpDown(upDownBit)).build()); - LOG.debug("Parsed IGP flag (up/down bit) : {}", upDownBit); - break; - case TlvCode.ROUTE_TAG: - int offset = 0; - while (offset != value.length) { - final RouteTag routeTag = new RouteTag(ByteArray.subByte(value, offset, ROUTE_TAG_LENGTH)); - routeTags.add(routeTag); - LOG.debug("Parsed Route Tag: {}", routeTag); - offset += ROUTE_TAG_LENGTH; - } - break; - case TlvCode.EXTENDED_ROUTE_TAG: - offset = 0; - while (offset != value.length) { - final ExtendedRouteTag exRouteTag = new ExtendedRouteTag(ByteArray.subByte(value, offset, EXTENDED_ROUTE_TAG_LENGTH)); - exRouteTags.add(exRouteTag); - LOG.debug("Parsed Extended Route Tag: {}", exRouteTag); - offset += EXTENDED_ROUTE_TAG_LENGTH; - } - break; - case TlvCode.PREFIX_METRIC: - final IgpMetric metric = new IgpMetric(ByteArray.bytesToLong(value)); - builder.setPrefixMetric(metric); - LOG.debug("Parsed Metric: {}", metric); - break; - case TlvCode.FORWARDING_ADDRESS: - IpAddress fwdAddress = null; - switch (value.length) { - case Ipv4Util.IP4_LENGTH: - fwdAddress = new IpAddress(Ipv4Util.addressForBytes(value)); - break; - case Ipv6Util.IPV6_LENGTH: - fwdAddress = new IpAddress(Ipv6Util.addressForBytes(value)); - break; - default: - LOG.debug("Ignoring unsupported forwarding address length {}", value.length); - } - builder.setOspfForwardingAddress(fwdAddress); - LOG.debug("Parsed FWD Address: {}", fwdAddress); - break; - case TlvCode.PREFIX_OPAQUE: - LOG.debug("Parsed Opaque value: {}, not preserving it", ByteArray.bytesToHexString(value)); - break; - default: - LOG.warn("TLV {} is not a valid prefix attribute, ignoring it", key); - } - } - LOG.trace("Finished parsing Prefix Attributes."); - builder.setRouteTags(routeTags); - builder.setExtendedTags(exRouteTags); - return new PrefixAttributesCaseBuilder().setPrefixAttributes(builder.build()).build(); - } + /** + * Parse prefix attributes. + * + * @param attributes key is the tlv type and value are the value bytes of the tlv + * @return {@link LinkStateAttribute} + */ + private static LinkStateAttribute parsePrefixAttributes(final Multimap attributes) { + final PrefixAttributesBuilder builder = new PrefixAttributesBuilder(); + final List routeTags = Lists.newArrayList(); + final List exRouteTags = Lists.newArrayList(); + for (final Entry entry : attributes.entries()) { + final int key = entry.getKey(); + final byte[] value = entry.getValue(); + LOG.trace("Prefix attribute TLV {}", key); + switch (key) { + case TlvCode.IGP_FLAGS: + final boolean[] flags = ByteArray.parseBits(value[0]); + final boolean upDownBit = flags[2]; + builder.setIgpBits(new IgpBitsBuilder().setUpDown(new UpDown(upDownBit)).build()); + LOG.debug("Parsed IGP flag (up/down bit) : {}", upDownBit); + break; + case TlvCode.ROUTE_TAG: + int offset = 0; + while (offset != value.length) { + final RouteTag routeTag = new RouteTag(ByteArray.subByte(value, offset, ROUTE_TAG_LENGTH)); + routeTags.add(routeTag); + LOG.debug("Parsed Route Tag: {}", routeTag); + offset += ROUTE_TAG_LENGTH; + } + break; + case TlvCode.EXTENDED_ROUTE_TAG: + offset = 0; + while (offset != value.length) { + final ExtendedRouteTag exRouteTag = new ExtendedRouteTag(ByteArray.subByte(value, offset, EXTENDED_ROUTE_TAG_LENGTH)); + exRouteTags.add(exRouteTag); + LOG.debug("Parsed Extended Route Tag: {}", exRouteTag); + offset += EXTENDED_ROUTE_TAG_LENGTH; + } + break; + case TlvCode.PREFIX_METRIC: + final IgpMetric metric = new IgpMetric(ByteArray.bytesToLong(value)); + builder.setPrefixMetric(metric); + LOG.debug("Parsed Metric: {}", metric); + break; + case TlvCode.FORWARDING_ADDRESS: + IpAddress fwdAddress = null; + switch (value.length) { + case Ipv4Util.IP4_LENGTH: + fwdAddress = new IpAddress(Ipv4Util.addressForBytes(value)); + break; + case Ipv6Util.IPV6_LENGTH: + fwdAddress = new IpAddress(Ipv6Util.addressForBytes(value)); + break; + default: + LOG.debug("Ignoring unsupported forwarding address length {}", value.length); + } + builder.setOspfForwardingAddress(fwdAddress); + LOG.debug("Parsed FWD Address: {}", fwdAddress); + break; + case TlvCode.PREFIX_OPAQUE: + LOG.debug("Parsed Opaque value: {}, not preserving it", ByteArray.bytesToHexString(value)); + break; + default: + LOG.warn("TLV {} is not a valid prefix attribute, ignoring it", key); + } + } + LOG.trace("Finished parsing Prefix Attributes."); + builder.setRouteTags(routeTags); + builder.setExtendedTags(exRouteTags); + return new PrefixAttributesCaseBuilder().setPrefixAttributes(builder.build()).build(); + } } diff --git a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/LinkstateNlriParser.java b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/LinkstateNlriParser.java index 083c0ce792..d9ac893108 100644 --- a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/LinkstateNlriParser.java +++ b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/LinkstateNlriParser.java @@ -7,6 +7,10 @@ */ package org.opendaylight.protocol.bgp.linkstate; +import com.google.common.collect.Lists; +import com.google.common.primitives.UnsignedBytes; +import com.google.common.primitives.UnsignedInteger; + import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; @@ -72,463 +76,458 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network. import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.collect.Lists; -import com.google.common.primitives.UnsignedBytes; -import com.google.common.primitives.UnsignedInteger; - /** * Parser and serializer for Linkstate NLRI. */ public final class LinkstateNlriParser implements NlriParser { - private static final Logger LOG = LoggerFactory.getLogger(LinkstateNlriParser.class); - private static final int ROUTE_DISTINGUISHER_LENGTH = 8; - private static final int PROTOCOL_ID_LENGTH = 1; - private static final int IDENTIFIER_LENGTH = 8; - private static final int LINK_IDENTIFIER_LENGTH = 4; - private static final int ISO_SYSTEM_ID_LENGTH = 6; - private static final int PSN_LENGTH = 1; + private static final Logger LOG = LoggerFactory.getLogger(LinkstateNlriParser.class); + private static final int ROUTE_DISTINGUISHER_LENGTH = 8; + private static final int PROTOCOL_ID_LENGTH = 1; + private static final int IDENTIFIER_LENGTH = 8; + private static final int LINK_IDENTIFIER_LENGTH = 4; + private static final int ISO_SYSTEM_ID_LENGTH = 6; + private static final int PSN_LENGTH = 1; - private static final int TYPE_LENGTH = 2; - private static final int LENGTH_SIZE = 2; + private static final int TYPE_LENGTH = 2; + private static final int LENGTH_SIZE = 2; - private final boolean isVpn; + private final boolean isVpn; - public LinkstateNlriParser(final boolean isVpn) { - this.isVpn = isVpn; - } + public LinkstateNlriParser(final boolean isVpn) { + this.isVpn = isVpn; + } - private static NodeIdentifier parseLink(final CLinkstateDestinationBuilder builder, final ByteBuf buffer) throws BGPParsingException { - final int type = buffer.readUnsignedShort(); - final int length = buffer.readUnsignedShort(); - final NodeIdentifier remote = null; - if (type == TlvCode.REMOTE_NODE_DESCRIPTORS) { - builder.setRemoteNodeDescriptors((RemoteNodeDescriptors) parseNodeDescriptors(buffer.slice(buffer.readerIndex(), length), - false)); - buffer.skipBytes(length); - } - builder.setLinkDescriptors(parseLinkDescriptors(buffer.slice())); - return remote; - } + private static NodeIdentifier parseLink(final CLinkstateDestinationBuilder builder, final ByteBuf buffer) throws BGPParsingException { + final int type = buffer.readUnsignedShort(); + final int length = buffer.readUnsignedShort(); + final NodeIdentifier remote = null; + if (type == TlvCode.REMOTE_NODE_DESCRIPTORS) { + builder.setRemoteNodeDescriptors((RemoteNodeDescriptors) parseNodeDescriptors(buffer.slice(buffer.readerIndex(), length), false)); + buffer.skipBytes(length); + } + builder.setLinkDescriptors(parseLinkDescriptors(buffer.slice())); + return remote; + } - private static LinkDescriptors parseLinkDescriptors(final ByteBuf buffer) throws BGPParsingException { - final LinkDescriptorsBuilder builder = new LinkDescriptorsBuilder(); - while (buffer.isReadable()) { - final int type = buffer.readUnsignedShort(); - final int length = buffer.readUnsignedShort(); - final byte[] value = ByteArray.readBytes(buffer, length); - LOG.trace("Parsing Link Descriptor: {}", Arrays.toString(value)); - switch (type) { - case TlvCode.LINK_LR_IDENTIFIERS: - builder.setLinkLocalIdentifier(ByteArray.bytesToUint32(ByteArray.subByte(value, 0, LINK_IDENTIFIER_LENGTH)).longValue()); - builder.setLinkRemoteIdentifier(ByteArray.bytesToUint32( - ByteArray.subByte(value, LINK_IDENTIFIER_LENGTH, LINK_IDENTIFIER_LENGTH)).longValue()); - LOG.debug("Parsed link local {} remote {} Identifiers.", builder.getLinkLocalIdentifier(), - builder.getLinkRemoteIdentifier()); - break; - case TlvCode.IPV4_IFACE_ADDRESS: - final Ipv4InterfaceIdentifier lipv4 = new Ipv4InterfaceIdentifier(Ipv4Util.addressForBytes(value)); - builder.setIpv4InterfaceAddress(lipv4); - LOG.debug("Parsed IPv4 interface address {}.", lipv4); - break; - case TlvCode.IPV4_NEIGHBOR_ADDRESS: - final Ipv4InterfaceIdentifier ripv4 = new Ipv4InterfaceIdentifier(Ipv4Util.addressForBytes(value)); - builder.setIpv4NeighborAddress(ripv4); - LOG.debug("Parsed IPv4 neighbor address {}.", ripv4); - break; - case TlvCode.IPV6_IFACE_ADDRESS: - final Ipv6InterfaceIdentifier lipv6 = new Ipv6InterfaceIdentifier(Ipv6Util.addressForBytes(value)); - builder.setIpv6InterfaceAddress(lipv6); - LOG.debug("Parsed IPv6 interface address {}.", lipv6); - break; - case TlvCode.IPV6_NEIGHBOR_ADDRESS: - final Ipv6InterfaceIdentifier ripv6 = new Ipv6InterfaceIdentifier(Ipv6Util.addressForBytes(value)); - builder.setIpv6NeighborAddress(ripv6); - LOG.debug("Parsed IPv6 neighbor address {}.", ripv6); - break; - case TlvCode.MULTI_TOPOLOGY_ID: - final TopologyIdentifier topId = new TopologyIdentifier(ByteArray.bytesToInt(value) & 0x3fff); - builder.setMultiTopologyId(topId); - LOG.debug("Parsed topology identifier {}.", topId); - break; - default: - throw new BGPParsingException("Link Descriptor not recognized, type: " + type); - } - } - LOG.trace("Finished parsing Link descriptors."); - return builder.build(); - } + private static LinkDescriptors parseLinkDescriptors(final ByteBuf buffer) throws BGPParsingException { + final LinkDescriptorsBuilder builder = new LinkDescriptorsBuilder(); + while (buffer.isReadable()) { + final int type = buffer.readUnsignedShort(); + final int length = buffer.readUnsignedShort(); + final byte[] value = ByteArray.readBytes(buffer, length); + LOG.trace("Parsing Link Descriptor: {}", Arrays.toString(value)); + switch (type) { + case TlvCode.LINK_LR_IDENTIFIERS: + builder.setLinkLocalIdentifier(ByteArray.bytesToUint32(ByteArray.subByte(value, 0, LINK_IDENTIFIER_LENGTH)).longValue()); + builder.setLinkRemoteIdentifier(ByteArray.bytesToUint32( + ByteArray.subByte(value, LINK_IDENTIFIER_LENGTH, LINK_IDENTIFIER_LENGTH)).longValue()); + LOG.debug("Parsed link local {} remote {} Identifiers.", builder.getLinkLocalIdentifier(), + builder.getLinkRemoteIdentifier()); + break; + case TlvCode.IPV4_IFACE_ADDRESS: + final Ipv4InterfaceIdentifier lipv4 = new Ipv4InterfaceIdentifier(Ipv4Util.addressForBytes(value)); + builder.setIpv4InterfaceAddress(lipv4); + LOG.debug("Parsed IPv4 interface address {}.", lipv4); + break; + case TlvCode.IPV4_NEIGHBOR_ADDRESS: + final Ipv4InterfaceIdentifier ripv4 = new Ipv4InterfaceIdentifier(Ipv4Util.addressForBytes(value)); + builder.setIpv4NeighborAddress(ripv4); + LOG.debug("Parsed IPv4 neighbor address {}.", ripv4); + break; + case TlvCode.IPV6_IFACE_ADDRESS: + final Ipv6InterfaceIdentifier lipv6 = new Ipv6InterfaceIdentifier(Ipv6Util.addressForBytes(value)); + builder.setIpv6InterfaceAddress(lipv6); + LOG.debug("Parsed IPv6 interface address {}.", lipv6); + break; + case TlvCode.IPV6_NEIGHBOR_ADDRESS: + final Ipv6InterfaceIdentifier ripv6 = new Ipv6InterfaceIdentifier(Ipv6Util.addressForBytes(value)); + builder.setIpv6NeighborAddress(ripv6); + LOG.debug("Parsed IPv6 neighbor address {}.", ripv6); + break; + case TlvCode.MULTI_TOPOLOGY_ID: + final TopologyIdentifier topId = new TopologyIdentifier(ByteArray.bytesToInt(value) & 0x3fff); + builder.setMultiTopologyId(topId); + LOG.debug("Parsed topology identifier {}.", topId); + break; + default: + throw new BGPParsingException("Link Descriptor not recognized, type: " + type); + } + } + LOG.trace("Finished parsing Link descriptors."); + return builder.build(); + } - private static NodeIdentifier parseNodeDescriptors(final ByteBuf buffer, final boolean local) throws BGPParsingException { - AsNumber asnumber = null; - DomainIdentifier bgpId = null; - AreaIdentifier ai = null; - CRouterIdentifier routerId = null; - while (buffer.isReadable()) { - final int type = buffer.readUnsignedShort(); - final int length = buffer.readUnsignedShort(); - final byte[] value = ByteArray.readBytes(buffer, length); - LOG.trace("Parsing Node Descriptor: {}", Arrays.toString(value)); - switch (type) { - case TlvCode.AS_NUMBER: - asnumber = new AsNumber(ByteArray.bytesToLong(value)); - LOG.debug("Parsed {}", asnumber); - break; - case TlvCode.BGP_LS_ID: - bgpId = new DomainIdentifier(UnsignedInteger.fromIntBits(ByteArray.bytesToInt(value)).longValue()); - LOG.debug("Parsed {}", bgpId); - break; - case TlvCode.AREA_ID: - ai = new AreaIdentifier(UnsignedInteger.fromIntBits(ByteArray.bytesToInt(value)).longValue()); - LOG.debug("Parsed area identifier {}", ai); - break; - case TlvCode.IGP_ROUTER_ID: - routerId = parseRouterId(value); - LOG.debug("Parsed Router Identifier {}", routerId); - break; - default: - throw new BGPParsingException("Node Descriptor not recognized, type: " + type); - } - } - LOG.trace("Finished parsing Node descriptors."); - return (local) ? new LocalNodeDescriptorsBuilder().setAsNumber(asnumber).setDomainId(bgpId).setAreaId(ai).setCRouterIdentifier( - routerId).build() - : new RemoteNodeDescriptorsBuilder().setAsNumber(asnumber).setDomainId(bgpId).setAreaId(ai).setCRouterIdentifier(routerId).build(); - } + private static NodeIdentifier parseNodeDescriptors(final ByteBuf buffer, final boolean local) throws BGPParsingException { + AsNumber asnumber = null; + DomainIdentifier bgpId = null; + AreaIdentifier ai = null; + CRouterIdentifier routerId = null; + while (buffer.isReadable()) { + final int type = buffer.readUnsignedShort(); + final int length = buffer.readUnsignedShort(); + final byte[] value = ByteArray.readBytes(buffer, length); + LOG.trace("Parsing Node Descriptor: {}", Arrays.toString(value)); + switch (type) { + case TlvCode.AS_NUMBER: + asnumber = new AsNumber(ByteArray.bytesToLong(value)); + LOG.debug("Parsed {}", asnumber); + break; + case TlvCode.BGP_LS_ID: + bgpId = new DomainIdentifier(UnsignedInteger.fromIntBits(ByteArray.bytesToInt(value)).longValue()); + LOG.debug("Parsed {}", bgpId); + break; + case TlvCode.AREA_ID: + ai = new AreaIdentifier(UnsignedInteger.fromIntBits(ByteArray.bytesToInt(value)).longValue()); + LOG.debug("Parsed area identifier {}", ai); + break; + case TlvCode.IGP_ROUTER_ID: + routerId = parseRouterId(value); + LOG.debug("Parsed Router Identifier {}", routerId); + break; + default: + throw new BGPParsingException("Node Descriptor not recognized, type: " + type); + } + } + LOG.trace("Finished parsing Node descriptors."); + return (local) ? new LocalNodeDescriptorsBuilder().setAsNumber(asnumber).setDomainId(bgpId).setAreaId(ai).setCRouterIdentifier( + routerId).build() + : new RemoteNodeDescriptorsBuilder().setAsNumber(asnumber).setDomainId(bgpId).setAreaId(ai).setCRouterIdentifier(routerId).build(); + } - private static CRouterIdentifier parseRouterId(final byte[] value) throws BGPParsingException { - if (value.length == ISO_SYSTEM_ID_LENGTH) { - return new IsisNodeCaseBuilder().setIsisNode( - new IsisNodeBuilder().setIsoSystemId(new IsoSystemIdentifier(ByteArray.subByte(value, 0, ISO_SYSTEM_ID_LENGTH))).build()).build(); - } - if (value.length == ISO_SYSTEM_ID_LENGTH + PSN_LENGTH) { - if (value[ISO_SYSTEM_ID_LENGTH] == 0) { - LOG.warn("PSN octet is 0. Ignoring System ID."); - return new IsisNodeCaseBuilder().setIsisNode( - new IsisNodeBuilder().setIsoSystemId(new IsoSystemIdentifier(ByteArray.subByte(value, 0, ISO_SYSTEM_ID_LENGTH))).build()).build(); - } else { - final IsIsRouterIdentifier iri = new IsIsRouterIdentifierBuilder().setIsoSystemId( - new IsoSystemIdentifier(ByteArray.subByte(value, 0, ISO_SYSTEM_ID_LENGTH))).build(); - return new IsisPseudonodeCaseBuilder().setIsisPseudonode( - new IsisPseudonodeBuilder().setIsIsRouterIdentifier(iri).setPsn( - (short) UnsignedBytes.toInt(value[ISO_SYSTEM_ID_LENGTH])).build()).build(); - } - } - if (value.length == 4) { - return new OspfNodeCaseBuilder().setOspfNode( - new OspfNodeBuilder().setOspfRouterId(ByteArray.bytesToUint32(value).longValue()).build()).build(); - } - if (value.length == 8) { - final byte[] o = ByteArray.subByte(value, 0, 4); - final OspfInterfaceIdentifier a = new OspfInterfaceIdentifier(ByteArray.bytesToUint32(ByteArray.subByte(value, 4, 4)).longValue()); - return new OspfPseudonodeCaseBuilder().setOspfPseudonode( - new OspfPseudonodeBuilder().setOspfRouterId(ByteArray.bytesToUint32(o).longValue()).setLanInterface(a).build()).build(); - } - throw new BGPParsingException("Router Id of invalid length " + value.length); - } + private static CRouterIdentifier parseRouterId(final byte[] value) throws BGPParsingException { + if (value.length == ISO_SYSTEM_ID_LENGTH) { + return new IsisNodeCaseBuilder().setIsisNode( + new IsisNodeBuilder().setIsoSystemId(new IsoSystemIdentifier(ByteArray.subByte(value, 0, ISO_SYSTEM_ID_LENGTH))).build()).build(); + } + if (value.length == ISO_SYSTEM_ID_LENGTH + PSN_LENGTH) { + if (value[ISO_SYSTEM_ID_LENGTH] == 0) { + LOG.warn("PSN octet is 0. Ignoring System ID."); + return new IsisNodeCaseBuilder().setIsisNode( + new IsisNodeBuilder().setIsoSystemId(new IsoSystemIdentifier(ByteArray.subByte(value, 0, ISO_SYSTEM_ID_LENGTH))).build()).build(); + } else { + final IsIsRouterIdentifier iri = new IsIsRouterIdentifierBuilder().setIsoSystemId( + new IsoSystemIdentifier(ByteArray.subByte(value, 0, ISO_SYSTEM_ID_LENGTH))).build(); + return new IsisPseudonodeCaseBuilder().setIsisPseudonode( + new IsisPseudonodeBuilder().setIsIsRouterIdentifier(iri).setPsn( + (short) UnsignedBytes.toInt(value[ISO_SYSTEM_ID_LENGTH])).build()).build(); + } + } + if (value.length == 4) { + return new OspfNodeCaseBuilder().setOspfNode( + new OspfNodeBuilder().setOspfRouterId(ByteArray.bytesToUint32(value).longValue()).build()).build(); + } + if (value.length == 8) { + final byte[] o = ByteArray.subByte(value, 0, 4); + final OspfInterfaceIdentifier a = new OspfInterfaceIdentifier(ByteArray.bytesToUint32(ByteArray.subByte(value, 4, 4)).longValue()); + return new OspfPseudonodeCaseBuilder().setOspfPseudonode( + new OspfPseudonodeBuilder().setOspfRouterId(ByteArray.bytesToUint32(o).longValue()).setLanInterface(a).build()).build(); + } + throw new BGPParsingException("Router Id of invalid length " + value.length); + } - private static PrefixDescriptors parsePrefixDescriptors(final ByteBuf buffer, final boolean ipv4) throws BGPParsingException { - final PrefixDescriptorsBuilder builder = new PrefixDescriptorsBuilder(); - while (buffer.isReadable()) { - final int type = buffer.readUnsignedShort(); - final int length = buffer.readUnsignedShort(); - final byte[] value = ByteArray.readBytes(buffer, length); - LOG.trace("Parsing Prefix Descriptor: {}", Arrays.toString(value)); - switch (type) { - case TlvCode.MULTI_TOPOLOGY_ID: - final TopologyIdentifier topologyId = new TopologyIdentifier(ByteArray.bytesToInt(value) & 0x3fff); - builder.setMultiTopologyId(topologyId); - LOG.trace("Parsed Topology Identifier: {}", topologyId); - break; - case TlvCode.OSPF_ROUTE_TYPE: - final int rt = ByteArray.bytesToInt(value); - final OspfRouteType routeType = OspfRouteType.forValue(rt); - if (routeType == null) { - throw new BGPParsingException("Unknown OSPF Route Type: " + rt); - } - builder.setOspfRouteType(routeType); - LOG.trace("Parser RouteType: {}", routeType); - break; - case TlvCode.IP_REACHABILITY: - IpPrefix prefix = null; - final int prefixLength = UnsignedBytes.toInt(value[0]); - final int size = prefixLength / Byte.SIZE + ((prefixLength % Byte.SIZE == 0) ? 0 : 1); - if (size != value.length - 1) { - LOG.debug("Expected length {}, actual length {}.", size, value.length - 1); - throw new BGPParsingException("Illegal length of IP reachability TLV: " + (value.length - 1)); - } - if (ipv4) { - prefix = new IpPrefix(Ipv4Util.prefixForBytes(ByteArray.subByte(value, 1, size), prefixLength)); - } else { - prefix = new IpPrefix(Ipv6Util.prefixForBytes(ByteArray.subByte(value, 1, size), prefixLength)); - } - builder.setIpReachabilityInformation(prefix); - LOG.trace("Parsed IP reachability info: {}", prefix); - break; - default: - throw new BGPParsingException("Prefix Descriptor not recognized, type: " + type); - } - } - LOG.debug("Finished parsing Prefix descriptors."); - return builder.build(); - } + private static PrefixDescriptors parsePrefixDescriptors(final ByteBuf buffer, final boolean ipv4) throws BGPParsingException { + final PrefixDescriptorsBuilder builder = new PrefixDescriptorsBuilder(); + while (buffer.isReadable()) { + final int type = buffer.readUnsignedShort(); + final int length = buffer.readUnsignedShort(); + final byte[] value = ByteArray.readBytes(buffer, length); + LOG.trace("Parsing Prefix Descriptor: {}", Arrays.toString(value)); + switch (type) { + case TlvCode.MULTI_TOPOLOGY_ID: + final TopologyIdentifier topologyId = new TopologyIdentifier(ByteArray.bytesToInt(value) & 0x3fff); + builder.setMultiTopologyId(topologyId); + LOG.trace("Parsed Topology Identifier: {}", topologyId); + break; + case TlvCode.OSPF_ROUTE_TYPE: + final int rt = ByteArray.bytesToInt(value); + final OspfRouteType routeType = OspfRouteType.forValue(rt); + if (routeType == null) { + throw new BGPParsingException("Unknown OSPF Route Type: " + rt); + } + builder.setOspfRouteType(routeType); + LOG.trace("Parser RouteType: {}", routeType); + break; + case TlvCode.IP_REACHABILITY: + IpPrefix prefix = null; + final int prefixLength = UnsignedBytes.toInt(value[0]); + final int size = prefixLength / Byte.SIZE + ((prefixLength % Byte.SIZE == 0) ? 0 : 1); + if (size != value.length - 1) { + LOG.debug("Expected length {}, actual length {}.", size, value.length - 1); + throw new BGPParsingException("Illegal length of IP reachability TLV: " + (value.length - 1)); + } + if (ipv4) { + prefix = new IpPrefix(Ipv4Util.prefixForBytes(ByteArray.subByte(value, 1, size), prefixLength)); + } else { + prefix = new IpPrefix(Ipv6Util.prefixForBytes(ByteArray.subByte(value, 1, size), prefixLength)); + } + builder.setIpReachabilityInformation(prefix); + LOG.trace("Parsed IP reachability info: {}", prefix); + break; + default: + throw new BGPParsingException("Prefix Descriptor not recognized, type: " + type); + } + } + LOG.debug("Finished parsing Prefix descriptors."); + return builder.build(); + } - /** - * Parses common parts for Link State Nodes, Links and Prefixes, that includes protocol ID and identifier tlv. - * - * @param nlri as byte array - * @return {@link CLinkstateDestination} - * @throws BGPParsingException if parsing was unsuccessful - */ - private List parseNlri(final ByteBuf nlri) throws BGPParsingException { - if (!nlri.isReadable()) { - return null; - } - final List dests = Lists.newArrayList(); + /** + * Parses common parts for Link State Nodes, Links and Prefixes, that includes protocol ID and identifier tlv. + * + * @param nlri as byte array + * @return {@link CLinkstateDestination} + * @throws BGPParsingException if parsing was unsuccessful + */ + private List parseNlri(final ByteBuf nlri) throws BGPParsingException { + if (!nlri.isReadable()) { + return null; + } + final List dests = Lists.newArrayList(); - CLinkstateDestinationBuilder builder = null; + CLinkstateDestinationBuilder builder = null; - while (nlri.isReadable()) { - builder = new CLinkstateDestinationBuilder(); - final NlriType type = NlriType.forValue(nlri.readUnsignedShort()); - builder.setNlriType(type); + while (nlri.isReadable()) { + builder = new CLinkstateDestinationBuilder(); + final NlriType type = NlriType.forValue(nlri.readUnsignedShort()); + builder.setNlriType(type); - // length means total length of the tlvs including route distinguisher not including the type field - final int length = nlri.readUnsignedShort(); - RouteDistinguisher distinguisher = null; - if (this.isVpn) { - // this parses route distinguisher - distinguisher = new RouteDistinguisher(BigInteger.valueOf(nlri.readLong())); - builder.setDistinguisher(distinguisher); - } - // parse source protocol - final ProtocolId sp = ProtocolId.forValue(UnsignedBytes.toInt(nlri.readByte())); - builder.setProtocolId(sp); + // length means total length of the tlvs including route distinguisher not including the type field + final int length = nlri.readUnsignedShort(); + RouteDistinguisher distinguisher = null; + if (this.isVpn) { + // this parses route distinguisher + distinguisher = new RouteDistinguisher(BigInteger.valueOf(nlri.readLong())); + builder.setDistinguisher(distinguisher); + } + // parse source protocol + final ProtocolId sp = ProtocolId.forValue(UnsignedBytes.toInt(nlri.readByte())); + builder.setProtocolId(sp); - // parse identifier - final Identifier identifier = new Identifier(BigInteger.valueOf(nlri.readLong())); - builder.setIdentifier(identifier); + // parse identifier + final Identifier identifier = new Identifier(BigInteger.valueOf(nlri.readLong())); + builder.setIdentifier(identifier); - // if we are dealing with linkstate nodes/links, parse local node descriptor - NodeIdentifier localDescriptor = null; - int locallength = 0; - final int localtype = nlri.readUnsignedShort(); - locallength = nlri.readUnsignedShort(); - if (localtype == TlvCode.LOCAL_NODE_DESCRIPTORS) { - localDescriptor = parseNodeDescriptors(nlri.slice(nlri.readerIndex(), locallength), true); - } - nlri.skipBytes(locallength); - builder.setLocalNodeDescriptors((LocalNodeDescriptors) localDescriptor); - final int restLength = length - (this.isVpn ? ROUTE_DISTINGUISHER_LENGTH : 0) - PROTOCOL_ID_LENGTH - IDENTIFIER_LENGTH - - TYPE_LENGTH - LENGTH_SIZE - locallength; - LOG.trace("Restlength {}", restLength); - ByteBuf rest = nlri.slice(nlri.readerIndex(), restLength); - switch (type) { - case Link: - parseLink(builder, rest); - break; - case Ipv4Prefix: - builder.setPrefixDescriptors(parsePrefixDescriptors(rest, true)); - break; - case Ipv6Prefix: - builder.setPrefixDescriptors(parsePrefixDescriptors(rest, false)); - break; - case Node: - // node nlri is already parsed as it contains only the common fields for node and link nlri - break; - } - nlri.skipBytes(restLength); - dests.add(builder.build()); - } - return dests; - } + // if we are dealing with linkstate nodes/links, parse local node descriptor + NodeIdentifier localDescriptor = null; + int locallength = 0; + final int localtype = nlri.readUnsignedShort(); + locallength = nlri.readUnsignedShort(); + if (localtype == TlvCode.LOCAL_NODE_DESCRIPTORS) { + localDescriptor = parseNodeDescriptors(nlri.slice(nlri.readerIndex(), locallength), true); + } + nlri.skipBytes(locallength); + builder.setLocalNodeDescriptors((LocalNodeDescriptors) localDescriptor); + final int restLength = length - (this.isVpn ? ROUTE_DISTINGUISHER_LENGTH : 0) - PROTOCOL_ID_LENGTH - IDENTIFIER_LENGTH + - TYPE_LENGTH - LENGTH_SIZE - locallength; + LOG.trace("Restlength {}", restLength); + ByteBuf rest = nlri.slice(nlri.readerIndex(), restLength); + switch (type) { + case Link: + parseLink(builder, rest); + break; + case Ipv4Prefix: + builder.setPrefixDescriptors(parsePrefixDescriptors(rest, true)); + break; + case Ipv6Prefix: + builder.setPrefixDescriptors(parsePrefixDescriptors(rest, false)); + break; + case Node: + // node nlri is already parsed as it contains only the common fields for node and link nlri + break; + } + nlri.skipBytes(restLength); + dests.add(builder.build()); + } + return dests; + } - @Override - public void parseNlri(final ByteBuf nlri, final MpUnreachNlriBuilder builder) throws BGPParsingException { - if (!nlri.isReadable()) { - return; - } - final List dst = parseNlri(nlri); + @Override + public void parseNlri(final ByteBuf nlri, final MpUnreachNlriBuilder builder) throws BGPParsingException { + if (!nlri.isReadable()) { + return; + } + final List dst = parseNlri(nlri); - builder.setWithdrawnRoutes(new WithdrawnRoutesBuilder().setDestinationType( - new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationLinkstateCaseBuilder().setDestinationLinkstate( - new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.destination.linkstate._case.DestinationLinkstateBuilder().setCLinkstateDestination( - dst).build()).build()).build()); - } + builder.setWithdrawnRoutes(new WithdrawnRoutesBuilder().setDestinationType( + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationLinkstateCaseBuilder().setDestinationLinkstate( + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.destination.linkstate._case.DestinationLinkstateBuilder().setCLinkstateDestination( + dst).build()).build()).build()); + } - @Override - public void parseNlri(final ByteBuf nlri, final byte[] nextHop, final MpReachNlriBuilder builder) throws BGPParsingException { - if (!nlri.isReadable()) { - return; - } - final List dst = parseNlri(nlri); + @Override + public void parseNlri(final ByteBuf nlri, final byte[] nextHop, final MpReachNlriBuilder builder) throws BGPParsingException { + if (!nlri.isReadable()) { + return; + } + final List dst = parseNlri(nlri); - builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType( - new DestinationLinkstateCaseBuilder().setDestinationLinkstate( - new DestinationLinkstateBuilder().setCLinkstateDestination(dst).build()).build()).build()); - NlriUtil.parseNextHop(nextHop, builder); - } + builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType( + new DestinationLinkstateCaseBuilder().setDestinationLinkstate( + new DestinationLinkstateBuilder().setCLinkstateDestination(dst).build()).build()).build()); + NlriUtil.parseNextHop(nextHop, builder); + } - /** - * Serializes Linkstate NLRI to byte array. We need this as NLRI serves as a key in upper layers. - * - * @param destination Linkstate NLRI to be serialized - * @return byte array - */ - public static byte[] serializeNlri(final CLinkstateDestination destination) { - final ByteBuf finalBuffer = Unpooled.buffer(); - finalBuffer.writeShort(destination.getNlriType().getIntValue()); - final ByteBuf buffer = Unpooled.buffer(); - if (destination.getDistinguisher() != null) { - buffer.writeBytes(destination.getDistinguisher().getValue().toByteArray()); - } - buffer.writeByte(destination.getProtocolId().getIntValue()); - buffer.writeBytes(ByteArray.longToBytes(destination.getIdentifier().getValue().longValue(), IDENTIFIER_LENGTH)); + /** + * Serializes Linkstate NLRI to byte array. We need this as NLRI serves as a key in upper layers. + * + * @param destination Linkstate NLRI to be serialized + * @return byte array + */ + public static byte[] serializeNlri(final CLinkstateDestination destination) { + final ByteBuf finalBuffer = Unpooled.buffer(); + finalBuffer.writeShort(destination.getNlriType().getIntValue()); + final ByteBuf buffer = Unpooled.buffer(); + if (destination.getDistinguisher() != null) { + buffer.writeBytes(destination.getDistinguisher().getValue().toByteArray()); + } + buffer.writeByte(destination.getProtocolId().getIntValue()); + buffer.writeBytes(ByteArray.longToBytes(destination.getIdentifier().getValue().longValue(), IDENTIFIER_LENGTH)); - // serialize local node descriptors - final byte[] ldescs = serializeNodeDescriptors(destination.getLocalNodeDescriptors()); - buffer.writeShort(TlvCode.LOCAL_NODE_DESCRIPTORS); - buffer.writeShort(ldescs.length); - buffer.writeBytes(ldescs); + // serialize local node descriptors + final byte[] ldescs = serializeNodeDescriptors(destination.getLocalNodeDescriptors()); + buffer.writeShort(TlvCode.LOCAL_NODE_DESCRIPTORS); + buffer.writeShort(ldescs.length); + buffer.writeBytes(ldescs); - switch (destination.getNlriType()) { - case Ipv4Prefix: - case Ipv6Prefix: - if (destination.getPrefixDescriptors() != null) { - serializePrefixDescriptors(buffer, destination.getPrefixDescriptors()); - } - break; - case Link: - final byte[] rdescs = serializeNodeDescriptors(destination.getRemoteNodeDescriptors()); - buffer.writeShort(TlvCode.REMOTE_NODE_DESCRIPTORS); - buffer.writeShort(rdescs.length); - buffer.writeBytes(rdescs); - if (destination.getLinkDescriptors() != null) { - serializeLinkDescriptors(buffer, destination.getLinkDescriptors()); - } - break; - case Node: - break; - default: - LOG.warn("Unknown NLRI Type."); - break; - } - finalBuffer.writeShort(buffer.readableBytes()); - finalBuffer.writeBytes(buffer); - return ByteArray.subByte(finalBuffer.array(), 0, finalBuffer.readableBytes()); - } + switch (destination.getNlriType()) { + case Ipv4Prefix: + case Ipv6Prefix: + if (destination.getPrefixDescriptors() != null) { + serializePrefixDescriptors(buffer, destination.getPrefixDescriptors()); + } + break; + case Link: + final byte[] rdescs = serializeNodeDescriptors(destination.getRemoteNodeDescriptors()); + buffer.writeShort(TlvCode.REMOTE_NODE_DESCRIPTORS); + buffer.writeShort(rdescs.length); + buffer.writeBytes(rdescs); + if (destination.getLinkDescriptors() != null) { + serializeLinkDescriptors(buffer, destination.getLinkDescriptors()); + } + break; + case Node: + break; + default: + LOG.warn("Unknown NLRI Type."); + break; + } + finalBuffer.writeShort(buffer.readableBytes()); + finalBuffer.writeBytes(buffer); + return ByteArray.subByte(finalBuffer.array(), 0, finalBuffer.readableBytes()); + } - private static byte[] serializeNodeDescriptors(final NodeIdentifier descriptors) { - final ByteBuf buffer = Unpooled.buffer(); - final int length = Integer.SIZE / Byte.SIZE; - if (descriptors.getAsNumber() != null) { - buffer.writeShort(TlvCode.AS_NUMBER); - buffer.writeShort(length); - buffer.writeInt(UnsignedInteger.valueOf(descriptors.getAsNumber().getValue()).intValue()); - } - if (descriptors.getDomainId() != null) { - buffer.writeShort(TlvCode.BGP_LS_ID); - buffer.writeShort(length); - buffer.writeInt(UnsignedInteger.valueOf(descriptors.getDomainId().getValue()).intValue()); - } - if (descriptors.getAreaId() != null) { - buffer.writeShort(TlvCode.AREA_ID); - buffer.writeShort(length); - buffer.writeInt(UnsignedInteger.valueOf(descriptors.getAreaId().getValue()).intValue()); - } - if (descriptors.getCRouterIdentifier() != null) { - final byte[] value = serializeRouterId(descriptors.getCRouterIdentifier()); - buffer.writeShort(TlvCode.IGP_ROUTER_ID); - buffer.writeShort(value.length); - buffer.writeBytes(value); - } - return ByteArray.readAllBytes(buffer); - } + private static byte[] serializeNodeDescriptors(final NodeIdentifier descriptors) { + final ByteBuf buffer = Unpooled.buffer(); + final int length = Integer.SIZE / Byte.SIZE; + if (descriptors.getAsNumber() != null) { + buffer.writeShort(TlvCode.AS_NUMBER); + buffer.writeShort(length); + buffer.writeInt(UnsignedInteger.valueOf(descriptors.getAsNumber().getValue()).intValue()); + } + if (descriptors.getDomainId() != null) { + buffer.writeShort(TlvCode.BGP_LS_ID); + buffer.writeShort(length); + buffer.writeInt(UnsignedInteger.valueOf(descriptors.getDomainId().getValue()).intValue()); + } + if (descriptors.getAreaId() != null) { + buffer.writeShort(TlvCode.AREA_ID); + buffer.writeShort(length); + buffer.writeInt(UnsignedInteger.valueOf(descriptors.getAreaId().getValue()).intValue()); + } + if (descriptors.getCRouterIdentifier() != null) { + final byte[] value = serializeRouterId(descriptors.getCRouterIdentifier()); + buffer.writeShort(TlvCode.IGP_ROUTER_ID); + buffer.writeShort(value.length); + buffer.writeBytes(value); + } + return ByteArray.readAllBytes(buffer); + } - private static byte[] serializeRouterId(final CRouterIdentifier routerId) { - byte[] bytes = null; - if (routerId instanceof IsisNodeCase) { - final IsisNode isis = ((IsisNodeCase) routerId).getIsisNode(); - bytes = isis.getIsoSystemId().getValue(); - } else if (routerId instanceof IsisPseudonodeCase) { - bytes = new byte[ISO_SYSTEM_ID_LENGTH + PSN_LENGTH]; - final IsisPseudonode isis = ((IsisPseudonodeCase) routerId).getIsisPseudonode(); - ByteArray.copyWhole(isis.getIsIsRouterIdentifier().getIsoSystemId().getValue(), bytes, 0); - bytes[6] = UnsignedBytes.checkedCast((isis.getPsn() != null) ? isis.getPsn() : 0); - } else if (routerId instanceof OspfNodeCase) { - bytes = ByteArray.uint32ToBytes(((OspfNodeCase) routerId).getOspfNode().getOspfRouterId()); - } else if (routerId instanceof OspfPseudonodeCase) { - final OspfPseudonode node = ((OspfPseudonodeCase) routerId).getOspfPseudonode(); - bytes = new byte[2 * Integer.SIZE / Byte.SIZE]; - ByteArray.copyWhole(ByteArray.uint32ToBytes(node.getOspfRouterId()), bytes, 0); - ByteArray.copyWhole(ByteArray.uint32ToBytes(node.getLanInterface().getValue()), bytes, Integer.SIZE / Byte.SIZE); - } - return bytes; - } + private static byte[] serializeRouterId(final CRouterIdentifier routerId) { + byte[] bytes = null; + if (routerId instanceof IsisNodeCase) { + final IsisNode isis = ((IsisNodeCase) routerId).getIsisNode(); + bytes = isis.getIsoSystemId().getValue(); + } else if (routerId instanceof IsisPseudonodeCase) { + bytes = new byte[ISO_SYSTEM_ID_LENGTH + PSN_LENGTH]; + final IsisPseudonode isis = ((IsisPseudonodeCase) routerId).getIsisPseudonode(); + ByteArray.copyWhole(isis.getIsIsRouterIdentifier().getIsoSystemId().getValue(), bytes, 0); + bytes[6] = UnsignedBytes.checkedCast((isis.getPsn() != null) ? isis.getPsn() : 0); + } else if (routerId instanceof OspfNodeCase) { + bytes = ByteArray.uint32ToBytes(((OspfNodeCase) routerId).getOspfNode().getOspfRouterId()); + } else if (routerId instanceof OspfPseudonodeCase) { + final OspfPseudonode node = ((OspfPseudonodeCase) routerId).getOspfPseudonode(); + bytes = new byte[2 * Integer.SIZE / Byte.SIZE]; + ByteArray.copyWhole(ByteArray.uint32ToBytes(node.getOspfRouterId()), bytes, 0); + ByteArray.copyWhole(ByteArray.uint32ToBytes(node.getLanInterface().getValue()), bytes, Integer.SIZE / Byte.SIZE); + } + return bytes; + } - private static void serializeLinkDescriptors(final ByteBuf buffer, final LinkDescriptors descriptors) { - if (descriptors.getLinkLocalIdentifier() != null && descriptors.getLinkRemoteIdentifier() != null) { - buffer.writeShort(TlvCode.LINK_LR_IDENTIFIERS); - buffer.writeShort(LINK_IDENTIFIER_LENGTH); - buffer.writeInt(UnsignedInteger.valueOf(descriptors.getLinkLocalIdentifier()).intValue()); - buffer.writeInt(UnsignedInteger.valueOf(descriptors.getLinkRemoteIdentifier()).intValue()); - } - if (descriptors.getIpv4InterfaceAddress() != null) { - final byte[] ipv4Address = Ipv4Util.bytesForAddress(descriptors.getIpv4InterfaceAddress()); - buffer.writeShort(TlvCode.IPV4_IFACE_ADDRESS); - buffer.writeShort(ipv4Address.length); - buffer.writeBytes(ipv4Address); - } - if (descriptors.getIpv4NeighborAddress() != null) { - final byte[] ipv4Address = Ipv4Util.bytesForAddress(descriptors.getIpv4NeighborAddress()); - buffer.writeShort(TlvCode.IPV4_NEIGHBOR_ADDRESS); - buffer.writeShort(ipv4Address.length); - buffer.writeBytes(ipv4Address); - } - if (descriptors.getIpv6InterfaceAddress() != null) { - final byte[] ipv6Address = Ipv6Util.bytesForAddress(descriptors.getIpv6InterfaceAddress()); - buffer.writeShort(TlvCode.IPV6_IFACE_ADDRESS); - buffer.writeShort(ipv6Address.length); - buffer.writeBytes(ipv6Address); - } - if (descriptors.getIpv6NeighborAddress() != null) { - final byte[] ipv6Address = Ipv6Util.bytesForAddress(descriptors.getIpv6NeighborAddress()); - buffer.writeShort(TlvCode.IPV6_NEIGHBOR_ADDRESS); - buffer.writeShort(ipv6Address.length); - buffer.writeBytes(ipv6Address); - } - if (descriptors.getMultiTopologyId() != null) { - buffer.writeShort(TlvCode.MULTI_TOPOLOGY_ID); - buffer.writeShort(Short.SIZE / Byte.SIZE); - buffer.writeShort(descriptors.getMultiTopologyId().getValue()); - } - } + private static void serializeLinkDescriptors(final ByteBuf buffer, final LinkDescriptors descriptors) { + if (descriptors.getLinkLocalIdentifier() != null && descriptors.getLinkRemoteIdentifier() != null) { + buffer.writeShort(TlvCode.LINK_LR_IDENTIFIERS); + buffer.writeShort(LINK_IDENTIFIER_LENGTH); + buffer.writeInt(UnsignedInteger.valueOf(descriptors.getLinkLocalIdentifier()).intValue()); + buffer.writeInt(UnsignedInteger.valueOf(descriptors.getLinkRemoteIdentifier()).intValue()); + } + if (descriptors.getIpv4InterfaceAddress() != null) { + final byte[] ipv4Address = Ipv4Util.bytesForAddress(descriptors.getIpv4InterfaceAddress()); + buffer.writeShort(TlvCode.IPV4_IFACE_ADDRESS); + buffer.writeShort(ipv4Address.length); + buffer.writeBytes(ipv4Address); + } + if (descriptors.getIpv4NeighborAddress() != null) { + final byte[] ipv4Address = Ipv4Util.bytesForAddress(descriptors.getIpv4NeighborAddress()); + buffer.writeShort(TlvCode.IPV4_NEIGHBOR_ADDRESS); + buffer.writeShort(ipv4Address.length); + buffer.writeBytes(ipv4Address); + } + if (descriptors.getIpv6InterfaceAddress() != null) { + final byte[] ipv6Address = Ipv6Util.bytesForAddress(descriptors.getIpv6InterfaceAddress()); + buffer.writeShort(TlvCode.IPV6_IFACE_ADDRESS); + buffer.writeShort(ipv6Address.length); + buffer.writeBytes(ipv6Address); + } + if (descriptors.getIpv6NeighborAddress() != null) { + final byte[] ipv6Address = Ipv6Util.bytesForAddress(descriptors.getIpv6NeighborAddress()); + buffer.writeShort(TlvCode.IPV6_NEIGHBOR_ADDRESS); + buffer.writeShort(ipv6Address.length); + buffer.writeBytes(ipv6Address); + } + if (descriptors.getMultiTopologyId() != null) { + buffer.writeShort(TlvCode.MULTI_TOPOLOGY_ID); + buffer.writeShort(Short.SIZE / Byte.SIZE); + buffer.writeShort(descriptors.getMultiTopologyId().getValue()); + } + } - private static void serializePrefixDescriptors(final ByteBuf buffer, final PrefixDescriptors descriptors) { - if (descriptors.getMultiTopologyId() != null) { - buffer.writeShort(TlvCode.MULTI_TOPOLOGY_ID); - buffer.writeShort(Short.SIZE / Byte.SIZE); - buffer.writeShort(descriptors.getMultiTopologyId().getValue()); - } - if (descriptors.getOspfRouteType() != null) { - buffer.writeShort(TlvCode.OSPF_ROUTE_TYPE); - buffer.writeShort(1); - buffer.writeByte(descriptors.getOspfRouteType().getIntValue()); - } - if (descriptors.getIpReachabilityInformation() != null) { - final IpPrefix prefix = descriptors.getIpReachabilityInformation(); - byte[] prefixBytes = null; - final int prefixLength = Ipv4Util.getPrefixLength(prefix); - if (prefix.getIpv4Prefix() != null) { - prefixBytes = ByteArray.trim(ByteArray.subByte(Ipv4Util.bytesForPrefix(prefix.getIpv4Prefix()), 0, - Ipv4Util.bytesForPrefix(prefix.getIpv4Prefix()).length - 1)); - } else if (prefix.getIpv6Prefix() != null) { - prefixBytes = ByteArray.trim(ByteArray.subByte(Ipv6Util.bytesForPrefix(prefix.getIpv6Prefix()), 0, - Ipv6Util.bytesForPrefix(prefix.getIpv6Prefix()).length - 1)); - } - buffer.writeShort(TlvCode.IP_REACHABILITY); - buffer.writeShort(1 + prefixBytes.length); - buffer.writeByte(prefixLength); - buffer.writeBytes(prefixBytes); - } - } + private static void serializePrefixDescriptors(final ByteBuf buffer, final PrefixDescriptors descriptors) { + if (descriptors.getMultiTopologyId() != null) { + buffer.writeShort(TlvCode.MULTI_TOPOLOGY_ID); + buffer.writeShort(Short.SIZE / Byte.SIZE); + buffer.writeShort(descriptors.getMultiTopologyId().getValue()); + } + if (descriptors.getOspfRouteType() != null) { + buffer.writeShort(TlvCode.OSPF_ROUTE_TYPE); + buffer.writeShort(1); + buffer.writeByte(descriptors.getOspfRouteType().getIntValue()); + } + if (descriptors.getIpReachabilityInformation() != null) { + final IpPrefix prefix = descriptors.getIpReachabilityInformation(); + byte[] prefixBytes = null; + final int prefixLength = Ipv4Util.getPrefixLength(prefix); + if (prefix.getIpv4Prefix() != null) { + prefixBytes = ByteArray.trim(ByteArray.subByte(Ipv4Util.bytesForPrefix(prefix.getIpv4Prefix()), 0, + Ipv4Util.bytesForPrefix(prefix.getIpv4Prefix()).length - 1)); + } else if (prefix.getIpv6Prefix() != null) { + prefixBytes = ByteArray.trim(ByteArray.subByte(Ipv6Util.bytesForPrefix(prefix.getIpv6Prefix()), 0, + Ipv6Util.bytesForPrefix(prefix.getIpv6Prefix()).length - 1)); + } + buffer.writeShort(TlvCode.IP_REACHABILITY); + buffer.writeShort(1 + prefixBytes.length); + buffer.writeByte(prefixLength); + buffer.writeBytes(prefixBytes); + } + } } diff --git a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/RIBActivator.java b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/RIBActivator.java index cff4e004df..912ea685ab 100644 --- a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/RIBActivator.java +++ b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/RIBActivator.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.linkstate; +import com.google.common.collect.Lists; + import java.util.List; import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction; @@ -19,20 +21,18 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.link import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.LinkstateSubsequentAddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey; -import com.google.common.collect.Lists; - /** * Activator for registering Linkstate AFI/SAFI to RIB. */ public final class RIBActivator extends AbstractRIBExtensionProviderActivator { - @Override - protected List startRIBExtensionProviderImpl(final RIBExtensionProviderContext context) { - return Lists.newArrayList(context.registerAdjRIBsInFactory(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class, - new AdjRIBsInFactory() { - @Override - public AdjRIBsIn createAdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) { - return new LinkstateAdjRIBsIn(trans, rib, key); - } - })); - } + @Override + protected List startRIBExtensionProviderImpl(final RIBExtensionProviderContext context) { + return Lists.newArrayList(context.registerAdjRIBsInFactory(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class, + new AdjRIBsInFactory() { + @Override + public AdjRIBsIn createAdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) { + return new LinkstateAdjRIBsIn(trans, rib, key); + } + })); + } } diff --git a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/TlvCode.java b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/TlvCode.java index 93c549ba49..0a725a9663 100644 --- a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/TlvCode.java +++ b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/TlvCode.java @@ -9,96 +9,96 @@ package org.opendaylight.protocol.bgp.linkstate; final class TlvCode { - private TlvCode() { - } + private TlvCode() { + } - static final int LOCAL_NODE_DESCRIPTORS = 256; + static final int LOCAL_NODE_DESCRIPTORS = 256; - static final int REMOTE_NODE_DESCRIPTORS = 257; + static final int REMOTE_NODE_DESCRIPTORS = 257; - /* Link Descriptor TLVs */ + /* Link Descriptor TLVs */ - static final int LINK_LR_IDENTIFIERS = 258; + static final int LINK_LR_IDENTIFIERS = 258; - static final int IPV4_IFACE_ADDRESS = 259; + static final int IPV4_IFACE_ADDRESS = 259; - static final int IPV4_NEIGHBOR_ADDRESS = 260; + static final int IPV4_NEIGHBOR_ADDRESS = 260; - static final int IPV6_IFACE_ADDRESS = 261; + static final int IPV6_IFACE_ADDRESS = 261; - static final int IPV6_NEIGHBOR_ADDRESS = 262; + static final int IPV6_NEIGHBOR_ADDRESS = 262; - /* Link Attribute TLVs */ + /* Link Attribute TLVs */ - static final int LOCAL_IPV4_ROUTER_ID = 1028; + static final int LOCAL_IPV4_ROUTER_ID = 1028; - static final int LOCAL_IPV6_ROUTER_ID = 1029; + static final int LOCAL_IPV6_ROUTER_ID = 1029; - static final int REMOTE_IPV4_ROUTER_ID = 1030; + static final int REMOTE_IPV4_ROUTER_ID = 1030; - static final int REMOTE_IPV6_ROUTER_ID = 1031; + static final int REMOTE_IPV6_ROUTER_ID = 1031; - static final int ADMIN_GROUP = 1088; + static final int ADMIN_GROUP = 1088; - static final int MAX_BANDWIDTH = 1089; + static final int MAX_BANDWIDTH = 1089; - static final int MAX_RESERVABLE_BANDWIDTH = 1090; + static final int MAX_RESERVABLE_BANDWIDTH = 1090; - static final int UNRESERVED_BANDWIDTH = 1091; + static final int UNRESERVED_BANDWIDTH = 1091; - static final int TE_METRIC = 1092; + static final int TE_METRIC = 1092; - static final int LINK_PROTECTION_TYPE = 1093; + static final int LINK_PROTECTION_TYPE = 1093; - static final int MPLS_PROTOCOL = 1094; + static final int MPLS_PROTOCOL = 1094; - static final int METRIC = 1095; + static final int METRIC = 1095; - static final int SHARED_RISK_LINK_GROUP = 1096; + static final int SHARED_RISK_LINK_GROUP = 1096; - static final int LINK_OPAQUE = 1097; + static final int LINK_OPAQUE = 1097; - static final int LINK_NAME = 1098; + static final int LINK_NAME = 1098; - /* Prefix Descriptor TLVs */ + /* Prefix Descriptor TLVs */ - static final int MULTI_TOPOLOGY_ID = 263; + static final int MULTI_TOPOLOGY_ID = 263; - static final int OSPF_ROUTE_TYPE = 264; + static final int OSPF_ROUTE_TYPE = 264; - static final int IP_REACHABILITY = 265; + static final int IP_REACHABILITY = 265; - /* Prefix Attribute TLVs */ + /* Prefix Attribute TLVs */ - static final int IGP_FLAGS = 1152; + static final int IGP_FLAGS = 1152; - static final int ROUTE_TAG = 1153; + static final int ROUTE_TAG = 1153; - static final int EXTENDED_ROUTE_TAG = 1154; + static final int EXTENDED_ROUTE_TAG = 1154; - static final int PREFIX_METRIC = 1155; + static final int PREFIX_METRIC = 1155; - static final int FORWARDING_ADDRESS = 1156; + static final int FORWARDING_ADDRESS = 1156; - static final int PREFIX_OPAQUE = 1157; + static final int PREFIX_OPAQUE = 1157; - /* Node Descriptor TLVs */ + /* Node Descriptor TLVs */ - static final int AS_NUMBER = 512; + static final int AS_NUMBER = 512; - static final int BGP_LS_ID = 513; + static final int BGP_LS_ID = 513; - static final int AREA_ID = 514; + static final int AREA_ID = 514; - static final int IGP_ROUTER_ID = 515; + static final int IGP_ROUTER_ID = 515; - /* Node Attribute TLVs */ + /* Node Attribute TLVs */ - static final int NODE_FLAG_BITS = 1024; + static final int NODE_FLAG_BITS = 1024; - static final int NODE_OPAQUE = 1025; + static final int NODE_OPAQUE = 1025; - static final int DYNAMIC_HOSTNAME = 1026; + static final int DYNAMIC_HOSTNAME = 1026; - static final int ISIS_AREA_IDENTIFIER = 1027; + static final int ISIS_AREA_IDENTIFIER = 1027; } diff --git a/bgp/linkstate/src/main/yang/bgp-linkstate.yang b/bgp/linkstate/src/main/yang/bgp-linkstate.yang index f4300e6635..fd6529aa4e 100644 --- a/bgp/linkstate/src/main/yang/bgp-linkstate.yang +++ b/bgp/linkstate/src/main/yang/bgp-linkstate.yang @@ -1,649 +1,649 @@ module bgp-linkstate { - yang-version 1; - namespace "urn:opendaylight:params:xml:ns:yang:bgp-linkstate"; - prefix "bgp-ls"; - - import ietf-inet-types { prefix inet; revision-date 2010-09-24; } - import bgp-message { prefix bgp-msg; revision-date 2013-09-19; } - import bgp-multiprotocol { prefix bgp-mp; revision-date 2013-09-19; } - import bgp-rib { prefix bgp-rib; revision-date 2013-09-25; } - import bgp-types { prefix bgp-t; revision-date 2013-09-19; } - import network-concepts { prefix netc; revision-date 2013-11-25; } - import rsvp { prefix rsvp; revision-date 2013-08-20; } - - organization "Cisco Systems, Inc."; - contact "Dana Kutenicsova "; - - description - "This module contains the base data model of a BGP message. - It rolls up the definitions contained in RFC4271 - and draft-ietf-idr-ls-distribution-03. - - Copyright (c)2013 Cisco Systems, Inc. All rights reserved. - - This program and the accompanying materials are made available - under the terms of the Eclipse Public License v1.0 which - accompanies this distribution, and is available at - http://www.eclipse.org/legal/epl-v10.html"; - - revision "2013-11-25" { - description - "Updated to cover network-concepts."; - } - - revision "2013-09-18" { - description - "Initial revision."; - reference "draft-ietf-idr-ls-distribution-03"; - } - - identity linkstate-address-family { - reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2"; - - base bgp-t:address-family; - } - - identity linkstate-subsequent-address-family { - reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2"; - - base bgp-t:subsequent-address-family; - } - - typedef nlri-type { - reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2"; - type enumeration { - enum node { - value 1; - } - enum link { - value 2; - } - enum ipv4-prefix { - value 3; - } - enum ipv6-prefix { - value 4; - } - } - } - - typedef protocol-id { - reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2"; - type enumeration { - enum unknown { - value 0; - } - enum isis-level1 { - value 1; - } - enum isis-level2 { - value 2; - } - enum ospf { - value 3; - } - enum direct { - value 4; - } - enum static { - value 5; - } - } - } - - typedef ospf-route-type { - reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.3.1"; - type enumeration { - enum intra-area { - value 1; - } - enum inter-area { - value 2; - } - enum external1 { - value 3; - } - enum external2 { - value 4; - } - enum nssa1 { - value 5; - } - enum nssa2 { - value 6; - } - } - } - - typedef route-distinguisher { - type uint64; - } - - typedef identifier { - type uint64; - } - - typedef domain-identifier { - reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4"; - type uint32; - } - - typedef area-identifier { - reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4"; - type uint32; - } - - typedef ipv4-interface-identifier { - reference "http://tools.ietf.org/html/rfc5305#section-3.2"; - type inet:ipv4-address; - } - - typedef ipv6-interface-identifier { - reference "http://tools.ietf.org/html/rfc6119#section-4.2"; - type inet:ipv6-address; - } - - typedef ospf-interface-identifier { - reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4"; - type uint32; - } - - typedef topology-identifier { - reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.5"; - type uint16 { - range "0..4095"; - } - } - - - grouping isis-router-identifier { - reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4"; - leaf iso-system-id { - type netc:iso-system-identifier; - mandatory true; - } - } - - grouping isis-lan-identifier { - reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4"; - container is-is-router-identifier { - uses isis-router-identifier; - } - leaf psn { - type uint8 { - range "1..255"; - } - mandatory true; - } - } - - grouping ospf-router-identifier { - reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4"; - leaf ospf-router-id { - type uint32; - mandatory true; - } - } - - grouping ospf-v2-lan-identifier { - reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4"; - uses ospf-router-identifier; - leaf ipv4-address { - type ipv4-interface-identifier; - mandatory true; - } - } - - grouping ospf-v3-lan-identifier { - reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4"; - uses ospf-router-identifier; - leaf lan-interface { - type ospf-interface-identifier; - mandatory true; - } - } - - grouping node-identifier { - leaf as-number { - type inet:as-number; - } - leaf area-id { - type area-identifier; - } - leaf domain-id { - type domain-identifier; - } - choice c-router-identifier { - case isis-node-case { - container isis-node { - uses isis-router-identifier; - } - } - - case isis-pseudonode-case { - container isis-pseudonode { - uses isis-lan-identifier; - } - } - - case ospf-node-case { - container ospf-node { - uses ospf-router-identifier; - } - } - - case ospf-pseudonode-case { - container ospf-pseudonode { - uses ospf-v3-lan-identifier; - } - } - } - } - - grouping link-lr-identifiers { - reference "http://tools.ietf.org/html/rfc5307"; - leaf link-local-identifier { - type uint32; - } - leaf link-remote-identifier { - type uint32; - } - } - - grouping prefix-identifiers { - leaf multi-topology-id { - type topology-identifier; - } - leaf ospf-route-type { - when "../../protocol-id = 'ospf'"; - type ospf-route-type; - } - leaf ip-reachability-information { - type inet:ip-prefix; - } - } - - grouping link-identifier { - uses link-lr-identifiers; - leaf ipv4-interface-address { - type ipv4-interface-identifier; - } - leaf ipv6-interface-address { - type ipv6-interface-identifier; - } - leaf ipv4-neighbor-address { - type ipv4-interface-identifier; - } - leaf ipv6-neighbor-address { - type ipv6-interface-identifier; - } - leaf multi-topology-id { - type topology-identifier; - } - } - - grouping linkstate-destination { - list c-linkstate-destination { - leaf nlri-type { - type nlri-type; - } - leaf distinguisher { - type route-distinguisher; - } - leaf protocol-id { - type protocol-id; - } - leaf identifier { - type identifier; - } - container local-node-descriptors { - uses node-identifier; - } - container remote-node-descriptors { - when "../nlri-type = link"; - uses node-identifier; - } - container link-descriptors { - when "../nlri-type = link"; - uses link-identifier; - } - container prefix-descriptors { - when "../nlri-type = 'ipv4-prefix' or ../nlri-type = 'ipv6-prefix'"; - uses prefix-identifiers; - } - } - } - - augment "/bgp-msg:update/bgp-msg:path-attributes/bgp-mp:mp-reach-nlri/bgp-mp:advertized-routes/bgp-mp:destination-type" { - case destination-linkstate-case { - container destination-linkstate { - uses linkstate-destination; - } - } - } - - augment "/bgp-msg:update/bgp-msg:path-attributes/bgp-mp:mp-unreach-nlri/bgp-mp:withdrawn-routes/bgp-mp:destination-type" { - case destination-linkstate-case { - container destination-linkstate { - uses linkstate-destination; - } - } - } - - typedef node-flag-bits { - reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.1.1"; - type bits { - bit overload { - position 0; - } - bit attached { - position 1; - } - bit external { - position 2; - } - bit abr { - position 3; - } - } - } - - typedef isis-area-identifier { - reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.1.2"; - type binary { - length "1..20"; - } - } - - typedef ipv4-router-identifier { - reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.1.4"; - type inet:ipv4-address; - } - - typedef ipv6-router-identifier { - reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.1.4"; - type inet:ipv6-address; - } - - grouping node-state { - reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.1"; - leaf-list topology-identifier { - type topology-identifier; - } - leaf node-flags { - type node-flag-bits; - } - leaf-list isis-area-id { - type isis-area-identifier; - } - leaf dynamic-hostname { - type string; - } - leaf ipv4-router-id { - type ipv4-router-identifier; - } - leaf ipv6-router-id { - type ipv6-router-identifier; - } - } - - typedef link-protection-type { - reference "http://tools.ietf.org/html/rfc5307#section-1.2"; - type enumeration { - enum extra-traffic { - value 1; - } - enum unprotected { - value 2; - } - enum shared { - value 4; - } - enum dedicated-1to1 { - value 8; - } - enum dedicated-1plus1 { - value 16; - } - enum enhanced { - value 32; - } - } - } - - // linkstate - typedef mpls-protocol-mask { - reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.2.2"; - type bits { - bit ldp { - position 0; - } - bit rsvpte { - position 1; - } - } - } - - typedef administrative-group { - type uint32; - } - - grouping unreserved-bandwidth { - leaf priority { - type uint8 { - range "0..7"; - } - } - leaf bandwidth { - type netc:bandwidth; - } - } - - grouping link-state { - reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.2"; - leaf local-ipv4-router-id { - type ipv4-router-identifier; - } - leaf local-ipv6-router-id { - type ipv6-router-identifier; - } - leaf remote-ipv4-router-id { - type ipv4-router-identifier; - } - leaf remote-ipv6-router-id { - type ipv6-router-identifier; - } - leaf mpls-protocol { - type mpls-protocol-mask; - } - leaf te-metric { - type netc:te-metric; - } - leaf metric { - type netc:metric; - } - leaf-list shared-risk-link-groups { - type rsvp:srlg-id; - } - leaf link-name { - type string; - } - leaf max-link-bandwidth { - type netc:bandwidth; - } - leaf max-reservable-bandwidth { - type netc:bandwidth; - } - list unreserved-bandwidth { - key "priority"; - uses unreserved-bandwidth; - } - leaf link-protection { - type link-protection-type; - } - leaf admin-group { - type administrative-group; - } - } - - typedef route-tag { - reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.3.2"; - type binary { - length "4"; - } - } - - typedef extended-route-tag { - reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.3.3"; - type binary { - length "8"; - } - } - - grouping igp-bits { - reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.3.1"; - leaf up-down { - type bits { - bit up-down { - position 0; - } - } - } - } - - grouping prefix-state { - container igp-bits { - uses igp-bits; - } - leaf-list route-tags { - type route-tag; - } - leaf-list extended-tags { - type extended-route-tag; - } - leaf prefix-metric { - type netc:igp-metric; - } - leaf ospf-forwarding-address { - type inet:ip-address; - } - } - - augment "/bgp-msg:update/bgp-msg:path-attributes" { - container linkstate-path-attribute { - choice link-state-attribute { - case node-attributes-case { - container node-attributes { - when "../../nlri-type = node"; - uses node-state; - } - } - case link-attributes-case { - container link-attributes { - when "../../nlri-type = link"; - uses link-state; - } - } - case prefix-attributes-case { - container prefix-attributes { - when "../nlri-type = 'ipv4-prefix' or ../nlri-type = 'ipv6-prefix'"; - uses prefix-state; - } - } - } - } - } - - augment "/bgp-rib:bgp-rib/bgp-rib:rib/bgp-rib:loc-rib/bgp-rib:tables/bgp-rib:routes" { - case linkstate-routes-case { - container linkstate-routes { - list linkstate-route { - description - "Link-state information entry. Due to - the complexity of link-state information - and YANG limitations this is the top-level - object from contract perspective. It is - keyed by route-key, whose format is - internal to the implementation exposing - this information. As an explicit example - it can rely on information stored in the - entry's subtree, so the subtree MUST NOT - be modified by outside entities. - Augmentations can attach data, but must - be explicitly aware that such data, unlike - the data modeled directly here, does not - have any effects on keys, especially they - must not impact equality tests."; - - leaf route-key { - description - "The sole function of this leaf - to act as the key in the list. - Its format does not form the - API contract of this model."; - type binary; - } - key "route-key"; - - leaf distinguisher { - type route-distinguisher; - } - leaf protocol-id { - type protocol-id; - } - leaf identifier { - type identifier; - } - - choice object-type { - case node-case { - container node-descriptors { - uses node-identifier; - } - } - case link-case { - container local-node-descriptors { - uses node-identifier; - } - container remote-node-descriptors { - uses node-identifier; - } - container link-descriptors { - uses link-identifier; - } - } - case prefix-case { - container advertising-node-descriptors { - uses node-identifier; - } - - uses prefix-identifiers; - } - } - - uses bgp-rib:route { - augment attributes { - choice attribute-type { - case node-case { - container node-attributes { - uses node-state; - } - } - case link-case { - container link-attributes { - uses link-state; - } - } - case prefix-case { - container prefix-attributes { - uses prefix-state; - } - } - } - } - } - } - } - } - } + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:bgp-linkstate"; + prefix "bgp-ls"; + + import ietf-inet-types { prefix inet; revision-date 2010-09-24; } + import bgp-message { prefix bgp-msg; revision-date 2013-09-19; } + import bgp-multiprotocol { prefix bgp-mp; revision-date 2013-09-19; } + import bgp-rib { prefix bgp-rib; revision-date 2013-09-25; } + import bgp-types { prefix bgp-t; revision-date 2013-09-19; } + import network-concepts { prefix netc; revision-date 2013-11-25; } + import rsvp { prefix rsvp; revision-date 2013-08-20; } + + organization "Cisco Systems, Inc."; + contact "Dana Kutenicsova "; + + description + "This module contains the base data model of a BGP message. + It rolls up the definitions contained in RFC4271 + and draft-ietf-idr-ls-distribution-03. + + Copyright (c)2013 Cisco Systems, Inc. All rights reserved. + + This program and the accompanying materials are made available + under the terms of the Eclipse Public License v1.0 which + accompanies this distribution, and is available at + http://www.eclipse.org/legal/epl-v10.html"; + + revision "2013-11-25" { + description + "Updated to cover network-concepts."; + } + + revision "2013-09-18" { + description + "Initial revision."; + reference "draft-ietf-idr-ls-distribution-03"; + } + + identity linkstate-address-family { + reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2"; + + base bgp-t:address-family; + } + + identity linkstate-subsequent-address-family { + reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2"; + + base bgp-t:subsequent-address-family; + } + + typedef nlri-type { + reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2"; + type enumeration { + enum node { + value 1; + } + enum link { + value 2; + } + enum ipv4-prefix { + value 3; + } + enum ipv6-prefix { + value 4; + } + } + } + + typedef protocol-id { + reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2"; + type enumeration { + enum unknown { + value 0; + } + enum isis-level1 { + value 1; + } + enum isis-level2 { + value 2; + } + enum ospf { + value 3; + } + enum direct { + value 4; + } + enum static { + value 5; + } + } + } + + typedef ospf-route-type { + reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.3.1"; + type enumeration { + enum intra-area { + value 1; + } + enum inter-area { + value 2; + } + enum external1 { + value 3; + } + enum external2 { + value 4; + } + enum nssa1 { + value 5; + } + enum nssa2 { + value 6; + } + } + } + + typedef route-distinguisher { + type uint64; + } + + typedef identifier { + type uint64; + } + + typedef domain-identifier { + reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4"; + type uint32; + } + + typedef area-identifier { + reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4"; + type uint32; + } + + typedef ipv4-interface-identifier { + reference "http://tools.ietf.org/html/rfc5305#section-3.2"; + type inet:ipv4-address; + } + + typedef ipv6-interface-identifier { + reference "http://tools.ietf.org/html/rfc6119#section-4.2"; + type inet:ipv6-address; + } + + typedef ospf-interface-identifier { + reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4"; + type uint32; + } + + typedef topology-identifier { + reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.5"; + type uint16 { + range "0..4095"; + } + } + + + grouping isis-router-identifier { + reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4"; + leaf iso-system-id { + type netc:iso-system-identifier; + mandatory true; + } + } + + grouping isis-lan-identifier { + reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4"; + container is-is-router-identifier { + uses isis-router-identifier; + } + leaf psn { + type uint8 { + range "1..255"; + } + mandatory true; + } + } + + grouping ospf-router-identifier { + reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4"; + leaf ospf-router-id { + type uint32; + mandatory true; + } + } + + grouping ospf-v2-lan-identifier { + reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4"; + uses ospf-router-identifier; + leaf ipv4-address { + type ipv4-interface-identifier; + mandatory true; + } + } + + grouping ospf-v3-lan-identifier { + reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4"; + uses ospf-router-identifier; + leaf lan-interface { + type ospf-interface-identifier; + mandatory true; + } + } + + grouping node-identifier { + leaf as-number { + type inet:as-number; + } + leaf area-id { + type area-identifier; + } + leaf domain-id { + type domain-identifier; + } + choice c-router-identifier { + case isis-node-case { + container isis-node { + uses isis-router-identifier; + } + } + + case isis-pseudonode-case { + container isis-pseudonode { + uses isis-lan-identifier; + } + } + + case ospf-node-case { + container ospf-node { + uses ospf-router-identifier; + } + } + + case ospf-pseudonode-case { + container ospf-pseudonode { + uses ospf-v3-lan-identifier; + } + } + } + } + + grouping link-lr-identifiers { + reference "http://tools.ietf.org/html/rfc5307"; + leaf link-local-identifier { + type uint32; + } + leaf link-remote-identifier { + type uint32; + } + } + + grouping prefix-identifiers { + leaf multi-topology-id { + type topology-identifier; + } + leaf ospf-route-type { + when "../../protocol-id = 'ospf'"; + type ospf-route-type; + } + leaf ip-reachability-information { + type inet:ip-prefix; + } + } + + grouping link-identifier { + uses link-lr-identifiers; + leaf ipv4-interface-address { + type ipv4-interface-identifier; + } + leaf ipv6-interface-address { + type ipv6-interface-identifier; + } + leaf ipv4-neighbor-address { + type ipv4-interface-identifier; + } + leaf ipv6-neighbor-address { + type ipv6-interface-identifier; + } + leaf multi-topology-id { + type topology-identifier; + } + } + + grouping linkstate-destination { + list c-linkstate-destination { + leaf nlri-type { + type nlri-type; + } + leaf distinguisher { + type route-distinguisher; + } + leaf protocol-id { + type protocol-id; + } + leaf identifier { + type identifier; + } + container local-node-descriptors { + uses node-identifier; + } + container remote-node-descriptors { + when "../nlri-type = link"; + uses node-identifier; + } + container link-descriptors { + when "../nlri-type = link"; + uses link-identifier; + } + container prefix-descriptors { + when "../nlri-type = 'ipv4-prefix' or ../nlri-type = 'ipv6-prefix'"; + uses prefix-identifiers; + } + } + } + + augment "/bgp-msg:update/bgp-msg:path-attributes/bgp-mp:mp-reach-nlri/bgp-mp:advertized-routes/bgp-mp:destination-type" { + case destination-linkstate-case { + container destination-linkstate { + uses linkstate-destination; + } + } + } + + augment "/bgp-msg:update/bgp-msg:path-attributes/bgp-mp:mp-unreach-nlri/bgp-mp:withdrawn-routes/bgp-mp:destination-type" { + case destination-linkstate-case { + container destination-linkstate { + uses linkstate-destination; + } + } + } + + typedef node-flag-bits { + reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.1.1"; + type bits { + bit overload { + position 0; + } + bit attached { + position 1; + } + bit external { + position 2; + } + bit abr { + position 3; + } + } + } + + typedef isis-area-identifier { + reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.1.2"; + type binary { + length "1..20"; + } + } + + typedef ipv4-router-identifier { + reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.1.4"; + type inet:ipv4-address; + } + + typedef ipv6-router-identifier { + reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.1.4"; + type inet:ipv6-address; + } + + grouping node-state { + reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.1"; + leaf-list topology-identifier { + type topology-identifier; + } + leaf node-flags { + type node-flag-bits; + } + leaf-list isis-area-id { + type isis-area-identifier; + } + leaf dynamic-hostname { + type string; + } + leaf ipv4-router-id { + type ipv4-router-identifier; + } + leaf ipv6-router-id { + type ipv6-router-identifier; + } + } + + typedef link-protection-type { + reference "http://tools.ietf.org/html/rfc5307#section-1.2"; + type enumeration { + enum extra-traffic { + value 1; + } + enum unprotected { + value 2; + } + enum shared { + value 4; + } + enum dedicated-1to1 { + value 8; + } + enum dedicated-1plus1 { + value 16; + } + enum enhanced { + value 32; + } + } + } + + // linkstate + typedef mpls-protocol-mask { + reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.2.2"; + type bits { + bit ldp { + position 0; + } + bit rsvpte { + position 1; + } + } + } + + typedef administrative-group { + type uint32; + } + + grouping unreserved-bandwidth { + leaf priority { + type uint8 { + range "0..7"; + } + } + leaf bandwidth { + type netc:bandwidth; + } + } + + grouping link-state { + reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.2"; + leaf local-ipv4-router-id { + type ipv4-router-identifier; + } + leaf local-ipv6-router-id { + type ipv6-router-identifier; + } + leaf remote-ipv4-router-id { + type ipv4-router-identifier; + } + leaf remote-ipv6-router-id { + type ipv6-router-identifier; + } + leaf mpls-protocol { + type mpls-protocol-mask; + } + leaf te-metric { + type netc:te-metric; + } + leaf metric { + type netc:metric; + } + leaf-list shared-risk-link-groups { + type rsvp:srlg-id; + } + leaf link-name { + type string; + } + leaf max-link-bandwidth { + type netc:bandwidth; + } + leaf max-reservable-bandwidth { + type netc:bandwidth; + } + list unreserved-bandwidth { + key "priority"; + uses unreserved-bandwidth; + } + leaf link-protection { + type link-protection-type; + } + leaf admin-group { + type administrative-group; + } + } + + typedef route-tag { + reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.3.2"; + type binary { + length "4"; + } + } + + typedef extended-route-tag { + reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.3.3"; + type binary { + length "8"; + } + } + + grouping igp-bits { + reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.3.1"; + leaf up-down { + type bits { + bit up-down { + position 0; + } + } + } + } + + grouping prefix-state { + container igp-bits { + uses igp-bits; + } + leaf-list route-tags { + type route-tag; + } + leaf-list extended-tags { + type extended-route-tag; + } + leaf prefix-metric { + type netc:igp-metric; + } + leaf ospf-forwarding-address { + type inet:ip-address; + } + } + + augment "/bgp-msg:update/bgp-msg:path-attributes" { + container linkstate-path-attribute { + choice link-state-attribute { + case node-attributes-case { + container node-attributes { + when "../../nlri-type = node"; + uses node-state; + } + } + case link-attributes-case { + container link-attributes { + when "../../nlri-type = link"; + uses link-state; + } + } + case prefix-attributes-case { + container prefix-attributes { + when "../nlri-type = 'ipv4-prefix' or ../nlri-type = 'ipv6-prefix'"; + uses prefix-state; + } + } + } + } + } + + augment "/bgp-rib:bgp-rib/bgp-rib:rib/bgp-rib:loc-rib/bgp-rib:tables/bgp-rib:routes" { + case linkstate-routes-case { + container linkstate-routes { + list linkstate-route { + description + "Link-state information entry. Due to + the complexity of link-state information + and YANG limitations this is the top-level + object from contract perspective. It is + keyed by route-key, whose format is + internal to the implementation exposing + this information. As an explicit example + it can rely on information stored in the + entry's subtree, so the subtree MUST NOT + be modified by outside entities. + Augmentations can attach data, but must + be explicitly aware that such data, unlike + the data modeled directly here, does not + have any effects on keys, especially they + must not impact equality tests."; + + leaf route-key { + description + "The sole function of this leaf + to act as the key in the list. + Its format does not form the + API contract of this model."; + type binary; + } + key "route-key"; + + leaf distinguisher { + type route-distinguisher; + } + leaf protocol-id { + type protocol-id; + } + leaf identifier { + type identifier; + } + + choice object-type { + case node-case { + container node-descriptors { + uses node-identifier; + } + } + case link-case { + container local-node-descriptors { + uses node-identifier; + } + container remote-node-descriptors { + uses node-identifier; + } + container link-descriptors { + uses link-identifier; + } + } + case prefix-case { + container advertising-node-descriptors { + uses node-identifier; + } + + uses prefix-identifiers; + } + } + + uses bgp-rib:route { + augment attributes { + choice attribute-type { + case node-case { + container node-attributes { + uses node-state; + } + } + case link-case { + container link-attributes { + uses link-state; + } + } + case prefix-case { + container prefix-attributes { + uses prefix-state; + } + } + } + } + } + } + } + } + } } diff --git a/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/ActivatorTest.java b/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/ActivatorTest.java index 3fc5cda5ff..d7eb58459b 100644 --- a/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/ActivatorTest.java +++ b/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/ActivatorTest.java @@ -21,33 +21,33 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.link public class ActivatorTest { - @Test - public void testActivator() throws Exception { - final BGPActivator act = new BGPActivator(); - final BGPExtensionProviderContext context = new SimpleBGPExtensionProviderContext(); + @Test + public void testActivator() throws Exception { + final BGPActivator act = new BGPActivator(); + final BGPExtensionProviderContext context = new SimpleBGPExtensionProviderContext(); - assertNull(context.getAddressFamilyRegistry().classForFamily(16388)); - assertNull(context.getSubsequentAddressFamilyRegistry().classForFamily(71)); + assertNull(context.getAddressFamilyRegistry().classForFamily(16388)); + assertNull(context.getSubsequentAddressFamilyRegistry().classForFamily(71)); - act.start(context); + act.start(context); - assertEquals(LinkstateAddressFamily.class, context.getAddressFamilyRegistry().classForFamily(16388)); - assertEquals(LinkstateSubsequentAddressFamily.class, context.getSubsequentAddressFamilyRegistry().classForFamily(71)); + assertEquals(LinkstateAddressFamily.class, context.getAddressFamilyRegistry().classForFamily(16388)); + assertEquals(LinkstateSubsequentAddressFamily.class, context.getSubsequentAddressFamilyRegistry().classForFamily(71)); - act.close(); - } + act.close(); + } - @Test - public void testRIBActivator() { - final RIBActivator ribAct = new RIBActivator(); - final RIBExtensionProviderContext context = new SimpleRIBExtensionProviderContext(); + @Test + public void testRIBActivator() { + final RIBActivator ribAct = new RIBActivator(); + final RIBExtensionProviderContext context = new SimpleRIBExtensionProviderContext(); - assertNull(context.getAdjRIBsInFactory(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class)); + assertNull(context.getAdjRIBsInFactory(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class)); - ribAct.startRIBExtensionProvider(context); + ribAct.startRIBExtensionProvider(context); - assertNotNull(context.getAdjRIBsInFactory(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class)); + assertNotNull(context.getAdjRIBsInFactory(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class)); - ribAct.close(); - } + ribAct.close(); + } } diff --git a/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAdjRIBsInTest.java b/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAdjRIBsInTest.java index 0f0afe4c96..a820eb1695 100644 --- a/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAdjRIBsInTest.java +++ b/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAdjRIBsInTest.java @@ -70,148 +70,161 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; public class LinkstateAdjRIBsInTest { - @Mock - private DataModificationTransaction trans; - - @Mock - private RibReference rib; - - @Mock - private Peer peer; - - - - private LinkstateAdjRIBsIn lrib; - - private CLinkstateDestinationBuilder dBuilder; - - private final MpReachNlriBuilder builder = new MpReachNlriBuilder(); - - private final List destinations = new ArrayList<>(); - - private final HashMap data = new HashMap<>(); - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - TablesKey key = new TablesKey(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class); - final InstanceIdentifier iid = InstanceIdentifier.builder(BgpRib.class).child(Rib.class, new RibKey(new RibId("test-rib"))).toInstance(); - Mockito.doAnswer(new Answer() { - @Override - public String answer(final InvocationOnMock invocation) throws Throwable { - final Object[] args = invocation.getArguments(); - LinkstateAdjRIBsInTest.this.data.put(args[0], args[1]); - return null; - } - - }).when(this.trans).putOperationalData(Matchers.any(InstanceIdentifier.class), Matchers.any(Tables.class)); - - Mockito.doAnswer(new Answer() { - @Override - public Object answer(final InvocationOnMock invocation) throws Throwable { - final Object[] args = invocation.getArguments(); - Object result = LinkstateAdjRIBsInTest.this.data.get(args[0]); - if (result == null) { - InstanceIdentifier attrId = iid.child(LocRib.class).child(Tables.class).child(Attributes.class); - if (attrId.containsWildcarded((InstanceIdentifier) args[0])) { - result = new AttributesBuilder().setUptodate(Boolean.TRUE).build(); - } - } - - return result; - } - - }).when(this.trans).readOperationalData(Matchers.any(InstanceIdentifier.class)); - - Mockito.doAnswer(new Answer() { - @Override - public Object answer(final InvocationOnMock invocation) throws Throwable { - final Object[] args = invocation.getArguments(); - LinkstateAdjRIBsInTest.this.data.remove(args[0]); - return null; - } - - }).when(this.trans).removeOperationalData(Matchers.any(InstanceIdentifier.class)); - - Mockito.doReturn(iid).when(this.rib).getInstanceIdentifier(); - Mockito.doReturn(new Comparator() { - - @Override - public int compare(PathAttributes o1, PathAttributes o2) { - return 0; - } - }).when(this.peer).getComparator(); - Mockito.doReturn("test").when(this.peer).toString(); - this.lrib = new LinkstateAdjRIBsIn(this.trans, this.rib, key); - - this.dBuilder = new CLinkstateDestinationBuilder(); - - this.dBuilder.setProtocolId(ProtocolId.Direct); - this.dBuilder.setIdentifier(new Identifier(new BigInteger(new byte[]{5}))); - this.dBuilder.setLocalNodeDescriptors(new LocalNodeDescriptorsBuilder().setAsNumber(new AsNumber(35L)).build()); - } - - @Test - public void testAddPrefix() { - this.dBuilder.setNlriType(NlriType.Ipv4Prefix); - this.dBuilder.setPrefixDescriptors(new PrefixDescriptorsBuilder().setIpReachabilityInformation(new IpPrefix(new Ipv4Prefix("12.34.35.55/32"))).build()); - this.destinations.add(this.dBuilder.build()); - this.builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(new DestinationLinkstateCaseBuilder().setDestinationLinkstate(new DestinationLinkstateBuilder().setCLinkstateDestination(this.destinations).build()).build()).build()); - - PathAttributesBuilder pa = new PathAttributesBuilder(); - pa.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build()); - - this.lrib.addRoutes(this.trans, this.peer, this.builder.build(), pa.build()); - - Mockito.verify(this.trans, Mockito.times(3)).putOperationalData(Matchers.any(InstanceIdentifier.class), - Matchers.any(DataObject.class)); - - assertEquals(3,this.data.size()); - } - - @Test - public void testAddNode() { - this.dBuilder.setNlriType(NlriType.Node); - this.dBuilder.setRemoteNodeDescriptors(new RemoteNodeDescriptorsBuilder().setCRouterIdentifier(new IsisPseudonodeCaseBuilder().setIsisPseudonode(new IsisPseudonodeBuilder().setIsIsRouterIdentifier(new IsIsRouterIdentifierBuilder().setIsoSystemId(new IsoSystemIdentifier(new byte[]{1,2,3,4,5,6})).build()).build()).build()).build()); - this.destinations.add(this.dBuilder.build()); - this.builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(new DestinationLinkstateCaseBuilder().setDestinationLinkstate(new DestinationLinkstateBuilder().setCLinkstateDestination(this.destinations).build()).build()).build()); - - PathAttributesBuilder pa = new PathAttributesBuilder(); - pa.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build()); - - this.lrib.addRoutes(this.trans, this.peer, this.builder.build(), pa.build()); - - Mockito.verify(this.trans, Mockito.times(3)).putOperationalData(Matchers.any(InstanceIdentifier.class), - Matchers.any(DataObject.class)); - assertEquals(3,this.data.size()); - } - - @Test - public void testAddRemoveLink() { - this.dBuilder.setNlriType(NlriType.Link); - this.dBuilder.setRemoteNodeDescriptors(new RemoteNodeDescriptorsBuilder().setCRouterIdentifier(new IsisPseudonodeCaseBuilder().setIsisPseudonode(new IsisPseudonodeBuilder().setIsIsRouterIdentifier(new IsIsRouterIdentifierBuilder().setIsoSystemId(new IsoSystemIdentifier(new byte[]{1,2,3,4,5,6})).build()).build()).build()).build()); - this.dBuilder.setLinkDescriptors(new LinkDescriptorsBuilder().setIpv4InterfaceAddress(new Ipv4InterfaceIdentifier(new Ipv4Address("127.0.0.1"))).build()); - this.destinations.add(this.dBuilder.build()); - this.builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(new DestinationLinkstateCaseBuilder().setDestinationLinkstate(new DestinationLinkstateBuilder().setCLinkstateDestination(this.destinations).build()).build()).build()); - - PathAttributesBuilder pa = new PathAttributesBuilder(); - pa.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build()); - - this.lrib.addRoutes(this.trans, this.peer, this.builder.build(), pa.build()); - - Mockito.verify(this.trans, Mockito.times(3)).putOperationalData(Matchers.any(InstanceIdentifier.class), - Matchers.any(DataObject.class)); - assertEquals(3,this.data.size()); - - MpUnreachNlriBuilder builder = new MpUnreachNlriBuilder(); - builder.setAfi(LinkstateAddressFamily.class); - builder.setSafi(LinkstateSubsequentAddressFamily.class); - builder.setWithdrawnRoutes(new WithdrawnRoutesBuilder().setDestinationType( - new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationLinkstateCaseBuilder().setDestinationLinkstate( - new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.destination.linkstate._case.DestinationLinkstateBuilder().setCLinkstateDestination(this.destinations).build()).build()).build()); - this.lrib.removeRoutes(this.trans, this.peer, builder.build()); - - Mockito.verify(this.trans, Mockito.times(2)).removeOperationalData(Matchers.any(InstanceIdentifier.class)); - assertEquals(2,this.data.size()); - } + @Mock + private DataModificationTransaction trans; + + @Mock + private RibReference rib; + + @Mock + private Peer peer; + + private LinkstateAdjRIBsIn lrib; + + private CLinkstateDestinationBuilder dBuilder; + + private final MpReachNlriBuilder builder = new MpReachNlriBuilder(); + + private final List destinations = new ArrayList<>(); + + private final HashMap data = new HashMap<>(); + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + TablesKey key = new TablesKey(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class); + final InstanceIdentifier iid = InstanceIdentifier.builder(BgpRib.class).child(Rib.class, new RibKey(new RibId("test-rib"))).toInstance(); + Mockito.doAnswer(new Answer() { + @Override + public String answer(final InvocationOnMock invocation) throws Throwable { + final Object[] args = invocation.getArguments(); + LinkstateAdjRIBsInTest.this.data.put(args[0], args[1]); + return null; + } + + }).when(this.trans).putOperationalData(Matchers.any(InstanceIdentifier.class), Matchers.any(Tables.class)); + + Mockito.doAnswer(new Answer() { + @Override + public Object answer(final InvocationOnMock invocation) throws Throwable { + final Object[] args = invocation.getArguments(); + Object result = LinkstateAdjRIBsInTest.this.data.get(args[0]); + if (result == null) { + InstanceIdentifier attrId = iid.child(LocRib.class).child(Tables.class).child(Attributes.class); + if (attrId.containsWildcarded((InstanceIdentifier) args[0])) { + result = new AttributesBuilder().setUptodate(Boolean.TRUE).build(); + } + } + + return result; + } + + }).when(this.trans).readOperationalData(Matchers.any(InstanceIdentifier.class)); + + Mockito.doAnswer(new Answer() { + @Override + public Object answer(final InvocationOnMock invocation) throws Throwable { + final Object[] args = invocation.getArguments(); + LinkstateAdjRIBsInTest.this.data.remove(args[0]); + return null; + } + + }).when(this.trans).removeOperationalData(Matchers.any(InstanceIdentifier.class)); + + Mockito.doReturn(iid).when(this.rib).getInstanceIdentifier(); + Mockito.doReturn(new Comparator() { + + @Override + public int compare(PathAttributes o1, PathAttributes o2) { + return 0; + } + }).when(this.peer).getComparator(); + Mockito.doReturn("test").when(this.peer).toString(); + this.lrib = new LinkstateAdjRIBsIn(this.trans, this.rib, key); + + this.dBuilder = new CLinkstateDestinationBuilder(); + + this.dBuilder.setProtocolId(ProtocolId.Direct); + this.dBuilder.setIdentifier(new Identifier(new BigInteger(new byte[] { 5 }))); + this.dBuilder.setLocalNodeDescriptors(new LocalNodeDescriptorsBuilder().setAsNumber(new AsNumber(35L)).build()); + } + + @Test + public void testAddPrefix() { + this.dBuilder.setNlriType(NlriType.Ipv4Prefix); + this.dBuilder.setPrefixDescriptors(new PrefixDescriptorsBuilder().setIpReachabilityInformation( + new IpPrefix(new Ipv4Prefix("12.34.35.55/32"))).build()); + this.destinations.add(this.dBuilder.build()); + this.builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType( + new DestinationLinkstateCaseBuilder().setDestinationLinkstate( + new DestinationLinkstateBuilder().setCLinkstateDestination(this.destinations).build()).build()).build()); + + PathAttributesBuilder pa = new PathAttributesBuilder(); + pa.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build()); + + this.lrib.addRoutes(this.trans, this.peer, this.builder.build(), pa.build()); + + Mockito.verify(this.trans, Mockito.times(3)).putOperationalData(Matchers.any(InstanceIdentifier.class), + Matchers.any(DataObject.class)); + + assertEquals(3, this.data.size()); + } + + @Test + public void testAddNode() { + this.dBuilder.setNlriType(NlriType.Node); + this.dBuilder.setRemoteNodeDescriptors(new RemoteNodeDescriptorsBuilder().setCRouterIdentifier( + new IsisPseudonodeCaseBuilder().setIsisPseudonode( + new IsisPseudonodeBuilder().setIsIsRouterIdentifier( + new IsIsRouterIdentifierBuilder().setIsoSystemId(new IsoSystemIdentifier(new byte[] { 1, 2, 3, 4, 5, 6 })).build()).build()).build()).build()); + this.destinations.add(this.dBuilder.build()); + this.builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType( + new DestinationLinkstateCaseBuilder().setDestinationLinkstate( + new DestinationLinkstateBuilder().setCLinkstateDestination(this.destinations).build()).build()).build()); + + PathAttributesBuilder pa = new PathAttributesBuilder(); + pa.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build()); + + this.lrib.addRoutes(this.trans, this.peer, this.builder.build(), pa.build()); + + Mockito.verify(this.trans, Mockito.times(3)).putOperationalData(Matchers.any(InstanceIdentifier.class), + Matchers.any(DataObject.class)); + assertEquals(3, this.data.size()); + } + + @Test + public void testAddRemoveLink() { + this.dBuilder.setNlriType(NlriType.Link); + this.dBuilder.setRemoteNodeDescriptors(new RemoteNodeDescriptorsBuilder().setCRouterIdentifier( + new IsisPseudonodeCaseBuilder().setIsisPseudonode( + new IsisPseudonodeBuilder().setIsIsRouterIdentifier( + new IsIsRouterIdentifierBuilder().setIsoSystemId(new IsoSystemIdentifier(new byte[] { 1, 2, 3, 4, 5, 6 })).build()).build()).build()).build()); + this.dBuilder.setLinkDescriptors(new LinkDescriptorsBuilder().setIpv4InterfaceAddress( + new Ipv4InterfaceIdentifier(new Ipv4Address("127.0.0.1"))).build()); + this.destinations.add(this.dBuilder.build()); + this.builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType( + new DestinationLinkstateCaseBuilder().setDestinationLinkstate( + new DestinationLinkstateBuilder().setCLinkstateDestination(this.destinations).build()).build()).build()); + + PathAttributesBuilder pa = new PathAttributesBuilder(); + pa.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build()); + + this.lrib.addRoutes(this.trans, this.peer, this.builder.build(), pa.build()); + + Mockito.verify(this.trans, Mockito.times(3)).putOperationalData(Matchers.any(InstanceIdentifier.class), + Matchers.any(DataObject.class)); + assertEquals(3, this.data.size()); + + MpUnreachNlriBuilder builder = new MpUnreachNlriBuilder(); + builder.setAfi(LinkstateAddressFamily.class); + builder.setSafi(LinkstateSubsequentAddressFamily.class); + builder.setWithdrawnRoutes(new WithdrawnRoutesBuilder().setDestinationType( + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.DestinationLinkstateCaseBuilder().setDestinationLinkstate( + new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.update.path.attributes.mp.unreach.nlri.withdrawn.routes.destination.type.destination.linkstate._case.DestinationLinkstateBuilder().setCLinkstateDestination( + this.destinations).build()).build()).build()); + this.lrib.removeRoutes(this.trans, this.peer, builder.build()); + + Mockito.verify(this.trans, Mockito.times(2)).removeOperationalData(Matchers.any(InstanceIdentifier.class)); + assertEquals(2, this.data.size()); + } } diff --git a/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAttributeParserTest.java b/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAttributeParserTest.java index aced557df8..511b52e10d 100644 --- a/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAttributeParserTest.java +++ b/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAttributeParserTest.java @@ -12,6 +12,9 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; + +import com.google.common.collect.Lists; + import io.netty.buffer.Unpooled; import org.junit.Test; @@ -35,116 +38,111 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mult import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpReachNlriBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.mp.reach.nlri.AdvertizedRoutesBuilder; -import com.google.common.collect.Lists; - public class LinkstateAttributeParserTest { - private static final byte[] LINK_ATTR = new byte[] { (byte) 0x04, (byte) 0x04, (byte) 0x00, (byte) 0x04, (byte) 0x2a, (byte) 0x2a, - (byte) 0x2a, (byte) 0x2a, (byte) 0x04, (byte) 0x06, (byte) 0x00, (byte) 0x04, (byte) 0x2b, (byte) 0x2b, (byte) 0x2b, - (byte) 0x2b, (byte) 0x04, (byte) 0x40, (byte) 0x00, (byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0x04, (byte) 0x41, (byte) 0x00, (byte) 0x04, (byte) 0x49, (byte) 0x98, (byte) 0x96, (byte) 0x80, (byte) 0x04, - (byte) 0x42, (byte) 0x00, (byte) 0x04, (byte) 0x46, (byte) 0x43, (byte) 0x50, (byte) 0x00, (byte) 0x04, (byte) 0x43, - (byte) 0x00, (byte) 0x20, (byte) 0x46, (byte) 0x43, (byte) 0x50, (byte) 0x00, (byte) 0x46, (byte) 0x43, (byte) 0x50, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x44, - (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x45, (byte) 0x00, (byte) 0x01, - (byte) 0x08, (byte) 0x04, (byte) 0x46, (byte) 0x00, (byte) 0x01, (byte) 0xc0, (byte) 0x04, (byte) 0x47, (byte) 0x00, - (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x0a, (byte) 0x04, (byte) 0x48, (byte) 0x00, (byte) 0x08, (byte) 0x12, - (byte) 0x34, (byte) 0x56, (byte) 0x78, (byte) 0x10, (byte) 0x30, (byte) 0x50, (byte) 0x70, (byte) 0x04, (byte) 0x4a, - (byte) 0x00, (byte) 0x05, (byte) 0x31, (byte) 0x32, (byte) 0x4b, (byte) 0x2d, (byte) 0x32, - - (byte) 0x04, (byte) 0x88, (byte) 0x00, (byte) 0x01, (byte) 0x0a }; - - private static final byte[] NODE_ATTR = new byte[] { (byte) 0x01, (byte) 0x07, (byte) 0x00, (byte) 0x04, (byte) 0x00, (byte) 0x2a, - (byte) 0x00, (byte) 0x2b, (byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0xb0, (byte) 0x04, (byte) 0x02, - (byte) 0x00, (byte) 0x05, (byte) 0x31, (byte) 0x32, (byte) 0x4b, (byte) 0x2d, (byte) 0x32, (byte) 0x04, (byte) 0x03, - (byte) 0x00, (byte) 0x01, (byte) 0x72, (byte) 0x04, (byte) 0x03, - (byte) 0x00, (byte) 0x01, (byte) 0x73, (byte) 0x04, (byte) 0x04, (byte) 0x00, (byte) 0x04, (byte) 0x29, (byte) 0x29, - (byte) 0x29, (byte) 0x29, (byte) 0x04, (byte) 0x88, (byte) 0x00, (byte) 0x01, (byte) 0x0a }; - - private static final byte[] P4_ATTR = new byte[] { (byte) 0x04, (byte) 0x80, (byte) 0x00, (byte) 0x01, (byte) 0xff, (byte) 0x04, - (byte) 0x81, (byte) 0x00, (byte) 0x08, (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78, (byte) 0x10, (byte) 0x30, - (byte) 0x50, (byte) 0x70, (byte) 0x04, (byte) 0x82, (byte) 0x00, (byte) 0x08, (byte) 0x12, (byte) 0x34, (byte) 0x56, - (byte) 0x78, (byte) 0x10, (byte) 0x30, (byte) 0x50, (byte) 0x70, (byte) 0x04, (byte) 0x83, (byte) 0x00, (byte) 0x04, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x0a, (byte) 0x04, (byte) 0x84, (byte) 0x00, (byte) 0x04, (byte) 0x0a, - (byte) 0x19, (byte) 0x02, (byte) 0x1b, (byte) 0x04, (byte) 0x85, (byte) 0x00, (byte) 0x01, (byte) 0x0a, (byte) 0x04, - (byte) 0x88, (byte) 0x00, (byte) 0x01, (byte) 0x0a }; - - private final LinkstateAttributeParser parser = new LinkstateAttributeParser(); - - private static PathAttributesBuilder createBuilder(final NlriType type) { - return new PathAttributesBuilder().addAugmentation( - org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.PathAttributes1.class, - new PathAttributes1Builder().setMpReachNlri( - new MpReachNlriBuilder().setAfi(LinkstateAddressFamily.class).setSafi(LinkstateSubsequentAddressFamily.class).setAdvertizedRoutes( - new AdvertizedRoutesBuilder().setDestinationType( - new DestinationLinkstateCaseBuilder().setDestinationLinkstate( - new DestinationLinkstateBuilder().setCLinkstateDestination( - Lists.newArrayList(new CLinkstateDestinationBuilder().setNlriType(type).build())).build()).build()).build()).build()).build()); - } - - @Test - public void testPositiveLinks() throws BGPParsingException { - final PathAttributesBuilder builder = createBuilder(NlriType.Link); - this.parser.parseAttribute(Unpooled.copiedBuffer(LINK_ATTR), builder); - final PathAttributes1 attrs = builder.getAugmentation(PathAttributes1.class); - final LinkAttributes ls = ((LinkAttributesCase) attrs.getLinkstatePathAttribute().getLinkStateAttribute()).getLinkAttributes(); - assertNotNull(ls); - - assertEquals("42.42.42.42", ls.getLocalIpv4RouterId().getValue()); - assertEquals(new Long(10), ls.getMetric().getValue()); - assertEquals(new Long(0), ls.getAdminGroup().getValue()); - assertEquals("43.43.43.43", ls.getRemoteIpv4RouterId().getValue()); - assertArrayEquals(new byte[] { (byte) 0x49, (byte) 0x98, (byte) 0x96, (byte) 0x80 }, ls.getMaxLinkBandwidth().getValue()); - assertArrayEquals(new byte[] { (byte) 0x46, (byte) 0x43, (byte) 0x50, (byte) 0x00 }, ls.getMaxReservableBandwidth().getValue()); - assertNotNull(ls.getUnreservedBandwidth()); - assertEquals(8, ls.getUnreservedBandwidth().size()); - assertEquals(LinkProtectionType.Dedicated1to1, ls.getLinkProtection()); - assertTrue(ls.getMplsProtocol().isLdp()); - assertTrue(ls.getMplsProtocol().isRsvpte()); - assertEquals(2, ls.getSharedRiskLinkGroups().size()); - assertEquals(305419896, ls.getSharedRiskLinkGroups().get(0).getValue().intValue()); - assertEquals("12K-2", ls.getLinkName()); - } - - @Test - public void testPositiveNodes() throws BGPParsingException { - final PathAttributesBuilder builder = createBuilder(NlriType.Node); - this.parser.parseAttribute(Unpooled.copiedBuffer(NODE_ATTR), builder); - - final PathAttributes1 attrs = builder.getAugmentation(PathAttributes1.class); - final NodeAttributes ls = ((NodeAttributesCase) attrs.getLinkstatePathAttribute().getLinkStateAttribute()).getNodeAttributes(); - assertNotNull(ls); - - assertEquals(2, ls.getTopologyIdentifier().size()); - assertEquals(42, ls.getTopologyIdentifier().get(0).getValue().intValue()); - assertTrue(ls.getNodeFlags().isOverload()); - assertFalse(ls.getNodeFlags().isAttached()); - assertTrue(ls.getNodeFlags().isExternal()); - assertTrue(ls.getNodeFlags().isAbr()); - - assertEquals("12K-2", ls.getDynamicHostname()); - assertEquals(2, ls.getIsisAreaId().size()); - assertEquals("41.41.41.41", ls.getIpv4RouterId().getValue()); - } - - @Test - public void testPositiveV4Prefixes() throws BGPParsingException { - final PathAttributesBuilder builder = createBuilder(NlriType.Ipv4Prefix); - this.parser.parseAttribute(Unpooled.copiedBuffer(P4_ATTR), builder); - - final PathAttributes1 attrs = builder.getAugmentation(PathAttributes1.class); - final PrefixAttributes ls = ((PrefixAttributesCase) attrs.getLinkstatePathAttribute().getLinkStateAttribute()).getPrefixAttributes(); - assertNotNull(ls); - - assertTrue(ls.getIgpBits().getUpDown().isUpDown()); - assertEquals(2, ls.getRouteTags().size()); - assertArrayEquals(new byte[] { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78 }, ls.getRouteTags().get(0).getValue()); - assertEquals(1, ls.getExtendedTags().size()); - assertArrayEquals(new byte[] { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78, (byte) 0x10, (byte) 0x30, (byte) 0x50, - (byte) 0x70 }, ls.getExtendedTags().get(0).getValue()); - assertEquals(10, ls.getPrefixMetric().getValue().intValue()); - assertEquals("10.25.2.27", ls.getOspfForwardingAddress().getIpv4Address().getValue()); - } + private static final byte[] LINK_ATTR = new byte[] { (byte) 0x04, (byte) 0x04, (byte) 0x00, (byte) 0x04, (byte) 0x2a, (byte) 0x2a, + (byte) 0x2a, (byte) 0x2a, (byte) 0x04, (byte) 0x06, (byte) 0x00, (byte) 0x04, (byte) 0x2b, (byte) 0x2b, (byte) 0x2b, (byte) 0x2b, + (byte) 0x04, (byte) 0x40, (byte) 0x00, (byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x41, + (byte) 0x00, (byte) 0x04, (byte) 0x49, (byte) 0x98, (byte) 0x96, (byte) 0x80, (byte) 0x04, (byte) 0x42, (byte) 0x00, (byte) 0x04, + (byte) 0x46, (byte) 0x43, (byte) 0x50, (byte) 0x00, (byte) 0x04, (byte) 0x43, (byte) 0x00, (byte) 0x20, (byte) 0x46, (byte) 0x43, + (byte) 0x50, (byte) 0x00, (byte) 0x46, (byte) 0x43, (byte) 0x50, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, + (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, + (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, + (byte) 0x04, (byte) 0x44, (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x45, (byte) 0x00, + (byte) 0x01, (byte) 0x08, (byte) 0x04, (byte) 0x46, (byte) 0x00, (byte) 0x01, (byte) 0xc0, (byte) 0x04, (byte) 0x47, (byte) 0x00, + (byte) 0x03, (byte) 0x00, (byte) 0x00, (byte) 0x0a, (byte) 0x04, (byte) 0x48, (byte) 0x00, (byte) 0x08, (byte) 0x12, (byte) 0x34, + (byte) 0x56, (byte) 0x78, (byte) 0x10, (byte) 0x30, (byte) 0x50, (byte) 0x70, (byte) 0x04, (byte) 0x4a, (byte) 0x00, (byte) 0x05, + (byte) 0x31, (byte) 0x32, (byte) 0x4b, (byte) 0x2d, (byte) 0x32, + + (byte) 0x04, (byte) 0x88, (byte) 0x00, (byte) 0x01, (byte) 0x0a }; + + private static final byte[] NODE_ATTR = new byte[] { (byte) 0x01, (byte) 0x07, (byte) 0x00, (byte) 0x04, (byte) 0x00, (byte) 0x2a, + (byte) 0x00, (byte) 0x2b, (byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0xb0, (byte) 0x04, (byte) 0x02, (byte) 0x00, + (byte) 0x05, (byte) 0x31, (byte) 0x32, (byte) 0x4b, (byte) 0x2d, (byte) 0x32, (byte) 0x04, (byte) 0x03, (byte) 0x00, (byte) 0x01, + (byte) 0x72, (byte) 0x04, (byte) 0x03, (byte) 0x00, (byte) 0x01, (byte) 0x73, (byte) 0x04, (byte) 0x04, (byte) 0x00, (byte) 0x04, + (byte) 0x29, (byte) 0x29, (byte) 0x29, (byte) 0x29, (byte) 0x04, (byte) 0x88, (byte) 0x00, (byte) 0x01, (byte) 0x0a }; + + private static final byte[] P4_ATTR = new byte[] { (byte) 0x04, (byte) 0x80, (byte) 0x00, (byte) 0x01, (byte) 0xff, (byte) 0x04, + (byte) 0x81, (byte) 0x00, (byte) 0x08, (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78, (byte) 0x10, (byte) 0x30, (byte) 0x50, + (byte) 0x70, (byte) 0x04, (byte) 0x82, (byte) 0x00, (byte) 0x08, (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78, (byte) 0x10, + (byte) 0x30, (byte) 0x50, (byte) 0x70, (byte) 0x04, (byte) 0x83, (byte) 0x00, (byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0x00, + (byte) 0x0a, (byte) 0x04, (byte) 0x84, (byte) 0x00, (byte) 0x04, (byte) 0x0a, (byte) 0x19, (byte) 0x02, (byte) 0x1b, (byte) 0x04, + (byte) 0x85, (byte) 0x00, (byte) 0x01, (byte) 0x0a, (byte) 0x04, (byte) 0x88, (byte) 0x00, (byte) 0x01, (byte) 0x0a }; + + private final LinkstateAttributeParser parser = new LinkstateAttributeParser(); + + private static PathAttributesBuilder createBuilder(final NlriType type) { + return new PathAttributesBuilder().addAugmentation( + org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.PathAttributes1.class, + new PathAttributes1Builder().setMpReachNlri( + new MpReachNlriBuilder().setAfi(LinkstateAddressFamily.class).setSafi(LinkstateSubsequentAddressFamily.class).setAdvertizedRoutes( + new AdvertizedRoutesBuilder().setDestinationType( + new DestinationLinkstateCaseBuilder().setDestinationLinkstate( + new DestinationLinkstateBuilder().setCLinkstateDestination( + Lists.newArrayList(new CLinkstateDestinationBuilder().setNlriType(type).build())).build()).build()).build()).build()).build()); + } + + @Test + public void testPositiveLinks() throws BGPParsingException { + final PathAttributesBuilder builder = createBuilder(NlriType.Link); + this.parser.parseAttribute(Unpooled.copiedBuffer(LINK_ATTR), builder); + final PathAttributes1 attrs = builder.getAugmentation(PathAttributes1.class); + final LinkAttributes ls = ((LinkAttributesCase) attrs.getLinkstatePathAttribute().getLinkStateAttribute()).getLinkAttributes(); + assertNotNull(ls); + + assertEquals("42.42.42.42", ls.getLocalIpv4RouterId().getValue()); + assertEquals(new Long(10), ls.getMetric().getValue()); + assertEquals(new Long(0), ls.getAdminGroup().getValue()); + assertEquals("43.43.43.43", ls.getRemoteIpv4RouterId().getValue()); + assertArrayEquals(new byte[] { (byte) 0x49, (byte) 0x98, (byte) 0x96, (byte) 0x80 }, ls.getMaxLinkBandwidth().getValue()); + assertArrayEquals(new byte[] { (byte) 0x46, (byte) 0x43, (byte) 0x50, (byte) 0x00 }, ls.getMaxReservableBandwidth().getValue()); + assertNotNull(ls.getUnreservedBandwidth()); + assertEquals(8, ls.getUnreservedBandwidth().size()); + assertEquals(LinkProtectionType.Dedicated1to1, ls.getLinkProtection()); + assertTrue(ls.getMplsProtocol().isLdp()); + assertTrue(ls.getMplsProtocol().isRsvpte()); + assertEquals(2, ls.getSharedRiskLinkGroups().size()); + assertEquals(305419896, ls.getSharedRiskLinkGroups().get(0).getValue().intValue()); + assertEquals("12K-2", ls.getLinkName()); + } + + @Test + public void testPositiveNodes() throws BGPParsingException { + final PathAttributesBuilder builder = createBuilder(NlriType.Node); + this.parser.parseAttribute(Unpooled.copiedBuffer(NODE_ATTR), builder); + + final PathAttributes1 attrs = builder.getAugmentation(PathAttributes1.class); + final NodeAttributes ls = ((NodeAttributesCase) attrs.getLinkstatePathAttribute().getLinkStateAttribute()).getNodeAttributes(); + assertNotNull(ls); + + assertEquals(2, ls.getTopologyIdentifier().size()); + assertEquals(42, ls.getTopologyIdentifier().get(0).getValue().intValue()); + assertTrue(ls.getNodeFlags().isOverload()); + assertFalse(ls.getNodeFlags().isAttached()); + assertTrue(ls.getNodeFlags().isExternal()); + assertTrue(ls.getNodeFlags().isAbr()); + + assertEquals("12K-2", ls.getDynamicHostname()); + assertEquals(2, ls.getIsisAreaId().size()); + assertEquals("41.41.41.41", ls.getIpv4RouterId().getValue()); + } + + @Test + public void testPositiveV4Prefixes() throws BGPParsingException { + final PathAttributesBuilder builder = createBuilder(NlriType.Ipv4Prefix); + this.parser.parseAttribute(Unpooled.copiedBuffer(P4_ATTR), builder); + + final PathAttributes1 attrs = builder.getAugmentation(PathAttributes1.class); + final PrefixAttributes ls = ((PrefixAttributesCase) attrs.getLinkstatePathAttribute().getLinkStateAttribute()).getPrefixAttributes(); + assertNotNull(ls); + + assertTrue(ls.getIgpBits().getUpDown().isUpDown()); + assertEquals(2, ls.getRouteTags().size()); + assertArrayEquals(new byte[] { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78 }, ls.getRouteTags().get(0).getValue()); + assertEquals(1, ls.getExtendedTags().size()); + assertArrayEquals(new byte[] { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78, (byte) 0x10, (byte) 0x30, (byte) 0x50, + (byte) 0x70 }, ls.getExtendedTags().get(0).getValue()); + assertEquals(10, ls.getPrefixMetric().getValue().intValue()); + assertEquals("10.25.2.27", ls.getOspfForwardingAddress().getIpv4Address().getValue()); + } } diff --git a/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/LinkstateNlriParserTest.java b/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/LinkstateNlriParserTest.java index 84fed1234b..eb487febd9 100644 --- a/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/LinkstateNlriParserTest.java +++ b/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/LinkstateNlriParserTest.java @@ -43,142 +43,139 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network. public class LinkstateNlriParserTest { - private final byte[] nodeNlri = new byte[] { (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x30, (byte) 0x02, (byte) 0x00, (byte) 0x00, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x01, (byte) 0x00, (byte) 0x00, - (byte) 0x23, (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x48, - (byte) 0x02, (byte) 0x01, (byte) 0x00, (byte) 0x04, (byte) 0x28, (byte) 0x28, (byte) 0x28, (byte) 0x28, (byte) 0x02, - (byte) 0x02, (byte) 0x00, (byte) 0x04, (byte) 0x00, (byte) 0x29, (byte) 0x29, (byte) 0x29, (byte) 0x02, (byte) 0x03, - (byte) 0x00, (byte) 0x07, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x39, (byte) 0x05 }; - - private final byte[] linkNlri = new byte[] { (byte) 0x00, (byte) 0x02, (byte) 0x00, (byte) 0x53, (byte) 0x02, (byte) 0x00, (byte) 0x00, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x01, (byte) 0x00, (byte) 0x00, - (byte) 0x1a, (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x48, - (byte) 0x02, (byte) 0x01, (byte) 0x00, (byte) 0x04, (byte) 0x28, (byte) 0x28, (byte) 0x28, (byte) 0x28, (byte) 0x02, - (byte) 0x03, (byte) 0x00, (byte) 0x06, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x42, - (byte) 0x01, (byte) 0x01, (byte) 0x00, (byte) 0x18, (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x00, - (byte) 0x00, (byte) 0x00, (byte) 0x48, (byte) 0x02, (byte) 0x01, (byte) 0x00, (byte) 0x04, (byte) 0x28, (byte) 0x28, - (byte) 0x28, (byte) 0x28, (byte) 0x02, (byte) 0x03, (byte) 0x00, (byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0x40, (byte) 0x01, (byte) 0x03, (byte) 0x00, (byte) 0x04, (byte) 0xc5, (byte) 0x14, (byte) 0xa0, (byte) 0x2a, - (byte) 0x01, (byte) 0x04, (byte) 0x00, (byte) 0x04, (byte) 0xc5, (byte) 0x14, (byte) 0xa0, (byte) 0x28 }; - - private final byte[] prefixNlri = new byte[] { (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x39, (byte) 0x02, (byte) 0x00, - (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x01, (byte) 0x00, - (byte) 0x00, (byte) 0x1a, (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0x48, (byte) 0x02, (byte) 0x01, (byte) 0x00, (byte) 0x04, (byte) 0x28, (byte) 0x28, (byte) 0x28, (byte) 0x28, - (byte) 0x02, (byte) 0x03, (byte) 0x00, (byte) 0x06, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0x42, (byte) 0x01, (byte) 0x07, (byte) 0x00, (byte) 0x02, (byte) 0x00, (byte) 0x0F, (byte) 0x01, (byte) 0x08, - (byte) 0x00, (byte) 0x01, (byte) 0x03, (byte) 0x01, (byte) 0x09, (byte) 0x00, (byte) 0x03, (byte) 0x10, (byte) 0xFF, - (byte) 0xFF }; - - private final byte[] nextHop = new byte[] { (byte) 0x0a, (byte) 0x19, (byte) 0x02, (byte) 0x1b }; - - @Test - public void testNodeNlri() throws BGPParsingException { - final LinkstateNlriParser parser = new LinkstateNlriParser(false); - final MpReachNlriBuilder builder = new MpReachNlriBuilder(); - parser.parseNlri(Unpooled.copiedBuffer(this.nodeNlri), this.nextHop, builder); - - assertEquals("10.25.2.27", ((Ipv4NextHopCase) builder.getCNextHop()).getIpv4NextHop().getGlobal().getValue()); - - final DestinationLinkstate ls = ((DestinationLinkstateCase) builder.getAdvertizedRoutes().getDestinationType()).getDestinationLinkstate(); - - assertEquals(1, ls.getCLinkstateDestination().size()); - - final CLinkstateDestination dest = ls.getCLinkstateDestination().get(0); - - assertEquals(NlriType.Node, dest.getNlriType()); - assertNull(dest.getDistinguisher()); - assertEquals(ProtocolId.IsisLevel2, dest.getProtocolId()); - assertEquals(BigInteger.ONE, dest.getIdentifier().getValue()); - - final LocalNodeDescriptors nodeD = dest.getLocalNodeDescriptors(); - assertEquals(new AsNumber(72L), nodeD.getAsNumber()); - assertEquals(new DomainIdentifier(0x28282828L), nodeD.getDomainId()); - assertEquals( - new IsisPseudonodeCaseBuilder().setIsisPseudonode( - new IsisPseudonodeBuilder().setPsn((short) 5).setIsIsRouterIdentifier( - new IsIsRouterIdentifierBuilder().setIsoSystemId( - new IsoSystemIdentifier(new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0x00, (byte) 0x39 })).build()).build()).build(), nodeD.getCRouterIdentifier()); - - assertNull(dest.getRemoteNodeDescriptors()); - - assertArrayEquals(this.nodeNlri, LinkstateNlriParser.serializeNlri(dest)); - } - - @Test - public void testLinkNlri() throws BGPParsingException { - final LinkstateNlriParser parser = new LinkstateNlriParser(false); - final MpReachNlriBuilder builder = new MpReachNlriBuilder(); - parser.parseNlri(Unpooled.copiedBuffer(this.linkNlri), this.nextHop, builder); - - assertEquals("10.25.2.27", ((Ipv4NextHopCase) builder.getCNextHop()).getIpv4NextHop().getGlobal().getValue()); - - final DestinationLinkstate ls = ((DestinationLinkstateCase) builder.getAdvertizedRoutes().getDestinationType()).getDestinationLinkstate(); - - assertEquals(1, ls.getCLinkstateDestination().size()); - - final CLinkstateDestination dest = ls.getCLinkstateDestination().get(0); - - assertEquals(NlriType.Link, dest.getNlriType()); - assertNull(dest.getDistinguisher()); - assertEquals(ProtocolId.IsisLevel2, dest.getProtocolId()); - assertEquals(BigInteger.ONE, dest.getIdentifier().getValue()); - - final LocalNodeDescriptors local = dest.getLocalNodeDescriptors(); - assertEquals(new AsNumber(72L), local.getAsNumber()); - assertEquals(new DomainIdentifier(0x28282828L), local.getDomainId()); - assertEquals( - new IsisNodeCaseBuilder().setIsisNode( - new IsisNodeBuilder().setIsoSystemId( - new IsoSystemIdentifier(new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0x42 })).build()).build(), local.getCRouterIdentifier()); - final RemoteNodeDescriptors remote = dest.getRemoteNodeDescriptors(); - assertEquals(new AsNumber(72L), remote.getAsNumber()); - assertEquals(new DomainIdentifier(0x28282828L), remote.getDomainId()); - assertEquals(new OspfNodeCaseBuilder().setOspfNode(new OspfNodeBuilder().setOspfRouterId(0x00000040L).build()).build(), - remote.getCRouterIdentifier()); - final LinkDescriptors ld = dest.getLinkDescriptors(); - assertEquals("197.20.160.42", ld.getIpv4InterfaceAddress().getValue()); - assertEquals("197.20.160.40", ld.getIpv4NeighborAddress().getValue()); - - assertArrayEquals(this.linkNlri, LinkstateNlriParser.serializeNlri(dest)); - } - - @Test - public void testPrefixNlri() throws BGPParsingException { - final LinkstateNlriParser parser = new LinkstateNlriParser(false); - final MpReachNlriBuilder builder = new MpReachNlriBuilder(); - parser.parseNlri(Unpooled.copiedBuffer(this.prefixNlri), this.nextHop, builder); - - assertEquals("10.25.2.27", ((Ipv4NextHopCase) builder.getCNextHop()).getIpv4NextHop().getGlobal().getValue()); - - final DestinationLinkstate ls = ((DestinationLinkstateCase) builder.getAdvertizedRoutes().getDestinationType()).getDestinationLinkstate(); - - assertEquals(1, ls.getCLinkstateDestination().size()); - - final CLinkstateDestination dest = ls.getCLinkstateDestination().get(0); - - assertEquals(NlriType.Ipv4Prefix, dest.getNlriType()); - assertNull(dest.getDistinguisher()); - assertEquals(ProtocolId.IsisLevel2, dest.getProtocolId()); - assertEquals(BigInteger.ONE, dest.getIdentifier().getValue()); - - final LocalNodeDescriptors local = dest.getLocalNodeDescriptors(); - assertEquals(new AsNumber(72L), local.getAsNumber()); - assertEquals(new DomainIdentifier(0x28282828L), local.getDomainId()); - assertEquals( - new IsisNodeCaseBuilder().setIsisNode( - new IsisNodeBuilder().setIsoSystemId( - new IsoSystemIdentifier(new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0x42 })).build()).build(), local.getCRouterIdentifier()); - assertNull(dest.getRemoteNodeDescriptors()); - - final PrefixDescriptors pd = dest.getPrefixDescriptors(); - assertEquals(OspfRouteType.External1, pd.getOspfRouteType()); - assertEquals(new TopologyIdentifier(15), pd.getMultiTopologyId()); - assertEquals(new Ipv4Prefix("255.255.0.0/16"), pd.getIpReachabilityInformation().getIpv4Prefix()); - - assertArrayEquals(this.prefixNlri, LinkstateNlriParser.serializeNlri(dest)); - } + private final byte[] nodeNlri = new byte[] { (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x30, (byte) 0x02, (byte) 0x00, (byte) 0x00, + (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x23, + (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x48, (byte) 0x02, (byte) 0x01, + (byte) 0x00, (byte) 0x04, (byte) 0x28, (byte) 0x28, (byte) 0x28, (byte) 0x28, (byte) 0x02, (byte) 0x02, (byte) 0x00, (byte) 0x04, + (byte) 0x00, (byte) 0x29, (byte) 0x29, (byte) 0x29, (byte) 0x02, (byte) 0x03, (byte) 0x00, (byte) 0x07, (byte) 0x00, (byte) 0x00, + (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x39, (byte) 0x05 }; + + private final byte[] linkNlri = new byte[] { (byte) 0x00, (byte) 0x02, (byte) 0x00, (byte) 0x53, (byte) 0x02, (byte) 0x00, (byte) 0x00, + (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x01, (byte) 0x00, (byte) 0x00, (byte) 0x1a, + (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x48, (byte) 0x02, (byte) 0x01, + (byte) 0x00, (byte) 0x04, (byte) 0x28, (byte) 0x28, (byte) 0x28, (byte) 0x28, (byte) 0x02, (byte) 0x03, (byte) 0x00, (byte) 0x06, + (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x42, (byte) 0x01, (byte) 0x01, (byte) 0x00, (byte) 0x18, + (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x48, (byte) 0x02, (byte) 0x01, + (byte) 0x00, (byte) 0x04, (byte) 0x28, (byte) 0x28, (byte) 0x28, (byte) 0x28, (byte) 0x02, (byte) 0x03, (byte) 0x00, (byte) 0x04, + (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x40, (byte) 0x01, (byte) 0x03, (byte) 0x00, (byte) 0x04, (byte) 0xc5, (byte) 0x14, + (byte) 0xa0, (byte) 0x2a, (byte) 0x01, (byte) 0x04, (byte) 0x00, (byte) 0x04, (byte) 0xc5, (byte) 0x14, (byte) 0xa0, (byte) 0x28 }; + + private final byte[] prefixNlri = new byte[] { (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0x39, (byte) 0x02, (byte) 0x00, + (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x01, (byte) 0x00, (byte) 0x00, + (byte) 0x1a, (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x48, (byte) 0x02, + (byte) 0x01, (byte) 0x00, (byte) 0x04, (byte) 0x28, (byte) 0x28, (byte) 0x28, (byte) 0x28, (byte) 0x02, (byte) 0x03, (byte) 0x00, + (byte) 0x06, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x42, (byte) 0x01, (byte) 0x07, (byte) 0x00, + (byte) 0x02, (byte) 0x00, (byte) 0x0F, (byte) 0x01, (byte) 0x08, (byte) 0x00, (byte) 0x01, (byte) 0x03, (byte) 0x01, (byte) 0x09, + (byte) 0x00, (byte) 0x03, (byte) 0x10, (byte) 0xFF, (byte) 0xFF }; + + private final byte[] nextHop = new byte[] { (byte) 0x0a, (byte) 0x19, (byte) 0x02, (byte) 0x1b }; + + @Test + public void testNodeNlri() throws BGPParsingException { + final LinkstateNlriParser parser = new LinkstateNlriParser(false); + final MpReachNlriBuilder builder = new MpReachNlriBuilder(); + parser.parseNlri(Unpooled.copiedBuffer(this.nodeNlri), this.nextHop, builder); + + assertEquals("10.25.2.27", ((Ipv4NextHopCase) builder.getCNextHop()).getIpv4NextHop().getGlobal().getValue()); + + final DestinationLinkstate ls = ((DestinationLinkstateCase) builder.getAdvertizedRoutes().getDestinationType()).getDestinationLinkstate(); + + assertEquals(1, ls.getCLinkstateDestination().size()); + + final CLinkstateDestination dest = ls.getCLinkstateDestination().get(0); + + assertEquals(NlriType.Node, dest.getNlriType()); + assertNull(dest.getDistinguisher()); + assertEquals(ProtocolId.IsisLevel2, dest.getProtocolId()); + assertEquals(BigInteger.ONE, dest.getIdentifier().getValue()); + + final LocalNodeDescriptors nodeD = dest.getLocalNodeDescriptors(); + assertEquals(new AsNumber(72L), nodeD.getAsNumber()); + assertEquals(new DomainIdentifier(0x28282828L), nodeD.getDomainId()); + assertEquals(new IsisPseudonodeCaseBuilder().setIsisPseudonode( + new IsisPseudonodeBuilder().setPsn((short) 5).setIsIsRouterIdentifier( + new IsIsRouterIdentifierBuilder().setIsoSystemId( + new IsoSystemIdentifier(new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, + (byte) 0x39 })).build()).build()).build(), nodeD.getCRouterIdentifier()); + + assertNull(dest.getRemoteNodeDescriptors()); + + assertArrayEquals(this.nodeNlri, LinkstateNlriParser.serializeNlri(dest)); + } + + @Test + public void testLinkNlri() throws BGPParsingException { + final LinkstateNlriParser parser = new LinkstateNlriParser(false); + final MpReachNlriBuilder builder = new MpReachNlriBuilder(); + parser.parseNlri(Unpooled.copiedBuffer(this.linkNlri), this.nextHop, builder); + + assertEquals("10.25.2.27", ((Ipv4NextHopCase) builder.getCNextHop()).getIpv4NextHop().getGlobal().getValue()); + + final DestinationLinkstate ls = ((DestinationLinkstateCase) builder.getAdvertizedRoutes().getDestinationType()).getDestinationLinkstate(); + + assertEquals(1, ls.getCLinkstateDestination().size()); + + final CLinkstateDestination dest = ls.getCLinkstateDestination().get(0); + + assertEquals(NlriType.Link, dest.getNlriType()); + assertNull(dest.getDistinguisher()); + assertEquals(ProtocolId.IsisLevel2, dest.getProtocolId()); + assertEquals(BigInteger.ONE, dest.getIdentifier().getValue()); + + final LocalNodeDescriptors local = dest.getLocalNodeDescriptors(); + assertEquals(new AsNumber(72L), local.getAsNumber()); + assertEquals(new DomainIdentifier(0x28282828L), local.getDomainId()); + assertEquals( + new IsisNodeCaseBuilder().setIsisNode( + new IsisNodeBuilder().setIsoSystemId( + new IsoSystemIdentifier(new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, + (byte) 0x42 })).build()).build(), local.getCRouterIdentifier()); + final RemoteNodeDescriptors remote = dest.getRemoteNodeDescriptors(); + assertEquals(new AsNumber(72L), remote.getAsNumber()); + assertEquals(new DomainIdentifier(0x28282828L), remote.getDomainId()); + assertEquals(new OspfNodeCaseBuilder().setOspfNode(new OspfNodeBuilder().setOspfRouterId(0x00000040L).build()).build(), + remote.getCRouterIdentifier()); + final LinkDescriptors ld = dest.getLinkDescriptors(); + assertEquals("197.20.160.42", ld.getIpv4InterfaceAddress().getValue()); + assertEquals("197.20.160.40", ld.getIpv4NeighborAddress().getValue()); + + assertArrayEquals(this.linkNlri, LinkstateNlriParser.serializeNlri(dest)); + } + + @Test + public void testPrefixNlri() throws BGPParsingException { + final LinkstateNlriParser parser = new LinkstateNlriParser(false); + final MpReachNlriBuilder builder = new MpReachNlriBuilder(); + parser.parseNlri(Unpooled.copiedBuffer(this.prefixNlri), this.nextHop, builder); + + assertEquals("10.25.2.27", ((Ipv4NextHopCase) builder.getCNextHop()).getIpv4NextHop().getGlobal().getValue()); + + final DestinationLinkstate ls = ((DestinationLinkstateCase) builder.getAdvertizedRoutes().getDestinationType()).getDestinationLinkstate(); + + assertEquals(1, ls.getCLinkstateDestination().size()); + + final CLinkstateDestination dest = ls.getCLinkstateDestination().get(0); + + assertEquals(NlriType.Ipv4Prefix, dest.getNlriType()); + assertNull(dest.getDistinguisher()); + assertEquals(ProtocolId.IsisLevel2, dest.getProtocolId()); + assertEquals(BigInteger.ONE, dest.getIdentifier().getValue()); + + final LocalNodeDescriptors local = dest.getLocalNodeDescriptors(); + assertEquals(new AsNumber(72L), local.getAsNumber()); + assertEquals(new DomainIdentifier(0x28282828L), local.getDomainId()); + assertEquals( + new IsisNodeCaseBuilder().setIsisNode( + new IsisNodeBuilder().setIsoSystemId( + new IsoSystemIdentifier(new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, + (byte) 0x42 })).build()).build(), local.getCRouterIdentifier()); + assertNull(dest.getRemoteNodeDescriptors()); + + final PrefixDescriptors pd = dest.getPrefixDescriptors(); + assertEquals(OspfRouteType.External1, pd.getOspfRouteType()); + assertEquals(new TopologyIdentifier(15), pd.getMultiTopologyId()); + assertEquals(new Ipv4Prefix("255.255.0.0/16"), pd.getIpReachabilityInformation().getIpv4Prefix()); + + assertArrayEquals(this.prefixNlri, LinkstateNlriParser.serializeNlri(dest)); + } } diff --git a/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/AsNumberUtil.java b/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/AsNumberUtil.java index d1f4e4d4a4..d87c60bb89 100644 --- a/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/AsNumberUtil.java +++ b/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/AsNumberUtil.java @@ -18,31 +18,31 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mess public final class AsNumberUtil { - private AsNumberUtil() { - throw new UnsupportedOperationException("Utility class should never be instantiated"); - } + private AsNumberUtil() { + throw new UnsupportedOperationException("Utility class should never be instantiated"); + } - /** - * Looks for As4Byte Capability in capabilities and extracts AS number. - * - * @param open remote BGP open message - * @return AsNumber - */ - public static AsNumber advertizedAsNumber(final Open open) { - // Look for AS4 capability very defensively - final List params = open.getBgpParameters(); - if (params != null) { - for (final BgpParameters p : params) { - final CParameters cp = p.getCParameters(); - if (cp instanceof As4BytesCase) { - final As4BytesCapability capa = ((As4BytesCase) cp).getAs4BytesCapability(); - if (capa != null) { - return capa.getAsNumber(); - } - } - } - } - // Fallback to whatever is in the header - return new AsNumber(open.getMyAsNumber().longValue()); - } + /** + * Looks for As4Byte Capability in capabilities and extracts AS number. + * + * @param open remote BGP open message + * @return AsNumber + */ + public static AsNumber advertizedAsNumber(final Open open) { + // Look for AS4 capability very defensively + final List params = open.getBgpParameters(); + if (params != null) { + for (final BgpParameters p : params) { + final CParameters cp = p.getCParameters(); + if (cp instanceof As4BytesCase) { + final As4BytesCapability capa = ((As4BytesCase) cp).getAs4BytesCapability(); + if (capa != null) { + return capa.getAsNumber(); + } + } + } + } + // Fallback to whatever is in the header + return new AsNumber(open.getMyAsNumber().longValue()); + } } diff --git a/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BGPDocumentedException.java b/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BGPDocumentedException.java index 8d01f4f69e..2a1e8979d8 100644 --- a/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BGPDocumentedException.java +++ b/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BGPDocumentedException.java @@ -7,100 +7,100 @@ */ package org.opendaylight.protocol.bgp.parser; +import com.google.common.base.Preconditions; +import com.google.common.primitives.UnsignedBytes; + import java.util.Arrays; import org.opendaylight.protocol.util.Values; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; -import com.google.common.primitives.UnsignedBytes; - /** * There are several errors documented in RFC4271 or in draft, that have specific meaning for the BGP. This exception is * used, when any of those errors occurs. */ public final class BGPDocumentedException extends Exception { - private static final long serialVersionUID = -6212702584439430736L; - - private static final Logger LOG = LoggerFactory.getLogger(BGPDocumentedException.class); - - private final BGPError error; - - private final byte[] data; - - /** - * Used when an error occurred that is described in an RFC or a draft. - * - * @param message message bound with this exception - * @param error specific documented error - */ - public BGPDocumentedException(final String message, final BGPError error) { - this(message, error, null, null); - } - - /** - * Used when an error occurred that is described in an RFC or a draft. - * - * @param message message bound with this exception - * @param error specific documented error - * @param cause cause for the error - */ - public BGPDocumentedException(final String message, final BGPError error, final Exception cause) { - this(message, error, null, cause); - } - - /** - * Used when an error occurred that is described in an RFC or a draft. - * - * @param message message bound with this exception - * @param error specific documented error - * @param data data associated with the error - */ - public BGPDocumentedException(final String message, final BGPError error, final byte[] data) { - this(message, error, data, null); - } - - /** - * Used when an error occurred that is described in an RFC or a draft. - * - * @param message message bound with this exception - * @param error specific documented error - * @param data data associated with the error - * @param cause cause for the error - */ - public BGPDocumentedException(final String message, final BGPError error, final byte[] data, final Exception cause) { - super(message, cause); - this.error = error; - this.data = data == null ? null : Arrays.copyOf(data, data.length); - LOG.error("Error = {}", error, this); - } - - /** - * Returns specific documented error. - * - * @return documented error - */ - public BGPError getError() { - return this.error; - } - - /** - * Returns data associated with this error. - * - * @return byte array data - */ - public byte[] getData() { - return this.data; - } - - public static BGPDocumentedException badMessageLength(final String message, final int length) { - Preconditions.checkArgument(length >= 0 && length <= Values.UNSIGNED_SHORT_MAX_VALUE); - - return new BGPDocumentedException(message, BGPError.BAD_MSG_LENGTH, new byte[] { - UnsignedBytes.checkedCast(length / (Values.UNSIGNED_BYTE_MAX_VALUE + 1)), - UnsignedBytes.checkedCast(length % (Values.UNSIGNED_BYTE_MAX_VALUE + 1)) }); - - } + private static final long serialVersionUID = -6212702584439430736L; + + private static final Logger LOG = LoggerFactory.getLogger(BGPDocumentedException.class); + + private final BGPError error; + + private final byte[] data; + + /** + * Used when an error occurred that is described in an RFC or a draft. + * + * @param message message bound with this exception + * @param error specific documented error + */ + public BGPDocumentedException(final String message, final BGPError error) { + this(message, error, null, null); + } + + /** + * Used when an error occurred that is described in an RFC or a draft. + * + * @param message message bound with this exception + * @param error specific documented error + * @param cause cause for the error + */ + public BGPDocumentedException(final String message, final BGPError error, final Exception cause) { + this(message, error, null, cause); + } + + /** + * Used when an error occurred that is described in an RFC or a draft. + * + * @param message message bound with this exception + * @param error specific documented error + * @param data data associated with the error + */ + public BGPDocumentedException(final String message, final BGPError error, final byte[] data) { + this(message, error, data, null); + } + + /** + * Used when an error occurred that is described in an RFC or a draft. + * + * @param message message bound with this exception + * @param error specific documented error + * @param data data associated with the error + * @param cause cause for the error + */ + public BGPDocumentedException(final String message, final BGPError error, final byte[] data, final Exception cause) { + super(message, cause); + this.error = error; + this.data = data == null ? null : Arrays.copyOf(data, data.length); + LOG.error("Error = {}", error, this); + } + + /** + * Returns specific documented error. + * + * @return documented error + */ + public BGPError getError() { + return this.error; + } + + /** + * Returns data associated with this error. + * + * @return byte array data + */ + public byte[] getData() { + return this.data; + } + + public static BGPDocumentedException badMessageLength(final String message, final int length) { + Preconditions.checkArgument(length >= 0 && length <= Values.UNSIGNED_SHORT_MAX_VALUE); + + return new BGPDocumentedException(message, BGPError.BAD_MSG_LENGTH, new byte[] { + UnsignedBytes.checkedCast(length / (Values.UNSIGNED_BYTE_MAX_VALUE + 1)), + UnsignedBytes.checkedCast(length % (Values.UNSIGNED_BYTE_MAX_VALUE + 1)) }); + + } } diff --git a/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BGPError.java b/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BGPError.java index 60d090362b..8e2ed85b70 100644 --- a/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BGPError.java +++ b/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BGPError.java @@ -10,184 +10,184 @@ package org.opendaylight.protocol.bgp.parser; /** * Possible errors from implemented RFCs and drafts. Each error consists of error code and error subcode (code/subcode * in comments). - * + * * @see BGP Notification Message */ public enum BGPError { - /** - * Connection Not Synchronized. 1/1 - */ - CONNECTION_NOT_SYNC((short) 1, (short) 1), - /** - * Bad Message Length. 1/2 - */ - BAD_MSG_LENGTH((short) 1, (short) 2), - /** - * Bad Message Type. 1/3 - */ - BAD_MSG_TYPE((short) 1, (short) 3), - /** - * Unspecific Open Message error. - */ - UNSPECIFIC_OPEN_ERROR((short) 2, (short) 0), - /** - * Unsupported Version Number. 2/1 - */ - VERSION_NOT_SUPPORTED((short) 2, (short) 1), - /** - * Bad Peer AS. 2/2 - */ - BAD_PEER_AS((short) 2, (short) 2), - /** - * Bad BGP Identifier. 2/3 - */ - BAD_BGP_ID((short) 2, (short) 3), - /** - * Unsupported Optional Parameter. 2/4 - */ - OPT_PARAM_NOT_SUPPORTED((short) 2, (short) 4), - /** - * Unacceptable Hold Time. 2/6 - */ - HOLD_TIME_NOT_ACC((short) 2, (short) 6), - /** - * Malformed Attribute List. 3/1 - */ - MALFORMED_ATTR_LIST((short) 3, (short) 1), - /** - * Unrecognized Well-known Attribute. 3/2 - */ - WELL_KNOWN_ATTR_NOT_RECOGNIZED((short) 3, (short) 2), - /** - * Missing Well-known Attribute. 3/3 - */ - WELL_KNOWN_ATTR_MISSING((short) 3, (short) 3), - /** - * Attribute Flags Error. 3/4 - */ - ATTR_FLAGS_MISSING((short) 3, (short) 4), - /** - * Attribute Length Error. 3/5 - */ - ATTR_LENGTH_ERROR((short) 3, (short) 5), - /** - * Invalid ORIGIN Attribute. 3/6 - */ - ORIGIN_ATTR_NOT_VALID((short) 3, (short) 6), - /** - * Invalid NEXT_HOP Attribute. 3/8 - */ - NEXT_HOP_NOT_VALID((short) 3, (short) 8), - /** - * Optional Attribute Error. 3/9 - */ - OPT_ATTR_ERROR((short) 3, (short) 9), - /** - * Invalid Network Field. 3/10 - */ - NETWORK_NOT_VALID((short) 3, (short) 10), - /** - * Malformed AS_PATH. 3/11 - */ - AS_PATH_MALFORMED((short) 3, (short) 11), - /** - * Hold Timer Expired. 4/0 - */ - HOLD_TIMER_EXPIRED((short) 4, (short) 0), - /** - * Finite State Machine Error. 5/0 - */ - FSM_ERROR((short) 5, (short) 0), - /** - * Cease. 6/0 - */ - CEASE((short) 6, (short) 0); + /** + * Connection Not Synchronized. 1/1 + */ + CONNECTION_NOT_SYNC((short) 1, (short) 1), + /** + * Bad Message Length. 1/2 + */ + BAD_MSG_LENGTH((short) 1, (short) 2), + /** + * Bad Message Type. 1/3 + */ + BAD_MSG_TYPE((short) 1, (short) 3), + /** + * Unspecific Open Message error. + */ + UNSPECIFIC_OPEN_ERROR((short) 2, (short) 0), + /** + * Unsupported Version Number. 2/1 + */ + VERSION_NOT_SUPPORTED((short) 2, (short) 1), + /** + * Bad Peer AS. 2/2 + */ + BAD_PEER_AS((short) 2, (short) 2), + /** + * Bad BGP Identifier. 2/3 + */ + BAD_BGP_ID((short) 2, (short) 3), + /** + * Unsupported Optional Parameter. 2/4 + */ + OPT_PARAM_NOT_SUPPORTED((short) 2, (short) 4), + /** + * Unacceptable Hold Time. 2/6 + */ + HOLD_TIME_NOT_ACC((short) 2, (short) 6), + /** + * Malformed Attribute List. 3/1 + */ + MALFORMED_ATTR_LIST((short) 3, (short) 1), + /** + * Unrecognized Well-known Attribute. 3/2 + */ + WELL_KNOWN_ATTR_NOT_RECOGNIZED((short) 3, (short) 2), + /** + * Missing Well-known Attribute. 3/3 + */ + WELL_KNOWN_ATTR_MISSING((short) 3, (short) 3), + /** + * Attribute Flags Error. 3/4 + */ + ATTR_FLAGS_MISSING((short) 3, (short) 4), + /** + * Attribute Length Error. 3/5 + */ + ATTR_LENGTH_ERROR((short) 3, (short) 5), + /** + * Invalid ORIGIN Attribute. 3/6 + */ + ORIGIN_ATTR_NOT_VALID((short) 3, (short) 6), + /** + * Invalid NEXT_HOP Attribute. 3/8 + */ + NEXT_HOP_NOT_VALID((short) 3, (short) 8), + /** + * Optional Attribute Error. 3/9 + */ + OPT_ATTR_ERROR((short) 3, (short) 9), + /** + * Invalid Network Field. 3/10 + */ + NETWORK_NOT_VALID((short) 3, (short) 10), + /** + * Malformed AS_PATH. 3/11 + */ + AS_PATH_MALFORMED((short) 3, (short) 11), + /** + * Hold Timer Expired. 4/0 + */ + HOLD_TIMER_EXPIRED((short) 4, (short) 0), + /** + * Finite State Machine Error. 5/0 + */ + FSM_ERROR((short) 5, (short) 0), + /** + * Cease. 6/0 + */ + CEASE((short) 6, (short) 0); - private final short code; + private final short code; - private final short subcode; + private final short subcode; - BGPError(final short code, final short subcode) { - this.code = code; - this.subcode = subcode; - } + BGPError(final short code, final short subcode) { + this.code = code; + this.subcode = subcode; + } - public short getCode() { - return this.code; - } + public short getCode() { + return this.code; + } - public short getSubcode() { - return this.subcode; - } + public short getSubcode() { + return this.subcode; + } - public static BGPError forValue(final int e, final int s) { - if (e == 1) { - if (s == 1) { - return BGPError.CONNECTION_NOT_SYNC; - } - if (s == 2) { - return BGPError.BAD_MSG_LENGTH; - } - if (s == 3) { - return BGPError.BAD_MSG_TYPE; - } - } else if (e == 2) { - if (s == 0) { - return BGPError.UNSPECIFIC_OPEN_ERROR; - } - if (s == 1) { - return BGPError.VERSION_NOT_SUPPORTED; - } - if (s == 2) { - return BGPError.BAD_PEER_AS; - } - if (s == 3) { - return BGPError.BAD_BGP_ID; - } - if (s == 4) { - return BGPError.OPT_PARAM_NOT_SUPPORTED; - } - if (s == 6) { - return BGPError.HOLD_TIME_NOT_ACC; - } - } else if (e == 3) { - if (s == 1) { - return BGPError.MALFORMED_ATTR_LIST; - } - if (s == 2) { - return BGPError.WELL_KNOWN_ATTR_NOT_RECOGNIZED; - } - if (s == 3) { - return BGPError.WELL_KNOWN_ATTR_MISSING; - } - if (s == 4) { - return BGPError.ATTR_FLAGS_MISSING; - } - if (s == 5) { - return BGPError.ATTR_LENGTH_ERROR; - } - if (s == 6) { - return BGPError.ORIGIN_ATTR_NOT_VALID; - } - if (s == 8) { - return BGPError.NEXT_HOP_NOT_VALID; - } - if (s == 9) { - return BGPError.OPT_ATTR_ERROR; - } - if (s == 10) { - return BGPError.NETWORK_NOT_VALID; - } - if (s == 11) { - return BGPError.AS_PATH_MALFORMED; - } - } else if (e == 4) { - return BGPError.HOLD_TIMER_EXPIRED; - } else if (e == 5) { - return BGPError.FSM_ERROR; - } else if (e == 6) { - return BGPError.CEASE; - } - throw new IllegalArgumentException("BGP Error code " + e + " and subcode " + s + " not recognized."); - } + public static BGPError forValue(final int e, final int s) { + if (e == 1) { + if (s == 1) { + return BGPError.CONNECTION_NOT_SYNC; + } + if (s == 2) { + return BGPError.BAD_MSG_LENGTH; + } + if (s == 3) { + return BGPError.BAD_MSG_TYPE; + } + } else if (e == 2) { + if (s == 0) { + return BGPError.UNSPECIFIC_OPEN_ERROR; + } + if (s == 1) { + return BGPError.VERSION_NOT_SUPPORTED; + } + if (s == 2) { + return BGPError.BAD_PEER_AS; + } + if (s == 3) { + return BGPError.BAD_BGP_ID; + } + if (s == 4) { + return BGPError.OPT_PARAM_NOT_SUPPORTED; + } + if (s == 6) { + return BGPError.HOLD_TIME_NOT_ACC; + } + } else if (e == 3) { + if (s == 1) { + return BGPError.MALFORMED_ATTR_LIST; + } + if (s == 2) { + return BGPError.WELL_KNOWN_ATTR_NOT_RECOGNIZED; + } + if (s == 3) { + return BGPError.WELL_KNOWN_ATTR_MISSING; + } + if (s == 4) { + return BGPError.ATTR_FLAGS_MISSING; + } + if (s == 5) { + return BGPError.ATTR_LENGTH_ERROR; + } + if (s == 6) { + return BGPError.ORIGIN_ATTR_NOT_VALID; + } + if (s == 8) { + return BGPError.NEXT_HOP_NOT_VALID; + } + if (s == 9) { + return BGPError.OPT_ATTR_ERROR; + } + if (s == 10) { + return BGPError.NETWORK_NOT_VALID; + } + if (s == 11) { + return BGPError.AS_PATH_MALFORMED; + } + } else if (e == 4) { + return BGPError.HOLD_TIMER_EXPIRED; + } else if (e == 5) { + return BGPError.FSM_ERROR; + } else if (e == 6) { + return BGPError.CEASE; + } + throw new IllegalArgumentException("BGP Error code " + e + " and subcode " + s + " not recognized."); + } } diff --git a/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BGPParsingException.java b/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BGPParsingException.java index c09a35f328..db77312f30 100644 --- a/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BGPParsingException.java +++ b/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BGPParsingException.java @@ -7,40 +7,39 @@ */ package org.opendaylight.protocol.bgp.parser; - /** * * Used when something occurs during the parsing to get Update Message. * */ public class BGPParsingException extends Exception { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - /** - * - * @param err error message string. - */ - public BGPParsingException(final String err) { - super(err); - } + /** + * + * @param err error message string. + */ + public BGPParsingException(final String err) { + super(err); + } - /** - * - * @param message exception message - * @param cause primary exception - */ - public BGPParsingException(final String message, final Exception cause){ - super(message, cause); - } + /** + * + * @param message exception message + * @param cause primary exception + */ + public BGPParsingException(final String message, final Exception cause) { + super(message, cause); + } - /** - * - * @return error message. - * - * @deprecated Use getMessage() instead. - */ - @Deprecated - public String getError() { - return this.getMessage(); - } + /** + * + * @return error message. + * + * @deprecated Use getMessage() instead. + */ + @Deprecated + public String getError() { + return this.getMessage(); + } } diff --git a/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BGPSession.java b/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BGPSession.java index df16515ab3..70419995bb 100644 --- a/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BGPSession.java +++ b/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BGPSession.java @@ -19,29 +19,29 @@ import org.opendaylight.yangtools.yang.binding.Notification; * BGP Session represents the finite state machine in BGP, including timers and its purpose is to create a BGP * connection between BGP speakers. Session is automatically started, when TCP connection is created, but can be stopped * manually via close method of the Closeable interface. - * + * * If the session is up, it has to redirect messages to/from user. Handles also malformed messages and unknown requests. */ public interface BGPSession extends ProtocolSession { - /** - * Return the list of tables which the peer has advertized to support. - * - * @return Set of tables which it supports. - */ + /** + * Return the list of tables which the peer has advertized to support. + * + * @return Set of tables which it supports. + */ - Set getAdvertisedTableTypes(); + Set getAdvertisedTableTypes(); - /** - * Return the BGP router ID advertized by the peer. - * - * @return Peer's BGP Router ID. - */ - Ipv4Address getBgpId(); + /** + * Return the BGP router ID advertized by the peer. + * + * @return Peer's BGP Router ID. + */ + Ipv4Address getBgpId(); - /** - * Return the AS number which the peer advertizes. - * - * @return Peer's AS Number - */ - AsNumber getAsNumber(); + /** + * Return the AS number which the peer advertizes. + * + * @return Peer's AS Number + */ + AsNumber getAsNumber(); } diff --git a/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BGPTerminationReason.java b/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BGPTerminationReason.java index 5e05e8a736..1ccb2c4c24 100644 --- a/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BGPTerminationReason.java +++ b/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BGPTerminationReason.java @@ -10,14 +10,14 @@ package org.opendaylight.protocol.bgp.parser; import org.opendaylight.protocol.framework.TerminationReason; public final class BGPTerminationReason implements TerminationReason { - private final BGPError error; + private final BGPError error; - public BGPTerminationReason(final BGPError error) { - this.error = error; - } + public BGPTerminationReason(final BGPError error) { + this.error = error; + } - @Override - public String getErrorMessage() { - return error.toString(); - } + @Override + public String getErrorMessage() { + return error.toString(); + } } diff --git a/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BgpTableTypeImpl.java b/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BgpTableTypeImpl.java index 72515ad011..ff10882159 100644 --- a/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BgpTableTypeImpl.java +++ b/bgp/parser-api/src/main/java/org/opendaylight/protocol/bgp/parser/BgpTableTypeImpl.java @@ -7,75 +7,75 @@ */ package org.opendaylight.protocol.bgp.parser; +import com.google.common.base.Preconditions; + import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily; -import com.google.common.base.Preconditions; - /** * Utility class identifying a BGP table type. A table type is formed by two identifiers: AFI and SAFI. */ public final class BgpTableTypeImpl implements BgpTableType { - private final Class safi; + private final Class safi; - private final Class afi; + private final Class afi; - /** - * Creates BGP Table type. - * - * @param afi Address Family Identifier - * @param safi Subsequent Address Family Identifier - */ - public BgpTableTypeImpl(final Class afi, final Class safi) { - this.afi = Preconditions.checkNotNull(afi, "Address family may not be null"); - this.safi = Preconditions.checkNotNull(safi, "Subsequent address family may not be null"); - } + /** + * Creates BGP Table type. + * + * @param afi Address Family Identifier + * @param safi Subsequent Address Family Identifier + */ + public BgpTableTypeImpl(final Class afi, final Class safi) { + this.afi = Preconditions.checkNotNull(afi, "Address family may not be null"); + this.safi = Preconditions.checkNotNull(safi, "Subsequent address family may not be null"); + } - @Override - public Class getImplementedInterface() { - return BgpTableType.class; - } + @Override + public Class getImplementedInterface() { + return BgpTableType.class; + } - @Override - public int hashCode() { - int ret = 3 * this.afi.hashCode(); - ret += this.safi.hashCode(); - return ret; - } + @Override + public int hashCode() { + int ret = 3 * this.afi.hashCode(); + ret += this.safi.hashCode(); + return ret; + } - @Override - public boolean equals(final Object obj) { - if (obj instanceof BgpTableTypeImpl) { - final BgpTableTypeImpl o = (BgpTableTypeImpl) obj; - return this.afi.equals(o.afi) && this.safi.equals(o.safi); - } - return false; - } + @Override + public boolean equals(final Object obj) { + if (obj instanceof BgpTableTypeImpl) { + final BgpTableTypeImpl o = (BgpTableTypeImpl) obj; + return this.afi.equals(o.afi) && this.safi.equals(o.safi); + } + return false; + } - @Override - public String toString() { - return this.afi.toString() + "." + this.safi.toString(); - } + @Override + public String toString() { + return this.afi.toString() + "." + this.safi.toString(); + } - /** - * Returns Address Family Identifier. - * - * @return afi AFI - */ - @Override - public Class getAfi() { - return this.afi; - } + /** + * Returns Address Family Identifier. + * + * @return afi AFI + */ + @Override + public Class getAfi() { + return this.afi; + } - /** - * Returns Subsequent Address Family Identifier. - * - * @return safi SAFI - */ - @Override - public Class getSafi() { - return this.safi; - } + /** + * Returns Subsequent Address Family Identifier. + * + * @return safi SAFI + */ + @Override + public Class getSafi() { + return this.safi; + } } diff --git a/bgp/parser-api/src/main/yang/bgp-message.yang b/bgp/parser-api/src/main/yang/bgp-message.yang index c3e9f1e145..982a35d7ed 100644 --- a/bgp/parser-api/src/main/yang/bgp-message.yang +++ b/bgp/parser-api/src/main/yang/bgp-message.yang @@ -1,163 +1,163 @@ module bgp-message { - yang-version 1; - namespace "urn:opendaylight:params:xml:ns:yang:bgp-message"; - prefix "bgp-msg"; + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:bgp-message"; + prefix "bgp-msg"; - import ietf-inet-types { prefix inet; revision-date 2010-09-24; } - import bgp-types { prefix bgp-t; revision-date 2013-09-19; } + import ietf-inet-types { prefix inet; revision-date 2010-09-24; } + import bgp-types { prefix bgp-t; revision-date 2013-09-19; } - organization "Cisco Systems, Inc."; - contact "Dana Kutenicsova "; + organization "Cisco Systems, Inc."; + contact "Dana Kutenicsova "; - description - "This module contains the base data model of a BGP message. - It rolls up the definitions contained in RFC4271 and RFC4893. + description + "This module contains the base data model of a BGP message. + It rolls up the definitions contained in RFC4271 and RFC4893. - Copyright (c)2013 Cisco Systems, Inc. All rights reserved. + Copyright (c)2013 Cisco Systems, Inc. All rights reserved. - This program and the accompanying materials are made available - under the terms of the Eclipse Public License v1.0 which - accompanies this distribution, and is available at - http://www.eclipse.org/legal/epl-v10.html"; + This program and the accompanying materials are made available + under the terms of the Eclipse Public License v1.0 which + accompanies this distribution, and is available at + http://www.eclipse.org/legal/epl-v10.html"; - revision "2013-09-19" { - description - "Split off basic types"; - } + revision "2013-09-19" { + description + "Split off basic types"; + } - revision "2013-09-18" { - description - "Initial revision."; - reference "RFC4271, RFC4893"; - } + revision "2013-09-18" { + description + "Initial revision."; + reference "RFC4271, RFC4893"; + } - typedef protocol-version { - type uint8 { - range 1..7; - } - } + typedef protocol-version { + type uint8 { + range 1..7; + } + } - notification open { - description "Open Message"; - reference "http://tools.ietf.org/html/rfc4271#section-4.2"; - leaf version { - type protocol-version; - default 4; - } - leaf my-as-number { - type uint16; - default 23456; - } - leaf hold-timer { - type uint16; - mandatory true; - } - leaf bgp-identifier { - type inet:ipv4-address; - mandatory true; - } - list bgp-parameters { - reference "http://tools.ietf.org/html/rfc3392#section-4"; - choice c-parameters { - case as4-bytes-case { - container as4-bytes-capability { - reference "http://tools.ietf.org/html/rfc6793"; - leaf as-number { - type inet:as-number; - } - } - } - } - } - } + notification open { + description "Open Message"; + reference "http://tools.ietf.org/html/rfc4271#section-4.2"; + leaf version { + type protocol-version; + default 4; + } + leaf my-as-number { + type uint16; + default 23456; + } + leaf hold-timer { + type uint16; + mandatory true; + } + leaf bgp-identifier { + type inet:ipv4-address; + mandatory true; + } + list bgp-parameters { + reference "http://tools.ietf.org/html/rfc3392#section-4"; + choice c-parameters { + case as4-bytes-case { + container as4-bytes-capability { + reference "http://tools.ietf.org/html/rfc6793"; + leaf as-number { + type inet:as-number; + } + } + } + } + } + } - grouping path-attributes { - reference "http://tools.ietf.org/html/rfc4271#section-5"; - container origin { - reference "http://tools.ietf.org/html/rfc4271#section-5.1.1"; - leaf value { - type bgp-t:bgp-origin; - mandatory true; - } - } - container as-path { - reference "http://tools.ietf.org/html/rfc4271#section-5.1.2"; - list segments { - uses bgp-t:as-path-segment; - } - } - uses bgp-t:next-hop; - container multi-exit-disc { - reference "http://tools.ietf.org/html/rfc4271#section-5.1.4"; - leaf med { - type uint32; - } - } - container local-pref { - reference "http://tools.ietf.org/html/rfc4271#section-5.1.5"; - leaf pref { - type uint32; - } - } - container atomic-aggregate { - reference "http://tools.ietf.org/html/rfc4271#section-5.1.6"; - presence "Atomic Aggregate attribute is present."; - } - container aggregator { - uses bgp-t:bgp-aggregator; - } - list communities { - uses bgp-t:community; - } - list extended-communities { - uses bgp-t:extended-community; - } - leaf originator-id { - type inet:ipv4-address; - } - leaf-list cluster-id { - type bgp-t:cluster-identifier; - } - } + grouping path-attributes { + reference "http://tools.ietf.org/html/rfc4271#section-5"; + container origin { + reference "http://tools.ietf.org/html/rfc4271#section-5.1.1"; + leaf value { + type bgp-t:bgp-origin; + mandatory true; + } + } + container as-path { + reference "http://tools.ietf.org/html/rfc4271#section-5.1.2"; + list segments { + uses bgp-t:as-path-segment; + } + } + uses bgp-t:next-hop; + container multi-exit-disc { + reference "http://tools.ietf.org/html/rfc4271#section-5.1.4"; + leaf med { + type uint32; + } + } + container local-pref { + reference "http://tools.ietf.org/html/rfc4271#section-5.1.5"; + leaf pref { + type uint32; + } + } + container atomic-aggregate { + reference "http://tools.ietf.org/html/rfc4271#section-5.1.6"; + presence "Atomic Aggregate attribute is present."; + } + container aggregator { + uses bgp-t:bgp-aggregator; + } + list communities { + uses bgp-t:community; + } + list extended-communities { + uses bgp-t:extended-community; + } + leaf originator-id { + type inet:ipv4-address; + } + leaf-list cluster-id { + type bgp-t:cluster-identifier; + } + } - notification update { - description "Update Message"; - reference "http://tools.ietf.org/html/rfc4271#section-4.3"; - container path-attributes { - reference "http://tools.ietf.org/html/rfc4271#section-5"; - uses path-attributes; - } - container withdrawn-routes { - leaf-list withdrawn-routes { - type inet:ipv4-prefix; - } - } - container nlri { - leaf-list nlri { - type inet:ipv4-prefix; - } - } - } + notification update { + description "Update Message"; + reference "http://tools.ietf.org/html/rfc4271#section-4.3"; + container path-attributes { + reference "http://tools.ietf.org/html/rfc4271#section-5"; + uses path-attributes; + } + container withdrawn-routes { + leaf-list withdrawn-routes { + type inet:ipv4-prefix; + } + } + container nlri { + leaf-list nlri { + type inet:ipv4-prefix; + } + } + } - notification keepalive { - description "Keepalive Message"; - reference "http://tools.ietf.org/html/rfc4271#section-4.4"; - } + notification keepalive { + description "Keepalive Message"; + reference "http://tools.ietf.org/html/rfc4271#section-4.4"; + } - notification notify { - description "Notification Message"; - reference "http://tools.ietf.org/html/rfc4271#section-4.5"; + notification notify { + description "Notification Message"; + reference "http://tools.ietf.org/html/rfc4271#section-4.5"; - leaf error-code { - type uint8; - mandatory true; - } - leaf error-subcode { - type uint8; - mandatory true; - } - leaf data { - type binary; - } - } + leaf error-code { + type uint8; + mandatory true; + } + leaf error-subcode { + type uint8; + mandatory true; + } + leaf data { + type binary; + } + } } diff --git a/bgp/parser-api/src/main/yang/bgp-multiprotocol.yang b/bgp/parser-api/src/main/yang/bgp-multiprotocol.yang index 9507f98a94..312c9b0aec 100644 --- a/bgp/parser-api/src/main/yang/bgp-multiprotocol.yang +++ b/bgp/parser-api/src/main/yang/bgp-multiprotocol.yang @@ -1,139 +1,139 @@ module bgp-multiprotocol { - yang-version 1; - namespace "urn:opendaylight:params:xml:ns:yang:bgp-multiprotocol"; - prefix "bgp-mp"; - - import ietf-inet-types { prefix inet; revision-date 2010-09-24; } - import bgp-message { prefix bgp-msg; revision-date 2013-09-19; } - import bgp-types { prefix bgp-t; revision-date 2013-09-19; } - - organization "Cisco Systems, Inc."; - contact "Dana Kutenicsova "; - - description - "This module contains the base data model of a BGP message. - It rolls up the definitions contained in RFC4271 - and draft-ietf-idr-ls-distribution-03. - - Copyright (c)2013 Cisco Systems, Inc. All rights reserved. - - This program and the accompanying materials are made available - under the terms of the Eclipse Public License v1.0 which - accompanies this distribution, and is available at - http://www.eclipse.org/legal/epl-v10.html"; - - revision "2013-09-19" { - description - "Split off basic types"; - } - - revision "2013-09-18" { - description - "Initial revision."; - reference "RFC4760"; - } - - grouping bgp-table-type { - leaf afi { - type identityref { - base bgp-t:address-family; - } - } - leaf safi { - type identityref { - base bgp-t:subsequent-address-family; - } - } - } - - grouping destination { - choice destination-type { - case destination-ipv4-case { - container destination-ipv4 { - when "../../afi = ipv4"; - leaf-list ipv4-prefixes { - type inet:ipv4-prefix; - } - } - } - case destination-ipv6-case { - container destination-ipv6 { - when "../../afi = ipv6"; - leaf-list ipv6-prefixes { - type inet:ipv6-prefix; - } - } - } - } - } - - augment "/bgp-msg:open/bgp-msg:bgp-parameters/bgp-msg:c-parameters" { - case multiprotocol-case { - container multiprotocol-capability { - reference "http://tools.ietf.org/html/rfc4760#section-8"; - uses bgp-table-type; - } - } - case graceful-restart-case { - container graceful-restart-capability { - reference "http://tools.ietf.org/html/rfc4724#section-3"; - - leaf restart-flags { - type bits { - bit restart-state { - position 0; - } - } - mandatory true; - } - - leaf restart-time { - type uint16 { - range 0..4095; - } - units seconds; - mandatory true; - } - - list tables { - uses bgp-table-type; - key "afi safi"; - - leaf afi-flags { - type bits { - bit forwarding-state { - position 0; - } - } - mandatory true; - } - } - } - } - } + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:bgp-multiprotocol"; + prefix "bgp-mp"; + + import ietf-inet-types { prefix inet; revision-date 2010-09-24; } + import bgp-message { prefix bgp-msg; revision-date 2013-09-19; } + import bgp-types { prefix bgp-t; revision-date 2013-09-19; } + + organization "Cisco Systems, Inc."; + contact "Dana Kutenicsova "; + + description + "This module contains the base data model of a BGP message. + It rolls up the definitions contained in RFC4271 + and draft-ietf-idr-ls-distribution-03. + + Copyright (c)2013 Cisco Systems, Inc. All rights reserved. + + This program and the accompanying materials are made available + under the terms of the Eclipse Public License v1.0 which + accompanies this distribution, and is available at + http://www.eclipse.org/legal/epl-v10.html"; + + revision "2013-09-19" { + description + "Split off basic types"; + } + + revision "2013-09-18" { + description + "Initial revision."; + reference "RFC4760"; + } + + grouping bgp-table-type { + leaf afi { + type identityref { + base bgp-t:address-family; + } + } + leaf safi { + type identityref { + base bgp-t:subsequent-address-family; + } + } + } + + grouping destination { + choice destination-type { + case destination-ipv4-case { + container destination-ipv4 { + when "../../afi = ipv4"; + leaf-list ipv4-prefixes { + type inet:ipv4-prefix; + } + } + } + case destination-ipv6-case { + container destination-ipv6 { + when "../../afi = ipv6"; + leaf-list ipv6-prefixes { + type inet:ipv6-prefix; + } + } + } + } + } + + augment "/bgp-msg:open/bgp-msg:bgp-parameters/bgp-msg:c-parameters" { + case multiprotocol-case { + container multiprotocol-capability { + reference "http://tools.ietf.org/html/rfc4760#section-8"; + uses bgp-table-type; + } + } + case graceful-restart-case { + container graceful-restart-capability { + reference "http://tools.ietf.org/html/rfc4724#section-3"; + + leaf restart-flags { + type bits { + bit restart-state { + position 0; + } + } + mandatory true; + } + + leaf restart-time { + type uint16 { + range 0..4095; + } + units seconds; + mandatory true; + } + + list tables { + uses bgp-table-type; + key "afi safi"; + + leaf afi-flags { + type bits { + bit forwarding-state { + position 0; + } + } + mandatory true; + } + } + } + } + } augment "/bgp-msg:update/bgp-msg:path-attributes" { - container mp-reach-nlri { - reference "http://tools.ietf.org/html/rfc4760#section-3"; + container mp-reach-nlri { + reference "http://tools.ietf.org/html/rfc4760#section-3"; - uses bgp-table-type; - uses bgp-t:next-hop; + uses bgp-table-type; + uses bgp-t:next-hop; - container advertized-routes { - uses destination; - } - } - } + container advertized-routes { + uses destination; + } + } + } - augment "/bgp-msg:update/bgp-msg:path-attributes" { - container mp-unreach-nlri { - reference "http://tools.ietf.org/html/rfc4760#section-4"; + augment "/bgp-msg:update/bgp-msg:path-attributes" { + container mp-unreach-nlri { + reference "http://tools.ietf.org/html/rfc4760#section-4"; - uses bgp-table-type; + uses bgp-table-type; - container withdrawn-routes { - uses destination; - } - } - } + container withdrawn-routes { + uses destination; + } + } + } } diff --git a/bgp/parser-api/src/test/java/org/opendaylight/protocol/bgp/parser/APITest.java b/bgp/parser-api/src/test/java/org/opendaylight/protocol/bgp/parser/APITest.java index daaafa85f9..ea54c876e6 100644 --- a/bgp/parser-api/src/test/java/org/opendaylight/protocol/bgp/parser/APITest.java +++ b/bgp/parser-api/src/test/java/org/opendaylight/protocol/bgp/parser/APITest.java @@ -25,42 +25,42 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mess public class APITest { - @Test - public void testDocumentedException() { - final BGPDocumentedException de = new BGPDocumentedException("Some message", BGPError.BAD_BGP_ID); - assertEquals("Some message", de.getMessage()); - assertEquals(BGPError.BAD_BGP_ID, de.getError()); - assertNull(de.getData()); + @Test + public void testDocumentedException() { + final BGPDocumentedException de = new BGPDocumentedException("Some message", BGPError.BAD_BGP_ID); + assertEquals("Some message", de.getMessage()); + assertEquals(BGPError.BAD_BGP_ID, de.getError()); + assertNull(de.getData()); - final BGPDocumentedException doc = BGPDocumentedException.badMessageLength("Wrong length", 5000); - assertEquals(5000, ByteArray.bytesToInt(doc.getData())); - } + final BGPDocumentedException doc = BGPDocumentedException.badMessageLength("Wrong length", 5000); + assertEquals(5000, ByteArray.bytesToInt(doc.getData())); + } - @Test - public void testParsingException() { - final BGPParsingException de = new BGPParsingException("Some message"); - assertEquals("Some message", de.getMessage()); - } + @Test + public void testParsingException() { + final BGPParsingException de = new BGPParsingException("Some message"); + assertEquals("Some message", de.getMessage()); + } - @Test - public void testBGPError() { - assertEquals(BGPError.BAD_MSG_TYPE, BGPError.forValue(1, 3)); - } + @Test + public void testBGPError() { + assertEquals(BGPError.BAD_MSG_TYPE, BGPError.forValue(1, 3)); + } - @Test - public void testTerminationReason() { - assertEquals(BGPError.BAD_PEER_AS.toString(), new BGPTerminationReason(BGPError.BAD_PEER_AS).getErrorMessage()); - } + @Test + public void testTerminationReason() { + assertEquals(BGPError.BAD_PEER_AS.toString(), new BGPTerminationReason(BGPError.BAD_PEER_AS).getErrorMessage()); + } - @Test - public void testAsNumberUtil() { - final List params = new ArrayList<>(); - params.add(new BgpParametersBuilder().setCParameters( - new As4BytesCaseBuilder().setAs4BytesCapability(new As4BytesCapabilityBuilder().setAsNumber(new AsNumber(35L)).build()).build()).build()); - final Open open1 = new OpenBuilder().setBgpParameters(params).build(); - assertEquals(35L, AsNumberUtil.advertizedAsNumber(open1).getValue().longValue()); + @Test + public void testAsNumberUtil() { + final List params = new ArrayList<>(); + params.add(new BgpParametersBuilder().setCParameters( + new As4BytesCaseBuilder().setAs4BytesCapability(new As4BytesCapabilityBuilder().setAsNumber(new AsNumber(35L)).build()).build()).build()); + final Open open1 = new OpenBuilder().setBgpParameters(params).build(); + assertEquals(35L, AsNumberUtil.advertizedAsNumber(open1).getValue().longValue()); - final Open open2 = new OpenBuilder().setMyAsNumber(10).build(); - assertEquals(10, AsNumberUtil.advertizedAsNumber(open2).getValue().intValue()); - } + final Open open2 = new OpenBuilder().setMyAsNumber(10).build(); + assertEquals(10, AsNumberUtil.advertizedAsNumber(open2).getValue().intValue()); + } } diff --git a/bgp/parser-api/src/test/java/org/opendaylight/protocol/bgp/parser/TableTypeTest.java b/bgp/parser-api/src/test/java/org/opendaylight/protocol/bgp/parser/TableTypeTest.java index 0fe47a5da6..490b885a23 100644 --- a/bgp/parser-api/src/test/java/org/opendaylight/protocol/bgp/parser/TableTypeTest.java +++ b/bgp/parser-api/src/test/java/org/opendaylight/protocol/bgp/parser/TableTypeTest.java @@ -20,29 +20,29 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type public class TableTypeTest { - @Test - public void testTableTypes() { - final BgpTableType tt1 = new BgpTableTypeImpl(Ipv4AddressFamily.class, MplsLabeledVpnSubsequentAddressFamily.class); - final BgpTableType tt2 = new BgpTableTypeImpl(Ipv6AddressFamily.class, MplsLabeledVpnSubsequentAddressFamily.class); + @Test + public void testTableTypes() { + final BgpTableType tt1 = new BgpTableTypeImpl(Ipv4AddressFamily.class, MplsLabeledVpnSubsequentAddressFamily.class); + final BgpTableType tt2 = new BgpTableTypeImpl(Ipv6AddressFamily.class, MplsLabeledVpnSubsequentAddressFamily.class); - try { - new BgpTableTypeImpl(null, MplsLabeledVpnSubsequentAddressFamily.class); - fail("Null AFI!"); - } catch (final NullPointerException e) { - assertEquals("Address family may not be null", e.getMessage()); - } + try { + new BgpTableTypeImpl(null, MplsLabeledVpnSubsequentAddressFamily.class); + fail("Null AFI!"); + } catch (final NullPointerException e) { + assertEquals("Address family may not be null", e.getMessage()); + } - try { - new BgpTableTypeImpl(Ipv6AddressFamily.class, null); - fail("Null SAFI!"); - } catch (final NullPointerException e) { - assertEquals("Subsequent address family may not be null", e.getMessage()); - } + try { + new BgpTableTypeImpl(Ipv6AddressFamily.class, null); + fail("Null SAFI!"); + } catch (final NullPointerException e) { + assertEquals("Subsequent address family may not be null", e.getMessage()); + } - assertFalse(tt1.equals(tt2)); - assertNotSame(tt1.hashCode(), tt2.hashCode()); - assertEquals(tt1.toString(), tt1.toString()); - assertNotSame(tt1.getAfi(), tt2.getAfi()); - assertEquals(tt1.getSafi(), tt2.getSafi()); - } + assertFalse(tt1.equals(tt2)); + assertNotSame(tt1.hashCode(), tt2.hashCode()); + assertEquals(tt1.toString(), tt1.toString()); + assertNotSame(tt1.getAfi(), tt2.getAfi()); + assertEquals(tt1.getSafi(), tt2.getSafi()); + } } diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/BGPActivator.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/BGPActivator.java index 54b4088e7c..9bbaedf337 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/BGPActivator.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/BGPActivator.java @@ -56,73 +56,75 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily; public final class BGPActivator extends AbstractBGPExtensionProviderActivator { - @Override - protected List startImpl(final BGPExtensionProviderContext context) { - final List regs = new ArrayList<>(); - - final AddressFamilyRegistry afiReg = context.getAddressFamilyRegistry(); - regs.add(context.registerAddressFamily(Ipv4AddressFamily.class, 1)); - regs.add(context.registerAddressFamily(Ipv6AddressFamily.class, 2)); - - final SubsequentAddressFamilyRegistry safiReg = context.getSubsequentAddressFamilyRegistry(); - regs.add(context.registerSubsequentAddressFamily(UnicastSubsequentAddressFamily.class, 1)); - regs.add(context.registerSubsequentAddressFamily(MplsLabeledVpnSubsequentAddressFamily.class, 128)); - - final NlriRegistry nlriReg = context.getNlriRegistry(); - regs.add(context.registerNlriParser(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class, new Ipv4NlriParser())); - regs.add(context.registerNlriParser(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class, new Ipv6NlriParser())); - - final AttributeRegistry attrReg = context.getAttributeRegistry(); - regs.add(context.registerAttributeParser(OriginAttributeParser.TYPE, new OriginAttributeParser())); - regs.add(context.registerAttributeParser(AsPathAttributeParser.TYPE, new AsPathAttributeParser(context.getReferenceCache()))); - regs.add(context.registerAttributeParser(NextHopAttributeParser.TYPE, new NextHopAttributeParser())); - regs.add(context.registerAttributeParser(MultiExitDiscriminatorAttributeParser.TYPE, new MultiExitDiscriminatorAttributeParser())); - regs.add(context.registerAttributeParser(LocalPreferenceAttributeParser.TYPE, new LocalPreferenceAttributeParser())); - regs.add(context.registerAttributeParser(AtomicAggregateAttributeParser.TYPE, new AtomicAggregateAttributeParser())); - regs.add(context.registerAttributeParser(AggregatorAttributeParser.TYPE, new AggregatorAttributeParser(context.getReferenceCache()))); - regs.add(context.registerAttributeParser(CommunitiesAttributeParser.TYPE, new CommunitiesAttributeParser(context.getReferenceCache()))); - regs.add(context.registerAttributeParser(OriginatorIdAttributeParser.TYPE, new OriginatorIdAttributeParser())); - regs.add(context.registerAttributeParser(ClusterIdAttributeParser.TYPE, new ClusterIdAttributeParser())); - regs.add(context.registerAttributeParser(MPReachAttributeParser.TYPE, new MPReachAttributeParser(nlriReg))); - regs.add(context.registerAttributeParser(MPUnreachAttributeParser.TYPE, new MPUnreachAttributeParser(nlriReg))); - regs.add(context.registerAttributeParser(ExtendedCommunitiesAttributeParser.TYPE, new ExtendedCommunitiesAttributeParser(context.getReferenceCache()))); - regs.add(context.registerAttributeParser(AS4AggregatorAttributeParser.TYPE, new AS4AggregatorAttributeParser())); - regs.add(context.registerAttributeParser(AS4PathAttributeParser.TYPE, new AS4PathAttributeParser())); - - final CapabilityRegistry capReg = context.getCapabilityRegistry(); - final MultiProtocolCapabilityHandler multi = new MultiProtocolCapabilityHandler(afiReg, safiReg); - regs.add(context.registerCapabilityParser(MultiProtocolCapabilityHandler.CODE, multi)); - regs.add(context.registerCapabilitySerializer(MultiprotocolCase.class, multi)); - - final As4CapabilityHandler as4 = new As4CapabilityHandler(); - regs.add(context.registerCapabilityParser(As4CapabilityHandler.CODE, as4)); - regs.add(context.registerCapabilitySerializer(As4BytesCase.class, as4)); - - final GracefulCapabilityHandler grace = new GracefulCapabilityHandler(afiReg, safiReg); - regs.add(context.registerCapabilitySerializer(GracefulRestartCase.class, grace)); - regs.add(context.registerCapabilityParser(GracefulCapabilityHandler.CODE, grace)); - - final ParameterRegistry paramReg = context.getParameterRegistry(); - final CapabilityParameterParser cpp = new CapabilityParameterParser(capReg); - regs.add(context.registerParameterParser(CapabilityParameterParser.TYPE, cpp)); - regs.add(context.registerParameterSerializer(BgpParameters.class, cpp)); - - final BGPOpenMessageParser omp = new BGPOpenMessageParser(paramReg); - regs.add(context.registerMessageParser(BGPOpenMessageParser.TYPE, omp)); - regs.add(context.registerMessageSerializer(Open.class, omp)); - - final BGPUpdateMessageParser ump = new BGPUpdateMessageParser(attrReg); - regs.add(context.registerMessageParser(BGPUpdateMessageParser.TYPE, ump)); - // Serialization of Update message is not supported - - final BGPNotificationMessageParser nmp = new BGPNotificationMessageParser(); - regs.add(context.registerMessageParser(BGPNotificationMessageParser.TYPE, nmp)); - regs.add(context.registerMessageSerializer(Notify.class, nmp)); - - final BGPKeepAliveMessageParser kamp = new BGPKeepAliveMessageParser(); - regs.add(context.registerMessageParser(BGPKeepAliveMessageParser.TYPE, kamp)); - regs.add(context.registerMessageSerializer(Keepalive.class, kamp)); - - return regs; - } + @Override + protected List startImpl(final BGPExtensionProviderContext context) { + final List regs = new ArrayList<>(); + + final AddressFamilyRegistry afiReg = context.getAddressFamilyRegistry(); + regs.add(context.registerAddressFamily(Ipv4AddressFamily.class, 1)); + regs.add(context.registerAddressFamily(Ipv6AddressFamily.class, 2)); + + final SubsequentAddressFamilyRegistry safiReg = context.getSubsequentAddressFamilyRegistry(); + regs.add(context.registerSubsequentAddressFamily(UnicastSubsequentAddressFamily.class, 1)); + regs.add(context.registerSubsequentAddressFamily(MplsLabeledVpnSubsequentAddressFamily.class, 128)); + + final NlriRegistry nlriReg = context.getNlriRegistry(); + regs.add(context.registerNlriParser(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class, new Ipv4NlriParser())); + regs.add(context.registerNlriParser(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class, new Ipv6NlriParser())); + + final AttributeRegistry attrReg = context.getAttributeRegistry(); + regs.add(context.registerAttributeParser(OriginAttributeParser.TYPE, new OriginAttributeParser())); + regs.add(context.registerAttributeParser(AsPathAttributeParser.TYPE, new AsPathAttributeParser(context.getReferenceCache()))); + regs.add(context.registerAttributeParser(NextHopAttributeParser.TYPE, new NextHopAttributeParser())); + regs.add(context.registerAttributeParser(MultiExitDiscriminatorAttributeParser.TYPE, new MultiExitDiscriminatorAttributeParser())); + regs.add(context.registerAttributeParser(LocalPreferenceAttributeParser.TYPE, new LocalPreferenceAttributeParser())); + regs.add(context.registerAttributeParser(AtomicAggregateAttributeParser.TYPE, new AtomicAggregateAttributeParser())); + regs.add(context.registerAttributeParser(AggregatorAttributeParser.TYPE, new AggregatorAttributeParser(context.getReferenceCache()))); + regs.add(context.registerAttributeParser(CommunitiesAttributeParser.TYPE, + new CommunitiesAttributeParser(context.getReferenceCache()))); + regs.add(context.registerAttributeParser(OriginatorIdAttributeParser.TYPE, new OriginatorIdAttributeParser())); + regs.add(context.registerAttributeParser(ClusterIdAttributeParser.TYPE, new ClusterIdAttributeParser())); + regs.add(context.registerAttributeParser(MPReachAttributeParser.TYPE, new MPReachAttributeParser(nlriReg))); + regs.add(context.registerAttributeParser(MPUnreachAttributeParser.TYPE, new MPUnreachAttributeParser(nlriReg))); + regs.add(context.registerAttributeParser(ExtendedCommunitiesAttributeParser.TYPE, + new ExtendedCommunitiesAttributeParser(context.getReferenceCache()))); + regs.add(context.registerAttributeParser(AS4AggregatorAttributeParser.TYPE, new AS4AggregatorAttributeParser())); + regs.add(context.registerAttributeParser(AS4PathAttributeParser.TYPE, new AS4PathAttributeParser())); + + final CapabilityRegistry capReg = context.getCapabilityRegistry(); + final MultiProtocolCapabilityHandler multi = new MultiProtocolCapabilityHandler(afiReg, safiReg); + regs.add(context.registerCapabilityParser(MultiProtocolCapabilityHandler.CODE, multi)); + regs.add(context.registerCapabilitySerializer(MultiprotocolCase.class, multi)); + + final As4CapabilityHandler as4 = new As4CapabilityHandler(); + regs.add(context.registerCapabilityParser(As4CapabilityHandler.CODE, as4)); + regs.add(context.registerCapabilitySerializer(As4BytesCase.class, as4)); + + final GracefulCapabilityHandler grace = new GracefulCapabilityHandler(afiReg, safiReg); + regs.add(context.registerCapabilitySerializer(GracefulRestartCase.class, grace)); + regs.add(context.registerCapabilityParser(GracefulCapabilityHandler.CODE, grace)); + + final ParameterRegistry paramReg = context.getParameterRegistry(); + final CapabilityParameterParser cpp = new CapabilityParameterParser(capReg); + regs.add(context.registerParameterParser(CapabilityParameterParser.TYPE, cpp)); + regs.add(context.registerParameterSerializer(BgpParameters.class, cpp)); + + final BGPOpenMessageParser omp = new BGPOpenMessageParser(paramReg); + regs.add(context.registerMessageParser(BGPOpenMessageParser.TYPE, omp)); + regs.add(context.registerMessageSerializer(Open.class, omp)); + + final BGPUpdateMessageParser ump = new BGPUpdateMessageParser(attrReg); + regs.add(context.registerMessageParser(BGPUpdateMessageParser.TYPE, ump)); + // Serialization of Update message is not supported + + final BGPNotificationMessageParser nmp = new BGPNotificationMessageParser(); + regs.add(context.registerMessageParser(BGPNotificationMessageParser.TYPE, nmp)); + regs.add(context.registerMessageSerializer(Notify.class, nmp)); + + final BGPKeepAliveMessageParser kamp = new BGPKeepAliveMessageParser(); + regs.add(context.registerMessageParser(BGPKeepAliveMessageParser.TYPE, kamp)); + regs.add(context.registerMessageSerializer(Keepalive.class, kamp)); + + return regs; + } } diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/BGPKeepAliveMessageParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/BGPKeepAliveMessageParser.java index 1c10731f27..e841ed6213 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/BGPKeepAliveMessageParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/BGPKeepAliveMessageParser.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.parser.impl.message; +import com.google.common.base.Preconditions; + import io.netty.buffer.ByteBuf; import org.opendaylight.protocol.bgp.parser.BGPDocumentedException; @@ -17,25 +19,23 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mess import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.KeepaliveBuilder; import org.opendaylight.yangtools.yang.binding.Notification; -import com.google.common.base.Preconditions; - public class BGPKeepAliveMessageParser implements MessageParser, MessageSerializer { - public static final int TYPE = 4; + public static final int TYPE = 4; - private final Keepalive msg = new KeepaliveBuilder().build(); - private final byte[] bytes = MessageUtil.formatMessage(TYPE, new byte[0]); + private final Keepalive msg = new KeepaliveBuilder().build(); + private final byte[] bytes = MessageUtil.formatMessage(TYPE, new byte[0]); - @Override - public Keepalive parseMessageBody(final ByteBuf body, final int messageLength) throws BGPDocumentedException { - if (body.readableBytes() != 0) { - throw BGPDocumentedException.badMessageLength("Message length field not within valid range.", messageLength); - } - return this.msg; - } + @Override + public Keepalive parseMessageBody(final ByteBuf body, final int messageLength) throws BGPDocumentedException { + if (body.readableBytes() != 0) { + throw BGPDocumentedException.badMessageLength("Message length field not within valid range.", messageLength); + } + return this.msg; + } - @Override - public byte[] serializeMessage(final Notification message) { - Preconditions.checkArgument(message instanceof Keepalive); - return this.bytes; - } + @Override + public byte[] serializeMessage(final Notification message) { + Preconditions.checkArgument(message instanceof Keepalive); + return this.bytes; + } } diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/BGPNotificationMessageParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/BGPNotificationMessageParser.java index 95f2dd43ff..d41d611394 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/BGPNotificationMessageParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/BGPNotificationMessageParser.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.parser.impl.message; +import com.google.common.primitives.UnsignedBytes; + import io.netty.buffer.ByteBuf; import java.util.Arrays; @@ -23,78 +25,76 @@ import org.opendaylight.yangtools.yang.binding.Notification; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.primitives.UnsignedBytes; - /** * Parser for BGPNotification message. */ public final class BGPNotificationMessageParser implements MessageParser, MessageSerializer { - public static final int TYPE = 3; - - private static final Logger LOG = LoggerFactory.getLogger(BGPNotificationMessageParser.class); - - private static final int ERROR_SIZE = 2; - - /** - * Serializes BGP Notification message. - * - * @param msg to be serialized - * @return BGP Notification message converted to byte array - */ - @Override - public byte[] serializeMessage(final Notification msg) { - if (msg == null) { - throw new IllegalArgumentException("BGP Notification message cannot be null"); - } - - final Notify ntf = (Notify) msg; - LOG.trace("Started serializing Notification message: {}", ntf); - - final byte[] msgBody = (ntf.getData() == null) ? new byte[ERROR_SIZE] : new byte[ERROR_SIZE + ntf.getData().length]; - - msgBody[0] = UnsignedBytes.checkedCast(ntf.getErrorCode()); - - msgBody[1] = UnsignedBytes.checkedCast(ntf.getErrorSubcode()); - - if (ntf.getData() != null) { - System.arraycopy(ntf.getData(), 0, msgBody, ERROR_SIZE, ntf.getData().length); - } - - final byte[] ret = MessageUtil.formatMessage(TYPE, msgBody); - LOG.trace("Notification message serialized to: {}", Arrays.toString(ret)); - return ret; - } - - /** - * Parses BGP Notification message to bytes. - * - * @param body byte array to be parsed - * @return BGPNotification message - * @throws BGPDocumentedException - */ - @Override - public Notify parseMessageBody(final ByteBuf body, final int messageLength) throws BGPDocumentedException { - if (body == null) { - throw new IllegalArgumentException("Byte array cannot be null."); - } - LOG.trace("Started parsing of notification message: {}", Arrays.toString(ByteArray.getAllBytes(body))); - - if (body.readableBytes() < ERROR_SIZE) { - throw BGPDocumentedException.badMessageLength("Notification message too small.", messageLength); - } - final int errorCode = UnsignedBytes.toInt(body.readByte()); - final int errorSubcode = UnsignedBytes.toInt(body.readByte()); - - byte[] data = null; - if (body.readableBytes() != 0) { - data = ByteArray.readAllBytes(body); - } - final NotifyBuilder builder = new NotifyBuilder().setErrorCode((short) errorCode).setErrorSubcode((short) errorSubcode); - if (data != null) { - builder.setData(data); - } - LOG.debug("BGP Notification message was parsed: err = {}, data = {}.", BGPError.forValue(errorCode, errorSubcode), - Arrays.toString(data)); - return builder.build(); - } + public static final int TYPE = 3; + + private static final Logger LOG = LoggerFactory.getLogger(BGPNotificationMessageParser.class); + + private static final int ERROR_SIZE = 2; + + /** + * Serializes BGP Notification message. + * + * @param msg to be serialized + * @return BGP Notification message converted to byte array + */ + @Override + public byte[] serializeMessage(final Notification msg) { + if (msg == null) { + throw new IllegalArgumentException("BGP Notification message cannot be null"); + } + + final Notify ntf = (Notify) msg; + LOG.trace("Started serializing Notification message: {}", ntf); + + final byte[] msgBody = (ntf.getData() == null) ? new byte[ERROR_SIZE] : new byte[ERROR_SIZE + ntf.getData().length]; + + msgBody[0] = UnsignedBytes.checkedCast(ntf.getErrorCode()); + + msgBody[1] = UnsignedBytes.checkedCast(ntf.getErrorSubcode()); + + if (ntf.getData() != null) { + System.arraycopy(ntf.getData(), 0, msgBody, ERROR_SIZE, ntf.getData().length); + } + + final byte[] ret = MessageUtil.formatMessage(TYPE, msgBody); + LOG.trace("Notification message serialized to: {}", Arrays.toString(ret)); + return ret; + } + + /** + * Parses BGP Notification message to bytes. + * + * @param body byte array to be parsed + * @return BGPNotification message + * @throws BGPDocumentedException + */ + @Override + public Notify parseMessageBody(final ByteBuf body, final int messageLength) throws BGPDocumentedException { + if (body == null) { + throw new IllegalArgumentException("Byte array cannot be null."); + } + LOG.trace("Started parsing of notification message: {}", Arrays.toString(ByteArray.getAllBytes(body))); + + if (body.readableBytes() < ERROR_SIZE) { + throw BGPDocumentedException.badMessageLength("Notification message too small.", messageLength); + } + final int errorCode = UnsignedBytes.toInt(body.readByte()); + final int errorSubcode = UnsignedBytes.toInt(body.readByte()); + + byte[] data = null; + if (body.readableBytes() != 0) { + data = ByteArray.readAllBytes(body); + } + final NotifyBuilder builder = new NotifyBuilder().setErrorCode((short) errorCode).setErrorSubcode((short) errorSubcode); + if (data != null) { + builder.setData(data); + } + LOG.debug("BGP Notification message was parsed: err = {}, data = {}.", BGPError.forValue(errorCode, errorSubcode), + Arrays.toString(data)); + return builder.build(); + } } diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/BGPOpenMessageParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/BGPOpenMessageParser.java index d38d6fa7af..9125e93cc2 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/BGPOpenMessageParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/BGPOpenMessageParser.java @@ -7,6 +7,11 @@ */ package org.opendaylight.protocol.bgp.parser.impl.message; +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.primitives.UnsignedBytes; + import io.netty.buffer.ByteBuf; import java.util.Arrays; @@ -33,166 +38,161 @@ import org.opendaylight.yangtools.yang.binding.Notification; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.primitives.UnsignedBytes; - /** * Parser for BGP Open message. */ public final class BGPOpenMessageParser implements MessageParser, MessageSerializer { - public static final int TYPE = 1; - - private static final Logger LOG = LoggerFactory.getLogger(BGPOpenMessageParser.class); - - private static final int VERSION_SIZE = 1; - private static final int AS_SIZE = 2; - private static final int HOLD_TIME_SIZE = 2; - private static final int BGP_ID_SIZE = 4; - private static final int OPT_PARAM_LENGTH_SIZE = 1; - - private static final int MIN_MSG_LENGTH = VERSION_SIZE + AS_SIZE + HOLD_TIME_SIZE + BGP_ID_SIZE + OPT_PARAM_LENGTH_SIZE; - - private static final int BGP_VERSION = 4; - - private static final int AS_TRANS = 2345; - - private final ParameterRegistry reg; - - public BGPOpenMessageParser(final ParameterRegistry reg) { - this.reg = Preconditions.checkNotNull(reg); - } - - /** - * Serializes given BGP Open message to byte array, without the header. - * - * @param msg BGP Open message to be serialized. - * @return BGP Open message converted to byte array - */ - @Override - public byte[] serializeMessage(final Notification msg) { - if (msg == null) { - throw new IllegalArgumentException("BGPOpen message cannot be null"); - } - LOG.trace("Started serializing open message: {}", msg); - final Open open = (Open) msg; - - final Map optParams = Maps.newHashMap(); - - int optParamsLength = 0; - - if (open.getBgpParameters() != null) { - for (final BgpParameters param : open.getBgpParameters()) { - final byte[] p = this.reg.serializeParameter(param); - if (p != null) { - optParams.put(p, p.length); - optParamsLength += p.length; - } - } - } - final byte[] msgBody = new byte[MIN_MSG_LENGTH + optParamsLength]; - - int offset = 0; - - msgBody[offset] = UnsignedBytes.checkedCast(BGP_VERSION); - offset += VERSION_SIZE; - - // When our AS number does not fit into two bytes, we report it as AS_TRANS - int openAS = open.getMyAsNumber(); - if (openAS > Values.UNSIGNED_SHORT_MAX_VALUE) { - openAS = AS_TRANS; - } - System.arraycopy(ByteArray.longToBytes(openAS, AS_SIZE), 0, msgBody, offset, AS_SIZE); - offset += AS_SIZE; - - System.arraycopy(ByteArray.intToBytes(open.getHoldTimer(), HOLD_TIME_SIZE), 0, msgBody, offset, HOLD_TIME_SIZE); - offset += HOLD_TIME_SIZE; - - System.arraycopy(Ipv4Util.bytesForAddress(open.getBgpIdentifier()), 0, msgBody, offset, BGP_ID_SIZE); - offset += BGP_ID_SIZE; - - msgBody[offset] = UnsignedBytes.checkedCast(optParamsLength); - - int index = MIN_MSG_LENGTH; - if (optParams != null) { - for (final Entry entry : optParams.entrySet()) { - System.arraycopy(entry.getKey(), 0, msgBody, index, entry.getValue()); - index += entry.getValue(); - } - } - final byte[] ret = MessageUtil.formatMessage(TYPE, msgBody); - LOG.trace("Open message serialized to: {}", Arrays.toString(ret)); - return ret; - } - - /** - * Parses given byte array to BGP Open message - * - * @param body byte array representing BGP Open message, without header - * @return BGP Open Message - * @throws BGPDocumentedException if the parsing was unsuccessful - */ - @Override - public Open parseMessageBody(final ByteBuf body, final int messageLength) throws BGPDocumentedException { - if (body == null) { - throw new IllegalArgumentException("Byte array cannot be null."); - } - LOG.trace("Started parsing of open message: {}", Arrays.toString(ByteArray.getAllBytes(body))); - - if (body.readableBytes() < MIN_MSG_LENGTH) { - throw BGPDocumentedException.badMessageLength("Open message too small.", messageLength); - } - int version = UnsignedBytes.toInt(body.readByte()); - if (version != BGP_VERSION) { - throw new BGPDocumentedException("BGP Protocol version " + version + " not supported.", BGPError.VERSION_NOT_SUPPORTED); - } - final AsNumber as = new AsNumber((long) body.readUnsignedShort()); - final int holdTime = body.readUnsignedShort(); - if (holdTime == 1 || holdTime == 2) { - throw new BGPDocumentedException("Hold time value not acceptable.", BGPError.HOLD_TIME_NOT_ACC); - } - Ipv4Address bgpId = null; - try { - bgpId = Ipv4Util.addressForBytes(ByteArray.readBytes(body, BGP_ID_SIZE)); - } catch (final IllegalArgumentException e) { - throw new BGPDocumentedException("BGP Identifier is not a valid IPv4 Address", BGPError.BAD_BGP_ID, e); - } - final int optLength = UnsignedBytes.toInt(body.readByte()); - - final List optParams = Lists.newArrayList(); - if (optLength > 0) { - fillParams(body.slice(body.readerIndex(), optLength), optParams); - } - LOG.debug("BGP Open message was parsed: AS = {}, holdTimer = {}, bgpId = {}, optParams = {}", as, holdTime, bgpId, optParams); - return new OpenBuilder().setMyAsNumber(as.getValue().intValue()).setHoldTimer(holdTime).setBgpIdentifier(bgpId).setBgpParameters( - optParams).build(); - } - - private void fillParams(final ByteBuf buffer, final List params) throws BGPDocumentedException { - Preconditions.checkArgument(buffer != null && buffer.readableBytes() != 0, "Byte array cannot be null or empty."); - LOG.trace("Started parsing of BGP parameter: {}", Arrays.toString(ByteArray.getAllBytes(buffer))); - while (buffer.readableBytes() != 0) { - if (buffer.readableBytes() <= 2) { - throw new BGPDocumentedException("Malformed parameter encountered (" + buffer.readableBytes() + " bytes left)", BGPError.OPT_PARAM_NOT_SUPPORTED); - } - final int paramType = UnsignedBytes.toInt(buffer.readByte()); - final int paramLength = UnsignedBytes.toInt(buffer.readByte()); - final ByteBuf paramBody = buffer.slice(buffer.readerIndex(), paramLength); - - final BgpParameters param; - try { - param = this.reg.parseParameter(paramType, paramBody); - } catch (final BGPParsingException e) { - throw new BGPDocumentedException("Optional parameter not parsed", BGPError.UNSPECIFIC_OPEN_ERROR, e); - } - if (param != null) { - params.add(param); - } else { - LOG.debug("Ignoring BGP Parameter type: {}", paramType); - } - buffer.skipBytes(paramLength); - } - LOG.trace("Parsed BGP parameters: {}", Arrays.toString(params.toArray())); - } + public static final int TYPE = 1; + + private static final Logger LOG = LoggerFactory.getLogger(BGPOpenMessageParser.class); + + private static final int VERSION_SIZE = 1; + private static final int AS_SIZE = 2; + private static final int HOLD_TIME_SIZE = 2; + private static final int BGP_ID_SIZE = 4; + private static final int OPT_PARAM_LENGTH_SIZE = 1; + + private static final int MIN_MSG_LENGTH = VERSION_SIZE + AS_SIZE + HOLD_TIME_SIZE + BGP_ID_SIZE + OPT_PARAM_LENGTH_SIZE; + + private static final int BGP_VERSION = 4; + + private static final int AS_TRANS = 2345; + + private final ParameterRegistry reg; + + public BGPOpenMessageParser(final ParameterRegistry reg) { + this.reg = Preconditions.checkNotNull(reg); + } + + /** + * Serializes given BGP Open message to byte array, without the header. + * + * @param msg BGP Open message to be serialized. + * @return BGP Open message converted to byte array + */ + @Override + public byte[] serializeMessage(final Notification msg) { + if (msg == null) { + throw new IllegalArgumentException("BGPOpen message cannot be null"); + } + LOG.trace("Started serializing open message: {}", msg); + final Open open = (Open) msg; + + final Map optParams = Maps.newHashMap(); + + int optParamsLength = 0; + + if (open.getBgpParameters() != null) { + for (final BgpParameters param : open.getBgpParameters()) { + final byte[] p = this.reg.serializeParameter(param); + if (p != null) { + optParams.put(p, p.length); + optParamsLength += p.length; + } + } + } + final byte[] msgBody = new byte[MIN_MSG_LENGTH + optParamsLength]; + + int offset = 0; + + msgBody[offset] = UnsignedBytes.checkedCast(BGP_VERSION); + offset += VERSION_SIZE; + + // When our AS number does not fit into two bytes, we report it as AS_TRANS + int openAS = open.getMyAsNumber(); + if (openAS > Values.UNSIGNED_SHORT_MAX_VALUE) { + openAS = AS_TRANS; + } + System.arraycopy(ByteArray.longToBytes(openAS, AS_SIZE), 0, msgBody, offset, AS_SIZE); + offset += AS_SIZE; + + System.arraycopy(ByteArray.intToBytes(open.getHoldTimer(), HOLD_TIME_SIZE), 0, msgBody, offset, HOLD_TIME_SIZE); + offset += HOLD_TIME_SIZE; + + System.arraycopy(Ipv4Util.bytesForAddress(open.getBgpIdentifier()), 0, msgBody, offset, BGP_ID_SIZE); + offset += BGP_ID_SIZE; + + msgBody[offset] = UnsignedBytes.checkedCast(optParamsLength); + + int index = MIN_MSG_LENGTH; + if (optParams != null) { + for (final Entry entry : optParams.entrySet()) { + System.arraycopy(entry.getKey(), 0, msgBody, index, entry.getValue()); + index += entry.getValue(); + } + } + final byte[] ret = MessageUtil.formatMessage(TYPE, msgBody); + LOG.trace("Open message serialized to: {}", Arrays.toString(ret)); + return ret; + } + + /** + * Parses given byte array to BGP Open message + * + * @param body byte array representing BGP Open message, without header + * @return BGP Open Message + * @throws BGPDocumentedException if the parsing was unsuccessful + */ + @Override + public Open parseMessageBody(final ByteBuf body, final int messageLength) throws BGPDocumentedException { + if (body == null) { + throw new IllegalArgumentException("Byte array cannot be null."); + } + LOG.trace("Started parsing of open message: {}", Arrays.toString(ByteArray.getAllBytes(body))); + + if (body.readableBytes() < MIN_MSG_LENGTH) { + throw BGPDocumentedException.badMessageLength("Open message too small.", messageLength); + } + int version = UnsignedBytes.toInt(body.readByte()); + if (version != BGP_VERSION) { + throw new BGPDocumentedException("BGP Protocol version " + version + " not supported.", BGPError.VERSION_NOT_SUPPORTED); + } + final AsNumber as = new AsNumber((long) body.readUnsignedShort()); + final int holdTime = body.readUnsignedShort(); + if (holdTime == 1 || holdTime == 2) { + throw new BGPDocumentedException("Hold time value not acceptable.", BGPError.HOLD_TIME_NOT_ACC); + } + Ipv4Address bgpId = null; + try { + bgpId = Ipv4Util.addressForBytes(ByteArray.readBytes(body, BGP_ID_SIZE)); + } catch (final IllegalArgumentException e) { + throw new BGPDocumentedException("BGP Identifier is not a valid IPv4 Address", BGPError.BAD_BGP_ID, e); + } + final int optLength = UnsignedBytes.toInt(body.readByte()); + + final List optParams = Lists.newArrayList(); + if (optLength > 0) { + fillParams(body.slice(body.readerIndex(), optLength), optParams); + } + LOG.debug("BGP Open message was parsed: AS = {}, holdTimer = {}, bgpId = {}, optParams = {}", as, holdTime, bgpId, optParams); + return new OpenBuilder().setMyAsNumber(as.getValue().intValue()).setHoldTimer(holdTime).setBgpIdentifier(bgpId).setBgpParameters( + optParams).build(); + } + + private void fillParams(final ByteBuf buffer, final List params) throws BGPDocumentedException { + Preconditions.checkArgument(buffer != null && buffer.readableBytes() != 0, "Byte array cannot be null or empty."); + LOG.trace("Started parsing of BGP parameter: {}", Arrays.toString(ByteArray.getAllBytes(buffer))); + while (buffer.readableBytes() != 0) { + if (buffer.readableBytes() <= 2) { + throw new BGPDocumentedException("Malformed parameter encountered (" + buffer.readableBytes() + " bytes left)", BGPError.OPT_PARAM_NOT_SUPPORTED); + } + final int paramType = UnsignedBytes.toInt(buffer.readByte()); + final int paramLength = UnsignedBytes.toInt(buffer.readByte()); + final ByteBuf paramBody = buffer.slice(buffer.readerIndex(), paramLength); + + final BgpParameters param; + try { + param = this.reg.parseParameter(paramType, paramBody); + } catch (final BGPParsingException e) { + throw new BGPDocumentedException("Optional parameter not parsed", BGPError.UNSPECIFIC_OPEN_ERROR, e); + } + if (param != null) { + params.add(param); + } else { + LOG.debug("Ignoring BGP Parameter type: {}", paramType); + } + buffer.skipBytes(paramLength); + } + LOG.trace("Parsed BGP parameters: {}", Arrays.toString(params.toArray())); + } } diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/BGPUpdateMessageParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/BGPUpdateMessageParser.java index d5630d4517..5599a66ffb 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/BGPUpdateMessageParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/BGPUpdateMessageParser.java @@ -8,6 +8,8 @@ package org.opendaylight.protocol.bgp.parser.impl.message; +import com.google.common.base.Preconditions; + import io.netty.buffer.ByteBuf; import java.util.Arrays; @@ -29,8 +31,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mess import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; - /** * LENGTH fields, that denote the length of the fields with variable length, have fixed SIZE. * @@ -38,63 +38,63 @@ import com.google.common.base.Preconditions; * */ public class BGPUpdateMessageParser implements MessageParser { - public static final int TYPE = 2; - - private static final Logger LOG = LoggerFactory.getLogger(BGPUpdateMessageParser.class); - - /** - * Size of the withdrawn_routes_length field, in bytes. - */ - public static final int WITHDRAWN_ROUTES_LENGTH_SIZE = 2; - - /** - * Size of the total_path_attr_length field, in bytes. - */ - public static final int TOTAL_PATH_ATTR_LENGTH_SIZE = 2; - - private final AttributeRegistry reg; - - // Constructors ------------------------------------------------------- - public BGPUpdateMessageParser(final AttributeRegistry reg) { - this.reg = Preconditions.checkNotNull(reg); - } - - // Getters & setters -------------------------------------------------- - - @Override - public Update parseMessageBody(final ByteBuf buffer, final int messageLength) throws BGPDocumentedException { - Preconditions.checkArgument(buffer != null && buffer.readableBytes() != 0, "Byte array cannot be null or empty."); - LOG.trace("Started parsing of update message: {}", Arrays.toString(ByteArray.getAllBytes(buffer))); - - final int withdrawnRoutesLength = buffer.readUnsignedShort(); - final UpdateBuilder eventBuilder = new UpdateBuilder(); - - if (withdrawnRoutesLength > 0) { - final List withdrawnRoutes = Ipv4Util.prefixListForBytes(ByteArray.readBytes(buffer, withdrawnRoutesLength)); - eventBuilder.setWithdrawnRoutes(new WithdrawnRoutesBuilder().setWithdrawnRoutes(withdrawnRoutes).build()); - } - final int totalPathAttrLength = buffer.readUnsignedShort(); - - if (withdrawnRoutesLength == 0 && totalPathAttrLength == 0) { - return eventBuilder.build(); - } - if (totalPathAttrLength > 0) { - try { - final PathAttributes pathAttributes = this.reg.parseAttributes(buffer.slice(buffer.readerIndex(), totalPathAttrLength)); - buffer.skipBytes(totalPathAttrLength); - eventBuilder.setPathAttributes(pathAttributes); - } catch (final BGPParsingException | RuntimeException e) { - // Catch everything else and turn it into a BGPDocumentedException - LOG.warn("Could not parse BGP attributes", e); - throw new BGPDocumentedException("Could not parse BGP attributes.", BGPError.MALFORMED_ATTR_LIST, e); - } - } - final List nlri = Ipv4Util.prefixListForBytes(ByteArray.readAllBytes(buffer)); - if (nlri != null && !nlri.isEmpty()) { - eventBuilder.setNlri(new NlriBuilder().setNlri(nlri).build()); - } - Update msg = eventBuilder.build(); - LOG.debug("BGP Update message was parsed {}.", msg); - return msg; - } + public static final int TYPE = 2; + + private static final Logger LOG = LoggerFactory.getLogger(BGPUpdateMessageParser.class); + + /** + * Size of the withdrawn_routes_length field, in bytes. + */ + public static final int WITHDRAWN_ROUTES_LENGTH_SIZE = 2; + + /** + * Size of the total_path_attr_length field, in bytes. + */ + public static final int TOTAL_PATH_ATTR_LENGTH_SIZE = 2; + + private final AttributeRegistry reg; + + // Constructors ------------------------------------------------------- + public BGPUpdateMessageParser(final AttributeRegistry reg) { + this.reg = Preconditions.checkNotNull(reg); + } + + // Getters & setters -------------------------------------------------- + + @Override + public Update parseMessageBody(final ByteBuf buffer, final int messageLength) throws BGPDocumentedException { + Preconditions.checkArgument(buffer != null && buffer.readableBytes() != 0, "Byte array cannot be null or empty."); + LOG.trace("Started parsing of update message: {}", Arrays.toString(ByteArray.getAllBytes(buffer))); + + final int withdrawnRoutesLength = buffer.readUnsignedShort(); + final UpdateBuilder eventBuilder = new UpdateBuilder(); + + if (withdrawnRoutesLength > 0) { + final List withdrawnRoutes = Ipv4Util.prefixListForBytes(ByteArray.readBytes(buffer, withdrawnRoutesLength)); + eventBuilder.setWithdrawnRoutes(new WithdrawnRoutesBuilder().setWithdrawnRoutes(withdrawnRoutes).build()); + } + final int totalPathAttrLength = buffer.readUnsignedShort(); + + if (withdrawnRoutesLength == 0 && totalPathAttrLength == 0) { + return eventBuilder.build(); + } + if (totalPathAttrLength > 0) { + try { + final PathAttributes pathAttributes = this.reg.parseAttributes(buffer.slice(buffer.readerIndex(), totalPathAttrLength)); + buffer.skipBytes(totalPathAttrLength); + eventBuilder.setPathAttributes(pathAttributes); + } catch (final BGPParsingException | RuntimeException e) { + // Catch everything else and turn it into a BGPDocumentedException + LOG.warn("Could not parse BGP attributes", e); + throw new BGPDocumentedException("Could not parse BGP attributes.", BGPError.MALFORMED_ATTR_LIST, e); + } + } + final List nlri = Ipv4Util.prefixListForBytes(ByteArray.readAllBytes(buffer)); + if (nlri != null && !nlri.isEmpty()) { + eventBuilder.setNlri(new NlriBuilder().setNlri(nlri).build()); + } + Update msg = eventBuilder.build(); + LOG.debug("BGP Update message was parsed {}.", msg); + return msg; + } } diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/open/As4CapabilityHandler.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/open/As4CapabilityHandler.java index dc55abcda7..4c4dc6c435 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/open/As4CapabilityHandler.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/open/As4CapabilityHandler.java @@ -22,22 +22,22 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mess import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.c.parameters.as4.bytes._case.As4BytesCapabilityBuilder; public final class As4CapabilityHandler implements CapabilityParser, CapabilitySerializer { - public static final int CODE = 65; + public static final int CODE = 65; - private static final int AS4_LENGTH = 4; + private static final int AS4_LENGTH = 4; - @Override - public CParameters parseCapability(final ByteBuf buffer) throws BGPDocumentedException, BGPParsingException { - return new As4BytesCaseBuilder().setAs4BytesCapability( - new As4BytesCapabilityBuilder().setAsNumber(new AsNumber(buffer.readUnsignedInt())).build()).build(); - } + @Override + public CParameters parseCapability(final ByteBuf buffer) throws BGPDocumentedException, BGPParsingException { + return new As4BytesCaseBuilder().setAs4BytesCapability( + new As4BytesCapabilityBuilder().setAsNumber(new AsNumber(buffer.readUnsignedInt())).build()).build(); + } - @Override - public byte[] serializeCapability(final CParameters capability) { - return CapabilityUtil.formatCapability(CODE, putAS4BytesParameterValue((As4BytesCase) capability)); - } + @Override + public byte[] serializeCapability(final CParameters capability) { + return CapabilityUtil.formatCapability(CODE, putAS4BytesParameterValue((As4BytesCase) capability)); + } - private static byte[] putAS4BytesParameterValue(final As4BytesCase param) { - return ByteArray.longToBytes(param.getAs4BytesCapability().getAsNumber().getValue(), AS4_LENGTH); - } + private static byte[] putAS4BytesParameterValue(final As4BytesCase param) { + return ByteArray.longToBytes(param.getAs4BytesCapability().getAsNumber().getValue(), AS4_LENGTH); + } } \ No newline at end of file diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/open/CapabilityParameterParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/open/CapabilityParameterParser.java index f4ec5c5251..7cb2cb9299 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/open/CapabilityParameterParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/open/CapabilityParameterParser.java @@ -7,6 +7,9 @@ */ package org.opendaylight.protocol.bgp.parser.impl.message.open; +import com.google.common.base.Preconditions; +import com.google.common.primitives.UnsignedBytes; + import io.netty.buffer.ByteBuf; import java.util.Arrays; @@ -24,50 +27,47 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mess import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; -import com.google.common.primitives.UnsignedBytes; - /** * Parser for BGP Capability Parameter. */ public final class CapabilityParameterParser implements ParameterParser, ParameterSerializer { - public static final int TYPE = 2; + public static final int TYPE = 2; - private static final Logger LOG = LoggerFactory.getLogger(CapabilityParameterParser.class); - private final CapabilityRegistry reg; + private static final Logger LOG = LoggerFactory.getLogger(CapabilityParameterParser.class); + private final CapabilityRegistry reg; - public CapabilityParameterParser(final CapabilityRegistry reg) { - this.reg = Preconditions.checkNotNull(reg); - } + public CapabilityParameterParser(final CapabilityRegistry reg) { + this.reg = Preconditions.checkNotNull(reg); + } - @Override - public BgpParameters parseParameter(final ByteBuf buffer) throws BGPParsingException, BGPDocumentedException { - Preconditions.checkArgument(buffer != null && buffer.readableBytes() != 0, "Byte array cannot be null or empty."); - LOG.trace("Started parsing of BGP Capability: {}", Arrays.toString(ByteArray.getAllBytes(buffer))); - final int capCode = UnsignedBytes.toInt(buffer.readByte()); - final int capLength = UnsignedBytes.toInt(buffer.readByte()); - final ByteBuf paramBody = buffer.slice(buffer.readerIndex(), capLength); - final CParameters ret = this.reg.parseCapability(capCode, paramBody); - if (ret == null) { - LOG.debug("Ignoring unsupported capability {}", capCode); - return null; - } - return new BgpParametersBuilder().setCParameters(ret).build(); - } + @Override + public BgpParameters parseParameter(final ByteBuf buffer) throws BGPParsingException, BGPDocumentedException { + Preconditions.checkArgument(buffer != null && buffer.readableBytes() != 0, "Byte array cannot be null or empty."); + LOG.trace("Started parsing of BGP Capability: {}", Arrays.toString(ByteArray.getAllBytes(buffer))); + final int capCode = UnsignedBytes.toInt(buffer.readByte()); + final int capLength = UnsignedBytes.toInt(buffer.readByte()); + final ByteBuf paramBody = buffer.slice(buffer.readerIndex(), capLength); + final CParameters ret = this.reg.parseCapability(capCode, paramBody); + if (ret == null) { + LOG.debug("Ignoring unsupported capability {}", capCode); + return null; + } + return new BgpParametersBuilder().setCParameters(ret).build(); + } - @Override - public byte[] serializeParameter(final BgpParameters parameter) { - final CParameters cap = parameter.getCParameters(); + @Override + public byte[] serializeParameter(final BgpParameters parameter) { + final CParameters cap = parameter.getCParameters(); - LOG.trace("Started serializing BGP Capability: {}", cap); + LOG.trace("Started serializing BGP Capability: {}", cap); - byte[] bytes = this.reg.serializeCapability(cap); - if (bytes == null) { - throw new IllegalArgumentException("Unhandled capability class" + cap.getImplementedInterface()); - } + byte[] bytes = this.reg.serializeCapability(cap); + if (bytes == null) { + throw new IllegalArgumentException("Unhandled capability class" + cap.getImplementedInterface()); + } - LOG.trace("BGP capability serialized to: {}", Arrays.toString(bytes)); + LOG.trace("BGP capability serialized to: {}", Arrays.toString(bytes)); - return ParameterUtil.formatParameter(TYPE, bytes); - } + return ParameterUtil.formatParameter(TYPE, bytes); + } } diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/open/GracefulCapabilityHandler.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/open/GracefulCapabilityHandler.java index 5f328d2782..be67cce9e9 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/open/GracefulCapabilityHandler.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/open/GracefulCapabilityHandler.java @@ -7,6 +7,9 @@ */ package org.opendaylight.protocol.bgp.parser.impl.message.open; +import com.google.common.base.Preconditions; +import com.google.common.primitives.UnsignedBytes; + import io.netty.buffer.ByteBuf; import java.util.ArrayList; @@ -33,109 +36,106 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; -import com.google.common.primitives.UnsignedBytes; - public final class GracefulCapabilityHandler implements CapabilityParser, CapabilitySerializer { - public static final int CODE = 64; - - private static final Logger LOG = LoggerFactory.getLogger(GracefulCapabilityHandler.class); - - // Restart flag size, in bits - private static final int RESTART_FLAGS_SIZE = 4; - private static final int RESTART_FLAG_STATE = 0x80; - - // Restart timer size, in bits - private static final int TIMER_SIZE = 12; - private static final int TIMER_TOPBITS_MASK = 0x0F; - - // Size of the capability header - private static final int HEADER_SIZE = (RESTART_FLAGS_SIZE + TIMER_SIZE) / Byte.SIZE; - - // Length of each AFI/SAFI array member, in bytes - private static final int PER_AFI_SAFI_SIZE = 4; - - private static final int AFI_FLAG_FORWARDING_STATE = 0x80; - - private final AddressFamilyRegistry afiReg; - private final SubsequentAddressFamilyRegistry safiReg; - - public GracefulCapabilityHandler(final AddressFamilyRegistry afiReg, final SubsequentAddressFamilyRegistry safiReg) { - this.afiReg = Preconditions.checkNotNull(afiReg); - this.safiReg = Preconditions.checkNotNull(safiReg); - } - - @Override - public byte[] serializeCapability(final CParameters capability) { - final GracefulRestartCapability grace = ((GracefulRestartCase) capability).getGracefulRestartCapability(); - final List tables = grace.getTables(); - - final byte[] bytes = new byte[HEADER_SIZE + PER_AFI_SAFI_SIZE * tables.size()]; - - int flagBits = 0; - final RestartFlags flags = grace.getRestartFlags(); - if (flags != null) { - if (flags.isRestartState()) { - flagBits |= RESTART_FLAG_STATE; - } - } - int timeval = 0; - final Integer time = grace.getRestartTime(); - if (time != null) { - Preconditions.checkArgument(time >= 0 && time <= 4095); - timeval = time; - } - bytes[0] = UnsignedBytes.checkedCast(flagBits + timeval / 256); - bytes[1] = UnsignedBytes.checkedCast(timeval % 256); - - int index = HEADER_SIZE; - for (final Tables t : tables) { - final Class afi = t.getAfi(); - final Integer afival = this.afiReg.numberForClass(afi); - Preconditions.checkArgument(afival != null, "Unhandled address family " + afi); - - final Class safi = t.getSafi(); - final Integer safival = this.safiReg.numberForClass(safi); - Preconditions.checkArgument(safival != null, "Unhandled subsequent address family " + safi); - - bytes[index] = UnsignedBytes.checkedCast(afival / 256); - bytes[index + 1] = UnsignedBytes.checkedCast(afival % 256); - bytes[index + 2] = UnsignedBytes.checkedCast(safival); - if (t.getAfiFlags().isForwardingState()) { - bytes[index + 3] = UnsignedBytes.checkedCast(AFI_FLAG_FORWARDING_STATE); - } - index += PER_AFI_SAFI_SIZE; - } - return CapabilityUtil.formatCapability(CODE, bytes); - } - - @Override - public CParameters parseCapability(final ByteBuf buffer) throws BGPDocumentedException, BGPParsingException { - final GracefulRestartCapabilityBuilder cb = new GracefulRestartCapabilityBuilder(); - - final int flagBits = (buffer.getByte(0) >> RESTART_FLAGS_SIZE); - cb.setRestartFlags(new RestartFlags((flagBits & 8) != 0)); - - final int timer = ((buffer.readByte() & TIMER_TOPBITS_MASK) << RESTART_FLAGS_SIZE) + UnsignedBytes.toInt(buffer.readByte()); - cb.setRestartTime(timer); - - final List tables = new ArrayList<>(); - while (buffer.readableBytes() != 0) { - final int afiVal = UnsignedBytes.toInt(buffer.readByte()) * 256 + UnsignedBytes.toInt(buffer.readByte()); - final Class afi = this.afiReg.classForFamily(afiVal); - if (afi == null) { - LOG.debug("Ignoring GR capability for unknown address family {}", afiVal); - continue; - } - final int safiVal = UnsignedBytes.toInt(buffer.readByte()); - final Class safi = this.safiReg.classForFamily(safiVal); - if (safi == null) { - LOG.debug("Ignoring GR capability for unknown subsequent address family {}", safiVal); - continue; - } - final int flags = UnsignedBytes.toInt(buffer.readByte()); - tables.add(new TablesBuilder().setAfi(afi).setSafi(safi).setAfiFlags(new AfiFlags((flags & AFI_FLAG_FORWARDING_STATE) != 0)).build()); - } - return new GracefulRestartCaseBuilder().setGracefulRestartCapability(cb.build()).build(); - } + public static final int CODE = 64; + + private static final Logger LOG = LoggerFactory.getLogger(GracefulCapabilityHandler.class); + + // Restart flag size, in bits + private static final int RESTART_FLAGS_SIZE = 4; + private static final int RESTART_FLAG_STATE = 0x80; + + // Restart timer size, in bits + private static final int TIMER_SIZE = 12; + private static final int TIMER_TOPBITS_MASK = 0x0F; + + // Size of the capability header + private static final int HEADER_SIZE = (RESTART_FLAGS_SIZE + TIMER_SIZE) / Byte.SIZE; + + // Length of each AFI/SAFI array member, in bytes + private static final int PER_AFI_SAFI_SIZE = 4; + + private static final int AFI_FLAG_FORWARDING_STATE = 0x80; + + private final AddressFamilyRegistry afiReg; + private final SubsequentAddressFamilyRegistry safiReg; + + public GracefulCapabilityHandler(final AddressFamilyRegistry afiReg, final SubsequentAddressFamilyRegistry safiReg) { + this.afiReg = Preconditions.checkNotNull(afiReg); + this.safiReg = Preconditions.checkNotNull(safiReg); + } + + @Override + public byte[] serializeCapability(final CParameters capability) { + final GracefulRestartCapability grace = ((GracefulRestartCase) capability).getGracefulRestartCapability(); + final List tables = grace.getTables(); + + final byte[] bytes = new byte[HEADER_SIZE + PER_AFI_SAFI_SIZE * tables.size()]; + + int flagBits = 0; + final RestartFlags flags = grace.getRestartFlags(); + if (flags != null) { + if (flags.isRestartState()) { + flagBits |= RESTART_FLAG_STATE; + } + } + int timeval = 0; + final Integer time = grace.getRestartTime(); + if (time != null) { + Preconditions.checkArgument(time >= 0 && time <= 4095); + timeval = time; + } + bytes[0] = UnsignedBytes.checkedCast(flagBits + timeval / 256); + bytes[1] = UnsignedBytes.checkedCast(timeval % 256); + + int index = HEADER_SIZE; + for (final Tables t : tables) { + final Class afi = t.getAfi(); + final Integer afival = this.afiReg.numberForClass(afi); + Preconditions.checkArgument(afival != null, "Unhandled address family " + afi); + + final Class safi = t.getSafi(); + final Integer safival = this.safiReg.numberForClass(safi); + Preconditions.checkArgument(safival != null, "Unhandled subsequent address family " + safi); + + bytes[index] = UnsignedBytes.checkedCast(afival / 256); + bytes[index + 1] = UnsignedBytes.checkedCast(afival % 256); + bytes[index + 2] = UnsignedBytes.checkedCast(safival); + if (t.getAfiFlags().isForwardingState()) { + bytes[index + 3] = UnsignedBytes.checkedCast(AFI_FLAG_FORWARDING_STATE); + } + index += PER_AFI_SAFI_SIZE; + } + return CapabilityUtil.formatCapability(CODE, bytes); + } + + @Override + public CParameters parseCapability(final ByteBuf buffer) throws BGPDocumentedException, BGPParsingException { + final GracefulRestartCapabilityBuilder cb = new GracefulRestartCapabilityBuilder(); + + final int flagBits = (buffer.getByte(0) >> RESTART_FLAGS_SIZE); + cb.setRestartFlags(new RestartFlags((flagBits & 8) != 0)); + + final int timer = ((buffer.readByte() & TIMER_TOPBITS_MASK) << RESTART_FLAGS_SIZE) + UnsignedBytes.toInt(buffer.readByte()); + cb.setRestartTime(timer); + + final List tables = new ArrayList<>(); + while (buffer.readableBytes() != 0) { + final int afiVal = UnsignedBytes.toInt(buffer.readByte()) * 256 + UnsignedBytes.toInt(buffer.readByte()); + final Class afi = this.afiReg.classForFamily(afiVal); + if (afi == null) { + LOG.debug("Ignoring GR capability for unknown address family {}", afiVal); + continue; + } + final int safiVal = UnsignedBytes.toInt(buffer.readByte()); + final Class safi = this.safiReg.classForFamily(safiVal); + if (safi == null) { + LOG.debug("Ignoring GR capability for unknown subsequent address family {}", safiVal); + continue; + } + final int flags = UnsignedBytes.toInt(buffer.readByte()); + tables.add(new TablesBuilder().setAfi(afi).setSafi(safi).setAfiFlags(new AfiFlags((flags & AFI_FLAG_FORWARDING_STATE) != 0)).build()); + } + return new GracefulRestartCaseBuilder().setGracefulRestartCapability(cb.build()).build(); + } } diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/open/MultiProtocolCapabilityHandler.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/open/MultiProtocolCapabilityHandler.java index c69ed22036..0598620313 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/open/MultiProtocolCapabilityHandler.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/open/MultiProtocolCapabilityHandler.java @@ -7,6 +7,9 @@ */ package org.opendaylight.protocol.bgp.parser.impl.message.open; +import com.google.common.base.Preconditions; +import com.google.common.primitives.UnsignedBytes; + import io.netty.buffer.ByteBuf; import org.opendaylight.protocol.bgp.parser.BGPDocumentedException; @@ -23,53 +26,48 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mult import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily; -import com.google.common.base.Preconditions; -import com.google.common.primitives.UnsignedBytes; - public final class MultiProtocolCapabilityHandler implements CapabilityParser, CapabilitySerializer { - public static final int CODE = 1; + public static final int CODE = 1; - private final AddressFamilyRegistry afiReg; - private final SubsequentAddressFamilyRegistry safiReg; + private final AddressFamilyRegistry afiReg; + private final SubsequentAddressFamilyRegistry safiReg; - public MultiProtocolCapabilityHandler(final AddressFamilyRegistry afiReg, final SubsequentAddressFamilyRegistry safiReg) { - this.afiReg = Preconditions.checkNotNull(afiReg); - this.safiReg = Preconditions.checkNotNull(safiReg); - } + public MultiProtocolCapabilityHandler(final AddressFamilyRegistry afiReg, final SubsequentAddressFamilyRegistry safiReg) { + this.afiReg = Preconditions.checkNotNull(afiReg); + this.safiReg = Preconditions.checkNotNull(safiReg); + } - @Override - public MultiprotocolCase parseCapability(final ByteBuf buffer) throws BGPDocumentedException, BGPParsingException { - final int afiVal = buffer.readUnsignedShort(); - final Class afi = this.afiReg.classForFamily(afiVal); - if (afi == null) { - throw new BGPParsingException("Address Family Identifier: '" + afiVal + "' not supported."); - } - // skip reserved - buffer.skipBytes(1); - final int safiVal = UnsignedBytes.toInt(buffer.readByte()); - final Class safi = this.safiReg.classForFamily(safiVal); - if (safi == null) { - throw new BGPParsingException("Subsequent Address Family Identifier: '" + safiVal + "' not supported."); - } - return new MultiprotocolCaseBuilder().setMultiprotocolCapability( - new MultiprotocolCapabilityBuilder().setAfi(afi).setSafi(safi).build()).build(); - } + @Override + public MultiprotocolCase parseCapability(final ByteBuf buffer) throws BGPDocumentedException, BGPParsingException { + final int afiVal = buffer.readUnsignedShort(); + final Class afi = this.afiReg.classForFamily(afiVal); + if (afi == null) { + throw new BGPParsingException("Address Family Identifier: '" + afiVal + "' not supported."); + } + // skip reserved + buffer.skipBytes(1); + final int safiVal = UnsignedBytes.toInt(buffer.readByte()); + final Class safi = this.safiReg.classForFamily(safiVal); + if (safi == null) { + throw new BGPParsingException("Subsequent Address Family Identifier: '" + safiVal + "' not supported."); + } + return new MultiprotocolCaseBuilder().setMultiprotocolCapability( + new MultiprotocolCapabilityBuilder().setAfi(afi).setSafi(safi).build()).build(); + } - @Override - public byte[] serializeCapability(final CParameters capability) { - final MultiprotocolCase mp = (MultiprotocolCase) capability; + @Override + public byte[] serializeCapability(final CParameters capability) { + final MultiprotocolCase mp = (MultiprotocolCase) capability; - final Class afi = mp.getMultiprotocolCapability().getAfi(); - final Integer afival = this.afiReg.numberForClass(afi); - Preconditions.checkArgument(afival != null, "Unhandled address family " + afi); + final Class afi = mp.getMultiprotocolCapability().getAfi(); + final Integer afival = this.afiReg.numberForClass(afi); + Preconditions.checkArgument(afival != null, "Unhandled address family " + afi); - final Class safi = mp.getMultiprotocolCapability().getSafi(); - final Integer safival = this.safiReg.numberForClass(safi); - Preconditions.checkArgument(safival != null, "Unhandled subsequent address family " + safi); + final Class safi = mp.getMultiprotocolCapability().getSafi(); + final Integer safival = this.safiReg.numberForClass(safi); + Preconditions.checkArgument(safival != null, "Unhandled subsequent address family " + safi); - return CapabilityUtil.formatCapability( - CODE, - new byte[] { UnsignedBytes.checkedCast(afival / 256), UnsignedBytes.checkedCast(afival % 256), 0, - UnsignedBytes.checkedCast(safival) }); - } + return CapabilityUtil.formatCapability(CODE, new byte[] { UnsignedBytes.checkedCast(afival / 256), + UnsignedBytes.checkedCast(afival % 256), 0, UnsignedBytes.checkedCast(safival) }); + } } \ No newline at end of file diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AS4AggregatorAttributeParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AS4AggregatorAttributeParser.java index 24a29f0c11..d188e0843f 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AS4AggregatorAttributeParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AS4AggregatorAttributeParser.java @@ -13,10 +13,10 @@ import org.opendaylight.protocol.bgp.parser.spi.AttributeParser; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributesBuilder; public final class AS4AggregatorAttributeParser implements AttributeParser { - public static final int TYPE = 17; + public static final int TYPE = 17; - @Override - public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) { - // AS4 Aggregator is ignored - } + @Override + public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) { + // AS4 Aggregator is ignored + } } \ No newline at end of file diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AS4PathAttributeParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AS4PathAttributeParser.java index 07198fbd17..86525b583c 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AS4PathAttributeParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AS4PathAttributeParser.java @@ -13,10 +13,10 @@ import org.opendaylight.protocol.bgp.parser.spi.AttributeParser; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributesBuilder; public final class AS4PathAttributeParser implements AttributeParser { - public static final int TYPE = 18; + public static final int TYPE = 18; - @Override - public void parseAttribute(final ByteBuf bytes, final PathAttributesBuilder builder) { - // AS4 Path is ignored - } + @Override + public void parseAttribute(final ByteBuf bytes, final PathAttributesBuilder builder) { + // AS4 Path is ignored + } } \ No newline at end of file diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AggregatorAttributeParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AggregatorAttributeParser.java index 4065ad4fd3..60f964bef0 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AggregatorAttributeParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AggregatorAttributeParser.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.parser.impl.message.update; +import com.google.common.base.Preconditions; + import io.netty.buffer.ByteBuf; import org.opendaylight.protocol.bgp.parser.spi.AttributeParser; @@ -15,31 +17,28 @@ import org.opendaylight.protocol.util.ByteArray; import org.opendaylight.protocol.util.ReferenceCache; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.Aggregator; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.AggregatorBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributesBuilder; -import com.google.common.base.Preconditions; - public final class AggregatorAttributeParser implements AttributeParser { - public static final int TYPE = 7; + public static final int TYPE = 7; - private final ReferenceCache refCache; + private final ReferenceCache refCache; - public AggregatorAttributeParser(final ReferenceCache refCache) { - this.refCache = Preconditions.checkNotNull(refCache); - } + public AggregatorAttributeParser(final ReferenceCache refCache) { + this.refCache = Preconditions.checkNotNull(refCache); + } - /** - * Parse AGGREGATOR from bytes - * - * @param buffer byte buffer to be parsed - * @return {@link Aggregator} BGP Aggregator - */ - @Override - public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) { - final AsNumber asNumber = this.refCache.getSharedReference(new AsNumber(buffer.readUnsignedInt())); - final Ipv4Address address = Ipv4Util.addressForBytes(ByteArray.readAllBytes(buffer)); - builder.setAggregator(new AggregatorBuilder().setAsNumber(asNumber).setNetworkAddress(address).build()); - } + /** + * Parse AGGREGATOR from bytes + * + * @param buffer byte buffer to be parsed + * @return BGP Aggregator + */ + @Override + public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) { + final AsNumber asNumber = this.refCache.getSharedReference(new AsNumber(buffer.readUnsignedInt())); + final Ipv4Address address = Ipv4Util.addressForBytes(ByteArray.readAllBytes(buffer)); + builder.setAggregator(new AggregatorBuilder().setAsNumber(asNumber).setNetworkAddress(address).build()); + } } \ No newline at end of file diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AsPathAttributeParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AsPathAttributeParser.java index aca66a73c1..c8890b4628 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AsPathAttributeParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AsPathAttributeParser.java @@ -7,6 +7,10 @@ */ package org.opendaylight.protocol.bgp.parser.impl.message.update; +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; +import com.google.common.primitives.UnsignedBytes; + import io.netty.buffer.ByteBuf; import java.util.List; @@ -29,58 +33,58 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.as.path.segment.c.segment.a.list._case.a.list.AsSequence; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.as.path.segment.c.segment.a.set._case.ASetBuilder; -import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; -import com.google.common.primitives.UnsignedBytes; - public final class AsPathAttributeParser implements AttributeParser { - public static final int TYPE = 2; - private final ReferenceCache refCache; + public static final int TYPE = 2; + private final ReferenceCache refCache; - public AsPathAttributeParser(final ReferenceCache refCache) { - this.refCache = Preconditions.checkNotNull(refCache); - } + public AsPathAttributeParser(final ReferenceCache refCache) { + this.refCache = Preconditions.checkNotNull(refCache); + } - /** - * Parses AS_PATH from bytes. - * - * @param bytes byte array to be parsed - * @return new ASPath object - * @throws BGPDocumentedException if there is no AS_SEQUENCE present (mandatory) - * @throws BGPParsingException - */ - private static AsPath parseAsPath(final ReferenceCache refCache, final ByteBuf buffer) throws BGPDocumentedException, BGPParsingException { - final List ases = Lists.newArrayList(); - boolean isSequence = false; - while (buffer.isReadable()) { - final int type = UnsignedBytes.toInt(buffer.readByte()); - final SegmentType segmentType = AsPathSegmentParser.parseType(type); - if (segmentType == null) { - throw new BGPParsingException("AS Path segment type unknown : " + type); - } - final int count = UnsignedBytes.toInt(buffer.readByte()); + /** + * Parses AS_PATH from bytes. + * + * @param bytes byte array to be parsed + * @return new ASPath object + * @throws BGPDocumentedException if there is no AS_SEQUENCE present (mandatory) + * @throws BGPParsingException + */ + private static AsPath parseAsPath(final ReferenceCache refCache, final ByteBuf buffer) throws BGPDocumentedException, + BGPParsingException { + final List ases = Lists.newArrayList(); + boolean isSequence = false; + while (buffer.isReadable()) { + final int type = UnsignedBytes.toInt(buffer.readByte()); + final SegmentType segmentType = AsPathSegmentParser.parseType(type); + if (segmentType == null) { + throw new BGPParsingException("AS Path segment type unknown : " + type); + } + final int count = UnsignedBytes.toInt(buffer.readByte()); - if (segmentType == SegmentType.AS_SEQUENCE) { - final List numbers = AsPathSegmentParser.parseAsSequence(refCache, count, buffer.slice(buffer.readerIndex(), count * AsPathSegmentParser.AS_NUMBER_LENGTH)); - ases.add(new SegmentsBuilder().setCSegment( - new AListCaseBuilder().setAList(new AListBuilder().setAsSequence(numbers).build()).build()).build()); - isSequence = true; - } else { - final List list = AsPathSegmentParser.parseAsSet(refCache, count, buffer.slice(buffer.readerIndex(), count * AsPathSegmentParser.AS_NUMBER_LENGTH)); - ases.add(new SegmentsBuilder().setCSegment(new ASetCaseBuilder().setASet(new ASetBuilder().setAsSet(list).build()).build()).build()); + if (segmentType == SegmentType.AS_SEQUENCE) { + final List numbers = AsPathSegmentParser.parseAsSequence(refCache, count, buffer.slice(buffer.readerIndex(), + count * AsPathSegmentParser.AS_NUMBER_LENGTH)); + ases.add(new SegmentsBuilder().setCSegment( + new AListCaseBuilder().setAList(new AListBuilder().setAsSequence(numbers).build()).build()).build()); + isSequence = true; + } else { + final List list = AsPathSegmentParser.parseAsSet(refCache, count, buffer.slice(buffer.readerIndex(), count + * AsPathSegmentParser.AS_NUMBER_LENGTH)); + ases.add(new SegmentsBuilder().setCSegment(new ASetCaseBuilder().setASet(new ASetBuilder().setAsSet(list).build()).build()).build()); - } - buffer.skipBytes(count * AsPathSegmentParser.AS_NUMBER_LENGTH); - } + } + buffer.skipBytes(count * AsPathSegmentParser.AS_NUMBER_LENGTH); + } - if (!isSequence && buffer.readableBytes() != 0) { - throw new BGPDocumentedException("AS_SEQUENCE must be present in AS_PATH attribute.", BGPError.AS_PATH_MALFORMED); - } - return new AsPathBuilder().setSegments(ases).build(); - } + if (!isSequence && buffer.readableBytes() != 0) { + throw new BGPDocumentedException("AS_SEQUENCE must be present in AS_PATH attribute.", BGPError.AS_PATH_MALFORMED); + } + return new AsPathBuilder().setSegments(ases).build(); + } - @Override - public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) throws BGPDocumentedException, BGPParsingException { - builder.setAsPath(parseAsPath(this.refCache, buffer)); - } + @Override + public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) throws BGPDocumentedException, + BGPParsingException { + builder.setAsPath(parseAsPath(this.refCache, buffer)); + } } \ No newline at end of file diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AsPathSegmentParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AsPathSegmentParser.java index fe28ed83a1..b8b6f55c29 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AsPathSegmentParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AsPathSegmentParser.java @@ -19,60 +19,56 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.as.path.segment.c.segment.a.list._case.a.list.AsSequenceBuilder; /** - * + * * Representation of one AS Path Segment. It is, in fact, a TLV, but the length field is representing the count of AS * Numbers in the collection (in its value). If the segment is of type AS_SEQUENCE, the collection is a List, if AS_SET, * the collection is a Set. - * + * */ public final class AsPathSegmentParser { - public static final int TYPE_LENGTH = 1; + public static final int TYPE_LENGTH = 1; - public static final int LENGTH_SIZE = 1; + public static final int LENGTH_SIZE = 1; - public static final int AS_NUMBER_LENGTH = 4; + public static final int AS_NUMBER_LENGTH = 4; - /** - * Possible types of AS Path segments. - */ - public enum SegmentType { - AS_SEQUENCE, AS_SET - } + /** + * Possible types of AS Path segments. + */ + public enum SegmentType { + AS_SEQUENCE, AS_SET + } - private AsPathSegmentParser() { + private AsPathSegmentParser() { - } + } - static SegmentType parseType(final int type) { - switch (type) { - case 1: - return SegmentType.AS_SET; - case 2: - return SegmentType.AS_SEQUENCE; - default: - return null; - } - } + static SegmentType parseType(final int type) { + switch (type) { + case 1: + return SegmentType.AS_SET; + case 2: + return SegmentType.AS_SEQUENCE; + default: + return null; + } + } - static List parseAsSequence(final ReferenceCache refCache, final int count, final ByteBuf buffer) { - final List coll = new ArrayList<>(); - for (int i = 0; i < count; i++) { - coll.add( - refCache.getSharedReference( - new AsSequenceBuilder().setAs( - refCache.getSharedReference( - new AsNumber(buffer.readUnsignedInt()))).build())); - } - return coll; - } + static List parseAsSequence(final ReferenceCache refCache, final int count, final ByteBuf buffer) { + final List coll = new ArrayList<>(); + for (int i = 0; i < count; i++) { + coll.add(refCache.getSharedReference(new AsSequenceBuilder().setAs( + refCache.getSharedReference(new AsNumber(buffer.readUnsignedInt()))).build())); + } + return coll; + } - static List parseAsSet(final ReferenceCache refCache, final int count, final ByteBuf buffer) { - final List coll = new ArrayList<>(); - for (int i = 0; i < count; i++) { - coll.add(refCache.getSharedReference( - new AsNumber(buffer.readUnsignedInt()))); - } - return coll; - } + static List parseAsSet(final ReferenceCache refCache, final int count, final ByteBuf buffer) { + final List coll = new ArrayList<>(); + for (int i = 0; i < count; i++) { + coll.add(refCache.getSharedReference(new AsNumber(buffer.readUnsignedInt()))); + } + return coll; + } } diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AtomicAggregateAttributeParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AtomicAggregateAttributeParser.java index 6d63f86d80..5b2d4ccab0 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AtomicAggregateAttributeParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/AtomicAggregateAttributeParser.java @@ -14,10 +14,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mess import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributesBuilder; public final class AtomicAggregateAttributeParser implements AttributeParser { - public static final int TYPE = 6; + public static final int TYPE = 6; - @Override - public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) { - builder.setAtomicAggregate(new AtomicAggregateBuilder().build()); - } + @Override + public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) { + builder.setAtomicAggregate(new AtomicAggregateBuilder().build()); + } } \ No newline at end of file diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/ClusterIdAttributeParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/ClusterIdAttributeParser.java index ec342ee8a7..e1d3cf5c4c 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/ClusterIdAttributeParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/ClusterIdAttributeParser.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.parser.impl.message.update; +import com.google.common.collect.Lists; + import io.netty.buffer.ByteBuf; import java.util.List; @@ -17,19 +19,17 @@ import org.opendaylight.protocol.util.ByteArray; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.ClusterIdentifier; -import com.google.common.collect.Lists; - public final class ClusterIdAttributeParser implements AttributeParser { - public static final int TYPE = 10; + public static final int TYPE = 10; - private static final int CLUSTER_LENGTH = 4; + private static final int CLUSTER_LENGTH = 4; - @Override - public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) { - final List list = Lists.newArrayList(); - while (buffer.isReadable()) { - list.add(new ClusterIdentifier(Ipv4Util.addressForBytes(ByteArray.readBytes(buffer, CLUSTER_LENGTH)))); - } - builder.setClusterId(list); - } + @Override + public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) { + final List list = Lists.newArrayList(); + while (buffer.isReadable()) { + list.add(new ClusterIdentifier(Ipv4Util.addressForBytes(ByteArray.readBytes(buffer, CLUSTER_LENGTH)))); + } + builder.setClusterId(list); + } } \ No newline at end of file diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/CommunitiesAttributeParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/CommunitiesAttributeParser.java index ff445a24cb..3180b2dc2f 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/CommunitiesAttributeParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/CommunitiesAttributeParser.java @@ -7,6 +7,9 @@ */ package org.opendaylight.protocol.bgp.parser.impl.message.update; +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; + import io.netty.buffer.ByteBuf; import java.util.List; @@ -17,26 +20,24 @@ import org.opendaylight.protocol.util.ReferenceCache; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.Communities; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributesBuilder; -import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; - public final class CommunitiesAttributeParser implements AttributeParser { - public static final int TYPE = 8; + public static final int TYPE = 8; - private final ReferenceCache refCache; + private final ReferenceCache refCache; - public CommunitiesAttributeParser(final ReferenceCache refCache) { - this.refCache = Preconditions.checkNotNull(refCache); - } + public CommunitiesAttributeParser(final ReferenceCache refCache) { + this.refCache = Preconditions.checkNotNull(refCache); + } - @Override - public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) throws BGPDocumentedException { - final List set = Lists.newArrayList(); - while (buffer.isReadable()) { - set.add((Communities) CommunitiesParser.parseCommunity(this.refCache, buffer.slice(buffer.readerIndex(), CommunitiesParser.COMMUNITY_LENGTH))); - buffer.skipBytes(CommunitiesParser.COMMUNITY_LENGTH); - } + @Override + public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) throws BGPDocumentedException { + final List set = Lists.newArrayList(); + while (buffer.isReadable()) { + set.add((Communities) CommunitiesParser.parseCommunity(this.refCache, buffer.slice(buffer.readerIndex(), + CommunitiesParser.COMMUNITY_LENGTH))); + buffer.skipBytes(CommunitiesParser.COMMUNITY_LENGTH); + } - builder.setCommunities(set); - } + builder.setCommunities(set); + } } \ No newline at end of file diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/CommunitiesParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/CommunitiesParser.java index c6d12c9323..38ec9e7759 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/CommunitiesParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/CommunitiesParser.java @@ -7,6 +7,9 @@ */ package org.opendaylight.protocol.bgp.parser.impl.message.update; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.primitives.UnsignedBytes; + import io.netty.buffer.ByteBuf; import java.util.Arrays; @@ -31,177 +34,174 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.route.origin.extended.community._case.RouteOriginExtendedCommunityBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.route.target.extended.community._case.RouteTargetExtendedCommunityBuilder; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.primitives.UnsignedBytes; - /** * Parser for Extended Communities Path Attribute. */ public final class CommunitiesParser { - protected static final int EXTENDED_COMMUNITY_LENGTH = 8; - - protected static final int COMMUNITY_LENGTH = 4; - - private static final int AS_LOCAL_ADMIN_LENGTH = 4; - - private static final int INET_LOCAL_ADMIN_LENGTH = 2; - - protected static final short AS_TYPE_TRANS = 0; - - protected static final short AS_TYPE_NON_TRANS = 40; - - protected static final short INET_TYPE_TRANS = 1; - - protected static final short INET_TYPE_NON_TRANS = 41; - - protected static final short OPAQUE_TYPE_TRANS = 3; - - protected static final short OPAQUE_TYPE_NON_TRANS = 43; - - protected static final short ROUTE_TYPE_ONLY = 2; - - protected static final short ROUTE_TARGET_SUBTYPE = 2; - - protected static final short ROUTE_ORIGIN_SUBTYPE = 3; - - private static final byte[] NO_EXPORT = new byte[] { (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0x01 }; - - private static final byte[] NO_ADVERTISE = new byte[] { (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0x02 }; - - private static final byte[] NO_EXPORT_SUBCONFED = new byte[] { (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0x03 }; - - private CommunitiesParser() { - - } - - /** - * Parse known Community, if unknown, a new one will be created. - * @param refCache - * - * @param bytes byte array to be parsed - * @return new Community - * @throws BGPDocumentedException - */ - static Community parseCommunity(final ReferenceCache refCache, final ByteBuf buffer) throws BGPDocumentedException { - if (buffer.readableBytes() != COMMUNITY_LENGTH) { - throw new BGPDocumentedException("Community with wrong length: " + buffer.readableBytes(), BGPError.OPT_ATTR_ERROR); - } - byte[] body = ByteArray.getBytes(buffer, COMMUNITY_LENGTH); - if (Arrays.equals(body, NO_EXPORT)) { - return CommunityUtil.NO_EXPORT; - } else if (Arrays.equals(body, NO_ADVERTISE)) { - return CommunityUtil.NO_ADVERTISE; - } else if (Arrays.equals(body, NO_EXPORT_SUBCONFED)) { - return CommunityUtil.NO_EXPORT_SUBCONFED; - } - return CommunityUtil.create(refCache, buffer.readUnsignedShort(), buffer.readUnsignedShort()); - } - - /** - * Parse Extended Community according to their type. - * - * @param bytes byte array to be parsed - * @return new Specific Extended Community - * @throws BGPDocumentedException if the type is not recognized - */ - @VisibleForTesting - public static ExtendedCommunities parseExtendedCommunity(final ReferenceCache refCache, final ByteBuf buffer) throws BGPDocumentedException { - final int type = UnsignedBytes.toInt(buffer.readByte()); - final int subType = UnsignedBytes.toInt(buffer.readByte()); - - final ExtendedCommunitiesBuilder comm = new ExtendedCommunitiesBuilder(); - switch (type) { - case AS_TYPE_TRANS: - comm.setCommType(AS_TYPE_TRANS); - if (subType == ROUTE_TARGET_SUBTYPE) { - comm.setCommSubType(ROUTE_TARGET_SUBTYPE).setExtendedCommunity( - new RouteTargetExtendedCommunityCaseBuilder().setRouteTargetExtendedCommunity( - new RouteTargetExtendedCommunityBuilder().setGlobalAdministrator( - new ShortAsNumber((long) buffer.readUnsignedShort())).setLocalAdministrator( - ByteArray.readBytes(buffer, AS_LOCAL_ADMIN_LENGTH)).build()).build()); - } else if (subType == ROUTE_ORIGIN_SUBTYPE) { - comm.setCommSubType(ROUTE_ORIGIN_SUBTYPE).setExtendedCommunity( - new RouteOriginExtendedCommunityCaseBuilder().setRouteOriginExtendedCommunity( - new RouteOriginExtendedCommunityBuilder().setGlobalAdministrator( - new ShortAsNumber((long) buffer.readUnsignedShort())).setLocalAdministrator( - ByteArray.readBytes(buffer, AS_LOCAL_ADMIN_LENGTH)).build()).build()); - } else { - comm.setExtendedCommunity( - new AsSpecificExtendedCommunityCaseBuilder().setAsSpecificExtendedCommunity( - new AsSpecificExtendedCommunityBuilder().setTransitive(false).setGlobalAdministrator( - new ShortAsNumber((long) buffer.readUnsignedShort())).setLocalAdministrator( - ByteArray.readBytes(buffer, AS_LOCAL_ADMIN_LENGTH)).build()).build()); - } - break; - case AS_TYPE_NON_TRANS: - comm.setCommType(AS_TYPE_NON_TRANS).setExtendedCommunity( - new AsSpecificExtendedCommunityCaseBuilder().setAsSpecificExtendedCommunity( - new AsSpecificExtendedCommunityBuilder().setTransitive(true).setGlobalAdministrator( - new ShortAsNumber((long) buffer.readUnsignedShort())).setLocalAdministrator( - ByteArray.readBytes(buffer, AS_LOCAL_ADMIN_LENGTH)).build()).build()); - break; - case ROUTE_TYPE_ONLY: - comm.setCommType(ROUTE_TYPE_ONLY); - if (subType == ROUTE_TARGET_SUBTYPE) { - comm.setCommSubType(ROUTE_TARGET_SUBTYPE).setExtendedCommunity( - new RouteTargetExtendedCommunityCaseBuilder().setRouteTargetExtendedCommunity( - new RouteTargetExtendedCommunityBuilder().setGlobalAdministrator( - new ShortAsNumber((long) buffer.readUnsignedShort())).setLocalAdministrator( - ByteArray.readBytes(buffer, AS_LOCAL_ADMIN_LENGTH)).build()).build()); - } else if (subType == ROUTE_ORIGIN_SUBTYPE) { - comm.setCommSubType(ROUTE_ORIGIN_SUBTYPE).setExtendedCommunity( - new RouteOriginExtendedCommunityCaseBuilder().setRouteOriginExtendedCommunity( - new RouteOriginExtendedCommunityBuilder().setGlobalAdministrator( - new ShortAsNumber((long) buffer.readUnsignedShort())).setLocalAdministrator( - ByteArray.readBytes(buffer, AS_LOCAL_ADMIN_LENGTH)).build()).build()); - } else { - throw new BGPDocumentedException("Could not parse Extended Community subtype: " + subType, BGPError.OPT_ATTR_ERROR); - } - break; - case INET_TYPE_TRANS: - comm.setCommType(INET_TYPE_TRANS); - if (subType == ROUTE_TARGET_SUBTYPE) { - comm.setCommSubType(ROUTE_TARGET_SUBTYPE).setExtendedCommunity( - new RouteTargetExtendedCommunityCaseBuilder().setRouteTargetExtendedCommunity( - new RouteTargetExtendedCommunityBuilder().setGlobalAdministrator( - new ShortAsNumber((long) buffer.readUnsignedShort())).setLocalAdministrator( - ByteArray.readBytes(buffer, AS_LOCAL_ADMIN_LENGTH)).build()).build()); - } else if (subType == ROUTE_ORIGIN_SUBTYPE) { - comm.setCommSubType(ROUTE_ORIGIN_SUBTYPE).setExtendedCommunity( - new RouteOriginExtendedCommunityCaseBuilder().setRouteOriginExtendedCommunity( - new RouteOriginExtendedCommunityBuilder().setGlobalAdministrator( - new ShortAsNumber((long) buffer.readUnsignedShort())).setLocalAdministrator( - ByteArray.readBytes(buffer, AS_LOCAL_ADMIN_LENGTH)).build()).build()); - } else { - comm.setExtendedCommunity( - new Inet4SpecificExtendedCommunityCaseBuilder().setInet4SpecificExtendedCommunity( - new Inet4SpecificExtendedCommunityBuilder().setTransitive(false).setGlobalAdministrator( - Ipv4Util.addressForBytes(ByteArray.readBytes(buffer, Ipv4Util.IP4_LENGTH))).setLocalAdministrator( - ByteArray.readBytes(buffer, INET_LOCAL_ADMIN_LENGTH)).build()).build()); - } - break; - case INET_TYPE_NON_TRANS: - comm.setCommType(INET_TYPE_NON_TRANS).setExtendedCommunity( - new Inet4SpecificExtendedCommunityCaseBuilder().setInet4SpecificExtendedCommunity( - new Inet4SpecificExtendedCommunityBuilder().setTransitive(true).setGlobalAdministrator( - Ipv4Util.addressForBytes(ByteArray.readBytes(buffer, Ipv4Util.IP4_LENGTH))).setLocalAdministrator( - ByteArray.readBytes(buffer, INET_LOCAL_ADMIN_LENGTH)).build()).build()); - break; - case OPAQUE_TYPE_TRANS: - comm.setCommType(OPAQUE_TYPE_TRANS).setExtendedCommunity( - new OpaqueExtendedCommunityCaseBuilder().setOpaqueExtendedCommunity( - new OpaqueExtendedCommunityBuilder().setTransitive(false).setValue(ByteArray.readAllBytes(buffer)).build()).build()); - break; - case OPAQUE_TYPE_NON_TRANS: - comm.setCommType(OPAQUE_TYPE_NON_TRANS).setExtendedCommunity( - new OpaqueExtendedCommunityCaseBuilder().setOpaqueExtendedCommunity( - new OpaqueExtendedCommunityBuilder().setTransitive(true).setValue(ByteArray.readAllBytes(buffer)).build()).build()); - break; - default: - throw new BGPDocumentedException("Could not parse Extended Community type: " + type, BGPError.OPT_ATTR_ERROR); - } - - return comm.build(); - } + protected static final int EXTENDED_COMMUNITY_LENGTH = 8; + + protected static final int COMMUNITY_LENGTH = 4; + + private static final int AS_LOCAL_ADMIN_LENGTH = 4; + + private static final int INET_LOCAL_ADMIN_LENGTH = 2; + + protected static final short AS_TYPE_TRANS = 0; + + protected static final short AS_TYPE_NON_TRANS = 40; + + protected static final short INET_TYPE_TRANS = 1; + + protected static final short INET_TYPE_NON_TRANS = 41; + + protected static final short OPAQUE_TYPE_TRANS = 3; + + protected static final short OPAQUE_TYPE_NON_TRANS = 43; + + protected static final short ROUTE_TYPE_ONLY = 2; + + protected static final short ROUTE_TARGET_SUBTYPE = 2; + + protected static final short ROUTE_ORIGIN_SUBTYPE = 3; + + private static final byte[] NO_EXPORT = new byte[] { (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0x01 }; + + private static final byte[] NO_ADVERTISE = new byte[] { (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0x02 }; + + private static final byte[] NO_EXPORT_SUBCONFED = new byte[] { (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0x03 }; + + private CommunitiesParser() { + + } + + /** + * Parse known Community, if unknown, a new one will be created. + * + * @param refCache + * + * @param bytes byte array to be parsed + * @return new Community + * @throws BGPDocumentedException + */ + static Community parseCommunity(final ReferenceCache refCache, final ByteBuf buffer) throws BGPDocumentedException { + if (buffer.readableBytes() != COMMUNITY_LENGTH) { + throw new BGPDocumentedException("Community with wrong length: " + buffer.readableBytes(), BGPError.OPT_ATTR_ERROR); + } + byte[] body = ByteArray.getBytes(buffer, COMMUNITY_LENGTH); + if (Arrays.equals(body, NO_EXPORT)) { + return CommunityUtil.NO_EXPORT; + } else if (Arrays.equals(body, NO_ADVERTISE)) { + return CommunityUtil.NO_ADVERTISE; + } else if (Arrays.equals(body, NO_EXPORT_SUBCONFED)) { + return CommunityUtil.NO_EXPORT_SUBCONFED; + } + return CommunityUtil.create(refCache, buffer.readUnsignedShort(), buffer.readUnsignedShort()); + } + + /** + * Parse Extended Community according to their type. + * + * @param bytes byte array to be parsed + * @return new Specific Extended Community + * @throws BGPDocumentedException if the type is not recognized + */ + @VisibleForTesting + public static ExtendedCommunities parseExtendedCommunity(final ReferenceCache refCache, final ByteBuf buffer) + throws BGPDocumentedException { + final int type = UnsignedBytes.toInt(buffer.readByte()); + final int subType = UnsignedBytes.toInt(buffer.readByte()); + + final ExtendedCommunitiesBuilder comm = new ExtendedCommunitiesBuilder(); + switch (type) { + case AS_TYPE_TRANS: + comm.setCommType(AS_TYPE_TRANS); + if (subType == ROUTE_TARGET_SUBTYPE) { + comm.setCommSubType(ROUTE_TARGET_SUBTYPE).setExtendedCommunity( + new RouteTargetExtendedCommunityCaseBuilder().setRouteTargetExtendedCommunity( + new RouteTargetExtendedCommunityBuilder().setGlobalAdministrator( + new ShortAsNumber((long) buffer.readUnsignedShort())).setLocalAdministrator( + ByteArray.readBytes(buffer, AS_LOCAL_ADMIN_LENGTH)).build()).build()); + } else if (subType == ROUTE_ORIGIN_SUBTYPE) { + comm.setCommSubType(ROUTE_ORIGIN_SUBTYPE).setExtendedCommunity( + new RouteOriginExtendedCommunityCaseBuilder().setRouteOriginExtendedCommunity( + new RouteOriginExtendedCommunityBuilder().setGlobalAdministrator( + new ShortAsNumber((long) buffer.readUnsignedShort())).setLocalAdministrator( + ByteArray.readBytes(buffer, AS_LOCAL_ADMIN_LENGTH)).build()).build()); + } else { + comm.setExtendedCommunity(new AsSpecificExtendedCommunityCaseBuilder().setAsSpecificExtendedCommunity( + new AsSpecificExtendedCommunityBuilder().setTransitive(false).setGlobalAdministrator( + new ShortAsNumber((long) buffer.readUnsignedShort())).setLocalAdministrator( + ByteArray.readBytes(buffer, AS_LOCAL_ADMIN_LENGTH)).build()).build()); + } + break; + case AS_TYPE_NON_TRANS: + comm.setCommType(AS_TYPE_NON_TRANS).setExtendedCommunity( + new AsSpecificExtendedCommunityCaseBuilder().setAsSpecificExtendedCommunity( + new AsSpecificExtendedCommunityBuilder().setTransitive(true).setGlobalAdministrator( + new ShortAsNumber((long) buffer.readUnsignedShort())).setLocalAdministrator( + ByteArray.readBytes(buffer, AS_LOCAL_ADMIN_LENGTH)).build()).build()); + break; + case ROUTE_TYPE_ONLY: + comm.setCommType(ROUTE_TYPE_ONLY); + if (subType == ROUTE_TARGET_SUBTYPE) { + comm.setCommSubType(ROUTE_TARGET_SUBTYPE).setExtendedCommunity( + new RouteTargetExtendedCommunityCaseBuilder().setRouteTargetExtendedCommunity( + new RouteTargetExtendedCommunityBuilder().setGlobalAdministrator( + new ShortAsNumber((long) buffer.readUnsignedShort())).setLocalAdministrator( + ByteArray.readBytes(buffer, AS_LOCAL_ADMIN_LENGTH)).build()).build()); + } else if (subType == ROUTE_ORIGIN_SUBTYPE) { + comm.setCommSubType(ROUTE_ORIGIN_SUBTYPE).setExtendedCommunity( + new RouteOriginExtendedCommunityCaseBuilder().setRouteOriginExtendedCommunity( + new RouteOriginExtendedCommunityBuilder().setGlobalAdministrator( + new ShortAsNumber((long) buffer.readUnsignedShort())).setLocalAdministrator( + ByteArray.readBytes(buffer, AS_LOCAL_ADMIN_LENGTH)).build()).build()); + } else { + throw new BGPDocumentedException("Could not parse Extended Community subtype: " + subType, BGPError.OPT_ATTR_ERROR); + } + break; + case INET_TYPE_TRANS: + comm.setCommType(INET_TYPE_TRANS); + if (subType == ROUTE_TARGET_SUBTYPE) { + comm.setCommSubType(ROUTE_TARGET_SUBTYPE).setExtendedCommunity( + new RouteTargetExtendedCommunityCaseBuilder().setRouteTargetExtendedCommunity( + new RouteTargetExtendedCommunityBuilder().setGlobalAdministrator( + new ShortAsNumber((long) buffer.readUnsignedShort())).setLocalAdministrator( + ByteArray.readBytes(buffer, AS_LOCAL_ADMIN_LENGTH)).build()).build()); + } else if (subType == ROUTE_ORIGIN_SUBTYPE) { + comm.setCommSubType(ROUTE_ORIGIN_SUBTYPE).setExtendedCommunity( + new RouteOriginExtendedCommunityCaseBuilder().setRouteOriginExtendedCommunity( + new RouteOriginExtendedCommunityBuilder().setGlobalAdministrator( + new ShortAsNumber((long) buffer.readUnsignedShort())).setLocalAdministrator( + ByteArray.readBytes(buffer, AS_LOCAL_ADMIN_LENGTH)).build()).build()); + } else { + comm.setExtendedCommunity(new Inet4SpecificExtendedCommunityCaseBuilder().setInet4SpecificExtendedCommunity( + new Inet4SpecificExtendedCommunityBuilder().setTransitive(false).setGlobalAdministrator( + Ipv4Util.addressForBytes(ByteArray.readBytes(buffer, Ipv4Util.IP4_LENGTH))).setLocalAdministrator( + ByteArray.readBytes(buffer, INET_LOCAL_ADMIN_LENGTH)).build()).build()); + } + break; + case INET_TYPE_NON_TRANS: + comm.setCommType(INET_TYPE_NON_TRANS).setExtendedCommunity( + new Inet4SpecificExtendedCommunityCaseBuilder().setInet4SpecificExtendedCommunity( + new Inet4SpecificExtendedCommunityBuilder().setTransitive(true).setGlobalAdministrator( + Ipv4Util.addressForBytes(ByteArray.readBytes(buffer, Ipv4Util.IP4_LENGTH))).setLocalAdministrator( + ByteArray.readBytes(buffer, INET_LOCAL_ADMIN_LENGTH)).build()).build()); + break; + case OPAQUE_TYPE_TRANS: + comm.setCommType(OPAQUE_TYPE_TRANS).setExtendedCommunity( + new OpaqueExtendedCommunityCaseBuilder().setOpaqueExtendedCommunity( + new OpaqueExtendedCommunityBuilder().setTransitive(false).setValue(ByteArray.readAllBytes(buffer)).build()).build()); + break; + case OPAQUE_TYPE_NON_TRANS: + comm.setCommType(OPAQUE_TYPE_NON_TRANS).setExtendedCommunity( + new OpaqueExtendedCommunityCaseBuilder().setOpaqueExtendedCommunity( + new OpaqueExtendedCommunityBuilder().setTransitive(true).setValue(ByteArray.readAllBytes(buffer)).build()).build()); + break; + default: + throw new BGPDocumentedException("Could not parse Extended Community type: " + type, BGPError.OPT_ATTR_ERROR); + } + + return comm.build(); + } } diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/CommunityUtil.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/CommunityUtil.java index 7e0a37f0dc..0e90d534b2 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/CommunityUtil.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/CommunityUtil.java @@ -7,94 +7,91 @@ */ package org.opendaylight.protocol.bgp.parser.impl.message.update; +import com.google.common.base.Preconditions; + import org.opendaylight.protocol.util.NoopReferenceCache; import org.opendaylight.protocol.util.ReferenceCache; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.CommunitiesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Community; -import com.google.common.base.Preconditions; - /** * Object representation of a RFC1997 Community tag. Communities are a way for the advertising entity to attach semantic * meaning/policy to advertised objects. */ public final class CommunityUtil { - /** - * NO_EXPORT community. All routes received carrying a communities attribute containing this value MUST NOT be - * advertised outside a BGP confederation boundary (a stand-alone autonomous system that is not part of a - * confederation should be considered a confederation itself). - */ - public static final Community NO_EXPORT = - CommunityUtil.create(NoopReferenceCache.getInstance(), 0xFFFF, 0xFF01); - /** - * NO_ADVERTISE community. All routes received carrying a communities attribute containing this value MUST NOT be - * advertised to other BGP peers. - */ - public static final Community NO_ADVERTISE = - CommunityUtil.create(NoopReferenceCache.getInstance(), 0xFFFF, 0xFF02); - /** - * NO_EXPORT_SUBCONFED community. All routes received carrying a communities attribute containing this value MUST - * NOT be advertised to external BGP peers (this includes peers in other members autonomous systems inside a BGP - * confederation). - */ - public static final Community NO_EXPORT_SUBCONFED = - CommunityUtil.create(NoopReferenceCache.getInstance(), 0xFFFF, 0xFF03); + /** + * NO_EXPORT community. All routes received carrying a communities attribute containing this value MUST NOT be + * advertised outside a BGP confederation boundary (a stand-alone autonomous system that is not part of a + * confederation should be considered a confederation itself). + */ + public static final Community NO_EXPORT = CommunityUtil.create(NoopReferenceCache.getInstance(), 0xFFFF, 0xFF01); + /** + * NO_ADVERTISE community. All routes received carrying a communities attribute containing this value MUST NOT be + * advertised to other BGP peers. + */ + public static final Community NO_ADVERTISE = CommunityUtil.create(NoopReferenceCache.getInstance(), 0xFFFF, 0xFF02); + /** + * NO_EXPORT_SUBCONFED community. All routes received carrying a communities attribute containing this value MUST + * NOT be advertised to external BGP peers (this includes peers in other members autonomous systems inside a BGP + * confederation). + */ + public static final Community NO_EXPORT_SUBCONFED = CommunityUtil.create(NoopReferenceCache.getInstance(), 0xFFFF, 0xFF03); - private final ReferenceCache refCache; + private final ReferenceCache refCache; - public CommunityUtil(final ReferenceCache refCache) { - this.refCache = Preconditions.checkNotNull(refCache); - } + public CommunityUtil(final ReferenceCache refCache) { + this.refCache = Preconditions.checkNotNull(refCache); + } - /** - * Creates a new Community given AS number value and semantics using generated CommunitiesBuilder. - * - * @param asn long - * @param semantics long - * @return new Community - */ - public Community create(final long asn, final int semantics) { - return create(refCache, asn, semantics); - } + /** + * Creates a new Community given AS number value and semantics using generated CommunitiesBuilder. + * + * @param asn long + * @param semantics long + * @return new Community + */ + public Community create(final long asn, final int semantics) { + return create(refCache, asn, semantics); + } - /** - * Creates a Community from its String representation. - * - * @param string String representation of a community - * @return new Community - */ - public Community valueOf(final String string) { - return valueOf(refCache, string); - } + /** + * Creates a Community from its String representation. + * + * @param string String representation of a community + * @return new Community + */ + public Community valueOf(final String string) { + return valueOf(refCache, string); + } - /** - * Creates a new Community given AS number value and semantics using generated CommunitiesBuilder. - * - * @param refCache reference cache to use - * @param asn long - * @param semantics long - * @return new Community - */ - public static Community create(final ReferenceCache refCache, final long asn, final int semantics) { - final CommunitiesBuilder builder = new CommunitiesBuilder(); - builder.setAsNumber(refCache.getSharedReference(new AsNumber(asn))); - builder.setSemantics(refCache.getSharedReference(semantics)); - return refCache.getSharedReference(builder.build()); - } + /** + * Creates a new Community given AS number value and semantics using generated CommunitiesBuilder. + * + * @param refCache reference cache to use + * @param asn long + * @param semantics long + * @return new Community + */ + public static Community create(final ReferenceCache refCache, final long asn, final int semantics) { + final CommunitiesBuilder builder = new CommunitiesBuilder(); + builder.setAsNumber(refCache.getSharedReference(new AsNumber(asn))); + builder.setSemantics(refCache.getSharedReference(semantics)); + return refCache.getSharedReference(builder.build()); + } - /** - * Creates a Community from its String representation. - * - * @param refCache reference cache to use - * @param string String representation of a community - * @return new Community - */ - public static Community valueOf(final ReferenceCache refCache, final String string) { - final String[] parts = string.split(":", 2); - final CommunitiesBuilder builder = new CommunitiesBuilder(); - builder.setAsNumber(refCache.getSharedReference(new AsNumber(Long.valueOf(parts[0])))); - builder.setSemantics(refCache.getSharedReference(Integer.valueOf(parts[1]))); - return refCache.getSharedReference(builder.build()); - } + /** + * Creates a Community from its String representation. + * + * @param refCache reference cache to use + * @param string String representation of a community + * @return new Community + */ + public static Community valueOf(final ReferenceCache refCache, final String string) { + final String[] parts = string.split(":", 2); + final CommunitiesBuilder builder = new CommunitiesBuilder(); + builder.setAsNumber(refCache.getSharedReference(new AsNumber(Long.valueOf(parts[0])))); + builder.setSemantics(refCache.getSharedReference(Integer.valueOf(parts[1]))); + return refCache.getSharedReference(builder.build()); + } } diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/ExtendedCommunitiesAttributeParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/ExtendedCommunitiesAttributeParser.java index 992a56f836..c68a6e5bc8 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/ExtendedCommunitiesAttributeParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/ExtendedCommunitiesAttributeParser.java @@ -7,6 +7,9 @@ */ package org.opendaylight.protocol.bgp.parser.impl.message.update; +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; + import io.netty.buffer.ByteBuf; import java.util.List; @@ -17,26 +20,24 @@ import org.opendaylight.protocol.util.ReferenceCache; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.ExtendedCommunities; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributesBuilder; -import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; - public final class ExtendedCommunitiesAttributeParser implements AttributeParser { - public static final int TYPE = 16; - - private final ReferenceCache refCache; - - public ExtendedCommunitiesAttributeParser(final ReferenceCache refCache) { - this.refCache = Preconditions.checkNotNull(refCache); - } - - @Override - public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) throws BGPDocumentedException { - final List set = Lists.newArrayList(); - while (buffer.isReadable()) { - final ExtendedCommunities comm = CommunitiesParser.parseExtendedCommunity(this.refCache, buffer.slice(buffer.readerIndex(), CommunitiesParser.EXTENDED_COMMUNITY_LENGTH)); - buffer.skipBytes(CommunitiesParser.EXTENDED_COMMUNITY_LENGTH); - set.add(comm); - } - builder.setExtendedCommunities(set); - } + public static final int TYPE = 16; + + private final ReferenceCache refCache; + + public ExtendedCommunitiesAttributeParser(final ReferenceCache refCache) { + this.refCache = Preconditions.checkNotNull(refCache); + } + + @Override + public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) throws BGPDocumentedException { + final List set = Lists.newArrayList(); + while (buffer.isReadable()) { + final ExtendedCommunities comm = CommunitiesParser.parseExtendedCommunity(this.refCache, buffer.slice(buffer.readerIndex(), + CommunitiesParser.EXTENDED_COMMUNITY_LENGTH)); + buffer.skipBytes(CommunitiesParser.EXTENDED_COMMUNITY_LENGTH); + set.add(comm); + } + builder.setExtendedCommunities(set); + } } \ No newline at end of file diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/IpNlriParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/IpNlriParser.java index dcfd109252..c19bd8e218 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/IpNlriParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/IpNlriParser.java @@ -19,16 +19,16 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mult import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.mp.unreach.nlri.WithdrawnRoutesBuilder; abstract class IpNlriParser implements NlriParser { - protected abstract DestinationType parseNlri(final ByteBuf nlri); + protected abstract DestinationType parseNlri(final ByteBuf nlri); - @Override - public final void parseNlri(final ByteBuf nlri, final MpUnreachNlriBuilder builder) { - builder.setWithdrawnRoutes(new WithdrawnRoutesBuilder().setDestinationType(parseNlri(nlri)).build()); - } + @Override + public final void parseNlri(final ByteBuf nlri, final MpUnreachNlriBuilder builder) { + builder.setWithdrawnRoutes(new WithdrawnRoutesBuilder().setDestinationType(parseNlri(nlri)).build()); + } - @Override - public final void parseNlri(final ByteBuf nlri, final byte[] nextHop, final MpReachNlriBuilder builder) throws BGPParsingException { - builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(parseNlri(nlri)).build()); - NlriUtil.parseNextHop(nextHop, builder); - } + @Override + public final void parseNlri(final ByteBuf nlri, final byte[] nextHop, final MpReachNlriBuilder builder) throws BGPParsingException { + builder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType(parseNlri(nlri)).build()); + NlriUtil.parseNextHop(nextHop, builder); + } } \ No newline at end of file diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/Ipv4NlriParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/Ipv4NlriParser.java index 0a9bd37a69..61b13c50da 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/Ipv4NlriParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/Ipv4NlriParser.java @@ -16,9 +16,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mult import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.destination.destination.type.destination.ipv4._case.DestinationIpv4Builder; public final class Ipv4NlriParser extends IpNlriParser { - @Override - protected DestinationIpv4Case parseNlri(final ByteBuf nlri) { - return new DestinationIpv4CaseBuilder().setDestinationIpv4( - new DestinationIpv4Builder().setIpv4Prefixes(Ipv4Util.prefixListForBytes(ByteArray.readAllBytes(nlri))).build()).build(); - } + @Override + protected DestinationIpv4Case parseNlri(final ByteBuf nlri) { + return new DestinationIpv4CaseBuilder().setDestinationIpv4( + new DestinationIpv4Builder().setIpv4Prefixes(Ipv4Util.prefixListForBytes(ByteArray.readAllBytes(nlri))).build()).build(); + } } \ No newline at end of file diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/Ipv6NlriParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/Ipv6NlriParser.java index 62998dddf6..009dd6dc24 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/Ipv6NlriParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/Ipv6NlriParser.java @@ -16,9 +16,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mult import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.destination.destination.type.destination.ipv6._case.DestinationIpv6Builder; public final class Ipv6NlriParser extends IpNlriParser { - @Override - protected DestinationIpv6Case parseNlri(final ByteBuf nlri) { - return new DestinationIpv6CaseBuilder().setDestinationIpv6( - new DestinationIpv6Builder().setIpv6Prefixes(Ipv6Util.prefixListForBytes(ByteArray.readAllBytes(nlri))).build()).build(); - } + @Override + protected DestinationIpv6Case parseNlri(final ByteBuf nlri) { + return new DestinationIpv6CaseBuilder().setDestinationIpv6( + new DestinationIpv6Builder().setIpv6Prefixes(Ipv6Util.prefixListForBytes(ByteArray.readAllBytes(nlri))).build()).build(); + } } \ No newline at end of file diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/LocalPreferenceAttributeParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/LocalPreferenceAttributeParser.java index 641da556d6..7a4cd24363 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/LocalPreferenceAttributeParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/LocalPreferenceAttributeParser.java @@ -14,10 +14,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mess import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributesBuilder; public final class LocalPreferenceAttributeParser implements AttributeParser { - public static final int TYPE = 5; + public static final int TYPE = 5; - @Override - public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) { - builder.setLocalPref(new LocalPrefBuilder().setPref(buffer.readUnsignedInt()).build()); - } + @Override + public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) { + builder.setLocalPref(new LocalPrefBuilder().setPref(buffer.readUnsignedInt()).build()); + } } \ No newline at end of file diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/MPReachAttributeParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/MPReachAttributeParser.java index 7cf57f040c..0980387496 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/MPReachAttributeParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/MPReachAttributeParser.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.parser.impl.message.update; +import com.google.common.base.Preconditions; + import io.netty.buffer.ByteBuf; import org.opendaylight.protocol.bgp.parser.BGPDocumentedException; @@ -18,24 +20,22 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mess import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.PathAttributes1; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.PathAttributes1Builder; -import com.google.common.base.Preconditions; - public final class MPReachAttributeParser implements AttributeParser { - public static final int TYPE = 14; + public static final int TYPE = 14; - private final NlriRegistry reg; + private final NlriRegistry reg; - public MPReachAttributeParser(final NlriRegistry reg) { - this.reg = Preconditions.checkNotNull(reg); - } + public MPReachAttributeParser(final NlriRegistry reg) { + this.reg = Preconditions.checkNotNull(reg); + } - @Override - public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) throws BGPDocumentedException { - try { - final PathAttributes1 a = new PathAttributes1Builder().setMpReachNlri(this.reg.parseMpReach(buffer)).build(); - builder.addAugmentation(PathAttributes1.class, a); - } catch (final BGPParsingException e) { - throw new BGPDocumentedException("Could not parse MP_REACH_NLRI", BGPError.OPT_ATTR_ERROR, e); - } - } + @Override + public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) throws BGPDocumentedException { + try { + final PathAttributes1 a = new PathAttributes1Builder().setMpReachNlri(this.reg.parseMpReach(buffer)).build(); + builder.addAugmentation(PathAttributes1.class, a); + } catch (final BGPParsingException e) { + throw new BGPDocumentedException("Could not parse MP_REACH_NLRI", BGPError.OPT_ATTR_ERROR, e); + } + } } \ No newline at end of file diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/MPUnreachAttributeParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/MPUnreachAttributeParser.java index 7590644b3d..b5b5f801ee 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/MPUnreachAttributeParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/MPUnreachAttributeParser.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.parser.impl.message.update; +import com.google.common.base.Preconditions; + import io.netty.buffer.ByteBuf; import org.opendaylight.protocol.bgp.parser.BGPDocumentedException; @@ -18,24 +20,22 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mess import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.PathAttributes2; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.PathAttributes2Builder; -import com.google.common.base.Preconditions; - public final class MPUnreachAttributeParser implements AttributeParser { - public static final int TYPE = 15; + public static final int TYPE = 15; - private final NlriRegistry reg; + private final NlriRegistry reg; - public MPUnreachAttributeParser(final NlriRegistry reg) { - this.reg = Preconditions.checkNotNull(reg); - } + public MPUnreachAttributeParser(final NlriRegistry reg) { + this.reg = Preconditions.checkNotNull(reg); + } - @Override - public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) throws BGPDocumentedException { - try { - final PathAttributes2 a = new PathAttributes2Builder().setMpUnreachNlri(this.reg.parseMpUnreach(buffer)).build(); - builder.addAugmentation(PathAttributes2.class, a); - } catch (final BGPParsingException e) { - throw new BGPDocumentedException("Could not parse MP_UNREACH_NLRI", BGPError.OPT_ATTR_ERROR, e); - } - } + @Override + public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) throws BGPDocumentedException { + try { + final PathAttributes2 a = new PathAttributes2Builder().setMpUnreachNlri(this.reg.parseMpUnreach(buffer)).build(); + builder.addAugmentation(PathAttributes2.class, a); + } catch (final BGPParsingException e) { + throw new BGPDocumentedException("Could not parse MP_UNREACH_NLRI", BGPError.OPT_ATTR_ERROR, e); + } + } } \ No newline at end of file diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/MultiExitDiscriminatorAttributeParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/MultiExitDiscriminatorAttributeParser.java index 4051cf4599..9c1162bee5 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/MultiExitDiscriminatorAttributeParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/MultiExitDiscriminatorAttributeParser.java @@ -14,10 +14,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mess import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributesBuilder; public final class MultiExitDiscriminatorAttributeParser implements AttributeParser { - public static final int TYPE = 4; + public static final int TYPE = 4; - @Override - public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) { - builder.setMultiExitDisc(new MultiExitDiscBuilder().setMed(buffer.readUnsignedInt()).build()); - } + @Override + public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) { + builder.setMultiExitDisc(new MultiExitDiscBuilder().setMed(buffer.readUnsignedInt()).build()); + } } \ No newline at end of file diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/NextHopAttributeParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/NextHopAttributeParser.java index 38c5ef8683..c9a86d15fe 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/NextHopAttributeParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/NextHopAttributeParser.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.parser.impl.message.update; +import com.google.common.base.Preconditions; + import io.netty.buffer.ByteBuf; import org.opendaylight.protocol.bgp.parser.spi.AttributeParser; @@ -16,15 +18,14 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mess import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv4NextHopCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHopBuilder; -import com.google.common.base.Preconditions; - public final class NextHopAttributeParser implements AttributeParser { - public static final int TYPE = 3; + public static final int TYPE = 3; - @Override - public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) { - Preconditions.checkArgument(buffer.readableBytes() == Ipv4Util.IP4_LENGTH, "Length of byte array for NEXT_HOP should be %s, but is %s", buffer.readableBytes(), Ipv4Util.IP4_LENGTH); - builder.setCNextHop(new Ipv4NextHopCaseBuilder().setIpv4NextHop( - new Ipv4NextHopBuilder().setGlobal(Ipv4Util.addressForBytes(ByteArray.readAllBytes(buffer))).build()).build()); - } + @Override + public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) { + Preconditions.checkArgument(buffer.readableBytes() == Ipv4Util.IP4_LENGTH, + "Length of byte array for NEXT_HOP should be %s, but is %s", buffer.readableBytes(), Ipv4Util.IP4_LENGTH); + builder.setCNextHop(new Ipv4NextHopCaseBuilder().setIpv4NextHop( + new Ipv4NextHopBuilder().setGlobal(Ipv4Util.addressForBytes(ByteArray.readAllBytes(buffer))).build()).build()); + } } \ No newline at end of file diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/OriginAttributeParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/OriginAttributeParser.java index 5fe59760fd..2d48d86291 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/OriginAttributeParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/OriginAttributeParser.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.parser.impl.message.update; +import com.google.common.primitives.UnsignedBytes; + import io.netty.buffer.ByteBuf; import org.opendaylight.protocol.bgp.parser.BGPDocumentedException; @@ -16,18 +18,17 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mess import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpOrigin; -import com.google.common.primitives.UnsignedBytes; - public final class OriginAttributeParser implements AttributeParser { - public static final int TYPE = 1; + public static final int TYPE = 1; - @Override - public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) throws BGPDocumentedException { - byte rawOrigin = buffer.readByte(); - final BgpOrigin borigin = BgpOrigin.forValue(UnsignedBytes.toInt(rawOrigin)); - if (borigin == null) { - throw new BGPDocumentedException("Unknown Origin type.", BGPError.ORIGIN_ATTR_NOT_VALID, new byte[] { (byte) 0x01, (byte) 0x01, rawOrigin }); - } - builder.setOrigin(new OriginBuilder().setValue(borigin).build()); - } + @Override + public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) throws BGPDocumentedException { + byte rawOrigin = buffer.readByte(); + final BgpOrigin borigin = BgpOrigin.forValue(UnsignedBytes.toInt(rawOrigin)); + if (borigin == null) { + throw new BGPDocumentedException("Unknown Origin type.", BGPError.ORIGIN_ATTR_NOT_VALID, new byte[] { (byte) 0x01, (byte) 0x01, + rawOrigin }); + } + builder.setOrigin(new OriginBuilder().setValue(borigin).build()); + } } \ No newline at end of file diff --git a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/OriginatorIdAttributeParser.java b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/OriginatorIdAttributeParser.java index f5fad7b199..3295350d61 100644 --- a/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/OriginatorIdAttributeParser.java +++ b/bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/update/OriginatorIdAttributeParser.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.parser.impl.message.update; +import com.google.common.base.Preconditions; + import io.netty.buffer.ByteBuf; import org.opendaylight.protocol.bgp.parser.spi.AttributeParser; @@ -14,16 +16,15 @@ import org.opendaylight.protocol.concepts.Ipv4Util; import org.opendaylight.protocol.util.ByteArray; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributesBuilder; -import com.google.common.base.Preconditions; - public final class OriginatorIdAttributeParser implements AttributeParser { - public static final int TYPE = 9; + public static final int TYPE = 9; - private static final int ORIGINATOR_LENGTH = 4; + private static final int ORIGINATOR_LENGTH = 4; - @Override - public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) { - Preconditions.checkArgument(buffer.readableBytes() == ORIGINATOR_LENGTH, "Length of byte array for ORIGINATOR_ID should be %s, but is %s", ORIGINATOR_LENGTH, buffer.readableBytes()); - builder.setOriginatorId(Ipv4Util.addressForBytes(ByteArray.readBytes(buffer, ORIGINATOR_LENGTH))); - } + @Override + public void parseAttribute(final ByteBuf buffer, final PathAttributesBuilder builder) { + Preconditions.checkArgument(buffer.readableBytes() == ORIGINATOR_LENGTH, + "Length of byte array for ORIGINATOR_ID should be %s, but is %s", ORIGINATOR_LENGTH, buffer.readableBytes()); + builder.setOriginatorId(Ipv4Util.addressForBytes(ByteArray.readBytes(buffer, ORIGINATOR_LENGTH))); + } } \ No newline at end of file diff --git a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/BGPParserTest.java b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/BGPParserTest.java index e604fd3578..cc5f31a699 100644 --- a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/BGPParserTest.java +++ b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/BGPParserTest.java @@ -10,6 +10,10 @@ package org.opendaylight.protocol.bgp.parser.impl; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; + +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; + import io.netty.buffer.Unpooled; import java.io.ByteArrayOutputStream; @@ -114,1075 +118,1067 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv6.next.hop._case.Ipv6NextHopBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.Metric; -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; - public class BGPParserTest { - /** - * Used by other tests as well - */ - static final List inputBytes = new ArrayList(); - - private static int COUNTER = 17; - - private static int MAX_SIZE = 300; - - private static BGPUpdateMessageParser updateParser; - - @BeforeClass - public static void setUp() throws Exception { - updateParser = new BGPUpdateMessageParser(ServiceLoaderBGPExtensionProviderContext.getSingletonInstance().getAttributeRegistry()); - - for (int i = 1; i <= COUNTER; i++) { - final String name = "/up" + i + ".bin"; - final InputStream is = BGPParserTest.class.getResourceAsStream(name); - if (is == null) { - throw new IOException("Failed to get resource " + name); - } - - final ByteArrayOutputStream bis = new ByteArrayOutputStream(); - final byte[] data = new byte[MAX_SIZE]; - int nRead = 0; - while ((nRead = is.read(data, 0, data.length)) != -1) { - bis.write(data, 0, nRead); - } - bis.flush(); - - inputBytes.add(bis.toByteArray()); - } - } - - @Test - public void testResource() { - assertNotNull(inputBytes); - } - - /* - * Tests IPv4 NEXT_HOP, ATOMIC_AGGREGATE, COMMUNITY, NLRI - * - * ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff <- marker - * 00 54 <- length (84) - including header - * 02 <- message type - * 00 00 <- withdrawn routes length - * 00 31 <- total path attribute length (49) - * 40 <- attribute flags - * 01 <- attribute type code (origin) - * 01 <- attribute length - * 00 <- Origin value (IGP) - * 40 <- attribute flags - * 02 <- attribute type code (as path) - * 06 <- attribute length - * 02 <- AS_SEQUENCE - * 01 <- path segment count - * 00 00 fd ea <- path segment value (65002) - * 40 <- attribute flags - * 03 <- attribute type code (Next Hop) - * 04 <- attribute length - * 10 00 00 02 <- value (10.0.0.2) - * 80 <- attribute flags - * 04 <- attribute type code (multi exit disc) - * 04 <- attribute length - * 00 00 00 00 <- value - * 64 <- attribute flags - * 06 <- attribute type code (atomic aggregate) - * 00 <- attribute length - * 64 <- attribute flags - * 08 <- attribute type code (community) - * 10 <- attribute length FF FF FF - * 01 <- value (NO_EXPORT) - * FF FF FF 02 <- value (NO_ADVERTISE) - * FF FF FF 03 <- value (NO_EXPORT_SUBCONFED) - * FF FF FF 10 <- unknown Community - * - * //NLRI - * 18 ac 11 02 <- IPv4 Prefix (172.17.2.0 / 24) - * 18 ac 11 01 <- IPv4 Prefix (172.17.1.0 / 24) - * 18 ac 11 00 <- IPv4 Prefix (172.17.0.0 / 24) - */ - @Test - public void testGetUpdateMessage1() throws Exception { - - final byte[] body = ByteArray.cutBytes(inputBytes.get(0), MessageUtil.COMMON_HEADER_LENGTH); - final int messageLength = ByteArray.bytesToInt(ByteArray.subByte(inputBytes.get(0), MessageUtil.MARKER_LENGTH, - MessageUtil.LENGTH_FIELD_LENGTH)); - final Update message = BGPParserTest.updateParser.parseMessageBody(Unpooled.copiedBuffer(body), messageLength); - - // check fields - - assertNull(message.getWithdrawnRoutes()); - - // attributes - - final List asnums = Lists.newArrayList(new AsSequenceBuilder().setAs(new AsNumber(65002L)).build()); - final List asPath = Lists.newArrayList(); - asPath.add(new SegmentsBuilder().setCSegment( - new AListCaseBuilder().setAList(new AListBuilder().setAsSequence(asnums).build()).build()).build()); - - final Ipv4NextHopCase nextHop = new Ipv4NextHopCaseBuilder().setIpv4NextHop( - new Ipv4NextHopBuilder().setGlobal(new Ipv4Address("10.0.0.2")).build()).build(); - - final List comms = Lists.newArrayList(); - comms.add((Communities) CommunityUtil.NO_EXPORT); - comms.add((Communities) CommunityUtil.NO_ADVERTISE); - comms.add((Communities) CommunityUtil.NO_EXPORT_SUBCONFED); - comms.add((Communities) CommunityUtil.create(NoopReferenceCache.getInstance(), 0xFFFF, 0xFF10)); - - final UpdateBuilder builder = new UpdateBuilder(); - - // check nlri - - final List prefs = Lists.newArrayList(); - prefs.add(new Ipv4Prefix("172.17.2.0/24")); - prefs.add(new Ipv4Prefix("172.17.1.0/24")); - prefs.add(new Ipv4Prefix("172.17.0.0/24")); - - final Nlri nlri = new NlriBuilder().setNlri(prefs).build(); - - assertEquals(nlri, message.getNlri()); - - builder.setNlri(nlri); - - // check path attributes - - final PathAttributes attrs = message.getPathAttributes(); - - final PathAttributesBuilder paBuilder = new PathAttributesBuilder(); - - paBuilder.setOrigin(new OriginBuilder().setValue(BgpOrigin.Igp).build()); - assertEquals(paBuilder.getOrigin(), attrs.getOrigin()); - - paBuilder.setAsPath(new AsPathBuilder().setSegments(asPath).build()); - assertEquals(paBuilder.getAsPath(), attrs.getAsPath()); - - paBuilder.setCNextHop(nextHop); - assertEquals(paBuilder.getCNextHop(), attrs.getCNextHop()); - - paBuilder.setMultiExitDisc(new MultiExitDiscBuilder().setMed((long) 0).build()); - assertEquals(paBuilder.getMultiExitDisc(), attrs.getMultiExitDisc()); - - paBuilder.setAtomicAggregate(new AtomicAggregateBuilder().build()); - assertEquals(paBuilder.getAtomicAggregate(), attrs.getAtomicAggregate()); - - paBuilder.setCommunities(comms); - assertEquals(paBuilder.getCommunities(), attrs.getCommunities()); - - builder.setPathAttributes(paBuilder.build()); - - assertEquals(builder.build(), message); - } - - /* - * Tests IPv6 NEXT_HOP, NLRI, ORIGIN.IGP, MULTI_EXIT_DISC, ORIGINATOR-ID, CLUSTER_LIST. - * - * ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff <- marker - * 00 80 <- length (128) - including header - * 02 <- message type - * 00 00 <- withdrawn routes length - * 00 69 <- total path attribute length (105) - * 40 <- attribute flags - * 01 <- attribute type code (origin) - * 01 <- attribute length - * 00 <- Origin value (IGP) - * 40 <- attribute flags - * 02 <- attribute type code (as path) - * 06 <- attribute length - * 02 <- AS_SEQUENCE - * 01 <- path segment count - * 00 00 fd e9 <- path segment value (65001) - * 80 <- attribute flags - * 04 <- attribute type code (multi exit disc) - * 04 <- attribute length - * 00 00 00 00 <- value - * 80 <- attribute flags - * 09 <- attribute type code (originator id) - * 04 <- attribute length - * 7f 00 00 01 <- value (localhost ip) - * 80 <- attribute flags - * 0a <- attribute type code (cluster list) - * 08 <- attribute length - * 01 02 03 04 <- value - * 05 06 07 08 <- value - * 80 <- attribute flags - * 0e <- attribute type code (mp reach nlri) - * 40 <- attribute length - * 00 02 <- AFI (Ipv6) - * 01 <- SAFI (Unicast) - * 20 <- length of next hop - * 20 01 0d b8 00 00 00 00 00 00 00 00 00 00 00 01 <- global - * fe 80 00 00 00 00 00 00 c0 01 0b ff fe 7e 00 <- link local - * 00 <- reserved - * - * //NLRI - * 40 20 01 0d b8 00 01 00 02 <- IPv6 Prefix (2001:db8:1:2:: / 64) - * 40 20 01 0d b8 00 01 00 01 <- IPv6 Prefix (2001:db8:1:1:: / 64) - * 40 20 01 0d b8 00 01 00 00 <- IPv6 Prefix (2001:db8:1:: / 64) - * - */ - @Test - public void testGetUpdateMessage2() throws Exception { - final byte[] body = ByteArray.cutBytes(inputBytes.get(1), MessageUtil.COMMON_HEADER_LENGTH); - final int messageLength = ByteArray.bytesToInt(ByteArray.subByte(inputBytes.get(1), MessageUtil.MARKER_LENGTH, - MessageUtil.LENGTH_FIELD_LENGTH)); - final Update message = BGPParserTest.updateParser.parseMessageBody(Unpooled.copiedBuffer(body), messageLength); - - // check fields - assertNull(message.getWithdrawnRoutes()); - - final UpdateBuilder builder = new UpdateBuilder(); - - // check NLRI - - final List prefs = Lists.newArrayList(); - prefs.add(new Ipv6Prefix("2001:db8:1:2::/64")); - prefs.add(new Ipv6Prefix("2001:db8:1:1::/64")); - prefs.add(new Ipv6Prefix("2001:db8:1::/64")); - - assertNull(message.getNlri()); - - // attributes - - final List asnums = Lists.newArrayList(new AsSequenceBuilder().setAs(new AsNumber(65001L)).build()); - final List asPath = Lists.newArrayList(); - asPath.add(new SegmentsBuilder().setCSegment( - new AListCaseBuilder().setAList(new AListBuilder().setAsSequence(asnums).build()).build()).build()); - - final Ipv6NextHopCase nextHop = new Ipv6NextHopCaseBuilder().setIpv6NextHop( - new Ipv6NextHopBuilder().setGlobal(new Ipv6Address("2001:db8::1")).setLinkLocal(new Ipv6Address("fe80::c001:bff:fe7e:0")).build()).build(); - - final List clusters = Lists.newArrayList(new ClusterIdentifier(new Ipv4Address("1.2.3.4")), - new ClusterIdentifier(new Ipv4Address("5.6.7.8"))); - - // check path attributes - - final PathAttributes attrs = message.getPathAttributes(); - - final PathAttributesBuilder paBuilder = new PathAttributesBuilder(); - - paBuilder.setOrigin(new OriginBuilder().setValue(BgpOrigin.Igp).build()); - assertEquals(paBuilder.getOrigin(), attrs.getOrigin()); - - paBuilder.setAsPath(new AsPathBuilder().setSegments(asPath).build()); - assertEquals(paBuilder.getAsPath(), attrs.getAsPath()); - - paBuilder.setMultiExitDisc(new MultiExitDiscBuilder().setMed((long) 0).build()); - assertEquals(paBuilder.getMultiExitDisc(), attrs.getMultiExitDisc()); - - paBuilder.setOriginatorId(new Ipv4Address("127.0.0.1")); - assertEquals(paBuilder.getOriginatorId(), attrs.getOriginatorId()); - - paBuilder.setClusterId(clusters); - assertEquals(paBuilder.getClusterId(), attrs.getClusterId()); - - final MpReachNlriBuilder mpBuilder = new MpReachNlriBuilder(); - mpBuilder.setAfi(Ipv6AddressFamily.class); - mpBuilder.setSafi(UnicastSubsequentAddressFamily.class); - mpBuilder.setCNextHop(nextHop); - mpBuilder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType( - new DestinationIpv6CaseBuilder().setDestinationIpv6(new DestinationIpv6Builder().setIpv6Prefixes(prefs).build()).build()).build()); - - paBuilder.addAugmentation(PathAttributes1.class, new PathAttributes1Builder().setMpReachNlri(mpBuilder.build()).build()); - assertEquals(paBuilder.getAugmentation(PathAttributes1.class).getMpReachNlri(), - attrs.getAugmentation(PathAttributes1.class).getMpReachNlri()); - - // check API message - - builder.setPathAttributes(paBuilder.build()); - assertEquals(builder.build(), message); - } - - /* - * Tests more AS Numbers in AS_PATH, AGGREGATOR, ORIGIN.INCOMPLETE - * - * ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff <- marker - * 00 4b <- length (75) - including header - * 02 <- message type - * 00 00 <- withdrawn routes length - * 00 30 <- total path attribute length (48) - * 40 <- attribute flags - * 01 <- attribute type code (origin) - * 01 <- attribute length - * 02 <- Origin value (Incomplete) - * 40 <- attribute flags - * 02 <- attribute type code (as path) - * 10 <- attribute length - * 02 <- AS_SEQUENCE - * 01 <- path segment count - * 00 00 00 1e <- path segment value (30) - * 01 <- AS_SET - * 02 <- path segment count - * 00 00 00 0a <- path segment value (10) - * 00 00 00 14 <- path segment value (20) - * 40 <- attribute flags - * 03 <- attribute type (Next hop) - * 04 <- attribute length - * 0a 00 00 09 <- value (10.0.0.9) - * 80 <- attribute flags - * 04 <- attribute type code (multi exit disc) - * 04 <- attribute length - * 00 00 00 00 <- value - * c0 <- attribute flags - * 07 <- attribute type (Aggregator) - * 08 <- attribute length - * 00 00 00 1e <- value (AS number = 30) - * 0a 00 00 09 <- value (IP address = 10.0.0.9) - * - * //NLRI - * 15 ac 10 00 <- IPv4 Prefix (172.16.0.0 / 21) - */ - @Test - public void testGetUpdateMessage3() throws Exception { - final byte[] body = ByteArray.cutBytes(inputBytes.get(2), MessageUtil.COMMON_HEADER_LENGTH); - final int messageLength = ByteArray.bytesToInt(ByteArray.subByte(inputBytes.get(2), MessageUtil.MARKER_LENGTH, - MessageUtil.LENGTH_FIELD_LENGTH)); - final Update message = BGPParserTest.updateParser.parseMessageBody(Unpooled.copiedBuffer(body), messageLength); - - final UpdateBuilder builder = new UpdateBuilder(); - - // check nlri - final Ipv4Prefix pref1 = new Ipv4Prefix("172.16.0.0/21"); - - final List nlri = Lists.newArrayList(pref1); - builder.setNlri(new NlriBuilder().setNlri(nlri).build()); - assertEquals(builder.getNlri(), message.getNlri()); - - // check fields - assertNull(message.getWithdrawnRoutes()); - - // attributes - final List asnums = Lists.newArrayList(new AsSequenceBuilder().setAs(new AsNumber(30L)).build()); - final List asPath = Lists.newArrayList(); - asPath.add(new SegmentsBuilder().setCSegment( - new AListCaseBuilder().setAList(new AListBuilder().setAsSequence(asnums).build()).build()).build()); - asPath.add(new SegmentsBuilder().setCSegment( - new ASetCaseBuilder().setASet(new ASetBuilder().setAsSet(Lists.newArrayList(new AsNumber(10L), new AsNumber(20L))).build()).build()).build()); - - final Aggregator aggregator = new AggregatorBuilder().setAsNumber(new AsNumber((long) 30)).setNetworkAddress( - new Ipv4Address("10.0.0.9")).build(); - final Ipv4NextHopCase nextHop = new Ipv4NextHopCaseBuilder().setIpv4NextHop( - new Ipv4NextHopBuilder().setGlobal(new Ipv4Address("10.0.0.9")).build()).build(); - - // check path attributes - final PathAttributes attrs = message.getPathAttributes(); - - final PathAttributesBuilder paBuilder = new PathAttributesBuilder(); - - paBuilder.setOrigin(new OriginBuilder().setValue(BgpOrigin.Incomplete).build()); - assertEquals(paBuilder.getOrigin(), attrs.getOrigin()); - - paBuilder.setAsPath(new AsPathBuilder().setSegments(asPath).build()); - assertEquals(paBuilder.getAsPath(), attrs.getAsPath()); - - paBuilder.setCNextHop(nextHop); - assertEquals(paBuilder.getCNextHop(), attrs.getCNextHop()); - - paBuilder.setMultiExitDisc(new MultiExitDiscBuilder().setMed((long) 0).build()); - assertEquals(paBuilder.getMultiExitDisc(), attrs.getMultiExitDisc()); - - paBuilder.setAggregator(aggregator); - assertEquals(paBuilder.getAggregator(), attrs.getAggregator()); - - builder.setPathAttributes(paBuilder.build()); - - assertEquals(builder.build(), message); - } - - /* - * Tests empty AS_PATH, ORIGIN.EGP, LOCAL_PREF, EXTENDED_COMMUNITIES (Ipv4 Addr specific) - * - * ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff <- marker - * 00 4A <- length (73) - including header - * 02 <- message type - * 00 00 <- withdrawn routes length - * 00 27 <- total path attribute length (39) - * 40 <- attribute flags - * 01 <- attribute type code (Origin) - * 01 <- attribute length - * 01 <- Origin value (EGP) - * 40 <- attribute flags - * 02 <- attribute type code (As path) - * 00 <- attribute length - * 40 <- attribute flags - * 03 <- attribute type (Next hop) - * 04 <- attribute length - * 03 03 03 03 <- value (3.3.3.3) - * 80 <- attribute flags - * 04 <- attribute type code (Multi exit disc) - * 04 <- attribute length - * 00 00 00 00 <- value - * 40 <- attribute flags - * 05 <- attribute type (Local Pref) - * 04 <- attribute length - * 00 00 00 64 <- value (100) - * 80 <- attribute flags - * 10 <- attribute type (extended community) - * 08 <- attribute length - * 01 04 <- value (type - Ipv4 Address Specific Extended Community) - * c0 a8 01 00 <- value (global adm. 198.162.1.0) - * 12 34 <- value (local adm. 4660) - * - * //NLRI - * 18 0a 1e 03 <- IPv4 Prefix (10.30.3.0 / 24) - * 18 0a 1e 02 <- IPv4 Prefix (10.30.2.0 / 24) - * 18 0a 1e 01 <- IPv4 Prefix (10.30.1.0 / 24) - */ - @Test - public void testGetUpdateMessage4() throws Exception { - final byte[] body = ByteArray.cutBytes(inputBytes.get(3), MessageUtil.COMMON_HEADER_LENGTH); - final int messageLength = ByteArray.bytesToInt(ByteArray.subByte(inputBytes.get(3), MessageUtil.MARKER_LENGTH, - MessageUtil.LENGTH_FIELD_LENGTH)); - final Update message = BGPParserTest.updateParser.parseMessageBody(Unpooled.copiedBuffer(body), messageLength); - - final UpdateBuilder builder = new UpdateBuilder(); - - // check fields - assertNull(message.getWithdrawnRoutes()); - - // check nlri - final Ipv4Prefix pref1 = new Ipv4Prefix("10.30.3.0/24"); - final Ipv4Prefix pref2 = new Ipv4Prefix("10.30.2.0/24"); - final Ipv4Prefix pref3 = new Ipv4Prefix("10.30.1.0/24"); - - final List nlri = Lists.newArrayList(pref1, pref2, pref3); - builder.setNlri(new NlriBuilder().setNlri(nlri).build()); - assertEquals(builder.getNlri(), message.getNlri()); - - // attributes - final Ipv4NextHopCase nextHop = new Ipv4NextHopCaseBuilder().setIpv4NextHop( - new Ipv4NextHopBuilder().setGlobal(new Ipv4Address("3.3.3.3")).build()).build(); - - final List comms = Lists.newArrayList(); - comms.add(new ExtendedCommunitiesBuilder().setCommType((short) 1).setExtendedCommunity( - new Inet4SpecificExtendedCommunityCaseBuilder().setInet4SpecificExtendedCommunity( - new Inet4SpecificExtendedCommunityBuilder().setTransitive(false).setGlobalAdministrator( - new Ipv4Address("192.168.1.0")).setLocalAdministrator(new byte[] { 0x12, 0x34 }).build()).build()).build()); - - final List asPath = Lists.newArrayList(); - - // check path attributes - final PathAttributes attrs = message.getPathAttributes(); - - final PathAttributesBuilder paBuilder = new PathAttributesBuilder(); - - paBuilder.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build()); - assertEquals(paBuilder.getOrigin(), attrs.getOrigin()); - - paBuilder.setAsPath(new AsPathBuilder().setSegments(asPath).build()); - assertEquals(paBuilder.getAsPath(), attrs.getAsPath()); - - paBuilder.setCNextHop(nextHop); - assertEquals(paBuilder.getCNextHop(), attrs.getCNextHop()); - - paBuilder.setMultiExitDisc(new MultiExitDiscBuilder().setMed((long) 0).build()); - assertEquals(paBuilder.getMultiExitDisc(), attrs.getMultiExitDisc()); - - paBuilder.setLocalPref(new LocalPrefBuilder().setPref(100L).build()); - assertEquals(paBuilder.getLocalPref(), attrs.getLocalPref()); - - paBuilder.setExtendedCommunities(comms); - assertEquals(paBuilder.getExtendedCommunities(), attrs.getExtendedCommunities()); - - // check API message - builder.setPathAttributes(paBuilder.build()); - assertEquals(builder.build(), message); - } - - /* - * Tests withdrawn routes. - * - * ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff <- marker - * 00 1c <- length (28) - including header - * 02 <- message type - * 00 05 <- withdrawn routes length (5) - * 1e ac 10 00 04 <- route (172.16.0.4) - * 00 00 <- total path attribute length - */ - @Test - public void testGetUpdateMessage5() throws Exception { - final byte[] body = ByteArray.cutBytes(inputBytes.get(4), MessageUtil.COMMON_HEADER_LENGTH); - final int messageLength = ByteArray.bytesToInt(ByteArray.subByte(inputBytes.get(4), MessageUtil.MARKER_LENGTH, - MessageUtil.LENGTH_FIELD_LENGTH)); - final Update message = BGPParserTest.updateParser.parseMessageBody(Unpooled.copiedBuffer(body), messageLength); - - // attributes - final List prefs = Lists.newArrayList(new Ipv4Prefix("172.16.0.4/30")); - - // check API message - final Update expectedMessage = new UpdateBuilder().setWithdrawnRoutes( - new WithdrawnRoutesBuilder().setWithdrawnRoutes(prefs).build()).build(); - - assertEquals(expectedMessage.getWithdrawnRoutes(), message.getWithdrawnRoutes()); - } - - /* - * End of Rib for Ipv4. - * - * ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff <- marker - * 00 17 <- length (23) - including header - * 02 <- message type - * 00 00 <- withdrawn routes length - * 00 00 <- total path attribute length - */ - @Test - public void testEORIpv4() throws Exception { - final byte[] body = ByteArray.cutBytes(inputBytes.get(5), MessageUtil.COMMON_HEADER_LENGTH); - final int messageLength = ByteArray.bytesToInt(ByteArray.subByte(inputBytes.get(5), MessageUtil.MARKER_LENGTH, - MessageUtil.LENGTH_FIELD_LENGTH)); - final Update message = BGPParserTest.updateParser.parseMessageBody(Unpooled.copiedBuffer(body), messageLength); - - assertEquals(new UpdateBuilder().build(), message); - } - - /* - * End of Rib for Ipv6 consists of empty MP_UNREACH_NLRI, with AFI 2 and SAFI 1 - * - * ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff <- marker - * 00 1d <- length (29) - including header - * 02 <- message type - * 00 00 <- withdrawn routes length - * 00 06 <- total path attribute length - * 80 <- attribute flags - * 0f <- attribute type (15 - MP_UNREACH_NLRI) - * 03 <- attribute length - * 00 02 <- value (AFI 2: IPv6) - * 01 <- value (SAFI 1) - */ - @Test - public void testEORIpv6() throws Exception { - final byte[] body = ByteArray.cutBytes(inputBytes.get(6), MessageUtil.COMMON_HEADER_LENGTH); - final int messageLength = ByteArray.bytesToInt(ByteArray.subByte(inputBytes.get(6), MessageUtil.MARKER_LENGTH, - MessageUtil.LENGTH_FIELD_LENGTH)); - final Update message = BGPParserTest.updateParser.parseMessageBody(Unpooled.copiedBuffer(body), messageLength); - - final Class afi = message.getPathAttributes().getAugmentation(PathAttributes2.class).getMpUnreachNlri().getAfi(); - final Class safi = message.getPathAttributes().getAugmentation(PathAttributes2.class).getMpUnreachNlri().getSafi(); - - assertEquals(Ipv6AddressFamily.class, afi); - assertEquals(UnicastSubsequentAddressFamily.class, safi); - } - - /* - * End of Rib for LS consists of empty MP_UNREACH_NLRI, with AFI 16388 and SAFI 71 - * - * ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff <- marker - * 00 1d <- length (29) - including header - * 02 <- message type - * 00 00 <- withdrawn routes length - * 00 06 <- total path attribute length - * 80 <- attribute flags - * 0f <- attribute type (15 - MP_UNREACH_NLRI) - * 03 <- attribute length - * 40 04 <- value (AFI 16388: LS) - * 47 <- value (SAFI 71) - */ - @Test - public void testEORLS() throws Exception { - final byte[] body = ByteArray.cutBytes(inputBytes.get(7), MessageUtil.COMMON_HEADER_LENGTH); - final int messageLength = ByteArray.bytesToInt(ByteArray.subByte(inputBytes.get(7), MessageUtil.MARKER_LENGTH, - MessageUtil.LENGTH_FIELD_LENGTH)); - final Update message = BGPParserTest.updateParser.parseMessageBody(Unpooled.copiedBuffer(body), messageLength); - - final Class afi = message.getPathAttributes().getAugmentation(PathAttributes2.class).getMpUnreachNlri().getAfi(); - final Class safi = message.getPathAttributes().getAugmentation(PathAttributes2.class).getMpUnreachNlri().getSafi(); - - assertEquals(LinkstateAddressFamily.class, afi); - assertEquals(LinkstateSubsequentAddressFamily.class, safi); - } - - /* - * Tests BGP Link Ipv4 - * - 00 00 <- withdrawn routes length - 01 48 <- total path attribute length (328) - 90 <- attribute flags - 0e <- attribute type code (MP reach) - 01 2c <- attribute extended length (300) - 40 04 <- AFI (16388 - Linkstate) - 47 <- SAFI (71 - Linkstate) - 04 <- next hop length - 19 19 19 01 <- nexthop (25.25.25.1) - 00 <- reserved - - 00 02 <- NLRI type (2 - linkNLRI) - 00 5d <- NLRI length (93) - 03 <- ProtocolID - OSPF - 00 00 00 00 00 00 00 01 <- identifier - - 01 00 <- local node descriptor type (256) - 00 24 <- length (36) - 02 00 <- node descriptor type (member AS - 512) - 00 04 <- length - 00 00 00 64 <- value (100) - 02 01 <- node descriptor type (bgpId - 513) - 00 04 <- length - 19 19 19 01 <- bgpId (25.25.25.1) - 02 02 <- node descriptor type (areaId - 514) - 00 04 <- length - 00 00 00 00 <- value - 02 03 <- node descriptor type (routeId - 515) - 00 08 <- length - 03 03 03 04 0b 0b 0b 03 <- OSPF Router Id - - 01 01 <- remote node descriptor type (257) - 00 20 <- length (32) - 02 00 <- node descriptor type (member AS - 512) - 00 04 <- length - 00 00 00 64 <- value (100) - 02 01 <- node descriptor type (bgpId - 513) - 00 04 <- length - 19 19 19 01 <- bgpId (25.25.25.1) - 02 02 <- node descriptor type (areaId - 514) - 00 04 <- length - 00 00 00 00 <- value - 02 03 <- node descriptor type (routeId - 515) - 00 04 <- length - 03 03 03 04 <- OSPF Router Id - - 01 03 <- link descriptor type (IPv4 interface address - 259) - 00 04 <- length (4) - 0b 0b 0b 03 <- value (11.11.11.3) - - 00 02 <- NLRI type (2 - linkNLRI) - 00 5d <- NLRI length (93) - 03 <- ProtocolID - OSPF - 00 00 00 00 00 00 00 01 <- identifier - - 01 00 <- local node descriptor type (256) - 00 24 <- length (36) - 02 00 <- node descriptor type (member AS - 512) - 00 04 <- length - 00 00 00 64 <- value (100) - 02 01 <- node descriptor type (bgpId - 513) - 00 04 <- length - 19 19 19 01 <- bgpId (25.25.25.1) - 02 02 <- node descriptor type (areaId - 514) - 00 04 <- length - 00 00 00 00 <- value - 02 03 <- node descriptor type (routeId - 515) - 00 08 <- length - 03 03 03 04 0b 0b 0b 03 <- OSPF Router Id - - 01 01 <- remote node descriptor type (257) - 00 20 <- length (32) - 02 00 <- node descriptor type (member AS - 512) - 00 04 <- length - 00 00 00 64 <- value (100) - 02 01 <- node descriptor type (bgpId - 513) - 00 04 <- length - 19 19 19 01 <- bgpId (25.25.25.1) - 02 02 <- node descriptor type (areaId - 514) - 00 04 <- length - 00 00 00 00 <- value - 02 03 <- node descriptor type (routeId - 515) - 00 04 <- length - 01 01 01 02 <- OSPF Router Id - - 01 03 <- link descriptor type (IPv4 interface address - 259) - 00 04 <- length - 0b 0b 0b 01 <- value (11.11.11.1) - - 00 02 <- NLRI type (2 - linkNLRI) - 00 5d <- NLRI length (93) - 03 <- ProtocolID - OSPF - 00 00 00 00 00 00 00 01 <- identifier - - 01 00 <- local node descriptor type (256) - 00 20 <- length (32) - 02 00 <- node descriptor type (member AS - 512) - 00 04 <- length - 00 00 00 64 <- value (100) - 02 01 <- node descriptor type (bgpId - 513) - 00 04 <- length - 19 19 19 01 <- bgpId (25.25.25.1) - 02 02 <- node descriptor type (areaId - 514) - 00 04 <- length - 00 00 00 00 <- value - 02 03 <- node descriptor type (routeId - 515) - 00 04 <- length - 01 01 01 02 <- OSPF Router Id - - 01 01 <- remote node descriptor type (257) - 00 24 <- length (36) - 02 00 <- node descriptor type (member AS - 512) - 00 04 <- length - 00 00 00 64 <- value (100) - 02 01 <- node descriptor type (bgpId - 513) - 00 04 <- length - 19 19 19 01 <- bgpId (25.25.25.1) - 02 02 <- node descriptor type (areaId - 514) - 00 04 <- length - 00 00 00 00 <- value - 02 03 <- node descriptor type (routeId - 515) - 00 08 <- length - 03 03 03 04 0b 0b 0b 03 <- OSPF Router Id - - 01 03 <- link descriptor type (IPv4 interface address - 259) - 00 04 <- length - 0b 0b 0b 01 <- value (11.11.11.1) - - 40 <- attribute flags - 01 <- attribute type (Origin) - 01 <- attribute length - 00 <- value (IGP) - 40 <- attribute flags - 02 <- attribute type (AS Path) - 00 <- length - 40 <- attribute flags - 05 <- attribute type (local pref) - 04 <- length - 00 00 00 64 <- value - c0 <- attribute flags - 63 <- attribute type (Link STATE - 99) - 07 <- length - 04 47 <- link attribute (1095 - Metric) - 00 03 <- length - 00 00 01 <- value - */ - @Test - public void testBGPLink() throws Exception { - final byte[] body = ByteArray.cutBytes(inputBytes.get(8), MessageUtil.COMMON_HEADER_LENGTH); - final int messageLength = ByteArray.bytesToInt(ByteArray.subByte(inputBytes.get(8), MessageUtil.MARKER_LENGTH, - MessageUtil.LENGTH_FIELD_LENGTH)); - final Update message = BGPParserTest.updateParser.parseMessageBody(Unpooled.copiedBuffer(body), messageLength); - - final UpdateBuilder builder = new UpdateBuilder(); - - // check fields - - assertNull(message.getWithdrawnRoutes()); - - final Ipv4NextHopCase nextHop = new Ipv4NextHopCaseBuilder().setIpv4NextHop( - new Ipv4NextHopBuilder().setGlobal(new Ipv4Address("25.25.25.1")).build()).build(); - - final List asPath = Lists.newArrayList(); - - final LocalNodeDescriptorsBuilder lndBuilder = new LocalNodeDescriptorsBuilder().setAsNumber(new AsNumber((long) 100)).setDomainId( - new DomainIdentifier(0x19191901L)).setAreaId(new AreaIdentifier(0L)); - - final RemoteNodeDescriptorsBuilder rndBuilder = new RemoteNodeDescriptorsBuilder().setAsNumber(new AsNumber((long) 100)).setDomainId( - new DomainIdentifier(0x19191901L)).setAreaId(new AreaIdentifier(0L)); - - final CLinkstateDestinationBuilder clBuilder = new CLinkstateDestinationBuilder(); - clBuilder.setIdentifier(new Identifier(BigInteger.ONE)); - clBuilder.setNlriType(NlriType.Link); - clBuilder.setProtocolId(ProtocolId.Ospf); - - final PathAttributes1Builder lsBuilder = new PathAttributes1Builder(); - final MpReachNlriBuilder mpBuilder = new MpReachNlriBuilder(); - mpBuilder.setAfi(LinkstateAddressFamily.class); - mpBuilder.setSafi(LinkstateSubsequentAddressFamily.class); - mpBuilder.setCNextHop(nextHop); - - final List linkstates = Lists.newArrayList(); - clBuilder.setLocalNodeDescriptors(lndBuilder.setCRouterIdentifier( - new OspfPseudonodeCaseBuilder().setOspfPseudonode( - new OspfPseudonodeBuilder().setOspfRouterId(0x03030304L).setLanInterface( - new OspfInterfaceIdentifier(0x0b0b0b03L)).build()).build()).build()); - clBuilder.setRemoteNodeDescriptors(rndBuilder.setCRouterIdentifier( - new OspfNodeCaseBuilder().setOspfNode(new OspfNodeBuilder().setOspfRouterId(0x03030304L).build()).build()).build()); - clBuilder.setLinkDescriptors(new LinkDescriptorsBuilder().setIpv4InterfaceAddress( - new Ipv4InterfaceIdentifier(new Ipv4Address("11.11.11.3"))).build()); - linkstates.add(clBuilder.build()); - - clBuilder.setLocalNodeDescriptors(lndBuilder.setCRouterIdentifier( - new OspfPseudonodeCaseBuilder().setOspfPseudonode( - new OspfPseudonodeBuilder().setOspfRouterId(0x03030304L).setLanInterface( - new OspfInterfaceIdentifier(0x0b0b0b03L)).build()).build()).build()); - clBuilder.setRemoteNodeDescriptors(rndBuilder.setCRouterIdentifier( - new OspfNodeCaseBuilder().setOspfNode(new OspfNodeBuilder().setOspfRouterId(0x01010102L).build()).build()).build()); - clBuilder.setLinkDescriptors(new LinkDescriptorsBuilder().setIpv4InterfaceAddress( - new Ipv4InterfaceIdentifier(new Ipv4Address("11.11.11.1"))).build()); - linkstates.add(clBuilder.build()); - - clBuilder.setLocalNodeDescriptors(lndBuilder.setCRouterIdentifier( - new OspfNodeCaseBuilder().setOspfNode(new OspfNodeBuilder().setOspfRouterId(0x01010102L).build()).build()).build()); - clBuilder.setRemoteNodeDescriptors(rndBuilder.setCRouterIdentifier( - new OspfPseudonodeCaseBuilder().setOspfPseudonode( - new OspfPseudonodeBuilder().setOspfRouterId(0x03030304L).setLanInterface( - new OspfInterfaceIdentifier(0x0b0b0b03L)).build()).build()).build()); - clBuilder.setLinkDescriptors(new LinkDescriptorsBuilder().setIpv4InterfaceAddress( - new Ipv4InterfaceIdentifier(new Ipv4Address("11.11.11.1"))).build()); - linkstates.add(clBuilder.build()); - - lsBuilder.setMpReachNlri(mpBuilder.build()); - - // check path attributes - final PathAttributes attrs = message.getPathAttributes(); - - final PathAttributesBuilder paBuilder = new PathAttributesBuilder(); - - paBuilder.setOrigin(new OriginBuilder().setValue(BgpOrigin.Igp).build()); - assertEquals(paBuilder.getOrigin(), attrs.getOrigin()); - - paBuilder.setAsPath(new AsPathBuilder().setSegments(asPath).build()); - assertEquals(paBuilder.getAsPath(), attrs.getAsPath()); - - paBuilder.setLocalPref(new LocalPrefBuilder().setPref(100L).build()); - assertEquals(paBuilder.getLocalPref(), attrs.getLocalPref()); - - final MpReachNlri mp = attrs.getAugmentation(PathAttributes1.class).getMpReachNlri(); - assertEquals(mpBuilder.getAfi(), mp.getAfi()); - assertEquals(mpBuilder.getSafi(), mp.getSafi()); - assertEquals(mpBuilder.getCNextHop(), mp.getCNextHop()); - - final DestinationLinkstateBuilder dBuilder = new DestinationLinkstateBuilder(); - dBuilder.setCLinkstateDestination(linkstates); - - mpBuilder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType( - new DestinationLinkstateCaseBuilder().setDestinationLinkstate(dBuilder.build()).build()).build()); - lsBuilder.setMpReachNlri(mpBuilder.build()); - - paBuilder.addAugmentation(PathAttributes1.class, lsBuilder.build()); - - final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.PathAttributes1Builder lsAttrBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.PathAttributes1Builder(); - - lsAttrBuilder.setLinkstatePathAttribute(new LinkstatePathAttributeBuilder().setLinkStateAttribute( - new LinkAttributesCaseBuilder().setLinkAttributes(new LinkAttributesBuilder().setMetric(new Metric(1L)).build()).build()).build()); - paBuilder.addAugmentation( - org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.PathAttributes1.class, - lsAttrBuilder.build()); - - assertEquals( - lsAttrBuilder.build().getLinkstatePathAttribute(), - attrs.getAugmentation( - org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.PathAttributes1.class).getLinkstatePathAttribute()); - - final List dests = ((DestinationLinkstateCase) mp.getAdvertizedRoutes().getDestinationType()).getDestinationLinkstate().getCLinkstateDestination(); - - assertEquals(linkstates.size(), dests.size()); - - assertEquals(linkstates, dests); - // check API message - builder.setPathAttributes(paBuilder.build()); - assertEquals(builder.build(), message); - } - - /* - * TEST BGP Node - * - * 00 00 <- withdrawn routes length - 00 b2 <- total path attribute length (178) - 90 <- attribute flags - 0e <- attribute type code (MP reach) - 00 a0 <- attribute extended length (160) - 40 04 <- AFI (16388 - Linkstate) - 47 <- SAFI (71 - Linkstate) - 04 <- next hop length - 19 19 19 01 - nexthop (25.25.25.1) - 00 <- reserved - - 00 01 <- NLRI type (1 - nodeNLRI) - 00 31 <- NLRI length (49) - 03 <- ProtocolID - OSPF - 00 00 00 00 00 00 00 01 <- identifier - 01 00 <- local node descriptor type (256) - 00 24 <- length (36) - 02 00 <- node descriptor type (member AS - 512) - 00 04 <- length - 00 00 00 64 <- value (100) - 02 01 <- node descriptor type (bgpId - 513) - 00 04 <- length - 19 19 19 01 <- bgpId (25.25.25.1) - 02 02 <- node descriptor type (areaId - 514) - 00 04 <- length - 00 00 00 00 <- value - 02 03 <- node descriptor type (routeId - 515) - 00 08 <- length - 03 03 03 04 0b 0b 0b 03 <- OSPF Router Id - - 00 01 <- NLRI type (1 - nodeNLRI) - 00 2d <- NLRI length (45) - 03 <- ProtocolID - OSPF - 00 00 00 00 00 00 00 01 <- identifier - 01 00 <- local node descriptor type (256) - 00 20 <- length (32) - 02 00 <- node descriptor type (member AS - 512) - 00 04 <- length - 00 00 00 64 <- value (100) - 02 01 <- node descriptor type (bgpId - 513) - 00 04 <- length - 19 19 19 01 <- bgpId (25.25.25.1) - 02 02 <- node descriptor type (areaId - 514) - 00 04 <- length - 00 00 00 00 <- value - 02 03 <- node descriptor type (routeId - 515) - 00 04 <- length - 03 03 03 04 <- OSPF Router Id - - 00 01 <- NLRI type (1 - nodeNLRI) - 00 2d <- NLRI length (45) - 03 <- ProtocolID - OSPF - 00 00 00 00 00 00 00 01 <- identifier - 01 00 <- local node descriptor type (256) - 00 20 <- length (32) - 02 00 <- node descriptor type (member AS - 512) - 00 04 <- length - 00 00 00 64 <- value (100) - 02 01 <- node descriptor type (bgpId - 513) - 00 04 <- length - 19 19 19 01 <- bgpId (25.25.25.1) - 02 02 <- node descriptor type (areaId - 514) - 00 04 <- length - 00 00 00 00 <- value - 02 03 <- node descriptor type (routeId - 515) - 00 04 <- length - 01 01 01 02 <- OSPF Router Id - - 40 <- attribute flags - 01 <- attribute type (Origin) - 01 <- attribute length - 00 <- value (IGP) - 40 <- attribute flags - 02 <- attribute type (AS Path) - 00 <- length - 40 <- attribute flags - 05 <- attribute type (local pref) - 04 <- length - 00 00 00 64 <- value - */ - @Test - public void testBGPNode() throws Exception { - final byte[] body = ByteArray.cutBytes(inputBytes.get(9), MessageUtil.COMMON_HEADER_LENGTH); - final int messageLength = ByteArray.bytesToInt(ByteArray.subByte(inputBytes.get(9), MessageUtil.MARKER_LENGTH, - MessageUtil.LENGTH_FIELD_LENGTH)); - final Update message = BGPParserTest.updateParser.parseMessageBody(Unpooled.copiedBuffer(body), messageLength); - - final UpdateBuilder builder = new UpdateBuilder(); - - // check fields - - assertNull(message.getWithdrawnRoutes()); - - // attributes - - final Ipv4NextHopCase nextHop = new Ipv4NextHopCaseBuilder().setIpv4NextHop( - new Ipv4NextHopBuilder().setGlobal(new Ipv4Address("25.25.25.1")).build()).build(); - - final LocalNodeDescriptorsBuilder lndBuilder = new LocalNodeDescriptorsBuilder().setAsNumber(new AsNumber((long) 100)).setDomainId( - new DomainIdentifier(0x19191901L)).setAreaId( - new AreaIdentifier(0L)); - - final CLinkstateDestinationBuilder clBuilder = new CLinkstateDestinationBuilder(); - clBuilder.setIdentifier(new Identifier(BigInteger.ONE)); - clBuilder.setNlriType(NlriType.Node); - clBuilder.setProtocolId(ProtocolId.Ospf); - - final List linkstates = Lists.newArrayList(); - clBuilder.setLocalNodeDescriptors(lndBuilder.setCRouterIdentifier( - new OspfPseudonodeCaseBuilder().setOspfPseudonode( - new OspfPseudonodeBuilder().setOspfRouterId(0x03030304L).setLanInterface( - new OspfInterfaceIdentifier(0x0b0b0b03L)).build()).build()).build()); - linkstates.add(clBuilder.build()); - - clBuilder.setLocalNodeDescriptors(lndBuilder.setCRouterIdentifier( - new OspfNodeCaseBuilder().setOspfNode(new OspfNodeBuilder().setOspfRouterId(0x03030304L).build()).build()).build()); - linkstates.add(clBuilder.build()); - - clBuilder.setLocalNodeDescriptors(lndBuilder.setCRouterIdentifier( - new OspfNodeCaseBuilder().setOspfNode(new OspfNodeBuilder().setOspfRouterId(0x01010102L).build()).build()).build()); - linkstates.add(clBuilder.build()); - - final PathAttributes1Builder lsBuilder = new PathAttributes1Builder(); - final MpReachNlriBuilder mpBuilder = new MpReachNlriBuilder(); - mpBuilder.setAfi(LinkstateAddressFamily.class); - mpBuilder.setSafi(LinkstateSubsequentAddressFamily.class); - mpBuilder.setCNextHop(nextHop); - - final DestinationLinkstateBuilder dBuilder = new DestinationLinkstateBuilder(); - dBuilder.setCLinkstateDestination(linkstates); - - mpBuilder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType( - new DestinationLinkstateCaseBuilder().setDestinationLinkstate(dBuilder.build()).build()).build()); - lsBuilder.setMpReachNlri(mpBuilder.build()); - - final List asPath = Lists.newArrayList(); - - // check path attributes - final PathAttributes attrs = message.getPathAttributes(); - - final PathAttributesBuilder paBuilder = new PathAttributesBuilder(); - - paBuilder.setOrigin(new OriginBuilder().setValue(BgpOrigin.Igp).build()); - assertEquals(paBuilder.getOrigin(), attrs.getOrigin()); - - paBuilder.setAsPath(new AsPathBuilder().setSegments(asPath).build()); - assertEquals(paBuilder.getAsPath(), attrs.getAsPath()); - - paBuilder.setLocalPref(new LocalPrefBuilder().setPref(100L).build()); - assertEquals(paBuilder.getLocalPref(), attrs.getLocalPref()); - - paBuilder.addAugmentation(PathAttributes1.class, lsBuilder.build()); - - final MpReachNlri mp = attrs.getAugmentation(PathAttributes1.class).getMpReachNlri(); - assertEquals(mpBuilder.getAfi(), mp.getAfi()); - assertEquals(mpBuilder.getSafi(), mp.getSafi()); - assertEquals(mpBuilder.getCNextHop(), mp.getCNextHop()); - - final List dests = ((DestinationLinkstateCase) mp.getAdvertizedRoutes().getDestinationType()).getDestinationLinkstate().getCLinkstateDestination(); - - assertEquals(linkstates.size(), dests.size()); - - assertEquals(linkstates, dests); - - // check API message - builder.setPathAttributes(paBuilder.build()); - assertEquals(builder.build(), message); - } - - /* - * ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff <- marker - * 00 98 <- length (69) - including header - * 01 <- message type - * 04 <- BGP version - * 00 64 <- My AS Number (AS TRANS in this case) - * 00 b4 <- Hold Time - * 00 00 00 00 <- BGP Identifier - * 28 <- Optional Parameters Length - * 02 <- opt. param. type (capabilities) - * 06 <- length - * 01 <- capability code (MP Extensions for BGP4) - * 04 <- length - * 00 01 00 01 <- AFI 1, SAFI 1 - * 02 <- opt. param. type (capabilities) - * 06 <- length - * 01 <- capability code (MP Extensions for BGP4) - * 04 <- length - * 00 02 00 01 <- AFI 2, SAFI 1 - * 02 <- opt. param. type (capabilities) - * 06 <- length - * 01 <- capability code (MP Extensions for BGP4) - * 04 <- length - * 40 04 00 47 <- AFI 16388, SAFI 71 - * 02 <- opt. param. type (capabilities) - * 02 <- length - * 80 <- capability code (private) - * 00 <- length - * 02 <- opt. param. type (capabilities) - * 02 <- length - * 02 <- capability code (Route refresh) - * 00 <- length - * 02 <- opt. param. type (capabilities) - * 06 <- length - * 41 <- capability code (AS4 octet support) - * 04 <- length - * 00 00 00 64 <- AS number - */ - @Test - public void testOpenMessage() throws Exception { - final MessageRegistry msgReg = ServiceLoaderBGPExtensionProviderContext.getSingletonInstance().getMessageRegistry(); - final Open open = (Open) msgReg.parseMessage(Unpooled.copiedBuffer(inputBytes.get(13))); - final Set types = Sets.newHashSet(); - for (final BgpParameters param : open.getBgpParameters()) { - final CParameters p = param.getCParameters(); - if (p instanceof MultiprotocolCase) { - final BgpTableType type = new BgpTableTypeImpl(((MultiprotocolCase) p).getMultiprotocolCapability().getAfi(), ((MultiprotocolCase) p).getMultiprotocolCapability().getSafi()); - types.add(type); - } - } - final Set expected = Sets.newHashSet(); - expected.add(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)); - expected.add(new BgpTableTypeImpl(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class)); - expected.add(new BgpTableTypeImpl(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class)); - assertEquals(expected, types); - } + /** + * Used by other tests as well + */ + static final List inputBytes = new ArrayList(); + + private static int COUNTER = 17; + + private static int MAX_SIZE = 300; + + private static BGPUpdateMessageParser updateParser; + + @BeforeClass + public static void setUp() throws Exception { + updateParser = new BGPUpdateMessageParser(ServiceLoaderBGPExtensionProviderContext.getSingletonInstance().getAttributeRegistry()); + + for (int i = 1; i <= COUNTER; i++) { + final String name = "/up" + i + ".bin"; + final InputStream is = BGPParserTest.class.getResourceAsStream(name); + if (is == null) { + throw new IOException("Failed to get resource " + name); + } + + final ByteArrayOutputStream bis = new ByteArrayOutputStream(); + final byte[] data = new byte[MAX_SIZE]; + int nRead = 0; + while ((nRead = is.read(data, 0, data.length)) != -1) { + bis.write(data, 0, nRead); + } + bis.flush(); + + inputBytes.add(bis.toByteArray()); + } + } + + @Test + public void testResource() { + assertNotNull(inputBytes); + } + + /* + * Tests IPv4 NEXT_HOP, ATOMIC_AGGREGATE, COMMUNITY, NLRI + * + * ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff <- marker + * 00 54 <- length (84) - including header + * 02 <- message type + * 00 00 <- withdrawn routes length + * 00 31 <- total path attribute length (49) + * 40 <- attribute flags + * 01 <- attribute type code (origin) + * 01 <- attribute length + * 00 <- Origin value (IGP) + * 40 <- attribute flags + * 02 <- attribute type code (as path) + * 06 <- attribute length + * 02 <- AS_SEQUENCE + * 01 <- path segment count + * 00 00 fd ea <- path segment value (65002) + * 40 <- attribute flags + * 03 <- attribute type code (Next Hop) + * 04 <- attribute length + * 10 00 00 02 <- value (10.0.0.2) + * 80 <- attribute flags + * 04 <- attribute type code (multi exit disc) + * 04 <- attribute length + * 00 00 00 00 <- value + * 64 <- attribute flags + * 06 <- attribute type code (atomic aggregate) + * 00 <- attribute length + * 64 <- attribute flags + * 08 <- attribute type code (community) + * 10 <- attribute length FF FF FF + * 01 <- value (NO_EXPORT) + * FF FF FF 02 <- value (NO_ADVERTISE) + * FF FF FF 03 <- value (NO_EXPORT_SUBCONFED) + * FF FF FF 10 <- unknown Community + * + * //NLRI + * 18 ac 11 02 <- IPv4 Prefix (172.17.2.0 / 24) + * 18 ac 11 01 <- IPv4 Prefix (172.17.1.0 / 24) + * 18 ac 11 00 <- IPv4 Prefix (172.17.0.0 / 24) + */ + @Test + public void testGetUpdateMessage1() throws Exception { + + final byte[] body = ByteArray.cutBytes(inputBytes.get(0), MessageUtil.COMMON_HEADER_LENGTH); + final int messageLength = ByteArray.bytesToInt(ByteArray.subByte(inputBytes.get(0), MessageUtil.MARKER_LENGTH, + MessageUtil.LENGTH_FIELD_LENGTH)); + final Update message = BGPParserTest.updateParser.parseMessageBody(Unpooled.copiedBuffer(body), messageLength); + + // check fields + + assertNull(message.getWithdrawnRoutes()); + + // attributes + + final List asnums = Lists.newArrayList(new AsSequenceBuilder().setAs(new AsNumber(65002L)).build()); + final List asPath = Lists.newArrayList(); + asPath.add(new SegmentsBuilder().setCSegment( + new AListCaseBuilder().setAList(new AListBuilder().setAsSequence(asnums).build()).build()).build()); + + final Ipv4NextHopCase nextHop = new Ipv4NextHopCaseBuilder().setIpv4NextHop( + new Ipv4NextHopBuilder().setGlobal(new Ipv4Address("10.0.0.2")).build()).build(); + + final List comms = Lists.newArrayList(); + comms.add((Communities) CommunityUtil.NO_EXPORT); + comms.add((Communities) CommunityUtil.NO_ADVERTISE); + comms.add((Communities) CommunityUtil.NO_EXPORT_SUBCONFED); + comms.add((Communities) CommunityUtil.create(NoopReferenceCache.getInstance(), 0xFFFF, 0xFF10)); + + final UpdateBuilder builder = new UpdateBuilder(); + + // check nlri + + final List prefs = Lists.newArrayList(); + prefs.add(new Ipv4Prefix("172.17.2.0/24")); + prefs.add(new Ipv4Prefix("172.17.1.0/24")); + prefs.add(new Ipv4Prefix("172.17.0.0/24")); + + final Nlri nlri = new NlriBuilder().setNlri(prefs).build(); + + assertEquals(nlri, message.getNlri()); + + builder.setNlri(nlri); + + // check path attributes + + final PathAttributes attrs = message.getPathAttributes(); + + final PathAttributesBuilder paBuilder = new PathAttributesBuilder(); + + paBuilder.setOrigin(new OriginBuilder().setValue(BgpOrigin.Igp).build()); + assertEquals(paBuilder.getOrigin(), attrs.getOrigin()); + + paBuilder.setAsPath(new AsPathBuilder().setSegments(asPath).build()); + assertEquals(paBuilder.getAsPath(), attrs.getAsPath()); + + paBuilder.setCNextHop(nextHop); + assertEquals(paBuilder.getCNextHop(), attrs.getCNextHop()); + + paBuilder.setMultiExitDisc(new MultiExitDiscBuilder().setMed((long) 0).build()); + assertEquals(paBuilder.getMultiExitDisc(), attrs.getMultiExitDisc()); + + paBuilder.setAtomicAggregate(new AtomicAggregateBuilder().build()); + assertEquals(paBuilder.getAtomicAggregate(), attrs.getAtomicAggregate()); + + paBuilder.setCommunities(comms); + assertEquals(paBuilder.getCommunities(), attrs.getCommunities()); + + builder.setPathAttributes(paBuilder.build()); + + assertEquals(builder.build(), message); + } + + /* + * Tests IPv6 NEXT_HOP, NLRI, ORIGIN.IGP, MULTI_EXIT_DISC, ORIGINATOR-ID, CLUSTER_LIST. + * + * ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff <- marker + * 00 80 <- length (128) - including header + * 02 <- message type + * 00 00 <- withdrawn routes length + * 00 69 <- total path attribute length (105) + * 40 <- attribute flags + * 01 <- attribute type code (origin) + * 01 <- attribute length + * 00 <- Origin value (IGP) + * 40 <- attribute flags + * 02 <- attribute type code (as path) + * 06 <- attribute length + * 02 <- AS_SEQUENCE + * 01 <- path segment count + * 00 00 fd e9 <- path segment value (65001) + * 80 <- attribute flags + * 04 <- attribute type code (multi exit disc) + * 04 <- attribute length + * 00 00 00 00 <- value + * 80 <- attribute flags + * 09 <- attribute type code (originator id) + * 04 <- attribute length + * 7f 00 00 01 <- value (localhost ip) + * 80 <- attribute flags + * 0a <- attribute type code (cluster list) + * 08 <- attribute length + * 01 02 03 04 <- value + * 05 06 07 08 <- value + * 80 <- attribute flags + * 0e <- attribute type code (mp reach nlri) + * 40 <- attribute length + * 00 02 <- AFI (Ipv6) + * 01 <- SAFI (Unicast) + * 20 <- length of next hop + * 20 01 0d b8 00 00 00 00 00 00 00 00 00 00 00 01 <- global + * fe 80 00 00 00 00 00 00 c0 01 0b ff fe 7e 00 <- link local + * 00 <- reserved + * + * //NLRI + * 40 20 01 0d b8 00 01 00 02 <- IPv6 Prefix (2001:db8:1:2:: / 64) + * 40 20 01 0d b8 00 01 00 01 <- IPv6 Prefix (2001:db8:1:1:: / 64) + * 40 20 01 0d b8 00 01 00 00 <- IPv6 Prefix (2001:db8:1:: / 64) + * + */ + @Test + public void testGetUpdateMessage2() throws Exception { + final byte[] body = ByteArray.cutBytes(inputBytes.get(1), MessageUtil.COMMON_HEADER_LENGTH); + final int messageLength = ByteArray.bytesToInt(ByteArray.subByte(inputBytes.get(1), MessageUtil.MARKER_LENGTH, + MessageUtil.LENGTH_FIELD_LENGTH)); + final Update message = BGPParserTest.updateParser.parseMessageBody(Unpooled.copiedBuffer(body), messageLength); + + // check fields + assertNull(message.getWithdrawnRoutes()); + + final UpdateBuilder builder = new UpdateBuilder(); + + // check NLRI + + final List prefs = Lists.newArrayList(); + prefs.add(new Ipv6Prefix("2001:db8:1:2::/64")); + prefs.add(new Ipv6Prefix("2001:db8:1:1::/64")); + prefs.add(new Ipv6Prefix("2001:db8:1::/64")); + + assertNull(message.getNlri()); + + // attributes + + final List asnums = Lists.newArrayList(new AsSequenceBuilder().setAs(new AsNumber(65001L)).build()); + final List asPath = Lists.newArrayList(); + asPath.add(new SegmentsBuilder().setCSegment( + new AListCaseBuilder().setAList(new AListBuilder().setAsSequence(asnums).build()).build()).build()); + + final Ipv6NextHopCase nextHop = new Ipv6NextHopCaseBuilder().setIpv6NextHop( + new Ipv6NextHopBuilder().setGlobal(new Ipv6Address("2001:db8::1")).setLinkLocal(new Ipv6Address("fe80::c001:bff:fe7e:0")).build()).build(); + + final List clusters = Lists.newArrayList(new ClusterIdentifier(new Ipv4Address("1.2.3.4")), + new ClusterIdentifier(new Ipv4Address("5.6.7.8"))); + + // check path attributes + + final PathAttributes attrs = message.getPathAttributes(); + + final PathAttributesBuilder paBuilder = new PathAttributesBuilder(); + + paBuilder.setOrigin(new OriginBuilder().setValue(BgpOrigin.Igp).build()); + assertEquals(paBuilder.getOrigin(), attrs.getOrigin()); + + paBuilder.setAsPath(new AsPathBuilder().setSegments(asPath).build()); + assertEquals(paBuilder.getAsPath(), attrs.getAsPath()); + + paBuilder.setMultiExitDisc(new MultiExitDiscBuilder().setMed((long) 0).build()); + assertEquals(paBuilder.getMultiExitDisc(), attrs.getMultiExitDisc()); + + paBuilder.setOriginatorId(new Ipv4Address("127.0.0.1")); + assertEquals(paBuilder.getOriginatorId(), attrs.getOriginatorId()); + + paBuilder.setClusterId(clusters); + assertEquals(paBuilder.getClusterId(), attrs.getClusterId()); + + final MpReachNlriBuilder mpBuilder = new MpReachNlriBuilder(); + mpBuilder.setAfi(Ipv6AddressFamily.class); + mpBuilder.setSafi(UnicastSubsequentAddressFamily.class); + mpBuilder.setCNextHop(nextHop); + mpBuilder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType( + new DestinationIpv6CaseBuilder().setDestinationIpv6(new DestinationIpv6Builder().setIpv6Prefixes(prefs).build()).build()).build()); + + paBuilder.addAugmentation(PathAttributes1.class, new PathAttributes1Builder().setMpReachNlri(mpBuilder.build()).build()); + assertEquals(paBuilder.getAugmentation(PathAttributes1.class).getMpReachNlri(), + attrs.getAugmentation(PathAttributes1.class).getMpReachNlri()); + + // check API message + + builder.setPathAttributes(paBuilder.build()); + assertEquals(builder.build(), message); + } + + /* + * Tests more AS Numbers in AS_PATH, AGGREGATOR, ORIGIN.INCOMPLETE + * + * ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff <- marker + * 00 4b <- length (75) - including header + * 02 <- message type + * 00 00 <- withdrawn routes length + * 00 30 <- total path attribute length (48) + * 40 <- attribute flags + * 01 <- attribute type code (origin) + * 01 <- attribute length + * 02 <- Origin value (Incomplete) + * 40 <- attribute flags + * 02 <- attribute type code (as path) + * 10 <- attribute length + * 02 <- AS_SEQUENCE + * 01 <- path segment count + * 00 00 00 1e <- path segment value (30) + * 01 <- AS_SET + * 02 <- path segment count + * 00 00 00 0a <- path segment value (10) + * 00 00 00 14 <- path segment value (20) + * 40 <- attribute flags + * 03 <- attribute type (Next hop) + * 04 <- attribute length + * 0a 00 00 09 <- value (10.0.0.9) + * 80 <- attribute flags + * 04 <- attribute type code (multi exit disc) + * 04 <- attribute length + * 00 00 00 00 <- value + * c0 <- attribute flags + * 07 <- attribute type (Aggregator) + * 08 <- attribute length + * 00 00 00 1e <- value (AS number = 30) + * 0a 00 00 09 <- value (IP address = 10.0.0.9) + * + * //NLRI + * 15 ac 10 00 <- IPv4 Prefix (172.16.0.0 / 21) + */ + @Test + public void testGetUpdateMessage3() throws Exception { + final byte[] body = ByteArray.cutBytes(inputBytes.get(2), MessageUtil.COMMON_HEADER_LENGTH); + final int messageLength = ByteArray.bytesToInt(ByteArray.subByte(inputBytes.get(2), MessageUtil.MARKER_LENGTH, + MessageUtil.LENGTH_FIELD_LENGTH)); + final Update message = BGPParserTest.updateParser.parseMessageBody(Unpooled.copiedBuffer(body), messageLength); + + final UpdateBuilder builder = new UpdateBuilder(); + + // check nlri + final Ipv4Prefix pref1 = new Ipv4Prefix("172.16.0.0/21"); + + final List nlri = Lists.newArrayList(pref1); + builder.setNlri(new NlriBuilder().setNlri(nlri).build()); + assertEquals(builder.getNlri(), message.getNlri()); + + // check fields + assertNull(message.getWithdrawnRoutes()); + + // attributes + final List asnums = Lists.newArrayList(new AsSequenceBuilder().setAs(new AsNumber(30L)).build()); + final List asPath = Lists.newArrayList(); + asPath.add(new SegmentsBuilder().setCSegment( + new AListCaseBuilder().setAList(new AListBuilder().setAsSequence(asnums).build()).build()).build()); + asPath.add(new SegmentsBuilder().setCSegment( + new ASetCaseBuilder().setASet(new ASetBuilder().setAsSet(Lists.newArrayList(new AsNumber(10L), new AsNumber(20L))).build()).build()).build()); + + final Aggregator aggregator = new AggregatorBuilder().setAsNumber(new AsNumber((long) 30)).setNetworkAddress( + new Ipv4Address("10.0.0.9")).build(); + final Ipv4NextHopCase nextHop = new Ipv4NextHopCaseBuilder().setIpv4NextHop( + new Ipv4NextHopBuilder().setGlobal(new Ipv4Address("10.0.0.9")).build()).build(); + + // check path attributes + final PathAttributes attrs = message.getPathAttributes(); + + final PathAttributesBuilder paBuilder = new PathAttributesBuilder(); + + paBuilder.setOrigin(new OriginBuilder().setValue(BgpOrigin.Incomplete).build()); + assertEquals(paBuilder.getOrigin(), attrs.getOrigin()); + + paBuilder.setAsPath(new AsPathBuilder().setSegments(asPath).build()); + assertEquals(paBuilder.getAsPath(), attrs.getAsPath()); + + paBuilder.setCNextHop(nextHop); + assertEquals(paBuilder.getCNextHop(), attrs.getCNextHop()); + + paBuilder.setMultiExitDisc(new MultiExitDiscBuilder().setMed((long) 0).build()); + assertEquals(paBuilder.getMultiExitDisc(), attrs.getMultiExitDisc()); + + paBuilder.setAggregator(aggregator); + assertEquals(paBuilder.getAggregator(), attrs.getAggregator()); + + builder.setPathAttributes(paBuilder.build()); + + assertEquals(builder.build(), message); + } + + /* + * Tests empty AS_PATH, ORIGIN.EGP, LOCAL_PREF, EXTENDED_COMMUNITIES (Ipv4 Addr specific) + * + * ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff <- marker + * 00 4A <- length (73) - including header + * 02 <- message type + * 00 00 <- withdrawn routes length + * 00 27 <- total path attribute length (39) + * 40 <- attribute flags + * 01 <- attribute type code (Origin) + * 01 <- attribute length + * 01 <- Origin value (EGP) + * 40 <- attribute flags + * 02 <- attribute type code (As path) + * 00 <- attribute length + * 40 <- attribute flags + * 03 <- attribute type (Next hop) + * 04 <- attribute length + * 03 03 03 03 <- value (3.3.3.3) + * 80 <- attribute flags + * 04 <- attribute type code (Multi exit disc) + * 04 <- attribute length + * 00 00 00 00 <- value + * 40 <- attribute flags + * 05 <- attribute type (Local Pref) + * 04 <- attribute length + * 00 00 00 64 <- value (100) + * 80 <- attribute flags + * 10 <- attribute type (extended community) + * 08 <- attribute length + * 01 04 <- value (type - Ipv4 Address Specific Extended Community) + * c0 a8 01 00 <- value (global adm. 198.162.1.0) + * 12 34 <- value (local adm. 4660) + * + * //NLRI + * 18 0a 1e 03 <- IPv4 Prefix (10.30.3.0 / 24) + * 18 0a 1e 02 <- IPv4 Prefix (10.30.2.0 / 24) + * 18 0a 1e 01 <- IPv4 Prefix (10.30.1.0 / 24) + */ + @Test + public void testGetUpdateMessage4() throws Exception { + final byte[] body = ByteArray.cutBytes(inputBytes.get(3), MessageUtil.COMMON_HEADER_LENGTH); + final int messageLength = ByteArray.bytesToInt(ByteArray.subByte(inputBytes.get(3), MessageUtil.MARKER_LENGTH, + MessageUtil.LENGTH_FIELD_LENGTH)); + final Update message = BGPParserTest.updateParser.parseMessageBody(Unpooled.copiedBuffer(body), messageLength); + + final UpdateBuilder builder = new UpdateBuilder(); + + // check fields + assertNull(message.getWithdrawnRoutes()); + + // check nlri + final Ipv4Prefix pref1 = new Ipv4Prefix("10.30.3.0/24"); + final Ipv4Prefix pref2 = new Ipv4Prefix("10.30.2.0/24"); + final Ipv4Prefix pref3 = new Ipv4Prefix("10.30.1.0/24"); + + final List nlri = Lists.newArrayList(pref1, pref2, pref3); + builder.setNlri(new NlriBuilder().setNlri(nlri).build()); + assertEquals(builder.getNlri(), message.getNlri()); + + // attributes + final Ipv4NextHopCase nextHop = new Ipv4NextHopCaseBuilder().setIpv4NextHop( + new Ipv4NextHopBuilder().setGlobal(new Ipv4Address("3.3.3.3")).build()).build(); + + final List comms = Lists.newArrayList(); + comms.add(new ExtendedCommunitiesBuilder().setCommType((short) 1).setExtendedCommunity( + new Inet4SpecificExtendedCommunityCaseBuilder().setInet4SpecificExtendedCommunity( + new Inet4SpecificExtendedCommunityBuilder().setTransitive(false).setGlobalAdministrator( + new Ipv4Address("192.168.1.0")).setLocalAdministrator(new byte[] { 0x12, 0x34 }).build()).build()).build()); + + final List asPath = Lists.newArrayList(); + + // check path attributes + final PathAttributes attrs = message.getPathAttributes(); + + final PathAttributesBuilder paBuilder = new PathAttributesBuilder(); + + paBuilder.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build()); + assertEquals(paBuilder.getOrigin(), attrs.getOrigin()); + + paBuilder.setAsPath(new AsPathBuilder().setSegments(asPath).build()); + assertEquals(paBuilder.getAsPath(), attrs.getAsPath()); + + paBuilder.setCNextHop(nextHop); + assertEquals(paBuilder.getCNextHop(), attrs.getCNextHop()); + + paBuilder.setMultiExitDisc(new MultiExitDiscBuilder().setMed((long) 0).build()); + assertEquals(paBuilder.getMultiExitDisc(), attrs.getMultiExitDisc()); + + paBuilder.setLocalPref(new LocalPrefBuilder().setPref(100L).build()); + assertEquals(paBuilder.getLocalPref(), attrs.getLocalPref()); + + paBuilder.setExtendedCommunities(comms); + assertEquals(paBuilder.getExtendedCommunities(), attrs.getExtendedCommunities()); + + // check API message + builder.setPathAttributes(paBuilder.build()); + assertEquals(builder.build(), message); + } + + /* + * Tests withdrawn routes. + * + * ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff <- marker + * 00 1c <- length (28) - including header + * 02 <- message type + * 00 05 <- withdrawn routes length (5) + * 1e ac 10 00 04 <- route (172.16.0.4) + * 00 00 <- total path attribute length + */ + @Test + public void testGetUpdateMessage5() throws Exception { + final byte[] body = ByteArray.cutBytes(inputBytes.get(4), MessageUtil.COMMON_HEADER_LENGTH); + final int messageLength = ByteArray.bytesToInt(ByteArray.subByte(inputBytes.get(4), MessageUtil.MARKER_LENGTH, + MessageUtil.LENGTH_FIELD_LENGTH)); + final Update message = BGPParserTest.updateParser.parseMessageBody(Unpooled.copiedBuffer(body), messageLength); + + // attributes + final List prefs = Lists.newArrayList(new Ipv4Prefix("172.16.0.4/30")); + + // check API message + final Update expectedMessage = new UpdateBuilder().setWithdrawnRoutes( + new WithdrawnRoutesBuilder().setWithdrawnRoutes(prefs).build()).build(); + + assertEquals(expectedMessage.getWithdrawnRoutes(), message.getWithdrawnRoutes()); + } + + /* + * End of Rib for Ipv4. + * + * ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff <- marker + * 00 17 <- length (23) - including header + * 02 <- message type + * 00 00 <- withdrawn routes length + * 00 00 <- total path attribute length + */ + @Test + public void testEORIpv4() throws Exception { + final byte[] body = ByteArray.cutBytes(inputBytes.get(5), MessageUtil.COMMON_HEADER_LENGTH); + final int messageLength = ByteArray.bytesToInt(ByteArray.subByte(inputBytes.get(5), MessageUtil.MARKER_LENGTH, + MessageUtil.LENGTH_FIELD_LENGTH)); + final Update message = BGPParserTest.updateParser.parseMessageBody(Unpooled.copiedBuffer(body), messageLength); + + assertEquals(new UpdateBuilder().build(), message); + } + + /* + * End of Rib for Ipv6 consists of empty MP_UNREACH_NLRI, with AFI 2 and SAFI 1 + * + * ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff <- marker + * 00 1d <- length (29) - including header + * 02 <- message type + * 00 00 <- withdrawn routes length + * 00 06 <- total path attribute length + * 80 <- attribute flags + * 0f <- attribute type (15 - MP_UNREACH_NLRI) + * 03 <- attribute length + * 00 02 <- value (AFI 2: IPv6) + * 01 <- value (SAFI 1) + */ + @Test + public void testEORIpv6() throws Exception { + final byte[] body = ByteArray.cutBytes(inputBytes.get(6), MessageUtil.COMMON_HEADER_LENGTH); + final int messageLength = ByteArray.bytesToInt(ByteArray.subByte(inputBytes.get(6), MessageUtil.MARKER_LENGTH, + MessageUtil.LENGTH_FIELD_LENGTH)); + final Update message = BGPParserTest.updateParser.parseMessageBody(Unpooled.copiedBuffer(body), messageLength); + + final Class afi = message.getPathAttributes().getAugmentation(PathAttributes2.class).getMpUnreachNlri().getAfi(); + final Class safi = message.getPathAttributes().getAugmentation(PathAttributes2.class).getMpUnreachNlri().getSafi(); + + assertEquals(Ipv6AddressFamily.class, afi); + assertEquals(UnicastSubsequentAddressFamily.class, safi); + } + + /* + * End of Rib for LS consists of empty MP_UNREACH_NLRI, with AFI 16388 and SAFI 71 + * + * ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff <- marker + * 00 1d <- length (29) - including header + * 02 <- message type + * 00 00 <- withdrawn routes length + * 00 06 <- total path attribute length + * 80 <- attribute flags + * 0f <- attribute type (15 - MP_UNREACH_NLRI) + * 03 <- attribute length + * 40 04 <- value (AFI 16388: LS) + * 47 <- value (SAFI 71) + */ + @Test + public void testEORLS() throws Exception { + final byte[] body = ByteArray.cutBytes(inputBytes.get(7), MessageUtil.COMMON_HEADER_LENGTH); + final int messageLength = ByteArray.bytesToInt(ByteArray.subByte(inputBytes.get(7), MessageUtil.MARKER_LENGTH, + MessageUtil.LENGTH_FIELD_LENGTH)); + final Update message = BGPParserTest.updateParser.parseMessageBody(Unpooled.copiedBuffer(body), messageLength); + + final Class afi = message.getPathAttributes().getAugmentation(PathAttributes2.class).getMpUnreachNlri().getAfi(); + final Class safi = message.getPathAttributes().getAugmentation(PathAttributes2.class).getMpUnreachNlri().getSafi(); + + assertEquals(LinkstateAddressFamily.class, afi); + assertEquals(LinkstateSubsequentAddressFamily.class, safi); + } + + /* + * Tests BGP Link Ipv4 + * + * 00 00 <- withdrawn routes length + * 01 48 <- total path attribute length (328) + * 90 <- attribute flags + 0e <- attribute type code (MP reach) + 01 2c <- attribute extended length (300) + 40 04 <- AFI (16388 - Linkstate) + 47 <- SAFI (71 - Linkstate) + 04 <- next hop length + 19 19 19 01 <- nexthop (25.25.25.1) + 00 <- reserved + + 00 02 <- NLRI type (2 - linkNLRI) + 00 5d <- NLRI length (93) + 03 <- ProtocolID - OSPF + 00 00 00 00 00 00 00 01 <- identifier + + 01 00 <- local node descriptor type (256) + 00 24 <- length (36) + 02 00 <- node descriptor type (member AS - 512) + 00 04 <- length + 00 00 00 64 <- value (100) + 02 01 <- node descriptor type (bgpId - 513) + 00 04 <- length + 19 19 19 01 <- bgpId (25.25.25.1) + 02 02 <- node descriptor type (areaId - 514) + 00 04 <- length + 00 00 00 00 <- value + 02 03 <- node descriptor type (routeId - 515) + 00 08 <- length + 03 03 03 04 0b 0b 0b 03 <- OSPF Router Id + + 01 01 <- remote node descriptor type (257) + 00 20 <- length (32) + 02 00 <- node descriptor type (member AS - 512) + 00 04 <- length + 00 00 00 64 <- value (100) + 02 01 <- node descriptor type (bgpId - 513) + 00 04 <- length + 19 19 19 01 <- bgpId (25.25.25.1) + 02 02 <- node descriptor type (areaId - 514) + 00 04 <- length + 00 00 00 00 <- value + 02 03 <- node descriptor type (routeId - 515) + 00 04 <- length + 03 03 03 04 <- OSPF Router Id + + 01 03 <- link descriptor type (IPv4 interface address - 259) + 00 04 <- length (4) + 0b 0b 0b 03 <- value (11.11.11.3) + + 00 02 <- NLRI type (2 - linkNLRI) + 00 5d <- NLRI length (93) + 03 <- ProtocolID - OSPF + 00 00 00 00 00 00 00 01 <- identifier + + 01 00 <- local node descriptor type (256) + 00 24 <- length (36) + 02 00 <- node descriptor type (member AS - 512) + 00 04 <- length + 00 00 00 64 <- value (100) + 02 01 <- node descriptor type (bgpId - 513) + 00 04 <- length + 19 19 19 01 <- bgpId (25.25.25.1) + 02 02 <- node descriptor type (areaId - 514) + 00 04 <- length + 00 00 00 00 <- value + 02 03 <- node descriptor type (routeId - 515) + 00 08 <- length + 03 03 03 04 0b 0b 0b 03 <- OSPF Router Id + + 01 01 <- remote node descriptor type (257) + 00 20 <- length (32) + 02 00 <- node descriptor type (member AS - 512) + 00 04 <- length + 00 00 00 64 <- value (100) + 02 01 <- node descriptor type (bgpId - 513) + 00 04 <- length + 19 19 19 01 <- bgpId (25.25.25.1) + 02 02 <- node descriptor type (areaId - 514) + 00 04 <- length + 00 00 00 00 <- value + 02 03 <- node descriptor type (routeId - 515) + 00 04 <- length + 01 01 01 02 <- OSPF Router Id + + 01 03 <- link descriptor type (IPv4 interface address - 259) + 00 04 <- length + 0b 0b 0b 01 <- value (11.11.11.1) + + 00 02 <- NLRI type (2 - linkNLRI) + 00 5d <- NLRI length (93) + 03 <- ProtocolID - OSPF + 00 00 00 00 00 00 00 01 <- identifier + + 01 00 <- local node descriptor type (256) + 00 20 <- length (32) + 02 00 <- node descriptor type (member AS - 512) + 00 04 <- length + 00 00 00 64 <- value (100) + 02 01 <- node descriptor type (bgpId - 513) + 00 04 <- length + 19 19 19 01 <- bgpId (25.25.25.1) + 02 02 <- node descriptor type (areaId - 514) + 00 04 <- length + 00 00 00 00 <- value + 02 03 <- node descriptor type (routeId - 515) + 00 04 <- length + 01 01 01 02 <- OSPF Router Id + + 01 01 <- remote node descriptor type (257) + 00 24 <- length (36) + 02 00 <- node descriptor type (member AS - 512) + 00 04 <- length + 00 00 00 64 <- value (100) + 02 01 <- node descriptor type (bgpId - 513) + 00 04 <- length + 19 19 19 01 <- bgpId (25.25.25.1) + 02 02 <- node descriptor type (areaId - 514) + 00 04 <- length + 00 00 00 00 <- value + 02 03 <- node descriptor type (routeId - 515) + 00 08 <- length + 03 03 03 04 0b 0b 0b 03 <- OSPF Router Id + + 01 03 <- link descriptor type (IPv4 interface address - 259) + 00 04 <- length + 0b 0b 0b 01 <- value (11.11.11.1) + + 40 <- attribute flags + 01 <- attribute type (Origin) + 01 <- attribute length + 00 <- value (IGP) + 40 <- attribute flags + 02 <- attribute type (AS Path) + 00 <- length + 40 <- attribute flags + 05 <- attribute type (local pref) + 04 <- length + 00 00 00 64 <- value + c0 <- attribute flags + 63 <- attribute type (Link STATE - 99) + 07 <- length + 04 47 <- link attribute (1095 - Metric) + 00 03 <- length + 00 00 01 <- value + */ + @Test + public void testBGPLink() throws Exception { + final byte[] body = ByteArray.cutBytes(inputBytes.get(8), MessageUtil.COMMON_HEADER_LENGTH); + final int messageLength = ByteArray.bytesToInt(ByteArray.subByte(inputBytes.get(8), MessageUtil.MARKER_LENGTH, + MessageUtil.LENGTH_FIELD_LENGTH)); + final Update message = BGPParserTest.updateParser.parseMessageBody(Unpooled.copiedBuffer(body), messageLength); + + final UpdateBuilder builder = new UpdateBuilder(); + + // check fields + + assertNull(message.getWithdrawnRoutes()); + + final Ipv4NextHopCase nextHop = new Ipv4NextHopCaseBuilder().setIpv4NextHop( + new Ipv4NextHopBuilder().setGlobal(new Ipv4Address("25.25.25.1")).build()).build(); + + final List asPath = Lists.newArrayList(); + + final LocalNodeDescriptorsBuilder lndBuilder = new LocalNodeDescriptorsBuilder().setAsNumber(new AsNumber((long) 100)).setDomainId( + new DomainIdentifier(0x19191901L)).setAreaId(new AreaIdentifier(0L)); + + final RemoteNodeDescriptorsBuilder rndBuilder = new RemoteNodeDescriptorsBuilder().setAsNumber(new AsNumber((long) 100)).setDomainId( + new DomainIdentifier(0x19191901L)).setAreaId(new AreaIdentifier(0L)); + + final CLinkstateDestinationBuilder clBuilder = new CLinkstateDestinationBuilder(); + clBuilder.setIdentifier(new Identifier(BigInteger.ONE)); + clBuilder.setNlriType(NlriType.Link); + clBuilder.setProtocolId(ProtocolId.Ospf); + + final PathAttributes1Builder lsBuilder = new PathAttributes1Builder(); + final MpReachNlriBuilder mpBuilder = new MpReachNlriBuilder(); + mpBuilder.setAfi(LinkstateAddressFamily.class); + mpBuilder.setSafi(LinkstateSubsequentAddressFamily.class); + mpBuilder.setCNextHop(nextHop); + + final List linkstates = Lists.newArrayList(); + clBuilder.setLocalNodeDescriptors(lndBuilder.setCRouterIdentifier( + new OspfPseudonodeCaseBuilder().setOspfPseudonode( + new OspfPseudonodeBuilder().setOspfRouterId(0x03030304L).setLanInterface(new OspfInterfaceIdentifier(0x0b0b0b03L)).build()).build()).build()); + clBuilder.setRemoteNodeDescriptors(rndBuilder.setCRouterIdentifier( + new OspfNodeCaseBuilder().setOspfNode(new OspfNodeBuilder().setOspfRouterId(0x03030304L).build()).build()).build()); + clBuilder.setLinkDescriptors(new LinkDescriptorsBuilder().setIpv4InterfaceAddress( + new Ipv4InterfaceIdentifier(new Ipv4Address("11.11.11.3"))).build()); + linkstates.add(clBuilder.build()); + + clBuilder.setLocalNodeDescriptors(lndBuilder.setCRouterIdentifier( + new OspfPseudonodeCaseBuilder().setOspfPseudonode( + new OspfPseudonodeBuilder().setOspfRouterId(0x03030304L).setLanInterface(new OspfInterfaceIdentifier(0x0b0b0b03L)).build()).build()).build()); + clBuilder.setRemoteNodeDescriptors(rndBuilder.setCRouterIdentifier( + new OspfNodeCaseBuilder().setOspfNode(new OspfNodeBuilder().setOspfRouterId(0x01010102L).build()).build()).build()); + clBuilder.setLinkDescriptors(new LinkDescriptorsBuilder().setIpv4InterfaceAddress( + new Ipv4InterfaceIdentifier(new Ipv4Address("11.11.11.1"))).build()); + linkstates.add(clBuilder.build()); + + clBuilder.setLocalNodeDescriptors(lndBuilder.setCRouterIdentifier( + new OspfNodeCaseBuilder().setOspfNode(new OspfNodeBuilder().setOspfRouterId(0x01010102L).build()).build()).build()); + clBuilder.setRemoteNodeDescriptors(rndBuilder.setCRouterIdentifier( + new OspfPseudonodeCaseBuilder().setOspfPseudonode( + new OspfPseudonodeBuilder().setOspfRouterId(0x03030304L).setLanInterface(new OspfInterfaceIdentifier(0x0b0b0b03L)).build()).build()).build()); + clBuilder.setLinkDescriptors(new LinkDescriptorsBuilder().setIpv4InterfaceAddress( + new Ipv4InterfaceIdentifier(new Ipv4Address("11.11.11.1"))).build()); + linkstates.add(clBuilder.build()); + + lsBuilder.setMpReachNlri(mpBuilder.build()); + + // check path attributes + final PathAttributes attrs = message.getPathAttributes(); + + final PathAttributesBuilder paBuilder = new PathAttributesBuilder(); + + paBuilder.setOrigin(new OriginBuilder().setValue(BgpOrigin.Igp).build()); + assertEquals(paBuilder.getOrigin(), attrs.getOrigin()); + + paBuilder.setAsPath(new AsPathBuilder().setSegments(asPath).build()); + assertEquals(paBuilder.getAsPath(), attrs.getAsPath()); + + paBuilder.setLocalPref(new LocalPrefBuilder().setPref(100L).build()); + assertEquals(paBuilder.getLocalPref(), attrs.getLocalPref()); + + final MpReachNlri mp = attrs.getAugmentation(PathAttributes1.class).getMpReachNlri(); + assertEquals(mpBuilder.getAfi(), mp.getAfi()); + assertEquals(mpBuilder.getSafi(), mp.getSafi()); + assertEquals(mpBuilder.getCNextHop(), mp.getCNextHop()); + + final DestinationLinkstateBuilder dBuilder = new DestinationLinkstateBuilder(); + dBuilder.setCLinkstateDestination(linkstates); + + mpBuilder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType( + new DestinationLinkstateCaseBuilder().setDestinationLinkstate(dBuilder.build()).build()).build()); + lsBuilder.setMpReachNlri(mpBuilder.build()); + + paBuilder.addAugmentation(PathAttributes1.class, lsBuilder.build()); + + final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.PathAttributes1Builder lsAttrBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.PathAttributes1Builder(); + + lsAttrBuilder.setLinkstatePathAttribute(new LinkstatePathAttributeBuilder().setLinkStateAttribute( + new LinkAttributesCaseBuilder().setLinkAttributes(new LinkAttributesBuilder().setMetric(new Metric(1L)).build()).build()).build()); + paBuilder.addAugmentation( + org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.PathAttributes1.class, + lsAttrBuilder.build()); + + assertEquals( + lsAttrBuilder.build().getLinkstatePathAttribute(), + attrs.getAugmentation( + org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.PathAttributes1.class).getLinkstatePathAttribute()); + + final List dests = ((DestinationLinkstateCase) mp.getAdvertizedRoutes().getDestinationType()).getDestinationLinkstate().getCLinkstateDestination(); + + assertEquals(linkstates.size(), dests.size()); + + assertEquals(linkstates, dests); + // check API message + builder.setPathAttributes(paBuilder.build()); + assertEquals(builder.build(), message); + } + + /* + * TEST BGP Node + * + * 00 00 <- withdrawn routes length + 00 b2 <- total path attribute length (178) + 90 <- attribute flags + 0e <- attribute type code (MP reach) + 00 a0 <- attribute extended length (160) + 40 04 <- AFI (16388 - Linkstate) + 47 <- SAFI (71 - Linkstate) + 04 <- next hop length + 19 19 19 01 - nexthop (25.25.25.1) + 00 <- reserved + + 00 01 <- NLRI type (1 - nodeNLRI) + 00 31 <- NLRI length (49) + 03 <- ProtocolID - OSPF + 00 00 00 00 00 00 00 01 <- identifier + 01 00 <- local node descriptor type (256) + 00 24 <- length (36) + 02 00 <- node descriptor type (member AS - 512) + 00 04 <- length + 00 00 00 64 <- value (100) + 02 01 <- node descriptor type (bgpId - 513) + 00 04 <- length + 19 19 19 01 <- bgpId (25.25.25.1) + 02 02 <- node descriptor type (areaId - 514) + 00 04 <- length + 00 00 00 00 <- value + 02 03 <- node descriptor type (routeId - 515) + 00 08 <- length + 03 03 03 04 0b 0b 0b 03 <- OSPF Router Id + + 00 01 <- NLRI type (1 - nodeNLRI) + 00 2d <- NLRI length (45) + 03 <- ProtocolID - OSPF + 00 00 00 00 00 00 00 01 <- identifier + 01 00 <- local node descriptor type (256) + 00 20 <- length (32) + 02 00 <- node descriptor type (member AS - 512) + 00 04 <- length + 00 00 00 64 <- value (100) + 02 01 <- node descriptor type (bgpId - 513) + 00 04 <- length + 19 19 19 01 <- bgpId (25.25.25.1) + 02 02 <- node descriptor type (areaId - 514) + 00 04 <- length + 00 00 00 00 <- value + 02 03 <- node descriptor type (routeId - 515) + 00 04 <- length + 03 03 03 04 <- OSPF Router Id + + 00 01 <- NLRI type (1 - nodeNLRI) + 00 2d <- NLRI length (45) + 03 <- ProtocolID - OSPF + 00 00 00 00 00 00 00 01 <- identifier + 01 00 <- local node descriptor type (256) + 00 20 <- length (32) + 02 00 <- node descriptor type (member AS - 512) + 00 04 <- length + 00 00 00 64 <- value (100) + 02 01 <- node descriptor type (bgpId - 513) + 00 04 <- length + 19 19 19 01 <- bgpId (25.25.25.1) + 02 02 <- node descriptor type (areaId - 514) + 00 04 <- length + 00 00 00 00 <- value + 02 03 <- node descriptor type (routeId - 515) + 00 04 <- length + 01 01 01 02 <- OSPF Router Id + + 40 <- attribute flags + 01 <- attribute type (Origin) + 01 <- attribute length + 00 <- value (IGP) + 40 <- attribute flags + 02 <- attribute type (AS Path) + 00 <- length + 40 <- attribute flags + 05 <- attribute type (local pref) + 04 <- length + 00 00 00 64 <- value + */ + @Test + public void testBGPNode() throws Exception { + final byte[] body = ByteArray.cutBytes(inputBytes.get(9), MessageUtil.COMMON_HEADER_LENGTH); + final int messageLength = ByteArray.bytesToInt(ByteArray.subByte(inputBytes.get(9), MessageUtil.MARKER_LENGTH, + MessageUtil.LENGTH_FIELD_LENGTH)); + final Update message = BGPParserTest.updateParser.parseMessageBody(Unpooled.copiedBuffer(body), messageLength); + + final UpdateBuilder builder = new UpdateBuilder(); + + // check fields + + assertNull(message.getWithdrawnRoutes()); + + // attributes + + final Ipv4NextHopCase nextHop = new Ipv4NextHopCaseBuilder().setIpv4NextHop( + new Ipv4NextHopBuilder().setGlobal(new Ipv4Address("25.25.25.1")).build()).build(); + + final LocalNodeDescriptorsBuilder lndBuilder = new LocalNodeDescriptorsBuilder().setAsNumber(new AsNumber((long) 100)).setDomainId( + new DomainIdentifier(0x19191901L)).setAreaId(new AreaIdentifier(0L)); + + final CLinkstateDestinationBuilder clBuilder = new CLinkstateDestinationBuilder(); + clBuilder.setIdentifier(new Identifier(BigInteger.ONE)); + clBuilder.setNlriType(NlriType.Node); + clBuilder.setProtocolId(ProtocolId.Ospf); + + final List linkstates = Lists.newArrayList(); + clBuilder.setLocalNodeDescriptors(lndBuilder.setCRouterIdentifier( + new OspfPseudonodeCaseBuilder().setOspfPseudonode( + new OspfPseudonodeBuilder().setOspfRouterId(0x03030304L).setLanInterface(new OspfInterfaceIdentifier(0x0b0b0b03L)).build()).build()).build()); + linkstates.add(clBuilder.build()); + + clBuilder.setLocalNodeDescriptors(lndBuilder.setCRouterIdentifier( + new OspfNodeCaseBuilder().setOspfNode(new OspfNodeBuilder().setOspfRouterId(0x03030304L).build()).build()).build()); + linkstates.add(clBuilder.build()); + + clBuilder.setLocalNodeDescriptors(lndBuilder.setCRouterIdentifier( + new OspfNodeCaseBuilder().setOspfNode(new OspfNodeBuilder().setOspfRouterId(0x01010102L).build()).build()).build()); + linkstates.add(clBuilder.build()); + + final PathAttributes1Builder lsBuilder = new PathAttributes1Builder(); + final MpReachNlriBuilder mpBuilder = new MpReachNlriBuilder(); + mpBuilder.setAfi(LinkstateAddressFamily.class); + mpBuilder.setSafi(LinkstateSubsequentAddressFamily.class); + mpBuilder.setCNextHop(nextHop); + + final DestinationLinkstateBuilder dBuilder = new DestinationLinkstateBuilder(); + dBuilder.setCLinkstateDestination(linkstates); + + mpBuilder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType( + new DestinationLinkstateCaseBuilder().setDestinationLinkstate(dBuilder.build()).build()).build()); + lsBuilder.setMpReachNlri(mpBuilder.build()); + + final List asPath = Lists.newArrayList(); + + // check path attributes + final PathAttributes attrs = message.getPathAttributes(); + + final PathAttributesBuilder paBuilder = new PathAttributesBuilder(); + + paBuilder.setOrigin(new OriginBuilder().setValue(BgpOrigin.Igp).build()); + assertEquals(paBuilder.getOrigin(), attrs.getOrigin()); + + paBuilder.setAsPath(new AsPathBuilder().setSegments(asPath).build()); + assertEquals(paBuilder.getAsPath(), attrs.getAsPath()); + + paBuilder.setLocalPref(new LocalPrefBuilder().setPref(100L).build()); + assertEquals(paBuilder.getLocalPref(), attrs.getLocalPref()); + + paBuilder.addAugmentation(PathAttributes1.class, lsBuilder.build()); + + final MpReachNlri mp = attrs.getAugmentation(PathAttributes1.class).getMpReachNlri(); + assertEquals(mpBuilder.getAfi(), mp.getAfi()); + assertEquals(mpBuilder.getSafi(), mp.getSafi()); + assertEquals(mpBuilder.getCNextHop(), mp.getCNextHop()); + + final List dests = ((DestinationLinkstateCase) mp.getAdvertizedRoutes().getDestinationType()).getDestinationLinkstate().getCLinkstateDestination(); + + assertEquals(linkstates.size(), dests.size()); + + assertEquals(linkstates, dests); + + // check API message + builder.setPathAttributes(paBuilder.build()); + assertEquals(builder.build(), message); + } + + /* + * ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff <- marker + * 00 98 <- length (69) - including header + * 01 <- message type + * 04 <- BGP version + * 00 64 <- My AS Number (AS TRANS in this case) + * 00 b4 <- Hold Time + * 00 00 00 00 <- BGP Identifier + * 28 <- Optional Parameters Length + * 02 <- opt. param. type (capabilities) + * 06 <- length + * 01 <- capability code (MP Extensions for BGP4) + * 04 <- length + * 00 01 00 01 <- AFI 1, SAFI 1 + * 02 <- opt. param. type (capabilities) + * 06 <- length + * 01 <- capability code (MP Extensions for BGP4) + * 04 <- length + * 00 02 00 01 <- AFI 2, SAFI 1 + * 02 <- opt. param. type (capabilities) + * 06 <- length + * 01 <- capability code (MP Extensions for BGP4) + * 04 <- length + * 40 04 00 47 <- AFI 16388, SAFI 71 + * 02 <- opt. param. type (capabilities) + * 02 <- length + * 80 <- capability code (private) + * 00 <- length + * 02 <- opt. param. type (capabilities) + * 02 <- length + * 02 <- capability code (Route refresh) + * 00 <- length + * 02 <- opt. param. type (capabilities) + * 06 <- length + * 41 <- capability code (AS4 octet support) + * 04 <- length + * 00 00 00 64 <- AS number + */ + @Test + public void testOpenMessage() throws Exception { + final MessageRegistry msgReg = ServiceLoaderBGPExtensionProviderContext.getSingletonInstance().getMessageRegistry(); + final Open open = (Open) msgReg.parseMessage(Unpooled.copiedBuffer(inputBytes.get(13))); + final Set types = Sets.newHashSet(); + for (final BgpParameters param : open.getBgpParameters()) { + final CParameters p = param.getCParameters(); + if (p instanceof MultiprotocolCase) { + final BgpTableType type = new BgpTableTypeImpl(((MultiprotocolCase) p).getMultiprotocolCapability().getAfi(), ((MultiprotocolCase) p).getMultiprotocolCapability().getSafi()); + types.add(type); + } + } + final Set expected = Sets.newHashSet(); + expected.add(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)); + expected.add(new BgpTableTypeImpl(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class)); + expected.add(new BgpTableTypeImpl(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class)); + assertEquals(expected, types); + } } diff --git a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/CommunityTest.java b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/CommunityTest.java index b3c157d2c3..da87a9c4eb 100644 --- a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/CommunityTest.java +++ b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/CommunityTest.java @@ -17,42 +17,42 @@ import org.opendaylight.protocol.util.NoopReferenceCache; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Community; public class CommunityTest { - final CommunityUtil util = new CommunityUtil(NoopReferenceCache.getInstance()); + final CommunityUtil util = new CommunityUtil(NoopReferenceCache.getInstance()); - @Test - public void testCommunity() { - util.create(10, 222); - final Community c = util.create(12, 12); - assertEquals(12, c.getAsNumber().getValue().intValue()); - assertEquals(12, c.getSemantics().intValue()); - } + @Test + public void testCommunity() { + util.create(10, 222); + final Community c = util.create(12, 12); + assertEquals(12, c.getAsNumber().getValue().intValue()); + assertEquals(12, c.getSemantics().intValue()); + } - @Test - public void testOverflows() { - try { - util.create(10, -2); - fail("Semantics under range."); - } catch (final IllegalArgumentException e) { - assertEquals("Invalid range: -2, expected: [[0‥65535]].", e.getMessage()); - } - try { - util.create(10, 65536); - fail("Semantics above range."); - } catch (final IllegalArgumentException e) { - assertEquals("Invalid range: 65536, expected: [[0‥65535]].", e.getMessage()); - } - } + @Test + public void testOverflows() { + try { + util.create(10, -2); + fail("Semantics under range."); + } catch (final IllegalArgumentException e) { + assertEquals("Invalid range: -2, expected: [[0‥65535]].", e.getMessage()); + } + try { + util.create(10, 65536); + fail("Semantics above range."); + } catch (final IllegalArgumentException e) { + assertEquals("Invalid range: 65536, expected: [[0‥65535]].", e.getMessage()); + } + } - @Test - public void testToString() { - final Community c = util.create(10, 222); - assertNotNull(c.toString()); - } + @Test + public void testToString() { + final Community c = util.create(10, 222); + assertNotNull(c.toString()); + } - @Test - public void testValueOf() { - final Community comm = util.valueOf("12:50"); - assertEquals(12, comm.getAsNumber().getValue().intValue()); - assertEquals(50, comm.getSemantics().intValue()); - } + @Test + public void testValueOf() { + final Community comm = util.valueOf("12:50"); + assertEquals(12, comm.getAsNumber().getValue().intValue()); + assertEquals(50, comm.getSemantics().intValue()); + } } diff --git a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/ComplementaryTest.java b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/ComplementaryTest.java index 18afa96fe5..288d42e54b 100644 --- a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/ComplementaryTest.java +++ b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/ComplementaryTest.java @@ -12,6 +12,9 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.fail; + +import com.google.common.collect.Maps; + import io.netty.buffer.Unpooled; import java.util.Map; @@ -57,209 +60,206 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.route.origin.extended.community._case.RouteOriginExtendedCommunityBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.extended.community.extended.community.route.target.extended.community._case.RouteTargetExtendedCommunityBuilder; -import com.google.common.collect.Maps; - public class ComplementaryTest { - private final ReferenceCache ref = NoopReferenceCache.getInstance(); + private final ReferenceCache ref = NoopReferenceCache.getInstance(); - @Test - public void testBGPParameter() { - - final BgpTableType t = new BgpTableTypeImpl(LinkstateAddressFamily.class, UnicastSubsequentAddressFamily.class); - final BgpTableType t1 = new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); - - final MultiprotocolCapability cap = new MultiprotocolCapabilityBuilder().setAfi(LinkstateAddressFamily.class).setSafi( - UnicastSubsequentAddressFamily.class).build(); - final CParameters tlv1 = new MultiprotocolCaseBuilder().setMultiprotocolCapability(cap).build(); - - final MultiprotocolCapability cap1 = new MultiprotocolCapabilityBuilder().setAfi(Ipv4AddressFamily.class).setSafi( - UnicastSubsequentAddressFamily.class).build(); - final CParameters tlv2 = new MultiprotocolCaseBuilder().setMultiprotocolCapability(cap1).build(); - - final Map tt = Maps.newHashMap(); - tt.put(t, true); - tt.put(t1, false); - - // FIXME: BUG-196: revive test for graceful capability tlv - // final BGPParameter tlv3 = new GracefulCapability(false, 0, tt); - - final CParameters tlv4 = new As4BytesCaseBuilder().setAs4BytesCapability( - new As4BytesCapabilityBuilder().setAsNumber(new AsNumber((long) 40)).build()).build(); - - // assertFalse(((GracefulCapability) tlv3).isRestartFlag()); - - // assertEquals(0, ((GracefulCapability) tlv3).getRestartTimerValue()); - - assertFalse(tlv1.equals(tlv2)); - - // assertNotSame(tlv1.hashCode(), tlv3.hashCode()); - - // assertNotSame(tlv2.toString(), tlv3.toString()); - - // assertEquals(((GracefulCapability) tlv3).getTableTypes(), tt); - - assertEquals(cap.getSafi(), cap1.getSafi()); - - assertNotSame(cap.getAfi(), cap1.getAfi()); - - assertEquals(40, ((As4BytesCase) tlv4).getAs4BytesCapability().getAsNumber().getValue().longValue()); - - assertEquals( - new As4BytesCaseBuilder().setAs4BytesCapability( - new As4BytesCapabilityBuilder().setAsNumber(new AsNumber((long) 40)).build()).build(), tlv4); - } - - @Test - public void testBGPAggregatorImpl() { - final BgpAggregator ipv4 = new AggregatorBuilder().setAsNumber(new AsNumber((long) 5524)).setNetworkAddress( - new Ipv4Address("124.55.42.1")).build(); - final BgpAggregator ipv4i = new AggregatorBuilder().setAsNumber(new AsNumber((long) 5525)).setNetworkAddress( - new Ipv4Address("124.55.42.1")).build(); - - assertNotSame(ipv4.hashCode(), ipv4i.hashCode()); - - assertNotSame(ipv4.getAsNumber(), ipv4i.getAsNumber()); - - assertEquals(ipv4.getNetworkAddress(), ipv4i.getNetworkAddress()); - } - - @Test - public void testCommunitiesParser() { - ExtendedCommunities as = null; - try { - as = CommunitiesParser.parseExtendedCommunity(this.ref, Unpooled.copiedBuffer(new byte[] { 0, 5, 0, 54, 0, 0, 1, 76 })); - } catch (final BGPDocumentedException e1) { - fail("Not expected exception: " + e1); - } - AsSpecificExtendedCommunityCase expected = new AsSpecificExtendedCommunityCaseBuilder().setAsSpecificExtendedCommunity( - new AsSpecificExtendedCommunityBuilder().setTransitive(false).setGlobalAdministrator(new ShortAsNumber(54L)).setLocalAdministrator( - new byte[] { 0, 0, 1, 76 }).build()).build(); - AsSpecificExtendedCommunityCase result = (AsSpecificExtendedCommunityCase) as.getExtendedCommunity(); - assertEquals(expected.getAsSpecificExtendedCommunity().isTransitive(), result.getAsSpecificExtendedCommunity().isTransitive()); - assertEquals(expected.getAsSpecificExtendedCommunity().getGlobalAdministrator(), - result.getAsSpecificExtendedCommunity().getGlobalAdministrator()); - assertArrayEquals(expected.getAsSpecificExtendedCommunity().getLocalAdministrator(), - result.getAsSpecificExtendedCommunity().getLocalAdministrator()); - assertEquals(0, as.getCommType().intValue()); - - try { - as = CommunitiesParser.parseExtendedCommunity(this.ref, Unpooled.copiedBuffer(new byte[] { 40, 5, 0, 54, 0, 0, 1, 76 })); - } catch (final BGPDocumentedException e1) { - fail("Not expected exception: " + e1); - } - expected = new AsSpecificExtendedCommunityCaseBuilder().setAsSpecificExtendedCommunity( - new AsSpecificExtendedCommunityBuilder().setTransitive(true).setGlobalAdministrator(new ShortAsNumber(54L)).setLocalAdministrator( - new byte[] { 0, 0, 1, 76 }).build()).build(); - result = (AsSpecificExtendedCommunityCase) as.getExtendedCommunity(); - assertEquals(expected.getAsSpecificExtendedCommunity().isTransitive(), result.getAsSpecificExtendedCommunity().isTransitive()); - assertEquals(40, as.getCommType().intValue()); - - ExtendedCommunities rtc = null; - try { - rtc = CommunitiesParser.parseExtendedCommunity(this.ref, Unpooled.copiedBuffer(new byte[] { 1, 2, 0, 35, 4, 2, 8, 7 })); - } catch (final BGPDocumentedException e1) { - fail("Not expected exception: " + e1); - } - final RouteTargetExtendedCommunityCase rexpected = new RouteTargetExtendedCommunityCaseBuilder().setRouteTargetExtendedCommunity( - new RouteTargetExtendedCommunityBuilder().setGlobalAdministrator(new ShortAsNumber(35L)).setLocalAdministrator( - new byte[] { 4, 2, 8, 7 }).build()).build(); - final RouteTargetExtendedCommunityCase rresult = (RouteTargetExtendedCommunityCase) rtc.getExtendedCommunity(); - assertEquals(rexpected.getRouteTargetExtendedCommunity().getGlobalAdministrator(), - rresult.getRouteTargetExtendedCommunity().getGlobalAdministrator()); - assertArrayEquals(rexpected.getRouteTargetExtendedCommunity().getLocalAdministrator(), - rresult.getRouteTargetExtendedCommunity().getLocalAdministrator()); - assertEquals(1, rtc.getCommType().intValue()); - assertEquals(2, rtc.getCommSubType().intValue()); - - ExtendedCommunities roc = null; - try { - roc = CommunitiesParser.parseExtendedCommunity(this.ref, Unpooled.copiedBuffer(new byte[] { 0, 3, 0, 24, 4, 2, 8, 7 })); - } catch (final BGPDocumentedException e1) { - fail("Not expected exception: " + e1); - } - final RouteOriginExtendedCommunityCase oexpected = new RouteOriginExtendedCommunityCaseBuilder().setRouteOriginExtendedCommunity( - new RouteOriginExtendedCommunityBuilder().setGlobalAdministrator(new ShortAsNumber(24L)).setLocalAdministrator( - new byte[] { 4, 2, 8, 7 }).build()).build(); - final RouteOriginExtendedCommunityCase oresult = (RouteOriginExtendedCommunityCase) roc.getExtendedCommunity(); - assertEquals(oexpected.getRouteOriginExtendedCommunity().getGlobalAdministrator(), - oresult.getRouteOriginExtendedCommunity().getGlobalAdministrator()); - assertArrayEquals(oexpected.getRouteOriginExtendedCommunity().getLocalAdministrator(), - oresult.getRouteOriginExtendedCommunity().getLocalAdministrator()); - assertEquals(0, roc.getCommType().intValue()); - assertEquals(3, roc.getCommSubType().intValue()); - - ExtendedCommunities sec = null; - try { - sec = CommunitiesParser.parseExtendedCommunity(this.ref, Unpooled.copiedBuffer(new byte[] { 41, 6, 12, 51, 2, 5, 21, 45 })); - } catch (final BGPDocumentedException e1) { - fail("Not expected exception: " + e1); - } - final Inet4SpecificExtendedCommunityCase iexpected = new Inet4SpecificExtendedCommunityCaseBuilder().setInet4SpecificExtendedCommunity( - new Inet4SpecificExtendedCommunityBuilder().setTransitive(true).setGlobalAdministrator(new Ipv4Address("12.51.2.5")).setLocalAdministrator( - new byte[] { 21, 45 }).build()).build(); - final Inet4SpecificExtendedCommunityCase iresult = (Inet4SpecificExtendedCommunityCase) sec.getExtendedCommunity(); - assertEquals(iexpected.getInet4SpecificExtendedCommunity().isTransitive(), - iresult.getInet4SpecificExtendedCommunity().isTransitive()); - assertEquals(iexpected.getInet4SpecificExtendedCommunity().getGlobalAdministrator(), - iresult.getInet4SpecificExtendedCommunity().getGlobalAdministrator()); - assertArrayEquals(iexpected.getInet4SpecificExtendedCommunity().getLocalAdministrator(), - iresult.getInet4SpecificExtendedCommunity().getLocalAdministrator()); - assertEquals(41, sec.getCommType().intValue()); - - ExtendedCommunities oec = null; - try { - oec = CommunitiesParser.parseExtendedCommunity(this.ref, Unpooled.copiedBuffer(new byte[] { 3, 6, 21, 45, 5, 4, 3, 1 })); - } catch (final BGPDocumentedException e1) { - fail("Not expected exception: " + e1); - } - final OpaqueExtendedCommunityCase oeexpected = new OpaqueExtendedCommunityCaseBuilder().setOpaqueExtendedCommunity( - new OpaqueExtendedCommunityBuilder().setTransitive(false).setValue(new byte[] { 21, 45, 5, 4, 3, 1 }).build()).build(); - final OpaqueExtendedCommunityCase oeresult = (OpaqueExtendedCommunityCase) oec.getExtendedCommunity(); - assertEquals(oeexpected.getOpaqueExtendedCommunity().isTransitive(), oeresult.getOpaqueExtendedCommunity().isTransitive()); - assertArrayEquals(oeexpected.getOpaqueExtendedCommunity().getValue(), oeresult.getOpaqueExtendedCommunity().getValue()); - assertEquals(3, oec.getCommType().intValue()); - - try { - oec = CommunitiesParser.parseExtendedCommunity(this.ref, Unpooled.copiedBuffer(new byte[] { 43, 6, 21, 45, 5, 4, 3, 1 })); - } catch (final BGPDocumentedException e1) { - fail("Not expected exception: " + e1); - } - final OpaqueExtendedCommunityCase oeexpected1 = new OpaqueExtendedCommunityCaseBuilder().setOpaqueExtendedCommunity( - new OpaqueExtendedCommunityBuilder().setTransitive(true).setValue(new byte[] { 21, 45, 5, 4, 3, 1 }).build()).build(); - final OpaqueExtendedCommunityCase oeresult1 = (OpaqueExtendedCommunityCase) oec.getExtendedCommunity(); - assertEquals(oeexpected1.getOpaqueExtendedCommunity().isTransitive(), oeresult1.getOpaqueExtendedCommunity().isTransitive()); - assertArrayEquals(oeexpected1.getOpaqueExtendedCommunity().getValue(), oeresult1.getOpaqueExtendedCommunity().getValue()); - assertEquals(43, oec.getCommType().intValue()); - - try { - CommunitiesParser.parseExtendedCommunity(this.ref, Unpooled.copiedBuffer(new byte[] { 11, 11, 21, 45, 5, 4, 3, 1 })); - fail("Exception should have occured."); - } catch (final BGPDocumentedException e) { - assertEquals("Could not parse Extended Community type: 11", e.getMessage()); - } - } - - @Test - public void testBGPHeaderParser() throws Exception { - final MessageRegistry msgReg = ServiceLoaderBGPExtensionProviderContext.getSingletonInstance().getMessageRegistry(); - try { - msgReg.parseMessage(Unpooled.copiedBuffer(new byte[] { (byte) 0, (byte) 0 })); - fail("Exception should have occured."); - } catch (final IllegalArgumentException e) { - assertEquals("Too few bytes in passed array. Passed: 2. Expected: >= 19.", e.getMessage()); - } - } - - @Test - public void testMessageParser() throws Exception { - final MessageRegistry msgReg = ServiceLoaderBGPExtensionProviderContext.getSingletonInstance().getMessageRegistry(); - String ex = ""; - try { - msgReg.serializeMessage(null); - } catch (final NullPointerException e) { - ex = e.getMessage(); - } - assertEquals("BGPMessage is mandatory.", ex); - } + @Test + public void testBGPParameter() { + + final BgpTableType t = new BgpTableTypeImpl(LinkstateAddressFamily.class, UnicastSubsequentAddressFamily.class); + final BgpTableType t1 = new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); + + final MultiprotocolCapability cap = new MultiprotocolCapabilityBuilder().setAfi(LinkstateAddressFamily.class).setSafi( + UnicastSubsequentAddressFamily.class).build(); + final CParameters tlv1 = new MultiprotocolCaseBuilder().setMultiprotocolCapability(cap).build(); + + final MultiprotocolCapability cap1 = new MultiprotocolCapabilityBuilder().setAfi(Ipv4AddressFamily.class).setSafi( + UnicastSubsequentAddressFamily.class).build(); + final CParameters tlv2 = new MultiprotocolCaseBuilder().setMultiprotocolCapability(cap1).build(); + + final Map tt = Maps.newHashMap(); + tt.put(t, true); + tt.put(t1, false); + + // FIXME: BUG-196: revive test for graceful capability tlv + // final BGPParameter tlv3 = new GracefulCapability(false, 0, tt); + + final CParameters tlv4 = new As4BytesCaseBuilder().setAs4BytesCapability( + new As4BytesCapabilityBuilder().setAsNumber(new AsNumber((long) 40)).build()).build(); + + // assertFalse(((GracefulCapability) tlv3).isRestartFlag()); + + // assertEquals(0, ((GracefulCapability) tlv3).getRestartTimerValue()); + + assertFalse(tlv1.equals(tlv2)); + + // assertNotSame(tlv1.hashCode(), tlv3.hashCode()); + + // assertNotSame(tlv2.toString(), tlv3.toString()); + + // assertEquals(((GracefulCapability) tlv3).getTableTypes(), tt); + + assertEquals(cap.getSafi(), cap1.getSafi()); + + assertNotSame(cap.getAfi(), cap1.getAfi()); + + assertEquals(40, ((As4BytesCase) tlv4).getAs4BytesCapability().getAsNumber().getValue().longValue()); + + assertEquals(new As4BytesCaseBuilder().setAs4BytesCapability( + new As4BytesCapabilityBuilder().setAsNumber(new AsNumber((long) 40)).build()).build(), tlv4); + } + + @Test + public void testBGPAggregatorImpl() { + final BgpAggregator ipv4 = new AggregatorBuilder().setAsNumber(new AsNumber((long) 5524)).setNetworkAddress( + new Ipv4Address("124.55.42.1")).build(); + final BgpAggregator ipv4i = new AggregatorBuilder().setAsNumber(new AsNumber((long) 5525)).setNetworkAddress( + new Ipv4Address("124.55.42.1")).build(); + + assertNotSame(ipv4.hashCode(), ipv4i.hashCode()); + + assertNotSame(ipv4.getAsNumber(), ipv4i.getAsNumber()); + + assertEquals(ipv4.getNetworkAddress(), ipv4i.getNetworkAddress()); + } + + @Test + public void testCommunitiesParser() { + ExtendedCommunities as = null; + try { + as = CommunitiesParser.parseExtendedCommunity(this.ref, Unpooled.copiedBuffer(new byte[] { 0, 5, 0, 54, 0, 0, 1, 76 })); + } catch (final BGPDocumentedException e1) { + fail("Not expected exception: " + e1); + } + AsSpecificExtendedCommunityCase expected = new AsSpecificExtendedCommunityCaseBuilder().setAsSpecificExtendedCommunity( + new AsSpecificExtendedCommunityBuilder().setTransitive(false).setGlobalAdministrator(new ShortAsNumber(54L)).setLocalAdministrator( + new byte[] { 0, 0, 1, 76 }).build()).build(); + AsSpecificExtendedCommunityCase result = (AsSpecificExtendedCommunityCase) as.getExtendedCommunity(); + assertEquals(expected.getAsSpecificExtendedCommunity().isTransitive(), result.getAsSpecificExtendedCommunity().isTransitive()); + assertEquals(expected.getAsSpecificExtendedCommunity().getGlobalAdministrator(), + result.getAsSpecificExtendedCommunity().getGlobalAdministrator()); + assertArrayEquals(expected.getAsSpecificExtendedCommunity().getLocalAdministrator(), + result.getAsSpecificExtendedCommunity().getLocalAdministrator()); + assertEquals(0, as.getCommType().intValue()); + + try { + as = CommunitiesParser.parseExtendedCommunity(this.ref, Unpooled.copiedBuffer(new byte[] { 40, 5, 0, 54, 0, 0, 1, 76 })); + } catch (final BGPDocumentedException e1) { + fail("Not expected exception: " + e1); + } + expected = new AsSpecificExtendedCommunityCaseBuilder().setAsSpecificExtendedCommunity( + new AsSpecificExtendedCommunityBuilder().setTransitive(true).setGlobalAdministrator(new ShortAsNumber(54L)).setLocalAdministrator( + new byte[] { 0, 0, 1, 76 }).build()).build(); + result = (AsSpecificExtendedCommunityCase) as.getExtendedCommunity(); + assertEquals(expected.getAsSpecificExtendedCommunity().isTransitive(), result.getAsSpecificExtendedCommunity().isTransitive()); + assertEquals(40, as.getCommType().intValue()); + + ExtendedCommunities rtc = null; + try { + rtc = CommunitiesParser.parseExtendedCommunity(this.ref, Unpooled.copiedBuffer(new byte[] { 1, 2, 0, 35, 4, 2, 8, 7 })); + } catch (final BGPDocumentedException e1) { + fail("Not expected exception: " + e1); + } + final RouteTargetExtendedCommunityCase rexpected = new RouteTargetExtendedCommunityCaseBuilder().setRouteTargetExtendedCommunity( + new RouteTargetExtendedCommunityBuilder().setGlobalAdministrator(new ShortAsNumber(35L)).setLocalAdministrator( + new byte[] { 4, 2, 8, 7 }).build()).build(); + final RouteTargetExtendedCommunityCase rresult = (RouteTargetExtendedCommunityCase) rtc.getExtendedCommunity(); + assertEquals(rexpected.getRouteTargetExtendedCommunity().getGlobalAdministrator(), + rresult.getRouteTargetExtendedCommunity().getGlobalAdministrator()); + assertArrayEquals(rexpected.getRouteTargetExtendedCommunity().getLocalAdministrator(), + rresult.getRouteTargetExtendedCommunity().getLocalAdministrator()); + assertEquals(1, rtc.getCommType().intValue()); + assertEquals(2, rtc.getCommSubType().intValue()); + + ExtendedCommunities roc = null; + try { + roc = CommunitiesParser.parseExtendedCommunity(this.ref, Unpooled.copiedBuffer(new byte[] { 0, 3, 0, 24, 4, 2, 8, 7 })); + } catch (final BGPDocumentedException e1) { + fail("Not expected exception: " + e1); + } + final RouteOriginExtendedCommunityCase oexpected = new RouteOriginExtendedCommunityCaseBuilder().setRouteOriginExtendedCommunity( + new RouteOriginExtendedCommunityBuilder().setGlobalAdministrator(new ShortAsNumber(24L)).setLocalAdministrator( + new byte[] { 4, 2, 8, 7 }).build()).build(); + final RouteOriginExtendedCommunityCase oresult = (RouteOriginExtendedCommunityCase) roc.getExtendedCommunity(); + assertEquals(oexpected.getRouteOriginExtendedCommunity().getGlobalAdministrator(), + oresult.getRouteOriginExtendedCommunity().getGlobalAdministrator()); + assertArrayEquals(oexpected.getRouteOriginExtendedCommunity().getLocalAdministrator(), + oresult.getRouteOriginExtendedCommunity().getLocalAdministrator()); + assertEquals(0, roc.getCommType().intValue()); + assertEquals(3, roc.getCommSubType().intValue()); + + ExtendedCommunities sec = null; + try { + sec = CommunitiesParser.parseExtendedCommunity(this.ref, Unpooled.copiedBuffer(new byte[] { 41, 6, 12, 51, 2, 5, 21, 45 })); + } catch (final BGPDocumentedException e1) { + fail("Not expected exception: " + e1); + } + final Inet4SpecificExtendedCommunityCase iexpected = new Inet4SpecificExtendedCommunityCaseBuilder().setInet4SpecificExtendedCommunity( + new Inet4SpecificExtendedCommunityBuilder().setTransitive(true).setGlobalAdministrator(new Ipv4Address("12.51.2.5")).setLocalAdministrator( + new byte[] { 21, 45 }).build()).build(); + final Inet4SpecificExtendedCommunityCase iresult = (Inet4SpecificExtendedCommunityCase) sec.getExtendedCommunity(); + assertEquals(iexpected.getInet4SpecificExtendedCommunity().isTransitive(), + iresult.getInet4SpecificExtendedCommunity().isTransitive()); + assertEquals(iexpected.getInet4SpecificExtendedCommunity().getGlobalAdministrator(), + iresult.getInet4SpecificExtendedCommunity().getGlobalAdministrator()); + assertArrayEquals(iexpected.getInet4SpecificExtendedCommunity().getLocalAdministrator(), + iresult.getInet4SpecificExtendedCommunity().getLocalAdministrator()); + assertEquals(41, sec.getCommType().intValue()); + + ExtendedCommunities oec = null; + try { + oec = CommunitiesParser.parseExtendedCommunity(this.ref, Unpooled.copiedBuffer(new byte[] { 3, 6, 21, 45, 5, 4, 3, 1 })); + } catch (final BGPDocumentedException e1) { + fail("Not expected exception: " + e1); + } + final OpaqueExtendedCommunityCase oeexpected = new OpaqueExtendedCommunityCaseBuilder().setOpaqueExtendedCommunity( + new OpaqueExtendedCommunityBuilder().setTransitive(false).setValue(new byte[] { 21, 45, 5, 4, 3, 1 }).build()).build(); + final OpaqueExtendedCommunityCase oeresult = (OpaqueExtendedCommunityCase) oec.getExtendedCommunity(); + assertEquals(oeexpected.getOpaqueExtendedCommunity().isTransitive(), oeresult.getOpaqueExtendedCommunity().isTransitive()); + assertArrayEquals(oeexpected.getOpaqueExtendedCommunity().getValue(), oeresult.getOpaqueExtendedCommunity().getValue()); + assertEquals(3, oec.getCommType().intValue()); + + try { + oec = CommunitiesParser.parseExtendedCommunity(this.ref, Unpooled.copiedBuffer(new byte[] { 43, 6, 21, 45, 5, 4, 3, 1 })); + } catch (final BGPDocumentedException e1) { + fail("Not expected exception: " + e1); + } + final OpaqueExtendedCommunityCase oeexpected1 = new OpaqueExtendedCommunityCaseBuilder().setOpaqueExtendedCommunity( + new OpaqueExtendedCommunityBuilder().setTransitive(true).setValue(new byte[] { 21, 45, 5, 4, 3, 1 }).build()).build(); + final OpaqueExtendedCommunityCase oeresult1 = (OpaqueExtendedCommunityCase) oec.getExtendedCommunity(); + assertEquals(oeexpected1.getOpaqueExtendedCommunity().isTransitive(), oeresult1.getOpaqueExtendedCommunity().isTransitive()); + assertArrayEquals(oeexpected1.getOpaqueExtendedCommunity().getValue(), oeresult1.getOpaqueExtendedCommunity().getValue()); + assertEquals(43, oec.getCommType().intValue()); + + try { + CommunitiesParser.parseExtendedCommunity(this.ref, Unpooled.copiedBuffer(new byte[] { 11, 11, 21, 45, 5, 4, 3, 1 })); + fail("Exception should have occured."); + } catch (final BGPDocumentedException e) { + assertEquals("Could not parse Extended Community type: 11", e.getMessage()); + } + } + + @Test + public void testBGPHeaderParser() throws Exception { + final MessageRegistry msgReg = ServiceLoaderBGPExtensionProviderContext.getSingletonInstance().getMessageRegistry(); + try { + msgReg.parseMessage(Unpooled.copiedBuffer(new byte[] { (byte) 0, (byte) 0 })); + fail("Exception should have occured."); + } catch (final IllegalArgumentException e) { + assertEquals("Too few bytes in passed array. Passed: 2. Expected: >= 19.", e.getMessage()); + } + } + + @Test + public void testMessageParser() throws Exception { + final MessageRegistry msgReg = ServiceLoaderBGPExtensionProviderContext.getSingletonInstance().getMessageRegistry(); + String ex = ""; + try { + msgReg.serializeMessage(null); + } catch (final NullPointerException e) { + ex = e.getMessage(); + } + assertEquals("BGPMessage is mandatory.", ex); + } } diff --git a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/IPv4NextHopTest.java b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/IPv4NextHopTest.java index 093f6d8b51..75eb4d01d0 100644 --- a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/IPv4NextHopTest.java +++ b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/IPv4NextHopTest.java @@ -17,16 +17,16 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type public class IPv4NextHopTest { - private Ipv4NextHop nextHop; + private Ipv4NextHop nextHop; - @Before - public void init() { - this.nextHop = new Ipv4NextHopBuilder().setGlobal(new Ipv4Address("10.0.0.1")).build(); - } + @Before + public void init() { + this.nextHop = new Ipv4NextHopBuilder().setGlobal(new Ipv4Address("10.0.0.1")).build(); + } - @Test - public void testGetGlobal() { - final Ipv4Address address = new Ipv4Address("10.0.0.1"); - assertEquals(address, this.nextHop.getGlobal()); - } + @Test + public void testGetGlobal() { + final Ipv4Address address = new Ipv4Address("10.0.0.1"); + assertEquals(address, this.nextHop.getGlobal()); + } } diff --git a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/IPv6NextHopTest.java b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/IPv6NextHopTest.java index e42a8ba49a..0a99a9178e 100644 --- a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/IPv6NextHopTest.java +++ b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/IPv6NextHopTest.java @@ -18,29 +18,29 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type public class IPv6NextHopTest { - private Ipv6NextHop nextHopA; - private Ipv6NextHop nextHopB; - - @Before - public void init() { - this.nextHopA = new Ipv6NextHopBuilder().setGlobal(new Ipv6Address("2001:db8:85a3:0:0:8a2e:370:7331")).build(); - this.nextHopB = new Ipv6NextHopBuilder().setGlobal(new Ipv6Address("2001:db8:85a3:0:0:8a2e:370:7331")).setLinkLocal( - new Ipv6Address("2001:db8:85a3:0:0:8a2e:370:0000")).build(); - } - - @Test - public void testGetGlobal() { - final Ipv6Address globalTestAddress = new Ipv6Address("2001:db8:85a3:0:0:8a2e:370:7331"); - - assertEquals(this.nextHopA.getGlobal(), globalTestAddress); - assertEquals(this.nextHopB.getGlobal(), globalTestAddress); - } - - @Test - public void testGetLinkLocal() { - final Ipv6Address localTestAddress = new Ipv6Address("2001:db8:85a3:0:0:8a2e:370:0000"); - - assertNull(this.nextHopA.getLinkLocal()); - assertEquals(this.nextHopB.getLinkLocal(), localTestAddress); - } + private Ipv6NextHop nextHopA; + private Ipv6NextHop nextHopB; + + @Before + public void init() { + this.nextHopA = new Ipv6NextHopBuilder().setGlobal(new Ipv6Address("2001:db8:85a3:0:0:8a2e:370:7331")).build(); + this.nextHopB = new Ipv6NextHopBuilder().setGlobal(new Ipv6Address("2001:db8:85a3:0:0:8a2e:370:7331")).setLinkLocal( + new Ipv6Address("2001:db8:85a3:0:0:8a2e:370:0000")).build(); + } + + @Test + public void testGetGlobal() { + final Ipv6Address globalTestAddress = new Ipv6Address("2001:db8:85a3:0:0:8a2e:370:7331"); + + assertEquals(this.nextHopA.getGlobal(), globalTestAddress); + assertEquals(this.nextHopB.getGlobal(), globalTestAddress); + } + + @Test + public void testGetLinkLocal() { + final Ipv6Address localTestAddress = new Ipv6Address("2001:db8:85a3:0:0:8a2e:370:0000"); + + assertNull(this.nextHopA.getLinkLocal()); + assertEquals(this.nextHopB.getLinkLocal(), localTestAddress); + } } diff --git a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/OpenTest.java b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/OpenTest.java index cba188b722..0808482a2f 100644 --- a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/OpenTest.java +++ b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/OpenTest.java @@ -9,6 +9,8 @@ package org.opendaylight.protocol.bgp.parser.impl; import static org.junit.Assert.assertArrayEquals; +import com.google.common.collect.Lists; + import java.util.List; import org.junit.Test; @@ -24,24 +26,21 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mess import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.c.parameters.As4BytesCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.c.parameters.as4.bytes._case.As4BytesCapabilityBuilder; -import com.google.common.collect.Lists; - public class OpenTest { - private final byte[] result = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0x00, (byte) 0x25, (byte) 0x01, (byte) 0x04, (byte) 0x00, (byte) 0x1e, (byte) 0x00, (byte) 0x03, (byte) 0x7f, - (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x08, (byte) 0x02, (byte) 0x06, (byte) 0x41, (byte) 0x04, (byte) 0x00, - (byte) 0x00, (byte) 0x03, (byte) 0xe8 }; + private final byte[] result = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0x00, + (byte) 0x25, (byte) 0x01, (byte) 0x04, (byte) 0x00, (byte) 0x1e, (byte) 0x00, (byte) 0x03, (byte) 0x7f, (byte) 0x00, (byte) 0x00, + (byte) 0x01, (byte) 0x08, (byte) 0x02, (byte) 0x06, (byte) 0x41, (byte) 0x04, (byte) 0x00, (byte) 0x00, (byte) 0x03, (byte) 0xe8 }; - @Test - public void testSerializeOpen() throws Exception { - final List tlvs = Lists.newArrayList(); - tlvs.add(new BgpParametersBuilder().setCParameters( - new As4BytesCaseBuilder().setAs4BytesCapability(new As4BytesCapabilityBuilder().setAsNumber(new AsNumber(1000L)).build()).build()).build()); - final Open open = new OpenBuilder().setBgpIdentifier(new Ipv4Address("127.0.0.1")).setMyAsNumber(30).setHoldTimer(3).setVersion( - new ProtocolVersion((short) 4)).setBgpParameters(tlvs).build(); - final byte[] msg = new BGPOpenMessageParser(ServiceLoaderBGPExtensionProviderContext.getSingletonInstance().getParameterRegistry()).serializeMessage(open); - assertArrayEquals(this.result, msg); - } + @Test + public void testSerializeOpen() throws Exception { + final List tlvs = Lists.newArrayList(); + tlvs.add(new BgpParametersBuilder().setCParameters( + new As4BytesCaseBuilder().setAs4BytesCapability(new As4BytesCapabilityBuilder().setAsNumber(new AsNumber(1000L)).build()).build()).build()); + final Open open = new OpenBuilder().setBgpIdentifier(new Ipv4Address("127.0.0.1")).setMyAsNumber(30).setHoldTimer(3).setVersion( + new ProtocolVersion((short) 4)).setBgpParameters(tlvs).build(); + final byte[] msg = new BGPOpenMessageParser(ServiceLoaderBGPExtensionProviderContext.getSingletonInstance().getParameterRegistry()).serializeMessage(open); + assertArrayEquals(this.result, msg); + } } diff --git a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/ParserTest.java b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/ParserTest.java index f8150ac9a4..99e53ccf20 100644 --- a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/ParserTest.java +++ b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/ParserTest.java @@ -14,6 +14,10 @@ import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.junit.matchers.JUnitMatchers.containsString; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + import io.netty.buffer.Unpooled; import java.net.UnknownHostException; @@ -49,253 +53,248 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily; import org.opendaylight.yangtools.yang.binding.Notification; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; - public class ParserTest { - public static final byte[] openBMsg = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0xff, (byte) 0x00, (byte) 0x1d, (byte) 0x01, (byte) 0x04, (byte) 0x00, (byte) 0x64, (byte) 0x00, (byte) 0xb4, - (byte) 0x14, (byte) 0x14, (byte) 0x14, (byte) 0x14, (byte) 0x00 }; - - public static final byte[] keepAliveBMsg = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0xff, (byte) 0x00, (byte) 0x13, (byte) 0x04 }; - - public static final byte[] notificationBMsg = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0xff, (byte) 0xff, (byte) 0x00, (byte) 0x17, (byte) 0x03, (byte) 0x02, (byte) 0x04, (byte) 0x04, (byte) 0x09 }; - - public static final byte[] openWithCpblt1 = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0xff, (byte) 0x00, (byte) 0x2d, (byte) 0x01, (byte) 0x04, (byte) 0x00, (byte) 0x48, (byte) 0x00, (byte) 0xb4, - (byte) 0xac, (byte) 0x14, (byte) 0xa0, (byte) 0xaa, (byte) 0x10, (byte) 0x02, (byte) 0x06, (byte) 0x01, (byte) 0x04, - (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x06, (byte) 0x01, (byte) 0x04, (byte) 0x40, - (byte) 0x04, (byte) 0x00, (byte) 0x47 }; - - public static final byte[] openWithCpblt2 = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0xff, (byte) 0x00, (byte) 0x2d, (byte) 0x01, (byte) 0x04, (byte) 0x00, (byte) 0x48, (byte) 0x00, (byte) 0xb4, - (byte) 0xac, (byte) 0x14, (byte) 0xa0, (byte) 0xaa, (byte) 0x10, (byte) 0x02, (byte) 0x06, (byte) 0x01, (byte) 0x04, - (byte) 0x40, (byte) 0x04, (byte) 0x00, (byte) 0x47, (byte) 0x02, (byte) 0x06, (byte) 0x01, (byte) 0x04, (byte) 0x00, - (byte) 0x01, (byte) 0x00, (byte) 0x01 }; - - static MessageRegistry reg; - - @BeforeClass - public static void setupClass() throws Exception { - reg = ServiceLoaderBGPExtensionProviderContext.getSingletonInstance().getMessageRegistry(); - } - - @Test - public void testHeaderErrors() throws BGPParsingException, BGPDocumentedException { - byte[] wrong = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0x00 }; - wrong = ByteArray.cutBytes(wrong, 16); - try { - ParserTest.reg.parseMessage(Unpooled.copiedBuffer(wrong)); - fail("Exception should have occcured."); - } catch (final IllegalArgumentException e) { - assertEquals("Too few bytes in passed array. Passed: " + wrong.length + ". Expected: >= 19.", e.getMessage()); - return; - } - fail(); - } - - @Test - public void testBadMsgType() throws BGPParsingException { - final byte[] bytes = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0x00, (byte) 0x13, (byte) 0x08 }; - try { - ParserTest.reg.parseMessage(Unpooled.copiedBuffer(bytes)); - fail("Exception should have occured."); - } catch (final BGPDocumentedException e) { - assertEquals(BGPError.BAD_MSG_TYPE, e.getError()); - return; - } - fail(); - } - - @Test - public void testKeepAliveMsg() throws BGPParsingException, BGPDocumentedException { - final Notification keepAlive = new KeepaliveBuilder().build(); - final byte[] bytes = ParserTest.reg.serializeMessage(keepAlive); - assertArrayEquals(keepAliveBMsg, bytes); - - final Notification m = ParserTest.reg.parseMessage(Unpooled.copiedBuffer(bytes)); - - assertTrue(m instanceof Keepalive); - } - - @Test - public void testBadKeepAliveMsg() throws BGPParsingException { - final byte[] bytes = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0x00, (byte) 0x14, (byte) 0x04, (byte) 0x05 }; - - try { - ParserTest.reg.parseMessage(Unpooled.copiedBuffer(bytes)); - fail("Exception should have occured."); - } catch (final BGPDocumentedException e) { - assertThat(e.getMessage(), containsString("Message length field not within valid range.")); - assertEquals(BGPError.BAD_MSG_LENGTH, e.getError()); - return; - } - fail(); - } - - @Test - public void testOpenMessage() throws UnknownHostException, BGPParsingException, BGPDocumentedException { - final Notification open = new OpenBuilder().setMyAsNumber(100).setHoldTimer(180).setBgpIdentifier(new Ipv4Address("20.20.20.20")).setVersion( - new ProtocolVersion((short) 4)).build(); - final byte[] bytes = ParserTest.reg.serializeMessage(open); - assertArrayEquals(openBMsg, bytes); - - final Notification m = ParserTest.reg.parseMessage(Unpooled.copiedBuffer(bytes)); - - assertTrue(m instanceof Open); - assertEquals(100, ((Open) m).getMyAsNumber().intValue()); - assertEquals(180, ((Open) m).getHoldTimer().intValue()); - assertEquals(new Ipv4Address("20.20.20.20"), ((Open) m).getBgpIdentifier()); - assertTrue(((Open) m).getBgpParameters().isEmpty()); - } - - @Test - public void testBadHoldTimeError() throws BGPParsingException { - final byte[] bMsg = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0x00, (byte) 0x1d, (byte) 0x01, (byte) 0x04, (byte) 0x00, (byte) 0x64, (byte) 0x00, (byte) 0x01, (byte) 0x14, - (byte) 0x14, (byte) 0x14, (byte) 0x14, (byte) 0x00 }; - - try { - ParserTest.reg.parseMessage(Unpooled.copiedBuffer(bMsg)); - fail("Exception should have occured."); - } catch (final BGPDocumentedException e) { - assertEquals("Hold time value not acceptable.", e.getMessage()); - assertEquals(BGPError.HOLD_TIME_NOT_ACC, e.getError()); - return; - } - fail(); - } - - @Test - public void testBadMsgLength() throws BGPParsingException { - final byte[] bMsg = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0x00, (byte) 0x1b, (byte) 0x01, (byte) 0x04, (byte) 0x00, (byte) 0x64, (byte) 0x00, (byte) 0xb4, (byte) 0xff, - (byte) 0xff, (byte) 0xff }; - - try { - ParserTest.reg.parseMessage(Unpooled.copiedBuffer(bMsg)); - fail("Exception should have occured."); - } catch (final BGPDocumentedException e) { - assertEquals("Open message too small.", e.getMessage()); - assertEquals(BGPError.BAD_MSG_LENGTH, e.getError()); - } - } - - @Test - public void testBadVersion() throws BGPParsingException { - final byte[] bMsg = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0x00, (byte) 0x1d, (byte) 0x01, (byte) 0x08, (byte) 0x00, (byte) 0x64, (byte) 0x00, (byte) 0xb4, (byte) 0x14, - (byte) 0x14, (byte) 0x14, (byte) 0x14, (byte) 0x00 }; - - try { - ParserTest.reg.parseMessage(Unpooled.copiedBuffer(bMsg)); - fail("Exception should have occured."); - } catch (final BGPDocumentedException e) { - assertEquals("BGP Protocol version 8 not supported.", e.getMessage()); - assertEquals(BGPError.VERSION_NOT_SUPPORTED, e.getError()); - return; - } - fail(); - } - - @Test - public void testNotificationMsg() throws BGPParsingException, BGPDocumentedException { - Notification notMsg = new NotifyBuilder().setErrorCode(BGPError.OPT_PARAM_NOT_SUPPORTED.getCode()).setErrorSubcode( - BGPError.OPT_PARAM_NOT_SUPPORTED.getSubcode()).setData(new byte[] { 4, 9 }).build(); - byte[] bytes = ParserTest.reg.serializeMessage(notMsg); - assertArrayEquals(notificationBMsg, bytes); - - Notification m = ParserTest.reg.parseMessage(Unpooled.copiedBuffer(bytes)); - - assertTrue(m instanceof Notify); - assertEquals(BGPError.OPT_PARAM_NOT_SUPPORTED, BGPError.forValue(((Notify) m).getErrorCode(), ((Notify) m).getErrorSubcode())); - assertArrayEquals(new byte[] { 4, 9 }, ((Notify) m).getData()); - - notMsg = new NotifyBuilder().setErrorCode(BGPError.CONNECTION_NOT_SYNC.getCode()).setErrorSubcode( - BGPError.CONNECTION_NOT_SYNC.getSubcode()).build(); - bytes = ParserTest.reg.serializeMessage(notMsg); - - m = ParserTest.reg.parseMessage(Unpooled.copiedBuffer(bytes)); - - assertTrue(m instanceof Notify); - assertEquals(BGPError.CONNECTION_NOT_SYNC, BGPError.forValue(((Notify) m).getErrorCode(), ((Notify) m).getErrorSubcode())); - assertNull(((Notify) m).getData()); - } - - @Test - public void testWrongLength() throws BGPParsingException { - final byte[] bMsg = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0x00, (byte) 0x14, (byte) 0x03, (byte) 0x02 }; - - try { - ParserTest.reg.parseMessage(Unpooled.copiedBuffer(bMsg)); - fail("Exception should have occured."); - } catch (final BGPDocumentedException e) { - assertEquals("Notification message too small.", e.getMessage()); - assertEquals(BGPError.BAD_MSG_LENGTH, e.getError()); - return; - } - fail(); - } - - @Test - public void testUnrecognizedError() throws BGPParsingException, BGPDocumentedException { - final byte[] bMsg = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0x00, (byte) 0x15, (byte) 0x03, (byte) 0x02, (byte) 0xaa }; - - try { - ParserTest.reg.parseMessage(Unpooled.copiedBuffer(bMsg)); - fail("Exception should have occured."); - } catch (final IllegalArgumentException e) { - assertEquals("BGP Error code 2 and subcode 170 not recognized.", e.getMessage()); - return; - } - fail(); - } - - @Test - public void testTLVParser() throws UnknownHostException { - - final BgpTableType t1 = new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); - final BgpTableType t2 = new BgpTableTypeImpl(LinkstateAddressFamily.class, UnicastSubsequentAddressFamily.class); - - final List tlvs = Lists.newArrayList(); - - tlvs.add(new BgpParametersBuilder().setCParameters( - new MultiprotocolCaseBuilder().setMultiprotocolCapability( - new MultiprotocolCapabilityBuilder().setAfi(LinkstateAddressFamily.class).setSafi( - LinkstateSubsequentAddressFamily.class).build()).build()).build()); - tlvs.add(new BgpParametersBuilder().setCParameters( - new MultiprotocolCaseBuilder().setMultiprotocolCapability( - new MultiprotocolCapabilityBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build()).build()).build()); - - final Map tableTypes = Maps.newHashMap(); - tableTypes.put(t1, true); - tableTypes.put(t2, true); - final Open open = new OpenBuilder().setMyAsNumber(72).setHoldTimer(180).setBgpIdentifier(new Ipv4Address("172.20.160.170")).setVersion( - new ProtocolVersion((short) 4)).setBgpParameters(tlvs).build(); - - final byte[] result = ParserTest.reg.serializeMessage(open); - - // the capabilities can be swapped. - assertTrue(Arrays.equals(openWithCpblt1, result) || Arrays.equals(openWithCpblt2, result)); - } + public static final byte[] openBMsg = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0x00, (byte) 0x1d, (byte) 0x01, (byte) 0x04, (byte) 0x00, (byte) 0x64, (byte) 0x00, (byte) 0xb4, (byte) 0x14, (byte) 0x14, + (byte) 0x14, (byte) 0x14, (byte) 0x00 }; + + public static final byte[] keepAliveBMsg = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0x00, (byte) 0x13, (byte) 0x04 }; + + public static final byte[] notificationBMsg = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0x00, (byte) 0x17, (byte) 0x03, (byte) 0x02, (byte) 0x04, (byte) 0x04, (byte) 0x09 }; + + public static final byte[] openWithCpblt1 = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0x00, (byte) 0x2d, (byte) 0x01, (byte) 0x04, (byte) 0x00, (byte) 0x48, (byte) 0x00, (byte) 0xb4, (byte) 0xac, (byte) 0x14, + (byte) 0xa0, (byte) 0xaa, (byte) 0x10, (byte) 0x02, (byte) 0x06, (byte) 0x01, (byte) 0x04, (byte) 0x00, (byte) 0x01, (byte) 0x00, + (byte) 0x01, (byte) 0x02, (byte) 0x06, (byte) 0x01, (byte) 0x04, (byte) 0x40, (byte) 0x04, (byte) 0x00, (byte) 0x47 }; + + public static final byte[] openWithCpblt2 = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0x00, (byte) 0x2d, (byte) 0x01, (byte) 0x04, (byte) 0x00, (byte) 0x48, (byte) 0x00, (byte) 0xb4, (byte) 0xac, (byte) 0x14, + (byte) 0xa0, (byte) 0xaa, (byte) 0x10, (byte) 0x02, (byte) 0x06, (byte) 0x01, (byte) 0x04, (byte) 0x40, (byte) 0x04, (byte) 0x00, + (byte) 0x47, (byte) 0x02, (byte) 0x06, (byte) 0x01, (byte) 0x04, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x01 }; + + static MessageRegistry reg; + + @BeforeClass + public static void setupClass() throws Exception { + reg = ServiceLoaderBGPExtensionProviderContext.getSingletonInstance().getMessageRegistry(); + } + + @Test + public void testHeaderErrors() throws BGPParsingException, BGPDocumentedException { + byte[] wrong = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0x00 }; + wrong = ByteArray.cutBytes(wrong, 16); + try { + ParserTest.reg.parseMessage(Unpooled.copiedBuffer(wrong)); + fail("Exception should have occcured."); + } catch (final IllegalArgumentException e) { + assertEquals("Too few bytes in passed array. Passed: " + wrong.length + ". Expected: >= 19.", e.getMessage()); + return; + } + fail(); + } + + @Test + public void testBadMsgType() throws BGPParsingException { + final byte[] bytes = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0x00, (byte) 0x13, (byte) 0x08 }; + try { + ParserTest.reg.parseMessage(Unpooled.copiedBuffer(bytes)); + fail("Exception should have occured."); + } catch (final BGPDocumentedException e) { + assertEquals(BGPError.BAD_MSG_TYPE, e.getError()); + return; + } + fail(); + } + + @Test + public void testKeepAliveMsg() throws BGPParsingException, BGPDocumentedException { + final Notification keepAlive = new KeepaliveBuilder().build(); + final byte[] bytes = ParserTest.reg.serializeMessage(keepAlive); + assertArrayEquals(keepAliveBMsg, bytes); + + final Notification m = ParserTest.reg.parseMessage(Unpooled.copiedBuffer(bytes)); + + assertTrue(m instanceof Keepalive); + } + + @Test + public void testBadKeepAliveMsg() throws BGPParsingException { + final byte[] bytes = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0x00, (byte) 0x14, (byte) 0x04, (byte) 0x05 }; + + try { + ParserTest.reg.parseMessage(Unpooled.copiedBuffer(bytes)); + fail("Exception should have occured."); + } catch (final BGPDocumentedException e) { + assertThat(e.getMessage(), containsString("Message length field not within valid range.")); + assertEquals(BGPError.BAD_MSG_LENGTH, e.getError()); + return; + } + fail(); + } + + @Test + public void testOpenMessage() throws UnknownHostException, BGPParsingException, BGPDocumentedException { + final Notification open = new OpenBuilder().setMyAsNumber(100).setHoldTimer(180).setBgpIdentifier(new Ipv4Address("20.20.20.20")).setVersion( + new ProtocolVersion((short) 4)).build(); + final byte[] bytes = ParserTest.reg.serializeMessage(open); + assertArrayEquals(openBMsg, bytes); + + final Notification m = ParserTest.reg.parseMessage(Unpooled.copiedBuffer(bytes)); + + assertTrue(m instanceof Open); + assertEquals(100, ((Open) m).getMyAsNumber().intValue()); + assertEquals(180, ((Open) m).getHoldTimer().intValue()); + assertEquals(new Ipv4Address("20.20.20.20"), ((Open) m).getBgpIdentifier()); + assertTrue(((Open) m).getBgpParameters().isEmpty()); + } + + @Test + public void testBadHoldTimeError() throws BGPParsingException { + final byte[] bMsg = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0x00, (byte) 0x1d, (byte) 0x01, (byte) 0x04, (byte) 0x00, (byte) 0x64, (byte) 0x00, (byte) 0x01, (byte) 0x14, + (byte) 0x14, (byte) 0x14, (byte) 0x14, (byte) 0x00 }; + + try { + ParserTest.reg.parseMessage(Unpooled.copiedBuffer(bMsg)); + fail("Exception should have occured."); + } catch (final BGPDocumentedException e) { + assertEquals("Hold time value not acceptable.", e.getMessage()); + assertEquals(BGPError.HOLD_TIME_NOT_ACC, e.getError()); + return; + } + fail(); + } + + @Test + public void testBadMsgLength() throws BGPParsingException { + final byte[] bMsg = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0x00, (byte) 0x1b, (byte) 0x01, (byte) 0x04, (byte) 0x00, (byte) 0x64, (byte) 0x00, (byte) 0xb4, (byte) 0xff, + (byte) 0xff, (byte) 0xff }; + + try { + ParserTest.reg.parseMessage(Unpooled.copiedBuffer(bMsg)); + fail("Exception should have occured."); + } catch (final BGPDocumentedException e) { + assertEquals("Open message too small.", e.getMessage()); + assertEquals(BGPError.BAD_MSG_LENGTH, e.getError()); + } + } + + @Test + public void testBadVersion() throws BGPParsingException { + final byte[] bMsg = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0x00, (byte) 0x1d, (byte) 0x01, (byte) 0x08, (byte) 0x00, (byte) 0x64, (byte) 0x00, (byte) 0xb4, (byte) 0x14, + (byte) 0x14, (byte) 0x14, (byte) 0x14, (byte) 0x00 }; + + try { + ParserTest.reg.parseMessage(Unpooled.copiedBuffer(bMsg)); + fail("Exception should have occured."); + } catch (final BGPDocumentedException e) { + assertEquals("BGP Protocol version 8 not supported.", e.getMessage()); + assertEquals(BGPError.VERSION_NOT_SUPPORTED, e.getError()); + return; + } + fail(); + } + + @Test + public void testNotificationMsg() throws BGPParsingException, BGPDocumentedException { + Notification notMsg = new NotifyBuilder().setErrorCode(BGPError.OPT_PARAM_NOT_SUPPORTED.getCode()).setErrorSubcode( + BGPError.OPT_PARAM_NOT_SUPPORTED.getSubcode()).setData(new byte[] { 4, 9 }).build(); + byte[] bytes = ParserTest.reg.serializeMessage(notMsg); + assertArrayEquals(notificationBMsg, bytes); + + Notification m = ParserTest.reg.parseMessage(Unpooled.copiedBuffer(bytes)); + + assertTrue(m instanceof Notify); + assertEquals(BGPError.OPT_PARAM_NOT_SUPPORTED, BGPError.forValue(((Notify) m).getErrorCode(), ((Notify) m).getErrorSubcode())); + assertArrayEquals(new byte[] { 4, 9 }, ((Notify) m).getData()); + + notMsg = new NotifyBuilder().setErrorCode(BGPError.CONNECTION_NOT_SYNC.getCode()).setErrorSubcode( + BGPError.CONNECTION_NOT_SYNC.getSubcode()).build(); + bytes = ParserTest.reg.serializeMessage(notMsg); + + m = ParserTest.reg.parseMessage(Unpooled.copiedBuffer(bytes)); + + assertTrue(m instanceof Notify); + assertEquals(BGPError.CONNECTION_NOT_SYNC, BGPError.forValue(((Notify) m).getErrorCode(), ((Notify) m).getErrorSubcode())); + assertNull(((Notify) m).getData()); + } + + @Test + public void testWrongLength() throws BGPParsingException { + final byte[] bMsg = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0x00, (byte) 0x14, (byte) 0x03, (byte) 0x02 }; + + try { + ParserTest.reg.parseMessage(Unpooled.copiedBuffer(bMsg)); + fail("Exception should have occured."); + } catch (final BGPDocumentedException e) { + assertEquals("Notification message too small.", e.getMessage()); + assertEquals(BGPError.BAD_MSG_LENGTH, e.getError()); + return; + } + fail(); + } + + @Test + public void testUnrecognizedError() throws BGPParsingException, BGPDocumentedException { + final byte[] bMsg = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0x00, (byte) 0x15, (byte) 0x03, (byte) 0x02, (byte) 0xaa }; + + try { + ParserTest.reg.parseMessage(Unpooled.copiedBuffer(bMsg)); + fail("Exception should have occured."); + } catch (final IllegalArgumentException e) { + assertEquals("BGP Error code 2 and subcode 170 not recognized.", e.getMessage()); + return; + } + fail(); + } + + @Test + public void testTLVParser() throws UnknownHostException { + + final BgpTableType t1 = new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); + final BgpTableType t2 = new BgpTableTypeImpl(LinkstateAddressFamily.class, UnicastSubsequentAddressFamily.class); + + final List tlvs = Lists.newArrayList(); + + tlvs.add(new BgpParametersBuilder().setCParameters( + new MultiprotocolCaseBuilder().setMultiprotocolCapability( + new MultiprotocolCapabilityBuilder().setAfi(LinkstateAddressFamily.class).setSafi( + LinkstateSubsequentAddressFamily.class).build()).build()).build()); + tlvs.add(new BgpParametersBuilder().setCParameters( + new MultiprotocolCaseBuilder().setMultiprotocolCapability( + new MultiprotocolCapabilityBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).build()).build()).build()); + + final Map tableTypes = Maps.newHashMap(); + tableTypes.put(t1, true); + tableTypes.put(t2, true); + final Open open = new OpenBuilder().setMyAsNumber(72).setHoldTimer(180).setBgpIdentifier(new Ipv4Address("172.20.160.170")).setVersion( + new ProtocolVersion((short) 4)).setBgpParameters(tlvs).build(); + + final byte[] result = ParserTest.reg.serializeMessage(open); + + // the capabilities can be swapped. + assertTrue(Arrays.equals(openWithCpblt1, result) || Arrays.equals(openWithCpblt2, result)); + } } diff --git a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/PathAttributeParserTest.java b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/PathAttributeParserTest.java index f68034c992..2cde379446 100644 --- a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/PathAttributeParserTest.java +++ b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/PathAttributeParserTest.java @@ -21,16 +21,17 @@ import org.opendaylight.protocol.bgp.parser.spi.pojo.ServiceLoaderBGPExtensionPr * To test incorrect values. */ public class PathAttributeParserTest { - @Test - public void testOriginParser() throws Exception { - try { - ServiceLoaderBGPExtensionProviderContext.getSingletonInstance().getAttributeRegistry().parseAttributes(Unpooled.copiedBuffer(new byte[] { 0x40, 0x01, 0x01, 0x04 })); - fail("This needs to fail."); - } catch (final BGPDocumentedException e) { - assertEquals("Unknown Origin type.", e.getMessage()); - assertArrayEquals(new byte[] { 0x01, 0x01, 0x04 }, e.getData()); - } catch (final BGPParsingException e) { - fail("This exception should not occur."); - } - } + @Test + public void testOriginParser() throws Exception { + try { + ServiceLoaderBGPExtensionProviderContext.getSingletonInstance().getAttributeRegistry().parseAttributes( + Unpooled.copiedBuffer(new byte[] { 0x40, 0x01, 0x01, 0x04 })); + fail("This needs to fail."); + } catch (final BGPDocumentedException e) { + assertEquals("Unknown Origin type.", e.getMessage()); + assertArrayEquals(new byte[] { 0x01, 0x01, 0x04 }, e.getData()); + } catch (final BGPParsingException e) { + fail("This exception should not occur."); + } + } } diff --git a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/RouteOriginCommunityTest.java b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/RouteOriginCommunityTest.java index 7afffc1319..07ff856e29 100644 --- a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/RouteOriginCommunityTest.java +++ b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/RouteOriginCommunityTest.java @@ -18,23 +18,23 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type public class RouteOriginCommunityTest { - private RouteOriginExtendedCommunity community; + private RouteOriginExtendedCommunity community; - @Before - public void init() { - final ShortAsNumber globalAdmin = new ShortAsNumber(65535L); - final byte[] localAdmin = new byte[] { 10, 0, 0, 1 }; - this.community = new RouteOriginExtendedCommunityBuilder().setGlobalAdministrator(globalAdmin).setLocalAdministrator(localAdmin).build(); - } + @Before + public void init() { + final ShortAsNumber globalAdmin = new ShortAsNumber(65535L); + final byte[] localAdmin = new byte[] { 10, 0, 0, 1 }; + this.community = new RouteOriginExtendedCommunityBuilder().setGlobalAdministrator(globalAdmin).setLocalAdministrator(localAdmin).build(); + } - @Test - public void testGetGlobalAdmin() { - final ShortAsNumber testAsn = new ShortAsNumber(65535L); - assertEquals(this.community.getGlobalAdministrator(), testAsn); - } + @Test + public void testGetGlobalAdmin() { + final ShortAsNumber testAsn = new ShortAsNumber(65535L); + assertEquals(this.community.getGlobalAdministrator(), testAsn); + } - @Test - public void testGetLocalAdmin() { - assertArrayEquals(new byte[] { 10, 0, 0, 1 }, this.community.getLocalAdministrator()); - } + @Test + public void testGetLocalAdmin() { + assertArrayEquals(new byte[] { 10, 0, 0, 1 }, this.community.getLocalAdministrator()); + } } diff --git a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/RouteTargetCommunityTest.java b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/RouteTargetCommunityTest.java index 1a92e14fa2..fea301a6cf 100644 --- a/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/RouteTargetCommunityTest.java +++ b/bgp/parser-impl/src/test/java/org/opendaylight/protocol/bgp/parser/impl/RouteTargetCommunityTest.java @@ -18,23 +18,23 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type public class RouteTargetCommunityTest { - private RouteTargetExtendedCommunity community; + private RouteTargetExtendedCommunity community; - @Before - public void init() { - final ShortAsNumber globalAdmin = new ShortAsNumber(65535L); - final byte[] localAdmin = new byte[] { 10, 0, 0, 1 }; - this.community = new RouteTargetExtendedCommunityBuilder().setGlobalAdministrator(globalAdmin).setLocalAdministrator(localAdmin).build(); - } + @Before + public void init() { + final ShortAsNumber globalAdmin = new ShortAsNumber(65535L); + final byte[] localAdmin = new byte[] { 10, 0, 0, 1 }; + this.community = new RouteTargetExtendedCommunityBuilder().setGlobalAdministrator(globalAdmin).setLocalAdministrator(localAdmin).build(); + } - @Test - public void testGetGlobalAdmin() { - final ShortAsNumber testAsn = new ShortAsNumber(65535L); - assertEquals(this.community.getGlobalAdministrator(), testAsn); - } + @Test + public void testGetGlobalAdmin() { + final ShortAsNumber testAsn = new ShortAsNumber(65535L); + assertEquals(this.community.getGlobalAdministrator(), testAsn); + } - @Test - public void testGetLocalAdmin() { - assertArrayEquals(new byte[] { 10, 0, 0, 1 }, this.community.getLocalAdministrator()); - } + @Test + public void testGetLocalAdmin() { + assertArrayEquals(new byte[] { 10, 0, 0, 1 }, this.community.getLocalAdministrator()); + } } diff --git a/bgp/parser-mock/src/main/java/org/opendaylight/protocol/bgp/parser/mock/BGPMessageParserMock.java b/bgp/parser-mock/src/main/java/org/opendaylight/protocol/bgp/parser/mock/BGPMessageParserMock.java index 42527c8a69..26b39de070 100644 --- a/bgp/parser-mock/src/main/java/org/opendaylight/protocol/bgp/parser/mock/BGPMessageParserMock.java +++ b/bgp/parser-mock/src/main/java/org/opendaylight/protocol/bgp/parser/mock/BGPMessageParserMock.java @@ -22,27 +22,27 @@ import org.opendaylight.yangtools.yang.binding.Notification; * the map. */ public class BGPMessageParserMock implements MessageRegistry { - private final Map messages; + private final Map messages; - /** - * @param updateMessages Map - */ - public BGPMessageParserMock(final Map messages) { - this.messages = messages; - } + /** + * @param updateMessages Map + */ + public BGPMessageParserMock(final Map messages) { + this.messages = messages; + } - @Override - public Notification parseMessage(final ByteBuf buffer) throws BGPParsingException, BGPDocumentedException { - final Notification ret = this.messages.get(buffer); - if (ret == null) { - throw new IllegalArgumentException("Undefined message encountered"); - } - return ret; - } + @Override + public Notification parseMessage(final ByteBuf buffer) throws BGPParsingException, BGPDocumentedException { + final Notification ret = this.messages.get(buffer); + if (ret == null) { + throw new IllegalArgumentException("Undefined message encountered"); + } + return ret; + } - @Override - public byte[] serializeMessage(final Notification msg) { - // nothing - return null; - } + @Override + public byte[] serializeMessage(final Notification msg) { + // nothing + return null; + } } diff --git a/bgp/parser-mock/src/test/java/org/opendaylight/protocol/bgp/parser/mock/BGPMessageParserMockTest.java b/bgp/parser-mock/src/test/java/org/opendaylight/protocol/bgp/parser/mock/BGPMessageParserMockTest.java index ff9d6b153f..5a640f4999 100644 --- a/bgp/parser-mock/src/test/java/org/opendaylight/protocol/bgp/parser/mock/BGPMessageParserMockTest.java +++ b/bgp/parser-mock/src/test/java/org/opendaylight/protocol/bgp/parser/mock/BGPMessageParserMockTest.java @@ -9,6 +9,11 @@ package org.opendaylight.protocol.bgp.parser.mock; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotSame; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; + import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; @@ -65,146 +70,141 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv6.next.hop._case.Ipv6NextHopBuilder; import org.opendaylight.yangtools.yang.binding.Notification; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; - public class BGPMessageParserMockTest { - private final byte[][] inputBytes = new byte[11][]; - private final List messages = Lists.newArrayList(); - - @Before - public void init() throws Exception { - // Creating input bytes and update messages - for (int i = 0; i < this.inputBytes.length; i++) { - this.inputBytes[i] = this.fillInputBytes(i); - this.messages.add(this.fillMessages(i)); - } - } - - /** - * Test if mock implementation of parser returns correct message - * - * @throws BGPParsingException - * @throws BGPDocumentedException - * @throws IOException - */ - @Test - public void testGetUpdateMessage() throws BGPParsingException, BGPDocumentedException, IOException { - final Map updateMap = Maps.newHashMap(); - for (int i = 0; i < this.inputBytes.length; i++) { - updateMap.put(Unpooled.copiedBuffer(this.inputBytes[i]), this.messages.get(i)); - } - final BGPMessageParserMock mockParser = new BGPMessageParserMock(updateMap); - - for (int i = 0; i < this.inputBytes.length; i++) { - assertEquals(this.messages.get(i), mockParser.parseMessage(Unpooled.copiedBuffer(this.inputBytes[i]))); - } - assertNotSame(this.messages.get(3), mockParser.parseMessage(Unpooled.copiedBuffer(this.inputBytes[8]))); - } - - /** - * Test if method throws IllegalArgumentException after finding no BGPUpdateMessage associated with given byte[] key - * - * @throws BGPDocumentedException - * @throws BGPParsingException - * @throws IOException - */ - @Test(expected = IllegalArgumentException.class) - public void testGetUpdateMessageException() throws BGPParsingException, BGPDocumentedException, IOException { - final Map updateMap = Maps.newHashMap(); - for (int i = 0; i < this.inputBytes.length; i++) { - updateMap.put(Unpooled.copiedBuffer(this.inputBytes[i]), this.messages.get(i)); - } - final BGPMessageParserMock mockParser = new BGPMessageParserMock(updateMap); - mockParser.parseMessage(Unpooled.copiedBuffer(new byte[] { 7, 4, 6 })); - } - - /** - * Helper method to fill inputBytes variable - * - * @param fileNumber parameter to distinguish between files from which bytes are read - */ - private byte[] fillInputBytes(final int fileNumber) throws Exception { - - final InputStream is = this.getClass().getResourceAsStream("/up" + fileNumber + ".bin"); - final ByteArrayOutputStream bis = new ByteArrayOutputStream(); - final byte[] data = new byte[60]; - int nRead = 0; - while ((nRead = is.read(data, 0, data.length)) != -1) { - bis.write(data, 0, nRead); - } - bis.flush(); - return bis.toByteArray(); - } - - /** - * Helper method to fill messages variable - * - * @param asn this parameter is passed to ASNumber constructor - */ - private Update fillMessages(final long asn) throws UnknownHostException { - - final UpdateBuilder builder = new UpdateBuilder(); - - final List asnums = Lists.newArrayList(new AsSequenceBuilder().setAs(new AsNumber(asn)).build()); - final List asPath = Lists.newArrayList(); - asPath.add(new SegmentsBuilder().setCSegment( - new AListCaseBuilder().setAList(new AListBuilder().setAsSequence(asnums).build()).build()).build()); - final CNextHop nextHop = new Ipv6NextHopCaseBuilder().setIpv6NextHop( - new Ipv6NextHopBuilder().setGlobal(new Ipv6Address("2001:db8::1")).setLinkLocal(new Ipv6Address("fe80::c001:bff:fe7e:0")).build()).build(); - - final Ipv6Prefix pref1 = new Ipv6Prefix("2001:db8:1:2::/64"); - final Ipv6Prefix pref2 = new Ipv6Prefix("2001:db8:1:1::/64"); - final Ipv6Prefix pref3 = new Ipv6Prefix("2001:db8:1::/64"); - - final PathAttributesBuilder paBuilder = new PathAttributesBuilder(); - paBuilder.setOrigin(new OriginBuilder().setValue(BgpOrigin.Igp).build()); - paBuilder.setAsPath(new AsPathBuilder().setSegments(asPath).build()); - - final MpReachNlriBuilder mpReachBuilder = new MpReachNlriBuilder(); - mpReachBuilder.setAfi(Ipv6AddressFamily.class); - mpReachBuilder.setSafi(UnicastSubsequentAddressFamily.class); - mpReachBuilder.setCNextHop(nextHop); - mpReachBuilder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType( - new DestinationIpv6CaseBuilder().setDestinationIpv6( - new DestinationIpv6Builder().setIpv6Prefixes(Lists.newArrayList(pref1, pref2, pref3)).build()).build()).build()); - - paBuilder.addAugmentation(PathAttributes1.class, new PathAttributes1Builder().setMpReachNlri(mpReachBuilder.build()).build()); - - builder.setPathAttributes(paBuilder.build()); - - return builder.build(); - } - - @Test - public void testGetOpenMessage() throws BGPParsingException, BGPDocumentedException, IOException { - final Map openMap = Maps.newHashMap(); - - final Set type = Sets.newHashSet(); - type.add(new BgpTableTypeImpl(Ipv4AddressFamily.class, MplsLabeledVpnSubsequentAddressFamily.class)); - - final List params = Lists.newArrayList(); - - final CParameters par = new MultiprotocolCaseBuilder().setMultiprotocolCapability( - new MultiprotocolCapabilityBuilder().setAfi(Ipv4AddressFamily.class).setSafi(MplsLabeledVpnSubsequentAddressFamily.class).build()).build(); - params.add(new BgpParametersBuilder().setCParameters(par).build()); - - final byte[] input = new byte[] { 5, 8, 13, 21 }; - - openMap.put( - Unpooled.copiedBuffer(input), - new OpenBuilder().setMyAsNumber(30).setHoldTimer(30).setBgpParameters(params).setVersion(new ProtocolVersion((short) 4)).build()); - - final BGPMessageParserMock mockParser = new BGPMessageParserMock(openMap); - - final Set result = Sets.newHashSet(); - for (final BgpParameters p : ((Open) mockParser.parseMessage(Unpooled.copiedBuffer(input))).getBgpParameters()) { - final CParameters cp = p.getCParameters(); - final BgpTableType t = new BgpTableTypeImpl(((MultiprotocolCase) cp).getMultiprotocolCapability().getAfi(), ((MultiprotocolCase) cp).getMultiprotocolCapability().getSafi()); - result.add(t); - } - assertEquals(type, result); - } + private final byte[][] inputBytes = new byte[11][]; + private final List messages = Lists.newArrayList(); + + @Before + public void init() throws Exception { + // Creating input bytes and update messages + for (int i = 0; i < this.inputBytes.length; i++) { + this.inputBytes[i] = this.fillInputBytes(i); + this.messages.add(this.fillMessages(i)); + } + } + + /** + * Test if mock implementation of parser returns correct message + * + * @throws BGPParsingException + * @throws BGPDocumentedException + * @throws IOException + */ + @Test + public void testGetUpdateMessage() throws BGPParsingException, BGPDocumentedException, IOException { + final Map updateMap = Maps.newHashMap(); + for (int i = 0; i < this.inputBytes.length; i++) { + updateMap.put(Unpooled.copiedBuffer(this.inputBytes[i]), this.messages.get(i)); + } + final BGPMessageParserMock mockParser = new BGPMessageParserMock(updateMap); + + for (int i = 0; i < this.inputBytes.length; i++) { + assertEquals(this.messages.get(i), mockParser.parseMessage(Unpooled.copiedBuffer(this.inputBytes[i]))); + } + assertNotSame(this.messages.get(3), mockParser.parseMessage(Unpooled.copiedBuffer(this.inputBytes[8]))); + } + + /** + * Test if method throws IllegalArgumentException after finding no BGPUpdateMessage associated with given byte[] key + * + * @throws BGPDocumentedException + * @throws BGPParsingException + * @throws IOException + */ + @Test(expected = IllegalArgumentException.class) + public void testGetUpdateMessageException() throws BGPParsingException, BGPDocumentedException, IOException { + final Map updateMap = Maps.newHashMap(); + for (int i = 0; i < this.inputBytes.length; i++) { + updateMap.put(Unpooled.copiedBuffer(this.inputBytes[i]), this.messages.get(i)); + } + final BGPMessageParserMock mockParser = new BGPMessageParserMock(updateMap); + mockParser.parseMessage(Unpooled.copiedBuffer(new byte[] { 7, 4, 6 })); + } + + /** + * Helper method to fill inputBytes variable + * + * @param fileNumber parameter to distinguish between files from which bytes are read + */ + private byte[] fillInputBytes(final int fileNumber) throws Exception { + + final InputStream is = this.getClass().getResourceAsStream("/up" + fileNumber + ".bin"); + final ByteArrayOutputStream bis = new ByteArrayOutputStream(); + final byte[] data = new byte[60]; + int nRead = 0; + while ((nRead = is.read(data, 0, data.length)) != -1) { + bis.write(data, 0, nRead); + } + bis.flush(); + return bis.toByteArray(); + } + + /** + * Helper method to fill messages variable + * + * @param asn this parameter is passed to ASNumber constructor + */ + private Update fillMessages(final long asn) throws UnknownHostException { + + final UpdateBuilder builder = new UpdateBuilder(); + + final List asnums = Lists.newArrayList(new AsSequenceBuilder().setAs(new AsNumber(asn)).build()); + final List asPath = Lists.newArrayList(); + asPath.add(new SegmentsBuilder().setCSegment( + new AListCaseBuilder().setAList(new AListBuilder().setAsSequence(asnums).build()).build()).build()); + final CNextHop nextHop = new Ipv6NextHopCaseBuilder().setIpv6NextHop( + new Ipv6NextHopBuilder().setGlobal(new Ipv6Address("2001:db8::1")).setLinkLocal(new Ipv6Address("fe80::c001:bff:fe7e:0")).build()).build(); + + final Ipv6Prefix pref1 = new Ipv6Prefix("2001:db8:1:2::/64"); + final Ipv6Prefix pref2 = new Ipv6Prefix("2001:db8:1:1::/64"); + final Ipv6Prefix pref3 = new Ipv6Prefix("2001:db8:1::/64"); + + final PathAttributesBuilder paBuilder = new PathAttributesBuilder(); + paBuilder.setOrigin(new OriginBuilder().setValue(BgpOrigin.Igp).build()); + paBuilder.setAsPath(new AsPathBuilder().setSegments(asPath).build()); + + final MpReachNlriBuilder mpReachBuilder = new MpReachNlriBuilder(); + mpReachBuilder.setAfi(Ipv6AddressFamily.class); + mpReachBuilder.setSafi(UnicastSubsequentAddressFamily.class); + mpReachBuilder.setCNextHop(nextHop); + mpReachBuilder.setAdvertizedRoutes(new AdvertizedRoutesBuilder().setDestinationType( + new DestinationIpv6CaseBuilder().setDestinationIpv6( + new DestinationIpv6Builder().setIpv6Prefixes(Lists.newArrayList(pref1, pref2, pref3)).build()).build()).build()); + + paBuilder.addAugmentation(PathAttributes1.class, new PathAttributes1Builder().setMpReachNlri(mpReachBuilder.build()).build()); + + builder.setPathAttributes(paBuilder.build()); + + return builder.build(); + } + + @Test + public void testGetOpenMessage() throws BGPParsingException, BGPDocumentedException, IOException { + final Map openMap = Maps.newHashMap(); + + final Set type = Sets.newHashSet(); + type.add(new BgpTableTypeImpl(Ipv4AddressFamily.class, MplsLabeledVpnSubsequentAddressFamily.class)); + + final List params = Lists.newArrayList(); + + final CParameters par = new MultiprotocolCaseBuilder().setMultiprotocolCapability( + new MultiprotocolCapabilityBuilder().setAfi(Ipv4AddressFamily.class).setSafi(MplsLabeledVpnSubsequentAddressFamily.class).build()).build(); + params.add(new BgpParametersBuilder().setCParameters(par).build()); + + final byte[] input = new byte[] { 5, 8, 13, 21 }; + + openMap.put(Unpooled.copiedBuffer(input), new OpenBuilder().setMyAsNumber(30).setHoldTimer(30).setBgpParameters(params).setVersion( + new ProtocolVersion((short) 4)).build()); + + final BGPMessageParserMock mockParser = new BGPMessageParserMock(openMap); + + final Set result = Sets.newHashSet(); + for (final BgpParameters p : ((Open) mockParser.parseMessage(Unpooled.copiedBuffer(input))).getBgpParameters()) { + final CParameters cp = p.getCParameters(); + final BgpTableType t = new BgpTableTypeImpl(((MultiprotocolCase) cp).getMultiprotocolCapability().getAfi(), ((MultiprotocolCase) cp).getMultiprotocolCapability().getSafi()); + result.add(t); + } + assertEquals(type, result); + } } diff --git a/bgp/parser-spi-config/src/main/java/org/opendaylight/controller/config/yang/bgp/parser/spi/SimpleBGPExtensionProviderContextModule.java b/bgp/parser-spi-config/src/main/java/org/opendaylight/controller/config/yang/bgp/parser/spi/SimpleBGPExtensionProviderContextModule.java index 0a36e17f14..266b0c9af2 100644 --- a/bgp/parser-spi-config/src/main/java/org/opendaylight/controller/config/yang/bgp/parser/spi/SimpleBGPExtensionProviderContextModule.java +++ b/bgp/parser-spi-config/src/main/java/org/opendaylight/controller/config/yang/bgp/parser/spi/SimpleBGPExtensionProviderContextModule.java @@ -23,39 +23,39 @@ import org.opendaylight.protocol.bgp.parser.spi.pojo.SimpleBGPExtensionProviderC * */ public final class SimpleBGPExtensionProviderContextModule extends -org.opendaylight.controller.config.yang.bgp.parser.spi.AbstractSimpleBGPExtensionProviderContextModule { - - public SimpleBGPExtensionProviderContextModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, - final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { - super(identifier, dependencyResolver); - } - - public SimpleBGPExtensionProviderContextModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, - final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, - final SimpleBGPExtensionProviderContextModule oldModule, final java.lang.AutoCloseable oldInstance) { - super(identifier, dependencyResolver, oldModule, oldInstance); - } - - @Override - protected void customValidation() { - // Add custom validation for module attributes here. - } - - @Override - public java.lang.AutoCloseable createInstance() { - final class SimpleBGPExtensionProviderContextAutoCloseable extends SimpleBGPExtensionProviderContext implements AutoCloseable { - @Override - public void close() { - for (final BGPExtensionProviderActivator e : getExtensionDependency()) { - e.stop(); - } - } - } - - final SimpleBGPExtensionProviderContextAutoCloseable ret = new SimpleBGPExtensionProviderContextAutoCloseable(); - for (final BGPExtensionProviderActivator e : getExtensionDependency()) { - e.start(ret); - } - return ret; - } + org.opendaylight.controller.config.yang.bgp.parser.spi.AbstractSimpleBGPExtensionProviderContextModule { + + public SimpleBGPExtensionProviderContextModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } + + public SimpleBGPExtensionProviderContextModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, + final SimpleBGPExtensionProviderContextModule oldModule, final java.lang.AutoCloseable oldInstance) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } + + @Override + protected void customValidation() { + // Add custom validation for module attributes here. + } + + @Override + public java.lang.AutoCloseable createInstance() { + final class SimpleBGPExtensionProviderContextAutoCloseable extends SimpleBGPExtensionProviderContext implements AutoCloseable { + @Override + public void close() { + for (final BGPExtensionProviderActivator e : getExtensionDependency()) { + e.stop(); + } + } + } + + final SimpleBGPExtensionProviderContextAutoCloseable ret = new SimpleBGPExtensionProviderContextAutoCloseable(); + for (final BGPExtensionProviderActivator e : getExtensionDependency()) { + e.start(ret); + } + return ret; + } } diff --git a/bgp/parser-spi-config/src/main/java/org/opendaylight/controller/config/yang/bgp/parser/spi/SimpleBGPExtensionProviderContextModuleFactory.java b/bgp/parser-spi-config/src/main/java/org/opendaylight/controller/config/yang/bgp/parser/spi/SimpleBGPExtensionProviderContextModuleFactory.java index 8379029aca..4a88ee9896 100644 --- a/bgp/parser-spi-config/src/main/java/org/opendaylight/controller/config/yang/bgp/parser/spi/SimpleBGPExtensionProviderContextModuleFactory.java +++ b/bgp/parser-spi-config/src/main/java/org/opendaylight/controller/config/yang/bgp/parser/spi/SimpleBGPExtensionProviderContextModuleFactory.java @@ -6,21 +6,20 @@ * and is available at http://www.eclipse.org/legal/epl-v10.html */ /** -* Generated file + * Generated file -* Generated from: yang module name: config-bgp-parser-spi yang module local name: bgp-extensions-impl -* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator -* Generated at: Mon Nov 18 10:44:24 CET 2013 -* -* Do not modify this file unless it is present under src/main directory -*/ + * Generated from: yang module name: config-bgp-parser-spi yang module local name: bgp-extensions-impl + * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator + * Generated at: Mon Nov 18 10:44:24 CET 2013 + * + * Do not modify this file unless it is present under src/main directory + */ package org.opendaylight.controller.config.yang.bgp.parser.spi; /** * */ -public class SimpleBGPExtensionProviderContextModuleFactory extends org.opendaylight.controller.config.yang.bgp.parser.spi.AbstractSimpleBGPExtensionProviderContextModuleFactory -{ - +public class SimpleBGPExtensionProviderContextModuleFactory extends + org.opendaylight.controller.config.yang.bgp.parser.spi.AbstractSimpleBGPExtensionProviderContextModuleFactory { } diff --git a/bgp/parser-spi-config/src/test/java/org/opendaylight/controller/config/yang/bgp/parser/spi/SimpleBGPExtensionProviderContextModuleTest.java b/bgp/parser-spi-config/src/test/java/org/opendaylight/controller/config/yang/bgp/parser/spi/SimpleBGPExtensionProviderContextModuleTest.java index ad27e90101..90ae2a02a7 100644 --- a/bgp/parser-spi-config/src/test/java/org/opendaylight/controller/config/yang/bgp/parser/spi/SimpleBGPExtensionProviderContextModuleTest.java +++ b/bgp/parser-spi-config/src/test/java/org/opendaylight/controller/config/yang/bgp/parser/spi/SimpleBGPExtensionProviderContextModuleTest.java @@ -51,9 +51,11 @@ public class SimpleBGPExtensionProviderContextModuleTest extends AbstractConfigT return transaction.commit(); } - public static ObjectName createBGPExtensionsModuleInstance(final ConfigTransactionJMXClient transaction, final List extensions) throws Exception { + public static ObjectName createBGPExtensionsModuleInstance(final ConfigTransactionJMXClient transaction, + final List extensions) throws Exception { final ObjectName objectName = transaction.createModule(FACTORY_NAME, INSTANCE_NAME); - SimpleBGPExtensionProviderContextModuleMXBean mxBean = transaction.newMXBeanProxy(objectName, SimpleBGPExtensionProviderContextModuleMXBean.class); + SimpleBGPExtensionProviderContextModuleMXBean mxBean = transaction.newMXBeanProxy(objectName, + SimpleBGPExtensionProviderContextModuleMXBean.class); mxBean.setExtension(extensions); return objectName; } diff --git a/bgp/parser-spi/pom.xml b/bgp/parser-spi/pom.xml index d18c5f3394..b0f8d021c4 100644 --- a/bgp/parser-spi/pom.xml +++ b/bgp/parser-spi/pom.xml @@ -67,10 +67,10 @@ junit junit - - org.mockito - mockito-core - + + org.mockito + mockito-core + diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AbstractBGPExtensionProviderActivator.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AbstractBGPExtensionProviderActivator.java index ac9737440d..f7b56aa484 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AbstractBGPExtensionProviderActivator.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AbstractBGPExtensionProviderActivator.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.parser.spi; +import com.google.common.base.Preconditions; + import java.util.List; import javax.annotation.concurrent.GuardedBy; @@ -14,41 +16,39 @@ import javax.annotation.concurrent.GuardedBy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; - public abstract class AbstractBGPExtensionProviderActivator implements AutoCloseable, BGPExtensionProviderActivator { - private static final Logger LOG = LoggerFactory.getLogger(AbstractBGPExtensionProviderActivator.class); + private static final Logger LOG = LoggerFactory.getLogger(AbstractBGPExtensionProviderActivator.class); - @GuardedBy("this") - private List registrations; + @GuardedBy("this") + private List registrations; - @GuardedBy("this") - protected abstract List startImpl(BGPExtensionProviderContext context); + @GuardedBy("this") + protected abstract List startImpl(BGPExtensionProviderContext context); - @Override - public final synchronized void start(final BGPExtensionProviderContext context) { - Preconditions.checkState(this.registrations == null); + @Override + public final synchronized void start(final BGPExtensionProviderContext context) { + Preconditions.checkState(this.registrations == null); - this.registrations = Preconditions.checkNotNull(startImpl(context)); - } + this.registrations = Preconditions.checkNotNull(startImpl(context)); + } - @Override - public final synchronized void stop() { - Preconditions.checkState(this.registrations != null); + @Override + public final synchronized void stop() { + Preconditions.checkState(this.registrations != null); - for (final AutoCloseable r : this.registrations) { - try { - r.close(); - } catch (final Exception e) { - LOG.warn("Failed to close registration", e); - } - } + for (final AutoCloseable r : this.registrations) { + try { + r.close(); + } catch (final Exception e) { + LOG.warn("Failed to close registration", e); + } + } - this.registrations = null; - } + this.registrations = null; + } - @Override - public final void close() { - stop(); - } + @Override + public final void close() { + stop(); + } } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AbstractMessageRegistry.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AbstractMessageRegistry.java index 55ddddf988..f7afa9a7b9 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AbstractMessageRegistry.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AbstractMessageRegistry.java @@ -7,6 +7,9 @@ */ package org.opendaylight.protocol.bgp.parser.spi; +import com.google.common.base.Preconditions; +import com.google.common.primitives.UnsignedBytes; + import io.netty.buffer.ByteBuf; import java.util.Arrays; @@ -17,59 +20,56 @@ import org.opendaylight.protocol.bgp.parser.BGPParsingException; import org.opendaylight.protocol.util.ByteArray; import org.opendaylight.yangtools.yang.binding.Notification; -import com.google.common.base.Preconditions; -import com.google.common.primitives.UnsignedBytes; - public abstract class AbstractMessageRegistry implements MessageRegistry { - private static final byte[] MARKER; + private static final byte[] MARKER; - protected abstract Notification parseBody(final int type, final ByteBuf body, final int messageLength) throws BGPDocumentedException; + protected abstract Notification parseBody(final int type, final ByteBuf body, final int messageLength) throws BGPDocumentedException; - protected abstract byte[] serializeMessageImpl(final Notification message); + protected abstract byte[] serializeMessageImpl(final Notification message); - static { - MARKER = new byte[MessageUtil.MARKER_LENGTH]; - Arrays.fill(MARKER, UnsignedBytes.MAX_VALUE); - } + static { + MARKER = new byte[MessageUtil.MARKER_LENGTH]; + Arrays.fill(MARKER, UnsignedBytes.MAX_VALUE); + } - @Override - public final Notification parseMessage(final ByteBuf buffer) throws BGPDocumentedException, BGPParsingException { - Preconditions.checkArgument(buffer != null && buffer.isReadable(), "Array of bytes cannot be null or empty."); - Preconditions.checkArgument(buffer.readableBytes() >= MessageUtil.COMMON_HEADER_LENGTH, - "Too few bytes in passed array. Passed: %s. Expected: >= %s.", buffer.readableBytes(), MessageUtil.COMMON_HEADER_LENGTH); - final byte[] marker = ByteArray.readBytes(buffer, MessageUtil.MARKER_LENGTH); + @Override + public final Notification parseMessage(final ByteBuf buffer) throws BGPDocumentedException, BGPParsingException { + Preconditions.checkArgument(buffer != null && buffer.isReadable(), "Array of bytes cannot be null or empty."); + Preconditions.checkArgument(buffer.readableBytes() >= MessageUtil.COMMON_HEADER_LENGTH, + "Too few bytes in passed array. Passed: %s. Expected: >= %s.", buffer.readableBytes(), MessageUtil.COMMON_HEADER_LENGTH); + final byte[] marker = ByteArray.readBytes(buffer, MessageUtil.MARKER_LENGTH); - if (!Arrays.equals(marker, MARKER)) { - throw new BGPDocumentedException("Marker not set to ones.", BGPError.CONNECTION_NOT_SYNC); - } - final int messageLength = buffer.readUnsignedShort(); - // to be sent with Error message - final byte typeBytes = buffer.readByte(); - final int messageType = UnsignedBytes.toInt(typeBytes); + if (!Arrays.equals(marker, MARKER)) { + throw new BGPDocumentedException("Marker not set to ones.", BGPError.CONNECTION_NOT_SYNC); + } + final int messageLength = buffer.readUnsignedShort(); + // to be sent with Error message + final byte typeBytes = buffer.readByte(); + final int messageType = UnsignedBytes.toInt(typeBytes); - final ByteBuf msgBody = buffer.slice(buffer.readerIndex(), messageLength - MessageUtil.COMMON_HEADER_LENGTH); + final ByteBuf msgBody = buffer.slice(buffer.readerIndex(), messageLength - MessageUtil.COMMON_HEADER_LENGTH); - if (messageLength < MessageUtil.COMMON_HEADER_LENGTH) { - throw BGPDocumentedException.badMessageLength("Message length field not within valid range.", messageLength); - } - if (msgBody.readableBytes() != messageLength - MessageUtil.COMMON_HEADER_LENGTH) { - throw new BGPParsingException("Size doesn't match size specified in header. Passed: " + msgBody.readableBytes() - + "; Expected: " + (messageLength - MessageUtil.COMMON_HEADER_LENGTH) + ". "); - } - final Notification msg = parseBody(messageType, msgBody, messageLength); - if (msg == null) { - throw new BGPDocumentedException("Unhandled message type " + messageType, BGPError.BAD_MSG_TYPE, new byte[] { typeBytes }); - } - buffer.skipBytes(messageLength - MessageUtil.COMMON_HEADER_LENGTH); - return msg; - } + if (messageLength < MessageUtil.COMMON_HEADER_LENGTH) { + throw BGPDocumentedException.badMessageLength("Message length field not within valid range.", messageLength); + } + if (msgBody.readableBytes() != messageLength - MessageUtil.COMMON_HEADER_LENGTH) { + throw new BGPParsingException("Size doesn't match size specified in header. Passed: " + msgBody.readableBytes() + + "; Expected: " + (messageLength - MessageUtil.COMMON_HEADER_LENGTH) + ". "); + } + final Notification msg = parseBody(messageType, msgBody, messageLength); + if (msg == null) { + throw new BGPDocumentedException("Unhandled message type " + messageType, BGPError.BAD_MSG_TYPE, new byte[] { typeBytes }); + } + buffer.skipBytes(messageLength - MessageUtil.COMMON_HEADER_LENGTH); + return msg; + } - @Override - public final byte[] serializeMessage(final Notification message) { - Preconditions.checkNotNull(message, "BGPMessage is mandatory."); - final byte[] ret = serializeMessageImpl(message); - Preconditions.checkNotNull(ret, "Unknown instance of BGPMessage. Passed ", message.getClass()); - return ret; - } + @Override + public final byte[] serializeMessage(final Notification message) { + Preconditions.checkNotNull(message, "BGPMessage is mandatory."); + final byte[] ret = serializeMessageImpl(message); + Preconditions.checkNotNull(ret, "Unknown instance of BGPMessage. Passed ", message.getClass()); + return ret; + } } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AddressFamilyRegistry.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AddressFamilyRegistry.java index 306e17320b..df4c6b72d3 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AddressFamilyRegistry.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AddressFamilyRegistry.java @@ -10,6 +10,7 @@ package org.opendaylight.protocol.bgp.parser.spi; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily; public interface AddressFamilyRegistry { - Class classForFamily(int number); - Integer numberForClass(Class clazz); + Class classForFamily(int number); + + Integer numberForClass(Class clazz); } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AttributeParser.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AttributeParser.java index aa923da39a..fac9e15268 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AttributeParser.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AttributeParser.java @@ -17,10 +17,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mess * Common interface for attribute parser implementation. */ public interface AttributeParser { - /** - * @param buffer encoded attribute body in Bytebuf - * @param builder Path attributes builder. Guaranteed to contain all valid attributes whose type - * is numerically lower than this attribute's type. - */ - void parseAttribute(final ByteBuf buffer, PathAttributesBuilder builder) throws BGPDocumentedException, BGPParsingException; + /** + * @param buffer encoded attribute body in Bytebuf + * @param builder Path attributes builder. Guaranteed to contain all valid attributes whose type is numerically + * lower than this attribute's type. + */ + void parseAttribute(final ByteBuf buffer, PathAttributesBuilder builder) throws BGPDocumentedException, BGPParsingException; } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AttributeRegistry.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AttributeRegistry.java index e1999e6340..5102a4094b 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AttributeRegistry.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AttributeRegistry.java @@ -15,6 +15,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mess import org.opendaylight.yangtools.yang.binding.DataObject; public interface AttributeRegistry { - PathAttributes parseAttributes(ByteBuf buffer) throws BGPDocumentedException, BGPParsingException; - byte[] serializeAttribute(DataObject attribute); + PathAttributes parseAttributes(ByteBuf buffer) throws BGPDocumentedException, BGPParsingException; + + byte[] serializeAttribute(DataObject attribute); } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AttributeSerializer.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AttributeSerializer.java index 8637f809fd..6ed40737ca 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AttributeSerializer.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/AttributeSerializer.java @@ -10,5 +10,5 @@ package org.opendaylight.protocol.bgp.parser.spi; import org.opendaylight.yangtools.yang.binding.DataObject; public interface AttributeSerializer { - byte[] serializeAttribute(final DataObject attribute); + byte[] serializeAttribute(final DataObject attribute); } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BGPExtensionConsumerActivator.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BGPExtensionConsumerActivator.java index dafa0b786f..f01bbd378e 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BGPExtensionConsumerActivator.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BGPExtensionConsumerActivator.java @@ -8,6 +8,7 @@ package org.opendaylight.protocol.bgp.parser.spi; public interface BGPExtensionConsumerActivator { - void start(BGPExtensionConsumerContext context); - void stop(); + void start(BGPExtensionConsumerContext context); + + void stop(); } \ No newline at end of file diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BGPExtensionConsumerContext.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BGPExtensionConsumerContext.java index e7367098b5..13631fffe4 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BGPExtensionConsumerContext.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BGPExtensionConsumerContext.java @@ -8,16 +8,21 @@ package org.opendaylight.protocol.bgp.parser.spi; /** - * A single instance of a collection of extensions for use by consumers. This - * provides access to the various BGP-related registries. The registries are - * read-only and are populated by extension producers. + * A single instance of a collection of extensions for use by consumers. This provides access to the various BGP-related + * registries. The registries are read-only and are populated by extension producers. */ public interface BGPExtensionConsumerContext { - AddressFamilyRegistry getAddressFamilyRegistry(); - AttributeRegistry getAttributeRegistry(); - CapabilityRegistry getCapabilityRegistry(); - MessageRegistry getMessageRegistry(); - NlriRegistry getNlriRegistry(); - ParameterRegistry getParameterRegistry(); - SubsequentAddressFamilyRegistry getSubsequentAddressFamilyRegistry(); + AddressFamilyRegistry getAddressFamilyRegistry(); + + AttributeRegistry getAttributeRegistry(); + + CapabilityRegistry getCapabilityRegistry(); + + MessageRegistry getMessageRegistry(); + + NlriRegistry getNlriRegistry(); + + ParameterRegistry getParameterRegistry(); + + SubsequentAddressFamilyRegistry getSubsequentAddressFamilyRegistry(); } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BGPExtensionProviderActivator.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BGPExtensionProviderActivator.java index d397746ce6..8b8a252283 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BGPExtensionProviderActivator.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BGPExtensionProviderActivator.java @@ -8,6 +8,7 @@ package org.opendaylight.protocol.bgp.parser.spi; public interface BGPExtensionProviderActivator { - void start(BGPExtensionProviderContext context); - void stop(); + void start(BGPExtensionProviderContext context); + + void stop(); } \ No newline at end of file diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BGPExtensionProviderContext.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BGPExtensionProviderContext.java index 141a84324c..b132352991 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BGPExtensionProviderContext.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/BGPExtensionProviderContext.java @@ -16,34 +16,39 @@ import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.Notification; /** - * Context for registering providers of the various types of extension points BGP provides. - * These are then consumed by extension consumers. It also provides access to the context-wide - * object cache, which extension providers can use to increase the in-memory efficiency - * when the same objects are created over and over again. + * Context for registering providers of the various types of extension points BGP provides. These are then consumed by + * extension consumers. It also provides access to the context-wide object cache, which extension providers can use to + * increase the in-memory efficiency when the same objects are created over and over again. */ public interface BGPExtensionProviderContext extends BGPExtensionConsumerContext { - AutoCloseable registerAddressFamily(Class clazz, int number); - AutoCloseable registerSubsequentAddressFamily(Class clazz, int number); + AutoCloseable registerAddressFamily(Class clazz, int number); - AutoCloseable registerAttributeParser(int attributeType, AttributeParser parser); - AutoCloseable registerAttributeSerializer(Class attributeClass, AttributeSerializer serializer); + AutoCloseable registerSubsequentAddressFamily(Class clazz, int number); - AutoCloseable registerCapabilityParser(int capabilityType, CapabilityParser parser); - AutoCloseable registerCapabilitySerializer(Class capabilityClass, CapabilitySerializer serializer); + AutoCloseable registerAttributeParser(int attributeType, AttributeParser parser); - AutoCloseable registerMessageParser(int messageType, MessageParser parser); - AutoCloseable registerMessageSerializer(Class messageClass, MessageSerializer serializer); + AutoCloseable registerAttributeSerializer(Class attributeClass, AttributeSerializer serializer); - AutoCloseable registerNlriParser(Class afi, Class safi, NlriParser parser); - AutoCloseable registerNlriSerializer(Class nlriClass, NlriSerializer serializer); + AutoCloseable registerCapabilityParser(int capabilityType, CapabilityParser parser); - AutoCloseable registerParameterParser(int parameterType, ParameterParser parser); - AutoCloseable registerParameterSerializer(Class paramClass, ParameterSerializer serializer); + AutoCloseable registerCapabilitySerializer(Class capabilityClass, CapabilitySerializer serializer); - /** - * Get the context-wide cache for a particular object type. - * - * @return An object cache instance. - */ - ReferenceCache getReferenceCache(); + AutoCloseable registerMessageParser(int messageType, MessageParser parser); + + AutoCloseable registerMessageSerializer(Class messageClass, MessageSerializer serializer); + + AutoCloseable registerNlriParser(Class afi, Class safi, NlriParser parser); + + AutoCloseable registerNlriSerializer(Class nlriClass, NlriSerializer serializer); + + AutoCloseable registerParameterParser(int parameterType, ParameterParser parser); + + AutoCloseable registerParameterSerializer(Class paramClass, ParameterSerializer serializer); + + /** + * Get the context-wide cache for a particular object type. + * + * @return An object cache instance. + */ + ReferenceCache getReferenceCache(); } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/CapabilityParser.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/CapabilityParser.java index 471fe9567a..ba332421fc 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/CapabilityParser.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/CapabilityParser.java @@ -14,5 +14,5 @@ import org.opendaylight.protocol.bgp.parser.BGPParsingException; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.CParameters; public interface CapabilityParser { - CParameters parseCapability(ByteBuf buffer) throws BGPDocumentedException, BGPParsingException; + CParameters parseCapability(ByteBuf buffer) throws BGPDocumentedException, BGPParsingException; } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/CapabilityRegistry.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/CapabilityRegistry.java index 870647aa28..5d85151693 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/CapabilityRegistry.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/CapabilityRegistry.java @@ -14,6 +14,7 @@ import org.opendaylight.protocol.bgp.parser.BGPParsingException; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.CParameters; public interface CapabilityRegistry { - CParameters parseCapability(int type, ByteBuf buffer) throws BGPDocumentedException, BGPParsingException; - byte[] serializeCapability(CParameters capability); + CParameters parseCapability(int type, ByteBuf buffer) throws BGPDocumentedException, BGPParsingException; + + byte[] serializeCapability(CParameters capability); } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/CapabilitySerializer.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/CapabilitySerializer.java index 733d484a8e..304f11f022 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/CapabilitySerializer.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/CapabilitySerializer.java @@ -10,5 +10,5 @@ package org.opendaylight.protocol.bgp.parser.spi; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.CParameters; public interface CapabilitySerializer { - byte[] serializeCapability(final CParameters capability); + byte[] serializeCapability(final CParameters capability); } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/CapabilityUtil.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/CapabilityUtil.java index 67e5276652..4eea55ff27 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/CapabilityUtil.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/CapabilityUtil.java @@ -7,23 +7,23 @@ */ package org.opendaylight.protocol.bgp.parser.spi; -import org.opendaylight.protocol.util.ByteArray; - import com.google.common.primitives.UnsignedBytes; +import org.opendaylight.protocol.util.ByteArray; + public final class CapabilityUtil { - private static final int HEADER_SIZE = 2; + private static final int HEADER_SIZE = 2; - private CapabilityUtil() { + private CapabilityUtil() { - } + } - public static byte[] formatCapability(final int code, final byte[] value) { - final byte[] ret = new byte[HEADER_SIZE + value.length]; - ret[0] = UnsignedBytes.checkedCast(code); - ret[1] = UnsignedBytes.checkedCast(value.length); - ByteArray.copyWhole(value, ret, HEADER_SIZE); - return ret; - } + public static byte[] formatCapability(final int code, final byte[] value) { + final byte[] ret = new byte[HEADER_SIZE + value.length]; + ret[0] = UnsignedBytes.checkedCast(code); + ret[1] = UnsignedBytes.checkedCast(value.length); + ByteArray.copyWhole(value, ret, HEADER_SIZE); + return ret; + } } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/MessageParser.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/MessageParser.java index d8601663ab..0c9eec0814 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/MessageParser.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/MessageParser.java @@ -13,5 +13,5 @@ import org.opendaylight.protocol.bgp.parser.BGPDocumentedException; import org.opendaylight.yangtools.yang.binding.Notification; public interface MessageParser { - Notification parseMessageBody(ByteBuf body, int messageLength) throws BGPDocumentedException; + Notification parseMessageBody(ByteBuf body, int messageLength) throws BGPDocumentedException; } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/MessageRegistry.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/MessageRegistry.java index db98d714af..83ae7de21e 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/MessageRegistry.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/MessageRegistry.java @@ -14,6 +14,7 @@ import org.opendaylight.protocol.bgp.parser.BGPParsingException; import org.opendaylight.yangtools.yang.binding.Notification; public interface MessageRegistry { - Notification parseMessage(ByteBuf bytes) throws BGPDocumentedException, BGPParsingException; - byte[] serializeMessage(Notification message); + Notification parseMessage(ByteBuf bytes) throws BGPDocumentedException, BGPParsingException; + + byte[] serializeMessage(Notification message); } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/MessageSerializer.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/MessageSerializer.java index bf21f742b3..7d3482fbf6 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/MessageSerializer.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/MessageSerializer.java @@ -10,5 +10,5 @@ package org.opendaylight.protocol.bgp.parser.spi; import org.opendaylight.yangtools.yang.binding.Notification; public interface MessageSerializer { - byte[] serializeMessage(Notification message); + byte[] serializeMessage(Notification message); } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/MessageUtil.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/MessageUtil.java index fc500ee880..882fd47aaa 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/MessageUtil.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/MessageUtil.java @@ -7,41 +7,41 @@ */ package org.opendaylight.protocol.bgp.parser.spi; +import com.google.common.primitives.UnsignedBytes; + import java.util.Arrays; import org.opendaylight.protocol.util.ByteArray; -import com.google.common.primitives.UnsignedBytes; - public final class MessageUtil { - public static final int LENGTH_FIELD_LENGTH = 2; - public static final int MARKER_LENGTH = 16; - public static final int TYPE_FIELD_LENGTH = 1; - public static final int COMMON_HEADER_LENGTH = LENGTH_FIELD_LENGTH + TYPE_FIELD_LENGTH + MARKER_LENGTH; + public static final int LENGTH_FIELD_LENGTH = 2; + public static final int MARKER_LENGTH = 16; + public static final int TYPE_FIELD_LENGTH = 1; + public static final int COMMON_HEADER_LENGTH = LENGTH_FIELD_LENGTH + TYPE_FIELD_LENGTH + MARKER_LENGTH; - private MessageUtil() { + private MessageUtil() { - } + } - /** - * Serializes this BGP Message header to byte array. - * - * @param type message type to be formatted - * @param body message body - * - * @return byte array representation of this header - */ - public static byte[] formatMessage(final int type, final byte[] body) { - final byte[] retBytes = new byte[COMMON_HEADER_LENGTH + body.length]; + /** + * Serializes this BGP Message header to byte array. + * + * @param type message type to be formatted + * @param body message body + * + * @return byte array representation of this header + */ + public static byte[] formatMessage(final int type, final byte[] body) { + final byte[] retBytes = new byte[COMMON_HEADER_LENGTH + body.length]; - Arrays.fill(retBytes, 0, MARKER_LENGTH, UnsignedBytes.MAX_VALUE); - System.arraycopy(ByteArray.intToBytes(body.length + COMMON_HEADER_LENGTH, LENGTH_FIELD_LENGTH), 0, retBytes, MARKER_LENGTH, - LENGTH_FIELD_LENGTH); + Arrays.fill(retBytes, 0, MARKER_LENGTH, UnsignedBytes.MAX_VALUE); + System.arraycopy(ByteArray.intToBytes(body.length + COMMON_HEADER_LENGTH, LENGTH_FIELD_LENGTH), 0, retBytes, MARKER_LENGTH, + LENGTH_FIELD_LENGTH); - retBytes[MARKER_LENGTH + LENGTH_FIELD_LENGTH] = UnsignedBytes.checkedCast(type); - ByteArray.copyWhole(body, retBytes, COMMON_HEADER_LENGTH); + retBytes[MARKER_LENGTH + LENGTH_FIELD_LENGTH] = UnsignedBytes.checkedCast(type); + ByteArray.copyWhole(body, retBytes, COMMON_HEADER_LENGTH); - return retBytes; - } + return retBytes; + } } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/NlriParser.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/NlriParser.java index fa7cd32d7a..e93a7f381a 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/NlriParser.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/NlriParser.java @@ -14,6 +14,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mult import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpUnreachNlriBuilder; public interface NlriParser { - void parseNlri(ByteBuf nlri, MpUnreachNlriBuilder builder) throws BGPParsingException; - void parseNlri(ByteBuf nlri, byte[] nextHop, MpReachNlriBuilder builder) throws BGPParsingException; + void parseNlri(ByteBuf nlri, MpUnreachNlriBuilder builder) throws BGPParsingException; + + void parseNlri(ByteBuf nlri, byte[] nextHop, MpReachNlriBuilder builder) throws BGPParsingException; } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/NlriRegistry.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/NlriRegistry.java index 00c877295d..bf8b497f66 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/NlriRegistry.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/NlriRegistry.java @@ -14,6 +14,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mult import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpUnreachNlri; public interface NlriRegistry { - MpReachNlri parseMpReach(final ByteBuf buffer) throws BGPParsingException; - MpUnreachNlri parseMpUnreach(final ByteBuf buffer) throws BGPParsingException; + MpReachNlri parseMpReach(final ByteBuf buffer) throws BGPParsingException; + + MpUnreachNlri parseMpUnreach(final ByteBuf buffer) throws BGPParsingException; } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/NlriSerializer.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/NlriSerializer.java index d4bc432c92..972e0e96e9 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/NlriSerializer.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/NlriSerializer.java @@ -10,5 +10,5 @@ package org.opendaylight.protocol.bgp.parser.spi; import org.opendaylight.yangtools.yang.binding.DataObject; public interface NlriSerializer { - byte[] serializeAttribute(DataObject attribute); + byte[] serializeAttribute(DataObject attribute); } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/NlriUtil.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/NlriUtil.java index b435cd5821..ad61c4379f 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/NlriUtil.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/NlriUtil.java @@ -19,28 +19,28 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv6.next.hop._case.Ipv6NextHopBuilder; public final class NlriUtil { - private NlriUtil() { - } + private NlriUtil() { + } - public static void parseNextHop(final byte[] bytes, final MpReachNlriBuilder builder) throws BGPParsingException { - final CNextHop addr; + public static void parseNextHop(final byte[] bytes, final MpReachNlriBuilder builder) throws BGPParsingException { + final CNextHop addr; - switch (bytes.length) { - case Ipv4Util.IP4_LENGTH: - addr = new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder().setGlobal(Ipv4Util.addressForBytes(bytes)).build()).build(); - break; - case Ipv6Util.IPV6_LENGTH: - addr = new Ipv6NextHopCaseBuilder().setIpv6NextHop(new Ipv6NextHopBuilder().setGlobal(Ipv6Util.addressForBytes(bytes)).build()).build(); - break; - case Ipv6Util.IPV6_LENGTH * 2: - addr = new Ipv6NextHopCaseBuilder().setIpv6NextHop( - new Ipv6NextHopBuilder().setGlobal(Ipv6Util.addressForBytes(ByteArray.subByte(bytes, 0, Ipv6Util.IPV6_LENGTH))).setLinkLocal( - Ipv6Util.addressForBytes(ByteArray.subByte(bytes, Ipv6Util.IPV6_LENGTH, Ipv6Util.IPV6_LENGTH))).build()).build(); - break; - default: - throw new BGPParsingException("Cannot parse NEXT_HOP attribute. Wrong bytes length: " + bytes.length); - } + switch (bytes.length) { + case Ipv4Util.IP4_LENGTH: + addr = new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder().setGlobal(Ipv4Util.addressForBytes(bytes)).build()).build(); + break; + case Ipv6Util.IPV6_LENGTH: + addr = new Ipv6NextHopCaseBuilder().setIpv6NextHop(new Ipv6NextHopBuilder().setGlobal(Ipv6Util.addressForBytes(bytes)).build()).build(); + break; + case Ipv6Util.IPV6_LENGTH * 2: + addr = new Ipv6NextHopCaseBuilder().setIpv6NextHop( + new Ipv6NextHopBuilder().setGlobal(Ipv6Util.addressForBytes(ByteArray.subByte(bytes, 0, Ipv6Util.IPV6_LENGTH))).setLinkLocal( + Ipv6Util.addressForBytes(ByteArray.subByte(bytes, Ipv6Util.IPV6_LENGTH, Ipv6Util.IPV6_LENGTH))).build()).build(); + break; + default: + throw new BGPParsingException("Cannot parse NEXT_HOP attribute. Wrong bytes length: " + bytes.length); + } - builder.setCNextHop(addr); - } + builder.setCNextHop(addr); + } } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/ParameterParser.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/ParameterParser.java index a07513889f..8398a07249 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/ParameterParser.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/ParameterParser.java @@ -14,5 +14,5 @@ import org.opendaylight.protocol.bgp.parser.BGPParsingException; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.BgpParameters; public interface ParameterParser { - BgpParameters parseParameter(ByteBuf buffer) throws BGPParsingException, BGPDocumentedException; + BgpParameters parseParameter(ByteBuf buffer) throws BGPParsingException, BGPDocumentedException; } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/ParameterRegistry.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/ParameterRegistry.java index 4500ecb0b0..cb46a51834 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/ParameterRegistry.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/ParameterRegistry.java @@ -14,6 +14,7 @@ import org.opendaylight.protocol.bgp.parser.BGPParsingException; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.BgpParameters; public interface ParameterRegistry { - BgpParameters parseParameter(int parameterType, ByteBuf bytes) throws BGPParsingException, BGPDocumentedException; - byte[] serializeParameter(BgpParameters parameter); + BgpParameters parseParameter(int parameterType, ByteBuf bytes) throws BGPParsingException, BGPDocumentedException; + + byte[] serializeParameter(BgpParameters parameter); } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/ParameterSerializer.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/ParameterSerializer.java index 37e8c03b42..c868d24c51 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/ParameterSerializer.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/ParameterSerializer.java @@ -10,5 +10,5 @@ package org.opendaylight.protocol.bgp.parser.spi; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.BgpParameters; public interface ParameterSerializer { - byte[] serializeParameter(BgpParameters parameter); + byte[] serializeParameter(BgpParameters parameter); } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/ParameterUtil.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/ParameterUtil.java index bc9e446899..1b47136695 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/ParameterUtil.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/ParameterUtil.java @@ -11,17 +11,17 @@ import com.google.common.primitives.UnsignedBytes; public final class ParameterUtil { - private static final int HEADER_SIZE = 2; + private static final int HEADER_SIZE = 2; - private ParameterUtil() { + private ParameterUtil() { - } + } - public static byte[] formatParameter(final int type, final byte[] value) { - final byte[] bytes = new byte[HEADER_SIZE + value.length]; - bytes[0] = UnsignedBytes.checkedCast(type); - bytes[1] = UnsignedBytes.checkedCast(value.length); - System.arraycopy(value, 0, bytes, HEADER_SIZE, value.length); - return bytes; - } + public static byte[] formatParameter(final int type, final byte[] value) { + final byte[] bytes = new byte[HEADER_SIZE + value.length]; + bytes[0] = UnsignedBytes.checkedCast(type); + bytes[1] = UnsignedBytes.checkedCast(value.length); + System.arraycopy(value, 0, bytes, HEADER_SIZE, value.length); + return bytes; + } } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/SubsequentAddressFamilyRegistry.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/SubsequentAddressFamilyRegistry.java index d08d5994ef..840cf19ed0 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/SubsequentAddressFamilyRegistry.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/SubsequentAddressFamilyRegistry.java @@ -10,6 +10,7 @@ package org.opendaylight.protocol.bgp.parser.spi; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily; public interface SubsequentAddressFamilyRegistry { - Class classForFamily(int number); - Integer numberForClass(Class clazz); + Class classForFamily(int number); + + Integer numberForClass(Class clazz); } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/AbstractFamilyRegistry.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/AbstractFamilyRegistry.java index 80c1d3740d..41d863fe97 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/AbstractFamilyRegistry.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/AbstractFamilyRegistry.java @@ -7,47 +7,47 @@ */ package org.opendaylight.protocol.bgp.parser.spi.pojo; +import com.google.common.base.Preconditions; + import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.opendaylight.protocol.concepts.AbstractRegistration; -import com.google.common.base.Preconditions; - abstract class AbstractFamilyRegistry { - private final Map, N> classToNumber = new ConcurrentHashMap<>(); - private final Map> numberToClass = new ConcurrentHashMap<>(); + private final Map, N> classToNumber = new ConcurrentHashMap<>(); + private final Map> numberToClass = new ConcurrentHashMap<>(); - protected synchronized AutoCloseable registerFamily(final Class clazz, final N number) { - Preconditions.checkNotNull(clazz); + protected synchronized AutoCloseable registerFamily(final Class clazz, final N number) { + Preconditions.checkNotNull(clazz); - final Class c = numberToClass.get(number); - Preconditions.checkState(c == null, "Number " + number + " already registered to " + c); + final Class c = numberToClass.get(number); + Preconditions.checkState(c == null, "Number " + number + " already registered to " + c); - final N n = classToNumber.get(clazz); - Preconditions.checkState(n == null, "Class " + clazz + " already registered to " + n); + final N n = classToNumber.get(clazz); + Preconditions.checkState(n == null, "Class " + clazz + " already registered to " + n); - numberToClass.put(number, clazz); - classToNumber.put(clazz, number); + numberToClass.put(number, clazz); + classToNumber.put(clazz, number); - final Object lock = this; - return new AbstractRegistration() { + final Object lock = this; + return new AbstractRegistration() { - @Override - protected void removeRegistration() { - synchronized (lock) { - classToNumber.remove(clazz); - numberToClass.remove(number); - } - } - }; - } + @Override + protected void removeRegistration() { + synchronized (lock) { + classToNumber.remove(clazz); + numberToClass.remove(number); + } + } + }; + } - protected Class classForFamily(final N number) { - return numberToClass.get(number); - } + protected Class classForFamily(final N number) { + return numberToClass.get(number); + } - protected N numberForClass(final Class clazz) { - return classToNumber.get(clazz); - } + protected N numberForClass(final Class clazz) { + return classToNumber.get(clazz); + } } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/ServiceLoaderBGPExtensionProviderContext.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/ServiceLoaderBGPExtensionProviderContext.java index 18977330a8..9e84d915fc 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/ServiceLoaderBGPExtensionProviderContext.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/ServiceLoaderBGPExtensionProviderContext.java @@ -28,8 +28,7 @@ public final class ServiceLoaderBGPExtensionProviderContext { public static BGPExtensionProviderContext create() { final BGPExtensionProviderContext ctx = new SimpleBGPExtensionProviderContext(); - final ServiceLoader loader = ServiceLoader - .load(BGPExtensionProviderActivator.class); + final ServiceLoader loader = ServiceLoader.load(BGPExtensionProviderActivator.class); for (BGPExtensionProviderActivator a : loader) { a.start(ctx); } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleAddressFamilyRegistry.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleAddressFamilyRegistry.java index 40cc0748a1..5ececa2826 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleAddressFamilyRegistry.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleAddressFamilyRegistry.java @@ -7,25 +7,25 @@ */ package org.opendaylight.protocol.bgp.parser.spi.pojo; +import com.google.common.base.Preconditions; + import org.opendaylight.protocol.bgp.parser.spi.AddressFamilyRegistry; import org.opendaylight.protocol.util.Values; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily; -import com.google.common.base.Preconditions; - final class SimpleAddressFamilyRegistry extends AbstractFamilyRegistry implements AddressFamilyRegistry { - AutoCloseable registerAddressFamily(final Class clazz, final int number) { - Preconditions.checkArgument(number >= 0 && number <= Values.UNSIGNED_SHORT_MAX_VALUE); - return super.registerFamily(clazz, number); - } + AutoCloseable registerAddressFamily(final Class clazz, final int number) { + Preconditions.checkArgument(number >= 0 && number <= Values.UNSIGNED_SHORT_MAX_VALUE); + return super.registerFamily(clazz, number); + } - @Override - public Class classForFamily(final int number) { - return super.classForFamily(number); - } + @Override + public Class classForFamily(final int number) { + return super.classForFamily(number); + } - @Override - public Integer numberForClass(final Class clazz) { - return super.numberForClass(clazz); - } + @Override + public Integer numberForClass(final Class clazz) { + return super.numberForClass(clazz); + } } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleAttributeRegistry.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleAttributeRegistry.java index 0316ac23b4..5faad29fc2 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleAttributeRegistry.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleAttributeRegistry.java @@ -7,6 +7,9 @@ */ package org.opendaylight.protocol.bgp.parser.spi.pojo; +import com.google.common.base.Preconditions; +import com.google.common.primitives.UnsignedBytes; + import io.netty.buffer.ByteBuf; import java.util.Map; @@ -29,97 +32,94 @@ import org.opendaylight.yangtools.yang.binding.DataObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; -import com.google.common.primitives.UnsignedBytes; - final class SimpleAttributeRegistry implements AttributeRegistry { - private static final class RawAttribute { - private final AttributeParser parser; - private final ByteBuf buffer; + private static final class RawAttribute { + private final AttributeParser parser; + private final ByteBuf buffer; - public RawAttribute(final AttributeParser parser, final ByteBuf buffer) { - this.parser = Preconditions.checkNotNull(parser); - this.buffer = Preconditions.checkNotNull(buffer); - } - } + public RawAttribute(final AttributeParser parser, final ByteBuf buffer) { + this.parser = Preconditions.checkNotNull(parser); + this.buffer = Preconditions.checkNotNull(buffer); + } + } - private static final Logger LOG = LoggerFactory.getLogger(SimpleAttributeRegistry.class); - private static final int OPTIONAL_BIT = 0; - private static final int TRANSITIVE_BIT = 1; - private static final int PARTIAL_BIT = 2; - private static final int EXTENDED_LENGTH_BIT = 3; - private final HandlerRegistry handlers = new HandlerRegistry<>(); + private static final Logger LOG = LoggerFactory.getLogger(SimpleAttributeRegistry.class); + private static final int OPTIONAL_BIT = 0; + private static final int TRANSITIVE_BIT = 1; + private static final int PARTIAL_BIT = 2; + private static final int EXTENDED_LENGTH_BIT = 3; + private final HandlerRegistry handlers = new HandlerRegistry<>(); - AutoCloseable registerAttributeParser(final int attributeType, final AttributeParser parser) { - Preconditions.checkArgument(attributeType >= 0 && attributeType <= Values.UNSIGNED_BYTE_MAX_VALUE); - return this.handlers.registerParser(attributeType, parser); - } + AutoCloseable registerAttributeParser(final int attributeType, final AttributeParser parser) { + Preconditions.checkArgument(attributeType >= 0 && attributeType <= Values.UNSIGNED_BYTE_MAX_VALUE); + return this.handlers.registerParser(attributeType, parser); + } - AutoCloseable registerAttributeSerializer(final Class paramClass, final AttributeSerializer serializer) { - return this.handlers.registerSerializer(paramClass, serializer); - } + AutoCloseable registerAttributeSerializer(final Class paramClass, final AttributeSerializer serializer) { + return this.handlers.registerSerializer(paramClass, serializer); + } - private int addAttribute(final ByteBuf buffer, final Map attributes) throws BGPDocumentedException { - final boolean[] flags = ByteArray.parseBits(buffer.readByte()); - final Integer type = UnsignedBytes.toInt(buffer.readByte()); - final int hdrlen; - final int len; - if (flags[EXTENDED_LENGTH_BIT]) { - len = UnsignedBytes.toInt(buffer.readByte()) * 256 + UnsignedBytes.toInt(buffer.readByte()); - hdrlen = 4; - } else { - len = UnsignedBytes.toInt(buffer.readByte()); - hdrlen = 3; - } - if (!attributes.containsKey(type)) { - final AttributeParser parser = this.handlers.getParser(type); - if (parser == null) { - if (!flags[OPTIONAL_BIT]) { - throw new BGPDocumentedException("Well known attribute not recognized.", BGPError.WELL_KNOWN_ATTR_NOT_RECOGNIZED); - } - if (flags[TRANSITIVE_BIT]) { - // FIXME: transitive attributes need to be preserved - LOG.warn("Losing unrecognized transitive attribute {}", type); - } else { - LOG.debug("Ignoring unrecognized attribute type {}", type); - } - } else { - attributes.put(type, new RawAttribute(parser, buffer.slice(buffer.readerIndex(), len))); - buffer.skipBytes(len); - } - } else { - LOG.debug("Ignoring duplicate attribute type {}", type); - } - return hdrlen + len; - } + private int addAttribute(final ByteBuf buffer, final Map attributes) throws BGPDocumentedException { + final boolean[] flags = ByteArray.parseBits(buffer.readByte()); + final Integer type = UnsignedBytes.toInt(buffer.readByte()); + final int hdrlen; + final int len; + if (flags[EXTENDED_LENGTH_BIT]) { + len = UnsignedBytes.toInt(buffer.readByte()) * 256 + UnsignedBytes.toInt(buffer.readByte()); + hdrlen = 4; + } else { + len = UnsignedBytes.toInt(buffer.readByte()); + hdrlen = 3; + } + if (!attributes.containsKey(type)) { + final AttributeParser parser = this.handlers.getParser(type); + if (parser == null) { + if (!flags[OPTIONAL_BIT]) { + throw new BGPDocumentedException("Well known attribute not recognized.", BGPError.WELL_KNOWN_ATTR_NOT_RECOGNIZED); + } + if (flags[TRANSITIVE_BIT]) { + // FIXME: transitive attributes need to be preserved + LOG.warn("Losing unrecognized transitive attribute {}", type); + } else { + LOG.debug("Ignoring unrecognized attribute type {}", type); + } + } else { + attributes.put(type, new RawAttribute(parser, buffer.slice(buffer.readerIndex(), len))); + buffer.skipBytes(len); + } + } else { + LOG.debug("Ignoring duplicate attribute type {}", type); + } + return hdrlen + len; + } - @Override - public PathAttributes parseAttributes(final ByteBuf buffer) throws BGPDocumentedException, BGPParsingException { - final TreeMap attributes = new TreeMap<>(); - while (buffer.readableBytes() != 0) { - addAttribute(buffer, attributes); - } - /* - * TreeMap guarantees that we will be invoking the parser in the order - * of increasing attribute type. - */ - final PathAttributesBuilder builder = new PathAttributesBuilder(); - for (final Entry e : attributes.entrySet()) { - LOG.debug("Parsing attribute type {}", e.getKey()); + @Override + public PathAttributes parseAttributes(final ByteBuf buffer) throws BGPDocumentedException, BGPParsingException { + final TreeMap attributes = new TreeMap<>(); + while (buffer.readableBytes() != 0) { + addAttribute(buffer, attributes); + } + /* + * TreeMap guarantees that we will be invoking the parser in the order + * of increasing attribute type. + */ + final PathAttributesBuilder builder = new PathAttributesBuilder(); + for (final Entry e : attributes.entrySet()) { + LOG.debug("Parsing attribute type {}", e.getKey()); - final RawAttribute a = e.getValue(); - a.parser.parseAttribute(a.buffer, builder); - } + final RawAttribute a = e.getValue(); + a.parser.parseAttribute(a.buffer, builder); + } - return builder.build(); - } + return builder.build(); + } - @Override - public byte[] serializeAttribute(final DataObject attribute) { - final AttributeSerializer serializer = this.handlers.getSerializer(attribute.getImplementedInterface()); - if (serializer == null) { - return null; - } - return serializer.serializeAttribute(attribute); - } + @Override + public byte[] serializeAttribute(final DataObject attribute) { + final AttributeSerializer serializer = this.handlers.getSerializer(attribute.getImplementedInterface()); + if (serializer == null) { + return null; + } + return serializer.serializeAttribute(attribute); + } } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleBGPExtensionConsumerContext.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleBGPExtensionConsumerContext.java index 5db9db44a6..ea6c768157 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleBGPExtensionConsumerContext.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleBGPExtensionConsumerContext.java @@ -17,46 +17,46 @@ import org.opendaylight.protocol.bgp.parser.spi.ParameterRegistry; import org.opendaylight.protocol.bgp.parser.spi.SubsequentAddressFamilyRegistry; class SimpleBGPExtensionConsumerContext implements BGPExtensionConsumerContext { - protected final SimpleAddressFamilyRegistry afiReg = new SimpleAddressFamilyRegistry(); - protected final SimpleAttributeRegistry attrReg = new SimpleAttributeRegistry(); - protected final SimpleCapabilityRegistry capReg = new SimpleCapabilityRegistry(); - protected final SimpleMessageRegistry msgReg = new SimpleMessageRegistry(); - protected final SimpleSubsequentAddressFamilyRegistry safiReg = new SimpleSubsequentAddressFamilyRegistry(); - protected final SimpleParameterRegistry paramReg = new SimpleParameterRegistry(); - protected final SimpleNlriRegistry nlriReg = new SimpleNlriRegistry(this.afiReg, this.safiReg); - - @Override - public final AddressFamilyRegistry getAddressFamilyRegistry() { - return this.afiReg; - } - - @Override - public final AttributeRegistry getAttributeRegistry() { - return this.attrReg; - } - - @Override - public final CapabilityRegistry getCapabilityRegistry() { - return this.capReg; - } - - @Override - public final MessageRegistry getMessageRegistry() { - return this.msgReg; - } - - @Override - public final NlriRegistry getNlriRegistry() { - return this.nlriReg; - } - - @Override - public final ParameterRegistry getParameterRegistry() { - return this.paramReg; - } - - @Override - public final SubsequentAddressFamilyRegistry getSubsequentAddressFamilyRegistry() { - return this.safiReg; - } + protected final SimpleAddressFamilyRegistry afiReg = new SimpleAddressFamilyRegistry(); + protected final SimpleAttributeRegistry attrReg = new SimpleAttributeRegistry(); + protected final SimpleCapabilityRegistry capReg = new SimpleCapabilityRegistry(); + protected final SimpleMessageRegistry msgReg = new SimpleMessageRegistry(); + protected final SimpleSubsequentAddressFamilyRegistry safiReg = new SimpleSubsequentAddressFamilyRegistry(); + protected final SimpleParameterRegistry paramReg = new SimpleParameterRegistry(); + protected final SimpleNlriRegistry nlriReg = new SimpleNlriRegistry(this.afiReg, this.safiReg); + + @Override + public final AddressFamilyRegistry getAddressFamilyRegistry() { + return this.afiReg; + } + + @Override + public final AttributeRegistry getAttributeRegistry() { + return this.attrReg; + } + + @Override + public final CapabilityRegistry getCapabilityRegistry() { + return this.capReg; + } + + @Override + public final MessageRegistry getMessageRegistry() { + return this.msgReg; + } + + @Override + public final NlriRegistry getNlriRegistry() { + return this.nlriReg; + } + + @Override + public final ParameterRegistry getParameterRegistry() { + return this.paramReg; + } + + @Override + public final SubsequentAddressFamilyRegistry getSubsequentAddressFamilyRegistry() { + return this.safiReg; + } } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleBGPExtensionProviderContext.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleBGPExtensionProviderContext.java index 1d168f81ca..7219feff91 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleBGPExtensionProviderContext.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleBGPExtensionProviderContext.java @@ -7,6 +7,10 @@ */ package org.opendaylight.protocol.bgp.parser.spi.pojo; +import com.google.common.base.Preconditions; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; + import java.util.concurrent.atomic.AtomicReference; import org.opendaylight.protocol.bgp.parser.spi.AttributeParser; @@ -28,117 +32,114 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.Notification; -import com.google.common.base.Preconditions; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; - public class SimpleBGPExtensionProviderContext extends SimpleBGPExtensionConsumerContext implements BGPExtensionProviderContext { - public static final int DEFAULT_MAXIMUM_CACHED_OBJECTS = 100000; - - private final AtomicReference> cacheRef; - private final ReferenceCache referenceCache = new ReferenceCache() { - @Override - public T getSharedReference(final T object) { - final Cache cache = cacheRef.get(); - - @SuppressWarnings("unchecked") - final T ret = (T) cache.getIfPresent(object); - if (ret == null) { - cache.put(object, object); - return object; - } - - return ret; - } - }; - private final int maximumCachedObjects; - - public SimpleBGPExtensionProviderContext() { - this(DEFAULT_MAXIMUM_CACHED_OBJECTS); - } - - public SimpleBGPExtensionProviderContext(final int maximumCachedObjects) { - this.maximumCachedObjects = maximumCachedObjects; - - final Cache cache = CacheBuilder.newBuilder().maximumSize(maximumCachedObjects).build(); - cacheRef = new AtomicReference>(cache); - } - - @Override - public AutoCloseable registerAddressFamily(final Class clazz, final int number) { - return afiReg.registerAddressFamily(clazz, number); - } - - @Override - public AutoCloseable registerAttributeParser(final int attributeType, final AttributeParser parser) { - return attrReg.registerAttributeParser(attributeType, parser); - } - - @Override - public AutoCloseable registerAttributeSerializer(final Class attributeClass, final AttributeSerializer serializer) { - return attrReg.registerAttributeSerializer(attributeClass, serializer); - } - - @Override - public AutoCloseable registerCapabilityParser(final int capabilityType, final CapabilityParser parser) { - return capReg.registerCapabilityParser(capabilityType, parser); - } - - @Override - public AutoCloseable registerCapabilitySerializer(final Class capabilityClass, final CapabilitySerializer serializer) { - return capReg.registerCapabilitySerializer(capabilityClass, serializer); - } - - @Override - public AutoCloseable registerMessageParser(final int messageType, final MessageParser parser) { - return msgReg.registerMessageParser(messageType, parser); - } - - @Override - public AutoCloseable registerMessageSerializer(final Class messageClass, final MessageSerializer serializer) { - return msgReg.registerMessageSerializer(messageClass, serializer); - } - - @Override - public AutoCloseable registerNlriParser(final Class afi, final Class safi, - final NlriParser parser) { - return nlriReg.registerNlriParser(afi, safi, parser); - } - - @Override - public AutoCloseable registerNlriSerializer(final Class nlriClass, final NlriSerializer serializer) { - throw new UnsupportedOperationException("NLRI serialization not implemented"); - } - - @Override - public AutoCloseable registerParameterParser(final int parameterType, final ParameterParser parser) { - return paramReg.registerParameterParser(parameterType, parser); - } - - @Override - public AutoCloseable registerParameterSerializer(final Class paramClass, final ParameterSerializer serializer) { - return paramReg.registerParameterSerializer(paramClass, serializer); - } - - @Override - public AutoCloseable registerSubsequentAddressFamily(final Class clazz, final int number) { - return safiReg.registerSubsequentAddressFamily(clazz, number); - } - - @Override - public ReferenceCache getReferenceCache() { - return referenceCache; - } - - public final synchronized int getMaximumCachedObjects() { - return maximumCachedObjects; - } - - public final synchronized void setMaximumCachedObjects(final int maximumCachedObjects) { - Preconditions.checkArgument(maximumCachedObjects >= 0); - - Cache newCache = CacheBuilder.newBuilder().maximumSize(maximumCachedObjects).build(); - newCache.putAll(cacheRef.get().asMap()); - cacheRef.set(newCache); - } + public static final int DEFAULT_MAXIMUM_CACHED_OBJECTS = 100000; + + private final AtomicReference> cacheRef; + private final ReferenceCache referenceCache = new ReferenceCache() { + @Override + public T getSharedReference(final T object) { + final Cache cache = cacheRef.get(); + + @SuppressWarnings("unchecked") + final T ret = (T) cache.getIfPresent(object); + if (ret == null) { + cache.put(object, object); + return object; + } + + return ret; + } + }; + private final int maximumCachedObjects; + + public SimpleBGPExtensionProviderContext() { + this(DEFAULT_MAXIMUM_CACHED_OBJECTS); + } + + public SimpleBGPExtensionProviderContext(final int maximumCachedObjects) { + this.maximumCachedObjects = maximumCachedObjects; + + final Cache cache = CacheBuilder.newBuilder().maximumSize(maximumCachedObjects).build(); + cacheRef = new AtomicReference>(cache); + } + + @Override + public AutoCloseable registerAddressFamily(final Class clazz, final int number) { + return afiReg.registerAddressFamily(clazz, number); + } + + @Override + public AutoCloseable registerAttributeParser(final int attributeType, final AttributeParser parser) { + return attrReg.registerAttributeParser(attributeType, parser); + } + + @Override + public AutoCloseable registerAttributeSerializer(final Class attributeClass, final AttributeSerializer serializer) { + return attrReg.registerAttributeSerializer(attributeClass, serializer); + } + + @Override + public AutoCloseable registerCapabilityParser(final int capabilityType, final CapabilityParser parser) { + return capReg.registerCapabilityParser(capabilityType, parser); + } + + @Override + public AutoCloseable registerCapabilitySerializer(final Class capabilityClass, + final CapabilitySerializer serializer) { + return capReg.registerCapabilitySerializer(capabilityClass, serializer); + } + + @Override + public AutoCloseable registerMessageParser(final int messageType, final MessageParser parser) { + return msgReg.registerMessageParser(messageType, parser); + } + + @Override + public AutoCloseable registerMessageSerializer(final Class messageClass, final MessageSerializer serializer) { + return msgReg.registerMessageSerializer(messageClass, serializer); + } + + @Override + public AutoCloseable registerNlriParser(final Class afi, final Class safi, + final NlriParser parser) { + return nlriReg.registerNlriParser(afi, safi, parser); + } + + @Override + public AutoCloseable registerNlriSerializer(final Class nlriClass, final NlriSerializer serializer) { + throw new UnsupportedOperationException("NLRI serialization not implemented"); + } + + @Override + public AutoCloseable registerParameterParser(final int parameterType, final ParameterParser parser) { + return paramReg.registerParameterParser(parameterType, parser); + } + + @Override + public AutoCloseable registerParameterSerializer(final Class paramClass, final ParameterSerializer serializer) { + return paramReg.registerParameterSerializer(paramClass, serializer); + } + + @Override + public AutoCloseable registerSubsequentAddressFamily(final Class clazz, final int number) { + return safiReg.registerSubsequentAddressFamily(clazz, number); + } + + @Override + public ReferenceCache getReferenceCache() { + return referenceCache; + } + + public final synchronized int getMaximumCachedObjects() { + return maximumCachedObjects; + } + + public final synchronized void setMaximumCachedObjects(final int maximumCachedObjects) { + Preconditions.checkArgument(maximumCachedObjects >= 0); + + Cache newCache = CacheBuilder.newBuilder().maximumSize(maximumCachedObjects).build(); + newCache.putAll(cacheRef.get().asMap()); + cacheRef.set(newCache); + } } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleCapabilityRegistry.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleCapabilityRegistry.java index 0f870b58dc..45185e0792 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleCapabilityRegistry.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleCapabilityRegistry.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.parser.spi.pojo; +import com.google.common.base.Preconditions; + import io.netty.buffer.ByteBuf; import org.opendaylight.protocol.bgp.parser.BGPDocumentedException; @@ -19,36 +21,34 @@ import org.opendaylight.protocol.util.Values; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.CParameters; import org.opendaylight.yangtools.yang.binding.DataContainer; -import com.google.common.base.Preconditions; - final class SimpleCapabilityRegistry implements CapabilityRegistry { - private final HandlerRegistry handlers = new HandlerRegistry<>(); - - AutoCloseable registerCapabilityParser(final int messageType, final CapabilityParser parser) { - Preconditions.checkArgument(messageType >= 0 && messageType <= Values.UNSIGNED_BYTE_MAX_VALUE); - return this.handlers.registerParser(messageType, parser); - } - - AutoCloseable registerCapabilitySerializer(final Class paramClass, final CapabilitySerializer serializer) { - return this.handlers.registerSerializer(paramClass, serializer); - } - - @Override - public CParameters parseCapability(final int type, final ByteBuf buffer) throws BGPDocumentedException, BGPParsingException { - final CapabilityParser parser = this.handlers.getParser(type); - if (parser == null) { - return null; - } - return parser.parseCapability(buffer); - } - - @Override - public byte[] serializeCapability(final CParameters capability) { - final CapabilitySerializer serializer = this.handlers.getSerializer(capability.getImplementedInterface()); - if (serializer == null) { - return null; - } - - return serializer.serializeCapability(capability); - } + private final HandlerRegistry handlers = new HandlerRegistry<>(); + + AutoCloseable registerCapabilityParser(final int messageType, final CapabilityParser parser) { + Preconditions.checkArgument(messageType >= 0 && messageType <= Values.UNSIGNED_BYTE_MAX_VALUE); + return this.handlers.registerParser(messageType, parser); + } + + AutoCloseable registerCapabilitySerializer(final Class paramClass, final CapabilitySerializer serializer) { + return this.handlers.registerSerializer(paramClass, serializer); + } + + @Override + public CParameters parseCapability(final int type, final ByteBuf buffer) throws BGPDocumentedException, BGPParsingException { + final CapabilityParser parser = this.handlers.getParser(type); + if (parser == null) { + return null; + } + return parser.parseCapability(buffer); + } + + @Override + public byte[] serializeCapability(final CParameters capability) { + final CapabilitySerializer serializer = this.handlers.getSerializer(capability.getImplementedInterface()); + if (serializer == null) { + return null; + } + + return serializer.serializeCapability(capability); + } } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleMessageRegistry.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleMessageRegistry.java index e166d6f9f1..57b815e684 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleMessageRegistry.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleMessageRegistry.java @@ -18,33 +18,33 @@ import org.opendaylight.yangtools.yang.binding.DataContainer; import org.opendaylight.yangtools.yang.binding.Notification; final class SimpleMessageRegistry extends AbstractMessageRegistry { - private final HandlerRegistry handlers = new HandlerRegistry<>(); - - @Override - protected Notification parseBody(final int type, final ByteBuf body, final int messageLength) throws BGPDocumentedException { - final MessageParser parser = this.handlers.getParser(type); - if (parser == null) { - return null; - } - - return parser.parseMessageBody(body, messageLength); - } - - @Override - protected byte[] serializeMessageImpl(final Notification message) { - final MessageSerializer serializer = this.handlers.getSerializer(message.getImplementedInterface()); - if (serializer == null) { - return null; - } - - return serializer.serializeMessage(message); - } - - AutoCloseable registerMessageParser(final int messageType, final MessageParser parser) { - return this.handlers.registerParser(messageType, parser); - } - - AutoCloseable registerMessageSerializer(final Class messageClass, final MessageSerializer serializer) { - return this.handlers.registerSerializer(messageClass, serializer); - } + private final HandlerRegistry handlers = new HandlerRegistry<>(); + + @Override + protected Notification parseBody(final int type, final ByteBuf body, final int messageLength) throws BGPDocumentedException { + final MessageParser parser = this.handlers.getParser(type); + if (parser == null) { + return null; + } + + return parser.parseMessageBody(body, messageLength); + } + + @Override + protected byte[] serializeMessageImpl(final Notification message) { + final MessageSerializer serializer = this.handlers.getSerializer(message.getImplementedInterface()); + if (serializer == null) { + return null; + } + + return serializer.serializeMessage(message); + } + + AutoCloseable registerMessageParser(final int messageType, final MessageParser parser) { + return this.handlers.registerParser(messageType, parser); + } + + AutoCloseable registerMessageSerializer(final Class messageClass, final MessageSerializer serializer) { + return this.handlers.registerSerializer(messageClass, serializer); + } } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleNlriRegistry.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleNlriRegistry.java index 673162d856..ead818296f 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleNlriRegistry.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleNlriRegistry.java @@ -7,6 +7,9 @@ */ package org.opendaylight.protocol.bgp.parser.spi.pojo; +import com.google.common.base.Preconditions; +import com.google.common.primitives.UnsignedBytes; + import io.netty.buffer.ByteBuf; import java.util.concurrent.ConcurrentHashMap; @@ -28,89 +31,85 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mult import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily; -import com.google.common.base.Preconditions; -import com.google.common.primitives.UnsignedBytes; - final class SimpleNlriRegistry implements NlriRegistry { - private final ConcurrentMap handlers = new ConcurrentHashMap<>(); - private final SubsequentAddressFamilyRegistry safiReg; - private final AddressFamilyRegistry afiReg; - - public SimpleNlriRegistry(final AddressFamilyRegistry afiReg, final SubsequentAddressFamilyRegistry safiReg) { - this.afiReg = Preconditions.checkNotNull(afiReg); - this.safiReg = Preconditions.checkNotNull(safiReg); - } - - private static BgpTableType createKey(final Class afi, - final Class safi) { - Preconditions.checkNotNull(afi); - Preconditions.checkNotNull(safi); - return new BgpTableTypeImpl(afi, safi); - } - - synchronized AutoCloseable registerNlriParser(final Class afi, - final Class safi, final NlriParser parser) { - final BgpTableType key = createKey(afi, safi); - final NlriParser prev = this.handlers.get(key); - Preconditions.checkState(prev == null, "AFI/SAFI is already bound to parser " + prev); - - this.handlers.put(key, parser); - final Object lock = this; - return new AbstractRegistration() { - @Override - protected void removeRegistration() { - synchronized (lock) { - SimpleNlriRegistry.this.handlers.remove(key); - } - } - }; - } - - private Class getAfi(final ByteBuf buffer) throws BGPParsingException { - final int afiVal = buffer.readUnsignedShort(); - final Class afi = this.afiReg.classForFamily(afiVal); - if (afi == null) { - throw new BGPParsingException("Address Family Identifier: '" + afiVal + "' not supported."); - } - return afi; - } - - private Class getSafi(final ByteBuf buffer) throws BGPParsingException { - final int safiVal = UnsignedBytes.toInt(buffer.readByte()); - final Class safi = this.safiReg.classForFamily(safiVal); - if (safi == null) { - throw new BGPParsingException("Subsequent Address Family Identifier: '" + safiVal + "' not supported."); - } - return safi; - } - - @Override - public MpUnreachNlri parseMpUnreach(final ByteBuf buffer) throws BGPParsingException { - final MpUnreachNlriBuilder builder = new MpUnreachNlriBuilder(); - builder.setAfi(getAfi(buffer)); - builder.setSafi(getSafi(buffer)); - - final NlriParser parser = this.handlers.get(createKey(builder.getAfi(), builder.getSafi())); - final ByteBuf nlri = buffer.slice(); - parser.parseNlri(nlri, builder); - return builder.build(); - } - - @Override - public MpReachNlri parseMpReach(final ByteBuf buffer) throws BGPParsingException { - final MpReachNlriBuilder builder = new MpReachNlriBuilder(); - builder.setAfi(getAfi(buffer)); - builder.setSafi(getSafi(buffer)); - - final NlriParser parser = this.handlers.get(createKey(builder.getAfi(), builder.getSafi())); - - final int nextHopLength = UnsignedBytes.toInt(buffer.readByte()); - final byte[] nextHop = ByteArray.readBytes(buffer, nextHopLength); - //reserved - buffer.skipBytes(1); - - final ByteBuf nlri = buffer.slice(); - parser.parseNlri(nlri, nextHop, builder); - return builder.build(); - } + private final ConcurrentMap handlers = new ConcurrentHashMap<>(); + private final SubsequentAddressFamilyRegistry safiReg; + private final AddressFamilyRegistry afiReg; + + public SimpleNlriRegistry(final AddressFamilyRegistry afiReg, final SubsequentAddressFamilyRegistry safiReg) { + this.afiReg = Preconditions.checkNotNull(afiReg); + this.safiReg = Preconditions.checkNotNull(safiReg); + } + + private static BgpTableType createKey(final Class afi, final Class safi) { + Preconditions.checkNotNull(afi); + Preconditions.checkNotNull(safi); + return new BgpTableTypeImpl(afi, safi); + } + + synchronized AutoCloseable registerNlriParser(final Class afi, + final Class safi, final NlriParser parser) { + final BgpTableType key = createKey(afi, safi); + final NlriParser prev = this.handlers.get(key); + Preconditions.checkState(prev == null, "AFI/SAFI is already bound to parser " + prev); + + this.handlers.put(key, parser); + final Object lock = this; + return new AbstractRegistration() { + @Override + protected void removeRegistration() { + synchronized (lock) { + SimpleNlriRegistry.this.handlers.remove(key); + } + } + }; + } + + private Class getAfi(final ByteBuf buffer) throws BGPParsingException { + final int afiVal = buffer.readUnsignedShort(); + final Class afi = this.afiReg.classForFamily(afiVal); + if (afi == null) { + throw new BGPParsingException("Address Family Identifier: '" + afiVal + "' not supported."); + } + return afi; + } + + private Class getSafi(final ByteBuf buffer) throws BGPParsingException { + final int safiVal = UnsignedBytes.toInt(buffer.readByte()); + final Class safi = this.safiReg.classForFamily(safiVal); + if (safi == null) { + throw new BGPParsingException("Subsequent Address Family Identifier: '" + safiVal + "' not supported."); + } + return safi; + } + + @Override + public MpUnreachNlri parseMpUnreach(final ByteBuf buffer) throws BGPParsingException { + final MpUnreachNlriBuilder builder = new MpUnreachNlriBuilder(); + builder.setAfi(getAfi(buffer)); + builder.setSafi(getSafi(buffer)); + + final NlriParser parser = this.handlers.get(createKey(builder.getAfi(), builder.getSafi())); + final ByteBuf nlri = buffer.slice(); + parser.parseNlri(nlri, builder); + return builder.build(); + } + + @Override + public MpReachNlri parseMpReach(final ByteBuf buffer) throws BGPParsingException { + final MpReachNlriBuilder builder = new MpReachNlriBuilder(); + builder.setAfi(getAfi(buffer)); + builder.setSafi(getSafi(buffer)); + + final NlriParser parser = this.handlers.get(createKey(builder.getAfi(), builder.getSafi())); + + final int nextHopLength = UnsignedBytes.toInt(buffer.readByte()); + final byte[] nextHop = ByteArray.readBytes(buffer, nextHopLength); + // reserved + buffer.skipBytes(1); + + final ByteBuf nlri = buffer.slice(); + parser.parseNlri(nlri, nextHop, builder); + return builder.build(); + } } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleParameterRegistry.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleParameterRegistry.java index ed2fe497ce..34ff8f5a57 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleParameterRegistry.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleParameterRegistry.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.parser.spi.pojo; +import com.google.common.base.Preconditions; + import io.netty.buffer.ByteBuf; import org.opendaylight.protocol.bgp.parser.BGPDocumentedException; @@ -19,35 +21,33 @@ import org.opendaylight.protocol.util.Values; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.BgpParameters; import org.opendaylight.yangtools.yang.binding.DataContainer; -import com.google.common.base.Preconditions; - final class SimpleParameterRegistry implements ParameterRegistry { - private final HandlerRegistry handlers = new HandlerRegistry<>(); - - AutoCloseable registerParameterParser(final int messageType, final ParameterParser parser) { - Preconditions.checkArgument(messageType >= 0 && messageType <= Values.UNSIGNED_BYTE_MAX_VALUE); - return this.handlers.registerParser(messageType, parser); - } - - AutoCloseable registerParameterSerializer(final Class paramClass, final ParameterSerializer serializer) { - return this.handlers.registerSerializer(paramClass, serializer); - } - - @Override - public BgpParameters parseParameter(final int parameterType, final ByteBuf buffer) throws BGPParsingException, BGPDocumentedException { - final ParameterParser parser = this.handlers.getParser(parameterType); - if (parser == null) { - return null; - } - return parser.parseParameter(buffer); - } - - @Override - public byte[] serializeParameter(final BgpParameters parameter) { - final ParameterSerializer serializer = this.handlers.getSerializer(parameter.getImplementedInterface()); - if (serializer == null) { - return null; - } - return serializer.serializeParameter(parameter); - } + private final HandlerRegistry handlers = new HandlerRegistry<>(); + + AutoCloseable registerParameterParser(final int messageType, final ParameterParser parser) { + Preconditions.checkArgument(messageType >= 0 && messageType <= Values.UNSIGNED_BYTE_MAX_VALUE); + return this.handlers.registerParser(messageType, parser); + } + + AutoCloseable registerParameterSerializer(final Class paramClass, final ParameterSerializer serializer) { + return this.handlers.registerSerializer(paramClass, serializer); + } + + @Override + public BgpParameters parseParameter(final int parameterType, final ByteBuf buffer) throws BGPParsingException, BGPDocumentedException { + final ParameterParser parser = this.handlers.getParser(parameterType); + if (parser == null) { + return null; + } + return parser.parseParameter(buffer); + } + + @Override + public byte[] serializeParameter(final BgpParameters parameter) { + final ParameterSerializer serializer = this.handlers.getSerializer(parameter.getImplementedInterface()); + if (serializer == null) { + return null; + } + return serializer.serializeParameter(parameter); + } } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleSubsequentAddressFamilyRegistry.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleSubsequentAddressFamilyRegistry.java index f87a051c3f..8969e13de5 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleSubsequentAddressFamilyRegistry.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleSubsequentAddressFamilyRegistry.java @@ -7,26 +7,26 @@ */ package org.opendaylight.protocol.bgp.parser.spi.pojo; +import com.google.common.base.Preconditions; + import org.opendaylight.protocol.bgp.parser.spi.SubsequentAddressFamilyRegistry; import org.opendaylight.protocol.util.Values; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily; -import com.google.common.base.Preconditions; - final class SimpleSubsequentAddressFamilyRegistry extends AbstractFamilyRegistry implements - SubsequentAddressFamilyRegistry { - AutoCloseable registerSubsequentAddressFamily(final Class clazz, final int number) { - Preconditions.checkArgument(number >= 0 && number <= Values.UNSIGNED_BYTE_MAX_VALUE); - return super.registerFamily(clazz, number); - } + SubsequentAddressFamilyRegistry { + AutoCloseable registerSubsequentAddressFamily(final Class clazz, final int number) { + Preconditions.checkArgument(number >= 0 && number <= Values.UNSIGNED_BYTE_MAX_VALUE); + return super.registerFamily(clazz, number); + } - @Override - public Class classForFamily(final int number) { - return super.classForFamily(number); - } + @Override + public Class classForFamily(final int number) { + return super.classForFamily(number); + } - @Override - public Integer numberForClass(final Class clazz) { - return super.numberForClass(clazz); - } + @Override + public Integer numberForClass(final Class clazz) { + return super.numberForClass(clazz); + } } diff --git a/bgp/parser-spi/src/test/java/org/opendaylight/protocol/bgp/parser/spi/AbstractMessageRegistryTest.java b/bgp/parser-spi/src/test/java/org/opendaylight/protocol/bgp/parser/spi/AbstractMessageRegistryTest.java index 9e5b9109be..ad46f6eb99 100644 --- a/bgp/parser-spi/src/test/java/org/opendaylight/protocol/bgp/parser/spi/AbstractMessageRegistryTest.java +++ b/bgp/parser-spi/src/test/java/org/opendaylight/protocol/bgp/parser/spi/AbstractMessageRegistryTest.java @@ -21,30 +21,30 @@ import org.opendaylight.yangtools.yang.binding.Notification; public class AbstractMessageRegistryTest { - public static final byte[] keepAliveBMsg = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, - (byte) 0xff, (byte) 0x00, (byte) 0x13, (byte) 0x04 }; - - private final AbstractMessageRegistry registry = new AbstractMessageRegistry() { - - @Override - protected byte[] serializeMessageImpl(Notification message) { - return keepAliveBMsg; - } - - @Override - protected Notification parseBody(int type, ByteBuf body, int messageLength) throws BGPDocumentedException { - return new KeepaliveBuilder().build(); - } - }; - - @Test - public void testRegistry() throws BGPDocumentedException, BGPParsingException { - final Notification keepAlive = new KeepaliveBuilder().build(); - final byte[] serialized = this.registry.serializeMessage(keepAlive); - assertArrayEquals(keepAliveBMsg, serialized); - - final Notification not = this.registry.parseMessage(Unpooled.copiedBuffer(keepAliveBMsg)); - assertTrue(not instanceof Keepalive); - } + public static final byte[] keepAliveBMsg = new byte[] { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, + (byte) 0x00, (byte) 0x13, (byte) 0x04 }; + + private final AbstractMessageRegistry registry = new AbstractMessageRegistry() { + + @Override + protected byte[] serializeMessageImpl(Notification message) { + return keepAliveBMsg; + } + + @Override + protected Notification parseBody(int type, ByteBuf body, int messageLength) throws BGPDocumentedException { + return new KeepaliveBuilder().build(); + } + }; + + @Test + public void testRegistry() throws BGPDocumentedException, BGPParsingException { + final Notification keepAlive = new KeepaliveBuilder().build(); + final byte[] serialized = this.registry.serializeMessage(keepAlive); + assertArrayEquals(keepAliveBMsg, serialized); + + final Notification not = this.registry.parseMessage(Unpooled.copiedBuffer(keepAliveBMsg)); + assertTrue(not instanceof Keepalive); + } } diff --git a/bgp/parser-spi/src/test/java/org/opendaylight/protocol/bgp/parser/spi/UtilsTest.java b/bgp/parser-spi/src/test/java/org/opendaylight/protocol/bgp/parser/spi/UtilsTest.java index caf32e3d1d..40b04c2f2e 100644 --- a/bgp/parser-spi/src/test/java/org/opendaylight/protocol/bgp/parser/spi/UtilsTest.java +++ b/bgp/parser-spi/src/test/java/org/opendaylight/protocol/bgp/parser/spi/UtilsTest.java @@ -12,6 +12,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; +import com.google.common.primitives.UnsignedBytes; + import org.junit.Test; import org.opendaylight.protocol.bgp.parser.BGPParsingException; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpReachNlriBuilder; @@ -19,71 +21,68 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv4NextHopCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv6NextHopCase; -import com.google.common.primitives.UnsignedBytes; - public class UtilsTest { - @Test - public void testCapabilityUtil() { - final byte[] result = new byte[] { 1, 2, 4, 8 }; - assertArrayEquals(result, CapabilityUtil.formatCapability(1, new byte[] { 4, 8 })); - } + @Test + public void testCapabilityUtil() { + final byte[] result = new byte[] { 1, 2, 4, 8 }; + assertArrayEquals(result, CapabilityUtil.formatCapability(1, new byte[] { 4, 8 })); + } - @Test - public void testMessageUtil() { - final byte[] result = new byte[] { UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, - UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, - UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, - UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, - UnsignedBytes.MAX_VALUE, 0, 23, 3, 32, 5, 14, 21 }; - assertArrayEquals(result, MessageUtil.formatMessage(3, new byte[] { 32, 5, 14, 21 })); - } + @Test + public void testMessageUtil() { + final byte[] result = new byte[] { UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, + UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, + UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, + UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, 0, 23, 3, 32, 5, 14, 21 }; + assertArrayEquals(result, MessageUtil.formatMessage(3, new byte[] { 32, 5, 14, 21 })); + } - @Test - public void testNlriUtil() { - final MpReachNlriBuilder builder = new MpReachNlriBuilder(); - final byte[] ipv4 = new byte[] { 42, 42, 42, 42 }; - try { - NlriUtil.parseNextHop(ipv4, builder); - } catch (final BGPParsingException e) { - fail("This exception should not happen"); - } - CNextHop hop = builder.getCNextHop(); - assertEquals("42.42.42.42", ((Ipv4NextHopCase) hop).getIpv4NextHop().getGlobal().getValue()); + @Test + public void testNlriUtil() { + final MpReachNlriBuilder builder = new MpReachNlriBuilder(); + final byte[] ipv4 = new byte[] { 42, 42, 42, 42 }; + try { + NlriUtil.parseNextHop(ipv4, builder); + } catch (final BGPParsingException e) { + fail("This exception should not happen"); + } + CNextHop hop = builder.getCNextHop(); + assertEquals("42.42.42.42", ((Ipv4NextHopCase) hop).getIpv4NextHop().getGlobal().getValue()); - final byte[] ipv6 = new byte[] { (byte) 0x20, (byte) 0x01, (byte) 0x0d, (byte) 0xb8, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 01 }; - try { - NlriUtil.parseNextHop(ipv6, builder); - } catch (final BGPParsingException e) { - fail("This exception should not happen"); - } - hop = builder.getCNextHop(); - assertEquals("2001:db8::1", ((Ipv6NextHopCase) hop).getIpv6NextHop().getGlobal().getValue()); - assertNull(((Ipv6NextHopCase) hop).getIpv6NextHop().getLinkLocal()); + final byte[] ipv6 = new byte[] { (byte) 0x20, (byte) 0x01, (byte) 0x0d, (byte) 0xb8, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 01 }; + try { + NlriUtil.parseNextHop(ipv6, builder); + } catch (final BGPParsingException e) { + fail("This exception should not happen"); + } + hop = builder.getCNextHop(); + assertEquals("2001:db8::1", ((Ipv6NextHopCase) hop).getIpv6NextHop().getGlobal().getValue()); + assertNull(((Ipv6NextHopCase) hop).getIpv6NextHop().getLinkLocal()); - final byte[] ipv6l = new byte[] { (byte) 0x20, (byte) 0x01, (byte) 0x0d, (byte) 0xb8, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, - 01, (byte) 0xfe, (byte) 0x80, 00, 00, 00, 00, 00, 00, (byte) 0xc0, 01, 0x0b, (byte) 0xff, (byte) 0xfe, 0x7e, 00, 00 }; - try { - NlriUtil.parseNextHop(ipv6l, builder); - } catch (final BGPParsingException e) { - fail("This exception should not happen"); - } - hop = builder.getCNextHop(); - assertEquals("2001:db8::1", ((Ipv6NextHopCase) hop).getIpv6NextHop().getGlobal().getValue()); - assertEquals("fe80::c001:bff:fe7e:0", ((Ipv6NextHopCase) hop).getIpv6NextHop().getLinkLocal().getValue()); + final byte[] ipv6l = new byte[] { (byte) 0x20, (byte) 0x01, (byte) 0x0d, (byte) 0xb8, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, + 01, (byte) 0xfe, (byte) 0x80, 00, 00, 00, 00, 00, 00, (byte) 0xc0, 01, 0x0b, (byte) 0xff, (byte) 0xfe, 0x7e, 00, 00 }; + try { + NlriUtil.parseNextHop(ipv6l, builder); + } catch (final BGPParsingException e) { + fail("This exception should not happen"); + } + hop = builder.getCNextHop(); + assertEquals("2001:db8::1", ((Ipv6NextHopCase) hop).getIpv6NextHop().getGlobal().getValue()); + assertEquals("fe80::c001:bff:fe7e:0", ((Ipv6NextHopCase) hop).getIpv6NextHop().getLinkLocal().getValue()); - final byte[] wrong = new byte[] { (byte) 0x20, (byte) 0x01, (byte) 0x0d }; - try { - NlriUtil.parseNextHop(wrong, builder); - fail("Exception should happen"); - } catch (final BGPParsingException e) { - assertEquals("Cannot parse NEXT_HOP attribute. Wrong bytes length: 3", e.getMessage()); - } - } + final byte[] wrong = new byte[] { (byte) 0x20, (byte) 0x01, (byte) 0x0d }; + try { + NlriUtil.parseNextHop(wrong, builder); + fail("Exception should happen"); + } catch (final BGPParsingException e) { + assertEquals("Cannot parse NEXT_HOP attribute. Wrong bytes length: 3", e.getMessage()); + } + } - @Test - public void testParameterUtil() { - final byte[] result = new byte[] { 1, 2, 4, 8 }; - assertArrayEquals(result, ParameterUtil.formatParameter(1, new byte[] { 4, 8 })); - } + @Test + public void testParameterUtil() { + final byte[] result = new byte[] { 1, 2, 4, 8 }; + assertArrayEquals(result, ParameterUtil.formatParameter(1, new byte[] { 4, 8 })); + } } diff --git a/bgp/rib-api-config/src/main/yang/config-bgp-rib.yang b/bgp/rib-api-config/src/main/yang/config-bgp-rib.yang index f0d7b17e9b..7d01494515 100644 --- a/bgp/rib-api-config/src/main/yang/config-bgp-rib.yang +++ b/bgp/rib-api-config/src/main/yang/config-bgp-rib.yang @@ -15,11 +15,11 @@ module config-bgp-rib { BGP listener service. Copyright (c)2013 Cisco Systems, Inc. All rights reserved.; - + This program and the accompanying materials are made available - under the terms of the Eclipse Public License v1.0 which - accompanies this distribution, and is available at - http://www.eclipse.org/legal/epl-v10.html"; + under the terms of the Eclipse Public License v1.0 which + accompanies this distribution, and is available at + http://www.eclipse.org/legal/epl-v10.html"; revision "2013-07-01" { description diff --git a/bgp/rib-api/src/main/java/org/opendaylight/protocol/bgp/rib/DefaultRibReference.java b/bgp/rib-api/src/main/java/org/opendaylight/protocol/bgp/rib/DefaultRibReference.java index 402e825892..2e2146a5a5 100644 --- a/bgp/rib-api/src/main/java/org/opendaylight/protocol/bgp/rib/DefaultRibReference.java +++ b/bgp/rib-api/src/main/java/org/opendaylight/protocol/bgp/rib/DefaultRibReference.java @@ -15,7 +15,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; * */ public class DefaultRibReference extends DefaultInstanceReference implements RibReference { - public DefaultRibReference(final InstanceIdentifier instanceIdentifier) { - super(instanceIdentifier); - } + public DefaultRibReference(final InstanceIdentifier instanceIdentifier) { + super(instanceIdentifier); + } } diff --git a/bgp/rib-api/src/main/yang/bgp-rib.yang b/bgp/rib-api/src/main/yang/bgp-rib.yang index 1b99d1c123..9ac2a1f4e4 100644 --- a/bgp/rib-api/src/main/yang/bgp-rib.yang +++ b/bgp/rib-api/src/main/yang/bgp-rib.yang @@ -3,16 +3,16 @@ module bgp-rib { namespace "urn:opendaylight:params:xml:ns:yang:bgp-rib"; prefix "rib"; - import bgp-message { prefix bgp-msg; revision-date 2013-09-19; } - import bgp-multiprotocol { prefix bgp-mp; revision-date 2013-09-19; } - import ietf-inet-types { prefix inet; revision-date 2010-09-24; } + import bgp-message { prefix bgp-msg; revision-date 2013-09-19; } + import bgp-multiprotocol { prefix bgp-mp; revision-date 2013-09-19; } + import ietf-inet-types { prefix inet; revision-date 2010-09-24; } organization "Cisco Systems, Inc."; contact "Robert Varga "; description "This module contains the concept of a Routing Information Base, - as defined by RFC4271. + as defined by RFC4271. Copyright (c)2013 Cisco Systems, Inc. All rights reserved. @@ -27,73 +27,73 @@ module bgp-rib { reference "RFC4271"; } - typedef rib-id { - type inet:uri; - } - - grouping route { - container attributes { - uses bgp-msg:path-attributes; - } - } - - grouping rib { - list tables { - uses bgp-mp:bgp-table-type; - key "afi safi"; - - container attributes { - leaf uptodate { - type boolean; - default false; - } - } - - choice routes { - case ipv4-routes-case { - container ipv4-routes { - list ipv4-route { - when "../../afi = ipv4"; - - leaf prefix { - type inet:ipv4-prefix; - } - key prefix; - - uses route; - } - } - } - case ipv6-routes-case { - container ipv6-routes { - list ipv6-route { - when "../../afi = ipv6"; - - leaf prefix { - type inet:ipv6-prefix; - } - key prefix; - - uses route; - } - } - } - } - } - } - - container bgp-rib { - list rib { - config false; - - leaf id { - type rib-id; - } - key id; - - container loc-rib { - uses rib; - } - } - } + typedef rib-id { + type inet:uri; + } + + grouping route { + container attributes { + uses bgp-msg:path-attributes; + } + } + + grouping rib { + list tables { + uses bgp-mp:bgp-table-type; + key "afi safi"; + + container attributes { + leaf uptodate { + type boolean; + default false; + } + } + + choice routes { + case ipv4-routes-case { + container ipv4-routes { + list ipv4-route { + when "../../afi = ipv4"; + + leaf prefix { + type inet:ipv4-prefix; + } + key prefix; + + uses route; + } + } + } + case ipv6-routes-case { + container ipv6-routes { + list ipv6-route { + when "../../afi = ipv6"; + + leaf prefix { + type inet:ipv6-prefix; + } + key prefix; + + uses route; + } + } + } + } + } + } + + container bgp-rib { + list rib { + config false; + + leaf id { + type rib-id; + } + key id; + + container loc-rib { + uses rib; + } + } + } } diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPDispatcherImplModule.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPDispatcherImplModule.java index cde62da8e8..72ebefcc41 100644 --- a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPDispatcherImplModule.java +++ b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPDispatcherImplModule.java @@ -22,28 +22,22 @@ import org.opendaylight.protocol.bgp.rib.impl.BGPDispatcherImpl; /** * */ -public final class BGPDispatcherImplModule -extends -org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPDispatcherImplModule { +public final class BGPDispatcherImplModule extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPDispatcherImplModule { - public BGPDispatcherImplModule( - final org.opendaylight.controller.config.api.ModuleIdentifier name, - final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { - super(name, dependencyResolver); - } + public BGPDispatcherImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier name, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(name, dependencyResolver); + } - public BGPDispatcherImplModule( - final org.opendaylight.controller.config.api.ModuleIdentifier name, - final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, - final BGPDispatcherImplModule oldModule, - final java.lang.AutoCloseable oldInstance) { - super(name, dependencyResolver, oldModule, oldInstance); - } + public BGPDispatcherImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier name, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, final BGPDispatcherImplModule oldModule, + final java.lang.AutoCloseable oldInstance) { + super(name, dependencyResolver, oldModule, oldInstance); + } - @Override - public java.lang.AutoCloseable createInstance() { - final BGPExtensionConsumerContext bgpExtensions = getBgpExtensionsDependency(); - return new BGPDispatcherImpl(bgpExtensions.getMessageRegistry(), getTimerDependency(), - getBossGroupDependency(), getWorkerGroupDependency(), getMd5ChannelFactoryDependency(), getMd5ServerChannelFactoryDependency()); - } + @Override + public java.lang.AutoCloseable createInstance() { + final BGPExtensionConsumerContext bgpExtensions = getBgpExtensionsDependency(); + return new BGPDispatcherImpl(bgpExtensions.getMessageRegistry(), getTimerDependency(), getBossGroupDependency(), getWorkerGroupDependency(), getMd5ChannelFactoryDependency(), getMd5ServerChannelFactoryDependency()); + } } diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPDispatcherImplModuleFactory.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPDispatcherImplModuleFactory.java index 2e048c37f1..f0ebe5ca78 100644 --- a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPDispatcherImplModuleFactory.java +++ b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPDispatcherImplModuleFactory.java @@ -19,8 +19,7 @@ package org.opendaylight.controller.config.yang.bgp.rib.impl; /** * */ -public class BGPDispatcherImplModuleFactory - extends - org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPDispatcherImplModuleFactory { +public class BGPDispatcherImplModuleFactory extends + org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPDispatcherImplModuleFactory { } diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModule.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModule.java index af8f6ef4b9..f8a64f1622 100644 --- a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModule.java +++ b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModule.java @@ -16,6 +16,9 @@ */ package org.opendaylight.controller.config.yang.bgp.rib.impl; +import com.google.common.collect.Lists; +import com.google.common.net.InetAddresses; + import java.lang.management.ManagementFactory; import java.net.InetSocketAddress; import java.util.List; @@ -43,117 +46,111 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mult import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.collect.Lists; -import com.google.common.net.InetAddresses; - /** * */ -public final class BGPPeerModule extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPPeerModule -{ - private static final Logger LOG = LoggerFactory.getLogger(BGPPeerModule.class); - - public BGPPeerModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { - super(identifier, dependencyResolver); - } - - public BGPPeerModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, - final BGPPeerModule oldModule, final java.lang.AutoCloseable oldInstance) { - - super(identifier, dependencyResolver, oldModule, oldInstance); - } - - @Override - protected void customValidation(){ - JmxAttributeValidationException.checkNotNull(getHost(), - "value is not set.", hostJmxAttribute); - JmxAttributeValidationException.checkNotNull(getPort(), - "value is not set.", portJmxAttribute); - - if (getPassword() != null) { - /* - * This is a nasty hack, but we don't have another clean solution. We cannot allow - * password being set if the injected dispatcher does not have the optional - * md5-server-channel-factory set. - * - * FIXME: this is a use case for Module interfaces, e.g. RibImplModule - * should something like isMd5ServerSupported() - */ - final MBeanServer srv = ManagementFactory.getPlatformMBeanServer(); - try { - final ObjectName ribi = (ObjectName) srv.getAttribute(getRib(), "CurrentImplementation"); - - // FIXME: AbstractRIBImplModule.bgpDispatcherJmxAttribute.getAttributeName() - final ObjectName disp = (ObjectName) srv.getAttribute(ribi, "BgpDispatcher"); - - final ObjectName dispi = (ObjectName) srv.getAttribute(disp, "CurrentImplementation"); - - // FIXME: AbstractBGPDispatcherImplModule.md5ChannelFactoryJmxAttribute.getAttributeName() - final Object cf = srv.getAttribute(dispi, "Md5ChannelFactory"); - JmxAttributeValidationException.checkCondition(cf != null, "Underlying dispatcher does not support MD5 clients", passwordJmxAttribute); - } catch (AttributeNotFoundException | InstanceNotFoundException - | MBeanException | ReflectionException e) { - JmxAttributeValidationException.wrap(e, "support could not be validated", passwordJmxAttribute); - } - } - } - - private InetSocketAddress createAddress() { - final IpAddress ip = getHost(); - if (ip.getIpv4Address() != null) { - return new InetSocketAddress(InetAddresses.forString(ip.getIpv4Address().getValue()), getPort().getValue()); - } else if (ip.getIpv6Address() != null) { - return new InetSocketAddress(InetAddresses.forString(ip.getIpv6Address().getValue()), getPort().getValue()); - } else { - throw new IllegalStateException("Failed to handle host " + getHost()); - } - } - - private static String peerName(final IpAddress host) { - if (host.getIpv4Address() != null) { - return host.getIpv4Address().getValue(); - } - if (host.getIpv6Address() != null) { - return host.getIpv6Address().getValue(); - } - - return null; - } - - @Override - public java.lang.AutoCloseable createInstance() { - final RIB r = getRibDependency(); - - final List tlvs = Lists.newArrayList(); - tlvs.add(new BgpParametersBuilder().setCParameters( - new As4BytesCaseBuilder().setAs4BytesCapability(new As4BytesCapabilityBuilder().setAsNumber(r.getLocalAs()).build()).build()).build()); - - for (final BgpTableType t : getAdvertizedTableDependency()) { - if (!r.getLocalTables().contains(t)) { - LOG.info("RIB instance does not list {} in its local tables. Incoming data will be dropped.", t); - } - - tlvs.add(new BgpParametersBuilder().setCParameters( - new MultiprotocolCaseBuilder().setMultiprotocolCapability( - new MultiprotocolCapabilityBuilder(t).build()).build()).build()); - } - - // Remote AS number defaults to our local AS - final AsNumber remoteAs; - if (getRemoteAs() != null) { - remoteAs = new AsNumber(getRemoteAs()); - } else { - remoteAs = r.getLocalAs(); - } - - final String password; - if (getPassword() != null) { - password = getPassword().getValue(); - } else { - password = null; - } - - return new BGPPeer(peerName(getHost()), createAddress(), password, - new BGPSessionPreferences(r.getLocalAs(), getHoldtimer(), r.getBgpIdentifier(), tlvs), remoteAs, r); - } +public final class BGPPeerModule extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPPeerModule { + private static final Logger LOG = LoggerFactory.getLogger(BGPPeerModule.class); + + public BGPPeerModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } + + public BGPPeerModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, final BGPPeerModule oldModule, + final java.lang.AutoCloseable oldInstance) { + + super(identifier, dependencyResolver, oldModule, oldInstance); + } + + @Override + protected void customValidation() { + JmxAttributeValidationException.checkNotNull(getHost(), "value is not set.", hostJmxAttribute); + JmxAttributeValidationException.checkNotNull(getPort(), "value is not set.", portJmxAttribute); + + if (getPassword() != null) { + /* + * This is a nasty hack, but we don't have another clean solution. We cannot allow + * password being set if the injected dispatcher does not have the optional + * md5-server-channel-factory set. + * + * FIXME: this is a use case for Module interfaces, e.g. RibImplModule + * should something like isMd5ServerSupported() + */ + final MBeanServer srv = ManagementFactory.getPlatformMBeanServer(); + try { + final ObjectName ribi = (ObjectName) srv.getAttribute(getRib(), "CurrentImplementation"); + + // FIXME: AbstractRIBImplModule.bgpDispatcherJmxAttribute.getAttributeName() + final ObjectName disp = (ObjectName) srv.getAttribute(ribi, "BgpDispatcher"); + + final ObjectName dispi = (ObjectName) srv.getAttribute(disp, "CurrentImplementation"); + + // FIXME: AbstractBGPDispatcherImplModule.md5ChannelFactoryJmxAttribute.getAttributeName() + final Object cf = srv.getAttribute(dispi, "Md5ChannelFactory"); + JmxAttributeValidationException.checkCondition(cf != null, "Underlying dispatcher does not support MD5 clients", + passwordJmxAttribute); + } catch (AttributeNotFoundException | InstanceNotFoundException | MBeanException | ReflectionException e) { + JmxAttributeValidationException.wrap(e, "support could not be validated", passwordJmxAttribute); + } + } + } + + private InetSocketAddress createAddress() { + final IpAddress ip = getHost(); + if (ip.getIpv4Address() != null) { + return new InetSocketAddress(InetAddresses.forString(ip.getIpv4Address().getValue()), getPort().getValue()); + } else if (ip.getIpv6Address() != null) { + return new InetSocketAddress(InetAddresses.forString(ip.getIpv6Address().getValue()), getPort().getValue()); + } else { + throw new IllegalStateException("Failed to handle host " + getHost()); + } + } + + private static String peerName(final IpAddress host) { + if (host.getIpv4Address() != null) { + return host.getIpv4Address().getValue(); + } + if (host.getIpv6Address() != null) { + return host.getIpv6Address().getValue(); + } + + return null; + } + + @Override + public java.lang.AutoCloseable createInstance() { + final RIB r = getRibDependency(); + + final List tlvs = Lists.newArrayList(); + tlvs.add(new BgpParametersBuilder().setCParameters( + new As4BytesCaseBuilder().setAs4BytesCapability(new As4BytesCapabilityBuilder().setAsNumber(r.getLocalAs()).build()).build()).build()); + + for (final BgpTableType t : getAdvertizedTableDependency()) { + if (!r.getLocalTables().contains(t)) { + LOG.info("RIB instance does not list {} in its local tables. Incoming data will be dropped.", t); + } + + tlvs.add(new BgpParametersBuilder().setCParameters( + new MultiprotocolCaseBuilder().setMultiprotocolCapability(new MultiprotocolCapabilityBuilder(t).build()).build()).build()); + } + + // Remote AS number defaults to our local AS + final AsNumber remoteAs; + if (getRemoteAs() != null) { + remoteAs = new AsNumber(getRemoteAs()); + } else { + remoteAs = r.getLocalAs(); + } + + final String password; + if (getPassword() != null) { + password = getPassword().getValue(); + } else { + password = null; + } + + return new BGPPeer(peerName(getHost()), createAddress(), password, new BGPSessionPreferences(r.getLocalAs(), getHoldtimer(), r.getBgpIdentifier(), tlvs), remoteAs, r); + } } diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModuleFactory.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModuleFactory.java index 2a929864d2..5c73a4089a 100644 --- a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModuleFactory.java +++ b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModuleFactory.java @@ -6,21 +6,19 @@ * and is available at http://www.eclipse.org/legal/epl-v10.html */ /** -* Generated file + * Generated file -* Generated from: yang module name: bgp-rib-impl yang module local name: bgp-peer -* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator -* Generated at: Sat Jan 25 11:00:14 CET 2014 -* -* Do not modify this file unless it is present under src/main directory -*/ + * Generated from: yang module name: bgp-rib-impl yang module local name: bgp-peer + * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator + * Generated at: Sat Jan 25 11:00:14 CET 2014 + * + * Do not modify this file unless it is present under src/main directory + */ package org.opendaylight.controller.config.yang.bgp.rib.impl; /** * */ -public class BGPPeerModuleFactory extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPPeerModuleFactory -{ - +public class BGPPeerModuleFactory extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPPeerModuleFactory { } diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPTableTypeImplModule.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPTableTypeImplModule.java index de8d4f1ef8..f867b2731f 100644 --- a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPTableTypeImplModule.java +++ b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPTableTypeImplModule.java @@ -16,70 +16,69 @@ */ package org.opendaylight.controller.config.yang.bgp.rib.impl; +import com.google.common.base.Preconditions; + import org.opendaylight.controller.config.api.JmxAttributeValidationException; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily; import org.opendaylight.yangtools.yang.binding.DataContainer; -import com.google.common.base.Preconditions; - /** * */ -public final class BGPTableTypeImplModule extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPTableTypeImplModule -{ +public final class BGPTableTypeImplModule extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPTableTypeImplModule { - public BGPTableTypeImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { - super(identifier, dependencyResolver); - } + public BGPTableTypeImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } - public BGPTableTypeImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, - final BGPTableTypeImplModule oldModule, final java.lang.AutoCloseable oldInstance) { + public BGPTableTypeImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, final BGPTableTypeImplModule oldModule, + final java.lang.AutoCloseable oldInstance) { - super(identifier, dependencyResolver, oldModule, oldInstance); - } + super(identifier, dependencyResolver, oldModule, oldInstance); + } - @Override - protected void customValidation(){ - JmxAttributeValidationException.checkNotNull(getAfi(), - "value is not set.", afiJmxAttribute); - JmxAttributeValidationException.checkNotNull(getSafi(), - "value is not set.", safiJmxAttribute); - } + @Override + protected void customValidation() { + JmxAttributeValidationException.checkNotNull(getAfi(), "value is not set.", afiJmxAttribute); + JmxAttributeValidationException.checkNotNull(getSafi(), "value is not set.", safiJmxAttribute); + } - @Override - public java.lang.AutoCloseable createInstance() { - return new AutoCloseableBgpTableType(getAfiIdentity(), getSafiIdentity()); - } + @Override + public java.lang.AutoCloseable createInstance() { + return new AutoCloseableBgpTableType(getAfiIdentity(), getSafiIdentity()); + } - private static final class AutoCloseableBgpTableType implements AutoCloseable, BgpTableType { - private final Class afi; - private final Class safi; + private static final class AutoCloseableBgpTableType implements AutoCloseable, BgpTableType { + private final Class afi; + private final Class safi; - public AutoCloseableBgpTableType(final Class afi, final Class safi) { - this.afi = Preconditions.checkNotNull(afi); - this.safi = Preconditions.checkNotNull(safi); - } + public AutoCloseableBgpTableType(final Class afi, final Class safi) { + this.afi = Preconditions.checkNotNull(afi); + this.safi = Preconditions.checkNotNull(safi); + } - @Override - public Class getImplementedInterface() { - return BgpTableType.class; - } + @Override + public Class getImplementedInterface() { + return BgpTableType.class; + } - @Override - public Class getAfi() { - return afi; - } + @Override + public Class getAfi() { + return afi; + } - @Override - public Class getSafi() { - return safi; - } + @Override + public Class getSafi() { + return safi; + } - @Override - public void close() { - // Nothing to do - } - } + @Override + public void close() { + // Nothing to do + } + } } diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPTableTypeImplModuleFactory.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPTableTypeImplModuleFactory.java index 945226e5d0..bce92ef6eb 100644 --- a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPTableTypeImplModuleFactory.java +++ b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPTableTypeImplModuleFactory.java @@ -6,21 +6,20 @@ * and is available at http://www.eclipse.org/legal/epl-v10.html */ /** -* Generated file + * Generated file -* Generated from: yang module name: bgp-rib-impl yang module local name: bgp-table-type-impl -* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator -* Generated at: Sat Jan 25 20:28:03 CET 2014 -* -* Do not modify this file unless it is present under src/main directory -*/ + * Generated from: yang module name: bgp-rib-impl yang module local name: bgp-table-type-impl + * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator + * Generated at: Sat Jan 25 20:28:03 CET 2014 + * + * Do not modify this file unless it is present under src/main directory + */ package org.opendaylight.controller.config.yang.bgp.rib.impl; /** * */ -public class BGPTableTypeImplModuleFactory extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPTableTypeImplModuleFactory -{ - +public class BGPTableTypeImplModuleFactory extends + org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBGPTableTypeImplModuleFactory { } diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPParserModule.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPParserModule.java index a3b37e2845..4435a6952c 100644 --- a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPParserModule.java +++ b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPParserModule.java @@ -21,25 +21,27 @@ import org.opendaylight.protocol.bgp.parser.impl.BGPActivator; /** * */ -public final class BaseBGPParserModule extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBaseBGPParserModule -{ +public final class BaseBGPParserModule extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBaseBGPParserModule { - public BaseBGPParserModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { - super(identifier, dependencyResolver); - } + public BaseBGPParserModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } - public BaseBGPParserModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, final BaseBGPParserModule oldModule, final java.lang.AutoCloseable oldInstance) { - super(identifier, dependencyResolver, oldModule, oldInstance); - } + public BaseBGPParserModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, final BaseBGPParserModule oldModule, + final java.lang.AutoCloseable oldInstance) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } - @Override - public void validate(){ - super.validate(); - // Add custom validation for module attributes here. - } + @Override + public void validate() { + super.validate(); + // Add custom validation for module attributes here. + } - @Override - public java.lang.AutoCloseable createInstance() { - return new BGPActivator(); - } + @Override + public java.lang.AutoCloseable createInstance() { + return new BGPActivator(); + } } diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPParserModuleFactory.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPParserModuleFactory.java index ae272e61c1..83e3bf3291 100644 --- a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPParserModuleFactory.java +++ b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPParserModuleFactory.java @@ -6,21 +6,19 @@ * and is available at http://www.eclipse.org/legal/epl-v10.html */ /** -* Generated file + * Generated file -* Generated from: yang module name: bgp-rib-impl yang module local name: base-bgp-parser -* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator -* Generated at: Mon Nov 18 10:59:18 CET 2013 -* -* Do not modify this file unless it is present under src/main directory -*/ + * Generated from: yang module name: bgp-rib-impl yang module local name: base-bgp-parser + * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator + * Generated at: Mon Nov 18 10:59:18 CET 2013 + * + * Do not modify this file unless it is present under src/main directory + */ package org.opendaylight.controller.config.yang.bgp.rib.impl; /** * */ -public class BaseBGPParserModuleFactory extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBaseBGPParserModuleFactory -{ - +public class BaseBGPParserModuleFactory extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBaseBGPParserModuleFactory { } diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPRIBModule.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPRIBModule.java index 1a0073484a..4e3a8f19f8 100644 --- a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPRIBModule.java +++ b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPRIBModule.java @@ -21,26 +21,27 @@ import org.opendaylight.protocol.bgp.rib.impl.RIBActivator; /** * */ -public final class BaseBGPRIBModule extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBaseBGPRIBModule -{ +public final class BaseBGPRIBModule extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBaseBGPRIBModule { - public BaseBGPRIBModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { - super(identifier, dependencyResolver); - } + public BaseBGPRIBModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } - public BaseBGPRIBModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, - final BaseBGPRIBModule oldModule, final java.lang.AutoCloseable oldInstance) { + public BaseBGPRIBModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, final BaseBGPRIBModule oldModule, + final java.lang.AutoCloseable oldInstance) { - super(identifier, dependencyResolver, oldModule, oldInstance); - } + super(identifier, dependencyResolver, oldModule, oldInstance); + } - @Override - protected void customValidation(){ - // Add custom validation for module attributes here. - } + @Override + protected void customValidation() { + // Add custom validation for module attributes here. + } - @Override - public java.lang.AutoCloseable createInstance() { - return new RIBActivator(); - } + @Override + public java.lang.AutoCloseable createInstance() { + return new RIBActivator(); + } } diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPRIBModuleFactory.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPRIBModuleFactory.java index e899de7ad0..d8cd2a3eed 100644 --- a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPRIBModuleFactory.java +++ b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BaseBGPRIBModuleFactory.java @@ -6,21 +6,19 @@ * and is available at http://www.eclipse.org/legal/epl-v10.html */ /** -* Generated file + * Generated file -* Generated from: yang module name: bgp-rib-impl yang module local name: base-bgp-rib -* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator -* Generated at: Tue Dec 03 09:13:09 CET 2013 -* -* Do not modify this file unless it is present under src/main directory -*/ + * Generated from: yang module name: bgp-rib-impl yang module local name: base-bgp-rib + * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator + * Generated at: Tue Dec 03 09:13:09 CET 2013 + * + * Do not modify this file unless it is present under src/main directory + */ package org.opendaylight.controller.config.yang.bgp.rib.impl; /** * */ -public class BaseBGPRIBModuleFactory extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBaseBGPRIBModuleFactory -{ - +public class BaseBGPRIBModuleFactory extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractBaseBGPRIBModuleFactory { } diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/RIBImplModule.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/RIBImplModule.java index 6ab9b7e7f2..38efbb20e6 100644 --- a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/RIBImplModule.java +++ b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/RIBImplModule.java @@ -25,32 +25,30 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types. */ public final class RIBImplModule extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractRIBImplModule { - public RIBImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier name, - final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { - super(name, dependencyResolver); - } + public RIBImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier name, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(name, dependencyResolver); + } - public RIBImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier name, - final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, final RIBImplModule oldModule, - final java.lang.AutoCloseable oldInstance) { - super(name, dependencyResolver, oldModule, oldInstance); - } + public RIBImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier name, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, final RIBImplModule oldModule, + final java.lang.AutoCloseable oldInstance) { + super(name, dependencyResolver, oldModule, oldInstance); + } - @Override - public void customValidation() { - JmxAttributeValidationException.checkNotNull(getExtensions(), "is not set.", extensionsJmxAttribute); - JmxAttributeValidationException.checkNotNull(getRibId(), "is not set.", ribIdJmxAttribute); - JmxAttributeValidationException.checkNotNull(getLocalAs(), "is not set.", localAsJmxAttribute); - JmxAttributeValidationException.checkNotNull(getBgpId(), "is not set.", bgpIdJmxAttribute); - JmxAttributeValidationException.checkNotNull(getTcpReconnectStrategy(), "is not set.", tcpReconnectStrategyJmxAttribute); - JmxAttributeValidationException.checkNotNull(getSessionReconnectStrategy(), "is not set.", sessionReconnectStrategyJmxAttribute); - JmxAttributeValidationException.checkNotNull(getLocalTable(), "is not set.", localTableJmxAttribute); - } + @Override + public void customValidation() { + JmxAttributeValidationException.checkNotNull(getExtensions(), "is not set.", extensionsJmxAttribute); + JmxAttributeValidationException.checkNotNull(getRibId(), "is not set.", ribIdJmxAttribute); + JmxAttributeValidationException.checkNotNull(getLocalAs(), "is not set.", localAsJmxAttribute); + JmxAttributeValidationException.checkNotNull(getBgpId(), "is not set.", bgpIdJmxAttribute); + JmxAttributeValidationException.checkNotNull(getTcpReconnectStrategy(), "is not set.", tcpReconnectStrategyJmxAttribute); + JmxAttributeValidationException.checkNotNull(getSessionReconnectStrategy(), "is not set.", sessionReconnectStrategyJmxAttribute); + JmxAttributeValidationException.checkNotNull(getLocalTable(), "is not set.", localTableJmxAttribute); + } - @Override - public java.lang.AutoCloseable createInstance() { - return new RIBImpl(getRibId(), new AsNumber(getLocalAs()), getBgpId(), getExtensionsDependency(), - getBgpDispatcherDependency(), getTcpReconnectStrategyDependency() - , getSessionReconnectStrategyDependency(), getDataProviderDependency(), getLocalTableDependency()); - } + @Override + public java.lang.AutoCloseable createInstance() { + return new RIBImpl(getRibId(), new AsNumber(getLocalAs()), getBgpId(), getExtensionsDependency(), getBgpDispatcherDependency(), getTcpReconnectStrategyDependency(), getSessionReconnectStrategyDependency(), getDataProviderDependency(), getLocalTableDependency()); + } } diff --git a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/RIBImplModuleFactory.java b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/RIBImplModuleFactory.java index 3c2ff13140..290bd747d0 100644 --- a/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/RIBImplModuleFactory.java +++ b/bgp/rib-impl-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/impl/RIBImplModuleFactory.java @@ -16,12 +16,9 @@ */ package org.opendaylight.controller.config.yang.bgp.rib.impl; - /** * */ -public class RIBImplModuleFactory - extends - org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractRIBImplModuleFactory { - +public class RIBImplModuleFactory extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractRIBImplModuleFactory { + } diff --git a/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/AbstractRIBImplModuleTest.java b/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/AbstractRIBImplModuleTest.java index f858bd43ca..b719a36998 100644 --- a/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/AbstractRIBImplModuleTest.java +++ b/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/AbstractRIBImplModuleTest.java @@ -12,6 +12,7 @@ import static org.mockito.Mockito.mock; import com.google.common.collect.Lists; import com.google.common.collect.Sets; + import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; @@ -20,9 +21,11 @@ import java.util.Dictionary; import java.util.List; import java.util.Map; import java.util.concurrent.Future; + import javax.management.InstanceAlreadyExistsException; import javax.management.InstanceNotFoundException; import javax.management.ObjectName; + import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -104,8 +107,7 @@ public abstract class AbstractRIBImplModuleTest extends AbstractConfigTest { MockitoAnnotations.initMocks(this); List moduleFactories = getModuleFactories(); - super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(mockedContext, moduleFactories - .toArray(new ModuleFactory[moduleFactories.size()]))); + super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(mockedContext, moduleFactories.toArray(new ModuleFactory[moduleFactories.size()]))); Filter mockedFilter = mock(Filter.class); Mockito.doReturn(mockedFilter).when(mockedContext).createFilter(Mockito.anyString()); @@ -116,8 +118,7 @@ public abstract class AbstractRIBImplModuleTest extends AbstractConfigTest { Mockito.doReturn(new Bundle[] {}).when(mockedContext).getBundles(); - Mockito.doReturn(new ServiceReference[] {}).when(mockedContext) - .getServiceReferences(Matchers.anyString(), Matchers.anyString()); + Mockito.doReturn(new ServiceReference[] {}).when(mockedContext).getServiceReferences(Matchers.anyString(), Matchers.anyString()); ServiceReference emptyServiceReference = mock(ServiceReference.class, "Empty"); @@ -131,8 +132,7 @@ public abstract class AbstractRIBImplModuleTest extends AbstractConfigTest { Mockito.doReturn(new Bundle[] {}).when(mockedContext).getBundles(); - Mockito.doReturn(new ServiceReference[] {}).when(mockedContext) - .getServiceReferences(Matchers.anyString(), Matchers.anyString()); + Mockito.doReturn(new ServiceReference[] {}).when(mockedContext).getServiceReferences(Matchers.anyString(), Matchers.anyString()); // mockedDataProvider = mock(DataProviderService.class); @@ -140,8 +140,7 @@ public abstract class AbstractRIBImplModuleTest extends AbstractConfigTest { Mockito.doReturn("Data Provider Service Reference").when(dataProviderServiceReference).toString(); // Mockito.doReturn(emptyServiceReference).when(mockedContext).getServiceReference(any(Class.class)); - Mockito.doReturn(dataProviderServiceReference).when(mockedContext) - .getServiceReference(DataProviderService.class); + Mockito.doReturn(dataProviderServiceReference).when(mockedContext).getServiceReference(DataProviderService.class); Mockito.doReturn(mockedDataProvider).when(mockedContext).getService(dataProviderServiceReference); @@ -149,16 +148,15 @@ public abstract class AbstractRIBImplModuleTest extends AbstractConfigTest { Mockito.doReturn(null).when(mockedContext).getService(emptyServiceReference); Registration> registration = mock(Registration.class); - Mockito.doReturn(registration).when(mockedDataProvider) - .registerCommitHandler(any(InstanceIdentifier.class), any(DataCommitHandler.class)); - Mockito.doReturn(registration).when(mockedDataProvider) - .registerCommitHandler(any(InstanceIdentifier.class), any(DataCommitHandler.class)); + Mockito.doReturn(registration).when(mockedDataProvider).registerCommitHandler(any(InstanceIdentifier.class), + any(DataCommitHandler.class)); + Mockito.doReturn(registration).when(mockedDataProvider).registerCommitHandler(any(InstanceIdentifier.class), + any(DataCommitHandler.class)); Mockito.doReturn(null).when(mockedDataProvider).readOperationalData(any(InstanceIdentifier.class)); Mockito.doReturn(mockedTransaction).when(mockedDataProvider).beginTransaction(); - Mockito.doNothing().when(mockedTransaction) - .putOperationalData(any(InstanceIdentifier.class), any(CompositeNode.class)); + Mockito.doNothing().when(mockedTransaction).putOperationalData(any(InstanceIdentifier.class), any(CompositeNode.class)); Mockito.doNothing().when(mockedTransaction).removeOperationalData(any(InstanceIdentifier.class)); Mockito.doReturn(mockedFuture).when(mockedTransaction).commit(); @@ -172,17 +170,15 @@ public abstract class AbstractRIBImplModuleTest extends AbstractConfigTest { } protected List getModuleFactories() { - return Lists.newArrayList(new RIBImplModuleFactory(), new DataBrokerImplModuleFactory(), - new GlobalEventExecutorModuleFactory(), new BGPDispatcherImplModuleFactory(), - new NettyThreadgroupModuleFactory(), new TimedReconnectStrategyFactoryModuleFactory(), - new SimpleBGPExtensionProviderContextModuleFactory(), new RIBExtensionsImplModuleFactory(), - new DomBrokerImplModuleFactory(), new RuntimeMappingModuleFactory(), + return Lists.newArrayList(new RIBImplModuleFactory(), new DataBrokerImplModuleFactory(), new GlobalEventExecutorModuleFactory(), + new BGPDispatcherImplModuleFactory(), new NettyThreadgroupModuleFactory(), + new TimedReconnectStrategyFactoryModuleFactory(), new SimpleBGPExtensionProviderContextModuleFactory(), + new RIBExtensionsImplModuleFactory(), new DomBrokerImplModuleFactory(), new RuntimeMappingModuleFactory(), new HashMapDataStoreModuleFactory(), new HashedWheelTimerModuleFactory()); } @Override - protected BundleContextServiceRegistrationHandler getBundleContextServiceRegistrationHandler( - final Class serviceType) { + protected BundleContextServiceRegistrationHandler getBundleContextServiceRegistrationHandler(final Class serviceType) { if (serviceType.equals(SchemaServiceListener.class)) { return new BundleContextServiceRegistrationHandler() { @Override @@ -209,23 +205,20 @@ public abstract class AbstractRIBImplModuleTest extends AbstractConfigTest { return transaction.commit(); } - protected CommitStatus createRIBImplModuleInstance(final RibId ribId, final Long localAs, final Ipv4Address bgpId) - throws Exception { + protected CommitStatus createRIBImplModuleInstance(final RibId ribId, final Long localAs, final Ipv4Address bgpId) throws Exception { ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction(); createRIBImplModuleInstance(transaction, ribId, localAs, bgpId, createDataBrokerInstance(transaction)); return transaction.commit(); } - private ObjectName createRIBImplModuleInstance(final ConfigTransactionJMXClient transaction, final RibId ribId, - final Long localAs, final Ipv4Address bgpId, final ObjectName dataBroker) throws Exception { + private ObjectName createRIBImplModuleInstance(final ConfigTransactionJMXClient transaction, final RibId ribId, final Long localAs, + final Ipv4Address bgpId, final ObjectName dataBroker) throws Exception { ObjectName nameCreated = transaction.createModule(FACTORY_NAME, INSTANCE_NAME); RIBImplModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, RIBImplModuleMXBean.class); - ObjectName reconnectObjectName = TimedReconnectStrategyModuleTest.createInstance(transaction, - SESSION_RS_INSTANCE_NAME); + ObjectName reconnectObjectName = TimedReconnectStrategyModuleTest.createInstance(transaction, SESSION_RS_INSTANCE_NAME); mxBean.setSessionReconnectStrategy(reconnectObjectName); mxBean.setDataProvider(dataBroker); - ObjectName reconnectStrategyON = TimedReconnectStrategyModuleTest.createInstance(transaction, - TCP_RS_INSTANCE_NAME); + ObjectName reconnectStrategyON = TimedReconnectStrategyModuleTest.createInstance(transaction, TCP_RS_INSTANCE_NAME); mxBean.setTcpReconnectStrategy(reconnectStrategyON); mxBean.setBgpDispatcher(BGPDispatcherImplModuleTest.createInstance(transaction)); mxBean.setExtensions(createRibExtensionsInstance(transaction)); @@ -236,15 +229,17 @@ public abstract class AbstractRIBImplModuleTest extends AbstractConfigTest { } protected ObjectName createRIBImplModuleInstance(final ConfigTransactionJMXClient transaction) throws Exception { - return createRIBImplModuleInstance(transaction, new RibId(RIB_ID), 5000L, new Ipv4Address(BGP_ID), createDataBrokerInstance(transaction)); + return createRIBImplModuleInstance(transaction, new RibId(RIB_ID), 5000L, new Ipv4Address(BGP_ID), + createDataBrokerInstance(transaction)); } - public ObjectName createRIBImplModuleInstance(final ConfigTransactionJMXClient transaction, final ObjectName dataBroker) throws Exception { + public ObjectName createRIBImplModuleInstance(final ConfigTransactionJMXClient transaction, final ObjectName dataBroker) + throws Exception { return createRIBImplModuleInstance(transaction, new RibId(RIB_ID), 5000L, new Ipv4Address(BGP_ID), dataBroker); } - public ObjectName createDataBrokerInstance(final ConfigTransactionJMXClient transaction) - throws InstanceAlreadyExistsException, InstanceNotFoundException { + public ObjectName createDataBrokerInstance(final ConfigTransactionJMXClient transaction) throws InstanceAlreadyExistsException, + InstanceNotFoundException { ObjectName nameCreated = transaction.createModule(DataBrokerImplModuleFactory.NAME, DATA_BROKER_INSTANCE_NAME); DataBrokerImplModuleMXBean mxBean = transaction.newMBeanProxy(nameCreated, DataBrokerImplModuleMXBean.class); mxBean.setDomBroker(createDomBrokerInstance(transaction)); @@ -252,16 +247,14 @@ public abstract class AbstractRIBImplModuleTest extends AbstractConfigTest { return nameCreated; } - private ObjectName createDomBrokerInstance(final ConfigTransactionJMXClient transaction) - throws InstanceAlreadyExistsException { + private ObjectName createDomBrokerInstance(final ConfigTransactionJMXClient transaction) throws InstanceAlreadyExistsException { ObjectName nameCreated = transaction.createModule(DomBrokerImplModuleFactory.NAME, DOM_BROKER_INSTANCE_NAME); DomBrokerImplModuleMXBean mxBean = transaction.newMBeanProxy(nameCreated, DomBrokerImplModuleMXBean.class); mxBean.setDataStore(createDataStoreInstance(transaction)); return nameCreated; } - private ObjectName createDataStoreInstance(final ConfigTransactionJMXClient transaction) - throws InstanceAlreadyExistsException { + private ObjectName createDataStoreInstance(final ConfigTransactionJMXClient transaction) throws InstanceAlreadyExistsException { ObjectName nameCreated = transaction.createModule(HashMapDataStoreModuleFactory.NAME, DATA_STORE_INSTANCE_NAME); transaction.newMBeanProxy(nameCreated, HashMapDataStoreModuleMXBean.class); return nameCreated; @@ -270,22 +263,18 @@ public abstract class AbstractRIBImplModuleTest extends AbstractConfigTest { private static ObjectName lookupMappingServiceInstance(final ConfigTransactionJMXClient transaction) { try { - return transaction.lookupConfigBean(RuntimeMappingModuleFactory.NAME, - RuntimeMappingModuleFactory.SINGLETON_NAME); + return transaction.lookupConfigBean(RuntimeMappingModuleFactory.NAME, RuntimeMappingModuleFactory.SINGLETON_NAME); } catch (InstanceNotFoundException e) { try { - return transaction.createModule(RuntimeMappingModuleFactory.NAME, - RuntimeMappingModuleFactory.SINGLETON_NAME); + return transaction.createModule(RuntimeMappingModuleFactory.NAME, RuntimeMappingModuleFactory.SINGLETON_NAME); } catch (InstanceAlreadyExistsException e1) { throw new IllegalStateException(e1); } } } - private ObjectName createRibExtensionsInstance(final ConfigTransactionJMXClient transaction) - throws InstanceAlreadyExistsException { - ObjectName nameCreated = transaction.createModule(RIBExtensionsImplModuleFactory.NAME, - RIB_EXTENSIONS_INSTANCE_NAME); + private ObjectName createRibExtensionsInstance(final ConfigTransactionJMXClient transaction) throws InstanceAlreadyExistsException { + ObjectName nameCreated = transaction.createModule(RIBExtensionsImplModuleFactory.NAME, RIB_EXTENSIONS_INSTANCE_NAME); transaction.newMBeanProxy(nameCreated, RIBExtensionsImplModuleMXBean.class); return nameCreated; } @@ -296,7 +285,6 @@ public abstract class AbstractRIBImplModuleTest extends AbstractConfigTest { return paths; } - // TODO move back to AbstractConfigTest private static Collection getFilesAsInputStreams(List paths) { final Collection resources = new ArrayList<>(); @@ -309,7 +297,7 @@ public abstract class AbstractRIBImplModuleTest extends AbstractConfigTest { resources.add(resourceAsStream); } } - Assert.assertEquals("Some files were not found", Collections.emptyList(), failedToFind); + Assert.assertEquals("Some files were not found", Collections. emptyList(), failedToFind); return resources; } diff --git a/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPDispatcherImplModuleTest.java b/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPDispatcherImplModuleTest.java index a33e4e4b85..c3cc6b4fa6 100644 --- a/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPDispatcherImplModuleTest.java +++ b/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPDispatcherImplModuleTest.java @@ -7,6 +7,9 @@ */ package org.opendaylight.controller.config.yang.bgp.rib.impl; +import javax.management.InstanceAlreadyExistsException; +import javax.management.ObjectName; + import org.junit.Before; import org.junit.Test; import org.opendaylight.controller.config.api.jmx.CommitStatus; @@ -21,9 +24,6 @@ import org.opendaylight.controller.config.yang.netty.threadgroup.NettyThreadgrou import org.opendaylight.controller.config.yang.netty.timer.HashedWheelTimerModuleFactory; import org.opendaylight.controller.config.yang.netty.timer.HashedWheelTimerModuleMXBean; -import javax.management.InstanceAlreadyExistsException; -import javax.management.ObjectName; - public class BGPDispatcherImplModuleTest extends AbstractConfigTest { private static final String INSTANCE_NAME = "bgp-message-fct"; @@ -36,10 +36,7 @@ public class BGPDispatcherImplModuleTest extends AbstractConfigTest { @Before public void setUp() throws Exception { - super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(mockedContext, - new BGPDispatcherImplModuleFactory(), new NettyThreadgroupModuleFactory(), - new RIBExtensionsImplModuleFactory(), new SimpleBGPExtensionProviderContextModuleFactory(), - new HashedWheelTimerModuleFactory())); + super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(mockedContext, new BGPDispatcherImplModuleFactory(), new NettyThreadgroupModuleFactory(), new RIBExtensionsImplModuleFactory(), new SimpleBGPExtensionProviderContextModuleFactory(), new HashedWheelTimerModuleFactory())); } @Test @@ -65,11 +62,9 @@ public class BGPDispatcherImplModuleTest extends AbstractConfigTest { return transaction.commit(); } - public static ObjectName createInstance(final ConfigTransactionJMXClient transaction) - throws InstanceAlreadyExistsException { + public static ObjectName createInstance(final ConfigTransactionJMXClient transaction) throws InstanceAlreadyExistsException { ObjectName nameCreated = transaction.createModule(FACTORY_NAME, INSTANCE_NAME); - BGPDispatcherImplModuleMXBean mxBean = transaction.newMBeanProxy(nameCreated, - BGPDispatcherImplModuleMXBean.class); + BGPDispatcherImplModuleMXBean mxBean = transaction.newMBeanProxy(nameCreated, BGPDispatcherImplModuleMXBean.class); mxBean.setBossGroup(createThreadgroupInstance(transaction, BOSS_TG_INSTANCE_NAME, 10)); mxBean.setWorkerGroup(createThreadgroupInstance(transaction, WORKER_TG_INSTANCE_NAME, 10)); mxBean.setBgpExtensions(createBgpExtensionsInstance(transaction)); @@ -77,17 +72,15 @@ public class BGPDispatcherImplModuleTest extends AbstractConfigTest { return nameCreated; } - private static ObjectName createThreadgroupInstance(final ConfigTransactionJMXClient transaction, - final String instanceName, final Integer threadCount) throws InstanceAlreadyExistsException { + private static ObjectName createThreadgroupInstance(final ConfigTransactionJMXClient transaction, final String instanceName, + final Integer threadCount) throws InstanceAlreadyExistsException { ObjectName nameCreated = transaction.createModule(NettyThreadgroupModuleFactory.NAME, instanceName); - NettyThreadgroupModuleMXBean mxBean = transaction - .newMBeanProxy(nameCreated, NettyThreadgroupModuleMXBean.class); + NettyThreadgroupModuleMXBean mxBean = transaction.newMBeanProxy(nameCreated, NettyThreadgroupModuleMXBean.class); mxBean.setThreadCount(threadCount); return nameCreated; } - private static ObjectName createTimerInstance(final ConfigTransactionJMXClient transaction) - throws InstanceAlreadyExistsException { + private static ObjectName createTimerInstance(final ConfigTransactionJMXClient transaction) throws InstanceAlreadyExistsException { ObjectName nameCreated = transaction.createModule(HashedWheelTimerModuleFactory.NAME, TIMER_INSTANCE_NAME); transaction.newMBeanProxy(nameCreated, HashedWheelTimerModuleMXBean.class); return nameCreated; @@ -96,8 +89,7 @@ public class BGPDispatcherImplModuleTest extends AbstractConfigTest { private static ObjectName createBgpExtensionsInstance(final ConfigTransactionJMXClient transaction) throws InstanceAlreadyExistsException { - ObjectName nameCreated = transaction.createModule(SimpleBGPExtensionProviderContextModuleFactory.NAME, - BGP_EXTENSION_INSTANCE_NAME); + ObjectName nameCreated = transaction.createModule(SimpleBGPExtensionProviderContextModuleFactory.NAME, BGP_EXTENSION_INSTANCE_NAME); transaction.newMBeanProxy(nameCreated, SimpleBGPExtensionProviderContextModuleMXBean.class); return nameCreated; } diff --git a/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModuleTest.java b/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModuleTest.java index 1f5ef4fd0d..5938d839d7 100644 --- a/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModuleTest.java +++ b/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPPeerModuleTest.java @@ -12,6 +12,8 @@ import static org.junit.Assert.fail; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; +import com.google.common.collect.Lists; + import java.util.Collections; import java.util.List; @@ -30,8 +32,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yangtools.yang.data.impl.codec.CodecRegistry; import org.opendaylight.yangtools.yang.data.impl.codec.IdentityCodec; -import com.google.common.collect.Lists; - public class BGPPeerModuleTest extends AbstractRIBImplModuleTest { private static final String INSTANCE_NAME = "bgp-peer-module-impl"; @@ -44,8 +44,7 @@ public class BGPPeerModuleTest extends AbstractRIBImplModuleTest { protected CodecRegistry getCodecRegistry() { IdentityCodec idCodec = mock(IdentityCodec.class); doReturn(Ipv4AddressFamily.class).when(idCodec).deserialize(Ipv4AddressFamily.QNAME); - doReturn(MplsLabeledVpnSubsequentAddressFamily.class).when(idCodec).deserialize( - MplsLabeledVpnSubsequentAddressFamily.QNAME); + doReturn(MplsLabeledVpnSubsequentAddressFamily.class).when(idCodec).deserialize(MplsLabeledVpnSubsequentAddressFamily.QNAME); CodecRegistry codecReg = super.getCodecRegistry(); doReturn(idCodec).when(codecReg).getIdentityCodec(); @@ -102,16 +101,16 @@ public class BGPPeerModuleTest extends AbstractRIBImplModuleTest { CommitStatus status = createBgpPeerInstance(); ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction(); assertBeanCount(1, FACTORY_NAME); - final BGPPeerModuleMXBean mxBean = transaction.newMXBeanProxy( - transaction.lookupConfigBean(FACTORY_NAME, INSTANCE_NAME), BGPPeerModuleMXBean.class); + final BGPPeerModuleMXBean mxBean = transaction.newMXBeanProxy(transaction.lookupConfigBean(FACTORY_NAME, INSTANCE_NAME), + BGPPeerModuleMXBean.class); mxBean.setPort(new PortNumber(10)); status = transaction.commit(); assertBeanCount(1, FACTORY_NAME); assertStatus(status, 0, 1, 15); } - private ObjectName createBgpPeerInstance(final ConfigTransactionJMXClient transaction, final String host, - final PortNumber port) throws Exception { + private ObjectName createBgpPeerInstance(final ConfigTransactionJMXClient transaction, final String host, final PortNumber port) + throws Exception { final ObjectName nameCreated = transaction.createModule(FACTORY_NAME, INSTANCE_NAME); final BGPPeerModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, BGPPeerModuleMXBean.class); @@ -123,8 +122,8 @@ public class BGPPeerModuleTest extends AbstractRIBImplModuleTest { mxBean.setAdvertizedTable(Collections. emptyList()); mxBean.setRib(createRIBImplModuleInstance(transaction)); mxBean.setAdvertizedTable(Lists.newArrayList(BGPTableTypeImplModuleTest.createTableInstance(transaction, - new IdentityAttributeRef(Ipv4AddressFamily.QNAME.toString()), new IdentityAttributeRef( - MplsLabeledVpnSubsequentAddressFamily.QNAME.toString())))); + new IdentityAttributeRef(Ipv4AddressFamily.QNAME.toString()), + new IdentityAttributeRef(MplsLabeledVpnSubsequentAddressFamily.QNAME.toString())))); return nameCreated; } diff --git a/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPTableTypeImplModuleTest.java b/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPTableTypeImplModuleTest.java index dcabbcc287..d203d5dacc 100644 --- a/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPTableTypeImplModuleTest.java +++ b/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/BGPTableTypeImplModuleTest.java @@ -1,5 +1,13 @@ package org.opendaylight.controller.config.yang.bgp.rib.impl; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; + +import javax.management.InstanceAlreadyExistsException; +import javax.management.ObjectName; + import org.junit.Before; import org.junit.Test; import org.opendaylight.controller.config.api.ConflictingVersionException; @@ -15,22 +23,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yangtools.yang.data.impl.codec.CodecRegistry; import org.opendaylight.yangtools.yang.data.impl.codec.IdentityCodec; -import javax.management.InstanceAlreadyExistsException; -import javax.management.ObjectName; - -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; - public class BGPTableTypeImplModuleTest extends AbstractConfigTest { private static final String INSTANCE_NAME = "bgp-table-type-impl"; private static final String FACTORY_NAME = BGPTableTypeImplModuleFactory.NAME; private IdentityAttributeRef afiRef = new IdentityAttributeRef(Ipv4AddressFamily.QNAME.toString()); - private IdentityAttributeRef safiRef = new IdentityAttributeRef( - MplsLabeledVpnSubsequentAddressFamily.QNAME.toString()); + private IdentityAttributeRef safiRef = new IdentityAttributeRef(MplsLabeledVpnSubsequentAddressFamily.QNAME.toString()); @Before public void setUp() throws Exception { @@ -41,8 +40,7 @@ public class BGPTableTypeImplModuleTest extends AbstractConfigTest { protected CodecRegistry getCodecRegistry() { IdentityCodec idCodec = mock(IdentityCodec.class); doReturn(Ipv4AddressFamily.class).when(idCodec).deserialize(Ipv4AddressFamily.QNAME); - doReturn(MplsLabeledVpnSubsequentAddressFamily.class).when(idCodec).deserialize( - MplsLabeledVpnSubsequentAddressFamily.QNAME); + doReturn(MplsLabeledVpnSubsequentAddressFamily.class).when(idCodec).deserialize(MplsLabeledVpnSubsequentAddressFamily.QNAME); doReturn(Ipv6AddressFamily.class).when(idCodec).deserialize(Ipv6AddressFamily.QNAME); CodecRegistry codecReg = super.getCodecRegistry(); @@ -92,8 +90,8 @@ public class BGPTableTypeImplModuleTest extends AbstractConfigTest { createInstance(); final ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction(); assertBeanCount(1, FACTORY_NAME); - final BGPTableTypeImplModuleMXBean mxBean = transaction.newMXBeanProxy( - transaction.lookupConfigBean(FACTORY_NAME, INSTANCE_NAME), BGPTableTypeImplModuleMXBean.class); + final BGPTableTypeImplModuleMXBean mxBean = transaction.newMXBeanProxy(transaction.lookupConfigBean(FACTORY_NAME, INSTANCE_NAME), + BGPTableTypeImplModuleMXBean.class); mxBean.setAfi(new IdentityAttributeRef(Ipv6AddressFamily.QNAME.toString())); final CommitStatus status = transaction.commit(); assertBeanCount(1, FACTORY_NAME); @@ -111,12 +109,10 @@ public class BGPTableTypeImplModuleTest extends AbstractConfigTest { return transaction.commit(); } - public static ObjectName createTableInstance(final ConfigTransactionJMXClient transaction, - final IdentityAttributeRef afiRef, final IdentityAttributeRef safiRef) - throws InstanceAlreadyExistsException { + public static ObjectName createTableInstance(final ConfigTransactionJMXClient transaction, final IdentityAttributeRef afiRef, + final IdentityAttributeRef safiRef) throws InstanceAlreadyExistsException { final ObjectName nameCreated = transaction.createModule(FACTORY_NAME, INSTANCE_NAME); - BGPTableTypeImplModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, - BGPTableTypeImplModuleMXBean.class); + BGPTableTypeImplModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, BGPTableTypeImplModuleMXBean.class); mxBean.setAfi(afiRef); mxBean.setSafi(safiRef); diff --git a/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/RIBImplModuleTest.java b/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/RIBImplModuleTest.java index 371453b8c2..8d64837e0a 100644 --- a/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/RIBImplModuleTest.java +++ b/bgp/rib-impl-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/impl/RIBImplModuleTest.java @@ -76,8 +76,8 @@ public class RIBImplModuleTest extends AbstractRIBImplModuleTest { createInstance(); final ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction(); assertBeanCount(1, FACTORY_NAME); - final RIBImplModuleMXBean mxBean = transaction.newMBeanProxy( - transaction.lookupConfigBean(FACTORY_NAME, INSTANCE_NAME), RIBImplModuleMXBean.class); + final RIBImplModuleMXBean mxBean = transaction.newMBeanProxy(transaction.lookupConfigBean(FACTORY_NAME, INSTANCE_NAME), + RIBImplModuleMXBean.class); mxBean.setLocalAs(100L); final CommitStatus status = transaction.commit(); assertBeanCount(1, FACTORY_NAME); diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPByteToMessageDecoder.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPByteToMessageDecoder.java index 27867d52d3..4ceb42de85 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPByteToMessageDecoder.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPByteToMessageDecoder.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.rib.impl; +import com.google.common.base.Preconditions; + import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import io.netty.channel.ChannelHandlerContext; @@ -20,26 +22,25 @@ import org.opendaylight.protocol.bgp.parser.spi.MessageRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; - /** * */ final class BGPByteToMessageDecoder extends ByteToMessageDecoder { - private static final Logger LOG = LoggerFactory.getLogger(BGPByteToMessageDecoder.class); - private final MessageRegistry registry; + private static final Logger LOG = LoggerFactory.getLogger(BGPByteToMessageDecoder.class); + private final MessageRegistry registry; - public BGPByteToMessageDecoder(final MessageRegistry registry) { - this.registry = Preconditions.checkNotNull(registry); - } + public BGPByteToMessageDecoder(final MessageRegistry registry) { + this.registry = Preconditions.checkNotNull(registry); + } - @Override - protected void decode(final ChannelHandlerContext ctx, final ByteBuf in, final List out) throws BGPDocumentedException, BGPParsingException { - if (in.isReadable()) { - LOG.trace("Received to decode: {}", ByteBufUtil.hexDump(in)); - out.add(this.registry.parseMessage(in)); - } else { - LOG.trace("No more content in incoming buffer."); - } - } + @Override + protected void decode(final ChannelHandlerContext ctx, final ByteBuf in, final List out) throws BGPDocumentedException, + BGPParsingException { + if (in.isReadable()) { + LOG.trace("Received to decode: {}", ByteBufUtil.hexDump(in)); + out.add(this.registry.parseMessage(in)); + } else { + LOG.trace("No more content in incoming buffer."); + } + } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPDispatcherImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPDispatcherImpl.java index b6381a11d8..1f0de89181 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPDispatcherImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPDispatcherImpl.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.rib.impl; +import com.google.common.base.Preconditions; + import io.netty.bootstrap.Bootstrap; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.EventLoopGroup; @@ -31,111 +33,109 @@ import org.opendaylight.protocol.framework.ReconnectStrategyFactory; import org.opendaylight.protocol.framework.SessionListenerFactory; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber; -import com.google.common.base.Preconditions; - /** * Implementation of BGPDispatcher. */ public final class BGPDispatcherImpl extends AbstractDispatcher implements BGPDispatcher, AutoCloseable { - private final MD5ServerChannelFactory scf; - private final MD5ChannelFactory cf; - private final BGPHandlerFactory hf; - private final Timer timer; - private KeyMapping keys; - - public BGPDispatcherImpl(final MessageRegistry messageRegistry, final Timer timer, final EventLoopGroup bossGroup, final EventLoopGroup workerGroup) { - this(messageRegistry, timer, bossGroup, workerGroup, null, null); - } - - public BGPDispatcherImpl(final MessageRegistry messageRegistry, final Timer timer, final EventLoopGroup bossGroup, final EventLoopGroup workerGroup, final MD5ChannelFactory cf, final MD5ServerChannelFactory scf) { - super(bossGroup, workerGroup); - this.timer = Preconditions.checkNotNull(timer); - this.hf = new BGPHandlerFactory(messageRegistry); - this.cf = cf; - this.scf = scf; - } - - @Override - public synchronized Future createClient(final InetSocketAddress address, final BGPSessionPreferences preferences, - final AsNumber remoteAs, final BGPSessionListener listener, final ReconnectStrategy strategy) { - final BGPSessionNegotiatorFactory snf = new BGPSessionNegotiatorFactory(this.timer, preferences, remoteAs); - final SessionListenerFactory slf = new SessionListenerFactory() { - @Override - public BGPSessionListener getSessionListener() { - return listener; - } - }; - return super.createClient(address, strategy, new PipelineInitializer() { - @Override - public void initializeChannel(final SocketChannel ch, final Promise promise) { - ch.pipeline().addLast(BGPDispatcherImpl.this.hf.getDecoders()); - ch.pipeline().addLast("negotiator", snf.getSessionNegotiator(slf, ch, promise)); - ch.pipeline().addLast(BGPDispatcherImpl.this.hf.getEncoders()); - } - }); - } - - @Override - public Future createReconnectingClient(final InetSocketAddress address, - final BGPSessionPreferences preferences, final AsNumber remoteAs, - final BGPSessionListener listener, final ReconnectStrategyFactory connectStrategyFactory, - final ReconnectStrategyFactory reestablishStrategyFactory) { - return this.createReconnectingClient(address, preferences, remoteAs, listener, connectStrategyFactory, reestablishStrategyFactory, null); - } - - @Override - public void close() { - } - - @Override - public synchronized Future createReconnectingClient(final InetSocketAddress address, - final BGPSessionPreferences preferences, final AsNumber remoteAs, - final BGPSessionListener listener, - final ReconnectStrategyFactory connectStrategyFactory, - final ReconnectStrategyFactory reestablishStrategyFactory, final KeyMapping keys) { - final BGPSessionNegotiatorFactory snf = new BGPSessionNegotiatorFactory(this.timer, preferences, remoteAs); - final SessionListenerFactory slf = new SessionListenerFactory() { - @Override - public BGPSessionListener getSessionListener() { - return listener; - } - }; - - this.keys = keys; - final Future ret = super.createReconnectingClient(address, connectStrategyFactory, reestablishStrategyFactory.createReconnectStrategy(), new PipelineInitializer() { - @Override - public void initializeChannel(final SocketChannel ch, final Promise promise) { - ch.pipeline().addLast(BGPDispatcherImpl.this.hf.getDecoders()); - ch.pipeline().addLast("negotiator", snf.getSessionNegotiator(slf, ch, promise)); - ch.pipeline().addLast(BGPDispatcherImpl.this.hf.getEncoders()); - } - }); - this.keys = null; - - return ret; - } - - - @Override - protected void customizeBootstrap(final Bootstrap b) { - if (keys != null && !keys.isEmpty()) { - if (cf == null) { - throw new UnsupportedOperationException("No key access instance available, cannot use key mapping"); - } - b.channelFactory(cf); - b.option(MD5ChannelOption.TCP_MD5SIG, keys); - } - } - - @Override - protected void customizeBootstrap(final ServerBootstrap b) { - if (keys != null && !keys.isEmpty()) { - if (scf == null) { - throw new UnsupportedOperationException("No key access instance available, cannot use key mapping"); - } - b.channelFactory(scf); - b.option(MD5ChannelOption.TCP_MD5SIG, keys); - } - } + private final MD5ServerChannelFactory scf; + private final MD5ChannelFactory cf; + private final BGPHandlerFactory hf; + private final Timer timer; + private KeyMapping keys; + + public BGPDispatcherImpl(final MessageRegistry messageRegistry, final Timer timer, final EventLoopGroup bossGroup, + final EventLoopGroup workerGroup) { + this(messageRegistry, timer, bossGroup, workerGroup, null, null); + } + + public BGPDispatcherImpl(final MessageRegistry messageRegistry, final Timer timer, final EventLoopGroup bossGroup, + final EventLoopGroup workerGroup, final MD5ChannelFactory cf, final MD5ServerChannelFactory scf) { + super(bossGroup, workerGroup); + this.timer = Preconditions.checkNotNull(timer); + this.hf = new BGPHandlerFactory(messageRegistry); + this.cf = cf; + this.scf = scf; + } + + @Override + public synchronized Future createClient(final InetSocketAddress address, final BGPSessionPreferences preferences, + final AsNumber remoteAs, final BGPSessionListener listener, final ReconnectStrategy strategy) { + final BGPSessionNegotiatorFactory snf = new BGPSessionNegotiatorFactory(this.timer, preferences, remoteAs); + final SessionListenerFactory slf = new SessionListenerFactory() { + @Override + public BGPSessionListener getSessionListener() { + return listener; + } + }; + return super.createClient(address, strategy, new PipelineInitializer() { + @Override + public void initializeChannel(final SocketChannel ch, final Promise promise) { + ch.pipeline().addLast(BGPDispatcherImpl.this.hf.getDecoders()); + ch.pipeline().addLast("negotiator", snf.getSessionNegotiator(slf, ch, promise)); + ch.pipeline().addLast(BGPDispatcherImpl.this.hf.getEncoders()); + } + }); + } + + @Override + public Future createReconnectingClient(final InetSocketAddress address, final BGPSessionPreferences preferences, + final AsNumber remoteAs, final BGPSessionListener listener, final ReconnectStrategyFactory connectStrategyFactory, + final ReconnectStrategyFactory reestablishStrategyFactory) { + return this.createReconnectingClient(address, preferences, remoteAs, listener, connectStrategyFactory, reestablishStrategyFactory, + null); + } + + @Override + public void close() { + } + + @Override + public synchronized Future createReconnectingClient(final InetSocketAddress address, final BGPSessionPreferences preferences, + final AsNumber remoteAs, final BGPSessionListener listener, final ReconnectStrategyFactory connectStrategyFactory, + final ReconnectStrategyFactory reestablishStrategyFactory, final KeyMapping keys) { + final BGPSessionNegotiatorFactory snf = new BGPSessionNegotiatorFactory(this.timer, preferences, remoteAs); + final SessionListenerFactory slf = new SessionListenerFactory() { + @Override + public BGPSessionListener getSessionListener() { + return listener; + } + }; + + this.keys = keys; + final Future ret = super.createReconnectingClient(address, connectStrategyFactory, + reestablishStrategyFactory.createReconnectStrategy(), new PipelineInitializer() { + @Override + public void initializeChannel(final SocketChannel ch, final Promise promise) { + ch.pipeline().addLast(BGPDispatcherImpl.this.hf.getDecoders()); + ch.pipeline().addLast("negotiator", snf.getSessionNegotiator(slf, ch, promise)); + ch.pipeline().addLast(BGPDispatcherImpl.this.hf.getEncoders()); + } + }); + this.keys = null; + + return ret; + } + + @Override + protected void customizeBootstrap(final Bootstrap b) { + if (keys != null && !keys.isEmpty()) { + if (cf == null) { + throw new UnsupportedOperationException("No key access instance available, cannot use key mapping"); + } + b.channelFactory(cf); + b.option(MD5ChannelOption.TCP_MD5SIG, keys); + } + } + + @Override + protected void customizeBootstrap(final ServerBootstrap b) { + if (keys != null && !keys.isEmpty()) { + if (scf == null) { + throw new UnsupportedOperationException("No key access instance available, cannot use key mapping"); + } + b.channelFactory(scf); + b.option(MD5ChannelOption.TCP_MD5SIG, keys); + } + } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPHandlerFactory.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPHandlerFactory.java index 961ff90d4d..d364ed97d1 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPHandlerFactory.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPHandlerFactory.java @@ -7,35 +7,30 @@ */ package org.opendaylight.protocol.bgp.rib.impl; +import com.google.common.base.Preconditions; + import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelOutboundHandler; import org.opendaylight.protocol.bgp.parser.spi.MessageRegistry; -import com.google.common.base.Preconditions; - /** * BGP specific factory for protocol inbound/outbound handlers. */ -public class BGPHandlerFactory { - private final ChannelOutboundHandler encoder; - private final MessageRegistry registry; +public class BGPHandlerFactory { + private final ChannelOutboundHandler encoder; + private final MessageRegistry registry; - public BGPHandlerFactory(final MessageRegistry registry) { - this.registry = Preconditions.checkNotNull(registry); - this.encoder = new BGPMessageToByteEncoder(registry); - } + public BGPHandlerFactory(final MessageRegistry registry) { + this.registry = Preconditions.checkNotNull(registry); + this.encoder = new BGPMessageToByteEncoder(registry); + } - public ChannelHandler[] getEncoders() { - return new ChannelHandler[] { - this.encoder, - }; - } + public ChannelHandler[] getEncoders() { + return new ChannelHandler[] { this.encoder, }; + } - public ChannelHandler[] getDecoders() { - return new ChannelHandler[] { - new BGPMessageHeaderDecoder(), - new BGPByteToMessageDecoder(this.registry), - }; - } + public ChannelHandler[] getDecoders() { + return new ChannelHandler[] { new BGPMessageHeaderDecoder(), new BGPByteToMessageDecoder(this.registry), }; + } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPMessageHeaderDecoder.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPMessageHeaderDecoder.java index e71b445bce..0db26f9671 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPMessageHeaderDecoder.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPMessageHeaderDecoder.java @@ -14,34 +14,34 @@ import io.netty.handler.codec.LengthFieldBasedFrameDecoder; */ public final class BGPMessageHeaderDecoder extends LengthFieldBasedFrameDecoder { - private static final int MAX_FRAME_SIZE = 4096; - - private static final int MARKER_SIZE = 16; - - /* - * the length field represents the length of the whole message including the header - */ - private static final int LENGTH_SIZE = 2; - - /* - - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | | - | | - | | - | | - | Marker | - | | - | | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Length | Type | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - - */ - - public BGPMessageHeaderDecoder() { - super(MAX_FRAME_SIZE, MARKER_SIZE, LENGTH_SIZE, -MARKER_SIZE - LENGTH_SIZE, 0); - } + private static final int MAX_FRAME_SIZE = 4096; + + private static final int MARKER_SIZE = 16; + + /* + * the length field represents the length of the whole message including the header + */ + private static final int LENGTH_SIZE = 2; + + /* + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + | | + | | + | | + | Marker | + | | + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Length | Type | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + */ + + public BGPMessageHeaderDecoder() { + super(MAX_FRAME_SIZE, MARKER_SIZE, LENGTH_SIZE, -MARKER_SIZE - LENGTH_SIZE, 0); + } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPMessageToByteEncoder.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPMessageToByteEncoder.java index bb2b5e5637..633d232788 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPMessageToByteEncoder.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPMessageToByteEncoder.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.rib.impl; +import com.google.common.base.Preconditions; + import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandler.Sharable; import io.netty.channel.ChannelHandlerContext; @@ -18,26 +20,24 @@ import org.opendaylight.yangtools.yang.binding.Notification; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; - /** * */ @Sharable final class BGPMessageToByteEncoder extends MessageToByteEncoder { - private static final Logger LOG = LoggerFactory.getLogger(BGPMessageToByteEncoder.class); - private final MessageRegistry registry; + private static final Logger LOG = LoggerFactory.getLogger(BGPMessageToByteEncoder.class); + private final MessageRegistry registry; - BGPMessageToByteEncoder(final MessageRegistry registry) { - this.registry = Preconditions.checkNotNull(registry); - } + BGPMessageToByteEncoder(final MessageRegistry registry) { + this.registry = Preconditions.checkNotNull(registry); + } - @Override - protected void encode(final ChannelHandlerContext ctx, final Notification msg, final ByteBuf out) { - LOG.trace("Encoding message: {}", msg); - final byte[] bytes = this.registry.serializeMessage(msg); - LOG.trace("Encoded message: {}", ByteArray.bytesToHexString(bytes)); - out.writeBytes(bytes); - LOG.debug("Message sent to output: {}", msg); - } + @Override + protected void encode(final ChannelHandlerContext ctx, final Notification msg, final ByteBuf out) { + LOG.trace("Encoding message: {}", msg); + final byte[] bytes = this.registry.serializeMessage(msg); + LOG.trace("Encoded message: {}", ByteArray.bytesToHexString(bytes)); + out.writeBytes(bytes); + LOG.debug("Message sent to output: {}", msg); + } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPObjectComparator.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPObjectComparator.java index 4dbde722a0..8df356f447 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPObjectComparator.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPObjectComparator.java @@ -7,6 +7,10 @@ */ package org.opendaylight.protocol.bgp.rib.impl; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Preconditions; +import com.google.common.net.InetAddresses; + import java.util.Arrays; import java.util.Comparator; import java.util.List; @@ -19,165 +23,161 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.as.path.segment.c.segment.AListCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.as.path.segment.c.segment.ASetCase; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Preconditions; -import com.google.common.net.InetAddresses; - /** * This comparator is intended to implement BGP Best Path Selection algorithm, as described at - * + * * @see http://www.cisco.com/en/US/tech/tk365/technologies_tech_note09186a0080094431.shtml - * + * * @param Actual object state reference */ final class BGPObjectComparator implements Comparator { - private final byte[] localId, remoteId; - private final AsNumber ourAS; - - public BGPObjectComparator(final AsNumber ourAs, final Ipv4Address localId, final Ipv4Address remoteId) { - this.ourAS = Preconditions.checkNotNull(ourAs); - this.localId = InetAddresses.forString(localId.getValue()).getAddress(); - this.remoteId = InetAddresses.forString(remoteId.getValue()).getAddress(); - } - - @Override - public int compare(final PathAttributes o1, final PathAttributes o2) { - if (o1 == null) { - return 1; - } - if (o2 == null) { - return -1; - } - if (o1.equals(o2) && Arrays.equals(this.localId, this.remoteId)) { - return 0; - } - // 1. prefer path with accessible nexthop - // - we assume that all nexthops are accessible - - // 2. prefer path with higher LOCAL_PREF - if ((o1.getLocalPref() != null || o2.getLocalPref() != null) - && (o1.getLocalPref() != null && !o1.getLocalPref().equals(o2.getLocalPref()))) { - return o1.getLocalPref().getPref().compareTo(o2.getLocalPref().getPref()); - } - - // 3. prefer learned path - // - we assume that all paths are learned - - // 4. prefer the path with the shortest AS_PATH. - if (!o1.getAsPath().equals(o2.getAsPath())) { - final Integer i1 = countAsPath(o1.getAsPath().getSegments()); - final Integer i2 = countAsPath(o2.getAsPath().getSegments()); - return i2.compareTo(i1); - } - - // 5. prefer the path with the lowest origin type - // - IGP is lower than Exterior Gateway Protocol (EGP), and EGP is lower than INCOMPLETE - if (!o1.getOrigin().equals(o2.getOrigin())) { - if (o1.getOrigin().getValue().equals(BgpOrigin.Igp)) { - return 1; - } - if (o2.getOrigin().getValue().equals(BgpOrigin.Igp)) { - return -1; - } - if (o1.getOrigin().getValue().equals(BgpOrigin.Egp)) { - return 1; - } else { - return -1; - } - } - - // 6. prefer the path with the lowest multi-exit discriminator (MED) - if ((o1.getMultiExitDisc() != null || o2.getMultiExitDisc() != null) - && (o1.getMultiExitDisc() != null && !o1.getMultiExitDisc().equals(o2.getMultiExitDisc()))) { - return o2.getMultiExitDisc().getMed().compareTo(o1.getMultiExitDisc().getMed()); - } - - // 7. prefer eBGP over iBGP paths - // EBGP is peering between two different AS, whereas IBGP is between same AS (Autonomous System). - final AsNumber first = getPeerAs(o1.getAsPath().getSegments()); - final AsNumber second = getPeerAs(o2.getAsPath().getSegments()); - if ((first != null || second != null) && (first != null && !first.equals(second))) { - if (first == null || first.equals(this.ourAS)) { - return -1; - } - if (second == null || second.equals(this.ourAS)) { - return 1; - } - } - - // 8. Prefer the path with the lowest IGP metric to the BGP next hop. - // - no next hop metric is advertized - - // 9. When both paths are external, prefer the path that was received first (the oldest one). - // if (first.equals(this.ourAS) && second.equals(this.ourAS)) { - // FIXME: do we have a way how to determine which one was received first? - // } - - // 10. Prefer the route that comes from the BGP router with the lowest router ID. - // The router ID is the highest IP address on the router, with preference given to loopback addresses. - // If a path contains route reflector (RR) attributes, the originator ID is substituted for the router ID in the - // path selection process. - byte[] oid1 = this.localId; - byte[] oid2 = this.remoteId; - if (o1.getOriginatorId() != null) { - oid1 = InetAddresses.forString(o1.getOriginatorId().getValue()).getAddress(); - } - if (o2.getOriginatorId() != null) { - oid2 = InetAddresses.forString(o2.getOriginatorId().getValue()).getAddress(); - } - if (!Arrays.equals(oid1, oid2)) { - return compareByteArrays(oid1, oid2); - } - // 11. prefer the path with the minimum cluster list length - int cluster1 = 0; - int cluster2 = 0; - if (o1.getClusterId() != null) { - cluster1 = o1.getClusterId().size(); - } - if (o2.getClusterId() != null) { - cluster2 = o2.getClusterId().size(); - } - if (cluster1 != cluster2) { - return ((Integer) cluster1).compareTo(cluster2); - } - - // 12. Prefer the path that comes from the lowest neighbor address. - // FIXME: do we know this? - - return 0; - } - - private static int countAsPath(final List segments) { - // an AS_SET counts as 1, no matter how many ASs are in the set. - int count = 0; - boolean setPresent = false; - for (final Segments s : segments) { - if (s.getCSegment() instanceof ASetCase) { - setPresent = true; - } else { - final AListCase list = (AListCase) s.getCSegment(); - count += list.getAList().getAsSequence().size(); - } - } - return (setPresent) ? ++count : count; - } - - private static AsNumber getPeerAs(final List segments) { - if (segments.size() == 0) { - return null; - } - final AListCase first = (AListCase) segments.get(0).getCSegment(); - return first.getAList().getAsSequence().get(0).getAs(); - } - - @VisibleForTesting - public static int compareByteArrays(final byte[] byteOne, final byte[] byteTwo) { - for (int i = 0; i < byteOne.length; i++) { - final int res = Byte.compare(byteOne[i], byteTwo[i]); - if (res != 0) { - return res; - } - } - return 0; - } + private final byte[] localId, remoteId; + private final AsNumber ourAS; + + public BGPObjectComparator(final AsNumber ourAs, final Ipv4Address localId, final Ipv4Address remoteId) { + this.ourAS = Preconditions.checkNotNull(ourAs); + this.localId = InetAddresses.forString(localId.getValue()).getAddress(); + this.remoteId = InetAddresses.forString(remoteId.getValue()).getAddress(); + } + + @Override + public int compare(final PathAttributes o1, final PathAttributes o2) { + if (o1 == null) { + return 1; + } + if (o2 == null) { + return -1; + } + if (o1.equals(o2) && Arrays.equals(this.localId, this.remoteId)) { + return 0; + } + // 1. prefer path with accessible nexthop + // - we assume that all nexthops are accessible + + // 2. prefer path with higher LOCAL_PREF + if ((o1.getLocalPref() != null || o2.getLocalPref() != null) + && (o1.getLocalPref() != null && !o1.getLocalPref().equals(o2.getLocalPref()))) { + return o1.getLocalPref().getPref().compareTo(o2.getLocalPref().getPref()); + } + + // 3. prefer learned path + // - we assume that all paths are learned + + // 4. prefer the path with the shortest AS_PATH. + if (!o1.getAsPath().equals(o2.getAsPath())) { + final Integer i1 = countAsPath(o1.getAsPath().getSegments()); + final Integer i2 = countAsPath(o2.getAsPath().getSegments()); + return i2.compareTo(i1); + } + + // 5. prefer the path with the lowest origin type + // - IGP is lower than Exterior Gateway Protocol (EGP), and EGP is lower than INCOMPLETE + if (!o1.getOrigin().equals(o2.getOrigin())) { + if (o1.getOrigin().getValue().equals(BgpOrigin.Igp)) { + return 1; + } + if (o2.getOrigin().getValue().equals(BgpOrigin.Igp)) { + return -1; + } + if (o1.getOrigin().getValue().equals(BgpOrigin.Egp)) { + return 1; + } else { + return -1; + } + } + + // 6. prefer the path with the lowest multi-exit discriminator (MED) + if ((o1.getMultiExitDisc() != null || o2.getMultiExitDisc() != null) + && (o1.getMultiExitDisc() != null && !o1.getMultiExitDisc().equals(o2.getMultiExitDisc()))) { + return o2.getMultiExitDisc().getMed().compareTo(o1.getMultiExitDisc().getMed()); + } + + // 7. prefer eBGP over iBGP paths + // EBGP is peering between two different AS, whereas IBGP is between same AS (Autonomous System). + final AsNumber first = getPeerAs(o1.getAsPath().getSegments()); + final AsNumber second = getPeerAs(o2.getAsPath().getSegments()); + if ((first != null || second != null) && (first != null && !first.equals(second))) { + if (first == null || first.equals(this.ourAS)) { + return -1; + } + if (second == null || second.equals(this.ourAS)) { + return 1; + } + } + + // 8. Prefer the path with the lowest IGP metric to the BGP next hop. + // - no next hop metric is advertized + + // 9. When both paths are external, prefer the path that was received first (the oldest one). + // if (first.equals(this.ourAS) && second.equals(this.ourAS)) { + // FIXME: do we have a way how to determine which one was received first? + // } + + // 10. Prefer the route that comes from the BGP router with the lowest router ID. + // The router ID is the highest IP address on the router, with preference given to loopback addresses. + // If a path contains route reflector (RR) attributes, the originator ID is substituted for the router ID in the + // path selection process. + byte[] oid1 = this.localId; + byte[] oid2 = this.remoteId; + if (o1.getOriginatorId() != null) { + oid1 = InetAddresses.forString(o1.getOriginatorId().getValue()).getAddress(); + } + if (o2.getOriginatorId() != null) { + oid2 = InetAddresses.forString(o2.getOriginatorId().getValue()).getAddress(); + } + if (!Arrays.equals(oid1, oid2)) { + return compareByteArrays(oid1, oid2); + } + // 11. prefer the path with the minimum cluster list length + int cluster1 = 0; + int cluster2 = 0; + if (o1.getClusterId() != null) { + cluster1 = o1.getClusterId().size(); + } + if (o2.getClusterId() != null) { + cluster2 = o2.getClusterId().size(); + } + if (cluster1 != cluster2) { + return ((Integer) cluster1).compareTo(cluster2); + } + + // 12. Prefer the path that comes from the lowest neighbor address. + // FIXME: do we know this? + + return 0; + } + + private static int countAsPath(final List segments) { + // an AS_SET counts as 1, no matter how many ASs are in the set. + int count = 0; + boolean setPresent = false; + for (final Segments s : segments) { + if (s.getCSegment() instanceof ASetCase) { + setPresent = true; + } else { + final AListCase list = (AListCase) s.getCSegment(); + count += list.getAList().getAsSequence().size(); + } + } + return (setPresent) ? ++count : count; + } + + private static AsNumber getPeerAs(final List segments) { + if (segments.size() == 0) { + return null; + } + final AListCase first = (AListCase) segments.get(0).getCSegment(); + return first.getAList().getAsSequence().get(0).getAs(); + } + + @VisibleForTesting + public static int compareByteArrays(final byte[] byteOne, final byte[] byteTwo) { + for (int i = 0; i < byteOne.length; i++) { + final int res = Byte.compare(byteOne[i], byteTwo[i]); + if (res != 0) { + return res; + } + } + return 0; + } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java index 235f4e972d..0e9ac2c236 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPPeer.java @@ -7,6 +7,11 @@ */ package org.opendaylight.protocol.bgp.rib.impl; +import com.google.common.base.Charsets; +import com.google.common.base.Objects; +import com.google.common.base.Objects.ToStringHelper; +import com.google.common.base.Preconditions; + import io.netty.util.concurrent.Future; import java.net.InetSocketAddress; @@ -32,120 +37,116 @@ import org.opendaylight.yangtools.yang.binding.Notification; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Charsets; -import com.google.common.base.Objects; -import com.google.common.base.Objects.ToStringHelper; -import com.google.common.base.Preconditions; - /** * Class representing a peer. We have a single instance for each peer, which provides translation from BGP events into * RIB actions. */ public final class BGPPeer implements BGPSessionListener, Peer, AutoCloseable { - private static final Logger LOG = LoggerFactory.getLogger(BGPPeer.class); - - @GuardedBy("this") - private final Set tables = new HashSet<>(); - private final String name; - private final RIB rib; - - private Comparator comparator; - private Future cf; - private BGPSession session; - - public BGPPeer(final String name, final InetSocketAddress address, final String password, final BGPSessionPreferences prefs, - final AsNumber remoteAs, final RIB rib) { - this.rib = Preconditions.checkNotNull(rib); - this.name = Preconditions.checkNotNull(name); - - final KeyMapping keys; - if (password != null) { - keys = new KeyMapping(); - keys.put(address.getAddress(), password.getBytes(Charsets.US_ASCII)); - } else { - keys = null; - } - - this.cf = rib.getDispatcher().createReconnectingClient(address, prefs, remoteAs, this, rib.getTcpStrategyFactory(), rib.getSessionStrategyFactory(), keys); - } - - @Override - public synchronized void close() { - if (this.cf != null) { - this.cf.cancel(true); - if (this.session != null) { - this.session.close(); - this.session = null; - } - this.cf = null; - } - } - - @Override - public void onMessage(final BGPSession session, final Notification message) { - if (message instanceof Update) { - this.rib.updateTables(this, (Update) message); - } else { - LOG.info("Ignoring unhandled message class " + message.getClass()); - } - } - - @Override - public synchronized void onSessionUp(final BGPSession session) { - LOG.info("Session with peer {} went up with tables: {}", this.name, session.getAdvertisedTableTypes()); - - this.session = session; - this.comparator = new BGPObjectComparator(this.rib.getLocalAs(), this.rib.getBgpIdentifier(), session.getBgpId()); - - for (final BgpTableType t : session.getAdvertisedTableTypes()) { - final TablesKey key = new TablesKey(t.getAfi(), t.getSafi()); - - this.tables.add(key); - this.rib.initTable(this, key); - } - } - - private synchronized void cleanup() { - // FIXME: BUG-196: support graceful restart - for (final TablesKey key : this.tables) { - this.rib.clearTable(this, key); - } - - this.tables.clear(); - this.session = null; - this.comparator = null; - } - - @Override - public void onSessionDown(final BGPSession session, final Exception e) { - LOG.info("Session with peer {} went down", this.name, e); - cleanup(); - } - - @Override - public void onSessionTerminated(final BGPSession session, final BGPTerminationReason cause) { - LOG.info("Session with peer {} terminated: {}", this.name, cause); - cleanup(); - } - - @Override - public String toString() { - return addToStringAttributes(Objects.toStringHelper(this)).toString(); - } - - protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) { - toStringHelper.add("name", this.name); - toStringHelper.add("tables", this.tables); - return toStringHelper; - } - - @Override - public String getName() { - return this.name; - } - - @Override - public Comparator getComparator() { - return this.comparator; - } + private static final Logger LOG = LoggerFactory.getLogger(BGPPeer.class); + + @GuardedBy("this") + private final Set tables = new HashSet<>(); + private final String name; + private final RIB rib; + + private Comparator comparator; + private Future cf; + private BGPSession session; + + public BGPPeer(final String name, final InetSocketAddress address, final String password, final BGPSessionPreferences prefs, + final AsNumber remoteAs, final RIB rib) { + this.rib = Preconditions.checkNotNull(rib); + this.name = Preconditions.checkNotNull(name); + + final KeyMapping keys; + if (password != null) { + keys = new KeyMapping(); + keys.put(address.getAddress(), password.getBytes(Charsets.US_ASCII)); + } else { + keys = null; + } + + this.cf = rib.getDispatcher().createReconnectingClient(address, prefs, remoteAs, this, rib.getTcpStrategyFactory(), + rib.getSessionStrategyFactory(), keys); + } + + @Override + public synchronized void close() { + if (this.cf != null) { + this.cf.cancel(true); + if (this.session != null) { + this.session.close(); + this.session = null; + } + this.cf = null; + } + } + + @Override + public void onMessage(final BGPSession session, final Notification message) { + if (message instanceof Update) { + this.rib.updateTables(this, (Update) message); + } else { + LOG.info("Ignoring unhandled message class {}", message.getClass()); + } + } + + @Override + public synchronized void onSessionUp(final BGPSession session) { + LOG.info("Session with peer {} went up with tables: {}", this.name, session.getAdvertisedTableTypes()); + + this.session = session; + this.comparator = new BGPObjectComparator(this.rib.getLocalAs(), this.rib.getBgpIdentifier(), session.getBgpId()); + + for (final BgpTableType t : session.getAdvertisedTableTypes()) { + final TablesKey key = new TablesKey(t.getAfi(), t.getSafi()); + + this.tables.add(key); + this.rib.initTable(this, key); + } + } + + private synchronized void cleanup() { + // FIXME: BUG-196: support graceful restart + for (final TablesKey key : this.tables) { + this.rib.clearTable(this, key); + } + + this.tables.clear(); + this.session = null; + this.comparator = null; + } + + @Override + public void onSessionDown(final BGPSession session, final Exception e) { + LOG.info("Session with peer {} went down", this.name, e); + cleanup(); + } + + @Override + public void onSessionTerminated(final BGPSession session, final BGPTerminationReason cause) { + LOG.info("Session with peer {} terminated: {}", this.name, cause); + cleanup(); + } + + @Override + public String toString() { + return addToStringAttributes(Objects.toStringHelper(this)).toString(); + } + + protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) { + toStringHelper.add("name", this.name); + toStringHelper.add("tables", this.tables); + return toStringHelper; + } + + @Override + public String getName() { + return this.name; + } + + @Override + public Comparator getComparator() { + return this.comparator; + } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionImpl.java index 8fb2721c83..7b5e30f0d8 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionImpl.java @@ -7,6 +7,12 @@ */ package org.opendaylight.protocol.bgp.rib.impl; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Objects; +import com.google.common.base.Objects.ToStringHelper; +import com.google.common.base.Preconditions; +import com.google.common.collect.Sets; + import io.netty.channel.Channel; import io.netty.util.Timeout; import io.netty.util.Timer; @@ -43,284 +49,278 @@ import org.opendaylight.yangtools.yang.binding.Notification; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Objects; -import com.google.common.base.Objects.ToStringHelper; -import com.google.common.base.Preconditions; -import com.google.common.collect.Sets; - @VisibleForTesting public class BGPSessionImpl extends AbstractProtocolSession implements BGPSession { - private static final Logger LOG = LoggerFactory.getLogger(BGPSessionImpl.class); - - private static final Notification KEEP_ALIVE = new KeepaliveBuilder().build(); - - /** - * Internal session state. - */ - public enum State { - /** - * The session object is created by the negotiator in OpenConfirm state. While in this state, the session object - * is half-alive, e.g. the timers are running, but the session is not completely up, e.g. it has not been - * announced to the listener. If the session is torn down in this state, we do not inform the listener. - */ - OpenConfirm, - /** - * The session has been completely established. - */ - Up, - /** - * The session has been closed. It will not be resurrected. - */ - Idle, - } - - /** - * System.nanoTime value about when was sent the last message Protected to be updated also in tests. - */ - @VisibleForTesting - protected long lastMessageSentAt; - - /** - * System.nanoTime value about when was received the last message - */ - private long lastMessageReceivedAt; - - private final BGPSessionListener listener; - - /** - * Timer object grouping FSM Timers - */ - private final Timer stateTimer; - - private final BGPSynchronization sync; - - private int kaCounter = 0; - - private final Channel channel; - - @GuardedBy("this") - private State state = State.OpenConfirm; - - - private final Set tableTypes; - private final int holdTimerValue; - private final int keepAlive; - private final AsNumber asNumber; - private final Ipv4Address bgpId; - - BGPSessionImpl(final Timer timer, final BGPSessionListener listener, final Channel channel, final Open remoteOpen, final int localHoldTimer) { - this.listener = Preconditions.checkNotNull(listener); - this.stateTimer = Preconditions.checkNotNull(timer); - this.channel = Preconditions.checkNotNull(channel); - this.holdTimerValue = (remoteOpen.getHoldTimer() < localHoldTimer) ? remoteOpen.getHoldTimer() : localHoldTimer; - LOG.info("BGP HoldTimer new value: {}", this.holdTimerValue); - this.keepAlive = this.holdTimerValue / 3; - this.asNumber = AsNumberUtil.advertizedAsNumber(remoteOpen); - - final Set tts = Sets.newHashSet(); - final Set tats = Sets.newHashSet(); - if (remoteOpen.getBgpParameters() != null) { - for (final BgpParameters param : remoteOpen.getBgpParameters()) { - final CParameters cp = param.getCParameters(); - if (cp instanceof MultiprotocolCase) { - final TablesKey tt = new TablesKey(((MultiprotocolCase) cp).getMultiprotocolCapability().getAfi(), ((MultiprotocolCase) cp).getMultiprotocolCapability().getSafi()); - LOG.trace("Added table type to sync {}", tt); - tts.add(tt); - tats.add(new BgpTableTypeImpl(tt.getAfi(), tt.getSafi())); - } - } - } - - this.sync = new BGPSynchronization(this, this.listener, tts); - this.tableTypes = tats; - - if (this.holdTimerValue != 0) { - this.stateTimer.newTimeout(new TimerTask() { - - @Override - public void run(final Timeout timeout) { - handleHoldTimer(); - } - }, this.holdTimerValue, TimeUnit.SECONDS); - - this.stateTimer.newTimeout(new TimerTask() { - @Override - public void run(final Timeout timeout) { - handleKeepaliveTimer(); - } - }, this.keepAlive, TimeUnit.SECONDS); - } - this.bgpId = remoteOpen.getBgpIdentifier(); - } - - @Override - public synchronized void close() { - LOG.info("Closing session: {}", this); - if (this.state != State.Idle) { - this.sendMessage(new NotifyBuilder().setErrorCode(BGPError.CEASE.getCode()).build()); - this.channel.close(); - this.state = State.Idle; - } - } - - /** - * Handles incoming message based on their type. - * - * @param msg incoming message - */ - @Override - public void handleMessage(final Notification msg) { - // Update last reception time - this.lastMessageReceivedAt = System.nanoTime(); - - if (msg instanceof Open) { - // Open messages should not be present here - this.terminate(BGPError.FSM_ERROR); - } else if (msg instanceof Notify) { - // Notifications are handled internally - LOG.info("Session closed because Notification message received: {} / {}", ((Notify) msg).getErrorCode(), - ((Notify) msg).getErrorSubcode()); - this.closeWithoutMessage(); - this.listener.onSessionTerminated(this, - new BGPTerminationReason(BGPError.forValue(((Notify) msg).getErrorCode(), ((Notify) msg).getErrorSubcode()))); - } else if (msg instanceof Keepalive) { - // Keepalives are handled internally - LOG.trace("Received KeepAlive messsage."); - this.kaCounter++; - if (this.kaCounter >= 2) { - this.sync.kaReceived(); - } - } else { - // All others are passed up - this.listener.onMessage(this, msg); - this.sync.updReceived((Update) msg); - } - } - - @Override - public synchronized void endOfInput() { - if (this.state == State.Up) { - this.listener.onSessionDown(this, new IOException("End of input detected. Close the session.")); - } - } - - void sendMessage(final Notification msg) { - try { - this.channel.writeAndFlush(msg); - this.lastMessageSentAt = System.nanoTime(); - LOG.debug("Sent message: {}", msg); - } catch (final Exception e) { - LOG.warn("Message {} was not sent.", msg, e); - } - } - - private synchronized void closeWithoutMessage() { - LOG.debug("Closing session: {}", this); - this.channel.close(); - this.state = State.Idle; - } - - /** - * Closes PCEP session from the parent with given reason. A message needs to be sent, but parent doesn't have to be - * modified, because he initiated the closing. (To prevent concurrent modification exception). - * - * @param closeObject - */ - private void terminate(final BGPError error) { - this.sendMessage(new NotifyBuilder().setErrorCode(error.getCode()).setErrorSubcode(error.getSubcode()).build()); - this.closeWithoutMessage(); - - this.listener.onSessionTerminated(this, new BGPTerminationReason(error)); - } - - /** - * If HoldTimer expires, the session ends. If a message (whichever) was received during this period, the HoldTimer - * will be rescheduled by HOLD_TIMER_VALUE + the time that has passed from the start of the HoldTimer to the time at - * which the message was received. If the session was closed by the time this method starts to execute (the session - * state will become IDLE), then rescheduling won't occur. - */ - private synchronized void handleHoldTimer() { - if (this.state == State.Idle) { - return; - } - - final long ct = System.nanoTime(); - final long nextHold = this.lastMessageReceivedAt + TimeUnit.SECONDS.toNanos(this.holdTimerValue); - - if (ct >= nextHold) { - LOG.debug("HoldTimer expired. " + new Date()); - this.terminate(BGPError.HOLD_TIMER_EXPIRED); - } else { - this.stateTimer.newTimeout(new TimerTask() { - @Override - public void run(final Timeout timeout) { - handleHoldTimer(); - } - }, nextHold - ct, TimeUnit.NANOSECONDS); - } - } - - /** - * If KeepAlive Timer expires, sends KeepAlive message. If a message (whichever) was send during this period, the - * KeepAlive Timer will be rescheduled by KEEP_ALIVE_TIMER_VALUE + the time that has passed from the start of the - * KeepAlive timer to the time at which the message was sent. If the session was closed by the time this method - * starts to execute (the session state will become IDLE), that rescheduling won't occur. - */ - private synchronized void handleKeepaliveTimer() { - if (this.state == State.Idle) { - return; - } - - final long ct = System.nanoTime(); - long nextKeepalive = this.lastMessageSentAt + TimeUnit.SECONDS.toNanos(this.keepAlive); - - if (ct >= nextKeepalive) { - this.sendMessage(KEEP_ALIVE); - nextKeepalive = this.lastMessageSentAt + TimeUnit.SECONDS.toNanos(this.keepAlive); - } - this.stateTimer.newTimeout(new TimerTask() { - @Override - public void run(final Timeout timeout) { - handleKeepaliveTimer(); - } - }, nextKeepalive - ct, TimeUnit.NANOSECONDS); - } - - @Override - public final String toString() { - return addToStringAttributes(Objects.toStringHelper(this)).toString(); - } - - protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) { - toStringHelper.add("channel", this.channel); - toStringHelper.add("state", this.state); - return toStringHelper; - } - - @Override - public Set getAdvertisedTableTypes() { - return this.tableTypes; - } - - @Override - protected synchronized void sessionUp() { - this.state = State.Up; - this.listener.onSessionUp(this); - } - - public synchronized State getState() { - return this.state; - } - - @Override - public final Ipv4Address getBgpId() { - return this.bgpId; - } - - @Override - public final AsNumber getAsNumber() { - return this.asNumber; - } + private static final Logger LOG = LoggerFactory.getLogger(BGPSessionImpl.class); + + private static final Notification KEEP_ALIVE = new KeepaliveBuilder().build(); + + /** + * Internal session state. + */ + public enum State { + /** + * The session object is created by the negotiator in OpenConfirm state. While in this state, the session object + * is half-alive, e.g. the timers are running, but the session is not completely up, e.g. it has not been + * announced to the listener. If the session is torn down in this state, we do not inform the listener. + */ + OpenConfirm, + /** + * The session has been completely established. + */ + Up, + /** + * The session has been closed. It will not be resurrected. + */ + Idle, + } + + /** + * System.nanoTime value about when was sent the last message Protected to be updated also in tests. + */ + @VisibleForTesting + protected long lastMessageSentAt; + + /** + * System.nanoTime value about when was received the last message + */ + private long lastMessageReceivedAt; + + private final BGPSessionListener listener; + + /** + * Timer object grouping FSM Timers + */ + private final Timer stateTimer; + + private final BGPSynchronization sync; + + private int kaCounter = 0; + + private final Channel channel; + + @GuardedBy("this") + private State state = State.OpenConfirm; + + private final Set tableTypes; + private final int holdTimerValue; + private final int keepAlive; + private final AsNumber asNumber; + private final Ipv4Address bgpId; + + BGPSessionImpl(final Timer timer, final BGPSessionListener listener, final Channel channel, final Open remoteOpen, + final int localHoldTimer) { + this.listener = Preconditions.checkNotNull(listener); + this.stateTimer = Preconditions.checkNotNull(timer); + this.channel = Preconditions.checkNotNull(channel); + this.holdTimerValue = (remoteOpen.getHoldTimer() < localHoldTimer) ? remoteOpen.getHoldTimer() : localHoldTimer; + LOG.info("BGP HoldTimer new value: {}", this.holdTimerValue); + this.keepAlive = this.holdTimerValue / 3; + this.asNumber = AsNumberUtil.advertizedAsNumber(remoteOpen); + + final Set tts = Sets.newHashSet(); + final Set tats = Sets.newHashSet(); + if (remoteOpen.getBgpParameters() != null) { + for (final BgpParameters param : remoteOpen.getBgpParameters()) { + final CParameters cp = param.getCParameters(); + if (cp instanceof MultiprotocolCase) { + final TablesKey tt = new TablesKey(((MultiprotocolCase) cp).getMultiprotocolCapability().getAfi(), ((MultiprotocolCase) cp).getMultiprotocolCapability().getSafi()); + LOG.trace("Added table type to sync {}", tt); + tts.add(tt); + tats.add(new BgpTableTypeImpl(tt.getAfi(), tt.getSafi())); + } + } + } + + this.sync = new BGPSynchronization(this, this.listener, tts); + this.tableTypes = tats; + + if (this.holdTimerValue != 0) { + this.stateTimer.newTimeout(new TimerTask() { + + @Override + public void run(final Timeout timeout) { + handleHoldTimer(); + } + }, this.holdTimerValue, TimeUnit.SECONDS); + + this.stateTimer.newTimeout(new TimerTask() { + @Override + public void run(final Timeout timeout) { + handleKeepaliveTimer(); + } + }, this.keepAlive, TimeUnit.SECONDS); + } + this.bgpId = remoteOpen.getBgpIdentifier(); + } + + @Override + public synchronized void close() { + LOG.info("Closing session: {}", this); + if (this.state != State.Idle) { + this.sendMessage(new NotifyBuilder().setErrorCode(BGPError.CEASE.getCode()).build()); + this.channel.close(); + this.state = State.Idle; + } + } + + /** + * Handles incoming message based on their type. + * + * @param msg incoming message + */ + @Override + public void handleMessage(final Notification msg) { + // Update last reception time + this.lastMessageReceivedAt = System.nanoTime(); + + if (msg instanceof Open) { + // Open messages should not be present here + this.terminate(BGPError.FSM_ERROR); + } else if (msg instanceof Notify) { + // Notifications are handled internally + LOG.info("Session closed because Notification message received: {} / {}", ((Notify) msg).getErrorCode(), + ((Notify) msg).getErrorSubcode()); + this.closeWithoutMessage(); + this.listener.onSessionTerminated(this, new BGPTerminationReason(BGPError.forValue(((Notify) msg).getErrorCode(), + ((Notify) msg).getErrorSubcode()))); + } else if (msg instanceof Keepalive) { + // Keepalives are handled internally + LOG.trace("Received KeepAlive messsage."); + this.kaCounter++; + if (this.kaCounter >= 2) { + this.sync.kaReceived(); + } + } else { + // All others are passed up + this.listener.onMessage(this, msg); + this.sync.updReceived((Update) msg); + } + } + + @Override + public synchronized void endOfInput() { + if (this.state == State.Up) { + this.listener.onSessionDown(this, new IOException("End of input detected. Close the session.")); + } + } + + void sendMessage(final Notification msg) { + try { + this.channel.writeAndFlush(msg); + this.lastMessageSentAt = System.nanoTime(); + LOG.debug("Sent message: {}", msg); + } catch (final Exception e) { + LOG.warn("Message {} was not sent.", msg, e); + } + } + + private synchronized void closeWithoutMessage() { + LOG.debug("Closing session: {}", this); + this.channel.close(); + this.state = State.Idle; + } + + /** + * Closes PCEP session from the parent with given reason. A message needs to be sent, but parent doesn't have to be + * modified, because he initiated the closing. (To prevent concurrent modification exception). + * + * @param closeObject + */ + private void terminate(final BGPError error) { + this.sendMessage(new NotifyBuilder().setErrorCode(error.getCode()).setErrorSubcode(error.getSubcode()).build()); + this.closeWithoutMessage(); + + this.listener.onSessionTerminated(this, new BGPTerminationReason(error)); + } + + /** + * If HoldTimer expires, the session ends. If a message (whichever) was received during this period, the HoldTimer + * will be rescheduled by HOLD_TIMER_VALUE + the time that has passed from the start of the HoldTimer to the time at + * which the message was received. If the session was closed by the time this method starts to execute (the session + * state will become IDLE), then rescheduling won't occur. + */ + private synchronized void handleHoldTimer() { + if (this.state == State.Idle) { + return; + } + + final long ct = System.nanoTime(); + final long nextHold = this.lastMessageReceivedAt + TimeUnit.SECONDS.toNanos(this.holdTimerValue); + + if (ct >= nextHold) { + LOG.debug("HoldTimer expired. {}", new Date()); + this.terminate(BGPError.HOLD_TIMER_EXPIRED); + } else { + this.stateTimer.newTimeout(new TimerTask() { + @Override + public void run(final Timeout timeout) { + handleHoldTimer(); + } + }, nextHold - ct, TimeUnit.NANOSECONDS); + } + } + + /** + * If KeepAlive Timer expires, sends KeepAlive message. If a message (whichever) was send during this period, the + * KeepAlive Timer will be rescheduled by KEEP_ALIVE_TIMER_VALUE + the time that has passed from the start of the + * KeepAlive timer to the time at which the message was sent. If the session was closed by the time this method + * starts to execute (the session state will become IDLE), that rescheduling won't occur. + */ + private synchronized void handleKeepaliveTimer() { + if (this.state == State.Idle) { + return; + } + + final long ct = System.nanoTime(); + long nextKeepalive = this.lastMessageSentAt + TimeUnit.SECONDS.toNanos(this.keepAlive); + + if (ct >= nextKeepalive) { + this.sendMessage(KEEP_ALIVE); + nextKeepalive = this.lastMessageSentAt + TimeUnit.SECONDS.toNanos(this.keepAlive); + } + this.stateTimer.newTimeout(new TimerTask() { + @Override + public void run(final Timeout timeout) { + handleKeepaliveTimer(); + } + }, nextKeepalive - ct, TimeUnit.NANOSECONDS); + } + + @Override + public final String toString() { + return addToStringAttributes(Objects.toStringHelper(this)).toString(); + } + + protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) { + toStringHelper.add("channel", this.channel); + toStringHelper.add("state", this.state); + return toStringHelper; + } + + @Override + public Set getAdvertisedTableTypes() { + return this.tableTypes; + } + + @Override + protected synchronized void sessionUp() { + this.state = State.Up; + this.listener.onSessionUp(this); + } + + public synchronized State getState() { + return this.state; + } + + @Override + public final Ipv4Address getBgpId() { + return this.bgpId; + } + + @Override + public final AsNumber getAsNumber() { + return this.asNumber; + } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionNegotiator.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionNegotiator.java index 52cbc1897d..d8e445e18f 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionNegotiator.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionNegotiator.java @@ -7,6 +7,9 @@ */ package org.opendaylight.protocol.bgp.rib.impl; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Preconditions; + import io.netty.channel.Channel; import io.netty.util.Timeout; import io.netty.util.Timer; @@ -37,154 +40,151 @@ import org.opendaylight.yangtools.yang.binding.Notification; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Preconditions; - public final class BGPSessionNegotiator extends AbstractSessionNegotiator { - // 4 minutes recommended in http://tools.ietf.org/html/rfc4271#section-8.2.2 - protected static final int INITIAL_HOLDTIMER = 4; - - /** - * @see BGP Support for 4-Octet AS Number Space - */ - private static final int AS_TRANS = 23456; - - @VisibleForTesting - public enum State { - /** - * Negotiation has not started yet. - */ - Idle, - /** - * We have sent our Open message, and are waiting for the peer's Open message. - */ - OpenSent, - /** - * We have received the peer's Open message, which is acceptable, and we're waiting the acknowledgement of our - * Open message. - */ - OpenConfirm, - /** - * The negotiation finished. - */ - Finished, - } - - private static final Logger LOG = LoggerFactory.getLogger(BGPSessionNegotiator.class); - private final BGPSessionPreferences localPref; - private final BGPSessionListener listener; - private final AsNumber remoteAs; - private final Timer timer; - - @GuardedBy("this") - private State state = State.Idle; - - @GuardedBy("this") - private BGPSessionImpl session; - - public BGPSessionNegotiator(final Timer timer, final Promise promise, final Channel channel, - final BGPSessionPreferences initialPrefs, final AsNumber remoteAs, final BGPSessionListener listener) { - super(promise, channel); - this.listener = Preconditions.checkNotNull(listener); - this.localPref = Preconditions.checkNotNull(initialPrefs); - this.remoteAs = Preconditions.checkNotNull(remoteAs); - this.timer = Preconditions.checkNotNull(timer); - } - - @Override - protected void startNegotiation() { - Preconditions.checkState(this.state == State.Idle); - int as = this.localPref.getMyAs().getValue().intValue(); - // Set as AS_TRANS if the value is bigger than 2B - if (as > Values.UNSIGNED_SHORT_MAX_VALUE) { - as = AS_TRANS; - } - this.sendMessage(new OpenBuilder().setMyAsNumber(as).setHoldTimer( - this.localPref.getHoldTime()).setBgpIdentifier(this.localPref.getBgpId()).setBgpParameters(this.localPref.getParams()).build()); - this.state = State.OpenSent; - - final Object lock = this; - this.timer.newTimeout(new TimerTask() { - @Override - public void run(final Timeout timeout) { - synchronized (lock) { - if (BGPSessionNegotiator.this.state != State.Finished) { - BGPSessionNegotiator.this.sendMessage(buildErrorNotify(BGPError.HOLD_TIMER_EXPIRED)); - negotiationFailed(new BGPDocumentedException("HoldTimer expired", BGPError.FSM_ERROR)); - BGPSessionNegotiator.this.state = State.Finished; - } - } - } - }, INITIAL_HOLDTIMER, TimeUnit.MINUTES); - } - - @Override - protected synchronized void handleMessage(final Notification msg) { - LOG.debug("Channel {} handling message in state {}", this.channel, this.state); - - switch (this.state) { - case Finished: - case Idle: - this.sendMessage(buildErrorNotify(BGPError.FSM_ERROR)); - return; - case OpenConfirm: - if (msg instanceof Keepalive) { - negotiationSuccessful(this.session); - LOG.info("BGP Session with peer {} established successfully.", this.channel); - } else if (msg instanceof Notify) { - final Notify ntf = (Notify) msg; - negotiationFailed(new BGPDocumentedException("Peer refusal", BGPError.forValue(ntf.getErrorCode(), ntf.getErrorSubcode()))); - } - this.state = State.Finished; - return; - case OpenSent: - if (msg instanceof Open) { - final Open openObj = (Open) msg; - handleOpen(openObj); - return; - } - break; - } - - // Catch-all for unexpected message - LOG.warn("Channel {} state {} unexpected message {}", this.channel, this.state, msg); - this.sendMessage(buildErrorNotify(BGPError.FSM_ERROR)); - negotiationFailed(new BGPDocumentedException("Unexpected message", BGPError.FSM_ERROR)); - this.state = State.Finished; - } - - private static Notify buildErrorNotify(final BGPError err) { - return new NotifyBuilder().setErrorCode(err.getCode()).setErrorSubcode(err.getSubcode()).build(); - } - - private void handleOpen(final Open openObj) { - final AsNumber as = AsNumberUtil.advertizedAsNumber(openObj); - if (!this.remoteAs.equals(as)) { - LOG.warn("Unexpected remote AS number. Expecting {}, got {}", this.remoteAs, as); - this.sendMessage(buildErrorNotify(BGPError.BAD_PEER_AS)); - negotiationFailed(new BGPDocumentedException("Peer AS number mismatch", BGPError.BAD_PEER_AS)); - this.state = State.Finished; - return; - } - - final List prefs = openObj.getBgpParameters(); - if (prefs != null && !prefs.isEmpty()) { - if (!prefs.containsAll(this.localPref.getParams())) { - LOG.info("BGP Open message session parameters differ, session still accepted."); - } - this.sendMessage(new KeepaliveBuilder().build()); - this.session = new BGPSessionImpl(this.timer, this.listener, this.channel, openObj, this.localPref.getHoldTime()); - this.state = State.OpenConfirm; - LOG.debug("Channel {} moved to OpenConfirm state with remote proposal {}", this.channel, openObj); - return; - } - - this.sendMessage(buildErrorNotify(BGPError.UNSPECIFIC_OPEN_ERROR)); - negotiationFailed(new BGPDocumentedException("Open message unacceptable. Check the configuration of BGP speaker.", BGPError.UNSPECIFIC_OPEN_ERROR)); - this.state = State.Finished; - } - - public synchronized State getState() { - return this.state; - } + // 4 minutes recommended in http://tools.ietf.org/html/rfc4271#section-8.2.2 + protected static final int INITIAL_HOLDTIMER = 4; + + /** + * @see BGP Support for 4-Octet AS Number Space + */ + private static final int AS_TRANS = 23456; + + @VisibleForTesting + public enum State { + /** + * Negotiation has not started yet. + */ + Idle, + /** + * We have sent our Open message, and are waiting for the peer's Open message. + */ + OpenSent, + /** + * We have received the peer's Open message, which is acceptable, and we're waiting the acknowledgement of our + * Open message. + */ + OpenConfirm, + /** + * The negotiation finished. + */ + Finished, + } + + private static final Logger LOG = LoggerFactory.getLogger(BGPSessionNegotiator.class); + private final BGPSessionPreferences localPref; + private final BGPSessionListener listener; + private final AsNumber remoteAs; + private final Timer timer; + + @GuardedBy("this") + private State state = State.Idle; + + @GuardedBy("this") + private BGPSessionImpl session; + + public BGPSessionNegotiator(final Timer timer, final Promise promise, final Channel channel, + final BGPSessionPreferences initialPrefs, final AsNumber remoteAs, final BGPSessionListener listener) { + super(promise, channel); + this.listener = Preconditions.checkNotNull(listener); + this.localPref = Preconditions.checkNotNull(initialPrefs); + this.remoteAs = Preconditions.checkNotNull(remoteAs); + this.timer = Preconditions.checkNotNull(timer); + } + + @Override + protected void startNegotiation() { + Preconditions.checkState(this.state == State.Idle); + int as = this.localPref.getMyAs().getValue().intValue(); + // Set as AS_TRANS if the value is bigger than 2B + if (as > Values.UNSIGNED_SHORT_MAX_VALUE) { + as = AS_TRANS; + } + this.sendMessage(new OpenBuilder().setMyAsNumber(as).setHoldTimer(this.localPref.getHoldTime()).setBgpIdentifier( + this.localPref.getBgpId()).setBgpParameters(this.localPref.getParams()).build()); + this.state = State.OpenSent; + + final Object lock = this; + this.timer.newTimeout(new TimerTask() { + @Override + public void run(final Timeout timeout) { + synchronized (lock) { + if (BGPSessionNegotiator.this.state != State.Finished) { + BGPSessionNegotiator.this.sendMessage(buildErrorNotify(BGPError.HOLD_TIMER_EXPIRED)); + negotiationFailed(new BGPDocumentedException("HoldTimer expired", BGPError.FSM_ERROR)); + BGPSessionNegotiator.this.state = State.Finished; + } + } + } + }, INITIAL_HOLDTIMER, TimeUnit.MINUTES); + } + + @Override + protected synchronized void handleMessage(final Notification msg) { + LOG.debug("Channel {} handling message in state {}", this.channel, this.state); + + switch (this.state) { + case Finished: + case Idle: + this.sendMessage(buildErrorNotify(BGPError.FSM_ERROR)); + return; + case OpenConfirm: + if (msg instanceof Keepalive) { + negotiationSuccessful(this.session); + LOG.info("BGP Session with peer {} established successfully.", this.channel); + } else if (msg instanceof Notify) { + final Notify ntf = (Notify) msg; + negotiationFailed(new BGPDocumentedException("Peer refusal", BGPError.forValue(ntf.getErrorCode(), ntf.getErrorSubcode()))); + } + this.state = State.Finished; + return; + case OpenSent: + if (msg instanceof Open) { + final Open openObj = (Open) msg; + handleOpen(openObj); + return; + } + break; + } + + // Catch-all for unexpected message + LOG.warn("Channel {} state {} unexpected message {}", this.channel, this.state, msg); + this.sendMessage(buildErrorNotify(BGPError.FSM_ERROR)); + negotiationFailed(new BGPDocumentedException("Unexpected message", BGPError.FSM_ERROR)); + this.state = State.Finished; + } + + private static Notify buildErrorNotify(final BGPError err) { + return new NotifyBuilder().setErrorCode(err.getCode()).setErrorSubcode(err.getSubcode()).build(); + } + + private void handleOpen(final Open openObj) { + final AsNumber as = AsNumberUtil.advertizedAsNumber(openObj); + if (!this.remoteAs.equals(as)) { + LOG.warn("Unexpected remote AS number. Expecting {}, got {}", this.remoteAs, as); + this.sendMessage(buildErrorNotify(BGPError.BAD_PEER_AS)); + negotiationFailed(new BGPDocumentedException("Peer AS number mismatch", BGPError.BAD_PEER_AS)); + this.state = State.Finished; + return; + } + + final List prefs = openObj.getBgpParameters(); + if (prefs != null && !prefs.isEmpty()) { + if (!prefs.containsAll(this.localPref.getParams())) { + LOG.info("BGP Open message session parameters differ, session still accepted."); + } + this.sendMessage(new KeepaliveBuilder().build()); + this.session = new BGPSessionImpl(this.timer, this.listener, this.channel, openObj, this.localPref.getHoldTime()); + this.state = State.OpenConfirm; + LOG.debug("Channel {} moved to OpenConfirm state with remote proposal {}", this.channel, openObj); + return; + } + + this.sendMessage(buildErrorNotify(BGPError.UNSPECIFIC_OPEN_ERROR)); + negotiationFailed(new BGPDocumentedException("Open message unacceptable. Check the configuration of BGP speaker.", BGPError.UNSPECIFIC_OPEN_ERROR)); + this.state = State.Finished; + } + + public synchronized State getState() { + return this.state; + } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionNegotiatorFactory.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionNegotiatorFactory.java index ffe725e58b..ce9c207352 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionNegotiatorFactory.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionNegotiatorFactory.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.rib.impl; +import com.google.common.base.Preconditions; + import io.netty.channel.Channel; import io.netty.util.Timer; import io.netty.util.concurrent.Promise; @@ -19,22 +21,20 @@ import org.opendaylight.protocol.framework.SessionNegotiatorFactory; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber; import org.opendaylight.yangtools.yang.binding.Notification; -import com.google.common.base.Preconditions; - public final class BGPSessionNegotiatorFactory implements SessionNegotiatorFactory { - private final BGPSessionPreferences initialPrefs; - private final AsNumber remoteAs; - private final Timer timer; + private final BGPSessionPreferences initialPrefs; + private final AsNumber remoteAs; + private final Timer timer; - public BGPSessionNegotiatorFactory(final Timer timer, final BGPSessionPreferences initialPrefs, final AsNumber remoteAs) { - this.timer = Preconditions.checkNotNull(timer); - this.initialPrefs = Preconditions.checkNotNull(initialPrefs); - this.remoteAs = Preconditions.checkNotNull(remoteAs); - } + public BGPSessionNegotiatorFactory(final Timer timer, final BGPSessionPreferences initialPrefs, final AsNumber remoteAs) { + this.timer = Preconditions.checkNotNull(timer); + this.initialPrefs = Preconditions.checkNotNull(initialPrefs); + this.remoteAs = Preconditions.checkNotNull(remoteAs); + } - @Override - public SessionNegotiator getSessionNegotiator(final SessionListenerFactory factory, - final Channel channel, final Promise promise) { - return new BGPSessionNegotiator(this.timer, promise, channel, this.initialPrefs, remoteAs, factory.getSessionListener()); - } + @Override + public SessionNegotiator getSessionNegotiator(final SessionListenerFactory factory, + final Channel channel, final Promise promise) { + return new BGPSessionNegotiator(this.timer, promise, channel, this.initialPrefs, remoteAs, factory.getSessionListener()); + } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionProposalImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionProposalImpl.java index fe65b8ca02..eb23700a79 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionProposalImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSessionProposalImpl.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.rib.impl; +import com.google.common.collect.Lists; + import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -24,61 +26,59 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mult import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily; -import com.google.common.collect.Lists; - /** * Basic implementation of BGP Session Proposal. The values are taken from conf-bgp. */ public final class BGPSessionProposalImpl implements BGPSessionProposal { - private final short holdTimer; + private final short holdTimer; - private final AsNumber as; + private final AsNumber as; - private final Ipv4Address bgpId; + private final Ipv4Address bgpId; - private final BGPSessionPreferences prefs; + private final BGPSessionPreferences prefs; - public BGPSessionProposalImpl(final short holdTimer, final AsNumber as, final Ipv4Address bgpId, - final Map, Class> tables) { - this.holdTimer = holdTimer; - this.as = as; - this.bgpId = bgpId; + public BGPSessionProposalImpl(final short holdTimer, final AsNumber as, final Ipv4Address bgpId, + final Map, Class> tables) { + this.holdTimer = holdTimer; + this.as = as; + this.bgpId = bgpId; - final List tlvs = Lists.newArrayList(); - for (final Entry, Class> e : tables.entrySet()) { - tlvs.add(new BgpParametersBuilder().setCParameters( - new MultiprotocolCaseBuilder().setMultiprotocolCapability( - new MultiprotocolCapabilityBuilder().setAfi(e.getKey()).setSafi(e.getValue()).build()).build()).build()); - } - tlvs.add(new BgpParametersBuilder().setCParameters( - new As4BytesCaseBuilder().setAs4BytesCapability(new As4BytesCapabilityBuilder().setAsNumber(as).build()).build()).build()); - this.prefs = new BGPSessionPreferences(as, holdTimer, bgpId, tlvs); - } + final List tlvs = Lists.newArrayList(); + for (final Entry, Class> e : tables.entrySet()) { + tlvs.add(new BgpParametersBuilder().setCParameters( + new MultiprotocolCaseBuilder().setMultiprotocolCapability( + new MultiprotocolCapabilityBuilder().setAfi(e.getKey()).setSafi(e.getValue()).build()).build()).build()); + } + tlvs.add(new BgpParametersBuilder().setCParameters( + new As4BytesCaseBuilder().setAs4BytesCapability(new As4BytesCapabilityBuilder().setAsNumber(as).build()).build()).build()); + this.prefs = new BGPSessionPreferences(as, holdTimer, bgpId, tlvs); + } - @Override - public BGPSessionPreferences getProposal() { - return this.prefs; - } + @Override + public BGPSessionPreferences getProposal() { + return this.prefs; + } - /** - * @return the holdTimer - */ - public short getHoldTimer() { - return this.holdTimer; - } + /** + * @return the holdTimer + */ + public short getHoldTimer() { + return this.holdTimer; + } - /** - * @return the as - */ - public AsNumber getAs() { - return this.as; - } + /** + * @return the as + */ + public AsNumber getAs() { + return this.as; + } - /** - * @return the bgpId - */ - public Ipv4Address getBgpId() { - return this.bgpId; - } + /** + * @return the bgpId + */ + public Ipv4Address getBgpId() { + return this.bgpId; + } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSynchronization.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSynchronization.java index c9dc64e1fc..9745b1c839 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSynchronization.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPSynchronization.java @@ -7,6 +7,9 @@ */ package org.opendaylight.protocol.bgp.rib.impl; +import com.google.common.base.Preconditions; +import com.google.common.collect.Maps; + import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -26,9 +29,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; -import com.google.common.collect.Maps; - /** * BGP speaker (without Graceful restart capability) sends KeepAlive message after sending all initial Update messages * with certain AFI/SAFI. For each AFI/SAFI, it sends one KA message. As it is undetermined which KA message belongs to @@ -36,105 +36,105 @@ import com.google.common.collect.Maps; */ public class BGPSynchronization { - private static final Logger LOG = LoggerFactory.getLogger(BGPSynchronization.class); - - private static class SyncVariables { - - private boolean upd = false; - private boolean eor = false; - - public void setUpd(final boolean upd) { - this.upd = upd; - } - - public void setEorTrue() { - this.eor = true; - } - - public boolean getEor() { - return this.eor; - } - - public boolean getUpd() { - return this.upd; - } - } - - private final Map syncStorage = Maps.newHashMap(); - - private final BGPSessionListener listener; - - private final BGPSession session; - - public BGPSynchronization(final BGPSession bgpSession, final BGPSessionListener listener, final Set types) { - this.listener = Preconditions.checkNotNull(listener); - this.session = Preconditions.checkNotNull(bgpSession); - - for (final TablesKey type : types) { - this.syncStorage.put(type, new SyncVariables()); - } - } - - /** - * For each received Update message, the upd sync variable needs to be updated to true, for particular AFI/SAFI - * combination. Currently we only assume Unicast SAFI. From the Update message we have to extract the AFI. Each - * Update message can contain BGP Object with one type of AFI. If the object is BGP Link, BGP Node or BGPPrefix - * the AFI is Linkstate. In case of BGPRoute, the AFI depends on the IP Address of the prefix. - * - * @param msg received Update message - */ - public void updReceived(final Update msg) { - TablesKey type = null; - if (msg.getNlri() != null || msg.getWithdrawnRoutes() != null) { - type = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); - } else if (msg.getPathAttributes().getAugmentation(PathAttributes1.class) != null) { - final PathAttributes1 pa = msg.getPathAttributes().getAugmentation(PathAttributes1.class); - if (pa.getMpReachNlri() != null) { - type = new TablesKey(pa.getMpReachNlri().getAfi(), pa.getMpReachNlri().getSafi()); - } - } else if (msg.getPathAttributes().getAugmentation(PathAttributes2.class) != null) { - final PathAttributes2 pa = msg.getPathAttributes().getAugmentation(PathAttributes2.class); - if (pa.getMpUnreachNlri() != null) { - type = new TablesKey(pa.getMpUnreachNlri().getAfi(), pa.getMpUnreachNlri().getSafi()); - } - } - final SyncVariables s = this.syncStorage.get(type); - if (s == null) { - LOG.warn("BGPTableType was not present in open message : {}", type); - return; - } - s.setUpd(true); - } - - /** - * This method is called, when the second KA message is received. It checks each AFI/SAFI sync variables. If they - * are all false, which means, that there was at least one update message followed by one KA, the EOR is sent to - * session. - */ - public void kaReceived() { - for (final Entry entry : this.syncStorage.entrySet()) { - final SyncVariables s = entry.getValue(); - if (!s.getEor()) { - if (!s.getUpd()) { - s.setEorTrue(); - LOG.info("BGP Synchronization finished for table {} ", entry.getKey()); - final Update up = generateEOR(entry.getKey()); - LOG.debug("Sending synchronization message: {}", up); - this.listener.onMessage(this.session, up); - } - s.setUpd(false); - } - } - } - - private Update generateEOR(final TablesKey type) { - if (type.getAfi().equals(Ipv4AddressFamily.class) && type.getSafi().equals(UnicastSubsequentAddressFamily.class)) { - return new UpdateBuilder().build(); - } - return new UpdateBuilder().setPathAttributes( - new PathAttributesBuilder().addAugmentation( - PathAttributes1.class, - new PathAttributes1Builder().setMpReachNlri( - new MpReachNlriBuilder().setAfi(type.getAfi()).setSafi(type.getSafi()).build()).build()).build()).build(); - } + private static final Logger LOG = LoggerFactory.getLogger(BGPSynchronization.class); + + private static class SyncVariables { + + private boolean upd = false; + private boolean eor = false; + + public void setUpd(final boolean upd) { + this.upd = upd; + } + + public void setEorTrue() { + this.eor = true; + } + + public boolean getEor() { + return this.eor; + } + + public boolean getUpd() { + return this.upd; + } + } + + private final Map syncStorage = Maps.newHashMap(); + + private final BGPSessionListener listener; + + private final BGPSession session; + + public BGPSynchronization(final BGPSession bgpSession, final BGPSessionListener listener, final Set types) { + this.listener = Preconditions.checkNotNull(listener); + this.session = Preconditions.checkNotNull(bgpSession); + + for (final TablesKey type : types) { + this.syncStorage.put(type, new SyncVariables()); + } + } + + /** + * For each received Update message, the upd sync variable needs to be updated to true, for particular AFI/SAFI + * combination. Currently we only assume Unicast SAFI. From the Update message we have to extract the AFI. Each + * Update message can contain BGP Object with one type of AFI. If the object is BGP Link, BGP Node or BGPPrefix + * the AFI is Linkstate. In case of BGPRoute, the AFI depends on the IP Address of the prefix. + * + * @param msg received Update message + */ + public void updReceived(final Update msg) { + TablesKey type = null; + if (msg.getNlri() != null || msg.getWithdrawnRoutes() != null) { + type = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); + } else if (msg.getPathAttributes().getAugmentation(PathAttributes1.class) != null) { + final PathAttributes1 pa = msg.getPathAttributes().getAugmentation(PathAttributes1.class); + if (pa.getMpReachNlri() != null) { + type = new TablesKey(pa.getMpReachNlri().getAfi(), pa.getMpReachNlri().getSafi()); + } + } else if (msg.getPathAttributes().getAugmentation(PathAttributes2.class) != null) { + final PathAttributes2 pa = msg.getPathAttributes().getAugmentation(PathAttributes2.class); + if (pa.getMpUnreachNlri() != null) { + type = new TablesKey(pa.getMpUnreachNlri().getAfi(), pa.getMpUnreachNlri().getSafi()); + } + } + final SyncVariables s = this.syncStorage.get(type); + if (s == null) { + LOG.warn("BGPTableType was not present in open message : {}", type); + return; + } + s.setUpd(true); + } + + /** + * This method is called, when the second KA message is received. It checks each AFI/SAFI sync variables. If they + * are all false, which means, that there was at least one update message followed by one KA, the EOR is sent to + * session. + */ + public void kaReceived() { + for (final Entry entry : this.syncStorage.entrySet()) { + final SyncVariables s = entry.getValue(); + if (!s.getEor()) { + if (!s.getUpd()) { + s.setEorTrue(); + LOG.info("BGP Synchronization finished for table {} ", entry.getKey()); + final Update up = generateEOR(entry.getKey()); + LOG.debug("Sending synchronization message: {}", up); + this.listener.onMessage(this.session, up); + } + s.setUpd(false); + } + } + } + + private Update generateEOR(final TablesKey type) { + if (type.getAfi().equals(Ipv4AddressFamily.class) && type.getSafi().equals(UnicastSubsequentAddressFamily.class)) { + return new UpdateBuilder().build(); + } + return new UpdateBuilder().setPathAttributes( + new PathAttributesBuilder().addAugmentation( + PathAttributes1.class, + new PathAttributes1Builder().setMpReachNlri( + new MpReachNlriBuilder().setAfi(type.getAfi()).setSafi(type.getSafi()).build()).build()).build()).build(); + } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/Ipv4AdjRIBsIn.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/Ipv4AdjRIBsIn.java index 59dbe3b106..3890795017 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/Ipv4AdjRIBsIn.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/Ipv4AdjRIBsIn.java @@ -25,34 +25,34 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib. import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; final class Ipv4AdjRIBsIn extends AbstractAdjRIBsIn { - Ipv4AdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) { - super(trans, rib, key); - } + Ipv4AdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) { + super(trans, rib, key); + } - @Override - public InstanceIdentifier identifierForKey(final InstanceIdentifier basePath, final Ipv4Prefix key) { - return basePath.builder().child(Ipv4Routes.class).child(Ipv4Route.class, new Ipv4RouteKey(key)).toInstance(); - } + @Override + public InstanceIdentifier identifierForKey(final InstanceIdentifier basePath, final Ipv4Prefix key) { + return basePath.builder().child(Ipv4Routes.class).child(Ipv4Route.class, new Ipv4RouteKey(key)).toInstance(); + } - @Override - public void addRoutes(final DataModificationTransaction trans, final Peer peer, final MpReachNlri nlri, - final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributes attributes) { - final RIBEntryData data = new RIBEntryData(attributes) { - @Override - protected Ipv4Route getDataObject(final Ipv4Prefix key, final InstanceIdentifier id) { - return new Ipv4RouteBuilder().setKey(InstanceIdentifier.keyOf(id)).setAttributes(new AttributesBuilder(attributes).build()).build(); - } - }; + @Override + public void addRoutes(final DataModificationTransaction trans, final Peer peer, final MpReachNlri nlri, + final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributes attributes) { + final RIBEntryData data = new RIBEntryData(attributes) { + @Override + protected Ipv4Route getDataObject(final Ipv4Prefix key, final InstanceIdentifier id) { + return new Ipv4RouteBuilder().setKey(InstanceIdentifier.keyOf(id)).setAttributes(new AttributesBuilder(attributes).build()).build(); + } + }; - for (final Ipv4Prefix id : ((DestinationIpv4Case) nlri.getAdvertizedRoutes().getDestinationType()).getDestinationIpv4().getIpv4Prefixes()) { - super.add(trans, peer, id, data); - } - } + for (final Ipv4Prefix id : ((DestinationIpv4Case) nlri.getAdvertizedRoutes().getDestinationType()).getDestinationIpv4().getIpv4Prefixes()) { + super.add(trans, peer, id, data); + } + } - @Override - public void removeRoutes(final DataModificationTransaction trans, final Peer peer, final MpUnreachNlri nlri) { - for (final Ipv4Prefix id : ((DestinationIpv4Case) nlri.getWithdrawnRoutes().getDestinationType()).getDestinationIpv4().getIpv4Prefixes()) { - super.remove(trans, peer, id); - } - } + @Override + public void removeRoutes(final DataModificationTransaction trans, final Peer peer, final MpUnreachNlri nlri) { + for (final Ipv4Prefix id : ((DestinationIpv4Case) nlri.getWithdrawnRoutes().getDestinationType()).getDestinationIpv4().getIpv4Prefixes()) { + super.remove(trans, peer, id); + } + } } \ No newline at end of file diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/Ipv6AdjRIBsIn.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/Ipv6AdjRIBsIn.java index 8408989ba2..e3516458f5 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/Ipv6AdjRIBsIn.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/Ipv6AdjRIBsIn.java @@ -25,34 +25,34 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib. import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; final class Ipv6AdjRIBsIn extends AbstractAdjRIBsIn { - Ipv6AdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) { - super(trans, rib, key); - } + Ipv6AdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) { + super(trans, rib, key); + } - @Override - public InstanceIdentifier identifierForKey(final InstanceIdentifier basePath, final Ipv6Prefix key) { - return basePath.builder().child(Ipv6Routes.class).child(Ipv6Route.class, new Ipv6RouteKey(key)).toInstance(); - } + @Override + public InstanceIdentifier identifierForKey(final InstanceIdentifier basePath, final Ipv6Prefix key) { + return basePath.builder().child(Ipv6Routes.class).child(Ipv6Route.class, new Ipv6RouteKey(key)).toInstance(); + } - @Override - public void addRoutes(final DataModificationTransaction trans, final Peer peer, final MpReachNlri nlri, - final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributes attributes) { - final RIBEntryData data = new RIBEntryData(attributes) { - @Override - protected Ipv6Route getDataObject(final Ipv6Prefix key, final InstanceIdentifier id) { - return new Ipv6RouteBuilder().setKey(InstanceIdentifier.keyOf(id)).setAttributes(new AttributesBuilder(attributes).build()).build(); - } - }; + @Override + public void addRoutes(final DataModificationTransaction trans, final Peer peer, final MpReachNlri nlri, + final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributes attributes) { + final RIBEntryData data = new RIBEntryData(attributes) { + @Override + protected Ipv6Route getDataObject(final Ipv6Prefix key, final InstanceIdentifier id) { + return new Ipv6RouteBuilder().setKey(InstanceIdentifier.keyOf(id)).setAttributes(new AttributesBuilder(attributes).build()).build(); + } + }; - for (final Ipv6Prefix id : ((DestinationIpv6) nlri.getAdvertizedRoutes().getDestinationType()).getIpv6Prefixes()) { - super.add(trans, peer, id, data); - } - } + for (final Ipv6Prefix id : ((DestinationIpv6) nlri.getAdvertizedRoutes().getDestinationType()).getIpv6Prefixes()) { + super.add(trans, peer, id, data); + } + } - @Override - public void removeRoutes(final DataModificationTransaction trans, final Peer peer, final MpUnreachNlri nlri) { - for (final Ipv6Prefix id : ((DestinationIpv6) nlri.getWithdrawnRoutes().getDestinationType()).getIpv6Prefixes()) { - super.remove(trans, peer, id); - } - } + @Override + public void removeRoutes(final DataModificationTransaction trans, final Peer peer, final MpUnreachNlri nlri) { + for (final Ipv6Prefix id : ((DestinationIpv6) nlri.getWithdrawnRoutes().getDestinationType()).getIpv6Prefixes()) { + super.remove(trans, peer, id); + } + } } \ No newline at end of file diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBActivator.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBActivator.java index 06af32c604..c353f7e690 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBActivator.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBActivator.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.rib.impl; +import com.google.common.collect.Lists; + import java.util.List; import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction; @@ -20,24 +22,25 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv6AddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily; -import com.google.common.collect.Lists; - public final class RIBActivator extends AbstractRIBExtensionProviderActivator { - @Override - protected List startRIBExtensionProviderImpl(final RIBExtensionProviderContext context) { - return Lists.newArrayList( - context.registerAdjRIBsInFactory(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class, new AdjRIBsInFactory() { - @Override - public AdjRIBsIn createAdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) { - return new Ipv4AdjRIBsIn(trans, rib, key); - } - }), - context.registerAdjRIBsInFactory(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class, new AdjRIBsInFactory() { - @Override - public AdjRIBsIn createAdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) { - return new Ipv6AdjRIBsIn(trans, rib, key); - } - })); - } + @Override + protected List startRIBExtensionProviderImpl(final RIBExtensionProviderContext context) { + AdjRIBsInFactory adj1 = new AdjRIBsInFactory() { + @Override + public AdjRIBsIn createAdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) { + return new Ipv4AdjRIBsIn(trans, rib, key); + } + }; + + AdjRIBsInFactory adj2 = new AdjRIBsInFactory() { + @Override + public AdjRIBsIn createAdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) { + return new Ipv6AdjRIBsIn(trans, rib, key); + } + }; + return Lists.newArrayList( + context.registerAdjRIBsInFactory(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class, adj1), + context.registerAdjRIBsInFactory(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class, adj2)); + } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java index c2f30392ec..6171ac441a 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java @@ -7,6 +7,14 @@ */ package org.opendaylight.protocol.bgp.rib.impl; +import com.google.common.base.Objects; +import com.google.common.base.Objects.ToStringHelper; +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.JdkFutureAdapters; + import java.util.Collections; import java.util.List; import java.util.concurrent.ExecutionException; @@ -56,237 +64,228 @@ import org.opendaylight.yangtools.yang.common.RpcResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Objects; -import com.google.common.base.Objects.ToStringHelper; -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableList; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.JdkFutureAdapters; - @ThreadSafe public final class RIBImpl extends DefaultRibReference implements AutoCloseable, RIB { - private static final Logger LOG = LoggerFactory.getLogger(RIBImpl.class); - private static final Update EOR = new UpdateBuilder().build(); - private static final TablesKey IPV4_UNICAST_TABLE = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); - private final ReconnectStrategyFactory tcpStrategyFactory; - private final ReconnectStrategyFactory sessionStrategyFactory; - private final BGPDispatcher dispatcher; - private final DataProviderService dps; - private final AsNumber localAs; - private final Ipv4Address bgpIdentifier; - private final List localTables; - private final RIBTables tables; - - public RIBImpl(final RibId ribId, final AsNumber localAs, final Ipv4Address localBgpId, final RIBExtensionConsumerContext extensions, - final BGPDispatcher dispatcher, final ReconnectStrategyFactory tcpStrategyFactory, final ReconnectStrategyFactory sessionStrategyFactory, - final DataProviderService dps, final List localTables) { - super(InstanceIdentifier.builder(BgpRib.class).child(Rib.class, new RibKey(Preconditions.checkNotNull(ribId))).toInstance()); - this.dps = Preconditions.checkNotNull(dps); - this.localAs = Preconditions.checkNotNull(localAs); - this.bgpIdentifier = Preconditions.checkNotNull(localBgpId); - this.dispatcher = Preconditions.checkNotNull(dispatcher); - this.sessionStrategyFactory = Preconditions.checkNotNull(sessionStrategyFactory); - this.tcpStrategyFactory = Preconditions.checkNotNull(tcpStrategyFactory); - this.localTables = ImmutableList.copyOf(localTables); - this.tables = new RIBTables(extensions); - - LOG.debug("Instantiating RIB table {} at {}", ribId, getInstanceIdentifier()); - - final DataModificationTransaction trans = dps.beginTransaction(); - final Object o = trans.readOperationalData(getInstanceIdentifier()); - Preconditions.checkState(o == null, "Data provider conflict detected on object {}", getInstanceIdentifier()); - - trans.putOperationalData( - getInstanceIdentifier(), - new RibBuilder().setKey(new RibKey(ribId)).setId(ribId).setLocRib( - new LocRibBuilder().setTables(Collections. emptyList()).build()).build()); - - for (BgpTableType t : localTables) { - final TablesKey key = new TablesKey(t.getAfi(), t.getSafi()); - if (this.tables.create(trans, this, key) == null) { - LOG.debug("Did not create local table for unhandled table type {}", t); - } - } - - Futures.addCallback(JdkFutureAdapters.listenInPoolThread(trans.commit()), new FutureCallback>() { - @Override - public void onSuccess(final RpcResult result) { - LOG.trace("Change committed successfully"); - } - - @Override - public void onFailure(final Throwable t) { - LOG.error("Failed to initiate RIB {}", getInstanceIdentifier()); - } - }); - } - - synchronized void initTables(final byte[] remoteBgpId) { - } - - @Override - public synchronized void updateTables(final Peer peer, final Update message) { - final DataModificationTransaction trans = this.dps.beginTransaction(); - - if (!EOR.equals(message)) { - final WithdrawnRoutes wr = message.getWithdrawnRoutes(); - if (wr != null) { - final AdjRIBsIn ari = this.tables.get(IPV4_UNICAST_TABLE); - if (ari != null) { - ari.removeRoutes( - trans, - peer, - new MpUnreachNlriBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).setWithdrawnRoutes( - new WithdrawnRoutesBuilder().setDestinationType( - new DestinationIpv4CaseBuilder().setDestinationIpv4( - new DestinationIpv4Builder().setIpv4Prefixes(wr.getWithdrawnRoutes()).build()).build()).build()).build()); - } else { - LOG.debug("Not removing objects from unhandled IPv4 Unicast"); - } - } - - final PathAttributes attrs = message.getPathAttributes(); - if (attrs != null) { - final PathAttributes2 mpu = attrs.getAugmentation(PathAttributes2.class); - if (mpu != null) { - final MpUnreachNlri nlri = mpu.getMpUnreachNlri(); - - final AdjRIBsIn ari = this.tables.get(new TablesKey(nlri.getAfi(), nlri.getSafi())); - if (ari != null) { - ari.removeRoutes(trans, peer, nlri); - } else { - LOG.debug("Not removing objects from unhandled NLRI {}", nlri); - } - } - } - - final Nlri ar = message.getNlri(); - if (ar != null) { - final AdjRIBsIn ari = this.tables.get(IPV4_UNICAST_TABLE); - if (ari != null) { - final MpReachNlriBuilder b = new MpReachNlriBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).setAdvertizedRoutes( - new AdvertizedRoutesBuilder().setDestinationType( - new DestinationIpv4CaseBuilder().setDestinationIpv4( - new DestinationIpv4Builder().setIpv4Prefixes(ar.getNlri()).build()).build()).build()); - if (attrs != null) { - b.setCNextHop(attrs.getCNextHop()); - } - - ari.addRoutes(trans, peer, b.build(), attrs); - } else { - LOG.debug("Not adding objects from unhandled IPv4 Unicast"); - } - } - - if (attrs != null) { - final PathAttributes1 mpr = attrs.getAugmentation(PathAttributes1.class); - if (mpr != null) { - final MpReachNlri nlri = mpr.getMpReachNlri(); - - final AdjRIBsIn ari = this.tables.get(new TablesKey(nlri.getAfi(), nlri.getSafi())); - if (ari != null) { - if (message.equals(ari.endOfRib())) { - ari.markUptodate(trans, peer); - } else { - ari.addRoutes(trans, peer, nlri, attrs); - } - } else { - LOG.debug("Not adding objects from unhandled NLRI {}", nlri); - } - } - } - } else { - final AdjRIBsIn ari = this.tables.get(IPV4_UNICAST_TABLE); - if (ari != null) { - ari.markUptodate(trans, peer); - } else { - LOG.debug("End-of-RIB for IPv4 Unicast ignored"); - } - } - - Futures.addCallback(JdkFutureAdapters.listenInPoolThread(trans.commit()), new FutureCallback>() { - @Override - public void onSuccess(final RpcResult result) { - LOG.debug("RIB modification successfully committed."); - } - - @Override - public void onFailure(final Throwable t) { - LOG.error("Failed to commit RIB modification", t); - } - }); - } - - @Override - public synchronized void clearTable(final Peer peer, final TablesKey key) { - final AdjRIBsIn ari = this.tables.get(key); - if (ari != null) { - final DataModificationTransaction trans = this.dps.beginTransaction(); - ari.clear(trans, peer); - - Futures.addCallback(JdkFutureAdapters.listenInPoolThread(trans.commit()), new FutureCallback>() { - @Override - public void onSuccess(final RpcResult result) { - // Nothing to do - } - - @Override - public void onFailure(final Throwable t) { - LOG.error("Failed to commit RIB modification", t); - } - }); - } - } - - @Override - public String toString() { - return addToStringAttributes(Objects.toStringHelper(this)).toString(); - } - - protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) { - return toStringHelper; - } - - @Override - public void close() throws InterruptedException, ExecutionException { - final DataModificationTransaction t = this.dps.beginTransaction(); - t.removeOperationalData(getInstanceIdentifier()); - t.commit().get(); - } - - @Override - public AsNumber getLocalAs() { - return this.localAs; - } - - @Override - public Ipv4Address getBgpIdentifier() { - return this.bgpIdentifier; - } - - @Override - public List getLocalTables() { - return this.localTables; - } - - @Override - public ReconnectStrategyFactory getTcpStrategyFactory() { - return this.tcpStrategyFactory; - } - - @Override - public ReconnectStrategyFactory getSessionStrategyFactory() { - return this.sessionStrategyFactory; - } - - @Override - public BGPDispatcher getDispatcher() { - return this.dispatcher; - } - - @Override - public void initTable(final Peer bgpPeer, final TablesKey key) { - // FIXME: BUG-196: support graceful restart - } + private static final Logger LOG = LoggerFactory.getLogger(RIBImpl.class); + private static final Update EOR = new UpdateBuilder().build(); + private static final TablesKey IPV4_UNICAST_TABLE = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); + private final ReconnectStrategyFactory tcpStrategyFactory; + private final ReconnectStrategyFactory sessionStrategyFactory; + private final BGPDispatcher dispatcher; + private final DataProviderService dps; + private final AsNumber localAs; + private final Ipv4Address bgpIdentifier; + private final List localTables; + private final RIBTables tables; + + public RIBImpl(final RibId ribId, final AsNumber localAs, final Ipv4Address localBgpId, final RIBExtensionConsumerContext extensions, + final BGPDispatcher dispatcher, final ReconnectStrategyFactory tcpStrategyFactory, + final ReconnectStrategyFactory sessionStrategyFactory, final DataProviderService dps, final List localTables) { + super(InstanceIdentifier.builder(BgpRib.class).child(Rib.class, new RibKey(Preconditions.checkNotNull(ribId))).toInstance()); + this.dps = Preconditions.checkNotNull(dps); + this.localAs = Preconditions.checkNotNull(localAs); + this.bgpIdentifier = Preconditions.checkNotNull(localBgpId); + this.dispatcher = Preconditions.checkNotNull(dispatcher); + this.sessionStrategyFactory = Preconditions.checkNotNull(sessionStrategyFactory); + this.tcpStrategyFactory = Preconditions.checkNotNull(tcpStrategyFactory); + this.localTables = ImmutableList.copyOf(localTables); + this.tables = new RIBTables(extensions); + + LOG.debug("Instantiating RIB table {} at {}", ribId, getInstanceIdentifier()); + + final DataModificationTransaction trans = dps.beginTransaction(); + final Object o = trans.readOperationalData(getInstanceIdentifier()); + Preconditions.checkState(o == null, "Data provider conflict detected on object {}", getInstanceIdentifier()); + + trans.putOperationalData(getInstanceIdentifier(), new RibBuilder().setKey(new RibKey(ribId)).setId(ribId).setLocRib( + new LocRibBuilder().setTables(Collections. emptyList()).build()).build()); + + for (BgpTableType t : localTables) { + final TablesKey key = new TablesKey(t.getAfi(), t.getSafi()); + if (this.tables.create(trans, this, key) == null) { + LOG.debug("Did not create local table for unhandled table type {}", t); + } + } + + Futures.addCallback(JdkFutureAdapters.listenInPoolThread(trans.commit()), new FutureCallback>() { + @Override + public void onSuccess(final RpcResult result) { + LOG.trace("Change committed successfully"); + } + + @Override + public void onFailure(final Throwable t) { + LOG.error("Failed to initiate RIB {}", getInstanceIdentifier()); + } + }); + } + + synchronized void initTables(final byte[] remoteBgpId) { + } + + @Override + public synchronized void updateTables(final Peer peer, final Update message) { + final DataModificationTransaction trans = this.dps.beginTransaction(); + + if (!EOR.equals(message)) { + final WithdrawnRoutes wr = message.getWithdrawnRoutes(); + if (wr != null) { + final AdjRIBsIn ari = this.tables.get(IPV4_UNICAST_TABLE); + if (ari != null) { + ari.removeRoutes( + trans, + peer, + new MpUnreachNlriBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class).setWithdrawnRoutes( + new WithdrawnRoutesBuilder().setDestinationType( + new DestinationIpv4CaseBuilder().setDestinationIpv4( + new DestinationIpv4Builder().setIpv4Prefixes(wr.getWithdrawnRoutes()).build()).build()).build()).build()); + } else { + LOG.debug("Not removing objects from unhandled IPv4 Unicast"); + } + } + + final PathAttributes attrs = message.getPathAttributes(); + if (attrs != null) { + final PathAttributes2 mpu = attrs.getAugmentation(PathAttributes2.class); + if (mpu != null) { + final MpUnreachNlri nlri = mpu.getMpUnreachNlri(); + + final AdjRIBsIn ari = this.tables.get(new TablesKey(nlri.getAfi(), nlri.getSafi())); + if (ari != null) { + ari.removeRoutes(trans, peer, nlri); + } else { + LOG.debug("Not removing objects from unhandled NLRI {}", nlri); + } + } + } + + final Nlri ar = message.getNlri(); + if (ar != null) { + final AdjRIBsIn ari = this.tables.get(IPV4_UNICAST_TABLE); + if (ari != null) { + final MpReachNlriBuilder b = new MpReachNlriBuilder().setAfi(Ipv4AddressFamily.class).setSafi( + UnicastSubsequentAddressFamily.class).setAdvertizedRoutes( + new AdvertizedRoutesBuilder().setDestinationType( + new DestinationIpv4CaseBuilder().setDestinationIpv4( + new DestinationIpv4Builder().setIpv4Prefixes(ar.getNlri()).build()).build()).build()); + if (attrs != null) { + b.setCNextHop(attrs.getCNextHop()); + } + + ari.addRoutes(trans, peer, b.build(), attrs); + } else { + LOG.debug("Not adding objects from unhandled IPv4 Unicast"); + } + } + + if (attrs != null) { + final PathAttributes1 mpr = attrs.getAugmentation(PathAttributes1.class); + if (mpr != null) { + final MpReachNlri nlri = mpr.getMpReachNlri(); + + final AdjRIBsIn ari = this.tables.get(new TablesKey(nlri.getAfi(), nlri.getSafi())); + if (ari != null) { + if (message.equals(ari.endOfRib())) { + ari.markUptodate(trans, peer); + } else { + ari.addRoutes(trans, peer, nlri, attrs); + } + } else { + LOG.debug("Not adding objects from unhandled NLRI {}", nlri); + } + } + } + } else { + final AdjRIBsIn ari = this.tables.get(IPV4_UNICAST_TABLE); + if (ari != null) { + ari.markUptodate(trans, peer); + } else { + LOG.debug("End-of-RIB for IPv4 Unicast ignored"); + } + } + + Futures.addCallback(JdkFutureAdapters.listenInPoolThread(trans.commit()), new FutureCallback>() { + @Override + public void onSuccess(final RpcResult result) { + LOG.debug("RIB modification successfully committed."); + } + + @Override + public void onFailure(final Throwable t) { + LOG.error("Failed to commit RIB modification", t); + } + }); + } + + @Override + public synchronized void clearTable(final Peer peer, final TablesKey key) { + final AdjRIBsIn ari = this.tables.get(key); + if (ari != null) { + final DataModificationTransaction trans = this.dps.beginTransaction(); + ari.clear(trans, peer); + + Futures.addCallback(JdkFutureAdapters.listenInPoolThread(trans.commit()), new FutureCallback>() { + @Override + public void onSuccess(final RpcResult result) { + // Nothing to do + } + + @Override + public void onFailure(final Throwable t) { + LOG.error("Failed to commit RIB modification", t); + } + }); + } + } + + @Override + public String toString() { + return addToStringAttributes(Objects.toStringHelper(this)).toString(); + } + + protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) { + return toStringHelper; + } + + @Override + public void close() throws InterruptedException, ExecutionException { + final DataModificationTransaction t = this.dps.beginTransaction(); + t.removeOperationalData(getInstanceIdentifier()); + t.commit().get(); + } + + @Override + public AsNumber getLocalAs() { + return this.localAs; + } + + @Override + public Ipv4Address getBgpIdentifier() { + return this.bgpIdentifier; + } + + @Override + public List getLocalTables() { + return this.localTables; + } + + @Override + public ReconnectStrategyFactory getTcpStrategyFactory() { + return this.tcpStrategyFactory; + } + + @Override + public ReconnectStrategyFactory getSessionStrategyFactory() { + return this.sessionStrategyFactory; + } + + @Override + public BGPDispatcher getDispatcher() { + return this.dispatcher; + } + + @Override + public void initTable(final Peer bgpPeer, final TablesKey key) { + // FIXME: BUG-196: support graceful restart + } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBTables.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBTables.java index e4ad31575c..d5db1cf9aa 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBTables.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBTables.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.rib.impl; +import com.google.common.base.Preconditions; + import java.util.HashMap; import java.util.Map; @@ -19,41 +21,39 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib. import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; - final class RIBTables { - private static final Logger LOG = LoggerFactory.getLogger(RIBTables.class); - - private final Map tables = new HashMap<>(); - private final RIBExtensionConsumerContext registry; - - RIBTables(final RIBExtensionConsumerContext extensions) { - this.registry = Preconditions.checkNotNull(extensions); - } - - public synchronized AdjRIBsIn get(final TablesKey key) { - LOG.debug("Looking for key {} in tables {}", key, this.tables); - final AdjRIBsIn ret = this.tables.get(key); - LOG.trace("Key found {}", ret); - return ret; - } - - public synchronized AdjRIBsIn create(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) { - if (this.tables.containsKey(key)) { - LOG.warn("Duplicate create request for key {}", key); - return this.tables.get(key); - } - - final AdjRIBsInFactory f = this.registry.getAdjRIBsInFactory(key.getAfi(), key.getSafi()); - if (f == null) { - LOG.debug("RIBsInFactory not found for key {}, returning null", key); - return null; - } - - final AdjRIBsIn table = Preconditions.checkNotNull(f.createAdjRIBsIn(trans, rib, key)); - LOG.debug("Table {} created for key {}", table, key); - this.tables.put(key, table); - return table; - } + private static final Logger LOG = LoggerFactory.getLogger(RIBTables.class); + + private final Map tables = new HashMap<>(); + private final RIBExtensionConsumerContext registry; + + RIBTables(final RIBExtensionConsumerContext extensions) { + this.registry = Preconditions.checkNotNull(extensions); + } + + public synchronized AdjRIBsIn get(final TablesKey key) { + LOG.debug("Looking for key {} in tables {}", key, this.tables); + final AdjRIBsIn ret = this.tables.get(key); + LOG.trace("Key found {}", ret); + return ret; + } + + public synchronized AdjRIBsIn create(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) { + if (this.tables.containsKey(key)) { + LOG.warn("Duplicate create request for key {}", key); + return this.tables.get(key); + } + + final AdjRIBsInFactory f = this.registry.getAdjRIBsInFactory(key.getAfi(), key.getSafi()); + if (f == null) { + LOG.debug("RIBsInFactory not found for key {}, returning null", key); + return null; + } + + final AdjRIBsIn table = Preconditions.checkNotNull(f.createAdjRIBsIn(trans, rib, key)); + LOG.debug("Table {} created for key {}", table, key); + this.tables.put(key, table); + return table; + } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/BGPDispatcher.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/BGPDispatcher.java index 320698878a..e9f2dad7c3 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/BGPDispatcher.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/BGPDispatcher.java @@ -23,20 +23,22 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types. */ public interface BGPDispatcher { - /** - * Creates BGP client. - * - * @param address Peer address - * @param preferences connection attributes required for connection - * @param listener BGP message listener - * @return Future promising a client session - */ - Future createClient(InetSocketAddress address, BGPSessionPreferences preferences, AsNumber remoteAs, - BGPSessionListener listener, ReconnectStrategy strategy); + /** + * Creates BGP client. + * + * @param address Peer address + * @param preferences connection attributes required for connection + * @param listener BGP message listener + * @return Future promising a client session + */ + Future createClient(InetSocketAddress address, BGPSessionPreferences preferences, AsNumber remoteAs, + BGPSessionListener listener, ReconnectStrategy strategy); - Future createReconnectingClient(InetSocketAddress address, BGPSessionPreferences preferences, AsNumber remoteAs, - BGPSessionListener listener, ReconnectStrategyFactory connectStrategyFactory, ReconnectStrategyFactory reestablishStrategyFactory); + Future createReconnectingClient(InetSocketAddress address, BGPSessionPreferences preferences, AsNumber remoteAs, + BGPSessionListener listener, ReconnectStrategyFactory connectStrategyFactory, + ReconnectStrategyFactory reestablishStrategyFactory); - Future createReconnectingClient(InetSocketAddress address, BGPSessionPreferences preferences, AsNumber remoteAs, - BGPSessionListener listener, ReconnectStrategyFactory connectStrategyFactory, ReconnectStrategyFactory reestablishStrategyFactory, KeyMapping keys); + Future createReconnectingClient(InetSocketAddress address, BGPSessionPreferences preferences, AsNumber remoteAs, + BGPSessionListener listener, ReconnectStrategyFactory connectStrategyFactory, + ReconnectStrategyFactory reestablishStrategyFactory, KeyMapping keys); } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/BGPSessionPreferences.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/BGPSessionPreferences.java index 4a240f28eb..eed321883c 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/BGPSessionPreferences.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/BGPSessionPreferences.java @@ -18,57 +18,57 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mess */ public final class BGPSessionPreferences { - private final AsNumber as; + private final AsNumber as; - private final int hold; + private final int hold; - private final Ipv4Address bgpId; + private final Ipv4Address bgpId; - private final List params; + private final List params; - /** - * Creates a new DTO for Open message. - * - * @param as local AS number - * @param hold preferred hold timer value, in seconds - * @param bgpId local BGP Identifier - * @param param advertized parameters - */ - public BGPSessionPreferences(final AsNumber as, final int hold, final Ipv4Address bgpId, final List params) { - this.as = as; - this.hold = hold; - this.bgpId = bgpId; - this.params = params; - } + /** + * Creates a new DTO for Open message. + * + * @param as local AS number + * @param hold preferred hold timer value, in seconds + * @param bgpId local BGP Identifier + * @param param advertized parameters + */ + public BGPSessionPreferences(final AsNumber as, final int hold, final Ipv4Address bgpId, final List params) { + this.as = as; + this.hold = hold; + this.bgpId = bgpId; + this.params = params; + } - /** - * Returns my AS number. - * - * @return AS number - */ - public AsNumber getMyAs() { - return this.as; - } + /** + * Returns my AS number. + * + * @return AS number + */ + public AsNumber getMyAs() { + return this.as; + } - /** - * Returns initial value of HoldTimer. - * - * @return initial value of HoldTimer - */ - public int getHoldTime() { - return this.hold; - } + /** + * Returns initial value of HoldTimer. + * + * @return initial value of HoldTimer + */ + public int getHoldTime() { + return this.hold; + } - /** - * Returns my BGP Identifier. - * - * @return BGP identifier - */ - public Ipv4Address getBgpId() { - return this.bgpId; - } + /** + * Returns my BGP Identifier. + * + * @return BGP identifier + */ + public Ipv4Address getBgpId() { + return this.bgpId; + } - public List getParams() { - return this.params; - } + public List getParams() { + return this.params; + } } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/BGPSessionProposal.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/BGPSessionProposal.java index aea5cbda4f..2b61bf4676 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/BGPSessionProposal.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/BGPSessionProposal.java @@ -11,11 +11,11 @@ package org.opendaylight.protocol.bgp.rib.impl.spi; * Interface that provides the initial acceptable session characteristics with which the session should be started. */ public interface BGPSessionProposal { - /** - * Returns BGPSessionPreferences for this IP address. - * - * @param address serves as constraint, the implementation can also take time into consideration - * @return BGPSessionPreferences with acceptable session characteristics - */ - BGPSessionPreferences getProposal(); + /** + * Returns BGPSessionPreferences for this IP address. + * + * @param address serves as constraint, the implementation can also take time into consideration + * @return BGPSessionPreferences with acceptable session characteristics + */ + BGPSessionPreferences getProposal(); } diff --git a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIB.java b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIB.java index 96ac30dfcb..c60228f324 100644 --- a/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIB.java +++ b/bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/spi/RIB.java @@ -21,15 +21,21 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib. * Internal reference to a RIB instance. */ public interface RIB { - AsNumber getLocalAs(); - Ipv4Address getBgpIdentifier(); - List getLocalTables(); + AsNumber getLocalAs(); - void initTable(Peer bgpPeer, TablesKey key); - void clearTable(Peer bgpPeer, TablesKey key); - void updateTables(Peer bgpPeer, Update message); + Ipv4Address getBgpIdentifier(); - BGPDispatcher getDispatcher(); - ReconnectStrategyFactory getTcpStrategyFactory(); - ReconnectStrategyFactory getSessionStrategyFactory(); + List getLocalTables(); + + void initTable(Peer bgpPeer, TablesKey key); + + void clearTable(Peer bgpPeer, TablesKey key); + + void updateTables(Peer bgpPeer, Update message); + + BGPDispatcher getDispatcher(); + + ReconnectStrategyFactory getTcpStrategyFactory(); + + ReconnectStrategyFactory getSessionStrategyFactory(); } diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ApiTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ApiTest.java index 9df8a31750..5f2721c0bb 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ApiTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/ApiTest.java @@ -16,11 +16,11 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types. public class ApiTest { - @Test - public void testBGPSessionPreferences() { - final BGPSessionPreferences sp = new BGPSessionPreferences(new AsNumber(58L), (short) 5, null, null); - assertNull(sp.getBgpId()); - assertEquals((short) 5, sp.getHoldTime()); - assertEquals(new AsNumber(58L), sp.getMyAs()); - } + @Test + public void testBGPSessionPreferences() { + final BGPSessionPreferences sp = new BGPSessionPreferences(new AsNumber(58L), (short) 5, null, null); + assertNull(sp.getBgpId()); + assertEquals((short) 5, sp.getHoldTime()); + assertEquals(new AsNumber(58L), sp.getMyAs()); + } } diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/BestPathSelectionTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/BestPathSelectionTest.java index 259de92733..63cc2dcae6 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/BestPathSelectionTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/BestPathSelectionTest.java @@ -9,6 +9,8 @@ package org.opendaylight.protocol.bgp.rib.impl; import static org.junit.Assert.assertTrue; +import com.google.common.collect.Lists; + import java.util.ArrayList; import java.util.List; @@ -33,89 +35,87 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.as.path.segment.c.segment.a.list._case.a.list.AsSequenceBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.as.path.segment.c.segment.a.set._case.ASetBuilder; -import com.google.common.collect.Lists; - /** * @see BGP Best Path * Selection */ public class BestPathSelectionTest { - private final BGPObjectComparator comparator = new BGPObjectComparator(new AsNumber(40L), new Ipv4Address("192.150.20.38"), new Ipv4Address("192.150.20.38")); - - private PathAttributes attr1; - private PathAttributes attr2; - private PathAttributes attr3; - private PathAttributes attr4; - private PathAttributes attr5; - private PathAttributes attr6; - private PathAttributes attr7; - - @Before - public void setUp() { - final AsPathBuilder asBuilder1 = new AsPathBuilder(); - final AsPathBuilder asBuilder2 = new AsPathBuilder(); - List segs = new ArrayList<>(); - final List ases = Lists.newArrayList(new AsNumber(100L), new AsNumber(30L)); - final List seqs = Lists.newArrayList(new AsSequenceBuilder().setAs(new AsNumber(50L)).build()); - segs.add(new SegmentsBuilder().setCSegment(new AListCaseBuilder().setAList(new AListBuilder().setAsSequence(seqs).build()).build()).build()); - asBuilder1.setSegments(segs); - segs = new ArrayList<>(); - segs.add(new SegmentsBuilder().setCSegment(new AListCaseBuilder().setAList(new AListBuilder().setAsSequence(seqs).build()).build()).build()); - segs.add(new SegmentsBuilder().setCSegment(new ASetCaseBuilder().setASet(new ASetBuilder().setAsSet(ases).build()).build()).build()); - asBuilder2.setSegments(segs); - - final List clusters = new ArrayList<>(); - clusters.add(new ClusterIdentifier(new Ipv4Address("0.0.0.0"))); - clusters.add(new ClusterIdentifier(new Ipv4Address("0.0.0.0"))); - - final PathAttributesBuilder builder = new PathAttributesBuilder(); - builder.setLocalPref(new LocalPrefBuilder().setPref(100L).build()); - this.attr1 = builder.build(); - builder.setLocalPref(new LocalPrefBuilder().setPref(230L).build()); - builder.setAsPath(asBuilder2.build()); - this.attr2 = builder.build(); - builder.setAsPath(asBuilder1.build()); - builder.setOrigin(new OriginBuilder().setValue(BgpOrigin.Incomplete).build()); - this.attr3 = builder.build(); - builder.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build()); - builder.setMultiExitDisc(new MultiExitDiscBuilder().setMed(15L).build()); - this.attr4 = builder.build(); - builder.setMultiExitDisc(new MultiExitDiscBuilder().setMed(12L).build()); - this.attr5 = builder.build(); - builder.setAsPath(new AsPathBuilder().setSegments(new ArrayList()).build()); - builder.setClusterId(new ArrayList()); - this.attr6 = builder.build(); - builder.setClusterId(clusters); - this.attr7 = builder.build(); - } - - @Test - public void testCompare() { - assertTrue(this.comparator.compare(this.attr1, this.attr2) < 0); - assertTrue(this.comparator.compare(this.attr2, this.attr1) > 0); - - assertTrue(this.comparator.compare(this.attr2, this.attr3) < 0); - assertTrue(this.comparator.compare(this.attr3, this.attr2) > 0); - - assertTrue(this.comparator.compare(this.attr3, this.attr4) < 0); - assertTrue(this.comparator.compare(this.attr4, this.attr3) > 0); - - assertTrue(this.comparator.compare(this.attr4, this.attr5) < 0); - assertTrue(this.comparator.compare(this.attr5, this.attr4) > 0); - - assertTrue(this.comparator.compare(this.attr5, this.attr6) < 0); - assertTrue(this.comparator.compare(this.attr6, this.attr5) > 0); - - assertTrue(this.comparator.compare(this.attr6, this.attr7) < 0); - assertTrue(this.comparator.compare(this.attr7, this.attr6) > 0); - } - - @Test - public void testByteCompare() { - assertTrue(BGPObjectComparator.compareByteArrays(new byte[] { (byte) 192, (byte) 150, 20, 38 }, new byte[] { (byte) 192, - (byte) 168, 25, 1 }) < 0); - assertTrue(BGPObjectComparator.compareByteArrays(new byte[] { (byte) 192, (byte) 168, 25, 1 }, new byte[] { (byte) 192, (byte) 150, - 20, 38 }) > 0); - } + private final BGPObjectComparator comparator = new BGPObjectComparator(new AsNumber(40L), new Ipv4Address("192.150.20.38"), new Ipv4Address("192.150.20.38")); + + private PathAttributes attr1; + private PathAttributes attr2; + private PathAttributes attr3; + private PathAttributes attr4; + private PathAttributes attr5; + private PathAttributes attr6; + private PathAttributes attr7; + + @Before + public void setUp() { + final AsPathBuilder asBuilder1 = new AsPathBuilder(); + final AsPathBuilder asBuilder2 = new AsPathBuilder(); + List segs = new ArrayList<>(); + final List ases = Lists.newArrayList(new AsNumber(100L), new AsNumber(30L)); + final List seqs = Lists.newArrayList(new AsSequenceBuilder().setAs(new AsNumber(50L)).build()); + segs.add(new SegmentsBuilder().setCSegment(new AListCaseBuilder().setAList(new AListBuilder().setAsSequence(seqs).build()).build()).build()); + asBuilder1.setSegments(segs); + segs = new ArrayList<>(); + segs.add(new SegmentsBuilder().setCSegment(new AListCaseBuilder().setAList(new AListBuilder().setAsSequence(seqs).build()).build()).build()); + segs.add(new SegmentsBuilder().setCSegment(new ASetCaseBuilder().setASet(new ASetBuilder().setAsSet(ases).build()).build()).build()); + asBuilder2.setSegments(segs); + + final List clusters = new ArrayList<>(); + clusters.add(new ClusterIdentifier(new Ipv4Address("0.0.0.0"))); + clusters.add(new ClusterIdentifier(new Ipv4Address("0.0.0.0"))); + + final PathAttributesBuilder builder = new PathAttributesBuilder(); + builder.setLocalPref(new LocalPrefBuilder().setPref(100L).build()); + this.attr1 = builder.build(); + builder.setLocalPref(new LocalPrefBuilder().setPref(230L).build()); + builder.setAsPath(asBuilder2.build()); + this.attr2 = builder.build(); + builder.setAsPath(asBuilder1.build()); + builder.setOrigin(new OriginBuilder().setValue(BgpOrigin.Incomplete).build()); + this.attr3 = builder.build(); + builder.setOrigin(new OriginBuilder().setValue(BgpOrigin.Egp).build()); + builder.setMultiExitDisc(new MultiExitDiscBuilder().setMed(15L).build()); + this.attr4 = builder.build(); + builder.setMultiExitDisc(new MultiExitDiscBuilder().setMed(12L).build()); + this.attr5 = builder.build(); + builder.setAsPath(new AsPathBuilder().setSegments(new ArrayList()).build()); + builder.setClusterId(new ArrayList()); + this.attr6 = builder.build(); + builder.setClusterId(clusters); + this.attr7 = builder.build(); + } + + @Test + public void testCompare() { + assertTrue(this.comparator.compare(this.attr1, this.attr2) < 0); + assertTrue(this.comparator.compare(this.attr2, this.attr1) > 0); + + assertTrue(this.comparator.compare(this.attr2, this.attr3) < 0); + assertTrue(this.comparator.compare(this.attr3, this.attr2) > 0); + + assertTrue(this.comparator.compare(this.attr3, this.attr4) < 0); + assertTrue(this.comparator.compare(this.attr4, this.attr3) > 0); + + assertTrue(this.comparator.compare(this.attr4, this.attr5) < 0); + assertTrue(this.comparator.compare(this.attr5, this.attr4) > 0); + + assertTrue(this.comparator.compare(this.attr5, this.attr6) < 0); + assertTrue(this.comparator.compare(this.attr6, this.attr5) > 0); + + assertTrue(this.comparator.compare(this.attr6, this.attr7) < 0); + assertTrue(this.comparator.compare(this.attr7, this.attr6) > 0); + } + + @Test + public void testByteCompare() { + assertTrue(BGPObjectComparator.compareByteArrays(new byte[] { (byte) 192, (byte) 150, 20, 38 }, new byte[] { (byte) 192, + (byte) 168, 25, 1 }) < 0); + assertTrue(BGPObjectComparator.compareByteArrays(new byte[] { (byte) 192, (byte) 168, 25, 1 }, new byte[] { (byte) 192, (byte) 150, + 20, 38 }) > 0); + } } diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/FSMTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/FSMTest.java index ae5f2f8a7b..676a3a023f 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/FSMTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/FSMTest.java @@ -13,6 +13,9 @@ import static org.mockito.Matchers.any; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; + +import com.google.common.collect.Lists; + import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandler; @@ -53,116 +56,113 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily; import org.opendaylight.yangtools.yang.binding.Notification; -import com.google.common.collect.Lists; - public class FSMTest { - private BGPSessionNegotiator clientSession; - - @Mock - private Channel speakerListener; - - @Mock - private ChannelPipeline pipeline; - - private final BgpTableType ipv4tt = new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); - - private final BgpTableType linkstatett = new BgpTableTypeImpl(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class); - - private final List receivedMsgs = Lists.newArrayList(); - - private Open classicOpen; - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - final List tlvs = Lists.newArrayList(); - - tlvs.add(new BgpParametersBuilder().setCParameters( - new MultiprotocolCaseBuilder().setMultiprotocolCapability( - new MultiprotocolCapabilityBuilder().setAfi(this.ipv4tt.getAfi()).setSafi(this.ipv4tt.getSafi()).build()).build()).build()); - tlvs.add(new BgpParametersBuilder().setCParameters( - new MultiprotocolCaseBuilder().setMultiprotocolCapability( - new MultiprotocolCapabilityBuilder().setAfi(this.linkstatett.getAfi()).setSafi(this.linkstatett.getSafi()).build()).build()).build()); - final BGPSessionPreferences prefs = new BGPSessionPreferences(new AsNumber(30L), (short) 3, null, tlvs); - - final ChannelFuture f = mock(ChannelFuture.class); - doReturn(null).when(f).addListener(any(GenericFutureListener.class)); - this.clientSession = new BGPSessionNegotiator(new HashedWheelTimer(), new DefaultPromise(GlobalEventExecutor.INSTANCE), - this.speakerListener, prefs, new AsNumber(30L), new SimpleSessionListener()); - doAnswer(new Answer() { - @Override - public Object answer(final InvocationOnMock invocation) { - final Object[] args = invocation.getArguments(); - FSMTest.this.receivedMsgs.add((Notification) args[0]); - return f; - } - }).when(this.speakerListener).writeAndFlush(any(Notification.class)); - doReturn("TestingChannel").when(this.speakerListener).toString(); - doReturn(this.pipeline).when(this.speakerListener).pipeline(); - doReturn(this.pipeline).when(this.pipeline).replace(any(ChannelHandler.class), any(String.class), any(ChannelHandler.class)); - doReturn(mock(ChannelFuture.class)).when(this.speakerListener).close(); - this.classicOpen = new OpenBuilder().setMyAsNumber(30).setHoldTimer(3).setVersion(new ProtocolVersion((short) 4)).setBgpParameters( - tlvs).build(); - } - - @Test - public void testAccSessionChar() throws InterruptedException { - this.clientSession.channelActive(null); - assertEquals(1, this.receivedMsgs.size()); - assertTrue(this.receivedMsgs.get(0) instanceof Open); - this.clientSession.handleMessage(this.classicOpen); - assertEquals(2, this.receivedMsgs.size()); - assertTrue(this.receivedMsgs.get(1) instanceof Keepalive); - this.clientSession.handleMessage(new KeepaliveBuilder().build()); - assertEquals(this.clientSession.getState(), BGPSessionNegotiator.State.Finished); - Thread.sleep(1000); - Thread.sleep(100); - assertEquals(3, this.receivedMsgs.size()); - assertTrue(this.receivedMsgs.get(2) instanceof Keepalive); // test of keepalive timer - } - - @Test - public void testNotAccChars() throws InterruptedException { - this.clientSession.channelActive(null); - assertEquals(1, this.receivedMsgs.size()); - assertTrue(this.receivedMsgs.get(0) instanceof Open); - this.clientSession.handleMessage(new OpenBuilder().setMyAsNumber(30).setHoldTimer(1).setVersion(new ProtocolVersion((short) 4)).build()); - assertEquals(2, this.receivedMsgs.size()); - assertTrue(this.receivedMsgs.get(1) instanceof Notify); - final Notification m = this.receivedMsgs.get(this.receivedMsgs.size() - 1); - assertEquals(BGPError.UNSPECIFIC_OPEN_ERROR, BGPError.forValue(((Notify) m).getErrorCode(), ((Notify) m).getErrorSubcode())); - } - - @Test - @Ignore - // long duration - public void testNoOpen() throws InterruptedException { - this.clientSession.channelActive(null); - assertEquals(1, this.receivedMsgs.size()); - assertTrue(this.receivedMsgs.get(0) instanceof Open); - Thread.sleep(BGPSessionNegotiator.INITIAL_HOLDTIMER * 1000 * 60); - Thread.sleep(100); - final Notification m = this.receivedMsgs.get(this.receivedMsgs.size() - 1); - assertEquals(BGPError.HOLD_TIMER_EXPIRED, BGPError.forValue(((Notify) m).getErrorCode(), ((Notify) m).getErrorSubcode())); - } - - @Test - public void sendNotification() { - this.clientSession.channelActive(null); - this.clientSession.handleMessage(this.classicOpen); - this.clientSession.handleMessage(new KeepaliveBuilder().build()); - assertEquals(this.clientSession.getState(), BGPSessionNegotiator.State.Finished); - this.clientSession.handleMessage(new OpenBuilder().setMyAsNumber(30).setHoldTimer(3).setVersion(new ProtocolVersion((short) 4)).build()); - assertEquals(3, this.receivedMsgs.size()); - assertTrue(this.receivedMsgs.get(2) instanceof Notify); - final Notification m = this.receivedMsgs.get(2); - assertEquals(BGPError.FSM_ERROR.getCode(), ((Notify) m).getErrorCode().shortValue()); - assertEquals(BGPError.FSM_ERROR.getSubcode(), ((Notify) m).getErrorSubcode().shortValue()); - } - - @After - public void tearDown() { - - } + private BGPSessionNegotiator clientSession; + + @Mock + private Channel speakerListener; + + @Mock + private ChannelPipeline pipeline; + + private final BgpTableType ipv4tt = new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); + + private final BgpTableType linkstatett = new BgpTableTypeImpl(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class); + + private final List receivedMsgs = Lists.newArrayList(); + + private Open classicOpen; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + final List tlvs = Lists.newArrayList(); + + tlvs.add(new BgpParametersBuilder().setCParameters( + new MultiprotocolCaseBuilder().setMultiprotocolCapability( + new MultiprotocolCapabilityBuilder().setAfi(this.ipv4tt.getAfi()).setSafi(this.ipv4tt.getSafi()).build()).build()).build()); + tlvs.add(new BgpParametersBuilder().setCParameters( + new MultiprotocolCaseBuilder().setMultiprotocolCapability( + new MultiprotocolCapabilityBuilder().setAfi(this.linkstatett.getAfi()).setSafi(this.linkstatett.getSafi()).build()).build()).build()); + final BGPSessionPreferences prefs = new BGPSessionPreferences(new AsNumber(30L), (short) 3, null, tlvs); + + final ChannelFuture f = mock(ChannelFuture.class); + doReturn(null).when(f).addListener(any(GenericFutureListener.class)); + this.clientSession = new BGPSessionNegotiator(new HashedWheelTimer(), new DefaultPromise(GlobalEventExecutor.INSTANCE), this.speakerListener, prefs, new AsNumber(30L), new SimpleSessionListener()); + doAnswer(new Answer() { + @Override + public Object answer(final InvocationOnMock invocation) { + final Object[] args = invocation.getArguments(); + FSMTest.this.receivedMsgs.add((Notification) args[0]); + return f; + } + }).when(this.speakerListener).writeAndFlush(any(Notification.class)); + doReturn("TestingChannel").when(this.speakerListener).toString(); + doReturn(this.pipeline).when(this.speakerListener).pipeline(); + doReturn(this.pipeline).when(this.pipeline).replace(any(ChannelHandler.class), any(String.class), any(ChannelHandler.class)); + doReturn(mock(ChannelFuture.class)).when(this.speakerListener).close(); + this.classicOpen = new OpenBuilder().setMyAsNumber(30).setHoldTimer(3).setVersion(new ProtocolVersion((short) 4)).setBgpParameters( + tlvs).build(); + } + + @Test + public void testAccSessionChar() throws InterruptedException { + this.clientSession.channelActive(null); + assertEquals(1, this.receivedMsgs.size()); + assertTrue(this.receivedMsgs.get(0) instanceof Open); + this.clientSession.handleMessage(this.classicOpen); + assertEquals(2, this.receivedMsgs.size()); + assertTrue(this.receivedMsgs.get(1) instanceof Keepalive); + this.clientSession.handleMessage(new KeepaliveBuilder().build()); + assertEquals(this.clientSession.getState(), BGPSessionNegotiator.State.Finished); + Thread.sleep(1000); + Thread.sleep(100); + assertEquals(3, this.receivedMsgs.size()); + assertTrue(this.receivedMsgs.get(2) instanceof Keepalive); // test of keepalive timer + } + + @Test + public void testNotAccChars() throws InterruptedException { + this.clientSession.channelActive(null); + assertEquals(1, this.receivedMsgs.size()); + assertTrue(this.receivedMsgs.get(0) instanceof Open); + this.clientSession.handleMessage(new OpenBuilder().setMyAsNumber(30).setHoldTimer(1).setVersion(new ProtocolVersion((short) 4)).build()); + assertEquals(2, this.receivedMsgs.size()); + assertTrue(this.receivedMsgs.get(1) instanceof Notify); + final Notification m = this.receivedMsgs.get(this.receivedMsgs.size() - 1); + assertEquals(BGPError.UNSPECIFIC_OPEN_ERROR, BGPError.forValue(((Notify) m).getErrorCode(), ((Notify) m).getErrorSubcode())); + } + + @Test + @Ignore + // long duration + public void testNoOpen() throws InterruptedException { + this.clientSession.channelActive(null); + assertEquals(1, this.receivedMsgs.size()); + assertTrue(this.receivedMsgs.get(0) instanceof Open); + Thread.sleep(BGPSessionNegotiator.INITIAL_HOLDTIMER * 1000 * 60); + Thread.sleep(100); + final Notification m = this.receivedMsgs.get(this.receivedMsgs.size() - 1); + assertEquals(BGPError.HOLD_TIMER_EXPIRED, BGPError.forValue(((Notify) m).getErrorCode(), ((Notify) m).getErrorSubcode())); + } + + @Test + public void sendNotification() { + this.clientSession.channelActive(null); + this.clientSession.handleMessage(this.classicOpen); + this.clientSession.handleMessage(new KeepaliveBuilder().build()); + assertEquals(this.clientSession.getState(), BGPSessionNegotiator.State.Finished); + this.clientSession.handleMessage(new OpenBuilder().setMyAsNumber(30).setHoldTimer(3).setVersion(new ProtocolVersion((short) 4)).build()); + assertEquals(3, this.receivedMsgs.size()); + assertTrue(this.receivedMsgs.get(2) instanceof Notify); + final Notification m = this.receivedMsgs.get(2); + assertEquals(BGPError.FSM_ERROR.getCode(), ((Notify) m).getErrorCode().shortValue()); + assertEquals(BGPError.FSM_ERROR.getSubcode(), ((Notify) m).getErrorSubcode().shortValue()); + } + + @After + public void tearDown() { + + } } diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SimpleSessionListener.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SimpleSessionListener.java index d6b6b7d288..748620d0d8 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SimpleSessionListener.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SimpleSessionListener.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.rib.impl; +import com.google.common.collect.Lists; + import java.util.List; import org.opendaylight.protocol.bgp.parser.BGPSession; @@ -16,45 +18,43 @@ import org.opendaylight.yangtools.yang.binding.Notification; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.collect.Lists; - /** * Listener for the client. */ public class SimpleSessionListener implements BGPSessionListener { - private final List listMsg = Lists.newArrayList(); + private final List listMsg = Lists.newArrayList(); - public boolean up = false; + public boolean up = false; - private static final Logger logger = LoggerFactory.getLogger(SimpleSessionListener.class); + private static final Logger LOG = LoggerFactory.getLogger(SimpleSessionListener.class); - public boolean down = false; + public boolean down = false; - public List getListMsg() { - return this.listMsg; - } + public List getListMsg() { + return this.listMsg; + } - @Override - public void onMessage(final BGPSession session, final Notification message) { - this.listMsg.add(message); - logger.debug("Message received:" + message); - } + @Override + public void onMessage(final BGPSession session, final Notification message) { + this.listMsg.add(message); + LOG.debug("Message received: {}", message); + } - @Override - public void onSessionUp(final BGPSession session) { - logger.debug("Session Up"); - this.up = true; - } + @Override + public void onSessionUp(final BGPSession session) { + LOG.debug("Session Up"); + this.up = true; + } - @Override - public void onSessionDown(final BGPSession session, final Exception e) { - logger.debug("Session Down", e); - this.down = true; - } + @Override + public void onSessionDown(final BGPSession session, final Exception e) { + LOG.debug("Session Down", e); + this.down = true; + } - @Override - public void onSessionTerminated(final BGPSession session, final BGPTerminationReason cause) { - logger.debug("Session terminated. Cause : " + cause.toString()); - } + @Override + public void onSessionTerminated(final BGPSession session, final BGPTerminationReason cause) { + LOG.debug("Session terminated. Cause : {}", cause.toString()); + } } diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SpeakerSessionListener.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SpeakerSessionListener.java index 5d557edc93..7dbf352987 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SpeakerSessionListener.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SpeakerSessionListener.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.rib.impl; +import com.google.common.collect.Lists; + import java.util.List; import java.util.Set; @@ -18,47 +20,45 @@ import org.opendaylight.yangtools.yang.binding.Notification; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.collect.Lists; - /** * Listener for the BGP Speaker. */ public class SpeakerSessionListener implements BGPSessionListener { - public List messages = Lists.newArrayList(); + public List messages = Lists.newArrayList(); - public boolean up = false; + public boolean up = false; - public Set types; + public Set types; - private static final Logger logger = LoggerFactory.getLogger(SpeakerSessionListener.class); + private static final Logger LOG = LoggerFactory.getLogger(SpeakerSessionListener.class); - public SpeakerSessionListener() { - } + public SpeakerSessionListener() { + } - @Override - public void onMessage(final BGPSession session, final Notification message) { - logger.debug("Received message: " + message.getClass() + " " + message); - this.messages.add(message); - } + @Override + public void onMessage(final BGPSession session, final Notification message) { + LOG.debug("Received message: {} {}", message.getClass(), message); + this.messages.add(message); + } - @Override - public synchronized void onSessionUp(final BGPSession session) { - logger.debug("Session up."); - this.up = true; - this.types = session.getAdvertisedTableTypes(); - this.notifyAll(); - } + @Override + public synchronized void onSessionUp(final BGPSession session) { + LOG.debug("Session up."); + this.up = true; + this.types = session.getAdvertisedTableTypes(); + this.notifyAll(); + } - @Override - public void onSessionDown(final BGPSession session, final Exception e) { - logger.debug("Session down."); - this.up = false; - } + @Override + public void onSessionDown(final BGPSession session, final Exception e) { + LOG.debug("Session down."); + this.up = false; + } - @Override - public void onSessionTerminated(final BGPSession session, final BGPTerminationReason cause) { - logger.debug("Session terminated. Cause : " + cause.toString()); - this.up = false; - } + @Override + public void onSessionTerminated(final BGPSession session, final BGPTerminationReason cause) { + LOG.debug("Session terminated. Cause : {}", cause.toString()); + this.up = false; + } } diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SpeakerSessionMock.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SpeakerSessionMock.java index 6d5648a11c..03f5f6c22d 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SpeakerSessionMock.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SpeakerSessionMock.java @@ -20,16 +20,16 @@ import org.opendaylight.yangtools.yang.binding.Notification; */ public class SpeakerSessionMock extends BGPSessionImpl { - private final BGPSessionListener client; + private final BGPSessionListener client; - SpeakerSessionMock(final BGPSessionListener listener, final BGPSessionListener client) { - super(new HashedWheelTimer(), listener, mock(Channel.class), new OpenBuilder().setHoldTimer(5).build(), 10); - this.client = client; - } + SpeakerSessionMock(final BGPSessionListener listener, final BGPSessionListener client) { + super(new HashedWheelTimer(), listener, mock(Channel.class), new OpenBuilder().setHoldTimer(5).build(), 10); + this.client = client; + } - @Override - public void sendMessage(final Notification msg) { - this.lastMessageSentAt = System.nanoTime(); - this.client.onMessage(this, msg); - } + @Override + public void sendMessage(final Notification msg) { + this.lastMessageSentAt = System.nanoTime(); + this.client.onMessage(this, msg); + } } diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SynchronizationTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SynchronizationTest.java index 9f34c52b9f..e83319e097 100644 --- a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SynchronizationTest.java +++ b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/SynchronizationTest.java @@ -9,6 +9,9 @@ package org.opendaylight.protocol.bgp.rib.impl; import static org.junit.Assert.assertEquals; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; + import java.util.Set; import org.junit.Before; @@ -36,88 +39,84 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv6AddressFamily; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily; -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; - public class SynchronizationTest { - private BGPSynchronization bs; - - private SimpleSessionListener listener; - - private Update ipv4m; - - private Update ipv6m; - - private Update lsm; - - @Before - public void setUp() { - this.listener = new SimpleSessionListener(); - this.ipv4m = new UpdateBuilder().setNlri(new NlriBuilder().setNlri(Lists.newArrayList(new Ipv4Prefix("1.1.1.1/32"))).build()).build(); - - final MpReachNlriBuilder mpBuilder = new MpReachNlriBuilder(); - mpBuilder.setAfi(Ipv6AddressFamily.class); - mpBuilder.setSafi(UnicastSubsequentAddressFamily.class); - - PathAttributesBuilder paBuilder = new PathAttributesBuilder().addAugmentation(PathAttributes1.class, - new PathAttributes1Builder().setMpReachNlri(mpBuilder.build()).build()); - - this.ipv6m = new UpdateBuilder().setPathAttributes(paBuilder.build()).build(); - - final MpUnreachNlriBuilder mpUBuilder = new MpUnreachNlriBuilder(); - mpUBuilder.setAfi(LinkstateAddressFamily.class); - mpUBuilder.setSafi(LinkstateSubsequentAddressFamily.class); - - paBuilder = new PathAttributesBuilder().addAugmentation(PathAttributes2.class, - new PathAttributes2Builder().setMpUnreachNlri(mpUBuilder.build()).build()); - - this.lsm = new UpdateBuilder().setPathAttributes(paBuilder.build()).build(); - - final Set types = Sets.newHashSet(); - types.add(new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)); - types.add(new TablesKey(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class)); - - this.bs = new BGPSynchronization(new BGPSession() { - - @Override - public void close() { - } - - @Override - public Set getAdvertisedTableTypes() { - final Set types = Sets.newHashSet(); - types.add(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)); - types.add(new BgpTableTypeImpl(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class)); - return types; - } - - @Override - public Ipv4Address getBgpId() { - return new Ipv4Address("127.0.0.1"); - } - - @Override - public AsNumber getAsNumber() { - return new AsNumber(30L); - } - }, this.listener, types); - } - - @Test - public void testSynchronize() { - // simulate sync - this.bs.updReceived(this.ipv6m); - this.bs.updReceived(this.ipv4m); - this.bs.updReceived(this.lsm); - this.bs.kaReceived(); // nothing yet - this.bs.updReceived(this.ipv4m); - this.bs.kaReceived(); // linkstate - assertEquals(1, this.listener.getListMsg().size()); - assertEquals( - LinkstateAddressFamily.class, - ((Update) this.listener.getListMsg().get(0)).getPathAttributes().getAugmentation(PathAttributes1.class).getMpReachNlri().getAfi()); - this.bs.kaReceived(); // ipv4 sync - assertEquals(2, this.listener.getListMsg().size()); - } + private BGPSynchronization bs; + + private SimpleSessionListener listener; + + private Update ipv4m; + + private Update ipv6m; + + private Update lsm; + + @Before + public void setUp() { + this.listener = new SimpleSessionListener(); + this.ipv4m = new UpdateBuilder().setNlri(new NlriBuilder().setNlri(Lists.newArrayList(new Ipv4Prefix("1.1.1.1/32"))).build()).build(); + + final MpReachNlriBuilder mpBuilder = new MpReachNlriBuilder(); + mpBuilder.setAfi(Ipv6AddressFamily.class); + mpBuilder.setSafi(UnicastSubsequentAddressFamily.class); + + PathAttributesBuilder paBuilder = new PathAttributesBuilder().addAugmentation(PathAttributes1.class, + new PathAttributes1Builder().setMpReachNlri(mpBuilder.build()).build()); + + this.ipv6m = new UpdateBuilder().setPathAttributes(paBuilder.build()).build(); + + final MpUnreachNlriBuilder mpUBuilder = new MpUnreachNlriBuilder(); + mpUBuilder.setAfi(LinkstateAddressFamily.class); + mpUBuilder.setSafi(LinkstateSubsequentAddressFamily.class); + + paBuilder = new PathAttributesBuilder().addAugmentation(PathAttributes2.class, new PathAttributes2Builder().setMpUnreachNlri( + mpUBuilder.build()).build()); + + this.lsm = new UpdateBuilder().setPathAttributes(paBuilder.build()).build(); + + final Set types = Sets.newHashSet(); + types.add(new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)); + types.add(new TablesKey(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class)); + + this.bs = new BGPSynchronization(new BGPSession() { + + @Override + public void close() { + } + + @Override + public Set getAdvertisedTableTypes() { + final Set types = Sets.newHashSet(); + types.add(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)); + types.add(new BgpTableTypeImpl(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class)); + return types; + } + + @Override + public Ipv4Address getBgpId() { + return new Ipv4Address("127.0.0.1"); + } + + @Override + public AsNumber getAsNumber() { + return new AsNumber(30L); + } + }, this.listener, types); + } + + @Test + public void testSynchronize() { + // simulate sync + this.bs.updReceived(this.ipv6m); + this.bs.updReceived(this.ipv4m); + this.bs.updReceived(this.lsm); + this.bs.kaReceived(); // nothing yet + this.bs.updReceived(this.ipv4m); + this.bs.kaReceived(); // linkstate + assertEquals(1, this.listener.getListMsg().size()); + assertEquals(LinkstateAddressFamily.class, ((Update) this.listener.getListMsg().get(0)).getPathAttributes().getAugmentation( + PathAttributes1.class).getMpReachNlri().getAfi()); + this.bs.kaReceived(); // ipv4 sync + assertEquals(2, this.listener.getListMsg().size()); + } } diff --git a/bgp/rib-mock/src/main/java/org/opendaylight/protocol/bgp/rib/mock/BGPMock.java b/bgp/rib-mock/src/main/java/org/opendaylight/protocol/bgp/rib/mock/BGPMock.java index b370adf732..383a321bf5 100644 --- a/bgp/rib-mock/src/main/java/org/opendaylight/protocol/bgp/rib/mock/BGPMock.java +++ b/bgp/rib-mock/src/main/java/org/opendaylight/protocol/bgp/rib/mock/BGPMock.java @@ -7,6 +7,9 @@ */ package org.opendaylight.protocol.bgp.rib.mock; +import com.google.common.collect.Lists; +import com.google.common.eventbus.EventBus; + import io.netty.buffer.Unpooled; import java.io.Closeable; @@ -29,93 +32,89 @@ import org.opendaylight.yangtools.yang.binding.Notification; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.collect.Lists; -import com.google.common.eventbus.EventBus; - /** - * Mock BGP session. It provides a way how to route a set of messages to - * BGPSessionListener. + * Mock BGP session. It provides a way how to route a set of messages to BGPSessionListener. */ @ThreadSafe public final class BGPMock implements Closeable { - private static final Logger LOG = LoggerFactory.getLogger(BGPMock.class); - - static final Notification CONNECTION_LOST_MAGIC_MSG = new NotifyBuilder().setErrorCode(BGPError.CEASE.getCode()).build(); - - @GuardedBy("this") - private final List allPreviousByteMessages; - private final List allPreviousBGPMessages; - private final EventBus eventBus; - - @GuardedBy("this") - private final List openRegistrations = Lists.newLinkedList(); - - public BGPMock(final EventBus eventBus, final MessageRegistry registry, final List bgpMessages) { - this.allPreviousByteMessages = Lists.newLinkedList(bgpMessages); - this.eventBus = eventBus; - this.allPreviousBGPMessages = this.parsePrevious(registry, this.allPreviousByteMessages); - } - - private List parsePrevious(final MessageRegistry registry, final List msgs) { - final List messages = Lists.newArrayList(); - try { - for (final byte[] b : msgs) { - - final byte[] body = ByteArray.cutBytes(b, 1); - - messages.add(registry.parseMessage(Unpooled.copiedBuffer(body))); - } - } catch (final BGPDocumentedException | BGPParsingException e) { - LOG.warn("Failed to parse message {}", e); - } - return messages; - } - - public synchronized void insertConnectionLostEvent() { - this.insertMessage(CONNECTION_LOST_MAGIC_MSG); - } - - public synchronized void insertMessages(final List messages) { - for (final Notification message : messages) { - this.insertMessage(message); - } - } - - @GuardedBy("this") - private void insertMessage(final Notification message) { - this.allPreviousBGPMessages.add(message); - this.eventBus.post(message); - } - - @Override - public synchronized void close() { - // unregister all EventBusRegistration instances - for (final EventBusRegistration registration : this.openRegistrations) { - registration.close(); - } - this.openRegistrations.clear(); - } - - public boolean isMessageListSame(final List newMessages) { - if (this.allPreviousBGPMessages.size() != newMessages.size()) { - return false; - } - final Iterator i1 = this.allPreviousByteMessages.iterator(); - final Iterator i2 = this.allPreviousByteMessages.iterator(); - for (int i = 0; i < this.allPreviousBGPMessages.size(); i++) { - if (!Arrays.equals(i1.next(), i2.next())) { - return false; - } - } - return true; - } - - public EventBus getEventBus() { - return this.eventBus; - } - - public ListenerRegistration registerUpdateListener(final BGPSessionListener listener) { - return EventBusRegistration.createAndRegister(this.eventBus, listener, this.allPreviousBGPMessages); - } + private static final Logger LOG = LoggerFactory.getLogger(BGPMock.class); + + static final Notification CONNECTION_LOST_MAGIC_MSG = new NotifyBuilder().setErrorCode(BGPError.CEASE.getCode()).build(); + + @GuardedBy("this") + private final List allPreviousByteMessages; + private final List allPreviousBGPMessages; + private final EventBus eventBus; + + @GuardedBy("this") + private final List openRegistrations = Lists.newLinkedList(); + + public BGPMock(final EventBus eventBus, final MessageRegistry registry, final List bgpMessages) { + this.allPreviousByteMessages = Lists.newLinkedList(bgpMessages); + this.eventBus = eventBus; + this.allPreviousBGPMessages = this.parsePrevious(registry, this.allPreviousByteMessages); + } + + private List parsePrevious(final MessageRegistry registry, final List msgs) { + final List messages = Lists.newArrayList(); + try { + for (final byte[] b : msgs) { + + final byte[] body = ByteArray.cutBytes(b, 1); + + messages.add(registry.parseMessage(Unpooled.copiedBuffer(body))); + } + } catch (final BGPDocumentedException | BGPParsingException e) { + LOG.warn("Failed to parse message {}", e.getMessage(), e); + } + return messages; + } + + public synchronized void insertConnectionLostEvent() { + this.insertMessage(CONNECTION_LOST_MAGIC_MSG); + } + + public synchronized void insertMessages(final List messages) { + for (final Notification message : messages) { + this.insertMessage(message); + } + } + + @GuardedBy("this") + private void insertMessage(final Notification message) { + this.allPreviousBGPMessages.add(message); + this.eventBus.post(message); + } + + @Override + public synchronized void close() { + // unregister all EventBusRegistration instances + for (final EventBusRegistration registration : this.openRegistrations) { + registration.close(); + } + this.openRegistrations.clear(); + } + + public boolean isMessageListSame(final List newMessages) { + if (this.allPreviousBGPMessages.size() != newMessages.size()) { + return false; + } + final Iterator i1 = this.allPreviousByteMessages.iterator(); + final Iterator i2 = this.allPreviousByteMessages.iterator(); + for (int i = 0; i < this.allPreviousBGPMessages.size(); i++) { + if (!Arrays.equals(i1.next(), i2.next())) { + return false; + } + } + return true; + } + + public EventBus getEventBus() { + return this.eventBus; + } + + public ListenerRegistration registerUpdateListener(final BGPSessionListener listener) { + return EventBusRegistration.createAndRegister(this.eventBus, listener, this.allPreviousBGPMessages); + } } diff --git a/bgp/rib-mock/src/main/java/org/opendaylight/protocol/bgp/rib/mock/EventBusRegistration.java b/bgp/rib-mock/src/main/java/org/opendaylight/protocol/bgp/rib/mock/EventBusRegistration.java index 568c453c9e..ac3e6e6547 100644 --- a/bgp/rib-mock/src/main/java/org/opendaylight/protocol/bgp/rib/mock/EventBusRegistration.java +++ b/bgp/rib-mock/src/main/java/org/opendaylight/protocol/bgp/rib/mock/EventBusRegistration.java @@ -7,6 +7,10 @@ */ package org.opendaylight.protocol.bgp.rib.mock; +import com.google.common.collect.Sets; +import com.google.common.eventbus.EventBus; +import com.google.common.eventbus.Subscribe; + import java.util.List; import java.util.Set; @@ -25,83 +29,79 @@ import org.opendaylight.yangtools.yang.binding.Notification; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.collect.Sets; -import com.google.common.eventbus.EventBus; -import com.google.common.eventbus.Subscribe; - /** * This class has @Subscribe annotated methods which receive events from {@link EventBus} . Events are produced by * {@link BGPMock}, and each instance notifies exactly one {@link BGPSessionListener}. */ final class EventBusRegistration extends AbstractListenerRegistration { - private static final Logger LOG = LoggerFactory.getLogger(EventBusRegistration.class); - - private final EventBus eventBus; - - public static EventBusRegistration createAndRegister(final EventBus eventBus, final BGPSessionListener listener, - final List allPreviousMessages) { - final EventBusRegistration instance = new EventBusRegistration(eventBus, listener, allPreviousMessages); - eventBus.register(instance); - return instance; - } - - private EventBusRegistration(final EventBus eventBus, final BGPSessionListener listener, final List allPreviousMessages) { - super(listener); - this.eventBus = eventBus; - for (final Notification message : allPreviousMessages) { - sendMessage(listener, message); - } - } - - @Subscribe - public void onMessage(final Notification message) { - sendMessage(this.getInstance(), message); - } - - @Override - public synchronized void removeRegistration() { - this.eventBus.unregister(this); - } - - private static void sendMessage(final BGPSessionListener listener, final Notification message) { - if (BGPMock.CONNECTION_LOST_MAGIC_MSG.equals(message)) { - listener.onSessionTerminated(null, null); - } else if (message instanceof Open) { - final Set tts = Sets.newHashSet(); - for (final BgpParameters param : ((Open) message).getBgpParameters()) { - if (param.getCParameters() instanceof MultiprotocolCase) { - final MultiprotocolCase p = (MultiprotocolCase) param.getCParameters(); - LOG.debug("Adding open parameter {}", p); - final BgpTableType type = new BgpTableTypeImpl(p.getMultiprotocolCapability().getAfi(), p.getMultiprotocolCapability().getSafi()); - tts.add(type); - } - } - - listener.onSessionUp(new BGPSession() { - - @Override - public void close() { - LOG.debug("Session {} closed", this); - } - - @Override - public Set getAdvertisedTableTypes() { - return tts; - } - - @Override - public Ipv4Address getBgpId() { - return new Ipv4Address("127.0.0.1"); - } - - @Override - public AsNumber getAsNumber() { - return new AsNumber(30L); - } - }); - } else if (!(message instanceof Keepalive)) { - listener.onMessage(null, message); - } - } + private static final Logger LOG = LoggerFactory.getLogger(EventBusRegistration.class); + + private final EventBus eventBus; + + public static EventBusRegistration createAndRegister(final EventBus eventBus, final BGPSessionListener listener, + final List allPreviousMessages) { + final EventBusRegistration instance = new EventBusRegistration(eventBus, listener, allPreviousMessages); + eventBus.register(instance); + return instance; + } + + private EventBusRegistration(final EventBus eventBus, final BGPSessionListener listener, final List allPreviousMessages) { + super(listener); + this.eventBus = eventBus; + for (final Notification message : allPreviousMessages) { + sendMessage(listener, message); + } + } + + @Subscribe + public void onMessage(final Notification message) { + sendMessage(this.getInstance(), message); + } + + @Override + public synchronized void removeRegistration() { + this.eventBus.unregister(this); + } + + private static void sendMessage(final BGPSessionListener listener, final Notification message) { + if (BGPMock.CONNECTION_LOST_MAGIC_MSG.equals(message)) { + listener.onSessionTerminated(null, null); + } else if (message instanceof Open) { + final Set tts = Sets.newHashSet(); + for (final BgpParameters param : ((Open) message).getBgpParameters()) { + if (param.getCParameters() instanceof MultiprotocolCase) { + final MultiprotocolCase p = (MultiprotocolCase) param.getCParameters(); + LOG.debug("Adding open parameter {}", p); + final BgpTableType type = new BgpTableTypeImpl(p.getMultiprotocolCapability().getAfi(), p.getMultiprotocolCapability().getSafi()); + tts.add(type); + } + } + + listener.onSessionUp(new BGPSession() { + + @Override + public void close() { + LOG.debug("Session {} closed", this); + } + + @Override + public Set getAdvertisedTableTypes() { + return tts; + } + + @Override + public Ipv4Address getBgpId() { + return new Ipv4Address("127.0.0.1"); + } + + @Override + public AsNumber getAsNumber() { + return new AsNumber(30L); + } + }); + } else if (!(message instanceof Keepalive)) { + listener.onMessage(null, message); + } + } } diff --git a/bgp/rib-mock/src/test/java/org/opendaylight/protocol/bgp/rib/mock/BGPListenerMock.java b/bgp/rib-mock/src/test/java/org/opendaylight/protocol/bgp/rib/mock/BGPListenerMock.java index cdab3114ee..e4ee6ddd88 100644 --- a/bgp/rib-mock/src/test/java/org/opendaylight/protocol/bgp/rib/mock/BGPListenerMock.java +++ b/bgp/rib-mock/src/test/java/org/opendaylight/protocol/bgp/rib/mock/BGPListenerMock.java @@ -20,35 +20,35 @@ import org.opendaylight.yangtools.yang.binding.Notification; * Mock implementation of {@link BGPSessionListener} for testing purposes. */ public final class BGPListenerMock implements BGPSessionListener { - private final List buffer = Collections.synchronizedList(new ArrayList()); - private boolean connected = false; + private final List buffer = Collections.synchronizedList(new ArrayList()); + private boolean connected = false; - protected List getBuffer() { - return this.buffer; - } + protected List getBuffer() { + return this.buffer; + } - protected boolean isConnected() { - return this.connected; - } + protected boolean isConnected() { + return this.connected; + } - @Override - public void onMessage(final BGPSession session, final Notification message) { - this.buffer.add(message); - } + @Override + public void onMessage(final BGPSession session, final Notification message) { + this.buffer.add(message); + } - @Override - public void onSessionUp(final BGPSession session) { - this.connected = true; - } + @Override + public void onSessionUp(final BGPSession session) { + this.connected = true; + } - @Override - public void onSessionDown(final BGPSession session, final Exception e) { - this.connected = false; + @Override + public void onSessionDown(final BGPSession session, final Exception e) { + this.connected = false; - } + } - @Override - public void onSessionTerminated(final BGPSession session, final BGPTerminationReason reason) { - this.connected = false; - } + @Override + public void onSessionTerminated(final BGPSession session, final BGPTerminationReason reason) { + this.connected = false; + } } diff --git a/bgp/rib-spi-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/spi/RIBExtensionsImplModule.java b/bgp/rib-spi-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/spi/RIBExtensionsImplModule.java index 978119852c..0ffcb011da 100644 --- a/bgp/rib-spi-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/spi/RIBExtensionsImplModule.java +++ b/bgp/rib-spi-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/spi/RIBExtensionsImplModule.java @@ -24,38 +24,38 @@ import org.opendaylight.protocol.bgp.rib.spi.SimpleRIBExtensionProviderContext; */ public final class RIBExtensionsImplModule extends org.opendaylight.controller.config.yang.bgp.rib.spi.AbstractRIBExtensionsImplModule { - public RIBExtensionsImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, - final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { - super(identifier, dependencyResolver); - } - - public RIBExtensionsImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, - final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, final RIBExtensionsImplModule oldModule, - final java.lang.AutoCloseable oldInstance) { - super(identifier, dependencyResolver, oldModule, oldInstance); - } - - @Override - protected void customValidation() { - // Add custom validation for module attributes here. - } - - @Override - public java.lang.AutoCloseable createInstance() { - final class RIBExtensionProviderContextImplCloseable extends SimpleRIBExtensionProviderContext implements AutoCloseable { - @Override - public void close() { - for (final RIBExtensionProviderActivator e : getExtensionDependency()) { - e.stopRIBExtensionProvider(); - } - } - } - - final RIBExtensionProviderContextImplCloseable ret = new RIBExtensionProviderContextImplCloseable(); - for (final RIBExtensionProviderActivator e : getExtensionDependency()) { - e.startRIBExtensionProvider(ret); - } - - return ret; - } + public RIBExtensionsImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } + + public RIBExtensionsImplModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, final RIBExtensionsImplModule oldModule, + final java.lang.AutoCloseable oldInstance) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } + + @Override + protected void customValidation() { + // Add custom validation for module attributes here. + } + + @Override + public java.lang.AutoCloseable createInstance() { + final class RIBExtensionProviderContextImplCloseable extends SimpleRIBExtensionProviderContext implements AutoCloseable { + @Override + public void close() { + for (final RIBExtensionProviderActivator e : getExtensionDependency()) { + e.stopRIBExtensionProvider(); + } + } + } + + final RIBExtensionProviderContextImplCloseable ret = new RIBExtensionProviderContextImplCloseable(); + for (final RIBExtensionProviderActivator e : getExtensionDependency()) { + e.startRIBExtensionProvider(ret); + } + + return ret; + } } diff --git a/bgp/rib-spi-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/spi/RIBExtensionsImplModuleFactory.java b/bgp/rib-spi-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/spi/RIBExtensionsImplModuleFactory.java index d8ab262f8f..a72510a60a 100644 --- a/bgp/rib-spi-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/spi/RIBExtensionsImplModuleFactory.java +++ b/bgp/rib-spi-config/src/main/java/org/opendaylight/controller/config/yang/bgp/rib/spi/RIBExtensionsImplModuleFactory.java @@ -6,21 +6,20 @@ * and is available at http://www.eclipse.org/legal/epl-v10.html */ /** -* Generated file + * Generated file -* Generated from: yang module name: config-bgp-rib-spi yang module local name: bgp-rib-extensions-impl -* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator -* Generated at: Wed Nov 27 12:38:57 CET 2013 -* -* Do not modify this file unless it is present under src/main directory -*/ + * Generated from: yang module name: config-bgp-rib-spi yang module local name: bgp-rib-extensions-impl + * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator + * Generated at: Wed Nov 27 12:38:57 CET 2013 + * + * Do not modify this file unless it is present under src/main directory + */ package org.opendaylight.controller.config.yang.bgp.rib.spi; /** * */ -public class RIBExtensionsImplModuleFactory extends org.opendaylight.controller.config.yang.bgp.rib.spi.AbstractRIBExtensionsImplModuleFactory -{ - +public class RIBExtensionsImplModuleFactory extends + org.opendaylight.controller.config.yang.bgp.rib.spi.AbstractRIBExtensionsImplModuleFactory { } diff --git a/bgp/rib-spi-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/spi/RIBExtensionsImplModuleTest.java b/bgp/rib-spi-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/spi/RIBExtensionsImplModuleTest.java index 41af4ec024..a93a88065b 100644 --- a/bgp/rib-spi-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/spi/RIBExtensionsImplModuleTest.java +++ b/bgp/rib-spi-config/src/test/java/org/opendaylight/controller/config/yang/bgp/rib/spi/RIBExtensionsImplModuleTest.java @@ -8,7 +8,9 @@ package org.opendaylight.controller.config.yang.bgp.rib.spi; import java.util.List; + import javax.management.ObjectName; + import org.junit.Before; import org.junit.Test; import org.opendaylight.controller.config.api.jmx.CommitStatus; @@ -49,7 +51,8 @@ public class RIBExtensionsImplModuleTest extends AbstractConfigTest { return transaction.commit(); } - public static ObjectName createRIBExtensionsModuleInstance(final ConfigTransactionJMXClient transaction, final List extensions) throws Exception { + public static ObjectName createRIBExtensionsModuleInstance(final ConfigTransactionJMXClient transaction, + final List extensions) throws Exception { final ObjectName objectName = transaction.createModule(FACTORY_NAME, INSTANCE_NAME); RIBExtensionsImplModuleMXBean mxBean = transaction.newMXBeanProxy(objectName, RIBExtensionsImplModuleMXBean.class); mxBean.setExtension(extensions); diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AbstractAdjRIBsIn.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AbstractAdjRIBsIn.java index fb9c028271..cd97654863 100644 --- a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AbstractAdjRIBsIn.java +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AbstractAdjRIBsIn.java @@ -7,6 +7,10 @@ */ package org.opendaylight.protocol.bgp.rib.spi; +import com.google.common.base.Objects; +import com.google.common.base.Objects.ToStringHelper; +import com.google.common.base.Preconditions; + import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; @@ -35,200 +39,195 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Objects; -import com.google.common.base.Objects.ToStringHelper; -import com.google.common.base.Preconditions; - @ThreadSafe public abstract class AbstractAdjRIBsIn implements AdjRIBsIn { - protected abstract static class RIBEntryData { - private final PathAttributes attributes; - - protected RIBEntryData(final PathAttributes attributes) { - this.attributes = Preconditions.checkNotNull(attributes); - } - - public PathAttributes getPathAttributes() { - return this.attributes; - } - - protected abstract D getDataObject(I key, InstanceIdentifier id); - - @Override - public final String toString() { - return addToStringAttributes(Objects.toStringHelper(this)).toString(); - } - - protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) { - return toStringHelper.add("attributes", this.attributes); - } - } - - /** - * A single RIB table entry, which holds multiple versions of the entry's state and elects the authoritative based - * on ordering specified by the supplied comparator. - * - */ - private final class RIBEntry { - /* - * TODO: we could dramatically optimize performance by using the comparator - * to retain the candidate states ordered -- thus selection would occur - * automatically through insertion, without the need of a second walk. - */ - private final Map> candidates = new HashMap<>(); - private final I key; - - @GuardedBy("this") - private InstanceIdentifier name; - @GuardedBy("this") - private RIBEntryData currentState; - - RIBEntry(final I key) { - this.key = Preconditions.checkNotNull(key); - } - - private InstanceIdentifier getName() { - if (this.name == null) { - this.name = identifierForKey(AbstractAdjRIBsIn.this.basePath, this.key); - LOG.trace("Entry {} grew key {}", this, this.name); - } - return this.name; - } - - private RIBEntryData findCandidate(final RIBEntryData initial, final Comparator comparator) { - RIBEntryData newState = initial; - for (final RIBEntryData s : this.candidates.values()) { - if (newState == null || comparator.compare(newState.attributes, s.attributes) > 0) { - newState = s; - } - } - - return newState; - } - - private void electCandidate(final DataModificationTransaction transaction, final RIBEntryData candidate) { - LOG.trace("Electing state {} to supersede {}", candidate, this.currentState); - - if (this.currentState == null || !this.currentState.equals(candidate)) { - LOG.trace("Elected new state for {}: {}", getName(), candidate); - transaction.putOperationalData(getName(), candidate.getDataObject(this.key, getName())); - this.currentState = candidate; - } - } - - synchronized boolean removeState(final DataModificationTransaction transaction, final Peer peer) { - final RIBEntryData data = this.candidates.remove(peer); - LOG.trace("Removed data {}", data); - - final RIBEntryData candidate = findCandidate(null, peer.getComparator()); - if (candidate != null) { - electCandidate(transaction, candidate); - } else { - LOG.trace("Final candidate disappeared, removing entry {}", getName()); - transaction.removeOperationalData(getName()); - } - - return this.candidates.isEmpty(); - } - - synchronized void setState(final DataModificationTransaction transaction, final Peer peer, final RIBEntryData state) { - this.candidates.put(Preconditions.checkNotNull(peer), Preconditions.checkNotNull(state)); - electCandidate(transaction, findCandidate(state, peer.getComparator())); - } - } - - private static final Logger LOG = LoggerFactory.getLogger(AbstractAdjRIBsIn.class); - private final InstanceIdentifier basePath; - private final Update eor; - - @GuardedBy("this") - private final Map entries = new HashMap<>(); - - @GuardedBy("this") - private final Map peers = new HashMap<>(); - - protected AbstractAdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) { - this.basePath = rib.getInstanceIdentifier().child(LocRib.class).child(Tables.class, key); - - this.eor = new UpdateBuilder().setPathAttributes( - new PathAttributesBuilder().addAugmentation( - PathAttributes1.class, - new PathAttributes1Builder().setMpReachNlri( - new MpReachNlriBuilder().setAfi(key.getAfi()).setSafi(key.getSafi()).build()).build()).build()).build(); - - trans.putOperationalData(this.basePath, - new TablesBuilder().setAfi(key.getAfi()).setSafi(key.getSafi()). - setAttributes(new AttributesBuilder().setUptodate(Boolean.TRUE).build()).build()); - } - - private void setUptodate(final DataModificationTransaction trans, final Boolean uptodate) { - final InstanceIdentifier aid = this.basePath.child(Attributes.class); - final Attributes a = (Attributes) trans.readOperationalData(aid); - Preconditions.checkState(a != null); - - if (!uptodate.equals(a.isUptodate())) { - LOG.debug("Table {} switching uptodate to {}", this.basePath, uptodate); - trans.removeOperationalData(aid); - trans.putOperationalData(aid, new AttributesBuilder().setUptodate(uptodate).build()); - } - } - - @Override - public synchronized void clear(final DataModificationTransaction trans, final Peer peer) { - final Iterator> i = this.entries.entrySet().iterator(); - while (i.hasNext()) { - final Map.Entry e = i.next(); - - if (e.getValue().removeState(trans, peer)) { - i.remove(); - } - } - - this.peers.remove(peer); - setUptodate(trans, !this.peers.values().contains(Boolean.FALSE)); - } - - /** - * Construct a datastore identifier for an entry key. - * - * @param basePath datastore base path under which the entry to be stored - * @param id object identifier - * @return Data store identifier, may not be null - */ - protected abstract InstanceIdentifier identifierForKey(final InstanceIdentifier basePath, final I id); - - protected synchronized void add(final DataModificationTransaction trans, final Peer peer, final I id, final RIBEntryData data) { - LOG.debug("Adding state {} for {} peer {}", data, id, peer); - - RIBEntry e = this.entries.get(Preconditions.checkNotNull(id)); - if (e == null) { - e = new RIBEntry(id); - this.entries.put(id, e); - } - - e.setState(trans, peer, data); - if (!this.peers.containsKey(peer)) { - this.peers.put(peer, Boolean.FALSE); - setUptodate(trans, Boolean.FALSE); - } - } - - protected synchronized void remove(final DataModificationTransaction trans, final Peer peer, final I id) { - final RIBEntry e = this.entries.get(id); - if (e != null && e.removeState(trans, peer)) { - LOG.debug("Removed last state, removing entry for {}", id); - this.entries.remove(id); - } - } - - @Override - public final void markUptodate(final DataModificationTransaction trans, final Peer peer) { - this.peers.put(peer, Boolean.TRUE); - setUptodate(trans, !this.peers.values().contains(Boolean.FALSE)); - } - - @Override - public final Update endOfRib() { - return this.eor; - } + protected abstract static class RIBEntryData { + private final PathAttributes attributes; + + protected RIBEntryData(final PathAttributes attributes) { + this.attributes = Preconditions.checkNotNull(attributes); + } + + public PathAttributes getPathAttributes() { + return this.attributes; + } + + protected abstract D getDataObject(I key, InstanceIdentifier id); + + @Override + public final String toString() { + return addToStringAttributes(Objects.toStringHelper(this)).toString(); + } + + protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) { + return toStringHelper.add("attributes", this.attributes); + } + } + + /** + * A single RIB table entry, which holds multiple versions of the entry's state and elects the authoritative based + * on ordering specified by the supplied comparator. + * + */ + private final class RIBEntry { + /* + * TODO: we could dramatically optimize performance by using the comparator + * to retain the candidate states ordered -- thus selection would occur + * automatically through insertion, without the need of a second walk. + */ + private final Map> candidates = new HashMap<>(); + private final I key; + + @GuardedBy("this") + private InstanceIdentifier name; + @GuardedBy("this") + private RIBEntryData currentState; + + RIBEntry(final I key) { + this.key = Preconditions.checkNotNull(key); + } + + private InstanceIdentifier getName() { + if (this.name == null) { + this.name = identifierForKey(AbstractAdjRIBsIn.this.basePath, this.key); + LOG.trace("Entry {} grew key {}", this, this.name); + } + return this.name; + } + + private RIBEntryData findCandidate(final RIBEntryData initial, final Comparator comparator) { + RIBEntryData newState = initial; + for (final RIBEntryData s : this.candidates.values()) { + if (newState == null || comparator.compare(newState.attributes, s.attributes) > 0) { + newState = s; + } + } + + return newState; + } + + private void electCandidate(final DataModificationTransaction transaction, final RIBEntryData candidate) { + LOG.trace("Electing state {} to supersede {}", candidate, this.currentState); + + if (this.currentState == null || !this.currentState.equals(candidate)) { + LOG.trace("Elected new state for {}: {}", getName(), candidate); + transaction.putOperationalData(getName(), candidate.getDataObject(this.key, getName())); + this.currentState = candidate; + } + } + + synchronized boolean removeState(final DataModificationTransaction transaction, final Peer peer) { + final RIBEntryData data = this.candidates.remove(peer); + LOG.trace("Removed data {}", data); + + final RIBEntryData candidate = findCandidate(null, peer.getComparator()); + if (candidate != null) { + electCandidate(transaction, candidate); + } else { + LOG.trace("Final candidate disappeared, removing entry {}", getName()); + transaction.removeOperationalData(getName()); + } + + return this.candidates.isEmpty(); + } + + synchronized void setState(final DataModificationTransaction transaction, final Peer peer, final RIBEntryData state) { + this.candidates.put(Preconditions.checkNotNull(peer), Preconditions.checkNotNull(state)); + electCandidate(transaction, findCandidate(state, peer.getComparator())); + } + } + + private static final Logger LOG = LoggerFactory.getLogger(AbstractAdjRIBsIn.class); + private final InstanceIdentifier basePath; + private final Update eor; + + @GuardedBy("this") + private final Map entries = new HashMap<>(); + + @GuardedBy("this") + private final Map peers = new HashMap<>(); + + protected AbstractAdjRIBsIn(final DataModificationTransaction trans, final RibReference rib, final TablesKey key) { + this.basePath = rib.getInstanceIdentifier().child(LocRib.class).child(Tables.class, key); + + this.eor = new UpdateBuilder().setPathAttributes( + new PathAttributesBuilder().addAugmentation( + PathAttributes1.class, + new PathAttributes1Builder().setMpReachNlri( + new MpReachNlriBuilder().setAfi(key.getAfi()).setSafi(key.getSafi()).build()).build()).build()).build(); + + trans.putOperationalData(this.basePath, new TablesBuilder().setAfi(key.getAfi()).setSafi(key.getSafi()).setAttributes( + new AttributesBuilder().setUptodate(Boolean.TRUE).build()).build()); + } + + private void setUptodate(final DataModificationTransaction trans, final Boolean uptodate) { + final InstanceIdentifier aid = this.basePath.child(Attributes.class); + final Attributes a = (Attributes) trans.readOperationalData(aid); + Preconditions.checkState(a != null); + + if (!uptodate.equals(a.isUptodate())) { + LOG.debug("Table {} switching uptodate to {}", this.basePath, uptodate); + trans.removeOperationalData(aid); + trans.putOperationalData(aid, new AttributesBuilder().setUptodate(uptodate).build()); + } + } + + @Override + public synchronized void clear(final DataModificationTransaction trans, final Peer peer) { + final Iterator> i = this.entries.entrySet().iterator(); + while (i.hasNext()) { + final Map.Entry e = i.next(); + + if (e.getValue().removeState(trans, peer)) { + i.remove(); + } + } + + this.peers.remove(peer); + setUptodate(trans, !this.peers.values().contains(Boolean.FALSE)); + } + + /** + * Construct a datastore identifier for an entry key. + * + * @param basePath datastore base path under which the entry to be stored + * @param id object identifier + * @return Data store identifier, may not be null + */ + protected abstract InstanceIdentifier identifierForKey(final InstanceIdentifier basePath, final I id); + + protected synchronized void add(final DataModificationTransaction trans, final Peer peer, final I id, final RIBEntryData data) { + LOG.debug("Adding state {} for {} peer {}", data, id, peer); + + RIBEntry e = this.entries.get(Preconditions.checkNotNull(id)); + if (e == null) { + e = new RIBEntry(id); + this.entries.put(id, e); + } + + e.setState(trans, peer, data); + if (!this.peers.containsKey(peer)) { + this.peers.put(peer, Boolean.FALSE); + setUptodate(trans, Boolean.FALSE); + } + } + + protected synchronized void remove(final DataModificationTransaction trans, final Peer peer, final I id) { + final RIBEntry e = this.entries.get(id); + if (e != null && e.removeState(trans, peer)) { + LOG.debug("Removed last state, removing entry for {}", id); + this.entries.remove(id); + } + } + + @Override + public final void markUptodate(final DataModificationTransaction trans, final Peer peer) { + this.peers.put(peer, Boolean.TRUE); + setUptodate(trans, !this.peers.values().contains(Boolean.FALSE)); + } + + @Override + public final Update endOfRib() { + return this.eor; + } } diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AbstractRIBExtensionProviderActivator.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AbstractRIBExtensionProviderActivator.java index d661877796..870ba7505d 100644 --- a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AbstractRIBExtensionProviderActivator.java +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AbstractRIBExtensionProviderActivator.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.rib.spi; +import com.google.common.base.Preconditions; + import java.util.List; import javax.annotation.concurrent.GuardedBy; @@ -14,41 +16,39 @@ import javax.annotation.concurrent.GuardedBy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; - public abstract class AbstractRIBExtensionProviderActivator implements AutoCloseable, RIBExtensionProviderActivator { - private static final Logger LOG = LoggerFactory.getLogger(AbstractRIBExtensionProviderActivator.class); + private static final Logger LOG = LoggerFactory.getLogger(AbstractRIBExtensionProviderActivator.class); - @GuardedBy("this") - private List registrations; + @GuardedBy("this") + private List registrations; - @GuardedBy("this") - protected abstract List startRIBExtensionProviderImpl(RIBExtensionProviderContext context); + @GuardedBy("this") + protected abstract List startRIBExtensionProviderImpl(RIBExtensionProviderContext context); - @Override - public final synchronized void startRIBExtensionProvider(final RIBExtensionProviderContext context) { - Preconditions.checkState(this.registrations == null); + @Override + public final synchronized void startRIBExtensionProvider(final RIBExtensionProviderContext context) { + Preconditions.checkState(this.registrations == null); - this.registrations = Preconditions.checkNotNull(startRIBExtensionProviderImpl(context)); - } + this.registrations = Preconditions.checkNotNull(startRIBExtensionProviderImpl(context)); + } - @Override - public final synchronized void stopRIBExtensionProvider() { - Preconditions.checkState(this.registrations != null); + @Override + public final synchronized void stopRIBExtensionProvider() { + Preconditions.checkState(this.registrations != null); - for (final AutoCloseable r : this.registrations) { - try { - r.close(); - } catch (final Exception e) { - LOG.warn("Failed to close registration", e); - } - } + for (final AutoCloseable r : this.registrations) { + try { + r.close(); + } catch (final Exception e) { + LOG.warn("Failed to close registration", e); + } + } - this.registrations = null; - } + this.registrations = null; + } - @Override - public final void close() { - stopRIBExtensionProvider(); - } + @Override + public final void close() { + stopRIBExtensionProvider(); + } } diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AdjRIBsIn.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AdjRIBsIn.java index 3b394fd002..aeea6f4ffe 100644 --- a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AdjRIBsIn.java +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AdjRIBsIn.java @@ -14,9 +14,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mult import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.update.path.attributes.MpUnreachNlri; public interface AdjRIBsIn { - void addRoutes(DataModificationTransaction trans, Peer peer, MpReachNlri nlri, PathAttributes attributes); - void removeRoutes(DataModificationTransaction trans, Peer peer, MpUnreachNlri nlri); - void clear(DataModificationTransaction trans, Peer peer); - void markUptodate(DataModificationTransaction trans, Peer peer); - Update endOfRib(); + void addRoutes(DataModificationTransaction trans, Peer peer, MpReachNlri nlri, PathAttributes attributes); + + void removeRoutes(DataModificationTransaction trans, Peer peer, MpUnreachNlri nlri); + + void clear(DataModificationTransaction trans, Peer peer); + + void markUptodate(DataModificationTransaction trans, Peer peer); + + Update endOfRib(); } diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AdjRIBsInFactory.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AdjRIBsInFactory.java index b896e86f01..0c4e0d65e9 100644 --- a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AdjRIBsInFactory.java +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/AdjRIBsInFactory.java @@ -12,5 +12,5 @@ import org.opendaylight.protocol.bgp.rib.RibReference; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey; public interface AdjRIBsInFactory { - AdjRIBsIn createAdjRIBsIn(DataModificationTransaction trans, final RibReference rib, TablesKey key); + AdjRIBsIn createAdjRIBsIn(DataModificationTransaction trans, final RibReference rib, TablesKey key); } diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/Peer.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/Peer.java index 434c0f0443..350e8e79c0 100644 --- a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/Peer.java +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/Peer.java @@ -15,17 +15,17 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mess * Marker interface identifying a BGP peer. */ public interface Peer { - /** - * Return peer's symbolic name. - * - * @return symbolic name. - */ - String getName(); + /** + * Return peer's symbolic name. + * + * @return symbolic name. + */ + String getName(); - /** - * Return the peer's attached path attribute comparator. - * - * @return Path attribute comparator, as viewed from the peer. - */ - Comparator getComparator(); + /** + * Return the peer's attached path attribute comparator. + * + * @return Path attribute comparator, as viewed from the peer. + */ + Comparator getComparator(); } diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RIBExtensionConsumerActivator.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RIBExtensionConsumerActivator.java index 03f67220c4..691737cce0 100644 --- a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RIBExtensionConsumerActivator.java +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RIBExtensionConsumerActivator.java @@ -8,6 +8,7 @@ package org.opendaylight.protocol.bgp.rib.spi; public interface RIBExtensionConsumerActivator { - void startRIBExtensionConsumer(RIBExtensionConsumerContext context); - void stopRIBExtensionConsumer(RIBExtensionConsumerContext context); + void startRIBExtensionConsumer(RIBExtensionConsumerContext context); + + void stopRIBExtensionConsumer(RIBExtensionConsumerContext context); } \ No newline at end of file diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RIBExtensionConsumerContext.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RIBExtensionConsumerContext.java index 8cf093484b..3abdbb8d32 100644 --- a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RIBExtensionConsumerContext.java +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RIBExtensionConsumerContext.java @@ -11,12 +11,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily; /** - * Interface for registering AdjRIBsIn factories. In order for a model-driven - * RIB implementation to work correctly, it has to know how to handle - * individual NLRI fields, whose encoding is specific to a AFI/SAFI pair. This - * interface exposes an interface for registration of factories for creating - * AdjRIBsIn instances, which handle the specifics. + * Interface for registering AdjRIBsIn factories. In order for a model-driven RIB implementation to work correctly, it + * has to know how to handle individual NLRI fields, whose encoding is specific to a AFI/SAFI pair. This interface + * exposes an interface for registration of factories for creating AdjRIBsIn instances, which handle the specifics. */ public interface RIBExtensionConsumerContext { - AdjRIBsInFactory getAdjRIBsInFactory(Class afi, Class safi); + AdjRIBsInFactory getAdjRIBsInFactory(Class afi, Class safi); } \ No newline at end of file diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RIBExtensionProviderActivator.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RIBExtensionProviderActivator.java index fb2c1d3885..5d43c44f23 100644 --- a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RIBExtensionProviderActivator.java +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RIBExtensionProviderActivator.java @@ -8,6 +8,7 @@ package org.opendaylight.protocol.bgp.rib.spi; public interface RIBExtensionProviderActivator { - void startRIBExtensionProvider(RIBExtensionProviderContext context); - void stopRIBExtensionProvider(); + void startRIBExtensionProvider(RIBExtensionProviderContext context); + + void stopRIBExtensionProvider(); } diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RIBExtensionProviderContext.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RIBExtensionProviderContext.java index fd1187e428..71d6816b1e 100644 --- a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RIBExtensionProviderContext.java +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/RIBExtensionProviderContext.java @@ -11,20 +11,19 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily; /** - * Interface for registering AdjRIBsIn factories. In order for a model-driven - * RIB implementation to work correctly, it has to know how to handle - * individual NLRI fields, whose encoding is specific to a AFI/SAFI pair. This - * interface exposes an interface for registration of factories for creating - * AdjRIBsIn instances, which handle the specifics. + * Interface for registering AdjRIBsIn factories. In order for a model-driven RIB implementation to work correctly, it + * has to know how to handle individual NLRI fields, whose encoding is specific to a AFI/SAFI pair. This interface + * exposes an interface for registration of factories for creating AdjRIBsIn instances, which handle the specifics. */ public interface RIBExtensionProviderContext extends RIBExtensionConsumerContext { - /** - * Register a AdjRIBsInFactory for a particular AFI/SAFI combination. - * - * @param afi Address Family identifier - * @param safi Subsequent Address Family identifier - * @param factory AdjRIBsInFactory - * @return Registration handle. Call its close() method to remove it. - */ - AutoCloseable registerAdjRIBsInFactory(Class afi, Class safi, AdjRIBsInFactory factory); + /** + * Register a AdjRIBsInFactory for a particular AFI/SAFI combination. + * + * @param afi Address Family identifier + * @param safi Subsequent Address Family identifier + * @param factory AdjRIBsInFactory + * @return Registration handle. Call its close() method to remove it. + */ + AutoCloseable registerAdjRIBsInFactory(Class afi, Class safi, + AdjRIBsInFactory factory); } \ No newline at end of file diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/ServiceLoaderRIBExtensionConsumerContext.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/ServiceLoaderRIBExtensionConsumerContext.java index e2251c31b4..5a763bd9bb 100644 --- a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/ServiceLoaderRIBExtensionConsumerContext.java +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/ServiceLoaderRIBExtensionConsumerContext.java @@ -7,43 +7,43 @@ */ package org.opendaylight.protocol.bgp.rib.spi; +import com.google.common.base.Preconditions; + import java.util.ServiceLoader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; - /** * */ public final class ServiceLoaderRIBExtensionConsumerContext extends SimpleRIBExtensionProviderContext implements AutoCloseable { - private static final Logger LOG = LoggerFactory.getLogger(ServiceLoaderRIBExtensionConsumerContext.class); - private final ServiceLoader loader; - - private ServiceLoaderRIBExtensionConsumerContext(final ServiceLoader loader) { - this.loader = Preconditions.checkNotNull(loader); - - for (RIBExtensionProviderActivator a : loader) { - a.startRIBExtensionProvider(this); - } - } - - public static ServiceLoaderRIBExtensionConsumerContext createConsumerContext() { - final ServiceLoader loader = ServiceLoader.load(RIBExtensionProviderActivator.class); - final ServiceLoaderRIBExtensionConsumerContext ctx = new ServiceLoaderRIBExtensionConsumerContext(loader); - - return ctx; - } - - @Override - public void close() { - for (RIBExtensionProviderActivator a : loader) { - try { - a.stopRIBExtensionProvider(); - } catch (RuntimeException e) { - LOG.warn("Stopping activator {} failed", a, e); - } - } - } + private static final Logger LOG = LoggerFactory.getLogger(ServiceLoaderRIBExtensionConsumerContext.class); + private final ServiceLoader loader; + + private ServiceLoaderRIBExtensionConsumerContext(final ServiceLoader loader) { + this.loader = Preconditions.checkNotNull(loader); + + for (RIBExtensionProviderActivator a : loader) { + a.startRIBExtensionProvider(this); + } + } + + public static ServiceLoaderRIBExtensionConsumerContext createConsumerContext() { + final ServiceLoader loader = ServiceLoader.load(RIBExtensionProviderActivator.class); + final ServiceLoaderRIBExtensionConsumerContext ctx = new ServiceLoaderRIBExtensionConsumerContext(loader); + + return ctx; + } + + @Override + public void close() { + for (RIBExtensionProviderActivator a : loader) { + try { + a.stopRIBExtensionProvider(); + } catch (RuntimeException e) { + LOG.warn("Stopping activator {} failed", a, e); + } + } + } } diff --git a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/SimpleRIBExtensionProviderContext.java b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/SimpleRIBExtensionProviderContext.java index 857f3e3d42..077d813913 100644 --- a/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/SimpleRIBExtensionProviderContext.java +++ b/bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/SimpleRIBExtensionProviderContext.java @@ -16,33 +16,33 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily; public class SimpleRIBExtensionProviderContext implements RIBExtensionProviderContext { - private final Map factories = new ConcurrentHashMap<>(); - - @Override - public final synchronized AbstractRegistration registerAdjRIBsInFactory(final Class afi, - final Class safi, final AdjRIBsInFactory factory) { - final TablesKey key = new TablesKey(afi, safi); - - if (this.factories.containsKey(key)) { - throw new IllegalArgumentException("Specified AFI/SAFI combination is already registered"); - } - - this.factories.put(key, factory); - - final Object lock = this; - return new AbstractRegistration() { - @Override - protected void removeRegistration() { - synchronized (lock) { - SimpleRIBExtensionProviderContext.this.factories.remove(key); - } - } - }; - } - - @Override - public final synchronized AdjRIBsInFactory getAdjRIBsInFactory(final Class afi, - final Class safi) { - return this.factories.get(new TablesKey(afi, safi)); - } + private final Map factories = new ConcurrentHashMap<>(); + + @Override + public final synchronized AbstractRegistration registerAdjRIBsInFactory(final Class afi, + final Class safi, final AdjRIBsInFactory factory) { + final TablesKey key = new TablesKey(afi, safi); + + if (this.factories.containsKey(key)) { + throw new IllegalArgumentException("Specified AFI/SAFI combination is already registered"); + } + + this.factories.put(key, factory); + + final Object lock = this; + return new AbstractRegistration() { + @Override + protected void removeRegistration() { + synchronized (lock) { + SimpleRIBExtensionProviderContext.this.factories.remove(key); + } + } + }; + } + + @Override + public final synchronized AdjRIBsInFactory getAdjRIBsInFactory(final Class afi, + final Class safi) { + return this.factories.get(new TablesKey(afi, safi)); + } } diff --git a/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/Main.java b/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/Main.java index 3beecf8048..7d5e4b3d79 100644 --- a/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/Main.java +++ b/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/Main.java @@ -39,81 +39,80 @@ import org.slf4j.LoggerFactory; */ public final class Main { - private static final Logger LOG = LoggerFactory.getLogger(Main.class); + private static final Logger LOG = LoggerFactory.getLogger(Main.class); - private static final String USAGE = "DESCRIPTION:\n" - + "\tCreates a server with given parameters. As long as it runs, it accepts connections " + "from PCCs.\n" + "USAGE:\n" - + "\t-a, --address\n" + "\t\tthe ip address to which is this server bound.\n" - + "\t\tFormat: x.x.x.x:y where y is port number.\n\n" - + "\t\tThis IP address will appear in BGP Open message as BGP Identifier of the server.\n" + + private static final String USAGE = "DESCRIPTION:\n" + + "\tCreates a server with given parameters. As long as it runs, it accepts connections " + "from PCCs.\n" + "USAGE:\n" + + "\t-a, --address\n" + "\t\tthe ip address to which is this server bound.\n" + + "\t\tFormat: x.x.x.x:y where y is port number.\n\n" + + "\t\tThis IP address will appear in BGP Open message as BGP Identifier of the server.\n" + - "\t-as\n" + "\t\t value of AS in the initial open message\n\n" + + "\t-as\n" + "\t\t value of AS in the initial open message\n\n" + - "\t-h, --holdtimer\n" + "\t\tin seconds, value of the desired holdtimer\n" - + "\t\tAccording to RFC4271, recommended value for deadtimer is 90 seconds.\n" - + "\t\tIf not set, this will be the default value.\n\n" + + "\t-h, --holdtimer\n" + "\t\tin seconds, value of the desired holdtimer\n" + + "\t\tAccording to RFC4271, recommended value for deadtimer is 90 seconds.\n" + + "\t\tIf not set, this will be the default value.\n\n" + - "\t--help\n" + "\t\tdisplay this help and exits\n\n" + + "\t--help\n" + "\t\tdisplay this help and exits\n\n" + - "With no parameters, this help is printed."; + "With no parameters, this help is printed."; - private final BGPDispatcherImpl dispatcher; + private final BGPDispatcherImpl dispatcher; - private static final int INITIAL_HOLD_TIME = 90; + private static final int INITIAL_HOLD_TIME = 90; - private static final int RECONNECT_MILLIS = 5000; + private static final int RECONNECT_MILLIS = 5000; - private Main() throws Exception { - BGPActivator bgpActivator = new BGPActivator(); - bgpActivator.start(ServiceLoaderBGPExtensionProviderContext.getSingletonInstance()); - this.dispatcher = new BGPDispatcherImpl(ServiceLoaderBGPExtensionProviderContext.getSingletonInstance().getMessageRegistry(), - new HashedWheelTimer(), new NioEventLoopGroup(), new NioEventLoopGroup()); - } + private Main() throws Exception { + BGPActivator bgpActivator = new BGPActivator(); + bgpActivator.start(ServiceLoaderBGPExtensionProviderContext.getSingletonInstance()); + this.dispatcher = new BGPDispatcherImpl(ServiceLoaderBGPExtensionProviderContext.getSingletonInstance().getMessageRegistry(), new HashedWheelTimer(), new NioEventLoopGroup(), new NioEventLoopGroup()); + } - public static void main(final String[] args) throws Exception { - if (args.length == 0 || (args.length == 1 && args[0].equalsIgnoreCase("--help"))) { - System.err.println(Main.USAGE); - return; - } + public static void main(final String[] args) throws Exception { + if (args.length == 0 || (args.length == 1 && args[0].equalsIgnoreCase("--help"))) { + LOG.info(Main.USAGE); + return; + } - InetSocketAddress address = null; - short holdTimerValue = INITIAL_HOLD_TIME; - AsNumber as = null; + InetSocketAddress address = null; + short holdTimerValue = INITIAL_HOLD_TIME; + AsNumber as = null; - int i = 0; - while (i < args.length) { - if (args[i].equalsIgnoreCase("-a") || args[i].equalsIgnoreCase("--address")) { - final String[] ip = args[i + 1].split(":"); - address = new InetSocketAddress(InetAddress.getByName(ip[0]), Integer.valueOf(ip[1])); - i++; - } else if (args[i].equalsIgnoreCase("-h") || args[i].equalsIgnoreCase("--holdtimer")) { - holdTimerValue = Short.valueOf(args[i + 1]); - i++; - } else if (args[i].equalsIgnoreCase("-as")) { - as = new AsNumber(Long.valueOf(args[i + 1])); - i++; - } else { - LOG.error("WARNING: Unrecognized argument: " + args[i]); - } - i++; - } + int i = 0; + while (i < args.length) { + if (args[i].equalsIgnoreCase("-a") || args[i].equalsIgnoreCase("--address")) { + final String[] ip = args[i + 1].split(":"); + address = new InetSocketAddress(InetAddress.getByName(ip[0]), Integer.valueOf(ip[1])); + i++; + } else if (args[i].equalsIgnoreCase("-h") || args[i].equalsIgnoreCase("--holdtimer")) { + holdTimerValue = Short.valueOf(args[i + 1]); + i++; + } else if (args[i].equalsIgnoreCase("-as")) { + as = new AsNumber(Long.valueOf(args[i + 1])); + i++; + } else { + LOG.error("WARNING: Unrecognized argument: {}", args[i]); + } + i++; + } - final Main m = new Main(); + final Main m = new Main(); - final BGPSessionListener sessionListener = new TestingListener(); + final BGPSessionListener sessionListener = new TestingListener(); - final Map, Class> tables = new HashMap<>(); - tables.put(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); - tables.put(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class); + final Map, Class> tables = new HashMap<>(); + tables.put(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); + tables.put(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class); - final BGPSessionProposalImpl prop = new BGPSessionProposalImpl(holdTimerValue, as, new Ipv4Address("25.25.25.2"), tables); + final BGPSessionProposalImpl prop = new BGPSessionProposalImpl(holdTimerValue, as, new Ipv4Address("25.25.25.2"), tables); - final BGPSessionPreferences proposal = prop.getProposal(); + final BGPSessionPreferences proposal = prop.getProposal(); - LOG.debug("{} {} {}", address, sessionListener, proposal); + LOG.debug("{} {} {}", address, sessionListener, proposal); - final InetSocketAddress addr = address; - m.dispatcher.createClient(addr, proposal, as, sessionListener, - new NeverReconnectStrategy(GlobalEventExecutor.INSTANCE, RECONNECT_MILLIS)); - } + final InetSocketAddress addr = address; + m.dispatcher.createClient(addr, proposal, as, sessionListener, + new NeverReconnectStrategy(GlobalEventExecutor.INSTANCE, RECONNECT_MILLIS)); + } } diff --git a/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/TestingListener.java b/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/TestingListener.java index 545e82bdea..47088e8a0e 100644 --- a/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/TestingListener.java +++ b/bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/TestingListener.java @@ -18,26 +18,26 @@ import org.slf4j.LoggerFactory; * Testing BGP Listener. */ public class TestingListener implements BGPSessionListener { - private static final Logger LOG = LoggerFactory.getLogger(TestingListener.class); + private static final Logger LOG = LoggerFactory.getLogger(TestingListener.class); - @Override - public void onMessage(final BGPSession session, final Notification message) { - LOG.info("Client Listener: message received: {}", message.toString()); - } + @Override + public void onMessage(final BGPSession session, final Notification message) { + LOG.info("Client Listener: message received: {}", message.toString()); + } - @Override - public void onSessionUp(final BGPSession session) { - LOG.info("Client Listener: Session Up."); - } + @Override + public void onSessionUp(final BGPSession session) { + LOG.info("Client Listener: Session Up."); + } - @Override - public void onSessionDown(final BGPSession session, final Exception e) { - LOG.info("Client Listener: Connection lost."); - session.close(); - } + @Override + public void onSessionDown(final BGPSession session, final Exception e) { + LOG.info("Client Listener: Connection lost."); + session.close(); + } - @Override - public void onSessionTerminated(final BGPSession session, final BGPTerminationReason cause) { - LOG.info("Client Listener: Connection lost: {}.", cause); - } + @Override + public void onSessionTerminated(final BGPSession session, final BGPTerminationReason cause) { + LOG.info("Client Listener: Connection lost: {}.", cause); + } } diff --git a/bgp/testtool/src/test/java/org/opendaylight/protocol/bgp/testtool/BGPSpeakerMock.java b/bgp/testtool/src/test/java/org/opendaylight/protocol/bgp/testtool/BGPSpeakerMock.java index 4b85141182..cf664521f8 100644 --- a/bgp/testtool/src/test/java/org/opendaylight/protocol/bgp/testtool/BGPSpeakerMock.java +++ b/bgp/testtool/src/test/java/org/opendaylight/protocol/bgp/testtool/BGPSpeakerMock.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.bgp.testtool; +import com.google.common.base.Preconditions; + import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.util.HashedWheelTimer; @@ -40,52 +42,50 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily; import org.opendaylight.yangtools.yang.binding.Notification; -import com.google.common.base.Preconditions; - public class BGPSpeakerMock, L extends SessionListener> extends AbstractDispatcher { - private final SessionNegotiatorFactory negotiatorFactory; - private final BGPHandlerFactory factory; + private final SessionNegotiatorFactory negotiatorFactory; + private final BGPHandlerFactory factory; - public BGPSpeakerMock(final SessionNegotiatorFactory negotiatorFactory, final BGPHandlerFactory factory, - final DefaultPromise defaultPromise) { - super(GlobalEventExecutor.INSTANCE, new NioEventLoopGroup(), new NioEventLoopGroup()); - this.negotiatorFactory = Preconditions.checkNotNull(negotiatorFactory); - this.factory = Preconditions.checkNotNull(factory); - } + public BGPSpeakerMock(final SessionNegotiatorFactory negotiatorFactory, final BGPHandlerFactory factory, + final DefaultPromise defaultPromise) { + super(GlobalEventExecutor.INSTANCE, new NioEventLoopGroup(), new NioEventLoopGroup()); + this.negotiatorFactory = Preconditions.checkNotNull(negotiatorFactory); + this.factory = Preconditions.checkNotNull(factory); + } - public void createServer(final InetSocketAddress address, final SessionListenerFactory listenerFactory) { - super.createServer(address, new PipelineInitializer() { + public void createServer(final InetSocketAddress address, final SessionListenerFactory listenerFactory) { + super.createServer(address, new PipelineInitializer() { - @Override - public void initializeChannel(final SocketChannel ch, final Promise promise) { - ch.pipeline().addLast(BGPSpeakerMock.this.factory.getDecoders()); - ch.pipeline().addLast("negotiator", - BGPSpeakerMock.this.negotiatorFactory.getSessionNegotiator(listenerFactory, ch, promise)); - ch.pipeline().addLast(BGPSpeakerMock.this.factory.getEncoders()); - } - }); - } + @Override + public void initializeChannel(final SocketChannel ch, final Promise promise) { + ch.pipeline().addLast(BGPSpeakerMock.this.factory.getDecoders()); + ch.pipeline().addLast("negotiator", + BGPSpeakerMock.this.negotiatorFactory.getSessionNegotiator(listenerFactory, ch, promise)); + ch.pipeline().addLast(BGPSpeakerMock.this.factory.getEncoders()); + } + }); + } - public static void main(final String[] args) throws Exception { + public static void main(final String[] args) throws Exception { - final SessionListenerFactory f = new SessionListenerFactory() { - @Override - public BGPSessionListener getSessionListener() { - return new SpeakerSessionListener(); - } - }; + final SessionListenerFactory f = new SessionListenerFactory() { + @Override + public BGPSessionListener getSessionListener() { + return new SpeakerSessionListener(); + } + }; - final Map, Class> tables = new HashMap<>(); - tables.put(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); - tables.put(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class); + final Map, Class> tables = new HashMap<>(); + tables.put(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); + tables.put(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class); - final BGPSessionPreferences prefs = new BGPSessionProposalImpl((short) 90, new AsNumber(72L), new Ipv4Address("127.0.0.2"), tables).getProposal(); + final BGPSessionPreferences prefs = new BGPSessionProposalImpl((short) 90, new AsNumber(72L), new Ipv4Address("127.0.0.2"), tables).getProposal(); - final SessionNegotiatorFactory snf = new BGPSessionNegotiatorFactory(new HashedWheelTimer(), prefs, new AsNumber(72L)); + final SessionNegotiatorFactory snf = new BGPSessionNegotiatorFactory(new HashedWheelTimer(), prefs, new AsNumber(72L)); - final BGPSpeakerMock mock = new BGPSpeakerMock<>(snf, new BGPHandlerFactory(ServiceLoaderBGPExtensionProviderContext.getSingletonInstance().getMessageRegistry()), new DefaultPromise(GlobalEventExecutor.INSTANCE)); + final BGPSpeakerMock mock = new BGPSpeakerMock<>(snf, new BGPHandlerFactory(ServiceLoaderBGPExtensionProviderContext.getSingletonInstance().getMessageRegistry()), new DefaultPromise(GlobalEventExecutor.INSTANCE)); - mock.createServer(new InetSocketAddress("127.0.0.2", 12345), f); - } + mock.createServer(new InetSocketAddress("127.0.0.2", 12345), f); + } } diff --git a/bgp/testtool/src/test/java/org/opendaylight/protocol/bgp/testtool/SpeakerSessionListener.java b/bgp/testtool/src/test/java/org/opendaylight/protocol/bgp/testtool/SpeakerSessionListener.java index edc271ca98..afd98896d3 100644 --- a/bgp/testtool/src/test/java/org/opendaylight/protocol/bgp/testtool/SpeakerSessionListener.java +++ b/bgp/testtool/src/test/java/org/opendaylight/protocol/bgp/testtool/SpeakerSessionListener.java @@ -15,28 +15,28 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SpeakerSessionListener implements BGPSessionListener { - private static final Logger logger = LoggerFactory.getLogger(SpeakerSessionListener.class); + private static final Logger LOG = LoggerFactory.getLogger(SpeakerSessionListener.class); - @Override - public void onSessionUp(final BGPSession session) { - logger.info("Server: Session is up."); - } + @Override + public void onSessionUp(final BGPSession session) { + LOG.info("Server: Session is up."); + } - @Override - public void onSessionTerminated(final BGPSession session, final BGPTerminationReason cause) { - logger.info("Server: Session terminated: {}", cause); - } + @Override + public void onSessionTerminated(final BGPSession session, final BGPTerminationReason cause) { + LOG.info("Server: Session terminated: {}", cause); + } - @Override - public void onSessionDown(final BGPSession session, final Exception e) { - logger.info("Server: Session down."); - session.close(); - // this.d.stop(); - } + @Override + public void onSessionDown(final BGPSession session, final Exception e) { + LOG.info("Server: Session down."); + session.close(); + // this.d.stop(); + } - @Override - public void onMessage(final BGPSession session, final Notification message) { - logger.info("Server: Message received: {}", message); - // this.d.stop(); - } + @Override + public void onMessage(final BGPSession session, final Notification message) { + LOG.info("Server: Message received: {}", message); + // this.d.stop(); + } } diff --git a/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv4ReachabilityTopologyBuilderModule.java b/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv4ReachabilityTopologyBuilderModule.java index 2f05e459bc..721a3f8b60 100644 --- a/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv4ReachabilityTopologyBuilderModule.java +++ b/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv4ReachabilityTopologyBuilderModule.java @@ -31,51 +31,52 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - /** * */ -public final class Ipv4ReachabilityTopologyBuilderModule extends org.opendaylight.controller.config.yang.bgp.topology.provider.AbstractIpv4ReachabilityTopologyBuilderModule -{ - private static final Logger LOG = LoggerFactory.getLogger(Ipv4ReachabilityTopologyBuilderModule.class); +public final class Ipv4ReachabilityTopologyBuilderModule extends + org.opendaylight.controller.config.yang.bgp.topology.provider.AbstractIpv4ReachabilityTopologyBuilderModule { + private static final Logger LOG = LoggerFactory.getLogger(Ipv4ReachabilityTopologyBuilderModule.class); - public Ipv4ReachabilityTopologyBuilderModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { - super(identifier, dependencyResolver); - } + public Ipv4ReachabilityTopologyBuilderModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } - public Ipv4ReachabilityTopologyBuilderModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, final Ipv4ReachabilityTopologyBuilderModule oldModule, final java.lang.AutoCloseable oldInstance) { - super(identifier, dependencyResolver, oldModule, oldInstance); - } + public Ipv4ReachabilityTopologyBuilderModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, + final Ipv4ReachabilityTopologyBuilderModule oldModule, final java.lang.AutoCloseable oldInstance) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } - @Override - public void validate(){ - super.validate(); - JmxAttributeValidationException.checkNotNull(getTopologyId(), - "is not set.", topologyIdJmxAttribute); - } + @Override + public void validate() { + super.validate(); + JmxAttributeValidationException.checkNotNull(getTopologyId(), "is not set.", topologyIdJmxAttribute); + } - @Override - public java.lang.AutoCloseable createInstance() { - final Ipv4ReachabilityTopologyBuilder b = new Ipv4ReachabilityTopologyBuilder(getDataProviderDependency(), getLocalRibDependency(), getTopologyId()); - final InstanceIdentifier i = b.tableInstanceIdentifier(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); - final ListenerRegistration r = getDataProviderDependency().registerDataChangeListener(i, b); - LOG.debug("Registered listener {} on {} (topology {})", b, i, b.getInstanceIdentifier()); + @Override + public java.lang.AutoCloseable createInstance() { + final Ipv4ReachabilityTopologyBuilder b = new Ipv4ReachabilityTopologyBuilder(getDataProviderDependency(), getLocalRibDependency(), getTopologyId()); + final InstanceIdentifier i = b.tableInstanceIdentifier(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class); + final ListenerRegistration r = getDataProviderDependency().registerDataChangeListener(i, b); + LOG.debug("Registered listener {} on {} (topology {})", b, i, b.getInstanceIdentifier()); - final class TopologyReferenceAutocloseable extends DefaultTopologyReference implements AutoCloseable { - public TopologyReferenceAutocloseable(final InstanceIdentifier instanceIdentifier) { - super(instanceIdentifier); - } + final class TopologyReferenceAutocloseable extends DefaultTopologyReference implements AutoCloseable { + public TopologyReferenceAutocloseable(final InstanceIdentifier instanceIdentifier) { + super(instanceIdentifier); + } - @Override - public void close() throws InterruptedException, ExecutionException { - try { - r.close(); - } finally { - b.close(); - } - } - } + @Override + public void close() throws InterruptedException, ExecutionException { + try { + r.close(); + } finally { + b.close(); + } + } + } - return new TopologyReferenceAutocloseable(b.getInstanceIdentifier()); - } + return new TopologyReferenceAutocloseable(b.getInstanceIdentifier()); + } } diff --git a/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv4ReachabilityTopologyBuilderModuleFactory.java b/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv4ReachabilityTopologyBuilderModuleFactory.java index 03779c81a7..1acc3f0d00 100644 --- a/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv4ReachabilityTopologyBuilderModuleFactory.java +++ b/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv4ReachabilityTopologyBuilderModuleFactory.java @@ -19,8 +19,7 @@ package org.opendaylight.controller.config.yang.bgp.topology.provider; /** * */ -public class Ipv4ReachabilityTopologyBuilderModuleFactory extends org.opendaylight.controller.config.yang.bgp.topology.provider.AbstractIpv4ReachabilityTopologyBuilderModuleFactory -{ - +public class Ipv4ReachabilityTopologyBuilderModuleFactory extends + org.opendaylight.controller.config.yang.bgp.topology.provider.AbstractIpv4ReachabilityTopologyBuilderModuleFactory { } diff --git a/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv6ReachabilityTopologyBuilderModule.java b/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv6ReachabilityTopologyBuilderModule.java index 53d0aa513d..9f5050d6a2 100644 --- a/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv6ReachabilityTopologyBuilderModule.java +++ b/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv6ReachabilityTopologyBuilderModule.java @@ -34,47 +34,49 @@ import org.slf4j.LoggerFactory; /** * */ -public final class Ipv6ReachabilityTopologyBuilderModule extends org.opendaylight.controller.config.yang.bgp.topology.provider.AbstractIpv6ReachabilityTopologyBuilderModule -{ - private static final Logger LOG = LoggerFactory.getLogger(Ipv6ReachabilityTopologyBuilderModule.class); +public final class Ipv6ReachabilityTopologyBuilderModule extends + org.opendaylight.controller.config.yang.bgp.topology.provider.AbstractIpv6ReachabilityTopologyBuilderModule { + private static final Logger LOG = LoggerFactory.getLogger(Ipv6ReachabilityTopologyBuilderModule.class); - public Ipv6ReachabilityTopologyBuilderModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { - super(identifier, dependencyResolver); - } + public Ipv6ReachabilityTopologyBuilderModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } - public Ipv6ReachabilityTopologyBuilderModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, final Ipv6ReachabilityTopologyBuilderModule oldModule, final java.lang.AutoCloseable oldInstance) { - super(identifier, dependencyResolver, oldModule, oldInstance); - } + public Ipv6ReachabilityTopologyBuilderModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, + final Ipv6ReachabilityTopologyBuilderModule oldModule, final java.lang.AutoCloseable oldInstance) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } - @Override - public void validate(){ - super.validate(); - JmxAttributeValidationException.checkNotNull(getTopologyId(), - "is not set.", topologyIdJmxAttribute); - } + @Override + public void validate() { + super.validate(); + JmxAttributeValidationException.checkNotNull(getTopologyId(), "is not set.", topologyIdJmxAttribute); + } - @Override - public java.lang.AutoCloseable createInstance() { - final Ipv6ReachabilityTopologyBuilder b = new Ipv6ReachabilityTopologyBuilder(getDataProviderDependency(), getLocalRibDependency(), getTopologyId()); - final InstanceIdentifier i = b.tableInstanceIdentifier(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class); - final ListenerRegistration r = getDataProviderDependency().registerDataChangeListener(i, b); - LOG.debug("Registered listener {} on {} (topology {})", b, i, b.getInstanceIdentifier()); + @Override + public java.lang.AutoCloseable createInstance() { + final Ipv6ReachabilityTopologyBuilder b = new Ipv6ReachabilityTopologyBuilder(getDataProviderDependency(), getLocalRibDependency(), getTopologyId()); + final InstanceIdentifier i = b.tableInstanceIdentifier(Ipv6AddressFamily.class, UnicastSubsequentAddressFamily.class); + final ListenerRegistration r = getDataProviderDependency().registerDataChangeListener(i, b); + LOG.debug("Registered listener {} on {} (topology {})", b, i, b.getInstanceIdentifier()); - final class TopologyReferenceAutocloseable extends DefaultTopologyReference implements AutoCloseable { - public TopologyReferenceAutocloseable(final InstanceIdentifier instanceIdentifier) { - super(instanceIdentifier); - } + final class TopologyReferenceAutocloseable extends DefaultTopologyReference implements AutoCloseable { + public TopologyReferenceAutocloseable(final InstanceIdentifier instanceIdentifier) { + super(instanceIdentifier); + } - @Override - public void close() throws InterruptedException, ExecutionException { - try { - r.close(); - } finally { - b.close(); - } - } - } + @Override + public void close() throws InterruptedException, ExecutionException { + try { + r.close(); + } finally { + b.close(); + } + } + } - return new TopologyReferenceAutocloseable(b.getInstanceIdentifier()); - } + return new TopologyReferenceAutocloseable(b.getInstanceIdentifier()); + } } diff --git a/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv6ReachabilityTopologyBuilderModuleFactory.java b/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv6ReachabilityTopologyBuilderModuleFactory.java index 2c9ffb7b97..50f775b4e1 100644 --- a/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv6ReachabilityTopologyBuilderModuleFactory.java +++ b/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv6ReachabilityTopologyBuilderModuleFactory.java @@ -19,8 +19,7 @@ package org.opendaylight.controller.config.yang.bgp.topology.provider; /** * */ -public class Ipv6ReachabilityTopologyBuilderModuleFactory extends org.opendaylight.controller.config.yang.bgp.topology.provider.AbstractIpv6ReachabilityTopologyBuilderModuleFactory -{ - +public class Ipv6ReachabilityTopologyBuilderModuleFactory extends + org.opendaylight.controller.config.yang.bgp.topology.provider.AbstractIpv6ReachabilityTopologyBuilderModuleFactory { } diff --git a/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/LinkstateTopologyBuilderModule.java b/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/LinkstateTopologyBuilderModule.java index 51faca02a6..b547b9ed1d 100644 --- a/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/LinkstateTopologyBuilderModule.java +++ b/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/LinkstateTopologyBuilderModule.java @@ -31,51 +31,52 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - /** * */ -public final class LinkstateTopologyBuilderModule extends org.opendaylight.controller.config.yang.bgp.topology.provider.AbstractLinkstateTopologyBuilderModule -{ - private static final Logger LOG = LoggerFactory.getLogger(LinkstateTopologyBuilderModule.class); +public final class LinkstateTopologyBuilderModule extends + org.opendaylight.controller.config.yang.bgp.topology.provider.AbstractLinkstateTopologyBuilderModule { + private static final Logger LOG = LoggerFactory.getLogger(LinkstateTopologyBuilderModule.class); - public LinkstateTopologyBuilderModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { - super(identifier, dependencyResolver); - } + public LinkstateTopologyBuilderModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } - public LinkstateTopologyBuilderModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, final LinkstateTopologyBuilderModule oldModule, final java.lang.AutoCloseable oldInstance) { - super(identifier, dependencyResolver, oldModule, oldInstance); - } + public LinkstateTopologyBuilderModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier, + final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, + final LinkstateTopologyBuilderModule oldModule, final java.lang.AutoCloseable oldInstance) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } - @Override - public void validate(){ - super.validate(); - JmxAttributeValidationException.checkNotNull(getTopologyId(), - "is not set.", topologyIdJmxAttribute); - } + @Override + public void validate() { + super.validate(); + JmxAttributeValidationException.checkNotNull(getTopologyId(), "is not set.", topologyIdJmxAttribute); + } - @Override - public java.lang.AutoCloseable createInstance() { - final LinkstateTopologyBuilder b = new LinkstateTopologyBuilder(getDataProviderDependency(), getLocalRibDependency(), getTopologyId()); - final InstanceIdentifier i = b.tableInstanceIdentifier(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class); - final ListenerRegistration r = getDataProviderDependency().registerDataChangeListener(i, b); - LOG.debug("Registered listener {} on {} (topology {})", b, i, b.getInstanceIdentifier()); + @Override + public java.lang.AutoCloseable createInstance() { + final LinkstateTopologyBuilder b = new LinkstateTopologyBuilder(getDataProviderDependency(), getLocalRibDependency(), getTopologyId()); + final InstanceIdentifier i = b.tableInstanceIdentifier(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class); + final ListenerRegistration r = getDataProviderDependency().registerDataChangeListener(i, b); + LOG.debug("Registered listener {} on {} (topology {})", b, i, b.getInstanceIdentifier()); - final class TopologyReferenceAutocloseable extends DefaultTopologyReference implements AutoCloseable { - public TopologyReferenceAutocloseable(final InstanceIdentifier instanceIdentifier) { - super(instanceIdentifier); - } + final class TopologyReferenceAutocloseable extends DefaultTopologyReference implements AutoCloseable { + public TopologyReferenceAutocloseable(final InstanceIdentifier instanceIdentifier) { + super(instanceIdentifier); + } - @Override - public void close() throws InterruptedException, ExecutionException { - try { - r.close(); - } finally { - b.close(); - } - } - } + @Override + public void close() throws InterruptedException, ExecutionException { + try { + r.close(); + } finally { + b.close(); + } + } + } - return new TopologyReferenceAutocloseable(b.getInstanceIdentifier()); - } + return new TopologyReferenceAutocloseable(b.getInstanceIdentifier()); + } } diff --git a/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/LinkstateTopologyBuilderModuleFactory.java b/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/LinkstateTopologyBuilderModuleFactory.java index eef9c8c679..643a5754a8 100644 --- a/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/LinkstateTopologyBuilderModuleFactory.java +++ b/bgp/topology-provider-config/src/main/java/org/opendaylight/controller/config/yang/bgp/topology/provider/LinkstateTopologyBuilderModuleFactory.java @@ -19,8 +19,7 @@ package org.opendaylight.controller.config.yang.bgp.topology.provider; /** * */ -public class LinkstateTopologyBuilderModuleFactory extends org.opendaylight.controller.config.yang.bgp.topology.provider.AbstractLinkstateTopologyBuilderModuleFactory -{ - +public class LinkstateTopologyBuilderModuleFactory extends + org.opendaylight.controller.config.yang.bgp.topology.provider.AbstractLinkstateTopologyBuilderModuleFactory { } diff --git a/bgp/topology-provider-config/src/test/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv4ReachabilityTopologyBuilderModuleTest.java b/bgp/topology-provider-config/src/test/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv4ReachabilityTopologyBuilderModuleTest.java index d9e62b52fb..cda3b36407 100644 --- a/bgp/topology-provider-config/src/test/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv4ReachabilityTopologyBuilderModuleTest.java +++ b/bgp/topology-provider-config/src/test/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv4ReachabilityTopologyBuilderModuleTest.java @@ -74,8 +74,8 @@ public class Ipv4ReachabilityTopologyBuilderModuleTest extends AbstractRIBImplMo createIpv4ReachabilityTopoBuilderModuleInstance(); final ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction(); assertBeanCount(1, FACTORY_NAME); - final Ipv4ReachabilityTopologyBuilderModuleMXBean mxBean = transaction.newMXBeanProxy( - transaction.lookupConfigBean(FACTORY_NAME, INSTANCE_NAME), Ipv4ReachabilityTopologyBuilderModuleMXBean.class); + final Ipv4ReachabilityTopologyBuilderModuleMXBean mxBean = transaction.newMXBeanProxy(transaction.lookupConfigBean(FACTORY_NAME, + INSTANCE_NAME), Ipv4ReachabilityTopologyBuilderModuleMXBean.class); mxBean.setTopologyId(new TopologyId("new-bgp-topology")); final CommitStatus status = transaction.commit(); assertBeanCount(1, FACTORY_NAME); @@ -88,7 +88,7 @@ public class Ipv4ReachabilityTopologyBuilderModuleTest extends AbstractRIBImplMo private CommitStatus createIpv4ReachabilityTopoBuilderModuleInstance(final TopologyId topologyId) throws Exception { final ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction(); - final ObjectName ipv4ReachabilityBuilderON = transaction.createModule(FACTORY_NAME, INSTANCE_NAME); + final ObjectName ipv4ReachabilityBuilderON = transaction.createModule(FACTORY_NAME, INSTANCE_NAME); final Ipv4ReachabilityTopologyBuilderModuleMXBean mxBean = transaction.newMXBeanProxy(ipv4ReachabilityBuilderON, Ipv4ReachabilityTopologyBuilderModuleMXBean.class); final ObjectName dataBrokerON = createDataBrokerInstance(transaction); diff --git a/bgp/topology-provider-config/src/test/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv6ReachabilityTopologyBuilderModuleTest.java b/bgp/topology-provider-config/src/test/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv6ReachabilityTopologyBuilderModuleTest.java index 815d4abe82..d72ef531a1 100644 --- a/bgp/topology-provider-config/src/test/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv6ReachabilityTopologyBuilderModuleTest.java +++ b/bgp/topology-provider-config/src/test/java/org/opendaylight/controller/config/yang/bgp/topology/provider/Ipv6ReachabilityTopologyBuilderModuleTest.java @@ -74,8 +74,8 @@ public class Ipv6ReachabilityTopologyBuilderModuleTest extends AbstractRIBImplMo createIpv6ReachabilityTopoBuilderModuleInstance(); final ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction(); assertBeanCount(1, FACTORY_NAME); - final Ipv6ReachabilityTopologyBuilderModuleMXBean mxBean = transaction.newMXBeanProxy( - transaction.lookupConfigBean(FACTORY_NAME, INSTANCE_NAME), Ipv6ReachabilityTopologyBuilderModuleMXBean.class); + final Ipv6ReachabilityTopologyBuilderModuleMXBean mxBean = transaction.newMXBeanProxy(transaction.lookupConfigBean(FACTORY_NAME, + INSTANCE_NAME), Ipv6ReachabilityTopologyBuilderModuleMXBean.class); mxBean.setTopologyId(new TopologyId("new-bgp-topology")); final CommitStatus status = transaction.commit(); assertBeanCount(1, FACTORY_NAME); @@ -88,8 +88,9 @@ public class Ipv6ReachabilityTopologyBuilderModuleTest extends AbstractRIBImplMo private CommitStatus createIpv6ReachabilityTopoBuilderModuleInstance(final TopologyId topologyId) throws Exception { final ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction(); - final ObjectName ipv6ReachabilityBuilderON = transaction.createModule(FACTORY_NAME, INSTANCE_NAME); - final Ipv6ReachabilityTopologyBuilderModuleMXBean mxBean = transaction.newMXBeanProxy(ipv6ReachabilityBuilderON, Ipv6ReachabilityTopologyBuilderModuleMXBean.class); + final ObjectName ipv6ReachabilityBuilderON = transaction.createModule(FACTORY_NAME, INSTANCE_NAME); + final Ipv6ReachabilityTopologyBuilderModuleMXBean mxBean = transaction.newMXBeanProxy(ipv6ReachabilityBuilderON, + Ipv6ReachabilityTopologyBuilderModuleMXBean.class); final ObjectName dataBrokerON = createDataBrokerInstance(transaction); mxBean.setDataProvider(dataBrokerON); mxBean.setLocalRib(createRIBImplModuleInstance(transaction, dataBrokerON)); diff --git a/bgp/topology-provider-config/src/test/java/org/opendaylight/controller/config/yang/bgp/topology/provider/LinkstateTopologyBuilderModuleTest.java b/bgp/topology-provider-config/src/test/java/org/opendaylight/controller/config/yang/bgp/topology/provider/LinkstateTopologyBuilderModuleTest.java index 7c35b86ad5..0792faff0a 100644 --- a/bgp/topology-provider-config/src/test/java/org/opendaylight/controller/config/yang/bgp/topology/provider/LinkstateTopologyBuilderModuleTest.java +++ b/bgp/topology-provider-config/src/test/java/org/opendaylight/controller/config/yang/bgp/topology/provider/LinkstateTopologyBuilderModuleTest.java @@ -74,8 +74,8 @@ public class LinkstateTopologyBuilderModuleTest extends AbstractRIBImplModuleTes createLinkstateTopologyBuilderModuleInstance(); final ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction(); assertBeanCount(1, FACTORY_NAME); - final LinkstateTopologyBuilderModuleMXBean mxBean = transaction.newMXBeanProxy( - transaction.lookupConfigBean(FACTORY_NAME, INSTANCE_NAME), LinkstateTopologyBuilderModuleMXBean.class); + final LinkstateTopologyBuilderModuleMXBean mxBean = transaction.newMXBeanProxy(transaction.lookupConfigBean(FACTORY_NAME, + INSTANCE_NAME), LinkstateTopologyBuilderModuleMXBean.class); mxBean.setTopologyId(new TopologyId("new-bgp-topology")); final CommitStatus status = transaction.commit(); assertBeanCount(1, FACTORY_NAME); @@ -88,8 +88,9 @@ public class LinkstateTopologyBuilderModuleTest extends AbstractRIBImplModuleTes private CommitStatus createLinkstateTopologyBuilderModuleInstance(final TopologyId topologyId) throws Exception { final ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction(); - final ObjectName linkstateTopoBuilderON = transaction.createModule(FACTORY_NAME, INSTANCE_NAME); - final LinkstateTopologyBuilderModuleMXBean mxBean = transaction.newMXBeanProxy(linkstateTopoBuilderON, LinkstateTopologyBuilderModuleMXBean.class); + final ObjectName linkstateTopoBuilderON = transaction.createModule(FACTORY_NAME, INSTANCE_NAME); + final LinkstateTopologyBuilderModuleMXBean mxBean = transaction.newMXBeanProxy(linkstateTopoBuilderON, + LinkstateTopologyBuilderModuleMXBean.class); final ObjectName dataBrokerON = createDataBrokerInstance(transaction); mxBean.setDataProvider(dataBrokerON); mxBean.setLocalRib(createRIBImplModuleInstance(transaction, dataBrokerON)); diff --git a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractReachabilityTopologyBuilder.java b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractReachabilityTopologyBuilder.java index 9fd970d611..b0eb67fdd4 100644 --- a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractReachabilityTopologyBuilder.java +++ b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractReachabilityTopologyBuilder.java @@ -40,87 +40,86 @@ import org.slf4j.LoggerFactory; * */ abstract class AbstractReachabilityTopologyBuilder extends AbstractTopologyBuilder { - private static final Logger LOG = LoggerFactory.getLogger(AbstractReachabilityTopologyBuilder.class); - - protected AbstractReachabilityTopologyBuilder(final DataProviderService dataProvider, final RibReference locRibReference, final TopologyId topologyId, - final Class idClass) { - super(dataProvider, locRibReference, topologyId, new TopologyTypesBuilder().build(), idClass); - } - - private NodeId advertizingNode(final Attributes attrs) { - final CNextHop nh = attrs.getCNextHop(); - if (nh instanceof Ipv4NextHopCase) { - final Ipv4NextHop ipv4 = ((Ipv4NextHopCase) nh).getIpv4NextHop(); - - return new NodeId(ipv4.getGlobal().getValue()); - } else if (nh instanceof Ipv6NextHopCase) { - final Ipv6NextHop ipv6 = ((Ipv6NextHopCase) nh).getIpv6NextHop(); - - return new NodeId(ipv6.getGlobal().getValue()); - } else { - LOG.warn("Unhandled next hop class {}", nh.getImplementedInterface()); - return null; - } - } - - private InstanceIdentifier nodeInstanceId(final NodeId ni) { - return getInstanceIdentifier().builder().child(Node.class, new NodeKey(ni)).augmentation(Node1.class).toInstance(); - } - - private InstanceIdentifier ensureNodePresent(final DataModification, DataObject> trans, final NodeId ni) { - final InstanceIdentifier nii = nodeInstanceId(ni); - LOG.debug("Looking for pre-existing node at {}", nii); - - if (trans.readOperationalData(nii) == null) { - LOG.debug("Create a new node at {}", nii); - trans.putOperationalData( - nii, - new Node1Builder().setIgpNodeAttributes(new IgpNodeAttributesBuilder().setPrefix(new ArrayList()).build()).build()); - } - - return nii; - } - - private void removeEmptyNode(final DataModification, DataObject> trans, final InstanceIdentifier nii) { - final Node1 node = (Node1) trans.readOperationalData(nii); - if (node != null && node.getIgpNodeAttributes().getPrefix().isEmpty()) { - trans.removeOperationalData(nii); - } - } - - protected abstract Attributes getAttributes(final T value); - - protected abstract IpPrefix getPrefix(final T value); - - @Override - protected final void createObject(final DataModification, DataObject> trans, final InstanceIdentifier id, - final T value) { - final NodeId ni = advertizingNode(getAttributes(value)); - final InstanceIdentifier nii = ensureNodePresent(trans, ni); - - final IpPrefix prefix = getPrefix(value); - final PrefixKey pk = new PrefixKey(prefix); - - trans.putOperationalData( - nii.builder().child( - org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.IgpNodeAttributes.class).child( - Prefix.class, pk).toInstance(), new PrefixBuilder().setKey(pk).setPrefix(prefix).build()); - } - - @Override - protected final void removeObject(final DataModification, DataObject> trans, final InstanceIdentifier id, - final T value) { - final NodeId ni = advertizingNode(getAttributes(value)); - final InstanceIdentifier nii = nodeInstanceId(ni); - - final IpPrefix prefix = getPrefix(value); - final PrefixKey pk = new PrefixKey(prefix); - - trans.removeOperationalData(nii.builder().child( - org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.IgpNodeAttributes.class).child( - Prefix.class, pk).toInstance()); - - removeEmptyNode(trans, nii); - } + private static final Logger LOG = LoggerFactory.getLogger(AbstractReachabilityTopologyBuilder.class); + + protected AbstractReachabilityTopologyBuilder(final DataProviderService dataProvider, final RibReference locRibReference, + final TopologyId topologyId, final Class idClass) { + super(dataProvider, locRibReference, topologyId, new TopologyTypesBuilder().build(), idClass); + } + + private NodeId advertizingNode(final Attributes attrs) { + final CNextHop nh = attrs.getCNextHop(); + if (nh instanceof Ipv4NextHopCase) { + final Ipv4NextHop ipv4 = ((Ipv4NextHopCase) nh).getIpv4NextHop(); + + return new NodeId(ipv4.getGlobal().getValue()); + } else if (nh instanceof Ipv6NextHopCase) { + final Ipv6NextHop ipv6 = ((Ipv6NextHopCase) nh).getIpv6NextHop(); + + return new NodeId(ipv6.getGlobal().getValue()); + } else { + LOG.warn("Unhandled next hop class {}", nh.getImplementedInterface()); + return null; + } + } + + private InstanceIdentifier nodeInstanceId(final NodeId ni) { + return getInstanceIdentifier().builder().child(Node.class, new NodeKey(ni)).augmentation(Node1.class).toInstance(); + } + + private InstanceIdentifier ensureNodePresent(final DataModification, DataObject> trans, final NodeId ni) { + final InstanceIdentifier nii = nodeInstanceId(ni); + LOG.debug("Looking for pre-existing node at {}", nii); + + if (trans.readOperationalData(nii) == null) { + LOG.debug("Create a new node at {}", nii); + trans.putOperationalData(nii, new Node1Builder().setIgpNodeAttributes( + new IgpNodeAttributesBuilder().setPrefix(new ArrayList()).build()).build()); + } + + return nii; + } + + private void removeEmptyNode(final DataModification, DataObject> trans, final InstanceIdentifier nii) { + final Node1 node = (Node1) trans.readOperationalData(nii); + if (node != null && node.getIgpNodeAttributes().getPrefix().isEmpty()) { + trans.removeOperationalData(nii); + } + } + + protected abstract Attributes getAttributes(final T value); + + protected abstract IpPrefix getPrefix(final T value); + + @Override + protected final void createObject(final DataModification, DataObject> trans, final InstanceIdentifier id, + final T value) { + final NodeId ni = advertizingNode(getAttributes(value)); + final InstanceIdentifier nii = ensureNodePresent(trans, ni); + + final IpPrefix prefix = getPrefix(value); + final PrefixKey pk = new PrefixKey(prefix); + + trans.putOperationalData( + nii.builder().child( + org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.IgpNodeAttributes.class).child( + Prefix.class, pk).toInstance(), new PrefixBuilder().setKey(pk).setPrefix(prefix).build()); + } + + @Override + protected final void removeObject(final DataModification, DataObject> trans, final InstanceIdentifier id, + final T value) { + final NodeId ni = advertizingNode(getAttributes(value)); + final InstanceIdentifier nii = nodeInstanceId(ni); + + final IpPrefix prefix = getPrefix(value); + final PrefixKey pk = new PrefixKey(prefix); + + trans.removeOperationalData(nii.builder().child( + org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.nt.l3.unicast.igp.topology.rev131021.igp.node.attributes.IgpNodeAttributes.class).child( + Prefix.class, pk).toInstance()); + + removeEmptyNode(trans, nii); + } } diff --git a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractTopologyBuilder.java b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractTopologyBuilder.java index de32c9b73c..e34aa46566 100644 --- a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractTopologyBuilder.java +++ b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/AbstractTopologyBuilder.java @@ -7,6 +7,11 @@ */ package org.opendaylight.bgpcep.bgp.topology.provider; +import com.google.common.base.Preconditions; +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.JdkFutureAdapters; + import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -38,147 +43,146 @@ import org.opendaylight.yangtools.yang.common.RpcResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.JdkFutureAdapters; - public abstract class AbstractTopologyBuilder implements AutoCloseable, DataChangeListener, LocRIBListener, -TopologyReference { - private static final Logger LOG = LoggerFactory.getLogger(AbstractTopologyBuilder.class); - private final RibReference locRibReference; - private final InstanceIdentifier topology; - private final DataProviderService dataProvider; - private final Class idClass; - - protected AbstractTopologyBuilder(final DataProviderService dataProvider, final RibReference locRibReference, final TopologyId topologyId, final TopologyTypes types, final Class idClass) { - this.dataProvider = Preconditions.checkNotNull(dataProvider); - this.locRibReference = Preconditions.checkNotNull(locRibReference); - this.idClass = Preconditions.checkNotNull(idClass); - - final TopologyKey tk = new TopologyKey(Preconditions.checkNotNull(topologyId)); - this.topology = InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class, tk).toInstance(); - - LOG.debug("Initiating topology builder from {} at {}", locRibReference, this.topology); - - DataModificationTransaction t = dataProvider.beginTransaction(); - Object o = t.readOperationalData(this.topology); - Preconditions.checkState(o == null, "Data provider conflict detected on object {}", this.topology); - - t.putOperationalData(this.topology, new TopologyBuilder().setKey(tk).setServerProvided(Boolean.TRUE).setTopologyTypes(types).build()); - Futures.addCallback(JdkFutureAdapters.listenInPoolThread(t.commit()), new FutureCallback>() { - @Override - public void onSuccess(final RpcResult result) { - LOG.trace("Change committed successfully"); - } - - @Override - public void onFailure(final Throwable t) { - LOG.error("Failed to initiate topology {} by listener {}", AbstractTopologyBuilder.this.topology, AbstractTopologyBuilder.this, t); - } - }); - } - - public final InstanceIdentifier tableInstanceIdentifier(final Class afi, final Class safi) { - return this.locRibReference.getInstanceIdentifier().builder().child(LocRib.class).child(Tables.class, new TablesKey(afi, safi)).toInstance(); - } - - protected abstract void createObject(DataModification, DataObject> trans, InstanceIdentifier id, T value); - - protected abstract void removeObject(DataModification, DataObject> trans, InstanceIdentifier id, T value); - - public final DataProviderService getDataProvider() { - return this.dataProvider; - } - - @Override - public final InstanceIdentifier getInstanceIdentifier() { - return this.topology; - } - - private void addIdentifier(final InstanceIdentifier i, final String set, final Set> out) { - final InstanceIdentifier id = i.firstIdentifierOf(this.idClass); - if (id != null) { - out.add(id); - } else { - LOG.debug("Identifier {} in {} set does not contain listening class {}, ignoring it", i, set, this.idClass); - } - } - - @Override - public final void onLocRIBChange(final DataModification, DataObject> trans, - final DataChangeEvent, DataObject> event) { - LOG.debug("Received data change {} event with transaction {}", event, trans); - - final Set> ids = new HashSet<>(); - for (final InstanceIdentifier i : event.getRemovedOperationalData()) { - addIdentifier(i, "remove", ids); - } - for (final InstanceIdentifier i : event.getUpdatedOperationalData().keySet()) { - addIdentifier(i, "update", ids); - } - for (final InstanceIdentifier i : event.getCreatedOperationalData().keySet()) { - addIdentifier(i, "create", ids); - } - - final Map, DataObject> o = event.getOriginalOperationalData(); - final Map, DataObject> n = event.getUpdatedOperationalData(); - for (final InstanceIdentifier i : ids) { - final T oldValue = this.idClass.cast(o.get(i)); - final T newValue = this.idClass.cast(n.get(i)); - - LOG.debug("Updating object {} value {} -> {}", i, oldValue, newValue); - if (oldValue != null) { - removeObject(trans, i, oldValue); - } - if (newValue != null) { - createObject(trans, i, newValue); - } - } - - Futures.addCallback(JdkFutureAdapters.listenInPoolThread(trans.commit()), new FutureCallback>() { - @Override - public void onSuccess(final RpcResult result) { - LOG.trace("Change committed successfully"); - } - - @Override - public void onFailure(final Throwable t) { - LOG.error("Failed to propagate change by listener {}", AbstractTopologyBuilder.this); - } - }); - } - - @Override - public final void close() throws InterruptedException, ExecutionException { - LOG.info("Shutting down builder for {}", getInstanceIdentifier()); - final DataModificationTransaction trans = this.dataProvider.beginTransaction(); - trans.removeOperationalData(getInstanceIdentifier()); - trans.commit().get(); - } - - @Override - public final void onDataChanged(final DataChangeEvent, DataObject> change) { - final DataModificationTransaction trans = this.dataProvider.beginTransaction(); - - try { - onLocRIBChange(trans, change); - } catch (final RuntimeException e) { - LOG.warn("Data change {} was not completely propagated to listener {}", change, this, e); - return; - } - - switch (trans.getStatus()) { - case COMMITED: - case SUBMITED: - break; - case NEW: - LOG.warn("Data change {} transaction {} was not committed by builder {}", change, trans, this); - break; - case CANCELED: - case FAILED: - LOG.error("Data change {} transaction {} failed to commit", change, trans); - break; - } - } + TopologyReference { + private static final Logger LOG = LoggerFactory.getLogger(AbstractTopologyBuilder.class); + private final RibReference locRibReference; + private final InstanceIdentifier topology; + private final DataProviderService dataProvider; + private final Class idClass; + + protected AbstractTopologyBuilder(final DataProviderService dataProvider, final RibReference locRibReference, + final TopologyId topologyId, final TopologyTypes types, final Class idClass) { + this.dataProvider = Preconditions.checkNotNull(dataProvider); + this.locRibReference = Preconditions.checkNotNull(locRibReference); + this.idClass = Preconditions.checkNotNull(idClass); + + final TopologyKey tk = new TopologyKey(Preconditions.checkNotNull(topologyId)); + this.topology = InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class, tk).toInstance(); + + LOG.debug("Initiating topology builder from {} at {}", locRibReference, this.topology); + + DataModificationTransaction t = dataProvider.beginTransaction(); + Object o = t.readOperationalData(this.topology); + Preconditions.checkState(o == null, "Data provider conflict detected on object {}", this.topology); + + t.putOperationalData(this.topology, + new TopologyBuilder().setKey(tk).setServerProvided(Boolean.TRUE).setTopologyTypes(types).build()); + Futures.addCallback(JdkFutureAdapters.listenInPoolThread(t.commit()), new FutureCallback>() { + @Override + public void onSuccess(final RpcResult result) { + LOG.trace("Change committed successfully"); + } + + @Override + public void onFailure(final Throwable t) { + LOG.error("Failed to initiate topology {} by listener {}", AbstractTopologyBuilder.this.topology, + AbstractTopologyBuilder.this, t); + } + }); + } + + public final InstanceIdentifier tableInstanceIdentifier(final Class afi, + final Class safi) { + return this.locRibReference.getInstanceIdentifier().builder().child(LocRib.class).child(Tables.class, new TablesKey(afi, safi)).toInstance(); + } + + protected abstract void createObject(DataModification, DataObject> trans, InstanceIdentifier id, T value); + + protected abstract void removeObject(DataModification, DataObject> trans, InstanceIdentifier id, T value); + + public final DataProviderService getDataProvider() { + return this.dataProvider; + } + + @Override + public final InstanceIdentifier getInstanceIdentifier() { + return this.topology; + } + + private void addIdentifier(final InstanceIdentifier i, final String set, final Set> out) { + final InstanceIdentifier id = i.firstIdentifierOf(this.idClass); + if (id != null) { + out.add(id); + } else { + LOG.debug("Identifier {} in {} set does not contain listening class {}, ignoring it", i, set, this.idClass); + } + } + + @Override + public final void onLocRIBChange(final DataModification, DataObject> trans, + final DataChangeEvent, DataObject> event) { + LOG.debug("Received data change {} event with transaction {}", event, trans); + + final Set> ids = new HashSet<>(); + for (final InstanceIdentifier i : event.getRemovedOperationalData()) { + addIdentifier(i, "remove", ids); + } + for (final InstanceIdentifier i : event.getUpdatedOperationalData().keySet()) { + addIdentifier(i, "update", ids); + } + for (final InstanceIdentifier i : event.getCreatedOperationalData().keySet()) { + addIdentifier(i, "create", ids); + } + + final Map, DataObject> o = event.getOriginalOperationalData(); + final Map, DataObject> n = event.getUpdatedOperationalData(); + for (final InstanceIdentifier i : ids) { + final T oldValue = this.idClass.cast(o.get(i)); + final T newValue = this.idClass.cast(n.get(i)); + + LOG.debug("Updating object {} value {} -> {}", i, oldValue, newValue); + if (oldValue != null) { + removeObject(trans, i, oldValue); + } + if (newValue != null) { + createObject(trans, i, newValue); + } + } + + Futures.addCallback(JdkFutureAdapters.listenInPoolThread(trans.commit()), new FutureCallback>() { + @Override + public void onSuccess(final RpcResult result) { + LOG.trace("Change committed successfully"); + } + + @Override + public void onFailure(final Throwable t) { + LOG.error("Failed to propagate change by listener {}", AbstractTopologyBuilder.this); + } + }); + } + + @Override + public final void close() throws InterruptedException, ExecutionException { + LOG.info("Shutting down builder for {}", getInstanceIdentifier()); + final DataModificationTransaction trans = this.dataProvider.beginTransaction(); + trans.removeOperationalData(getInstanceIdentifier()); + trans.commit().get(); + } + + @Override + public final void onDataChanged(final DataChangeEvent, DataObject> change) { + final DataModificationTransaction trans = this.dataProvider.beginTransaction(); + + try { + onLocRIBChange(trans, change); + } catch (final RuntimeException e) { + LOG.warn("Data change {} was not completely propagated to listener {}", change, this, e); + return; + } + + switch (trans.getStatus()) { + case COMMITED: + case SUBMITED: + break; + case NEW: + LOG.warn("Data change {} transaction {} was not committed by builder {}", change, trans, this); + break; + case CANCELED: + case FAILED: + LOG.error("Data change {} transaction {} failed to commit", change, trans); + break; + } + } } diff --git a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/Ipv4ReachabilityTopologyBuilder.java b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/Ipv4ReachabilityTopologyBuilder.java index ebbd6f2fda..12e0915625 100644 --- a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/Ipv4ReachabilityTopologyBuilder.java +++ b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/Ipv4ReachabilityTopologyBuilder.java @@ -15,17 +15,18 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib. import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId; public final class Ipv4ReachabilityTopologyBuilder extends AbstractReachabilityTopologyBuilder { - public Ipv4ReachabilityTopologyBuilder(final DataProviderService dataProvider, final RibReference locRibReference, final TopologyId topologyId) { - super(dataProvider, locRibReference, topologyId, Ipv4Route.class); - } + public Ipv4ReachabilityTopologyBuilder(final DataProviderService dataProvider, final RibReference locRibReference, + final TopologyId topologyId) { + super(dataProvider, locRibReference, topologyId, Ipv4Route.class); + } - @Override - protected Attributes getAttributes(final Ipv4Route value) { - return value.getAttributes(); - } + @Override + protected Attributes getAttributes(final Ipv4Route value) { + return value.getAttributes(); + } - @Override - protected IpPrefix getPrefix(final Ipv4Route value) { - return new IpPrefix(value.getKey().getPrefix()); - } + @Override + protected IpPrefix getPrefix(final Ipv4Route value) { + return new IpPrefix(value.getKey().getPrefix()); + } } diff --git a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/Ipv6ReachabilityTopologyBuilder.java b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/Ipv6ReachabilityTopologyBuilder.java index 9e471f2401..1c4e8c5c88 100644 --- a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/Ipv6ReachabilityTopologyBuilder.java +++ b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/Ipv6ReachabilityTopologyBuilder.java @@ -15,17 +15,18 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib. import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId; public final class Ipv6ReachabilityTopologyBuilder extends AbstractReachabilityTopologyBuilder { - public Ipv6ReachabilityTopologyBuilder(final DataProviderService dataProvider, final RibReference locRibReference, final TopologyId topologyId) { - super(dataProvider, locRibReference, topologyId, Ipv6Route.class); - } + public Ipv6ReachabilityTopologyBuilder(final DataProviderService dataProvider, final RibReference locRibReference, + final TopologyId topologyId) { + super(dataProvider, locRibReference, topologyId, Ipv6Route.class); + } - @Override - protected Attributes getAttributes(final Ipv6Route value) { - return value.getAttributes(); - } + @Override + protected Attributes getAttributes(final Ipv6Route value) { + return value.getAttributes(); + } - @Override - protected IpPrefix getPrefix(final Ipv6Route value) { - return new IpPrefix(value.getKey().getPrefix()); - } + @Override + protected IpPrefix getPrefix(final Ipv6Route value) { + return new IpPrefix(value.getKey().getPrefix()); + } } diff --git a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/LinkstateTopologyBuilder.java b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/LinkstateTopologyBuilder.java index de014aa3df..856280a1bc 100644 --- a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/LinkstateTopologyBuilder.java +++ b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/LinkstateTopologyBuilder.java @@ -7,6 +7,11 @@ */ package org.opendaylight.bgpcep.bgp.topology.provider; +import com.google.common.base.Function; +import com.google.common.base.Preconditions; +import com.google.common.collect.Collections2; +import com.google.common.collect.Lists; + import java.math.BigDecimal; import java.nio.ByteBuffer; import java.util.ArrayList; @@ -102,694 +107,687 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Function; -import com.google.common.base.Preconditions; -import com.google.common.collect.Collections2; -import com.google.common.collect.Lists; - public final class LinkstateTopologyBuilder extends AbstractTopologyBuilder { - private static final class TpHolder { - private final Set local = new HashSet<>(); - private final Set remote = new HashSet<>(); - - private final TerminationPoint tp; - - private TpHolder(final TerminationPoint tp) { - this.tp = Preconditions.checkNotNull(tp); - } - - private synchronized void addLink(final LinkId id, final boolean isRemote) { - if (isRemote) { - this.remote.add(id); - } else { - this.local.add(id); - } - } - - private synchronized boolean removeLink(final LinkId id, final boolean isRemote) { - final boolean removed; - if (isRemote) { - removed = this.remote.remove(id); - } else { - removed = this.local.remove(id); - } - if (!removed) { - LOG.warn("Removed non-reference link {} from TP {} isRemote {}", this.tp.getTpId(), id, isRemote); - } - - return this.local.isEmpty() && this.remote.isEmpty(); - } - - private TerminationPoint getTp() { - return this.tp; - } - } - - private final class NodeHolder { - private final Map prefixes = new HashMap<>(); - private final Map tps = new HashMap<>(); - private boolean advertized = false; - private IgpNodeAttributesBuilder inab; - private NodeBuilder nb; - - private NodeHolder(final NodeId id) { - this.inab = new IgpNodeAttributesBuilder(); - this.nb = new NodeBuilder().setKey(new NodeKey(id)).setNodeId(id); - } - - /** - * Synchronized in-core state of a node into the backing store using the transaction - * - * @param trans data modification transaction which to use - * @return True if the node has been purged, false otherwise. - */ - private boolean syncState(final DataModification, DataObject> trans) { - final InstanceIdentifier nid = getInstanceIdentifier().child( - org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node.class, - this.nb.getKey()); - - /* - * Transaction's putOperationalData() does a merge. Force it onto a replace - * by removing the data. If we decide to remove the node -- we just skip the put. - */ - trans.removeOperationalData(nid); - - if (!this.advertized) { - if (this.tps.isEmpty() && this.prefixes.isEmpty()) { - LOG.debug("Removing unadvertized unused node {}", this.nb.getNodeId()); - return true; - } - - LOG.debug("Node {} is still implied by {} TPs and {} prefixes", this.nb.getNodeId(), this.tps.size(), this.prefixes.size()); - } - - // Re-generate termination points - this.nb.setTerminationPoint(Lists.newArrayList(Collections2.transform(this.tps.values(), - new Function() { - @Override - public TerminationPoint apply(final TpHolder input) { - return input.getTp(); - } - }))); - - // Re-generate prefixes - this.inab.setPrefix(Lists.newArrayList(this.prefixes.values())); - - // Write the node out - final Node n = this.nb.addAugmentation(Node1.class, new Node1Builder().setIgpNodeAttributes(this.inab.build()).build()).build(); - trans.putOperationalData(nid, n); - LOG.debug("Created node {} at {}", n, nid); - return false; - } - - private synchronized void removeTp(final TpId tp, final LinkId link, final boolean isRemote) { - final TpHolder h = this.tps.get(tp); - if (h != null) { - if (h.removeLink(link, isRemote)) { - this.tps.remove(tp); - LOG.debug("Removed TP {}", tp); - } - } else { - LOG.warn("Removed non-present TP {} by link {}", tp, link); - } - } - - private void addTp(final TerminationPoint tp, final LinkId link, final boolean isRemote) { - TpHolder h = this.tps.get(tp.getTpId()); - if (h == null) { - h = new TpHolder(tp); - this.tps.put(tp.getTpId(), h); - } - - h.addLink(link, isRemote); - } - - private void addPrefix(final Prefix pfx) { - this.prefixes.put(pfx.getKey(), pfx); - } - - private void removePrefix(final PrefixCase p) { - this.prefixes.remove(new PrefixKey(p.getIpReachabilityInformation())); - } - - private void unadvertized() { - this.inab = new IgpNodeAttributesBuilder(); - this.nb = new NodeBuilder().setKey(this.nb.getKey()).setNodeId(this.nb.getNodeId()); - this.advertized = false; - LOG.debug("Node {} is unadvertized", this.nb.getNodeId()); - } - - private void advertized(final NodeBuilder nb, final IgpNodeAttributesBuilder inab) { - this.nb = Preconditions.checkNotNull(nb); - this.inab = Preconditions.checkNotNull(inab); - this.advertized = true; - LOG.debug("Node {} is advertized", nb.getNodeId()); - } - - private Object getNodeId() { - return this.nb.getNodeId(); - } - } - - private static final Logger LOG = LoggerFactory.getLogger(LinkstateTopologyBuilder.class); - private final Map nodes = new HashMap<>(); - - public LinkstateTopologyBuilder(final DataProviderService dataProvider, final RibReference locRibReference, final TopologyId topologyId) { - super(dataProvider, locRibReference, topologyId, new TopologyTypesBuilder().addAugmentation(TopologyTypes1.class, - new TopologyTypes1Builder().build()).build(), LinkstateRoute.class); - } - - private LinkId buildLinkId(final UriBuilder base, final LinkCase link) { - return new LinkId(new UriBuilder(base, "link").add(link).toString()); - } - - private NodeId buildNodeId(final UriBuilder base, final NodeIdentifier node) { - return new NodeId(new UriBuilder(base, "node").add("", node).toString()); - } - - private TpId buildTpId(final UriBuilder base, final TopologyIdentifier topologyIdentifier, - final Ipv4InterfaceIdentifier ipv4InterfaceIdentifier, final Ipv6InterfaceIdentifier ipv6InterfaceIdentifier, final Long id) { - final UriBuilder b = new UriBuilder(base, "tp"); - if (topologyIdentifier != null) { - b.add("mt", topologyIdentifier.getValue()); - } - if (ipv4InterfaceIdentifier != null) { - b.add("ipv4", ipv4InterfaceIdentifier.getValue()); - } - if (ipv6InterfaceIdentifier != null) { - b.add("ipv6", ipv6InterfaceIdentifier.getValue()); - } - - return new TpId(b.add("id", id).toString()); - } - - private TpId buildLocalTpId(final UriBuilder base, final LinkDescriptors linkDescriptors) { - return buildTpId(base, linkDescriptors.getMultiTopologyId(), linkDescriptors.getIpv4InterfaceAddress(), - linkDescriptors.getIpv6InterfaceAddress(), linkDescriptors.getLinkLocalIdentifier()); - } - - private TerminationPoint buildTp(final TpId id, final TerminationPointType type) { - final TerminationPointBuilder stpb = new TerminationPointBuilder(); - stpb.setKey(new TerminationPointKey(id)); - stpb.setTpId(id); - - if (type != null) { - stpb.addAugmentation( - TerminationPoint1.class, - new TerminationPoint1Builder().setIgpTerminationPointAttributes( - new IgpTerminationPointAttributesBuilder().setTerminationPointType(null).build()).build()); - } - - return stpb.build(); - } - - private TerminationPointType getTpType(final Ipv4InterfaceIdentifier ipv4InterfaceIdentifier, - final Ipv6InterfaceIdentifier ipv6InterfaceIdentifier, final Long id) { - // Order of preference: Unnumbered first, then IP - if (id != null) { - LOG.debug("Unnumbered termination point type: {}", id); - return new UnnumberedBuilder().setUnnumberedId(id).build(); - } - - final IpAddress ip; - if (ipv6InterfaceIdentifier != null) { - ip = new IpAddress(ipv6InterfaceIdentifier); - } else if (ipv4InterfaceIdentifier != null) { - ip = new IpAddress(ipv4InterfaceIdentifier); - } else { - ip = null; - } - - if (ip != null) { - LOG.debug("IP termination point type: {}", ip); - return new IpBuilder().setIpAddress(Lists.newArrayList(ip)).build(); - } - - return null; - } - - private TerminationPoint buildLocalTp(final UriBuilder base, final LinkDescriptors linkDescriptors) { - final TpId id = buildLocalTpId(base, linkDescriptors); - final TerminationPointType t = getTpType(linkDescriptors.getIpv4InterfaceAddress(), linkDescriptors.getIpv6InterfaceAddress(), - linkDescriptors.getLinkLocalIdentifier()); - - return buildTp(id, t); - } - - private TpId buildRemoteTpId(final UriBuilder base, final LinkDescriptors linkDescriptors) { - return buildTpId(base, linkDescriptors.getMultiTopologyId(), linkDescriptors.getIpv4NeighborAddress(), - linkDescriptors.getIpv6NeighborAddress(), linkDescriptors.getLinkRemoteIdentifier()); - } - - private TerminationPoint buildRemoteTp(final UriBuilder base, final LinkDescriptors linkDescriptors) { - final TpId id = buildRemoteTpId(base, linkDescriptors); - final TerminationPointType t = getTpType(linkDescriptors.getIpv4NeighborAddress(), linkDescriptors.getIpv6NeighborAddress(), - linkDescriptors.getLinkRemoteIdentifier()); - - return buildTp(id, t); - } - - private InstanceIdentifier buildLinkIdentifier(final UriBuilder base, final LinkId id) { - return getInstanceIdentifier().child( - org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Link.class, - new LinkKey(id)); - } - - private static Float bandwidthToFloat(final Bandwidth bandwidth) { - return ByteBuffer.wrap(bandwidth.getValue()).getFloat(); - } - - private static BigDecimal bandwidthToBigDecimal(final Bandwidth bandwidth) { - return BigDecimal.valueOf(bandwidthToFloat(bandwidth)); - } - - private static List unreservedBandwidthList( - final List input) { - final List ret = new ArrayList<>(input.size()); - - for (final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.UnreservedBandwidth i : input) { - ret.add(new UnreservedBandwidthBuilder().setBandwidth(bandwidthToBigDecimal(i.getBandwidth())).setKey( - new UnreservedBandwidthKey(i.getPriority())).build()); - } - - return ret; - } - - private org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpLinkAttributes1 isisLinkAttributes( - final TopologyIdentifier topologyIdentifier, final LinkAttributes la) { - final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.link.attributes.isis.link.attributes.TedBuilder tb = new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.link.attributes.isis.link.attributes.TedBuilder(); - - if (la != null) { - if (la.getAdminGroup() != null) { - tb.setColor(la.getAdminGroup().getValue()); - } - if (la.getTeMetric() != null) { - tb.setTeDefaultMetric(la.getTeMetric().getValue()); - } - if (la.getUnreservedBandwidth() != null) { - tb.setUnreservedBandwidth(unreservedBandwidthList(la.getUnreservedBandwidth())); - } - if (la.getMaxLinkBandwidth() != null) { - tb.setMaxLinkBandwidth(bandwidthToBigDecimal(la.getMaxLinkBandwidth())); - } - if (la.getMaxReservableBandwidth() != null) { - tb.setMaxResvLinkBandwidth(bandwidthToBigDecimal(la.getMaxReservableBandwidth())); - } - } - - final IsisLinkAttributesBuilder ilab = new IsisLinkAttributesBuilder(); - ilab.setTed(tb.build()); - if (topologyIdentifier != null) { - ilab.setMultiTopologyId(topologyIdentifier.getValue().shortValue()); - } - - return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpLinkAttributes1Builder().setIsisLinkAttributes( - ilab.build()).build(); - } - - private org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpLinkAttributes1 ospfLinkAttributes( - final TopologyIdentifier topologyIdentifier, final LinkAttributes la) { - final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.link.attributes.ospf.link.attributes.TedBuilder tb = new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.link.attributes.ospf.link.attributes.TedBuilder(); - - if (la != null) { - if (la.getAdminGroup() != null) { - tb.setColor(la.getAdminGroup().getValue()); - } - if (la.getTeMetric() != null) { - tb.setTeDefaultMetric(la.getTeMetric().getValue()); - } - if (la.getUnreservedBandwidth() != null) { - tb.setUnreservedBandwidth(unreservedBandwidthList(la.getUnreservedBandwidth())); - } - if (la.getMaxLinkBandwidth() != null) { - tb.setMaxLinkBandwidth(bandwidthToBigDecimal(la.getMaxLinkBandwidth())); - } - if (la.getMaxReservableBandwidth() != null) { - tb.setMaxResvLinkBandwidth(bandwidthToBigDecimal(la.getMaxReservableBandwidth())); - } - } - - final OspfLinkAttributesBuilder ilab = new OspfLinkAttributesBuilder(); - ilab.setTed(tb.build()); - if (topologyIdentifier != null) { - ilab.setMultiTopologyId(topologyIdentifier.getValue().shortValue()); - } - - return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpLinkAttributes1Builder().setOspfLinkAttributes( - ilab.build()).build(); - } - - private NodeHolder getNode(final NodeId id) { - if (this.nodes.containsKey(id)) { - LOG.debug("Node {} is already present", id); - return this.nodes.get(id); - } - - final NodeHolder ret = new NodeHolder(id); - this.nodes.put(id, ret); - return ret; - } - - private void putNode(final DataModification, DataObject> trans, final NodeHolder holder) { - if (holder.syncState(trans)) { - this.nodes.remove(holder.getNodeId()); - } - } - - private void createLink(final DataModification, DataObject> trans, final UriBuilder base, - final LinkstateRoute value, final LinkCase l, final Attributes attributes) { - final LinkAttributes la = ((org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.LinkCase) attributes.getAugmentation( - Attributes1.class).getAttributeType()).getLinkAttributes(); - - final IgpLinkAttributesBuilder ilab = new IgpLinkAttributesBuilder(); - if (la != null) { - if (la.getMetric() != null) { - ilab.setMetric(la.getMetric().getValue()); - } - ilab.setName(la.getLinkName()); - } - - switch (value.getProtocolId()) { - case Direct: - case Static: - case Unknown: - break; - case IsisLevel1: - case IsisLevel2: - ilab.addAugmentation( - org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpLinkAttributes1.class, - isisLinkAttributes(l.getLinkDescriptors().getMultiTopologyId(), la)); - break; - case Ospf: - ilab.addAugmentation(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpLinkAttributes1.class, - ospfLinkAttributes(l.getLinkDescriptors().getMultiTopologyId(), la)); - break; - } - - final LinkBuilder lb = new LinkBuilder(); - lb.setLinkId(buildLinkId(base, l)); - lb.addAugmentation(Link1.class, new Link1Builder().setIgpLinkAttributes(ilab.build()).build()); - - final NodeId srcNode = buildNodeId(base, l.getLocalNodeDescriptors()); - LOG.debug("Link {} implies source node {}", l, srcNode); - - final NodeId dstNode = buildNodeId(base, l.getRemoteNodeDescriptors()); - LOG.debug("Link {} implies destination node {}", l, dstNode); - - final TerminationPoint srcTp = buildLocalTp(base, l.getLinkDescriptors()); - LOG.debug("Link {} implies source TP {}", l, srcTp); - - final TerminationPoint dstTp = buildRemoteTp(base, l.getLinkDescriptors()); - LOG.debug("Link {} implies destination TP {}", l, dstTp); - - lb.setSource(new SourceBuilder().setSourceNode(srcNode).setSourceTp(srcTp.getTpId()).build()); - lb.setDestination(new DestinationBuilder().setDestNode(dstNode).setDestTp(dstTp.getTpId()).build()); - - final NodeHolder snh = getNode(srcNode); - snh.addTp(srcTp, lb.getLinkId(), false); - LOG.debug("Created TP {} as link source", srcTp); - putNode(trans, snh); - - final NodeHolder dnh = getNode(dstNode); - dnh.addTp(dstTp, lb.getLinkId(), true); - LOG.debug("Created TP {} as link destination", dstTp); - putNode(trans, dnh); - - final InstanceIdentifier lid = buildLinkIdentifier(base, lb.getLinkId()); - final Link link = lb.build(); - - /* - * Transaction's putOperationalData() does a merge. Force it onto a replace - * by removing the data. - */ - trans.removeOperationalData(lid); - trans.putOperationalData(lid, link); - LOG.debug("Created link {} at {} for {}", link, lid, l); - } - - private void removeTp(final DataModification, DataObject> trans, final NodeId node, final TpId tp, - final LinkId link, final boolean isRemote) { - final NodeHolder nh = this.nodes.get(node); - if (nh != null) { - nh.removeTp(tp, link, isRemote); - putNode(trans, nh); - } else { - LOG.warn("Removed non-existent node {}", node); - } - } - - private void removeLink(final DataModification, DataObject> trans, final UriBuilder base, final LinkCase l) { - final LinkId id = buildLinkId(base, l); - final InstanceIdentifier lid = buildLinkIdentifier(base, id); - trans.removeOperationalData(lid); - LOG.debug("Removed link {}", lid); - - removeTp(trans, buildNodeId(base, l.getLocalNodeDescriptors()), buildLocalTpId(base, l.getLinkDescriptors()), id, false); - removeTp(trans, buildNodeId(base, l.getRemoteNodeDescriptors()), buildRemoteTpId(base, l.getLinkDescriptors()), id, true); - } - - private List nodeMultiTopology(final List list) { - final List ret = new ArrayList<>(list.size()); - for (final TopologyIdentifier id : list) { - ret.add(id.getValue().shortValue()); - } - return ret; - } - - private org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpNodeAttributes1 isisNodeAttributes( - final NodeIdentifier node, final NodeAttributes na) { - final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.node.attributes.isis.node.attributes.TedBuilder tb = new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.node.attributes.isis.node.attributes.TedBuilder(); - final IsisNodeAttributesBuilder ab = new IsisNodeAttributesBuilder(); - - if (na != null) { - if (na.getIpv4RouterId() != null) { - tb.setTeRouterIdIpv4(na.getIpv4RouterId()); - } - if (na.getIpv6RouterId() != null) { - tb.setTeRouterIdIpv6(na.getIpv6RouterId()); - } - if (na.getTopologyIdentifier() != null) { - ab.setMultiTopologyId(nodeMultiTopology(na.getTopologyIdentifier())); - } - } - - final CRouterIdentifier ri = node.getCRouterIdentifier(); - if (ri instanceof IsisPseudonodeCase) { - final IsisPseudonode pn = ((IsisPseudonodeCase) ri).getIsisPseudonode(); - ab.setIso(new IsoBuilder().setIsoPseudonodeId(new IsoPseudonodeId(pn.toString())).build()); - } else if (ri instanceof IsisNodeCase) { - final IsisNode in = ((IsisNodeCase) ri).getIsisNode(); - ab.setIso(new IsoBuilder().setIsoSystemId(new IsoSystemId(in.getIsoSystemId().toString())).build()); - } - - ab.setTed(tb.build()); - - return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpNodeAttributes1Builder().setIsisNodeAttributes( - ab.build()).build(); - } - - private org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpNodeAttributes1 ospfNodeAttributes( - final NodeDescriptors node, final NodeAttributes na) { - final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.ospf.node.attributes.TedBuilder tb = new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.ospf.node.attributes.TedBuilder(); - final OspfNodeAttributesBuilder ab = new OspfNodeAttributesBuilder(); - - if (na != null) { - if (na.getIpv4RouterId() != null) { - tb.setTeRouterIdIpv4(na.getIpv4RouterId()); - } - if (na.getIpv6RouterId() != null) { - tb.setTeRouterIdIpv6(na.getIpv6RouterId()); - } - if (na.getTopologyIdentifier() != null) { - ab.setMultiTopologyId(nodeMultiTopology(na.getTopologyIdentifier())); - } - } - - final CRouterIdentifier ri = node.getCRouterIdentifier(); - if (ri instanceof OspfPseudonodeCase) { - final OspfPseudonode pn = ((OspfPseudonodeCase) ri).getOspfPseudonode(); - - ab.setRouterType(new PseudonodeBuilder().setPseudonode(Boolean.TRUE).build()); - ab.setDrInterfaceId(pn.getLanInterface().getValue()); - } else if (ri instanceof OspfNodeCase) { - // TODO: what should we do with in.getOspfRouterId()? - // final OspfNode in = ((OspfNodeCase) ri).getOspfNode(); - - if (na != null) { - final NodeFlagBits nf = na.getNodeFlags(); - if (nf != null) { - if (nf.isAbr()) { - ab.setRouterType(new AbrBuilder().setAbr(Boolean.TRUE).build()); - } else if (!nf.isExternal()) { - ab.setRouterType(new InternalBuilder().setInternal(Boolean.TRUE).build()); - } - } - } - } - - ab.setTed(tb.build()); - - return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpNodeAttributes1Builder().setOspfNodeAttributes( - ab.build()).build(); - } - - private void createNode(final DataModification, DataObject> trans, final UriBuilder base, - final LinkstateRoute value, final NodeCase n, final Attributes attributes) { - final NodeAttributes na = ((org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.NodeCase) attributes.getAugmentation( - Attributes1.class).getAttributeType()).getNodeAttributes(); - final IgpNodeAttributesBuilder inab = new IgpNodeAttributesBuilder(); - - final List ids = new ArrayList<>(); - if (na != null) { - if (na.getIpv4RouterId() != null) { - ids.add(new IpAddress(na.getIpv4RouterId())); - } - if (na.getIpv6RouterId() != null) { - ids.add(new IpAddress(na.getIpv6RouterId())); - } - if (na.getDynamicHostname() != null) { - inab.setName(new DomainName(na.getDynamicHostname())); - } - } - - if (!ids.isEmpty()) { - inab.setRouterId(ids); - } - - switch (value.getProtocolId()) { - case Direct: - case Static: - case Unknown: - break; - case IsisLevel1: - case IsisLevel2: - inab.addAugmentation( - org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpNodeAttributes1.class, - isisNodeAttributes(n.getNodeDescriptors(), na)); - break; - case Ospf: - inab.addAugmentation(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpNodeAttributes1.class, - ospfNodeAttributes(n.getNodeDescriptors(), na)); - break; - } - - final NodeId nid = buildNodeId(base, n.getNodeDescriptors()); - final NodeHolder nh = getNode(nid); - - /* - * Eventhough the the holder creates a dummy structure, we need to duplicate it here, - * as that is the API requirement. The reason for it is the possible presence of supporting - * node -- something which the holder does not track. - */ - final NodeBuilder nb = new NodeBuilder(); - nb.setNodeId(nid); - nb.setKey(new NodeKey(nb.getNodeId())); - - nh.advertized(nb, inab); - putNode(trans, nh); - } - - private void removeNode(final DataModification, DataObject> trans, final UriBuilder base, final NodeCase n) { - final NodeId id = buildNodeId(base, n.getNodeDescriptors()); - final NodeHolder nh = this.nodes.get(id); - if (nh != null) { - nh.unadvertized(); - putNode(trans, nh); - } else { - LOG.warn("Node {} does not have a holder", id); - } - } - - private void createPrefix(final DataModification, DataObject> trans, final UriBuilder base, - final LinkstateRoute value, final PrefixCase p, final Attributes attributes) { - final IpPrefix ippfx = p.getIpReachabilityInformation(); - if (ippfx == null) { - LOG.warn("IP reachability not present in prefix {} route {}, skipping it", p, value); - return; - } - - final PrefixBuilder pb = new PrefixBuilder(); - pb.setKey(new PrefixKey(ippfx)); - pb.setPrefix(ippfx); - - final PrefixAttributes pa = ((org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.PrefixCase) attributes.getAugmentation( - Attributes1.class).getAttributeType()).getPrefixAttributes(); - if (pa != null) { - pb.setMetric(pa.getPrefixMetric().getValue()); - } - - switch (value.getProtocolId()) { - case Direct: - case IsisLevel1: - case IsisLevel2: - case Static: - case Unknown: - break; - case Ospf: - if (pa != null) { - pb.addAugmentation( - Prefix1.class, - new Prefix1Builder().setOspfPrefixAttributes( - new OspfPrefixAttributesBuilder().setForwardingAddress(pa.getOspfForwardingAddress().getIpv4Address()).build()).build()); - } - break; - } - - final Prefix pfx = pb.build(); - - /* - * All set, but... the hosting node may not exist, we may need to fake it. - */ - final NodeId node = buildNodeId(base, p.getAdvertisingNodeDescriptors()); - final NodeHolder nh = getNode(node); - nh.addPrefix(pfx); - LOG.debug("Created prefix {} for {}", pfx, p); - putNode(trans, nh); - } - - private void removePrefix(final DataModification, DataObject> trans, final UriBuilder base, final PrefixCase p) { - final NodeId node = buildNodeId(base, p.getAdvertisingNodeDescriptors()); - final NodeHolder nh = this.nodes.get(node); - if (nh != null) { - nh.removePrefix(p); - LOG.debug("Removed prefix {}", p); - putNode(trans, nh); - } else { - LOG.warn("Removing prefix from non-existing node {}", node); - } - } - - @Override - protected void createObject(final DataModification, DataObject> trans, - final InstanceIdentifier id, final LinkstateRoute value) { - final UriBuilder base = new UriBuilder(value); - - final ObjectType t = value.getObjectType(); - if (t instanceof LinkCase) { - createLink(trans, base, value, (LinkCase) t, value.getAttributes()); - } else if (t instanceof NodeCase) { - createNode(trans, base, value, (NodeCase) t, value.getAttributes()); - } else if (t instanceof PrefixCase) { - createPrefix(trans, base, value, (PrefixCase) t, value.getAttributes()); - } else { - throw new IllegalStateException("Unhandled object class " + t.getImplementedInterface()); - } - } - - @Override - protected void removeObject(final DataModification, DataObject> trans, - final InstanceIdentifier id, final LinkstateRoute value) { - final UriBuilder base = new UriBuilder(value); - - final ObjectType t = value.getObjectType(); - if (t instanceof LinkCase) { - removeLink(trans, base, (LinkCase) t); - } else if (t instanceof NodeCase) { - removeNode(trans, base, (NodeCase) t); - } else if (t instanceof PrefixCase) { - removePrefix(trans, base, (PrefixCase) t); - } else { - throw new IllegalStateException("Unhandled object class " + t.getImplementedInterface()); - } - } + private static final class TpHolder { + private final Set local = new HashSet<>(); + private final Set remote = new HashSet<>(); + + private final TerminationPoint tp; + + private TpHolder(final TerminationPoint tp) { + this.tp = Preconditions.checkNotNull(tp); + } + + private synchronized void addLink(final LinkId id, final boolean isRemote) { + if (isRemote) { + this.remote.add(id); + } else { + this.local.add(id); + } + } + + private synchronized boolean removeLink(final LinkId id, final boolean isRemote) { + final boolean removed; + if (isRemote) { + removed = this.remote.remove(id); + } else { + removed = this.local.remove(id); + } + if (!removed) { + LOG.warn("Removed non-reference link {} from TP {} isRemote {}", this.tp.getTpId(), id, isRemote); + } + + return this.local.isEmpty() && this.remote.isEmpty(); + } + + private TerminationPoint getTp() { + return this.tp; + } + } + + private final class NodeHolder { + private final Map prefixes = new HashMap<>(); + private final Map tps = new HashMap<>(); + private boolean advertized = false; + private IgpNodeAttributesBuilder inab; + private NodeBuilder nb; + + private NodeHolder(final NodeId id) { + this.inab = new IgpNodeAttributesBuilder(); + this.nb = new NodeBuilder().setKey(new NodeKey(id)).setNodeId(id); + } + + /** + * Synchronized in-core state of a node into the backing store using the transaction + * + * @param trans data modification transaction which to use + * @return True if the node has been purged, false otherwise. + */ + private boolean syncState(final DataModification, DataObject> trans) { + final InstanceIdentifier nid = getInstanceIdentifier().child( + org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node.class, + this.nb.getKey()); + + /* + * Transaction's putOperationalData() does a merge. Force it onto a replace + * by removing the data. If we decide to remove the node -- we just skip the put. + */ + trans.removeOperationalData(nid); + + if (!this.advertized) { + if (this.tps.isEmpty() && this.prefixes.isEmpty()) { + LOG.debug("Removing unadvertized unused node {}", this.nb.getNodeId()); + return true; + } + + LOG.debug("Node {} is still implied by {} TPs and {} prefixes", this.nb.getNodeId(), this.tps.size(), this.prefixes.size()); + } + + // Re-generate termination points + this.nb.setTerminationPoint(Lists.newArrayList(Collections2.transform(this.tps.values(), + new Function() { + @Override + public TerminationPoint apply(final TpHolder input) { + return input.getTp(); + } + }))); + + // Re-generate prefixes + this.inab.setPrefix(Lists.newArrayList(this.prefixes.values())); + + // Write the node out + final Node n = this.nb.addAugmentation(Node1.class, new Node1Builder().setIgpNodeAttributes(this.inab.build()).build()).build(); + trans.putOperationalData(nid, n); + LOG.debug("Created node {} at {}", n, nid); + return false; + } + + private synchronized void removeTp(final TpId tp, final LinkId link, final boolean isRemote) { + final TpHolder h = this.tps.get(tp); + if (h != null) { + if (h.removeLink(link, isRemote)) { + this.tps.remove(tp); + LOG.debug("Removed TP {}", tp); + } + } else { + LOG.warn("Removed non-present TP {} by link {}", tp, link); + } + } + + private void addTp(final TerminationPoint tp, final LinkId link, final boolean isRemote) { + TpHolder h = this.tps.get(tp.getTpId()); + if (h == null) { + h = new TpHolder(tp); + this.tps.put(tp.getTpId(), h); + } + + h.addLink(link, isRemote); + } + + private void addPrefix(final Prefix pfx) { + this.prefixes.put(pfx.getKey(), pfx); + } + + private void removePrefix(final PrefixCase p) { + this.prefixes.remove(new PrefixKey(p.getIpReachabilityInformation())); + } + + private void unadvertized() { + this.inab = new IgpNodeAttributesBuilder(); + this.nb = new NodeBuilder().setKey(this.nb.getKey()).setNodeId(this.nb.getNodeId()); + this.advertized = false; + LOG.debug("Node {} is unadvertized", this.nb.getNodeId()); + } + + private void advertized(final NodeBuilder nb, final IgpNodeAttributesBuilder inab) { + this.nb = Preconditions.checkNotNull(nb); + this.inab = Preconditions.checkNotNull(inab); + this.advertized = true; + LOG.debug("Node {} is advertized", nb.getNodeId()); + } + + private Object getNodeId() { + return this.nb.getNodeId(); + } + } + + private static final Logger LOG = LoggerFactory.getLogger(LinkstateTopologyBuilder.class); + private final Map nodes = new HashMap<>(); + + public LinkstateTopologyBuilder(final DataProviderService dataProvider, final RibReference locRibReference, final TopologyId topologyId) { + super(dataProvider, locRibReference, topologyId, new TopologyTypesBuilder().addAugmentation(TopologyTypes1.class, + new TopologyTypes1Builder().build()).build(), LinkstateRoute.class); + } + + private LinkId buildLinkId(final UriBuilder base, final LinkCase link) { + return new LinkId(new UriBuilder(base, "link").add(link).toString()); + } + + private NodeId buildNodeId(final UriBuilder base, final NodeIdentifier node) { + return new NodeId(new UriBuilder(base, "node").add("", node).toString()); + } + + private TpId buildTpId(final UriBuilder base, final TopologyIdentifier topologyIdentifier, + final Ipv4InterfaceIdentifier ipv4InterfaceIdentifier, final Ipv6InterfaceIdentifier ipv6InterfaceIdentifier, final Long id) { + final UriBuilder b = new UriBuilder(base, "tp"); + if (topologyIdentifier != null) { + b.add("mt", topologyIdentifier.getValue()); + } + if (ipv4InterfaceIdentifier != null) { + b.add("ipv4", ipv4InterfaceIdentifier.getValue()); + } + if (ipv6InterfaceIdentifier != null) { + b.add("ipv6", ipv6InterfaceIdentifier.getValue()); + } + + return new TpId(b.add("id", id).toString()); + } + + private TpId buildLocalTpId(final UriBuilder base, final LinkDescriptors linkDescriptors) { + return buildTpId(base, linkDescriptors.getMultiTopologyId(), linkDescriptors.getIpv4InterfaceAddress(), + linkDescriptors.getIpv6InterfaceAddress(), linkDescriptors.getLinkLocalIdentifier()); + } + + private TerminationPoint buildTp(final TpId id, final TerminationPointType type) { + final TerminationPointBuilder stpb = new TerminationPointBuilder(); + stpb.setKey(new TerminationPointKey(id)); + stpb.setTpId(id); + + if (type != null) { + stpb.addAugmentation(TerminationPoint1.class, new TerminationPoint1Builder().setIgpTerminationPointAttributes( + new IgpTerminationPointAttributesBuilder().setTerminationPointType(null).build()).build()); + } + + return stpb.build(); + } + + private TerminationPointType getTpType(final Ipv4InterfaceIdentifier ipv4InterfaceIdentifier, + final Ipv6InterfaceIdentifier ipv6InterfaceIdentifier, final Long id) { + // Order of preference: Unnumbered first, then IP + if (id != null) { + LOG.debug("Unnumbered termination point type: {}", id); + return new UnnumberedBuilder().setUnnumberedId(id).build(); + } + + final IpAddress ip; + if (ipv6InterfaceIdentifier != null) { + ip = new IpAddress(ipv6InterfaceIdentifier); + } else if (ipv4InterfaceIdentifier != null) { + ip = new IpAddress(ipv4InterfaceIdentifier); + } else { + ip = null; + } + + if (ip != null) { + LOG.debug("IP termination point type: {}", ip); + return new IpBuilder().setIpAddress(Lists.newArrayList(ip)).build(); + } + + return null; + } + + private TerminationPoint buildLocalTp(final UriBuilder base, final LinkDescriptors linkDescriptors) { + final TpId id = buildLocalTpId(base, linkDescriptors); + final TerminationPointType t = getTpType(linkDescriptors.getIpv4InterfaceAddress(), linkDescriptors.getIpv6InterfaceAddress(), + linkDescriptors.getLinkLocalIdentifier()); + + return buildTp(id, t); + } + + private TpId buildRemoteTpId(final UriBuilder base, final LinkDescriptors linkDescriptors) { + return buildTpId(base, linkDescriptors.getMultiTopologyId(), linkDescriptors.getIpv4NeighborAddress(), + linkDescriptors.getIpv6NeighborAddress(), linkDescriptors.getLinkRemoteIdentifier()); + } + + private TerminationPoint buildRemoteTp(final UriBuilder base, final LinkDescriptors linkDescriptors) { + final TpId id = buildRemoteTpId(base, linkDescriptors); + final TerminationPointType t = getTpType(linkDescriptors.getIpv4NeighborAddress(), linkDescriptors.getIpv6NeighborAddress(), + linkDescriptors.getLinkRemoteIdentifier()); + + return buildTp(id, t); + } + + private InstanceIdentifier buildLinkIdentifier(final UriBuilder base, final LinkId id) { + return getInstanceIdentifier().child( + org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Link.class, + new LinkKey(id)); + } + + private static Float bandwidthToFloat(final Bandwidth bandwidth) { + return ByteBuffer.wrap(bandwidth.getValue()).getFloat(); + } + + private static BigDecimal bandwidthToBigDecimal(final Bandwidth bandwidth) { + return BigDecimal.valueOf(bandwidthToFloat(bandwidth)); + } + + private static List unreservedBandwidthList( + final List input) { + final List ret = new ArrayList<>(input.size()); + + for (final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.UnreservedBandwidth i : input) { + ret.add(new UnreservedBandwidthBuilder().setBandwidth(bandwidthToBigDecimal(i.getBandwidth())).setKey( + new UnreservedBandwidthKey(i.getPriority())).build()); + } + + return ret; + } + + private org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpLinkAttributes1 isisLinkAttributes( + final TopologyIdentifier topologyIdentifier, final LinkAttributes la) { + final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.link.attributes.isis.link.attributes.TedBuilder tb = new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.link.attributes.isis.link.attributes.TedBuilder(); + + if (la != null) { + if (la.getAdminGroup() != null) { + tb.setColor(la.getAdminGroup().getValue()); + } + if (la.getTeMetric() != null) { + tb.setTeDefaultMetric(la.getTeMetric().getValue()); + } + if (la.getUnreservedBandwidth() != null) { + tb.setUnreservedBandwidth(unreservedBandwidthList(la.getUnreservedBandwidth())); + } + if (la.getMaxLinkBandwidth() != null) { + tb.setMaxLinkBandwidth(bandwidthToBigDecimal(la.getMaxLinkBandwidth())); + } + if (la.getMaxReservableBandwidth() != null) { + tb.setMaxResvLinkBandwidth(bandwidthToBigDecimal(la.getMaxReservableBandwidth())); + } + } + + final IsisLinkAttributesBuilder ilab = new IsisLinkAttributesBuilder(); + ilab.setTed(tb.build()); + if (topologyIdentifier != null) { + ilab.setMultiTopologyId(topologyIdentifier.getValue().shortValue()); + } + + return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpLinkAttributes1Builder().setIsisLinkAttributes( + ilab.build()).build(); + } + + private org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpLinkAttributes1 ospfLinkAttributes( + final TopologyIdentifier topologyIdentifier, final LinkAttributes la) { + final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.link.attributes.ospf.link.attributes.TedBuilder tb = new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.link.attributes.ospf.link.attributes.TedBuilder(); + + if (la != null) { + if (la.getAdminGroup() != null) { + tb.setColor(la.getAdminGroup().getValue()); + } + if (la.getTeMetric() != null) { + tb.setTeDefaultMetric(la.getTeMetric().getValue()); + } + if (la.getUnreservedBandwidth() != null) { + tb.setUnreservedBandwidth(unreservedBandwidthList(la.getUnreservedBandwidth())); + } + if (la.getMaxLinkBandwidth() != null) { + tb.setMaxLinkBandwidth(bandwidthToBigDecimal(la.getMaxLinkBandwidth())); + } + if (la.getMaxReservableBandwidth() != null) { + tb.setMaxResvLinkBandwidth(bandwidthToBigDecimal(la.getMaxReservableBandwidth())); + } + } + + final OspfLinkAttributesBuilder ilab = new OspfLinkAttributesBuilder(); + ilab.setTed(tb.build()); + if (topologyIdentifier != null) { + ilab.setMultiTopologyId(topologyIdentifier.getValue().shortValue()); + } + + return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpLinkAttributes1Builder().setOspfLinkAttributes( + ilab.build()).build(); + } + + private NodeHolder getNode(final NodeId id) { + if (this.nodes.containsKey(id)) { + LOG.debug("Node {} is already present", id); + return this.nodes.get(id); + } + + final NodeHolder ret = new NodeHolder(id); + this.nodes.put(id, ret); + return ret; + } + + private void putNode(final DataModification, DataObject> trans, final NodeHolder holder) { + if (holder.syncState(trans)) { + this.nodes.remove(holder.getNodeId()); + } + } + + private void createLink(final DataModification, DataObject> trans, final UriBuilder base, + final LinkstateRoute value, final LinkCase l, final Attributes attributes) { + final LinkAttributes la = ((org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.LinkCase) attributes.getAugmentation( + Attributes1.class).getAttributeType()).getLinkAttributes(); + + final IgpLinkAttributesBuilder ilab = new IgpLinkAttributesBuilder(); + if (la != null) { + if (la.getMetric() != null) { + ilab.setMetric(la.getMetric().getValue()); + } + ilab.setName(la.getLinkName()); + } + + switch (value.getProtocolId()) { + case Direct: + case Static: + case Unknown: + break; + case IsisLevel1: + case IsisLevel2: + ilab.addAugmentation( + org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpLinkAttributes1.class, + isisLinkAttributes(l.getLinkDescriptors().getMultiTopologyId(), la)); + break; + case Ospf: + ilab.addAugmentation(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpLinkAttributes1.class, + ospfLinkAttributes(l.getLinkDescriptors().getMultiTopologyId(), la)); + break; + } + + final LinkBuilder lb = new LinkBuilder(); + lb.setLinkId(buildLinkId(base, l)); + lb.addAugmentation(Link1.class, new Link1Builder().setIgpLinkAttributes(ilab.build()).build()); + + final NodeId srcNode = buildNodeId(base, l.getLocalNodeDescriptors()); + LOG.debug("Link {} implies source node {}", l, srcNode); + + final NodeId dstNode = buildNodeId(base, l.getRemoteNodeDescriptors()); + LOG.debug("Link {} implies destination node {}", l, dstNode); + + final TerminationPoint srcTp = buildLocalTp(base, l.getLinkDescriptors()); + LOG.debug("Link {} implies source TP {}", l, srcTp); + + final TerminationPoint dstTp = buildRemoteTp(base, l.getLinkDescriptors()); + LOG.debug("Link {} implies destination TP {}", l, dstTp); + + lb.setSource(new SourceBuilder().setSourceNode(srcNode).setSourceTp(srcTp.getTpId()).build()); + lb.setDestination(new DestinationBuilder().setDestNode(dstNode).setDestTp(dstTp.getTpId()).build()); + + final NodeHolder snh = getNode(srcNode); + snh.addTp(srcTp, lb.getLinkId(), false); + LOG.debug("Created TP {} as link source", srcTp); + putNode(trans, snh); + + final NodeHolder dnh = getNode(dstNode); + dnh.addTp(dstTp, lb.getLinkId(), true); + LOG.debug("Created TP {} as link destination", dstTp); + putNode(trans, dnh); + + final InstanceIdentifier lid = buildLinkIdentifier(base, lb.getLinkId()); + final Link link = lb.build(); + + /* + * Transaction's putOperationalData() does a merge. Force it onto a replace + * by removing the data. + */ + trans.removeOperationalData(lid); + trans.putOperationalData(lid, link); + LOG.debug("Created link {} at {} for {}", link, lid, l); + } + + private void removeTp(final DataModification, DataObject> trans, final NodeId node, final TpId tp, + final LinkId link, final boolean isRemote) { + final NodeHolder nh = this.nodes.get(node); + if (nh != null) { + nh.removeTp(tp, link, isRemote); + putNode(trans, nh); + } else { + LOG.warn("Removed non-existent node {}", node); + } + } + + private void removeLink(final DataModification, DataObject> trans, final UriBuilder base, final LinkCase l) { + final LinkId id = buildLinkId(base, l); + final InstanceIdentifier lid = buildLinkIdentifier(base, id); + trans.removeOperationalData(lid); + LOG.debug("Removed link {}", lid); + + removeTp(trans, buildNodeId(base, l.getLocalNodeDescriptors()), buildLocalTpId(base, l.getLinkDescriptors()), id, false); + removeTp(trans, buildNodeId(base, l.getRemoteNodeDescriptors()), buildRemoteTpId(base, l.getLinkDescriptors()), id, true); + } + + private List nodeMultiTopology(final List list) { + final List ret = new ArrayList<>(list.size()); + for (final TopologyIdentifier id : list) { + ret.add(id.getValue().shortValue()); + } + return ret; + } + + private org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpNodeAttributes1 isisNodeAttributes( + final NodeIdentifier node, final NodeAttributes na) { + final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.node.attributes.isis.node.attributes.TedBuilder tb = new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.isis.node.attributes.isis.node.attributes.TedBuilder(); + final IsisNodeAttributesBuilder ab = new IsisNodeAttributesBuilder(); + + if (na != null) { + if (na.getIpv4RouterId() != null) { + tb.setTeRouterIdIpv4(na.getIpv4RouterId()); + } + if (na.getIpv6RouterId() != null) { + tb.setTeRouterIdIpv6(na.getIpv6RouterId()); + } + if (na.getTopologyIdentifier() != null) { + ab.setMultiTopologyId(nodeMultiTopology(na.getTopologyIdentifier())); + } + } + + final CRouterIdentifier ri = node.getCRouterIdentifier(); + if (ri instanceof IsisPseudonodeCase) { + final IsisPseudonode pn = ((IsisPseudonodeCase) ri).getIsisPseudonode(); + ab.setIso(new IsoBuilder().setIsoPseudonodeId(new IsoPseudonodeId(pn.toString())).build()); + } else if (ri instanceof IsisNodeCase) { + final IsisNode in = ((IsisNodeCase) ri).getIsisNode(); + ab.setIso(new IsoBuilder().setIsoSystemId(new IsoSystemId(in.getIsoSystemId().toString())).build()); + } + + ab.setTed(tb.build()); + + return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpNodeAttributes1Builder().setIsisNodeAttributes( + ab.build()).build(); + } + + private org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpNodeAttributes1 ospfNodeAttributes( + final NodeDescriptors node, final NodeAttributes na) { + final org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.ospf.node.attributes.TedBuilder tb = new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.ospf.node.attributes.ospf.node.attributes.TedBuilder(); + final OspfNodeAttributesBuilder ab = new OspfNodeAttributesBuilder(); + + if (na != null) { + if (na.getIpv4RouterId() != null) { + tb.setTeRouterIdIpv4(na.getIpv4RouterId()); + } + if (na.getIpv6RouterId() != null) { + tb.setTeRouterIdIpv6(na.getIpv6RouterId()); + } + if (na.getTopologyIdentifier() != null) { + ab.setMultiTopologyId(nodeMultiTopology(na.getTopologyIdentifier())); + } + } + + final CRouterIdentifier ri = node.getCRouterIdentifier(); + if (ri instanceof OspfPseudonodeCase) { + final OspfPseudonode pn = ((OspfPseudonodeCase) ri).getOspfPseudonode(); + + ab.setRouterType(new PseudonodeBuilder().setPseudonode(Boolean.TRUE).build()); + ab.setDrInterfaceId(pn.getLanInterface().getValue()); + } else if (ri instanceof OspfNodeCase) { + // TODO: what should we do with in.getOspfRouterId()? + // final OspfNode in = ((OspfNodeCase) ri).getOspfNode(); + + if (na != null) { + final NodeFlagBits nf = na.getNodeFlags(); + if (nf != null) { + if (nf.isAbr()) { + ab.setRouterType(new AbrBuilder().setAbr(Boolean.TRUE).build()); + } else if (!nf.isExternal()) { + ab.setRouterType(new InternalBuilder().setInternal(Boolean.TRUE).build()); + } + } + } + } + + ab.setTed(tb.build()); + + return new org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpNodeAttributes1Builder().setOspfNodeAttributes( + ab.build()).build(); + } + + private void createNode(final DataModification, DataObject> trans, final UriBuilder base, + final LinkstateRoute value, final NodeCase n, final Attributes attributes) { + final NodeAttributes na = ((org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.NodeCase) attributes.getAugmentation( + Attributes1.class).getAttributeType()).getNodeAttributes(); + final IgpNodeAttributesBuilder inab = new IgpNodeAttributesBuilder(); + + final List ids = new ArrayList<>(); + if (na != null) { + if (na.getIpv4RouterId() != null) { + ids.add(new IpAddress(na.getIpv4RouterId())); + } + if (na.getIpv6RouterId() != null) { + ids.add(new IpAddress(na.getIpv6RouterId())); + } + if (na.getDynamicHostname() != null) { + inab.setName(new DomainName(na.getDynamicHostname())); + } + } + + if (!ids.isEmpty()) { + inab.setRouterId(ids); + } + + switch (value.getProtocolId()) { + case Direct: + case Static: + case Unknown: + break; + case IsisLevel1: + case IsisLevel2: + inab.addAugmentation( + org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.isis.topology.rev131021.IgpNodeAttributes1.class, + isisNodeAttributes(n.getNodeDescriptors(), na)); + break; + case Ospf: + inab.addAugmentation(org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.ospf.topology.rev131021.IgpNodeAttributes1.class, + ospfNodeAttributes(n.getNodeDescriptors(), na)); + break; + } + + final NodeId nid = buildNodeId(base, n.getNodeDescriptors()); + final NodeHolder nh = getNode(nid); + + /* + * Eventhough the the holder creates a dummy structure, we need to duplicate it here, + * as that is the API requirement. The reason for it is the possible presence of supporting + * node -- something which the holder does not track. + */ + final NodeBuilder nb = new NodeBuilder(); + nb.setNodeId(nid); + nb.setKey(new NodeKey(nb.getNodeId())); + + nh.advertized(nb, inab); + putNode(trans, nh); + } + + private void removeNode(final DataModification, DataObject> trans, final UriBuilder base, final NodeCase n) { + final NodeId id = buildNodeId(base, n.getNodeDescriptors()); + final NodeHolder nh = this.nodes.get(id); + if (nh != null) { + nh.unadvertized(); + putNode(trans, nh); + } else { + LOG.warn("Node {} does not have a holder", id); + } + } + + private void createPrefix(final DataModification, DataObject> trans, final UriBuilder base, + final LinkstateRoute value, final PrefixCase p, final Attributes attributes) { + final IpPrefix ippfx = p.getIpReachabilityInformation(); + if (ippfx == null) { + LOG.warn("IP reachability not present in prefix {} route {}, skipping it", p, value); + return; + } + + final PrefixBuilder pb = new PrefixBuilder(); + pb.setKey(new PrefixKey(ippfx)); + pb.setPrefix(ippfx); + + final PrefixAttributes pa = ((org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.linkstate.route.attributes.attribute.type.PrefixCase) attributes.getAugmentation( + Attributes1.class).getAttributeType()).getPrefixAttributes(); + if (pa != null) { + pb.setMetric(pa.getPrefixMetric().getValue()); + } + + switch (value.getProtocolId()) { + case Direct: + case IsisLevel1: + case IsisLevel2: + case Static: + case Unknown: + break; + case Ospf: + if (pa != null) { + pb.addAugmentation( + Prefix1.class, + new Prefix1Builder().setOspfPrefixAttributes( + new OspfPrefixAttributesBuilder().setForwardingAddress(pa.getOspfForwardingAddress().getIpv4Address()).build()).build()); + } + break; + } + + final Prefix pfx = pb.build(); + + /* + * All set, but... the hosting node may not exist, we may need to fake it. + */ + final NodeId node = buildNodeId(base, p.getAdvertisingNodeDescriptors()); + final NodeHolder nh = getNode(node); + nh.addPrefix(pfx); + LOG.debug("Created prefix {} for {}", pfx, p); + putNode(trans, nh); + } + + private void removePrefix(final DataModification, DataObject> trans, final UriBuilder base, final PrefixCase p) { + final NodeId node = buildNodeId(base, p.getAdvertisingNodeDescriptors()); + final NodeHolder nh = this.nodes.get(node); + if (nh != null) { + nh.removePrefix(p); + LOG.debug("Removed prefix {}", p); + putNode(trans, nh); + } else { + LOG.warn("Removing prefix from non-existing node {}", node); + } + } + + @Override + protected void createObject(final DataModification, DataObject> trans, + final InstanceIdentifier id, final LinkstateRoute value) { + final UriBuilder base = new UriBuilder(value); + + final ObjectType t = value.getObjectType(); + if (t instanceof LinkCase) { + createLink(trans, base, value, (LinkCase) t, value.getAttributes()); + } else if (t instanceof NodeCase) { + createNode(trans, base, value, (NodeCase) t, value.getAttributes()); + } else if (t instanceof PrefixCase) { + createPrefix(trans, base, value, (PrefixCase) t, value.getAttributes()); + } else { + throw new IllegalStateException("Unhandled object class " + t.getImplementedInterface()); + } + } + + @Override + protected void removeObject(final DataModification, DataObject> trans, + final InstanceIdentifier id, final LinkstateRoute value) { + final UriBuilder base = new UriBuilder(value); + + final ObjectType t = value.getObjectType(); + if (t instanceof LinkCase) { + removeLink(trans, base, (LinkCase) t); + } else if (t instanceof NodeCase) { + removeNode(trans, base, (NodeCase) t); + } else if (t instanceof PrefixCase) { + removePrefix(trans, base, (PrefixCase) t); + } else { + throw new IllegalStateException("Unhandled object class " + t.getImplementedInterface()); + } + } } diff --git a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/LocRIBListener.java b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/LocRIBListener.java index c36e45e0ec..c6618cdf3c 100644 --- a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/LocRIBListener.java +++ b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/LocRIBListener.java @@ -15,14 +15,12 @@ import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; public interface LocRIBListener extends EventListener { - /** - * @param trans Modification transaction. The implementation must explicitly commit - * it if it wishes to have its modifications propagated. The transaction - * is not shared with any other entity and will be cleaned up by the - * caller if it is not committed before this method returns. - * @param event Data change event - * @param depth Subscription path depth. - */ - void onLocRIBChange(DataModification, DataObject> trans, - DataChangeEvent, DataObject> event); + /** + * @param trans Modification transaction. The implementation must explicitly commit it if it wishes to have its + * modifications propagated. The transaction is not shared with any other entity and will be cleaned up by + * the caller if it is not committed before this method returns. + * @param event Data change event + * @param depth Subscription path depth. + */ + void onLocRIBChange(DataModification, DataObject> trans, DataChangeEvent, DataObject> event); } diff --git a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/UriBuilder.java b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/UriBuilder.java index 04b2160427..faa2c8e3de 100644 --- a/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/UriBuilder.java +++ b/bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/UriBuilder.java @@ -7,6 +7,8 @@ */ package org.opendaylight.bgpcep.bgp.topology.provider; +import com.google.common.primitives.UnsignedBytes; + import org.apache.commons.codec.binary.Hex; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.NodeIdentifier; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev131125.bgp.rib.rib.loc.rib.tables.routes.linkstate.routes._case.linkstate.routes.LinkstateRoute; @@ -22,109 +24,107 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.link import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.primitives.UnsignedBytes; - final class UriBuilder { - private static final Logger LOG = LoggerFactory.getLogger(UriBuilder.class); - private final StringBuilder sb; + private static final Logger LOG = LoggerFactory.getLogger(UriBuilder.class); + private final StringBuilder sb; - UriBuilder(final UriBuilder base, final String type) { - this.sb = new StringBuilder(base.sb); - this.sb.append("type=").append(type); - } + UriBuilder(final UriBuilder base, final String type) { + this.sb = new StringBuilder(base.sb); + this.sb.append("type=").append(type); + } - UriBuilder(final LinkstateRoute route) { - this.sb = new StringBuilder("bgpls://"); + UriBuilder(final LinkstateRoute route) { + this.sb = new StringBuilder("bgpls://"); - if (route.getDistinguisher() != null) { - this.sb.append(route.getDistinguisher().getValue().toString()).append(':'); - } + if (route.getDistinguisher() != null) { + this.sb.append(route.getDistinguisher().getValue().toString()).append(':'); + } - this.sb.append(route.getProtocolId().toString()).append(':').append(route.getIdentifier().getValue().toString()).append('/'); - } + this.sb.append(route.getProtocolId().toString()).append(':').append(route.getIdentifier().getValue().toString()).append('/'); + } - UriBuilder add(final String name, final Object value) { - if (value != null) { - this.sb.append('&').append(name).append('=').append(value.toString()); - } - return this; - } + UriBuilder add(final String name, final Object value) { + if (value != null) { + this.sb.append('&').append(name).append('=').append(value.toString()); + } + return this; + } - UriBuilder add(final LinkCase link) { - add("local-", link.getLocalNodeDescriptors()); - add("remote-", link.getRemoteNodeDescriptors()); + UriBuilder add(final LinkCase link) { + add("local-", link.getLocalNodeDescriptors()); + add("remote-", link.getRemoteNodeDescriptors()); - final LinkDescriptors ld = link.getLinkDescriptors(); - if (ld.getIpv4InterfaceAddress() != null) { - add("ipv4-iface", ld.getIpv4InterfaceAddress().getValue()); - } - if (ld.getIpv4NeighborAddress() != null) { - add("ipv4-neigh", ld.getIpv4NeighborAddress().getValue()); - } - if (ld.getIpv6InterfaceAddress() != null) { - add("ipv6-iface", ld.getIpv6InterfaceAddress().getValue()); - } - if (ld.getIpv6NeighborAddress() != null) { - add("ipv6-neigh", ld.getIpv6NeighborAddress().getValue()); - } - if (ld.getMultiTopologyId() != null) { - add("mt", ld.getMultiTopologyId().getValue()); - } - add("local-id", ld.getLinkLocalIdentifier()); - add("remote-id", ld.getLinkRemoteIdentifier()); - return this; - } + final LinkDescriptors ld = link.getLinkDescriptors(); + if (ld.getIpv4InterfaceAddress() != null) { + add("ipv4-iface", ld.getIpv4InterfaceAddress().getValue()); + } + if (ld.getIpv4NeighborAddress() != null) { + add("ipv4-neigh", ld.getIpv4NeighborAddress().getValue()); + } + if (ld.getIpv6InterfaceAddress() != null) { + add("ipv6-iface", ld.getIpv6InterfaceAddress().getValue()); + } + if (ld.getIpv6NeighborAddress() != null) { + add("ipv6-neigh", ld.getIpv6NeighborAddress().getValue()); + } + if (ld.getMultiTopologyId() != null) { + add("mt", ld.getMultiTopologyId().getValue()); + } + add("local-id", ld.getLinkLocalIdentifier()); + add("remote-id", ld.getLinkRemoteIdentifier()); + return this; + } - private String isoId(final byte[] bytes) { - final StringBuilder sb = new StringBuilder(); - sb.append(Hex.encodeHexString(new byte[] { bytes[0], bytes[1] })); - sb.append('.'); - sb.append(Hex.encodeHexString(new byte[] { bytes[2], bytes[3] })); - sb.append('.'); - sb.append(Hex.encodeHexString(new byte[] { bytes[4], bytes[5] })); - return sb.toString(); - } + private String isoId(final byte[] bytes) { + final StringBuilder sb = new StringBuilder(); + sb.append(Hex.encodeHexString(new byte[] { bytes[0], bytes[1] })); + sb.append('.'); + sb.append(Hex.encodeHexString(new byte[] { bytes[2], bytes[3] })); + sb.append('.'); + sb.append(Hex.encodeHexString(new byte[] { bytes[4], bytes[5] })); + return sb.toString(); + } - private String formatRouterIdentifier(final CRouterIdentifier routerIdentifier) { - if (routerIdentifier == null) { - return null; - } + private String formatRouterIdentifier(final CRouterIdentifier routerIdentifier) { + if (routerIdentifier == null) { + return null; + } - if (routerIdentifier instanceof IsisNodeCase) { - return isoId(((IsisNodeCase)routerIdentifier).getIsisNode().getIsoSystemId().getValue()); - } else if (routerIdentifier instanceof IsisPseudonodeCase) { - final IsisPseudonode r = ((IsisPseudonodeCase)routerIdentifier).getIsisPseudonode(); - return isoId(r.getIsIsRouterIdentifier().getIsoSystemId().getValue()) + '.' + - Hex.encodeHexString(new byte[] { UnsignedBytes.checkedCast(r.getPsn()) }); - } else if (routerIdentifier instanceof OspfNodeCase) { - return ((OspfNodeCase)routerIdentifier).getOspfNode().getOspfRouterId().toString(); - } else if (routerIdentifier instanceof OspfPseudonodeCase) { - final OspfPseudonode r = ((OspfPseudonodeCase)routerIdentifier).getOspfPseudonode(); - return r.getOspfRouterId().toString() + ':' + r.getLanInterface().getValue(); - } else { - LOG.warn("Unhandled router identifier type {}, fallback to toString()", routerIdentifier.getImplementedInterface()); - return routerIdentifier.toString(); - } - } + if (routerIdentifier instanceof IsisNodeCase) { + return isoId(((IsisNodeCase) routerIdentifier).getIsisNode().getIsoSystemId().getValue()); + } else if (routerIdentifier instanceof IsisPseudonodeCase) { + final IsisPseudonode r = ((IsisPseudonodeCase) routerIdentifier).getIsisPseudonode(); + return isoId(r.getIsIsRouterIdentifier().getIsoSystemId().getValue()) + '.' + + Hex.encodeHexString(new byte[] { UnsignedBytes.checkedCast(r.getPsn()) }); + } else if (routerIdentifier instanceof OspfNodeCase) { + return ((OspfNodeCase) routerIdentifier).getOspfNode().getOspfRouterId().toString(); + } else if (routerIdentifier instanceof OspfPseudonodeCase) { + final OspfPseudonode r = ((OspfPseudonodeCase) routerIdentifier).getOspfPseudonode(); + return r.getOspfRouterId().toString() + ':' + r.getLanInterface().getValue(); + } else { + LOG.warn("Unhandled router identifier type {}, fallback to toString()", routerIdentifier.getImplementedInterface()); + return routerIdentifier.toString(); + } + } - UriBuilder add(final String prefix, final NodeIdentifier node) { - if (node.getAsNumber() != null) { - add(prefix + "as", node.getAsNumber().getValue()); - } - if (node.getDomainId() != null) { - add(prefix + "domain", node.getDomainId().getValue()); - } - if (node.getAreaId() != null) { - add(prefix + "area", node.getAreaId().getValue()); - } - add(prefix + "router", formatRouterIdentifier(node.getCRouterIdentifier())); - return this; - } + UriBuilder add(final String prefix, final NodeIdentifier node) { + if (node.getAsNumber() != null) { + add(prefix + "as", node.getAsNumber().getValue()); + } + if (node.getDomainId() != null) { + add(prefix + "domain", node.getDomainId().getValue()); + } + if (node.getAreaId() != null) { + add(prefix + "area", node.getAreaId().getValue()); + } + add(prefix + "router", formatRouterIdentifier(node.getCRouterIdentifier())); + return this; + } - @Override - public String toString() { - final String ret = this.sb.toString(); - LOG.trace("New URI {}", ret); - return ret; - } + @Override + public String toString() { + final String ret = this.sb.toString(); + LOG.trace("New URI {}", ret); + return ret; + } } diff --git a/bgp/update-mock-config/src/main/java/org/opendaylight/controller/config/yang/bgp/mock/BgpMockModule.java b/bgp/update-mock-config/src/main/java/org/opendaylight/controller/config/yang/bgp/mock/BgpMockModule.java index f22d753299..c5561258c7 100644 --- a/bgp/update-mock-config/src/main/java/org/opendaylight/controller/config/yang/bgp/mock/BgpMockModule.java +++ b/bgp/update-mock-config/src/main/java/org/opendaylight/controller/config/yang/bgp/mock/BgpMockModule.java @@ -16,6 +16,10 @@ */ package org.opendaylight.controller.config.yang.bgp.mock; +import com.google.common.base.Function; +import com.google.common.collect.Collections2; +import com.google.common.collect.Lists; + import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -28,74 +32,70 @@ import org.opendaylight.protocol.bgp.rib.mock.BGPMock; import org.opendaylight.protocol.bgp.util.BinaryBGPDumpFileParser; import org.opendaylight.protocol.bgp.util.HexDumpBGPFileParser; -import com.google.common.base.Function; -import com.google.common.collect.Collections2; -import com.google.common.collect.Lists; - /** * */ public final class BgpMockModule extends org.opendaylight.controller.config.yang.bgp.mock.AbstractBgpMockModule { - private List bgpMessages; + private List bgpMessages; - public BgpMockModule(org.opendaylight.controller.config.api.ModuleIdentifier name, - org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { - super(name, dependencyResolver); - } + public BgpMockModule(org.opendaylight.controller.config.api.ModuleIdentifier name, + org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(name, dependencyResolver); + } - public BgpMockModule(org.opendaylight.controller.config.api.ModuleIdentifier name, - org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, BgpMockModule oldModule, - java.lang.AutoCloseable oldInstance) { - super(name, dependencyResolver, oldModule, oldInstance); - } + public BgpMockModule(org.opendaylight.controller.config.api.ModuleIdentifier name, + org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, BgpMockModule oldModule, + java.lang.AutoCloseable oldInstance) { + super(name, dependencyResolver, oldModule, oldInstance); + } - @Override - public void validate() { - super.validate(); - JmxAttributeValidationException.checkCondition(!(getBinDump() != null && getHexDump() != null), - "Both 'HexDump' and 'BinDump' contain value", this.binDumpJmxAttribute); - if (getBinDump() == null && getHexDump() == null) { - this.bgpMessages = new ArrayList<>(); - } else if (getHexDump() != null) { - try { - this.bgpMessages = HexDumpBGPFileParser.parseMessages(getHexDump()); - this.bgpMessages = Lists.newArrayList(fixMessages(this.bgpMessages)); - } catch (final Exception e) { - JmxAttributeValidationException.wrap(e, "Error while parsing HexDump", this.hexDumpJmxAttribute); - } - } else { - try { - this.bgpMessages = BinaryBGPDumpFileParser.parseMessages(getBinDump()); - } catch (final Exception e) { - JmxAttributeValidationException.wrap(e, "Error while parsing BinDump", this.binDumpJmxAttribute); - } - } - } + @Override + public void validate() { + super.validate(); + JmxAttributeValidationException.checkCondition(!(getBinDump() != null && getHexDump() != null), + "Both 'HexDump' and 'BinDump' contain value", this.binDumpJmxAttribute); + if (getBinDump() == null && getHexDump() == null) { + this.bgpMessages = new ArrayList<>(); + } else if (getHexDump() != null) { + try { + this.bgpMessages = HexDumpBGPFileParser.parseMessages(getHexDump()); + this.bgpMessages = Lists.newArrayList(fixMessages(this.bgpMessages)); + } catch (final Exception e) { + JmxAttributeValidationException.wrap(e, "Error while parsing HexDump", this.hexDumpJmxAttribute); + } + } else { + try { + this.bgpMessages = BinaryBGPDumpFileParser.parseMessages(getBinDump()); + } catch (final Exception e) { + JmxAttributeValidationException.wrap(e, "Error while parsing BinDump", this.binDumpJmxAttribute); + } + } + } - @Override - public java.lang.AutoCloseable createInstance() { - try { - return new BGPMock(getEventBusDependency(), ServiceLoaderBGPExtensionProviderContext.createConsumerContext().getMessageRegistry(), this.bgpMessages); - } catch (final Exception e) { - throw new RuntimeException("Failed to create consumer context.", e); - } - } + @Override + public java.lang.AutoCloseable createInstance() { + try { + return new BGPMock(getEventBusDependency(), ServiceLoaderBGPExtensionProviderContext.createConsumerContext().getMessageRegistry(), this.bgpMessages); + } catch (final Exception e) { + throw new RuntimeException("Failed to create consumer context.", e); + } + } - private Collection fixMessages(Collection bgpMessages) { - return Collections2.transform(bgpMessages, new Function() { + private Collection fixMessages(Collection bgpMessages) { + return Collections2.transform(bgpMessages, new Function() { - @Nullable - @Override - public byte[] apply(@Nullable byte[] input) { - final byte[] ret = new byte[input.length + 1]; - // ff - ret[0] = -1; - for (int i = 0; i < input.length; i++) { - ret[i + 1] = input[i]; - } - return ret; - } - }); - } + @Nullable + @Override + public byte[] apply(@Nullable byte[] input) { + final byte[] ret = new byte[input.length + 1]; + // ff + ret[0] = -1; + for (int i = 0; i < input.length; i++) { + ret[i + 1] = input[i]; + } + return ret; + } + }); + } } diff --git a/bgp/update-mock-config/src/main/java/org/opendaylight/controller/config/yang/bgp/mock/BgpMockModuleFactory.java b/bgp/update-mock-config/src/main/java/org/opendaylight/controller/config/yang/bgp/mock/BgpMockModuleFactory.java index 2bc8533b6b..edb3a0c5b9 100644 --- a/bgp/update-mock-config/src/main/java/org/opendaylight/controller/config/yang/bgp/mock/BgpMockModuleFactory.java +++ b/bgp/update-mock-config/src/main/java/org/opendaylight/controller/config/yang/bgp/mock/BgpMockModuleFactory.java @@ -19,8 +19,6 @@ package org.opendaylight.controller.config.yang.bgp.mock; /** * */ -public class BgpMockModuleFactory - extends - org.opendaylight.controller.config.yang.bgp.mock.AbstractBgpMockModuleFactory { +public class BgpMockModuleFactory extends org.opendaylight.controller.config.yang.bgp.mock.AbstractBgpMockModuleFactory { } diff --git a/bgp/update-mock-config/src/main/yang/bgp-mock.yang b/bgp/update-mock-config/src/main/yang/bgp-mock.yang index b7b491f104..7e51525782 100644 --- a/bgp/update-mock-config/src/main/yang/bgp-mock.yang +++ b/bgp/update-mock-config/src/main/yang/bgp-mock.yang @@ -18,11 +18,11 @@ module bgp-mock { BGP message parser pure Java implementation. Copyright (c)2013 Cisco Systems, Inc. All rights reserved.; - + This program and the accompanying materials are made available - under the terms of the Eclipse Public License v1.0 which - accompanies this distribution, and is available at - http://www.eclipse.org/legal/epl-v10.html"; + under the terms of the Eclipse Public License v1.0 which + accompanies this distribution, and is available at + http://www.eclipse.org/legal/epl-v10.html"; revision "2013-04-09" { description @@ -34,25 +34,25 @@ module bgp-mock { config:provided-service bgpl:listener; } - augment "/config:modules/config:module/config:configuration" { - case bgp-mock { - when "/config:modules/config:module/config:type = 'bgp-mock'"; - container eventBus { - uses config:service-ref { - refine type { - mandatory true; - config:required-identity th:eventbus; - } - } - } - - leaf hexDump { - type string; - } - - leaf binDump { - type binary; - } + augment "/config:modules/config:module/config:configuration" { + case bgp-mock { + when "/config:modules/config:module/config:type = 'bgp-mock'"; + container eventBus { + uses config:service-ref { + refine type { + mandatory true; + config:required-identity th:eventbus; + } + } + } + + leaf hexDump { + type string; + } + + leaf binDump { + type binary; + } } } } diff --git a/bgp/update-mock-config/src/test/java/org/opendaylight/controller/config/yang/bgp/mock/BgpMockModuleTest.java b/bgp/update-mock-config/src/test/java/org/opendaylight/controller/config/yang/bgp/mock/BgpMockModuleTest.java index a8e1824c99..bf531330fd 100644 --- a/bgp/update-mock-config/src/test/java/org/opendaylight/controller/config/yang/bgp/mock/BgpMockModuleTest.java +++ b/bgp/update-mock-config/src/test/java/org/opendaylight/controller/config/yang/bgp/mock/BgpMockModuleTest.java @@ -23,69 +23,61 @@ import org.opendaylight.controller.config.util.ConfigTransactionJMXClient; import org.opendaylight.controller.config.yang.threadpool.impl.EventBusModuleFactory; import org.opendaylight.controller.config.yang.threadpool.impl.EventBusModuleMXBean; - public class BgpMockModuleTest extends AbstractConfigTest { - private final String instanceName = "bgp-mock"; - - private BgpMockModuleFactory factory; - - private EventBusModuleFactory eventBusFactory; - - @Before - public void setUp() throws Exception { - this.factory = new BgpMockModuleFactory(); - this.eventBusFactory = new EventBusModuleFactory(); - super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver( - this.factory, this.eventBusFactory)); - } - - @Test - public void testValidationExceptionBothAttributesSet() - throws InstanceAlreadyExistsException { - try { - ConfigTransactionJMXClient transaction = configRegistryClient - .createTransaction(); - createInstance(transaction, this.factory.getImplementationName(), - instanceName, new byte[]{1}, "hexMsg", this.eventBusFactory.getImplementationName()); - transaction.validateConfig(); - fail(); - } catch (ValidationException e) { - assertTrue(e.getMessage().contains("Both 'HexDump' and 'BinDump' contain value")); - } - } - - @Test - public void testCreateBean() throws Exception { - ConfigTransactionJMXClient transaction = configRegistryClient - .createTransaction(); - createInstance(transaction, this.factory.getImplementationName(), - instanceName, null, "hexString", this.eventBusFactory.getImplementationName()); - transaction.validateConfig(); - CommitStatus status = transaction.commit(); - assertBeanCount(1, factory.getImplementationName()); - assertStatus(status, 2, 0, 0); - } - - public static ObjectName createInstance( - final ConfigTransactionJMXClient transaction, - final String moduleName, final String instanceName, - final byte[] binDump, final String hexDump, final String eventBusImplName) throws InstanceAlreadyExistsException { - ObjectName nameCreated = transaction.createModule(moduleName, - instanceName); - BgpMockModuleMXBean mxBean = transaction.newMBeanProxy( - nameCreated, BgpMockModuleMXBean.class); - mxBean.setBinDump(binDump); - mxBean.setHexDump(hexDump); - mxBean.setEventBus(createEventBus(transaction, eventBusImplName, "event-bus1")); - return nameCreated; - } - - public static ObjectName createEventBus(final ConfigTransactionJMXClient transaction, - final String moduleName, final String instanceName) throws InstanceAlreadyExistsException { - ObjectName nameCreated = transaction.createModule(moduleName, instanceName); - transaction.newMBeanProxy(nameCreated, EventBusModuleMXBean.class); - return nameCreated; - } - + private final String instanceName = "bgp-mock"; + + private BgpMockModuleFactory factory; + + private EventBusModuleFactory eventBusFactory; + + @Before + public void setUp() throws Exception { + this.factory = new BgpMockModuleFactory(); + this.eventBusFactory = new EventBusModuleFactory(); + super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(this.factory, this.eventBusFactory)); + } + + @Test + public void testValidationExceptionBothAttributesSet() throws InstanceAlreadyExistsException { + try { + ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction(); + createInstance(transaction, this.factory.getImplementationName(), instanceName, new byte[] { 1 }, "hexMsg", + this.eventBusFactory.getImplementationName()); + transaction.validateConfig(); + fail(); + } catch (ValidationException e) { + assertTrue(e.getMessage().contains("Both 'HexDump' and 'BinDump' contain value")); + } + } + + @Test + public void testCreateBean() throws Exception { + ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction(); + createInstance(transaction, this.factory.getImplementationName(), instanceName, null, "hexString", + this.eventBusFactory.getImplementationName()); + transaction.validateConfig(); + CommitStatus status = transaction.commit(); + assertBeanCount(1, factory.getImplementationName()); + assertStatus(status, 2, 0, 0); + } + + public static ObjectName createInstance(final ConfigTransactionJMXClient transaction, final String moduleName, + final String instanceName, final byte[] binDump, final String hexDump, final String eventBusImplName) + throws InstanceAlreadyExistsException { + ObjectName nameCreated = transaction.createModule(moduleName, instanceName); + BgpMockModuleMXBean mxBean = transaction.newMBeanProxy(nameCreated, BgpMockModuleMXBean.class); + mxBean.setBinDump(binDump); + mxBean.setHexDump(hexDump); + mxBean.setEventBus(createEventBus(transaction, eventBusImplName, "event-bus1")); + return nameCreated; + } + + public static ObjectName createEventBus(final ConfigTransactionJMXClient transaction, final String moduleName, final String instanceName) + throws InstanceAlreadyExistsException { + ObjectName nameCreated = transaction.createModule(moduleName, instanceName); + transaction.newMBeanProxy(nameCreated, EventBusModuleMXBean.class); + return nameCreated; + } + } diff --git a/bgp/util/src/main/java/org/opendaylight/protocol/bgp/util/BinaryBGPDumpFileParser.java b/bgp/util/src/main/java/org/opendaylight/protocol/bgp/util/BinaryBGPDumpFileParser.java index a047f0e684..fb6a3357da 100644 --- a/bgp/util/src/main/java/org/opendaylight/protocol/bgp/util/BinaryBGPDumpFileParser.java +++ b/bgp/util/src/main/java/org/opendaylight/protocol/bgp/util/BinaryBGPDumpFileParser.java @@ -7,6 +7,10 @@ */ package org.opendaylight.protocol.bgp.util; +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; +import com.google.common.primitives.UnsignedBytes; + import java.util.Arrays; import java.util.List; @@ -15,10 +19,6 @@ import javax.annotation.concurrent.Immutable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; -import com.google.common.primitives.UnsignedBytes; - /** * This extracter extracts BGP messages in binary form from a file in MRT format. * (http://www.ripe.net/data-tools/stats/ris/ris-raw-data) The parser detects BGP messages by searching for 16 FF bytes, @@ -26,57 +26,57 @@ import com.google.common.primitives.UnsignedBytes; */ @Immutable public final class BinaryBGPDumpFileParser { - private static final Logger LOG = LoggerFactory.getLogger(BinaryBGPDumpFileParser.class); - private static final int MINIMAL_LENGTH = 19; - private static final int MARKER_LENGTH = 16; + private static final Logger LOG = LoggerFactory.getLogger(BinaryBGPDumpFileParser.class); + private static final int MINIMAL_LENGTH = 19; + private static final int MARKER_LENGTH = 16; - private BinaryBGPDumpFileParser() { + private BinaryBGPDumpFileParser() { - } + } - /** - * Extract BGP messages from binary file in MRT format. - * - * @param byteArray array of bytes with BGP messages in binary form. - * @return list with byte arrays representing extracted messages. - */ - public static List parseMessages(final byte[] byteArray) { + /** + * Extract BGP messages from binary file in MRT format. + * + * @param byteArray array of bytes with BGP messages in binary form. + * @return list with byte arrays representing extracted messages. + */ + public static List parseMessages(final byte[] byteArray) { - final List messages = Lists.newLinkedList(); - // search for 16 FFs - for (int i = 0; i < byteArray.length; i++) { - final byte b = byteArray[i]; + final List messages = Lists.newLinkedList(); + // search for 16 FFs + for (int i = 0; i < byteArray.length; i++) { + final byte b = byteArray[i]; - // Marker start - if (b == UnsignedBytes.MAX_VALUE) { - final int start = i; - int ffCount = 0; - for (int j = i; j < i + (17); j++) { - // Check marker - if (byteArray[j] == UnsignedBytes.MAX_VALUE) { - ffCount++; - } else if (ffCount == MARKER_LENGTH) { - if (j == (i + MARKER_LENGTH)) { - // Parse length - final int length = UnsignedBytes.toInt(byteArray[j]) * 256 + UnsignedBytes.toInt(byteArray[j + 1]); + // Marker start + if (b == UnsignedBytes.MAX_VALUE) { + final int start = i; + int ffCount = 0; + for (int j = i; j < i + (17); j++) { + // Check marker + if (byteArray[j] == UnsignedBytes.MAX_VALUE) { + ffCount++; + } else if (ffCount == MARKER_LENGTH) { + if (j == (i + MARKER_LENGTH)) { + // Parse length + final int length = UnsignedBytes.toInt(byteArray[j]) * 256 + UnsignedBytes.toInt(byteArray[j + 1]); - Preconditions.checkArgument(length >= MINIMAL_LENGTH, "Invalid message at index " + start - + ", length atribute is lower than " + MINIMAL_LENGTH); + Preconditions.checkArgument(length >= MINIMAL_LENGTH, "Invalid message at index " + start + + ", length atribute is lower than " + MINIMAL_LENGTH); - final byte[] message = Arrays.copyOfRange(byteArray, start, start + length); - messages.add(message); - j += length - MARKER_LENGTH; - } - i = j; - break; - } else { - break; - } - } - } + final byte[] message = Arrays.copyOfRange(byteArray, start, start + length); + messages.add(message); + j += length - MARKER_LENGTH; + } + i = j; + break; + } else { + break; + } + } + } - } - LOG.info("Succesfully extracted {} messages", messages.size()); - return messages; - } + } + LOG.info("Succesfully extracted {} messages", messages.size()); + return messages; + } } diff --git a/bgp/util/src/main/java/org/opendaylight/protocol/bgp/util/HexDumpBGPFileParser.java b/bgp/util/src/main/java/org/opendaylight/protocol/bgp/util/HexDumpBGPFileParser.java index ecb1e41087..432a9a88b7 100644 --- a/bgp/util/src/main/java/org/opendaylight/protocol/bgp/util/HexDumpBGPFileParser.java +++ b/bgp/util/src/main/java/org/opendaylight/protocol/bgp/util/HexDumpBGPFileParser.java @@ -7,6 +7,12 @@ */ package org.opendaylight.protocol.bgp.util; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Preconditions; +import com.google.common.base.Strings; +import com.google.common.collect.Lists; +import com.google.common.io.CharStreams; + import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -22,12 +28,6 @@ import org.opendaylight.protocol.util.ByteArray; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Preconditions; -import com.google.common.base.Strings; -import com.google.common.collect.Lists; -import com.google.common.io.CharStreams; - /** * Read text file, parse BGP messages. File can contain comments or other data. BGP messages are detected using 16 ff * marker. New lines and spaces are ignored. Use {@link ByteArray#bytesToHexString(byte[])} for serializing bytes to @@ -35,70 +35,70 @@ import com.google.common.io.CharStreams; */ @Immutable public final class HexDumpBGPFileParser { - private static final int MINIMAL_LENGTH = 19; - private static final Logger LOG = LoggerFactory.getLogger(HexDumpBGPFileParser.class); - private static final String FF_16 = Strings.repeat("FF", 16); + private static final int MINIMAL_LENGTH = 19; + private static final Logger LOG = LoggerFactory.getLogger(HexDumpBGPFileParser.class); + private static final String FF_16 = Strings.repeat("FF", 16); - private HexDumpBGPFileParser() { + private HexDumpBGPFileParser() { - } + } - public static List parseMessages(final File file) throws IOException { - Preconditions.checkArgument(file != null, "Filename cannot be null"); - return parseMessages(new FileInputStream(file)); - } + public static List parseMessages(final File file) throws IOException { + Preconditions.checkArgument(file != null, "Filename cannot be null"); + return parseMessages(new FileInputStream(file)); + } - public static List parseMessages(final InputStream is) throws IOException { - Preconditions.checkNotNull(is); - try (InputStreamReader isr = new InputStreamReader(is)) { - return parseMessages(CharStreams.toString(isr)); - } finally { - is.close(); - } - } + public static List parseMessages(final InputStream is) throws IOException { + Preconditions.checkNotNull(is); + try (InputStreamReader isr = new InputStreamReader(is)) { + return parseMessages(CharStreams.toString(isr)); + } finally { + is.close(); + } + } - public static List parseMessages(final String c) { - final String content = clearWhiteSpaceToUpper(c); - // search for 16 FFs + public static List parseMessages(final String c) { + final String content = clearWhiteSpaceToUpper(c); + // search for 16 FFs - final List messages = Lists.newLinkedList(); - int idx = content.indexOf(FF_16, 0); - while (idx > -1) { - // next 2 bytes are length - final int lengthIdx = idx + 16 * 2; - final int messageIdx = lengthIdx + 4; - final String hexLength = content.substring(lengthIdx, messageIdx); - byte[] byteLength = null; - try { - byteLength = Hex.decodeHex(hexLength.toCharArray()); - } catch (final DecoderException e) { - throw new IllegalArgumentException("Failed to decode message length", e); - } - final int length = ByteArray.bytesToInt(byteLength); - final int messageEndIdx = idx + length * 2; + final List messages = Lists.newLinkedList(); + int idx = content.indexOf(FF_16, 0); + while (idx > -1) { + // next 2 bytes are length + final int lengthIdx = idx + 16 * 2; + final int messageIdx = lengthIdx + 4; + final String hexLength = content.substring(lengthIdx, messageIdx); + byte[] byteLength = null; + try { + byteLength = Hex.decodeHex(hexLength.toCharArray()); + } catch (final DecoderException e) { + throw new IllegalArgumentException("Failed to decode message length", e); + } + final int length = ByteArray.bytesToInt(byteLength); + final int messageEndIdx = idx + length * 2; - // Assert that message is longer than minimum 19(header.length == 19) - // If length in BGP message would be 0, loop would never end - Preconditions.checkArgument(length >= MINIMAL_LENGTH, "Invalid message at index " + idx + ", length atribute is lower than " - + MINIMAL_LENGTH); + // Assert that message is longer than minimum 19(header.length == 19) + // If length in BGP message would be 0, loop would never end + Preconditions.checkArgument(length >= MINIMAL_LENGTH, "Invalid message at index " + idx + ", length atribute is lower than " + + MINIMAL_LENGTH); - final String hexMessage = content.substring(idx, messageEndIdx); - byte[] message = null; - try { - message = Hex.decodeHex(hexMessage.toCharArray()); - } catch (final DecoderException e) { - new IllegalArgumentException("Failed to decode message body", e); - } - messages.add(message); - idx = messageEndIdx; - idx = content.indexOf(FF_16, idx); - } - LOG.info("Succesfully extracted {} messages", messages.size()); - return messages; - } + final String hexMessage = content.substring(idx, messageEndIdx); + byte[] message = null; + try { + message = Hex.decodeHex(hexMessage.toCharArray()); + } catch (final DecoderException e) { + new IllegalArgumentException("Failed to decode message body", e); + } + messages.add(message); + idx = messageEndIdx; + idx = content.indexOf(FF_16, idx); + } + LOG.info("Succesfully extracted {} messages", messages.size()); + return messages; + } - @VisibleForTesting - static String clearWhiteSpaceToUpper(final String line) { - return line.replaceAll("\\s", "").toUpperCase(); - } + @VisibleForTesting + static String clearWhiteSpaceToUpper(final String line) { + return line.replaceAll("\\s", "").toUpperCase(); + } } diff --git a/bgp/util/src/test/java/org/opendaylight/protocol/bgp/util/BGPBinaryFileParserTest.java b/bgp/util/src/test/java/org/opendaylight/protocol/bgp/util/BGPBinaryFileParserTest.java index 88e04c254f..4f010b7af7 100644 --- a/bgp/util/src/test/java/org/opendaylight/protocol/bgp/util/BGPBinaryFileParserTest.java +++ b/bgp/util/src/test/java/org/opendaylight/protocol/bgp/util/BGPBinaryFileParserTest.java @@ -21,63 +21,63 @@ import org.junit.Test; public class BGPBinaryFileParserTest { - private final byte ff = (byte) 255; + private final byte ff = (byte) 255; - @Test - public void testCorrectExtraction() throws IOException { - final List parsedMessages = extractFromFile("/BgpMessages.bin"); + @Test + public void testCorrectExtraction() throws IOException { + final List parsedMessages = extractFromFile("/BgpMessages.bin"); - assertThat(parsedMessages.size(), is(43)); + assertThat(parsedMessages.size(), is(43)); - // 1st message - assertThat(parsedMessages.get(0).length, is(19)); - checkMarker(parsedMessages); - assertThat(parsedMessages.get(0)[16], is((byte) 0)); - assertThat(parsedMessages.get(0)[17], is((byte) 19)); - assertThat(parsedMessages.get(0)[18], is((byte) 4)); + // 1st message + assertThat(parsedMessages.get(0).length, is(19)); + checkMarker(parsedMessages); + assertThat(parsedMessages.get(0)[16], is((byte) 0)); + assertThat(parsedMessages.get(0)[17], is((byte) 19)); + assertThat(parsedMessages.get(0)[18], is((byte) 4)); - // 39th message - assertThat(parsedMessages.get(38).length, is(91)); - checkMarker(parsedMessages); - assertThat(parsedMessages.get(38)[16], is((byte) 0)); - assertThat(parsedMessages.get(38)[17], is((byte) 91)); - assertThat(parsedMessages.get(38)[18], is((byte) 2)); - assertThat(parsedMessages.get(38)[90], is((byte) 236)); + // 39th message + assertThat(parsedMessages.get(38).length, is(91)); + checkMarker(parsedMessages); + assertThat(parsedMessages.get(38)[16], is((byte) 0)); + assertThat(parsedMessages.get(38)[17], is((byte) 91)); + assertThat(parsedMessages.get(38)[18], is((byte) 2)); + assertThat(parsedMessages.get(38)[90], is((byte) 236)); - } + } - private List extractFromFile(final String fileName) throws IOException { - final InputStream is = BGPBinaryFileParserTest.class.getResourceAsStream(fileName); - assertNotNull("File not found - " + fileName); - if (is == null) { - throw new IOException("Failed to get resource " + fileName); - } + private List extractFromFile(final String fileName) throws IOException { + final InputStream is = BGPBinaryFileParserTest.class.getResourceAsStream(fileName); + assertNotNull("File not found - " + fileName); + if (is == null) { + throw new IOException("Failed to get resource " + fileName); + } - final ByteArrayOutputStream bis = new ByteArrayOutputStream(); - final byte[] data = new byte[1000]; - int nRead = 0; - while ((nRead = is.read(data, 0, data.length)) != -1) { - bis.write(data, 0, nRead); - } - bis.flush(); - return BinaryBGPDumpFileParser.parseMessages(bis.toByteArray()); - } + final ByteArrayOutputStream bis = new ByteArrayOutputStream(); + final byte[] data = new byte[1000]; + int nRead = 0; + while ((nRead = is.read(data, 0, data.length)) != -1) { + bis.write(data, 0, nRead); + } + bis.flush(); + return BinaryBGPDumpFileParser.parseMessages(bis.toByteArray()); + } - private void checkMarker(final List parsedMessages) { - for (int i = 0; i < 16; i++) { - assertThat(parsedMessages.get(0)[i], is(this.ff)); - } - } + private void checkMarker(final List parsedMessages) { + for (int i = 0; i < 16; i++) { + assertThat(parsedMessages.get(0)[i], is(this.ff)); + } + } - /** - * In BgpMessages_wrong_header file, first FF sequence is corrupted - * - * @throws IOException - */ - @Test - public void testCorruptedHeader() throws IOException { - final List parsedMessages = extractFromFile("/BgpMessages_wrong_header.bin"); - assertEquals(42, parsedMessages.size()); - } + /** + * In BgpMessages_wrong_header file, first FF sequence is corrupted + * + * @throws IOException + */ + @Test + public void testCorruptedHeader() throws IOException { + final List parsedMessages = extractFromFile("/BgpMessages_wrong_header.bin"); + assertEquals(42, parsedMessages.size()); + } } diff --git a/bgp/util/src/test/java/org/opendaylight/protocol/bgp/util/BGPHexFileParserTest.java b/bgp/util/src/test/java/org/opendaylight/protocol/bgp/util/BGPHexFileParserTest.java index 3169a1f32a..fa5c2df96c 100644 --- a/bgp/util/src/test/java/org/opendaylight/protocol/bgp/util/BGPHexFileParserTest.java +++ b/bgp/util/src/test/java/org/opendaylight/protocol/bgp/util/BGPHexFileParserTest.java @@ -20,40 +20,41 @@ import org.junit.Test; public class BGPHexFileParserTest { - public static final String hexDumpFileName = "bgp_hex.txt"; - private final String fileNameInvalid = "BgpMessage_Hex_InvalidLength.bin"; - private final int expectedSize = 25; - - @Test - public void testCleanWhiteSpace() { - final String input = "abc def\r\nghi\nj"; - assertEquals("ABCDEFGHIJ", HexDumpBGPFileParser.clearWhiteSpaceToUpper(input)); - } - - @Test - public void testParsing() throws Exception { - final List result = HexDumpBGPFileParser.parseMessages(getClass().getClassLoader().getResourceAsStream(BGPHexFileParserTest.hexDumpFileName)); - assertEquals(this.expectedSize, result.size()); - } - - @Test - public void testParsingInvalidMessage() throws Exception { - try { - HexDumpBGPFileParser.parseMessages(getClass().getClassLoader().getResourceAsStream(this.fileNameInvalid)); - fail("Exception should have occured."); - } catch (final IllegalArgumentException e) { - assertThat(e.getMessage(), containsString("Invalid message at index 0, length atribute is lower than 19")); - } - } - - @Test - public void testParsingInvalidFile() throws Exception { - try { - HexDumpBGPFileParser.parseMessages(new File("bad file name")); - fail("Exception should have occured."); - } catch (final FileNotFoundException e) { - assertThat(e.getMessage(), containsString("bad file name")); - } - } + public static final String hexDumpFileName = "bgp_hex.txt"; + private final String fileNameInvalid = "BgpMessage_Hex_InvalidLength.bin"; + private final int expectedSize = 25; + + @Test + public void testCleanWhiteSpace() { + final String input = "abc def\r\nghi\nj"; + assertEquals("ABCDEFGHIJ", HexDumpBGPFileParser.clearWhiteSpaceToUpper(input)); + } + + @Test + public void testParsing() throws Exception { + final List result = HexDumpBGPFileParser.parseMessages(getClass().getClassLoader().getResourceAsStream( + BGPHexFileParserTest.hexDumpFileName)); + assertEquals(this.expectedSize, result.size()); + } + + @Test + public void testParsingInvalidMessage() throws Exception { + try { + HexDumpBGPFileParser.parseMessages(getClass().getClassLoader().getResourceAsStream(this.fileNameInvalid)); + fail("Exception should have occured."); + } catch (final IllegalArgumentException e) { + assertThat(e.getMessage(), containsString("Invalid message at index 0, length atribute is lower than 19")); + } + } + + @Test + public void testParsingInvalidFile() throws Exception { + try { + HexDumpBGPFileParser.parseMessages(new File("bad file name")); + fail("Exception should have occured."); + } catch (final FileNotFoundException e) { + assertThat(e.getMessage(), containsString("bad file name")); + } + } } diff --git a/concepts/src/main/java/org/opendaylight/protocol/concepts/AbstractRegistration.java b/concepts/src/main/java/org/opendaylight/protocol/concepts/AbstractRegistration.java index 9ba802c5e8..7a34fdac2f 100644 --- a/concepts/src/main/java/org/opendaylight/protocol/concepts/AbstractRegistration.java +++ b/concepts/src/main/java/org/opendaylight/protocol/concepts/AbstractRegistration.java @@ -11,28 +11,25 @@ import javax.annotation.concurrent.GuardedBy; import javax.annotation.concurrent.ThreadSafe; /** - * Utility registration handle. It is a convenience for register-style method - * which can return an AutoCloseable realized by a subclass of this class. - * Invoking the close() method triggers unregistration of the state the method - * installed. + * Utility registration handle. It is a convenience for register-style method which can return an AutoCloseable realized + * by a subclass of this class. Invoking the close() method triggers unregistration of the state the method installed. */ @ThreadSafe public abstract class AbstractRegistration implements AutoCloseable { - @GuardedBy("this") - private boolean closed = false; + @GuardedBy("this") + private boolean closed = false; - /** - * Remove the state referenced by this registration. This method is - * guaranteed to be called at most once. The referenced state must be - * retained until this method is invoked. - */ - protected abstract void removeRegistration(); + /** + * Remove the state referenced by this registration. This method is guaranteed to be called at most once. The + * referenced state must be retained until this method is invoked. + */ + protected abstract void removeRegistration(); - @Override - public final synchronized void close() { - if (!closed) { - closed = true; - removeRegistration(); - } - } + @Override + public final synchronized void close() { + if (!closed) { + closed = true; + removeRegistration(); + } + } } diff --git a/concepts/src/main/java/org/opendaylight/protocol/concepts/DefaultInstanceReference.java b/concepts/src/main/java/org/opendaylight/protocol/concepts/DefaultInstanceReference.java index b65ad30367..c88445196b 100644 --- a/concepts/src/main/java/org/opendaylight/protocol/concepts/DefaultInstanceReference.java +++ b/concepts/src/main/java/org/opendaylight/protocol/concepts/DefaultInstanceReference.java @@ -7,23 +7,23 @@ */ package org.opendaylight.protocol.concepts; +import com.google.common.base.Preconditions; + import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import com.google.common.base.Preconditions; - /** * */ public class DefaultInstanceReference implements InstanceReference { - private final InstanceIdentifier instanceIdentifier; + private final InstanceIdentifier instanceIdentifier; - public DefaultInstanceReference(final InstanceIdentifier instanceIdentifier) { - this.instanceIdentifier = Preconditions.checkNotNull(instanceIdentifier); - } + public DefaultInstanceReference(final InstanceIdentifier instanceIdentifier) { + this.instanceIdentifier = Preconditions.checkNotNull(instanceIdentifier); + } - @Override - public final InstanceIdentifier getInstanceIdentifier() { - return instanceIdentifier; - } + @Override + public final InstanceIdentifier getInstanceIdentifier() { + return instanceIdentifier; + } } diff --git a/concepts/src/main/java/org/opendaylight/protocol/concepts/HandlerRegistry.java b/concepts/src/main/java/org/opendaylight/protocol/concepts/HandlerRegistry.java index 8a339ac352..e16cf9c854 100644 --- a/concepts/src/main/java/org/opendaylight/protocol/concepts/HandlerRegistry.java +++ b/concepts/src/main/java/org/opendaylight/protocol/concepts/HandlerRegistry.java @@ -11,22 +11,22 @@ import javax.annotation.concurrent.ThreadSafe; @ThreadSafe public class HandlerRegistry { - private final MultiRegistry, S> serializers = new MultiRegistry<>(); - private final MultiRegistry parsers = new MultiRegistry<>(); + private final MultiRegistry, S> serializers = new MultiRegistry<>(); + private final MultiRegistry parsers = new MultiRegistry<>(); - public AbstractRegistration registerParser(final int type, final P parser) { - return parsers.register(type, parser); - } + public AbstractRegistration registerParser(final int type, final P parser) { + return parsers.register(type, parser); + } - public P getParser(final int type) { - return parsers.get(type); - } + public P getParser(final int type) { + return parsers.get(type); + } - public AbstractRegistration registerSerializer(final Class clazz, final S serializer) { - return serializers.register(clazz, serializer); - } + public AbstractRegistration registerSerializer(final Class clazz, final S serializer) { + return serializers.register(clazz, serializer); + } - public S getSerializer(final Class clazz) { - return serializers.get(clazz); - } + public S getSerializer(final Class clazz) { + return serializers.get(clazz); + } } diff --git a/concepts/src/main/java/org/opendaylight/protocol/concepts/InstanceReference.java b/concepts/src/main/java/org/opendaylight/protocol/concepts/InstanceReference.java index 3a135cda20..e15c4a5513 100644 --- a/concepts/src/main/java/org/opendaylight/protocol/concepts/InstanceReference.java +++ b/concepts/src/main/java/org/opendaylight/protocol/concepts/InstanceReference.java @@ -14,10 +14,10 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; * A reference to an object identified by an InstanceIdentifier. */ public interface InstanceReference { - /** - * Returns the InstanceIdentifier of the object. - * - * @return instance identifier - */ - InstanceIdentifier getInstanceIdentifier(); + /** + * Returns the InstanceIdentifier of the object. + * + * @return instance identifier + */ + InstanceIdentifier getInstanceIdentifier(); } diff --git a/concepts/src/main/java/org/opendaylight/protocol/concepts/Ipv4Util.java b/concepts/src/main/java/org/opendaylight/protocol/concepts/Ipv4Util.java index e643ea8e48..18894f04d1 100644 --- a/concepts/src/main/java/org/opendaylight/protocol/concepts/Ipv4Util.java +++ b/concepts/src/main/java/org/opendaylight/protocol/concepts/Ipv4Util.java @@ -7,6 +7,12 @@ */ package org.opendaylight.protocol.concepts; +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; +import com.google.common.net.InetAddresses; +import com.google.common.primitives.Bytes; +import com.google.common.primitives.UnsignedBytes; + import java.net.Inet4Address; import java.net.InetAddress; import java.net.UnknownHostException; @@ -19,124 +25,118 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types. import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix; -import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; -import com.google.common.net.InetAddresses; -import com.google.common.primitives.Bytes; -import com.google.common.primitives.UnsignedBytes; - /** * Util class for creating generated Ipv4Address. */ public final class Ipv4Util { - private Ipv4Util() { - } + private Ipv4Util() { + } - public static final int IP4_LENGTH = 4; + public static final int IP4_LENGTH = 4; - /** - * Converts byte array to Inet4Address. - * - * @param bytes to be converted - * @return InetAddress instance - * @throws IllegalArgumentException if {@link UnknownHostException} is thrown. - */ - private static InetAddress getAddress(final byte[] bytes) { - try { - return Inet4Address.getByAddress(bytes); - } catch (final UnknownHostException e) { - throw new IllegalArgumentException("Failed to construct IPv4 address", e); - } - } + /** + * Converts byte array to Inet4Address. + * + * @param bytes to be converted + * @return InetAddress instance + * @throws IllegalArgumentException if {@link UnknownHostException} is thrown. + */ + private static InetAddress getAddress(final byte[] bytes) { + try { + return Inet4Address.getByAddress(bytes); + } catch (final UnknownHostException e) { + throw new IllegalArgumentException("Failed to construct IPv4 address", e); + } + } - /** - * Converts byte array to Ipv4Address. - * - * @param bytes to be converted to Ipv4Address - * @return Ipv4Address - */ - public static Ipv4Address addressForBytes(final byte[] bytes) { - return new Ipv4Address(InetAddresses.toAddrString(getAddress(bytes))); - } + /** + * Converts byte array to Ipv4Address. + * + * @param bytes to be converted to Ipv4Address + * @return Ipv4Address + */ + public static Ipv4Address addressForBytes(final byte[] bytes) { + return new Ipv4Address(InetAddresses.toAddrString(getAddress(bytes))); + } - /** - * Converts Ipv4Address to byte array. - * - * @param address Ipv4Address to be converted - * @return byte array - */ - public static byte[] bytesForAddress(final Ipv4Address address) { - final InetAddress a = InetAddresses.forString(address.getValue()); - Preconditions.checkArgument(a instanceof Inet4Address); - return a.getAddress(); - } + /** + * Converts Ipv4Address to byte array. + * + * @param address Ipv4Address to be converted + * @return byte array + */ + public static byte[] bytesForAddress(final Ipv4Address address) { + final InetAddress a = InetAddresses.forString(address.getValue()); + Preconditions.checkArgument(a instanceof Inet4Address); + return a.getAddress(); + } - /** - * Converts Ipv4Prefix to byte array. - * - * @param prefix Ipv4Prefix to be converted - * @return byte array - */ - public static byte[] bytesForPrefix(final Ipv4Prefix prefix) { - final String p = prefix.getValue(); - final int sep = p.indexOf('/'); - final InetAddress a = InetAddresses.forString(p.substring(0, sep)); - Preconditions.checkArgument(a instanceof Inet4Address); - final byte[] bytes = a.getAddress(); - return Bytes.concat(bytes, new byte[] { Byte.valueOf(p.substring(sep + 1, p.length())) }); - } + /** + * Converts Ipv4Prefix to byte array. + * + * @param prefix Ipv4Prefix to be converted + * @return byte array + */ + public static byte[] bytesForPrefix(final Ipv4Prefix prefix) { + final String p = prefix.getValue(); + final int sep = p.indexOf('/'); + final InetAddress a = InetAddresses.forString(p.substring(0, sep)); + Preconditions.checkArgument(a instanceof Inet4Address); + final byte[] bytes = a.getAddress(); + return Bytes.concat(bytes, new byte[] { Byte.valueOf(p.substring(sep + 1, p.length())) }); + } - /** - * Creates an Ipv4Prefix object from given byte array. - * - * @param bytes IPv4 address - * @param length prefix length - * @return Ipv4Prefix object - */ - public static Ipv4Prefix prefixForBytes(final byte[] bytes, final int length) { - Preconditions.checkArgument(length <= bytes.length * Byte.SIZE); - final byte[] tmp = Arrays.copyOfRange(bytes, 0, IP4_LENGTH); - final InetAddress a = getAddress(tmp); - return new Ipv4Prefix(InetAddresses.toAddrString(a) + '/' + length); - } + /** + * Creates an Ipv4Prefix object from given byte array. + * + * @param bytes IPv4 address + * @param length prefix length + * @return Ipv4Prefix object + */ + public static Ipv4Prefix prefixForBytes(final byte[] bytes, final int length) { + Preconditions.checkArgument(length <= bytes.length * Byte.SIZE); + final byte[] tmp = Arrays.copyOfRange(bytes, 0, IP4_LENGTH); + final InetAddress a = getAddress(tmp); + return new Ipv4Prefix(InetAddresses.toAddrString(a) + '/' + length); + } - /** - * Creates a list of Ipv4 Prefixes from given byte array. - * - * @param bytes to be converted to List of Ipv4Prefixes. - * @return List - */ - public static List prefixListForBytes(final byte[] bytes) { - if (bytes.length == 0) { - return Collections.emptyList(); - } - final List list = Lists.newArrayList(); - int byteOffset = 0; - while (byteOffset < bytes.length) { - final int bitLength = UnsignedBytes.toInt(ByteArray.subByte(bytes, byteOffset, 1)[0]); - byteOffset += 1; - final int byteCount = (bitLength % Byte.SIZE != 0) ? (bitLength / Byte.SIZE) + 1 : bitLength / Byte.SIZE; - list.add(prefixForBytes(ByteArray.subByte(bytes, byteOffset, byteCount), bitLength)); - byteOffset += byteCount; - } - return list; - } + /** + * Creates a list of Ipv4 Prefixes from given byte array. + * + * @param bytes to be converted to List of Ipv4Prefixes. + * @return List + */ + public static List prefixListForBytes(final byte[] bytes) { + if (bytes.length == 0) { + return Collections.emptyList(); + } + final List list = Lists.newArrayList(); + int byteOffset = 0; + while (byteOffset < bytes.length) { + final int bitLength = UnsignedBytes.toInt(ByteArray.subByte(bytes, byteOffset, 1)[0]); + byteOffset += 1; + final int byteCount = (bitLength % Byte.SIZE != 0) ? (bitLength / Byte.SIZE) + 1 : bitLength / Byte.SIZE; + list.add(prefixForBytes(ByteArray.subByte(bytes, byteOffset, byteCount), bitLength)); + byteOffset += byteCount; + } + return list; + } - /** - * Obtains prefix length from given prefix. - * - * @param prefix - * @return prefix length - */ - public static int getPrefixLength(final IpPrefix prefix) { - String p = ""; - if (prefix.getIpv4Prefix() != null) { - p = prefix.getIpv4Prefix().getValue(); - } else { - p = prefix.getIpv6Prefix().getValue(); - } - final int sep = p.indexOf('/'); - return Integer.valueOf(p.substring(sep + 1, p.length())); - } + /** + * Obtains prefix length from given prefix. + * + * @param prefix + * @return prefix length + */ + public static int getPrefixLength(final IpPrefix prefix) { + String p = ""; + if (prefix.getIpv4Prefix() != null) { + p = prefix.getIpv4Prefix().getValue(); + } else { + p = prefix.getIpv6Prefix().getValue(); + } + final int sep = p.indexOf('/'); + return Integer.valueOf(p.substring(sep + 1, p.length())); + } } diff --git a/concepts/src/main/java/org/opendaylight/protocol/concepts/Ipv6Util.java b/concepts/src/main/java/org/opendaylight/protocol/concepts/Ipv6Util.java index ab7eea5a01..e1b0460149 100644 --- a/concepts/src/main/java/org/opendaylight/protocol/concepts/Ipv6Util.java +++ b/concepts/src/main/java/org/opendaylight/protocol/concepts/Ipv6Util.java @@ -7,6 +7,12 @@ */ package org.opendaylight.protocol.concepts; +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; +import com.google.common.net.InetAddresses; +import com.google.common.primitives.Bytes; +import com.google.common.primitives.UnsignedBytes; + import java.net.Inet6Address; import java.net.InetAddress; import java.net.UnknownHostException; @@ -18,107 +24,101 @@ import org.opendaylight.protocol.util.ByteArray; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix; -import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; -import com.google.common.net.InetAddresses; -import com.google.common.primitives.Bytes; -import com.google.common.primitives.UnsignedBytes; - /** * Util class for creating generated Ipv6Address. */ public final class Ipv6Util { - private Ipv6Util() { - } + private Ipv6Util() { + } - public static final int IPV6_LENGTH = 16; + public static final int IPV6_LENGTH = 16; - /** - * Converts byte array to Inet6Address. - * - * @param bytes to be converted - * @return InetAddress instance - * @throws IllegalArgumentException if {@link UnknownHostException} is thrown. - */ - private static InetAddress getAddress(final byte[] bytes) { - try { - return Inet6Address.getByAddress(bytes); - } catch (final UnknownHostException e) { - throw new IllegalArgumentException("Failed to construct IPv6 address", e); - } - } + /** + * Converts byte array to Inet6Address. + * + * @param bytes to be converted + * @return InetAddress instance + * @throws IllegalArgumentException if {@link UnknownHostException} is thrown. + */ + private static InetAddress getAddress(final byte[] bytes) { + try { + return Inet6Address.getByAddress(bytes); + } catch (final UnknownHostException e) { + throw new IllegalArgumentException("Failed to construct IPv6 address", e); + } + } - /** - * Converts byte array to Ipv6Address. - * - * @param bytes to be converted to Ipv6Address - * @return Ipv6Address - */ - public static Ipv6Address addressForBytes(final byte[] bytes) { - return new Ipv6Address(InetAddresses.toAddrString(getAddress(bytes))); - } + /** + * Converts byte array to Ipv6Address. + * + * @param bytes to be converted to Ipv6Address + * @return Ipv6Address + */ + public static Ipv6Address addressForBytes(final byte[] bytes) { + return new Ipv6Address(InetAddresses.toAddrString(getAddress(bytes))); + } - /** - * Converts Ipv6Address to byte array. - * - * @param address Ipv6Address to be converted - * @return byte array - */ - public static byte[] bytesForAddress(final Ipv6Address address) { - final InetAddress a = InetAddresses.forString(address.getValue()); - Preconditions.checkArgument(a instanceof Inet6Address); - return a.getAddress(); - } + /** + * Converts Ipv6Address to byte array. + * + * @param address Ipv6Address to be converted + * @return byte array + */ + public static byte[] bytesForAddress(final Ipv6Address address) { + final InetAddress a = InetAddresses.forString(address.getValue()); + Preconditions.checkArgument(a instanceof Inet6Address); + return a.getAddress(); + } - /** - * Converts Ipv6Prefix to byte array. - * - * @param prefix Ipv6Prefix to be converted - * @return byte array - */ - public static byte[] bytesForPrefix(final Ipv6Prefix prefix) { - final String p = prefix.getValue(); - final int sep = p.indexOf('/'); - final InetAddress a = InetAddresses.forString(p.substring(0, sep)); - Preconditions.checkArgument(a instanceof Inet6Address); - final byte[] bytes = a.getAddress(); - return Bytes.concat(bytes, new byte[] { Byte.valueOf(p.substring(sep + 1, p.length())) }); - } + /** + * Converts Ipv6Prefix to byte array. + * + * @param prefix Ipv6Prefix to be converted + * @return byte array + */ + public static byte[] bytesForPrefix(final Ipv6Prefix prefix) { + final String p = prefix.getValue(); + final int sep = p.indexOf('/'); + final InetAddress a = InetAddresses.forString(p.substring(0, sep)); + Preconditions.checkArgument(a instanceof Inet6Address); + final byte[] bytes = a.getAddress(); + return Bytes.concat(bytes, new byte[] { Byte.valueOf(p.substring(sep + 1, p.length())) }); + } - /** - * Creates an Ipv6Prefix object from given byte array. - * - * @param bytes IPv6 address - * @param length prefix length - * @return Ipv6Prefix object - */ - public static Ipv6Prefix prefixForBytes(final byte[] bytes, final int length) { - Preconditions.checkArgument(length <= bytes.length * Byte.SIZE); - final byte[] tmp = Arrays.copyOfRange(bytes, 0, IPV6_LENGTH); - final InetAddress a = getAddress(tmp); - return new Ipv6Prefix(InetAddresses.toAddrString(a) + '/' + length); - } + /** + * Creates an Ipv6Prefix object from given byte array. + * + * @param bytes IPv6 address + * @param length prefix length + * @return Ipv6Prefix object + */ + public static Ipv6Prefix prefixForBytes(final byte[] bytes, final int length) { + Preconditions.checkArgument(length <= bytes.length * Byte.SIZE); + final byte[] tmp = Arrays.copyOfRange(bytes, 0, IPV6_LENGTH); + final InetAddress a = getAddress(tmp); + return new Ipv6Prefix(InetAddresses.toAddrString(a) + '/' + length); + } - /** - * Creates a list of Ipv6 Prefixes from given byte array. - * - * @param bytes to be converted to List of Ipv6Prefixes. - * @return List - */ - public static List prefixListForBytes(final byte[] bytes) { - if (bytes.length == 0) { - return Collections.emptyList(); - } + /** + * Creates a list of Ipv6 Prefixes from given byte array. + * + * @param bytes to be converted to List of Ipv6Prefixes. + * @return List + */ + public static List prefixListForBytes(final byte[] bytes) { + if (bytes.length == 0) { + return Collections.emptyList(); + } - final List list = Lists.newArrayList(); - int byteOffset = 0; - while (byteOffset < bytes.length) { - final int bitLength = UnsignedBytes.toInt(ByteArray.subByte(bytes, byteOffset, 1)[0]); - byteOffset += 1; - final int byteCount = (bitLength % Byte.SIZE != 0) ? (bitLength / Byte.SIZE) + 1 : bitLength / Byte.SIZE; - list.add(prefixForBytes(ByteArray.subByte(bytes, byteOffset, byteCount), bitLength)); - byteOffset += byteCount; - } - return list; - } + final List list = Lists.newArrayList(); + int byteOffset = 0; + while (byteOffset < bytes.length) { + final int bitLength = UnsignedBytes.toInt(ByteArray.subByte(bytes, byteOffset, 1)[0]); + byteOffset += 1; + final int byteCount = (bitLength % Byte.SIZE != 0) ? (bitLength / Byte.SIZE) + 1 : bitLength / Byte.SIZE; + list.add(prefixForBytes(ByteArray.subByte(bytes, byteOffset, byteCount), bitLength)); + byteOffset += byteCount; + } + return list; + } } diff --git a/concepts/src/main/java/org/opendaylight/protocol/concepts/MultiRegistry.java b/concepts/src/main/java/org/opendaylight/protocol/concepts/MultiRegistry.java index 28529bca78..da4c3886cd 100644 --- a/concepts/src/main/java/org/opendaylight/protocol/concepts/MultiRegistry.java +++ b/concepts/src/main/java/org/opendaylight/protocol/concepts/MultiRegistry.java @@ -7,6 +7,9 @@ */ package org.opendaylight.protocol.concepts; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ListMultimap; + import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -17,73 +20,69 @@ import javax.annotation.concurrent.ThreadSafe; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.ListMultimap; - /** - * A registry which allows multiple values for a particular key. One of those - * is considered the best and returned as the representative. - * - * When selecting the candidate, we evaluate the order of insertion, picking the - * value inserted first, but then we look at all the other candidates and if there - * is one which is a subclass of the first one, we select that one. + * A registry which allows multiple values for a particular key. One of those is considered the best and returned as the + * representative. + * + * When selecting the candidate, we evaluate the order of insertion, picking the value inserted first, but then we look + * at all the other candidates and if there is one which is a subclass of the first one, we select that one. * * @param key type * @param value type */ @ThreadSafe public final class MultiRegistry { - private static final Logger LOG = LoggerFactory.getLogger(MultiRegistry.class); - private final ConcurrentMap current = new ConcurrentHashMap<>(); + private static final Logger LOG = LoggerFactory.getLogger(MultiRegistry.class); + private final ConcurrentMap current = new ConcurrentHashMap<>(); - @GuardedBy("this") - private final ListMultimap candidates = ArrayListMultimap.create(); + @GuardedBy("this") + private final ListMultimap candidates = ArrayListMultimap.create(); - @GuardedBy("this") - private void updateCurrent(final K key) { - final List values = candidates.get(key); + @GuardedBy("this") + private void updateCurrent(final K key) { + final List values = candidates.get(key); - // Simple case: no candidates - if (values.isEmpty()) { - current.remove(key); - return; - } + // Simple case: no candidates + if (values.isEmpty()) { + current.remove(key); + return; + } - V best = values.get(0); - for (V v : values) { - final Class vc = v.getClass(); - final Class bc = best.getClass(); - if (bc.isAssignableFrom(vc)) { - LOG.debug("{} is superclass of {}, preferring the latter", bc, vc); - best = v; - } else if (vc.isAssignableFrom(bc)) { - LOG.debug("{} is subclass of {}, preferring the former", bc, vc); - } else { - LOG.debug("{} and {} are not related, keeping the former", bc, vc); - } - } + V best = values.get(0); + for (V v : values) { + final Class vc = v.getClass(); + final Class bc = best.getClass(); + if (bc.isAssignableFrom(vc)) { + LOG.debug("{} is superclass of {}, preferring the latter", bc, vc); + best = v; + } else if (vc.isAssignableFrom(bc)) { + LOG.debug("{} is subclass of {}, preferring the former", bc, vc); + } else { + LOG.debug("{} and {} are not related, keeping the former", bc, vc); + } + } - LOG.debug("New best value {}", best); - current.put(key, best); - } + LOG.debug("New best value {}", best); + current.put(key, best); + } - public synchronized AbstractRegistration register(final K key, final V value) { - candidates.put(key, value); - updateCurrent(key); + public synchronized AbstractRegistration register(final K key, final V value) { + candidates.put(key, value); + updateCurrent(key); - final Object lock = this; - return new AbstractRegistration() { - @Override - protected void removeRegistration() { - synchronized (lock) { - candidates.remove(key, value); - updateCurrent(key); - } - } - }; - } + final Object lock = this; + return new AbstractRegistration() { + @Override + protected void removeRegistration() { + synchronized (lock) { + candidates.remove(key, value); + updateCurrent(key); + } + } + }; + } - public V get(final K key) { - return this.current.get(key); - } + public V get(final K key) { + return this.current.get(key); + } } diff --git a/concepts/src/main/yang/iana.yang b/concepts/src/main/yang/iana.yang index a5ca602beb..fd7423c6b4 100644 --- a/concepts/src/main/yang/iana.yang +++ b/concepts/src/main/yang/iana.yang @@ -8,7 +8,7 @@ module iana { description "This module contains the definition of types related to - Internet Assigned Numbers Authority. + Internet Assigned Numbers Authority. Copyright (c)2013 Cisco Systems, Inc. All rights reserved. @@ -23,9 +23,9 @@ module iana { reference "https://www.iana.org/"; } - typedef enterprise-number { - description "Private enterprise number."; - reference "https://www.iana.org/assignments/enterprise-numbers/enterprise-numbers"; - type uint32; - } + typedef enterprise-number { + description "Private enterprise number."; + reference "https://www.iana.org/assignments/enterprise-numbers/enterprise-numbers"; + type uint32; + } } diff --git a/concepts/src/main/yang/ieee754.yang b/concepts/src/main/yang/ieee754.yang index ac4044888c..c64c84a1e8 100644 --- a/concepts/src/main/yang/ieee754.yang +++ b/concepts/src/main/yang/ieee754.yang @@ -23,20 +23,20 @@ module ieee754 { } typedef float32 { - type binary { - length 4; - } - } + type binary { + length 4; + } + } typedef float64 { - type binary { - length 8; - } - } + type binary { + length 8; + } + } typedef float128 { - type binary { - length 16; - } - } + type binary { + length 16; + } + } } diff --git a/concepts/src/main/yang/network-concepts.yang b/concepts/src/main/yang/network-concepts.yang index d529c92a6a..5e487f2c7c 100644 --- a/concepts/src/main/yang/network-concepts.yang +++ b/concepts/src/main/yang/network-concepts.yang @@ -1,60 +1,60 @@ module network-concepts { - yang-version 1; - namespace "urn:opendaylight:params:xml:ns:yang:network:concepts"; - prefix "netc"; - - import ieee754 { prefix ieee754; revision-date 2013-08-19; } - - organization "Cisco Systems, Inc."; - contact "Dana Kutenicsova "; - - description - "This module contains the base data model of used general - concepts. - - Copyright (c)2013 Cisco Systems, Inc. All rights reserved. - - This program and the accompanying materials are made available - under the terms of the Eclipse Public License v1.0 which - accompanies this distribution, and is available at - http://www.eclipse.org/legal/epl-v10.html"; - - revision "2013-11-25" { - description - "Rename to network concepts"; - } - - revision "2013-09-30" { - description - "Initial revision."; - } - - typedef iso-system-identifier { - reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4"; - type binary { - length "6"; - } - } - - typedef igp-metric { - reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.2.3"; - type uint32 { - range "0..16777215"; - } - } - - typedef te-metric { - reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.2.3"; - type uint32; - } - - typedef bandwidth { - type ieee754:float32; - } - - typedef metric { - reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.3.4"; - type uint32; - } + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:network:concepts"; + prefix "netc"; + + import ieee754 { prefix ieee754; revision-date 2013-08-19; } + + organization "Cisco Systems, Inc."; + contact "Dana Kutenicsova "; + + description + "This module contains the base data model of used general + concepts. + + Copyright (c)2013 Cisco Systems, Inc. All rights reserved. + + This program and the accompanying materials are made available + under the terms of the Eclipse Public License v1.0 which + accompanies this distribution, and is available at + http://www.eclipse.org/legal/epl-v10.html"; + + revision "2013-11-25" { + description + "Rename to network concepts"; + } + + revision "2013-09-30" { + description + "Initial revision."; + } + + typedef iso-system-identifier { + reference "https://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.2.1.4"; + type binary { + length "6"; + } + } + + typedef igp-metric { + reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.2.3"; + type uint32 { + range "0..16777215"; + } + } + + typedef te-metric { + reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.2.3"; + type uint32; + } + + typedef bandwidth { + type ieee754:float32; + } + + typedef metric { + reference "http://tools.ietf.org/html/draft-ietf-idr-ls-distribution-03#section-3.3.3.4"; + type uint32; + } } diff --git a/concepts/src/test/java/org/opendaylight/protocol/concepts/ASNumberTest.java b/concepts/src/test/java/org/opendaylight/protocol/concepts/ASNumberTest.java index 0ce6bb0e4b..67ada93b2d 100644 --- a/concepts/src/test/java/org/opendaylight/protocol/concepts/ASNumberTest.java +++ b/concepts/src/test/java/org/opendaylight/protocol/concepts/ASNumberTest.java @@ -22,42 +22,42 @@ import org.junit.Test; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber; public class ASNumberTest { - private AsNumber asn1, asn3, asn4; - - @Before - public void setUp() { - this.asn1 = new AsNumber(4294967295L); - this.asn3 = new AsNumber((long) 200); - this.asn4 = new AsNumber(429496335L); - } - - @Test - public void testHashCode() { - final Set set = new HashSet<>(); - - set.add(this.asn1); - assertEquals(1, set.size()); - - set.add(this.asn3); - assertEquals(2, set.size()); - } - - @Test - public void testGetters() { - assertEquals(4294967295L, this.asn1.getValue().longValue()); - } - - @Test - public void testEquals() { - assertThat(this.asn1, not(equalTo(this.asn3))); - assertThat(this.asn1, not(equalTo(this.asn4))); - assertThat(this.asn1, not(equalTo(new Object()))); - assertFalse(this.asn1.equals(new Object())); - } - - @Test - public void testToString() { - assertEquals("AsNumber [_value=4294967295]", this.asn1.toString()); - assertEquals("AsNumber [_value=200]", this.asn3.toString()); - } + private AsNumber asn1, asn3, asn4; + + @Before + public void setUp() { + this.asn1 = new AsNumber(4294967295L); + this.asn3 = new AsNumber((long) 200); + this.asn4 = new AsNumber(429496335L); + } + + @Test + public void testHashCode() { + final Set set = new HashSet<>(); + + set.add(this.asn1); + assertEquals(1, set.size()); + + set.add(this.asn3); + assertEquals(2, set.size()); + } + + @Test + public void testGetters() { + assertEquals(4294967295L, this.asn1.getValue().longValue()); + } + + @Test + public void testEquals() { + assertThat(this.asn1, not(equalTo(this.asn3))); + assertThat(this.asn1, not(equalTo(this.asn4))); + assertThat(this.asn1, not(equalTo(new Object()))); + assertFalse(this.asn1.equals(new Object())); + } + + @Test + public void testToString() { + assertEquals("AsNumber [_value=4294967295]", this.asn1.toString()); + assertEquals("AsNumber [_value=200]", this.asn3.toString()); + } } diff --git a/concepts/src/test/java/org/opendaylight/protocol/concepts/BandwidthTest.java b/concepts/src/test/java/org/opendaylight/protocol/concepts/BandwidthTest.java index 8d55ceefd7..b1c1b476b9 100644 --- a/concepts/src/test/java/org/opendaylight/protocol/concepts/BandwidthTest.java +++ b/concepts/src/test/java/org/opendaylight/protocol/concepts/BandwidthTest.java @@ -23,45 +23,45 @@ import org.opendaylight.protocol.util.ByteArray; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.Bandwidth; public class BandwidthTest { - private Bandwidth b1, b2, b3, b4; + private Bandwidth b1, b2, b3, b4; - @Before - public void setUp() { - this.b1 = new Bandwidth(ByteArray.intToBytes(1000, 4)); - this.b2 = new Bandwidth(ByteArray.intToBytes(2000, 4)); - this.b3 = new Bandwidth(ByteArray.intToBytes(2000, 4)); - this.b4 = new Bandwidth(ByteArray.intToBytes(100, 4)); - } + @Before + public void setUp() { + this.b1 = new Bandwidth(ByteArray.intToBytes(1000, 4)); + this.b2 = new Bandwidth(ByteArray.intToBytes(2000, 4)); + this.b3 = new Bandwidth(ByteArray.intToBytes(2000, 4)); + this.b4 = new Bandwidth(ByteArray.intToBytes(100, 4)); + } - @Test - public void testBitsBytes() { - assertEquals(1000.0, ByteArray.bytesToLong(this.b1.getValue()), 0.1); - } + @Test + public void testBitsBytes() { + assertEquals(1000.0, ByteArray.bytesToLong(this.b1.getValue()), 0.1); + } - @Test - public void testEquals() { - assertFalse(this.b1.equals(null)); - assertThat(this.b1, not(equalTo(new Object()))); - assertThat(this.b1, equalTo(this.b1)); - assertThat(this.b1, not(equalTo(this.b2))); - assertEquals(this.b2, this.b3); - assertFalse(this.b1.equals(new Object())); - } + @Test + public void testEquals() { + assertFalse(this.b1.equals(null)); + assertThat(this.b1, not(equalTo(new Object()))); + assertThat(this.b1, equalTo(this.b1)); + assertThat(this.b1, not(equalTo(this.b2))); + assertEquals(this.b2, this.b3); + assertFalse(this.b1.equals(new Object())); + } - @Test - public void testHashCode() { - final Set set = new HashSet(); + @Test + public void testHashCode() { + final Set set = new HashSet(); - set.add(this.b1); - assertEquals(1, set.size()); + set.add(this.b1); + assertEquals(1, set.size()); - set.add(this.b2); - assertEquals(2, set.size()); + set.add(this.b2); + assertEquals(2, set.size()); - set.add(this.b3); - assertEquals(2, set.size()); + set.add(this.b3); + assertEquals(2, set.size()); - set.add(this.b4); - assertEquals(3, set.size()); - } + set.add(this.b4); + assertEquals(3, set.size()); + } } diff --git a/concepts/src/test/java/org/opendaylight/protocol/concepts/IPAddressesAndPrefixesTest.java b/concepts/src/test/java/org/opendaylight/protocol/concepts/IPAddressesAndPrefixesTest.java index e46eb5d006..3cf17ad984 100644 --- a/concepts/src/test/java/org/opendaylight/protocol/concepts/IPAddressesAndPrefixesTest.java +++ b/concepts/src/test/java/org/opendaylight/protocol/concepts/IPAddressesAndPrefixesTest.java @@ -12,6 +12,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; +import com.google.common.collect.Lists; + import java.net.UnknownHostException; import java.util.List; @@ -22,97 +24,98 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types. import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix; -import com.google.common.collect.Lists; - public class IPAddressesAndPrefixesTest { - @Test - public void test3() { - assertEquals("123.123.123.123", new Ipv4Address("123.123.123.123").getValue()); - assertEquals("2001::1", new Ipv6Address("2001::1").getValue()); - } - - @Test - public void test4() throws UnknownHostException { - assertNotNull(new IpPrefix(new Ipv4Prefix("123.123.123.123")).getIpv4Prefix()); - assertNotNull(new IpPrefix(new Ipv6Prefix("2001::1")).getIpv6Prefix()); - } - - @Test - public void test5() { - assertEquals("123.123.123.123/24", new Ipv4Prefix("123.123.123.123/24").getValue()); - assertEquals("2001::1/120", new Ipv6Prefix("2001::1/120").getValue()); - } - - @Test - public void testPrefix4ForBytes() { - byte[] bytes = new byte[] { 123, 122, 4, 5 }; - assertEquals(new Ipv4Prefix("123.122.4.5/8"), Ipv4Util.prefixForBytes(bytes, 8)); - assertArrayEquals(new byte[] { 102, 0, 0, 0, 8 }, Ipv4Util.bytesForPrefix(new Ipv4Prefix("102.0.0.0/8"))); - - bytes = new byte[] { (byte) 255, (byte) 255, 0, 0 }; - assertEquals(new Ipv4Prefix("255.255.0.0/16"), Ipv4Util.prefixForBytes(bytes, 16)); - - assertArrayEquals(new byte[] { (byte) 255, (byte) 255, 0, 0, 16 }, Ipv4Util.bytesForPrefix(new Ipv4Prefix("255.255.0.0/16"))); - } - - @Test - public void testAddress4ForBytes() { - final byte[] bytes = new byte[] { (byte) 123, (byte) 122, (byte) 4, (byte) 5 }; - assertEquals(new Ipv4Address("123.122.4.5"), Ipv4Util.addressForBytes(bytes)); - try { - Ipv4Util.addressForBytes(new byte[] { 22, 44, 66, 18, 88, 33 }); - fail(); - } catch (final IllegalArgumentException e) { - assertEquals("Failed to construct IPv4 address", e.getMessage()); - } - } - - @Test - public void testAddress6ForBytes() { - final byte[] bytes = new byte[] { 0x20, (byte) 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }; - assertEquals(new Ipv6Address("2001::1"), Ipv6Util.addressForBytes(bytes)); - try { - Ipv6Util.addressForBytes(new byte[] { 22, 44, 66, 18, 88, 33 }); - fail(); - } catch (final IllegalArgumentException e) { - assertEquals("Failed to construct IPv6 address", e.getMessage()); - } - } - - @Test - public void testPrefixList4ForBytes() { - final byte[] bytes = new byte[] { 22, (byte) 172, (byte) 168, 3, 8, 12, 32, (byte) 192, (byte) 168, 35, 100 }; - final List prefs = Ipv4Util.prefixListForBytes(bytes); - assertEquals( - Lists.newArrayList(new Ipv4Prefix("172.168.3.0/22"), new Ipv4Prefix("12.0.0.0/8"), new Ipv4Prefix("192.168.35.100/32")), - prefs); - } - - @Test - public void testBytesForAddress() { - assertArrayEquals(new byte[] { 12, 58, (byte) 201, 99 }, Ipv4Util.bytesForAddress(new Ipv4Address("12.58.201.99"))); - assertArrayEquals(new byte[] { 0x20, (byte) 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }, Ipv6Util.bytesForAddress(new Ipv6Address("2001::1"))); - } - - @Test - public void testPrefix6ForBytes() { - final byte[] bytes = new byte[] { 0x20, 0x01, 0x0d, (byte) 0xb8, 0x00, 0x01, 0x00, 0x02 }; - assertEquals(new Ipv6Prefix("2001:db8:1:2::/64"), Ipv6Util.prefixForBytes(bytes, 64)); - assertArrayEquals(new byte[] {0x20, (byte) 0x01, 0x0d, (byte) 0xb8, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40 }, Ipv6Util.bytesForPrefix(new Ipv6Prefix("2001:db8:1:2::/64"))); - } - - @Test - public void testPrefixList6ForBytes() { - final byte[] bytes = new byte[] { 0x40, 0x20, 0x01, 0x0d, (byte) 0xb8, 0x00, 0x01, 0x00, 0x02, 0x40, 0x20, 0x01, 0x0d, (byte) 0xb8, 0x00, 0x01, 0x00, 0x01,}; - final List prefs = Ipv6Util.prefixListForBytes(bytes); - assertEquals(prefs, - Lists.newArrayList(new Ipv6Prefix("2001:db8:1:2::/64"), new Ipv6Prefix("2001:db8:1:1::/64"))); - } - - @Test - public void testPrefixLength() { - assertEquals(22, Ipv4Util.getPrefixLength(new IpPrefix(new Ipv4Prefix("172.168.3.0/22")))); - assertEquals(64, Ipv4Util.getPrefixLength(new IpPrefix(new Ipv6Prefix("2001:db8:1:2::/64")))); - } + @Test + public void test3() { + assertEquals("123.123.123.123", new Ipv4Address("123.123.123.123").getValue()); + assertEquals("2001::1", new Ipv6Address("2001::1").getValue()); + } + + @Test + public void test4() throws UnknownHostException { + assertNotNull(new IpPrefix(new Ipv4Prefix("123.123.123.123")).getIpv4Prefix()); + assertNotNull(new IpPrefix(new Ipv6Prefix("2001::1")).getIpv6Prefix()); + } + + @Test + public void test5() { + assertEquals("123.123.123.123/24", new Ipv4Prefix("123.123.123.123/24").getValue()); + assertEquals("2001::1/120", new Ipv6Prefix("2001::1/120").getValue()); + } + + @Test + public void testPrefix4ForBytes() { + byte[] bytes = new byte[] { 123, 122, 4, 5 }; + assertEquals(new Ipv4Prefix("123.122.4.5/8"), Ipv4Util.prefixForBytes(bytes, 8)); + assertArrayEquals(new byte[] { 102, 0, 0, 0, 8 }, Ipv4Util.bytesForPrefix(new Ipv4Prefix("102.0.0.0/8"))); + + bytes = new byte[] { (byte) 255, (byte) 255, 0, 0 }; + assertEquals(new Ipv4Prefix("255.255.0.0/16"), Ipv4Util.prefixForBytes(bytes, 16)); + + assertArrayEquals(new byte[] { (byte) 255, (byte) 255, 0, 0, 16 }, Ipv4Util.bytesForPrefix(new Ipv4Prefix("255.255.0.0/16"))); + } + + @Test + public void testAddress4ForBytes() { + final byte[] bytes = new byte[] { (byte) 123, (byte) 122, (byte) 4, (byte) 5 }; + assertEquals(new Ipv4Address("123.122.4.5"), Ipv4Util.addressForBytes(bytes)); + try { + Ipv4Util.addressForBytes(new byte[] { 22, 44, 66, 18, 88, 33 }); + fail(); + } catch (final IllegalArgumentException e) { + assertEquals("Failed to construct IPv4 address", e.getMessage()); + } + } + + @Test + public void testAddress6ForBytes() { + final byte[] bytes = new byte[] { 0x20, (byte) 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01 }; + assertEquals(new Ipv6Address("2001::1"), Ipv6Util.addressForBytes(bytes)); + try { + Ipv6Util.addressForBytes(new byte[] { 22, 44, 66, 18, 88, 33 }); + fail(); + } catch (final IllegalArgumentException e) { + assertEquals("Failed to construct IPv6 address", e.getMessage()); + } + } + + @Test + public void testPrefixList4ForBytes() { + final byte[] bytes = new byte[] { 22, (byte) 172, (byte) 168, 3, 8, 12, 32, (byte) 192, (byte) 168, 35, 100 }; + final List prefs = Ipv4Util.prefixListForBytes(bytes); + assertEquals( + Lists.newArrayList(new Ipv4Prefix("172.168.3.0/22"), new Ipv4Prefix("12.0.0.0/8"), new Ipv4Prefix("192.168.35.100/32")), + prefs); + } + + @Test + public void testBytesForAddress() { + assertArrayEquals(new byte[] { 12, 58, (byte) 201, 99 }, Ipv4Util.bytesForAddress(new Ipv4Address("12.58.201.99"))); + assertArrayEquals(new byte[] { 0x20, (byte) 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01 }, Ipv6Util.bytesForAddress(new Ipv6Address("2001::1"))); + } + + @Test + public void testPrefix6ForBytes() { + final byte[] bytes = new byte[] { 0x20, 0x01, 0x0d, (byte) 0xb8, 0x00, 0x01, 0x00, 0x02 }; + assertEquals(new Ipv6Prefix("2001:db8:1:2::/64"), Ipv6Util.prefixForBytes(bytes, 64)); + assertArrayEquals(new byte[] { 0x20, (byte) 0x01, 0x0d, (byte) 0xb8, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40 }, Ipv6Util.bytesForPrefix(new Ipv6Prefix("2001:db8:1:2::/64"))); + } + + @Test + public void testPrefixList6ForBytes() { + final byte[] bytes = new byte[] { 0x40, 0x20, 0x01, 0x0d, (byte) 0xb8, 0x00, 0x01, 0x00, 0x02, 0x40, 0x20, 0x01, 0x0d, (byte) 0xb8, + 0x00, 0x01, 0x00, 0x01, }; + final List prefs = Ipv6Util.prefixListForBytes(bytes); + assertEquals(prefs, Lists.newArrayList(new Ipv6Prefix("2001:db8:1:2::/64"), new Ipv6Prefix("2001:db8:1:1::/64"))); + } + + @Test + public void testPrefixLength() { + assertEquals(22, Ipv4Util.getPrefixLength(new IpPrefix(new Ipv4Prefix("172.168.3.0/22")))); + assertEquals(64, Ipv4Util.getPrefixLength(new IpPrefix(new Ipv6Prefix("2001:db8:1:2::/64")))); + } } diff --git a/concepts/src/test/java/org/opendaylight/protocol/concepts/ISOSystemIdentifierTest.java b/concepts/src/test/java/org/opendaylight/protocol/concepts/ISOSystemIdentifierTest.java index 041ba39368..738e847878 100644 --- a/concepts/src/test/java/org/opendaylight/protocol/concepts/ISOSystemIdentifierTest.java +++ b/concepts/src/test/java/org/opendaylight/protocol/concepts/ISOSystemIdentifierTest.java @@ -13,17 +13,17 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network. public class ISOSystemIdentifierTest { - @Test(expected = IllegalArgumentException.class) - public void testISOSystemIdentifier() { - final byte[] b = new byte[] { 10, 12, 127, 0, 9, 1, 1 }; - new IsoSystemIdentifier(b); - } + @Test(expected = IllegalArgumentException.class) + public void testISOSystemIdentifier() { + final byte[] b = new byte[] { 10, 12, 127, 0, 9, 1, 1 }; + new IsoSystemIdentifier(b); + } - @Test - public void testGetBytes() { - final byte[] b = new byte[] { 10, 12, 127, 0, 9, 1 }; - final IsoSystemIdentifier id = new IsoSystemIdentifier(b); - Assert.assertArrayEquals(new byte[] { 10, 12, 127, 0, 9, 1 }, id.getValue()); - } + @Test + public void testGetBytes() { + final byte[] b = new byte[] { 10, 12, 127, 0, 9, 1 }; + final IsoSystemIdentifier id = new IsoSystemIdentifier(b); + Assert.assertArrayEquals(new byte[] { 10, 12, 127, 0, 9, 1 }, id.getValue()); + } } diff --git a/concepts/src/test/java/org/opendaylight/protocol/concepts/MultiRegistryTest.java b/concepts/src/test/java/org/opendaylight/protocol/concepts/MultiRegistryTest.java index 8f250f6a75..97aee48d3d 100644 --- a/concepts/src/test/java/org/opendaylight/protocol/concepts/MultiRegistryTest.java +++ b/concepts/src/test/java/org/opendaylight/protocol/concepts/MultiRegistryTest.java @@ -14,31 +14,31 @@ import org.junit.Test; public class MultiRegistryTest { - @Test - public void testMultiRegistry() { - MultiRegistry registry = new MultiRegistry<>(); - String first = "first"; - String second = "second"; - String third = "third"; + @Test + public void testMultiRegistry() { + MultiRegistry registry = new MultiRegistry<>(); + String first = "first"; + String second = "second"; + String third = "third"; - AbstractRegistration a = registry.register(first, 1); - registry.register(second, 2); - registry.register(third, 3); + AbstractRegistration a = registry.register(first, 1); + registry.register(second, 2); + registry.register(third, 3); - assertEquals(Integer.valueOf(1), registry.get("first")); - assertEquals(Integer.valueOf(2), registry.get("second")); - assertEquals(Integer.valueOf(3), registry.get("third")); + assertEquals(Integer.valueOf(1), registry.get("first")); + assertEquals(Integer.valueOf(2), registry.get("second")); + assertEquals(Integer.valueOf(3), registry.get("third")); - registry.register(second, 22); + registry.register(second, 22); - assertEquals(Integer.valueOf(22), registry.get("second")); + assertEquals(Integer.valueOf(22), registry.get("second")); - registry.register(Character.valueOf('c'), 5); + registry.register(Character.valueOf('c'), 5); - assertEquals(Integer.valueOf(5), registry.get('c')); + assertEquals(Integer.valueOf(5), registry.get('c')); - a.close(); + a.close(); - assertNull(registry.get("first")); - } + assertNull(registry.get("first")); + } } diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml index 11f5c6682b..a624ca80cc 100644 --- a/integration-tests/pom.xml +++ b/integration-tests/pom.xml @@ -92,7 +92,7 @@ - + ch.qos.logback logback-classic @@ -203,8 +203,8 @@ test - ${project.groupId} - bgp-parser-mock + ${project.groupId} + bgp-parser-mock ${project.version} test diff --git a/integration-tests/src/test/java/org/opendaylight/protocol/integration/AbstractBundleTest.java b/integration-tests/src/test/java/org/opendaylight/protocol/integration/AbstractBundleTest.java index f2573387f7..e238070560 100644 --- a/integration-tests/src/test/java/org/opendaylight/protocol/integration/AbstractBundleTest.java +++ b/integration-tests/src/test/java/org/opendaylight/protocol/integration/AbstractBundleTest.java @@ -18,7 +18,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; + import javax.inject.Inject; + import org.junit.Test; import org.junit.runner.RunWith; import org.opendaylight.controller.test.sal.binding.it.TestHelper; @@ -36,64 +38,65 @@ import org.osgi.framework.BundleException; @RunWith(PaxExam.class) @ExamReactorStrategy(PerMethod.class) public abstract class AbstractBundleTest { - private static final String GROUP = "org.opendaylight.bgpcep"; + private static final String GROUP = "org.opendaylight.bgpcep"; - @Inject - @Filter(timeout = 60 * 1000) - BundleContext ctx; + @Inject + @Filter(timeout = 60 * 1000) + BundleContext ctx; - abstract protected Collection prerequisiteBundles(); - abstract protected Collection requiredBundles(); + abstract protected Collection prerequisiteBundles(); - private List