From 0ea201a538fc945dfef50d079f3b578a00ce9d1e Mon Sep 17 00:00:00 2001 From: Michal Rehak Date: Fri, 11 Jul 2014 11:04:39 +0200 Subject: [PATCH] Extension support - easy lookup for toOFJava - added new type of converter with registration based on case augment type - flow makes it to device and breaks in statistics - rebased - added converter type for Action from OFJava to MD-SAL - fixed stats - renamed openflowplugin-nicira-extension and moved stuff (mimic change 9522) - action lookup is based in case type - simplified nicira action models - removed ofplugin action augmentations - added augmentations for actions under nodes/node/group.. - for fixing dependencies in INTEGRATION following change must be merged https://git.opendaylight.org/gerrit/#/c/9614/ PatchSet9: Squashed in: https://git.opendaylight.org/gerrit/#/c/9522/8 https://git.opendaylight.org/gerrit/#/c/9004/35 https://git.opendaylight.org/gerrit/#/c/8933/10 https://git.opendaylight.org/gerrit/#/c/8932/7 Change-Id: I7616615225fdadedf45e22e4aca6668e25447001 Signed-off-by: Michal Rehak --- distribution/base/pom.xml | 36 +- .../openflowjava-extension-nicira-api/pom.xml | 80 ++++ .../nx/api/NiciraActionDeserializerKey.java | 76 ++++ .../nx/api/NiciraActionSerializerKey.java | 71 +++ .../openflowjava/nx/api/NiciraConstants.java | 10 + .../api/NiciraExtensionCodecRegistrator.java | 42 ++ .../openflowjava/nx/api/NiciraUtil.java | 22 + .../nx/api/impl/ActionDeserializer.java | 54 +++ .../NiciraExtensionCodecRegistratorImpl.java | 203 +++++++++ .../NiciraExtensionApiProviderModule.java | 24 + ...ciraExtensionApiProviderModuleFactory.java | 13 + .../initial/43-openflowjava-nx-api-config.xml | 38 ++ .../main/yang/openflowjava-nx-api-config.yang | 42 ++ .../openflowjava-extension-nicira/pom.xml | 114 +++++ .../nx/NiciraExtensionsRegistrator.java | 136 ++++++ .../openflowjava/nx/NiciraMatchCodecs.java | 56 +++ .../nx/codec/action/AbstractActionCodec.java | 62 +++ .../nx/codec/action/NiciraActionCodecs.java | 18 + .../nx/codec/action/RegLoadCodec.java | 51 +++ .../nx/codec/action/RegMoveCodec.java | 53 +++ .../nx/codec/match/AbstractMatchCodec.java | 88 ++++ .../nx/codec/match/AbstractRegCodec.java | 49 ++ .../nx/codec/match/ArpOpCodec.java | 69 +++ .../nx/codec/match/ArpShaCodec.java | 74 ++++ .../nx/codec/match/ArpSpaCodec.java | 69 +++ .../nx/codec/match/ArpThaCodec.java | 74 ++++ .../nx/codec/match/ArpTpaCodec.java | 69 +++ .../nx/codec/match/EthDstCodec.java | 74 ++++ .../nx/codec/match/EthSrcCodec.java | 74 ++++ .../nx/codec/match/EthTypeCodec.java | 69 +++ .../nx/codec/match/NxmHeader.java | 94 ++++ .../nx/codec/match/Reg0Codec.java | 29 ++ .../nx/codec/match/Reg1Codec.java | 29 ++ .../nx/codec/match/Reg2Codec.java | 29 ++ .../nx/codec/match/Reg3Codec.java | 29 ++ .../nx/codec/match/Reg4Codec.java | 29 ++ .../nx/codec/match/Reg5Codec.java | 29 ++ .../nx/codec/match/Reg6Codec.java | 29 ++ .../nx/codec/match/Reg7Codec.java | 29 ++ .../nx/codec/match/TunIdCodec.java | 72 +++ .../nx/codec/match/TunIpv4DstCodec.java | 69 +++ .../nx/codec/match/TunIpv4SrcCodec.java | 69 +++ .../NiciraExtensionProviderModule.java | 26 ++ .../NiciraExtensionProviderModuleFactory.java | 13 + .../initial/44-openflowjava-nx-config.xml | 24 + .../src/main/yang/nicira-action.yang | 64 +++ .../src/main/yang/nicira-match.yang | 182 ++++++++ .../src/main/yang/openflowjava-nx-config.yang | 36 ++ .../openflowplugin-extension-api/pom.xml | 114 +++++ .../extension/api/AugmentTuple.java | 44 ++ .../extension/api/ConverterExtensionKey.java | 29 ++ .../api/ConvertorActionFromOFJava.java | 28 ++ .../api/ConvertorActionToOFJava.java | 25 ++ .../extension/api/ConvertorFromOFJava.java | 29 ++ .../extension/api/ConvertorToOFJava.java | 25 ++ .../extension/api/ExtensionAugment.java | 39 ++ .../api/ExtensionConverterRegistrator.java | 50 +++ .../extension/api/GroupingLooseResolver.java | 73 +++ .../extension/api/GroupingResolver.java | 77 ++++ .../extension/api/TypeVersionKey.java | 66 +++ .../extension/api/path/ActionPath.java | 112 +++++ .../extension/api/path/AugmentationPath.java | 21 + .../extension/api/path/MatchPath.java | 62 +++ .../extension/api/path/Util.java | 25 ++ .../openflowplugin-extension-general.yang | 107 +++++ .../api/ConverterExtensionActionKeyTest.java | 41 ++ .../api/ConverterExtensionMatchKeyTest.java | 39 ++ .../api/GroupingLooseResolverTest.java | 57 +++ .../extension/api/GroupingResolverTest.java | 53 +++ .../openflowplugin-extension-nicira/pom.xml | 125 ++++++ .../nicira/NiciraExtensionProvider.java | 206 +++++++++ .../convertor/CodecPreconditionException.java | 32 ++ .../vendor/nicira/convertor/IpConverter.java | 41 ++ .../nicira/convertor/action/ActionUtil.java | 47 ++ .../convertor/action/RegLoadConvertor.java | 101 +++++ .../convertor/action/RegMoveConvertor.java | 364 +++++++++++++++ .../convertor/match/ArpOpConvertor.java | 100 +++++ .../convertor/match/ArpShaConvertor.java | 101 +++++ .../convertor/match/ArpSpaConvertor.java | 103 +++++ .../convertor/match/ArpThaConvertor.java | 101 +++++ .../convertor/match/ArpTpaConvertor.java | 103 +++++ .../convertor/match/EthDstConvertor.java | 101 +++++ .../convertor/match/EthSrcConvertor.java | 101 +++++ .../convertor/match/EthTypeConvertor.java | 100 +++++ .../nicira/convertor/match/MatchUtil.java | 114 +++++ .../nicira/convertor/match/RegConvertor.java | 148 +++++++ .../convertor/match/TunIdConvertor.java | 102 +++++ .../convertor/match/TunIpv4DstConvertor.java | 105 +++++ .../convertor/match/TunIpv4SrcConvertor.java | 105 +++++ ...igurableNiciraExtensionProviderModule.java | 29 ++ ...eNiciraExtensionProviderModuleFactory.java | 13 + .../resources/initial/44-nicira-extension.xml | 34 ++ .../src/main/yang/nicira-exension-cfg.yang | 20 + .../main/yang/nicira-extension-cfg-impl.yang | 38 ++ ...penflowplugin-extension-nicira-action.yang | 419 ++++++++++++++++++ ...openflowplugin-extension-nicira-match.yang | 225 ++++++++++ extension/pom.xml | 42 ++ extension/test-extension/pom.xml | 132 ++++++ .../impl/TestProviderModule.java | 39 ++ .../impl/TestProviderModuleFactory.java | 13 + .../openflowplugin/extension/test/Test.java | 201 +++++++++ .../src/main/resources/initial/75-test.xml | 40 ++ .../src/main/yang/test-provider-impl.yang | 53 +++ .../test-extension/src/main/yang/test.yang | 31 ++ openflowplugin-it/pom.xml | 6 + .../openflow/md/it/OFPaxOptionsAssistant.java | 1 + openflowplugin/pom.xml | 5 + .../openflow/md/core/MDController.java | 11 + .../core/extension/ActionExtensionHelper.java | 56 +++ .../extension/ExtensionConverterManager.java | 17 + .../ExtensionConverterManagerImpl.java | 228 ++++++++++ .../extension/ExtensionConverterProvider.java | 53 +++ .../md/core/extension/ExtensionResolvers.java | 38 ++ .../core/extension/MatchExtensionHelper.java | 133 ++++++ .../md/core/extension/RegistrationCloser.java | 126 ++++++ .../md/core/sal/OpenflowPluginProvider.java | 14 + .../core/sal/convertor/ActionConvertor.java | 147 +++++- .../convertor/FlowStatsResponseConvertor.java | 17 +- .../GroupStatsResponseConvertor.java | 4 +- .../sal/convertor/OFToMDSalFlowConvertor.java | 23 +- .../convertor/match/MatchConvertorImpl.java | 44 +- .../md/core/session/OFSessionUtil.java | 8 + .../md/core/session/SessionManager.java | 11 + .../md/core/session/SessionManagerOFImpl.java | 16 + .../translator/FlowRemovedTranslator.java | 27 +- .../core/translator/PacketInTranslator.java | 20 +- .../openflow/md/util/OpenflowVersion.java | 7 + .../ExtensionConverterManagerImplTest.java | 108 +++++ pom.xml | 1 + 129 files changed, 8622 insertions(+), 35 deletions(-) create mode 100644 extension/openflowjava-extension-nicira-api/pom.xml create mode 100644 extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/NiciraActionDeserializerKey.java create mode 100644 extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/NiciraActionSerializerKey.java create mode 100644 extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/NiciraConstants.java create mode 100644 extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/NiciraExtensionCodecRegistrator.java create mode 100644 extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/NiciraUtil.java create mode 100644 extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/impl/ActionDeserializer.java create mode 100644 extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/impl/NiciraExtensionCodecRegistratorImpl.java create mode 100644 extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/ofjava/nx/api/config/rev140711/NiciraExtensionApiProviderModule.java create mode 100644 extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/ofjava/nx/api/config/rev140711/NiciraExtensionApiProviderModuleFactory.java create mode 100644 extension/openflowjava-extension-nicira-api/src/main/resources/initial/43-openflowjava-nx-api-config.xml create mode 100644 extension/openflowjava-extension-nicira-api/src/main/yang/openflowjava-nx-api-config.yang create mode 100644 extension/openflowjava-extension-nicira/pom.xml create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/NiciraExtensionsRegistrator.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/NiciraMatchCodecs.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/AbstractActionCodec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/NiciraActionCodecs.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/RegLoadCodec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/RegMoveCodec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/AbstractMatchCodec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/AbstractRegCodec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpOpCodec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpShaCodec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpSpaCodec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpThaCodec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpTpaCodec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/EthDstCodec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/EthSrcCodec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/EthTypeCodec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/NxmHeader.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg0Codec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg1Codec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg2Codec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg3Codec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg4Codec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg5Codec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg6Codec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg7Codec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/TunIdCodec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/TunIpv4DstCodec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/TunIpv4SrcCodec.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/ofjava/nx/config/rev140711/NiciraExtensionProviderModule.java create mode 100644 extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/ofjava/nx/config/rev140711/NiciraExtensionProviderModuleFactory.java create mode 100644 extension/openflowjava-extension-nicira/src/main/resources/initial/44-openflowjava-nx-config.xml create mode 100644 extension/openflowjava-extension-nicira/src/main/yang/nicira-action.yang create mode 100644 extension/openflowjava-extension-nicira/src/main/yang/nicira-match.yang create mode 100644 extension/openflowjava-extension-nicira/src/main/yang/openflowjava-nx-config.yang create mode 100644 extension/openflowplugin-extension-api/pom.xml create mode 100644 extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/AugmentTuple.java create mode 100644 extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConverterExtensionKey.java create mode 100644 extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorActionFromOFJava.java create mode 100644 extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorActionToOFJava.java create mode 100644 extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorFromOFJava.java create mode 100644 extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorToOFJava.java create mode 100644 extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ExtensionAugment.java create mode 100644 extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ExtensionConverterRegistrator.java create mode 100644 extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/GroupingLooseResolver.java create mode 100644 extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/GroupingResolver.java create mode 100644 extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/TypeVersionKey.java create mode 100644 extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/path/ActionPath.java create mode 100644 extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/path/AugmentationPath.java create mode 100644 extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/path/MatchPath.java create mode 100644 extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/path/Util.java create mode 100644 extension/openflowplugin-extension-api/src/main/yang/openflowplugin-extension-general.yang create mode 100644 extension/openflowplugin-extension-api/src/test/java/org/opendaylight/openflowplugin/extension/api/ConverterExtensionActionKeyTest.java create mode 100644 extension/openflowplugin-extension-api/src/test/java/org/opendaylight/openflowplugin/extension/api/ConverterExtensionMatchKeyTest.java create mode 100644 extension/openflowplugin-extension-api/src/test/java/org/opendaylight/openflowplugin/extension/api/GroupingLooseResolverTest.java create mode 100644 extension/openflowplugin-extension-api/src/test/java/org/opendaylight/openflowplugin/extension/api/GroupingResolverTest.java create mode 100644 extension/openflowplugin-extension-nicira/pom.xml create mode 100644 extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/NiciraExtensionProvider.java create mode 100644 extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/CodecPreconditionException.java create mode 100644 extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/IpConverter.java create mode 100644 extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/action/ActionUtil.java create mode 100644 extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/action/RegLoadConvertor.java create mode 100644 extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/action/RegMoveConvertor.java create mode 100644 extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/ArpOpConvertor.java create mode 100644 extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/ArpShaConvertor.java create mode 100644 extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/ArpSpaConvertor.java create mode 100644 extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/ArpThaConvertor.java create mode 100644 extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/ArpTpaConvertor.java create mode 100644 extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/EthDstConvertor.java create mode 100644 extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/EthSrcConvertor.java create mode 100644 extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/EthTypeConvertor.java create mode 100644 extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/MatchUtil.java create mode 100644 extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/RegConvertor.java create mode 100644 extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/TunIdConvertor.java create mode 100644 extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/TunIpv4DstConvertor.java create mode 100644 extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/TunIpv4SrcConvertor.java create mode 100644 extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/nx/config/impl/rev140711/ConfigurableNiciraExtensionProviderModule.java create mode 100644 extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/nx/config/impl/rev140711/ConfigurableNiciraExtensionProviderModuleFactory.java create mode 100644 extension/openflowplugin-extension-nicira/src/main/resources/initial/44-nicira-extension.xml create mode 100644 extension/openflowplugin-extension-nicira/src/main/yang/nicira-exension-cfg.yang create mode 100644 extension/openflowplugin-extension-nicira/src/main/yang/nicira-extension-cfg-impl.yang create mode 100644 extension/openflowplugin-extension-nicira/src/main/yang/openflowplugin-extension-nicira-action.yang create mode 100644 extension/openflowplugin-extension-nicira/src/main/yang/openflowplugin-extension-nicira-match.yang create mode 100644 extension/pom.xml create mode 100644 extension/test-extension/pom.xml create mode 100644 extension/test-extension/src/main/java/org/opendaylight/controller/config/yang/config/test_provider/impl/TestProviderModule.java create mode 100644 extension/test-extension/src/main/java/org/opendaylight/controller/config/yang/config/test_provider/impl/TestProviderModuleFactory.java create mode 100644 extension/test-extension/src/main/java/org/opendaylight/openflowplugin/extension/test/Test.java create mode 100644 extension/test-extension/src/main/resources/initial/75-test.xml create mode 100644 extension/test-extension/src/main/yang/test-provider-impl.yang create mode 100644 extension/test-extension/src/main/yang/test.yang create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ActionExtensionHelper.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionConverterManager.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionConverterManagerImpl.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionConverterProvider.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionResolvers.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/MatchExtensionHelper.java create mode 100644 openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/RegistrationCloser.java create mode 100644 openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionConverterManagerImplTest.java diff --git a/distribution/base/pom.xml b/distribution/base/pom.xml index 34f88407ca..21542befc1 100644 --- a/distribution/base/pom.xml +++ b/distribution/base/pom.xml @@ -36,6 +36,30 @@ see https://git.opendaylight.org/gerrit/#/c/390/ ${project.version} + + + org.opendaylight.openflowplugin + openflowplugin-extension-api + ${project.version} + + + + + org.opendaylight.openflowplugin + openflowplugin-extension-nicira + ${project.version} + + + org.opendaylight.openflowplugin + openflowjava-extension-nicira-api + ${project.version} + + + org.opendaylight.openflowplugin + openflowjava-extension-nicira + ${project.version} + + org.opendaylight.openflowplugin @@ -57,6 +81,14 @@ see https://git.opendaylight.org/gerrit/#/c/390/ ${project.version} + + + org.opendaylight.openflowplugin + test-extension + ${project.version} + + + org.opendaylight.openflowplugin @@ -121,7 +153,9 @@ see https://git.opendaylight.org/gerrit/#/c/390/ generate-resources ${project.build.directory}/generated-resources/opendaylight/configuration - openflowplugin-controller-config + openflowplugin-controller-config, + test-extension, openflowjava-extension-nicira, openflowjava-extension-nicira-api, openflowplugin-extension-nicira + **\/*.xml META-INF true diff --git a/extension/openflowjava-extension-nicira-api/pom.xml b/extension/openflowjava-extension-nicira-api/pom.xml new file mode 100644 index 0000000000..900be93ef8 --- /dev/null +++ b/extension/openflowjava-extension-nicira-api/pom.xml @@ -0,0 +1,80 @@ + + + 4.0.0 + + org.opendaylight.openflowplugin + openflowplugin-extension-parent + 0.0.3-SNAPSHOT + ../ + + openflowjava-extension-nicira-api + bundle + + + + + org.apache.felix + maven-bundle-plugin + + + org.opendaylight.yangtools + yang-maven-plugin + + + + generate-sources + + + + + + org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator + + ${project.build.directory}/generated-sources/config + + + urn:opendaylight:params:xml:ns:yang:controller:config==org.opendaylight.controller.config.yang + + + + + + org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl + + ${project.build.directory}/generated-sources/sal + + + true + + + + + + org.opendaylight.controller + yang-jmx-generator-plugin + ${config.parent.version} + + + org.opendaylight.yangtools + maven-sal-api-gen-plugin + ${yangtools.version} + jar + + + + + + + + + org.opendaylight.openflowjava + openflow-protocol-api + + + org.opendaylight.openflowjava + openflow-protocol-spi + + + diff --git a/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/NiciraActionDeserializerKey.java b/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/NiciraActionDeserializerKey.java new file mode 100644 index 0000000000..484d864c04 --- /dev/null +++ b/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/NiciraActionDeserializerKey.java @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowjava.nx.api; + +/** + * @author msunal + * + */ +public final class NiciraActionDeserializerKey { + + private final short version; + private final int subtype; + + /** + * @param version protocol wire version + * @param subtype nx_action_subtype + */ + public NiciraActionDeserializerKey(short version, int subtype) { + if (!isValueUint16(subtype)) { + throw new IllegalArgumentException( + "Nicira subtype is uint16. A value of subtype has to be between 0 and 65535 include."); + } + this.version = version; + this.subtype = subtype; + } + + public short getVersion() { + return version; + } + + public int getSubtype() { + return subtype; + } + + private static final boolean isValueUint16(int value) { + if (value >= 0 && value <= 65535L) + return true; + return false; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + subtype; + result = prime * result + version; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + NiciraActionDeserializerKey other = (NiciraActionDeserializerKey) obj; + if (subtype != other.subtype) + return false; + if (version != other.version) + return false; + return true; + } + + @Override + public String toString() { + return "NiciraActionDeserializerKey [version=" + version + ", subtype=" + subtype + "]"; + } + +} diff --git a/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/NiciraActionSerializerKey.java b/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/NiciraActionSerializerKey.java new file mode 100644 index 0000000000..94a526d8a3 --- /dev/null +++ b/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/NiciraActionSerializerKey.java @@ -0,0 +1,71 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowjava.nx.api; + +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.ExperimenterActionSubType; + +/** + * @author msunal + * + */ +public class NiciraActionSerializerKey { + + private final short version; + private final Class subtype; + + /** + * @param version protocol wire version + * @param subtype nx_action_subtype + */ + public NiciraActionSerializerKey(short version, Class subtype) { + this.version = version; + this.subtype = subtype; + } + + public short getVersion() { + return version; + } + + public Class getSubtype() { + return subtype; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((subtype == null) ? 0 : subtype.hashCode()); + result = prime * result + version; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + NiciraActionSerializerKey other = (NiciraActionSerializerKey) obj; + if (subtype == null) { + if (other.subtype != null) + return false; + } else if (!subtype.equals(other.subtype)) + return false; + if (version != other.version) + return false; + return true; + } + + @Override + public String toString() { + return "NiciraActionSerializerKey [version=" + version + ", subtype=" + subtype + "]"; + } + +} diff --git a/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/NiciraConstants.java b/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/NiciraConstants.java new file mode 100644 index 0000000000..c18d03dd61 --- /dev/null +++ b/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/NiciraConstants.java @@ -0,0 +1,10 @@ +package org.opendaylight.openflowjava.nx.api; + + +public final class NiciraConstants { + + public static final Long NX_VENDOR_ID = 0x00002320L; + + private NiciraConstants() {} + +} diff --git a/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/NiciraExtensionCodecRegistrator.java b/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/NiciraExtensionCodecRegistrator.java new file mode 100644 index 0000000000..0398ec0928 --- /dev/null +++ b/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/NiciraExtensionCodecRegistrator.java @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowjava.nx.api; + +import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer; +import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; + +/** + * @author msunal + * + */ +public interface NiciraExtensionCodecRegistrator { + + void registerActionDeserializer(NiciraActionDeserializerKey key, OFDeserializer deserializer); + + void unregisterActionDeserializer(NiciraActionDeserializerKey key); + + void registerActionSerializer(NiciraActionSerializerKey key, OFSerializer serializer); + + void unregisterActionSerializer(NiciraActionSerializerKey key); + + void registerMatchEntryDeserializer(MatchEntryDeserializerKey key, OFDeserializer deserializer); + + void unregisterMatchEntryDeserializer(MatchEntryDeserializerKey key); + + void registerMatchEntrySerializer(MatchEntrySerializerKey key, + OFSerializer serializer); + + void unregisterMatchEntrySerializer(MatchEntrySerializerKey key); + +} diff --git a/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/NiciraUtil.java b/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/NiciraUtil.java new file mode 100644 index 0000000000..027d8629ea --- /dev/null +++ b/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/NiciraUtil.java @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowjava.nx.api; + +import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionSerializerKey; + +/** + * @author msunal + * + */ +public final class NiciraUtil { + + public static final ExperimenterActionSerializerKey createOfJavaKeyFrom(NiciraActionSerializerKey key) { + return new ExperimenterActionSerializerKey(key.getVersion(), NiciraConstants.NX_VENDOR_ID, key.getSubtype()); + } + +} diff --git a/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/impl/ActionDeserializer.java b/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/impl/ActionDeserializer.java new file mode 100644 index 0000000000..c2dc4ebb92 --- /dev/null +++ b/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/impl/ActionDeserializer.java @@ -0,0 +1,54 @@ +package org.opendaylight.openflowjava.nx.api.impl; + +import io.netty.buffer.ByteBuf; + +import org.opendaylight.openflowjava.nx.api.NiciraActionDeserializerKey; +import org.opendaylight.openflowjava.nx.api.NiciraConstants; +import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer; +import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ActionDeserializer implements OFDeserializer { + + private static final Logger LOG = LoggerFactory.getLogger(ActionDeserializer.class); + + public static final ExperimenterActionDeserializerKey OF13_DESERIALIZER_KEY = new ExperimenterActionDeserializerKey( + EncodeConstants.OF13_VERSION_ID, NiciraConstants.NX_VENDOR_ID); + public static final ExperimenterActionDeserializerKey OF10_DESERIALIZER_KEY = new ExperimenterActionDeserializerKey( + EncodeConstants.OF10_VERSION_ID, NiciraConstants.NX_VENDOR_ID); + + private final short version; + + /** + * @param version protocol wire version + */ + public ActionDeserializer(short version) { + this.version = version; + } + + @Override + public Action deserialize(ByteBuf message) { + int startPossition = message.readerIndex(); + // size of experimenter type + message.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES); + // size of length + message.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES); + long experimenterId = message.readUnsignedInt(); + if (NiciraConstants.NX_VENDOR_ID != experimenterId) { + throw new IllegalStateException("Experimenter ID is not Nicira vendor id but is " + experimenterId); + } + int subtype = message.readUnsignedShort(); + NiciraActionDeserializerKey key = new NiciraActionDeserializerKey(version, subtype); + OFDeserializer actionDeserializer = NiciraExtensionCodecRegistratorImpl.getActionDeserializer(key); + if (actionDeserializer == null) { + LOG.info("No deserializer was found for key {}", key); + return null; + } + message.readerIndex(startPossition); + return actionDeserializer.deserialize(message); + } + +} diff --git a/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/impl/NiciraExtensionCodecRegistratorImpl.java b/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/impl/NiciraExtensionCodecRegistratorImpl.java new file mode 100644 index 0000000000..2d6ddb9df9 --- /dev/null +++ b/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/openflowjava/nx/api/impl/NiciraExtensionCodecRegistratorImpl.java @@ -0,0 +1,203 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowjava.nx.api.impl; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.opendaylight.openflowjava.nx.api.NiciraActionDeserializerKey; +import org.opendaylight.openflowjava.nx.api.NiciraActionSerializerKey; +import org.opendaylight.openflowjava.nx.api.NiciraExtensionCodecRegistrator; +import org.opendaylight.openflowjava.nx.api.NiciraUtil; +import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer; +import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralDeserializer; +import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralSerializer; +import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionSerializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterSerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; + +/** + * @author msunal + * + */ +public class NiciraExtensionCodecRegistratorImpl implements NiciraExtensionCodecRegistrator, AutoCloseable { + + private static final Map> actionDeserializers = new ConcurrentHashMap<>(); + + private final List providers; + + /** + * @param providers + */ + public NiciraExtensionCodecRegistratorImpl(List providers) { + this.providers = providers; + ActionDeserializer of10ActionDeserializer = new ActionDeserializer(EncodeConstants.OF10_VERSION_ID); + ActionDeserializer of13ActionDeserializer = new ActionDeserializer(EncodeConstants.OF13_VERSION_ID); + registerActionDeserializer(ActionDeserializer.OF10_DESERIALIZER_KEY, of10ActionDeserializer); + registerActionDeserializer(ActionDeserializer.OF13_DESERIALIZER_KEY, of13ActionDeserializer); + } + + private void registerActionDeserializer(ExperimenterActionDeserializerKey key, OFGeneralDeserializer deserializer) { + for (SwitchConnectionProvider provider : providers) { + provider.registerActionDeserializer(key, deserializer); + } + } + + private void registerActionSerializer(ExperimenterActionSerializerKey key, OFGeneralSerializer serializer) { + for (SwitchConnectionProvider provider : providers) { + provider.registerActionSerializer(key, serializer); + } + } + + private void unregisterDeserializer(ExperimenterDeserializerKey key) { + for (SwitchConnectionProvider provider : providers) { + provider.unregisterDeserializer(key); + } + } + + private void unregisterSerializer(ExperimenterSerializerKey key) { + for (SwitchConnectionProvider provider : providers) { + provider.unregisterSerializer(key); + } + } + + /* + * (non-Javadoc) + * + * @see org.opendaylight.openflow.extension.nicira.api. + * NiciraExtensionCodecRegistrator + * #registerActionDeserializer(org.opendaylight + * .openflow.extension.nicira.api.NiciraActionDeserializerKey, + * org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer) + */ + @Override + public void registerActionDeserializer(NiciraActionDeserializerKey key, OFDeserializer deserializer) { + actionDeserializers.put(key, deserializer); + } + + /* + * (non-Javadoc) + * + * @see org.opendaylight.openflow.extension.nicira.api. + * NiciraExtensionCodecRegistrator + * #unregisterActionDeserializer(org.opendaylight + * .openflow.extension.nicira.api.NiciraActionDeserializerKey) + */ + @Override + public void unregisterActionDeserializer(NiciraActionDeserializerKey key) { + actionDeserializers.remove(key); + } + + static OFDeserializer getActionDeserializer(NiciraActionDeserializerKey key) { + return actionDeserializers.get(key); + } + + /* + * (non-Javadoc) + * + * @see org.opendaylight.openflow.extension.nicira.api. + * NiciraExtensionCodecRegistrator + * #registerActionSerializer(org.opendaylight. + * openflow.extension.nicira.api.NiciraActionSerializerKey, + * org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer) + */ + @Override + public void registerActionSerializer(NiciraActionSerializerKey key, OFSerializer serializer) { + registerActionSerializer(NiciraUtil.createOfJavaKeyFrom(key), serializer); + } + + /* + * (non-Javadoc) + * + * @see org.opendaylight.openflow.extension.nicira.api. + * NiciraExtensionCodecRegistrator + * #unregisterActionSerializer(org.opendaylight + * .openflow.extension.nicira.api.NiciraActionSerializerKey) + */ + @Override + public void unregisterActionSerializer(NiciraActionSerializerKey key) { + unregisterSerializer(NiciraUtil.createOfJavaKeyFrom(key)); + } + + /* + * (non-Javadoc) + * + * @see org.opendaylight.openflow.extension.nicira.api. + * NiciraExtensionCodecRegistrator + * #registerMatchEntryDeserializer(org.opendaylight + * .openflowjava.protocol.api.keys.MatchEntryDeserializerKey, + * org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer) + */ + @Override + public void registerMatchEntryDeserializer(MatchEntryDeserializerKey key, OFDeserializer deserializer) { + for (SwitchConnectionProvider provider : providers) { + provider.registerMatchEntryDeserializer(key, deserializer); + } + } + + /* + * (non-Javadoc) + * + * @see org.opendaylight.openflow.extension.nicira.api. + * NiciraExtensionCodecRegistrator + * #unregisterMatchEntryDeserializer(org.opendaylight + * .openflowjava.protocol.api.keys.MatchEntryDeserializerKey) + */ + @Override + public void unregisterMatchEntryDeserializer(MatchEntryDeserializerKey key) { + unregisterDeserializer(key); + } + + /* + * (non-Javadoc) + * + * @see org.opendaylight.openflow.extension.nicira.api. + * NiciraExtensionCodecRegistrator + * #registerMatchEntrySerializer(org.opendaylight + * .openflowjava.protocol.api.keys.MatchEntrySerializerKey, + * org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer) + */ + @Override + public void registerMatchEntrySerializer(MatchEntrySerializerKey key, + OFSerializer serializer) { + for (SwitchConnectionProvider provider : providers) { + provider.registerMatchEntrySerializer(key, serializer); + } + } + + /* + * (non-Javadoc) + * + * @see org.opendaylight.openflow.extension.nicira.api. + * NiciraExtensionCodecRegistrator + * #unregisterMatchEntrySerializer(org.opendaylight + * .openflowjava.protocol.api.keys.MatchEntrySerializerKey) + */ + @Override + public void unregisterMatchEntrySerializer(MatchEntrySerializerKey key) { + unregisterSerializer(key); + } + + @Override + public void close() throws Exception { + // TODO Auto-generated method stub + + } + +} diff --git a/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/ofjava/nx/api/config/rev140711/NiciraExtensionApiProviderModule.java b/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/ofjava/nx/api/config/rev140711/NiciraExtensionApiProviderModule.java new file mode 100644 index 0000000000..2622b2cbe8 --- /dev/null +++ b/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/ofjava/nx/api/config/rev140711/NiciraExtensionApiProviderModule.java @@ -0,0 +1,24 @@ +package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.ofjava.nx.api.config.rev140711; + +import org.opendaylight.openflowjava.nx.api.impl.NiciraExtensionCodecRegistratorImpl; + +public class NiciraExtensionApiProviderModule extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.ofjava.nx.api.config.rev140711.AbstractNiciraExtensionApiProviderModule { + public NiciraExtensionApiProviderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } + + public NiciraExtensionApiProviderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.ofjava.nx.api.config.rev140711.NiciraExtensionApiProviderModule oldModule, java.lang.AutoCloseable oldInstance) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } + + @Override + public void customValidation() { + // add custom validation form module attributes here. + } + + @Override + public java.lang.AutoCloseable createInstance() { + return new NiciraExtensionCodecRegistratorImpl(getOpenflowSwitchConnectionProviderDependency()); + } + +} diff --git a/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/ofjava/nx/api/config/rev140711/NiciraExtensionApiProviderModuleFactory.java b/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/ofjava/nx/api/config/rev140711/NiciraExtensionApiProviderModuleFactory.java new file mode 100644 index 0000000000..6ac2991912 --- /dev/null +++ b/extension/openflowjava-extension-nicira-api/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/ofjava/nx/api/config/rev140711/NiciraExtensionApiProviderModuleFactory.java @@ -0,0 +1,13 @@ +/* +* Generated file +* +* Generated from: yang module name: openflowjava-nx-api-config yang module local name: openflowjava-extension-nicira-api +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Fri Aug 01 15:57:05 CEST 2014 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.ofjava.nx.api.config.rev140711; +public class NiciraExtensionApiProviderModuleFactory extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.ofjava.nx.api.config.rev140711.AbstractNiciraExtensionApiProviderModuleFactory { + +} diff --git a/extension/openflowjava-extension-nicira-api/src/main/resources/initial/43-openflowjava-nx-api-config.xml b/extension/openflowjava-extension-nicira-api/src/main/resources/initial/43-openflowjava-nx-api-config.xml new file mode 100644 index 0000000000..1964e4d329 --- /dev/null +++ b/extension/openflowjava-extension-nicira-api/src/main/resources/initial/43-openflowjava-nx-api-config.xml @@ -0,0 +1,38 @@ + + + + + urn:opendaylight:params:xml:ns:yang:openflowplugin:ofjava:nx:api:config?module=openflowjava-nx-api-config&revision=2014-07-11 + + + + + + + + prefix:openflowjava-extension-nicira-api + openflowjava-extension-nx-api-bundle + + ofSwitch:openflow-switch-connection-provider + openflow-switch-connection-provider-legacy + + + ofSwitch:openflow-switch-connection-provider + openflow-switch-connection-provider-default + + + + + + + prefix:nicira-extension-codec-registrator + + openflowjava-nicira-ext-registrator + /modules/module[type='openflowjava-extension-nicira-api'][name='openflowjava-extension-nx-api-bundle'] + + + + + + + diff --git a/extension/openflowjava-extension-nicira-api/src/main/yang/openflowjava-nx-api-config.yang b/extension/openflowjava-extension-nicira-api/src/main/yang/openflowjava-nx-api-config.yang new file mode 100644 index 0000000000..9f52cb720a --- /dev/null +++ b/extension/openflowjava-extension-nicira-api/src/main/yang/openflowjava-nx-api-config.yang @@ -0,0 +1,42 @@ +module openflowjava-nx-api-config { + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:openflowplugin:ofjava:nx:api:config"; + prefix "openflowjava-nx-api"; + + import config {prefix config; revision-date 2013-04-05;} + import openflow-switch-connection-provider {prefix openflow-switch-connection-provider;revision-date 2014-03-28;} + + description + "Nicira extensions API in openflow library."; + + revision "2014-07-11" { + description + "Initial revision"; + } + + identity openflowjava-extension-nicira-api { + base config:module-type; + config:provided-service nicira-extension-codec-registrator; + config:java-name-prefix NiciraExtensionApiProvider; + } + + identity nicira-extension-codec-registrator { + base config:service-type; + config:java-class "org.opendaylight.openflowjava.nx.api.NiciraExtensionCodecRegistrator"; + } + + augment "/config:modules/config:module/config:configuration" { + case openflowjava-extension-nicira-api { + when "/config:modules/config:module/config:type = 'openflowjava-extension-nicira-api'"; + + list openflow-switch-connection-provider { + uses config:service-ref { + refine type { + mandatory true; + config:required-identity openflow-switch-connection-provider:openflow-switch-connection-provider; + } + } + } + } + } +} \ No newline at end of file diff --git a/extension/openflowjava-extension-nicira/pom.xml b/extension/openflowjava-extension-nicira/pom.xml new file mode 100644 index 0000000000..290fd7f7f5 --- /dev/null +++ b/extension/openflowjava-extension-nicira/pom.xml @@ -0,0 +1,114 @@ + + + 4.0.0 + + org.opendaylight.openflowplugin + openflowplugin-extension-parent + 0.0.3-SNAPSHOT + ../ + + openflowjava-extension-nicira + bundle + + + + + org.apache.felix + maven-bundle-plugin + + + + org.opendaylight.yangtools + yang-maven-plugin + + + + generate-sources + + + + + + org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator + + ${project.build.directory}/generated-sources/config + + + urn:opendaylight:params:xml:ns:yang:controller:config==org.opendaylight.controller.config.yang + + + + + + org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl + + ${project.build.directory}/generated-sources/sal + + + org.opendaylight.yangtools.yang.unified.doc.generator.maven.DocumentationGeneratorImpl + ${project.build.directory}/site/models + + + true + + + + + + org.opendaylight.controller + yang-jmx-generator-plugin + ${config.parent.version} + + + org.opendaylight.yangtools + maven-sal-api-gen-plugin + ${yangtools.version} + jar + + + + + + + + + + org.opendaylight.openflowjava + openflow-protocol-api + + + org.opendaylight.openflowjava + openflow-protocol-spi + + + org.opendaylight.openflowjava + util + + + ${project.groupId} + openflowjava-extension-nicira-api + + + + + + + io.netty + netty-buffer + + + junit + junit + test + + + org.slf4j + slf4j-log4j12 + + + org.opendaylight.controller + config-api + + + diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/NiciraExtensionsRegistrator.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/NiciraExtensionsRegistrator.java new file mode 100644 index 0000000000..8f2fd30a9d --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/NiciraExtensionsRegistrator.java @@ -0,0 +1,136 @@ +package org.opendaylight.openflowjava.nx; + +import org.opendaylight.openflowjava.nx.api.NiciraExtensionCodecRegistrator; +import org.opendaylight.openflowjava.nx.codec.action.NiciraActionCodecs; +import org.opendaylight.openflowjava.nx.codec.action.RegLoadCodec; +import org.opendaylight.openflowjava.nx.codec.action.RegMoveCodec; +import org.opendaylight.openflowjava.nx.codec.match.ArpOpCodec; +import org.opendaylight.openflowjava.nx.codec.match.ArpShaCodec; +import org.opendaylight.openflowjava.nx.codec.match.ArpSpaCodec; +import org.opendaylight.openflowjava.nx.codec.match.ArpThaCodec; +import org.opendaylight.openflowjava.nx.codec.match.ArpTpaCodec; +import org.opendaylight.openflowjava.nx.codec.match.EthDstCodec; +import org.opendaylight.openflowjava.nx.codec.match.EthSrcCodec; +import org.opendaylight.openflowjava.nx.codec.match.EthTypeCodec; +import org.opendaylight.openflowjava.nx.codec.match.Reg0Codec; +import org.opendaylight.openflowjava.nx.codec.match.Reg1Codec; +import org.opendaylight.openflowjava.nx.codec.match.Reg2Codec; +import org.opendaylight.openflowjava.nx.codec.match.Reg3Codec; +import org.opendaylight.openflowjava.nx.codec.match.Reg4Codec; +import org.opendaylight.openflowjava.nx.codec.match.Reg5Codec; +import org.opendaylight.openflowjava.nx.codec.match.Reg6Codec; +import org.opendaylight.openflowjava.nx.codec.match.Reg7Codec; +import org.opendaylight.openflowjava.nx.codec.match.TunIdCodec; +import org.opendaylight.openflowjava.nx.codec.match.TunIpv4DstCodec; +import org.opendaylight.openflowjava.nx.codec.match.TunIpv4SrcCodec; + +import com.google.common.base.Preconditions; + +public class NiciraExtensionsRegistrator implements AutoCloseable { + + private final NiciraExtensionCodecRegistrator registrator; + + /** + * @param providers cannot be null + */ + public NiciraExtensionsRegistrator(NiciraExtensionCodecRegistrator registrator) { + Preconditions.checkNotNull(registrator); + this.registrator = registrator; + } + + public void registerNiciraExtensions() { + registrator.registerActionDeserializer(RegLoadCodec.DESERIALIZER_KEY, NiciraActionCodecs.REG_LOAD_CODEC); + registrator.registerActionSerializer(RegLoadCodec.SERIALIZER_KEY, NiciraActionCodecs.REG_LOAD_CODEC); + registrator.registerActionDeserializer(RegMoveCodec.DESERIALIZER_KEY, NiciraActionCodecs.REG_MOVE_CODEC); + registrator.registerActionSerializer(RegMoveCodec.SERIALIZER_KEY, NiciraActionCodecs.REG_MOVE_CODEC); + registrator.registerMatchEntrySerializer(Reg0Codec.SERIALIZER_KEY, NiciraMatchCodecs.REG0_CODEC); + registrator.registerMatchEntryDeserializer(Reg0Codec.DESERIALIZER_KEY, NiciraMatchCodecs.REG0_CODEC); + registrator.registerMatchEntrySerializer(Reg1Codec.SERIALIZER_KEY, NiciraMatchCodecs.REG1_CODEC); + registrator.registerMatchEntryDeserializer(Reg1Codec.DESERIALIZER_KEY, NiciraMatchCodecs.REG1_CODEC); + registrator.registerMatchEntrySerializer(Reg2Codec.SERIALIZER_KEY, NiciraMatchCodecs.REG2_CODEC); + registrator.registerMatchEntryDeserializer(Reg2Codec.DESERIALIZER_KEY, NiciraMatchCodecs.REG2_CODEC); + registrator.registerMatchEntrySerializer(Reg3Codec.SERIALIZER_KEY, NiciraMatchCodecs.REG3_CODEC); + registrator.registerMatchEntryDeserializer(Reg3Codec.DESERIALIZER_KEY, NiciraMatchCodecs.REG3_CODEC); + registrator.registerMatchEntrySerializer(Reg4Codec.SERIALIZER_KEY, NiciraMatchCodecs.REG4_CODEC); + registrator.registerMatchEntryDeserializer(Reg4Codec.DESERIALIZER_KEY, NiciraMatchCodecs.REG4_CODEC); + registrator.registerMatchEntrySerializer(Reg5Codec.SERIALIZER_KEY, NiciraMatchCodecs.REG5_CODEC); + registrator.registerMatchEntryDeserializer(Reg5Codec.DESERIALIZER_KEY, NiciraMatchCodecs.REG5_CODEC); + registrator.registerMatchEntrySerializer(Reg6Codec.SERIALIZER_KEY, NiciraMatchCodecs.REG6_CODEC); + registrator.registerMatchEntryDeserializer(Reg6Codec.DESERIALIZER_KEY, NiciraMatchCodecs.REG6_CODEC); + registrator.registerMatchEntrySerializer(Reg7Codec.SERIALIZER_KEY, NiciraMatchCodecs.REG7_CODEC); + registrator.registerMatchEntryDeserializer(Reg7Codec.DESERIALIZER_KEY, NiciraMatchCodecs.REG7_CODEC); + registrator.registerMatchEntrySerializer(TunIdCodec.SERIALIZER_KEY, NiciraMatchCodecs.TUN_ID_CODEC); + registrator.registerMatchEntryDeserializer(TunIdCodec.DESERIALIZER_KEY, NiciraMatchCodecs.TUN_ID_CODEC); + registrator.registerMatchEntrySerializer(ArpOpCodec.SERIALIZER_KEY, NiciraMatchCodecs.ARP_OP_CODEC); + registrator.registerMatchEntryDeserializer(ArpOpCodec.DESERIALIZER_KEY, NiciraMatchCodecs.ARP_OP_CODEC); + registrator.registerMatchEntrySerializer(ArpShaCodec.SERIALIZER_KEY, NiciraMatchCodecs.ARP_SHA_CODEC); + registrator.registerMatchEntryDeserializer(ArpShaCodec.DESERIALIZER_KEY, NiciraMatchCodecs.ARP_SHA_CODEC); + registrator.registerMatchEntrySerializer(ArpSpaCodec.SERIALIZER_KEY, NiciraMatchCodecs.ARP_SPA_CODEC); + registrator.registerMatchEntryDeserializer(ArpSpaCodec.DESERIALIZER_KEY, NiciraMatchCodecs.ARP_SPA_CODEC); + registrator.registerMatchEntrySerializer(ArpThaCodec.SERIALIZER_KEY, NiciraMatchCodecs.ARP_THA_CODEC); + registrator.registerMatchEntryDeserializer(ArpThaCodec.DESERIALIZER_KEY, NiciraMatchCodecs.ARP_THA_CODEC); + registrator.registerMatchEntrySerializer(ArpTpaCodec.SERIALIZER_KEY, NiciraMatchCodecs.ARP_TPA_CODEC); + registrator.registerMatchEntryDeserializer(ArpTpaCodec.DESERIALIZER_KEY, NiciraMatchCodecs.ARP_TPA_CODEC); + registrator.registerMatchEntrySerializer(EthDstCodec.SERIALIZER_KEY, NiciraMatchCodecs.ETH_DST_CODEC); + registrator.registerMatchEntryDeserializer(EthDstCodec.DESERIALIZER_KEY, NiciraMatchCodecs.ETH_DST_CODEC); + registrator.registerMatchEntrySerializer(EthSrcCodec.SERIALIZER_KEY, NiciraMatchCodecs.ETH_SRC_CODEC); + registrator.registerMatchEntryDeserializer(EthSrcCodec.DESERIALIZER_KEY, NiciraMatchCodecs.ETH_SRC_CODEC); + registrator.registerMatchEntrySerializer(TunIpv4DstCodec.SERIALIZER_KEY, NiciraMatchCodecs.TUN_IPV4_DST_CODEC); + registrator.registerMatchEntryDeserializer(TunIpv4DstCodec.DESERIALIZER_KEY, NiciraMatchCodecs.TUN_IPV4_DST_CODEC); + registrator.registerMatchEntrySerializer(TunIpv4SrcCodec.SERIALIZER_KEY, NiciraMatchCodecs.TUN_IPV4_SRC_CODEC); + registrator.registerMatchEntryDeserializer(TunIpv4SrcCodec.DESERIALIZER_KEY, NiciraMatchCodecs.TUN_IPV4_SRC_CODEC); + registrator.registerMatchEntrySerializer(EthTypeCodec.SERIALIZER_KEY, NiciraMatchCodecs.ETH_TYPE_CODEC); + registrator.registerMatchEntryDeserializer(EthTypeCodec.DESERIALIZER_KEY, NiciraMatchCodecs.ETH_TYPE_CODEC); + } + + public void unregisterExtensions() { + registrator.unregisterActionDeserializer(RegLoadCodec.DESERIALIZER_KEY); + registrator.unregisterActionSerializer(RegLoadCodec.SERIALIZER_KEY); + registrator.unregisterActionDeserializer(RegMoveCodec.DESERIALIZER_KEY); + registrator.unregisterActionSerializer(RegMoveCodec.SERIALIZER_KEY); + registrator.unregisterMatchEntrySerializer(Reg0Codec.SERIALIZER_KEY); + registrator.unregisterMatchEntryDeserializer(Reg0Codec.DESERIALIZER_KEY); + registrator.unregisterMatchEntrySerializer(Reg1Codec.SERIALIZER_KEY); + registrator.unregisterMatchEntryDeserializer(Reg1Codec.DESERIALIZER_KEY); + registrator.unregisterMatchEntrySerializer(Reg2Codec.SERIALIZER_KEY); + registrator.unregisterMatchEntryDeserializer(Reg2Codec.DESERIALIZER_KEY); + registrator.unregisterMatchEntrySerializer(Reg3Codec.SERIALIZER_KEY); + registrator.unregisterMatchEntryDeserializer(Reg3Codec.DESERIALIZER_KEY); + registrator.unregisterMatchEntrySerializer(Reg4Codec.SERIALIZER_KEY); + registrator.unregisterMatchEntryDeserializer(Reg4Codec.DESERIALIZER_KEY); + registrator.unregisterMatchEntrySerializer(Reg5Codec.SERIALIZER_KEY); + registrator.unregisterMatchEntryDeserializer(Reg5Codec.DESERIALIZER_KEY); + registrator.unregisterMatchEntrySerializer(Reg6Codec.SERIALIZER_KEY); + registrator.unregisterMatchEntryDeserializer(Reg6Codec.DESERIALIZER_KEY); + registrator.unregisterMatchEntrySerializer(Reg7Codec.SERIALIZER_KEY); + registrator.unregisterMatchEntryDeserializer(Reg7Codec.DESERIALIZER_KEY); + registrator.unregisterMatchEntrySerializer(TunIdCodec.SERIALIZER_KEY); + registrator.unregisterMatchEntryDeserializer(TunIdCodec.DESERIALIZER_KEY); + registrator.unregisterMatchEntrySerializer(ArpOpCodec.SERIALIZER_KEY); + registrator.unregisterMatchEntryDeserializer(ArpOpCodec.DESERIALIZER_KEY); + registrator.unregisterMatchEntrySerializer(ArpShaCodec.SERIALIZER_KEY); + registrator.unregisterMatchEntryDeserializer(ArpShaCodec.DESERIALIZER_KEY); + registrator.unregisterMatchEntrySerializer(ArpSpaCodec.SERIALIZER_KEY); + registrator.unregisterMatchEntryDeserializer(ArpSpaCodec.DESERIALIZER_KEY); + registrator.unregisterMatchEntrySerializer(ArpThaCodec.SERIALIZER_KEY); + registrator.unregisterMatchEntryDeserializer(ArpThaCodec.DESERIALIZER_KEY); + registrator.unregisterMatchEntrySerializer(ArpTpaCodec.SERIALIZER_KEY); + registrator.unregisterMatchEntryDeserializer(ArpTpaCodec.DESERIALIZER_KEY); + registrator.unregisterMatchEntrySerializer(EthDstCodec.SERIALIZER_KEY); + registrator.unregisterMatchEntryDeserializer(EthDstCodec.DESERIALIZER_KEY); + registrator.unregisterMatchEntrySerializer(EthSrcCodec.SERIALIZER_KEY); + registrator.unregisterMatchEntryDeserializer(EthSrcCodec.DESERIALIZER_KEY); + registrator.unregisterMatchEntrySerializer(TunIpv4DstCodec.SERIALIZER_KEY); + registrator.unregisterMatchEntryDeserializer(TunIpv4DstCodec.DESERIALIZER_KEY); + registrator.unregisterMatchEntrySerializer(TunIpv4SrcCodec.SERIALIZER_KEY); + registrator.unregisterMatchEntryDeserializer(TunIpv4SrcCodec.DESERIALIZER_KEY); + registrator.unregisterMatchEntrySerializer(EthTypeCodec.SERIALIZER_KEY); + registrator.unregisterMatchEntryDeserializer(EthTypeCodec.DESERIALIZER_KEY); + } + + @Override + public void close() throws Exception { + unregisterExtensions(); + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/NiciraMatchCodecs.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/NiciraMatchCodecs.java new file mode 100644 index 0000000000..b9422f5192 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/NiciraMatchCodecs.java @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowjava.nx; + +import org.opendaylight.openflowjava.nx.codec.match.ArpOpCodec; +import org.opendaylight.openflowjava.nx.codec.match.ArpShaCodec; +import org.opendaylight.openflowjava.nx.codec.match.ArpSpaCodec; +import org.opendaylight.openflowjava.nx.codec.match.ArpThaCodec; +import org.opendaylight.openflowjava.nx.codec.match.ArpTpaCodec; +import org.opendaylight.openflowjava.nx.codec.match.EthDstCodec; +import org.opendaylight.openflowjava.nx.codec.match.EthSrcCodec; +import org.opendaylight.openflowjava.nx.codec.match.EthTypeCodec; +import org.opendaylight.openflowjava.nx.codec.match.Reg0Codec; +import org.opendaylight.openflowjava.nx.codec.match.Reg1Codec; +import org.opendaylight.openflowjava.nx.codec.match.Reg2Codec; +import org.opendaylight.openflowjava.nx.codec.match.Reg3Codec; +import org.opendaylight.openflowjava.nx.codec.match.Reg4Codec; +import org.opendaylight.openflowjava.nx.codec.match.Reg5Codec; +import org.opendaylight.openflowjava.nx.codec.match.Reg6Codec; +import org.opendaylight.openflowjava.nx.codec.match.Reg7Codec; +import org.opendaylight.openflowjava.nx.codec.match.TunIdCodec; +import org.opendaylight.openflowjava.nx.codec.match.TunIpv4DstCodec; +import org.opendaylight.openflowjava.nx.codec.match.TunIpv4SrcCodec; + +/** + * @author msunal + * + */ +public class NiciraMatchCodecs { + + public static final Reg0Codec REG0_CODEC = new Reg0Codec(); + public static final Reg1Codec REG1_CODEC = new Reg1Codec(); + public static final Reg2Codec REG2_CODEC = new Reg2Codec(); + public static final Reg3Codec REG3_CODEC = new Reg3Codec(); + public static final Reg4Codec REG4_CODEC = new Reg4Codec(); + public static final Reg5Codec REG5_CODEC = new Reg5Codec(); + public static final Reg6Codec REG6_CODEC = new Reg6Codec(); + public static final Reg7Codec REG7_CODEC = new Reg7Codec(); + public static final TunIdCodec TUN_ID_CODEC = new TunIdCodec(); + public static final ArpOpCodec ARP_OP_CODEC = new ArpOpCodec(); + public static final ArpShaCodec ARP_SHA_CODEC = new ArpShaCodec(); + public static final ArpSpaCodec ARP_SPA_CODEC = new ArpSpaCodec(); + public static final ArpThaCodec ARP_THA_CODEC = new ArpThaCodec(); + public static final ArpTpaCodec ARP_TPA_CODEC = new ArpTpaCodec(); + public static final EthDstCodec ETH_DST_CODEC = new EthDstCodec(); + public static final EthSrcCodec ETH_SRC_CODEC = new EthSrcCodec(); + public static final TunIpv4DstCodec TUN_IPV4_DST_CODEC = new TunIpv4DstCodec(); + public static final TunIpv4SrcCodec TUN_IPV4_SRC_CODEC = new TunIpv4SrcCodec(); + public static final EthTypeCodec ETH_TYPE_CODEC = new EthTypeCodec(); + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/AbstractActionCodec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/AbstractActionCodec.java new file mode 100644 index 0000000000..29f997d49e --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/AbstractActionCodec.java @@ -0,0 +1,62 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowjava.nx.codec.action; + +import io.netty.buffer.ByteBuf; + +import org.opendaylight.openflowjava.nx.api.NiciraConstants; +import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer; +import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.ExperimenterActionSubType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.ActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId; + +/** + * @author msunal + * + */ +public abstract class AbstractActionCodec implements OFSerializer, OFDeserializer { + + protected final static void serializeHeader(int msgLength, int subtype, ByteBuf outBuffer) { + outBuffer.writeShort(EncodeConstants.EXPERIMENTER_VALUE); + writeMsgLengthVendorIdSubtypeToBuffer(msgLength, subtype, outBuffer); + } + + private final static void writeMsgLengthVendorIdSubtypeToBuffer(int msgLength, int subtype, ByteBuf outBuffer) { + outBuffer.writeShort(msgLength); + outBuffer.writeInt(NiciraConstants.NX_VENDOR_ID.intValue()); + outBuffer.writeShort(subtype); + } + + protected final static ActionBuilder deserializeHeader(ByteBuf message) { + // size of experimenter type + message.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES); + // size of length + message.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES); + // vendor id + message.skipBytes(EncodeConstants.SIZE_OF_INT_IN_BYTES); + // subtype + message.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES); + ActionBuilder actionBuilder = new ActionBuilder(); + actionBuilder.setType(Experimenter.class); + return actionBuilder; + } + + protected final static ExperimenterIdAction createExperimenterIdAction(Class subtype) { + ExperimenterIdActionBuilder expIdBuilder = new ExperimenterIdActionBuilder(); + expIdBuilder.setExperimenter(new ExperimenterId(NiciraConstants.NX_VENDOR_ID)); + expIdBuilder.setSubType(subtype); + return expIdBuilder.build(); + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/NiciraActionCodecs.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/NiciraActionCodecs.java new file mode 100644 index 0000000000..bdcade64de --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/NiciraActionCodecs.java @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowjava.nx.codec.action; + +/** + * @author msunal + * + */ +public class NiciraActionCodecs { + + public static final RegMoveCodec REG_MOVE_CODEC = new RegMoveCodec(); + public static final RegLoadCodec REG_LOAD_CODEC = new RegLoadCodec(); +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/RegLoadCodec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/RegLoadCodec.java new file mode 100644 index 0000000000..ac6185e538 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/RegLoadCodec.java @@ -0,0 +1,51 @@ +package org.opendaylight.openflowjava.nx.codec.action; + +import io.netty.buffer.ByteBuf; + +import java.math.BigInteger; + +import org.opendaylight.openflowjava.nx.api.NiciraActionDeserializerKey; +import org.opendaylight.openflowjava.nx.api.NiciraActionSerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.ActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.NxmNxRegLoad; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.OfjAugNxAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.OfjAugNxActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.reg.load.grouping.ActionRegLoad; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.reg.load.grouping.ActionRegLoadBuilder; + +public class RegLoadCodec extends AbstractActionCodec { + + public static final int LENGTH = 24; + public static final byte SUBTYPE = 7; // NXAST_REG_LOAD + public static final NiciraActionSerializerKey SERIALIZER_KEY = new NiciraActionSerializerKey( + EncodeConstants.OF13_VERSION_ID, NxmNxRegLoad.class); + public static final NiciraActionDeserializerKey DESERIALIZER_KEY = new NiciraActionDeserializerKey( + EncodeConstants.OF13_VERSION_ID, SUBTYPE); + + @Override + public void serialize(Action input, ByteBuf outBuffer) { + ActionRegLoad actionRegLoad = input.getAugmentation(OfjAugNxAction.class).getActionRegLoad(); + serializeHeader(LENGTH, SUBTYPE, outBuffer); + outBuffer.writeShort(actionRegLoad.getOfsNbits()); + outBuffer.writeInt(actionRegLoad.getDst().intValue()); + outBuffer.writeLong(actionRegLoad.getValue().longValue()); + } + + @Override + public Action deserialize(ByteBuf message) { + ActionBuilder actionBuilder = deserializeHeader(message); + ActionRegLoadBuilder actionRegLoadBuilder = new ActionRegLoadBuilder(); + actionRegLoadBuilder.setOfsNbits(message.readUnsignedShort()); + actionRegLoadBuilder.setDst(message.readUnsignedInt()); + actionRegLoadBuilder.setValue(BigInteger.valueOf(message.readLong())); + OfjAugNxActionBuilder augNxActionBuilder = new OfjAugNxActionBuilder(); + augNxActionBuilder.setActionRegLoad(actionRegLoadBuilder.build()); + actionBuilder.addAugmentation(ExperimenterIdAction.class, createExperimenterIdAction(NxmNxRegLoad.class)); + actionBuilder.addAugmentation(OfjAugNxAction.class, augNxActionBuilder.build()); + return actionBuilder.build(); + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/RegMoveCodec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/RegMoveCodec.java new file mode 100644 index 0000000000..615756d8dc --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/RegMoveCodec.java @@ -0,0 +1,53 @@ +package org.opendaylight.openflowjava.nx.codec.action; + +import io.netty.buffer.ByteBuf; + +import org.opendaylight.openflowjava.nx.api.NiciraActionDeserializerKey; +import org.opendaylight.openflowjava.nx.api.NiciraActionSerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.ActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.NxmNxRegMove; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.OfjAugNxAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.OfjAugNxActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.reg.move.grouping.ActionRegMove; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.reg.move.grouping.ActionRegMoveBuilder; + +public class RegMoveCodec extends AbstractActionCodec { + + public static final int LENGTH = 24; + public static final byte SUBTYPE = 6; // NXAST_REG_MOVE + public static final NiciraActionSerializerKey SERIALIZER_KEY = new NiciraActionSerializerKey( + EncodeConstants.OF13_VERSION_ID, NxmNxRegMove.class); + public static final NiciraActionDeserializerKey DESERIALIZER_KEY = new NiciraActionDeserializerKey( + EncodeConstants.OF13_VERSION_ID, SUBTYPE); + + @Override + public void serialize(Action input, ByteBuf outBuffer) { + ActionRegMove actionRegMove = input.getAugmentation(OfjAugNxAction.class).getActionRegMove(); + serializeHeader(LENGTH, SUBTYPE, outBuffer); + outBuffer.writeShort(actionRegMove.getNBits()); + outBuffer.writeShort(actionRegMove.getSrcOfs()); + outBuffer.writeShort(actionRegMove.getDstOfs()); + outBuffer.writeInt(actionRegMove.getSrc().intValue()); + outBuffer.writeInt(actionRegMove.getDst().intValue()); + } + + @Override + public Action deserialize(ByteBuf message) { + ActionBuilder actionBuilder = deserializeHeader(message); + ActionRegMoveBuilder actionRegMoveBuilder = new ActionRegMoveBuilder(); + actionRegMoveBuilder.setNBits(message.readUnsignedShort()); + actionRegMoveBuilder.setSrcOfs(message.readUnsignedShort()); + actionRegMoveBuilder.setDstOfs(message.readUnsignedShort()); + actionRegMoveBuilder.setSrc(message.readUnsignedInt()); + actionRegMoveBuilder.setDst(message.readUnsignedInt()); + OfjAugNxActionBuilder augNxActionBuilder = new OfjAugNxActionBuilder(); + augNxActionBuilder.setActionRegMove(actionRegMoveBuilder.build()); + actionBuilder.addAugmentation(ExperimenterIdAction.class, createExperimenterIdAction(NxmNxRegMove.class)); + actionBuilder.addAugmentation(OfjAugNxAction.class, augNxActionBuilder.build()); + return actionBuilder.build(); + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/AbstractMatchCodec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/AbstractMatchCodec.java new file mode 100644 index 0000000000..9d6e91e0b6 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/AbstractMatchCodec.java @@ -0,0 +1,88 @@ +package org.opendaylight.openflowjava.nx.codec.match; + +import io.netty.buffer.ByteBuf; + +import org.opendaylight.openflowjava.nx.api.NiciraConstants; +import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer; +import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdMatchEntry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdMatchEntryBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder; + +public abstract class AbstractMatchCodec implements OFSerializer, OFDeserializer { + + private NxmHeader headerWithMask; + private NxmHeader headerWithoutMask; + + protected MatchEntriesBuilder deserializeHeader(ByteBuf message) { + MatchEntriesBuilder builder = new MatchEntriesBuilder(); + builder.setOxmClass(getOxmClass()); + // skip oxm_class - provided + message.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES); + builder.setOxmMatchField(getNxmField()); + boolean hasMask = (message.readUnsignedByte() & 1) != 0; + builder.setHasMask(hasMask); + // skip match entry length - not needed + message.skipBytes(EncodeConstants.SIZE_OF_BYTE_IN_BYTES); + ExperimenterIdMatchEntryBuilder experimenterIdMatchEntryBuilder = new ExperimenterIdMatchEntryBuilder(); + experimenterIdMatchEntryBuilder.setExperimenter(new ExperimenterId(NiciraConstants.NX_VENDOR_ID)); + builder.addAugmentation(ExperimenterIdMatchEntry.class, experimenterIdMatchEntryBuilder.build()); + return builder; + } + + protected void serializeHeader(MatchEntries input, ByteBuf outBuffer) { + outBuffer.writeInt(serializeHeaderToLong(input.isHasMask()).intValue()); + } + + private Long serializeHeaderToLong(boolean hasMask) { + if (hasMask) { + return getHeaderWithHasMask().toLong(); + } + return getHeaderWithoutHasMask().toLong(); + } + + public NxmHeader getHeaderWithoutHasMask() { + if (headerWithoutMask == null) { + headerWithoutMask = new NxmHeader(getOxmClassCode(), getNxmFieldCode(), false, getValueLength()); + } + return headerWithoutMask; + } + + public NxmHeader getHeaderWithHasMask() { + if (headerWithMask == null) { + headerWithMask = new NxmHeader(getOxmClassCode(), getNxmFieldCode(), true, getValueLength()); + } + return headerWithMask; + } + + /** + * @return numeric representation of nxm_field + */ + public abstract int getNxmFieldCode(); + + /** + * @return numeric representation of oxm_class + */ + public abstract int getOxmClassCode(); + + /** + * @return match entry value length + */ + public abstract int getValueLength(); + + /** + * @return nxm_field class + */ + public abstract Class getNxmField(); + + /** + * @return oxm_class class + */ + public abstract Class getOxmClass(); + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/AbstractRegCodec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/AbstractRegCodec.java new file mode 100644 index 0000000000..73deeb7d98 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/AbstractRegCodec.java @@ -0,0 +1,49 @@ +package org.opendaylight.openflowjava.nx.codec.match; + +import io.netty.buffer.ByteBuf; + +import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.nx.match.reg.grouping.RegValuesBuilder; + +public abstract class AbstractRegCodec extends AbstractMatchCodec { + + private static final int VALUE_LENGTH = 4; + + @Override + public MatchEntries deserialize(ByteBuf message) { + MatchEntriesBuilder matchEntriesBuilder = deserializeHeader(message); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder(); + augNxMatchBuilder.setRegValues(new RegValuesBuilder().setValue(message.readUnsignedInt()).build()); + matchEntriesBuilder.addAugmentation(OfjAugNxMatch.class, augNxMatchBuilder.build()); + return matchEntriesBuilder.build(); + } + + @Override + public void serialize(MatchEntries input, ByteBuf outBuffer) { + serializeHeader(input, outBuffer); + Long value = input.getAugmentation(OfjAugNxMatch.class).getRegValues().getValue(); + outBuffer.writeInt(value.intValue()); + } + + @Override + public int getOxmClassCode() { + return OxmMatchConstants.NXM_1_CLASS; + } + + @Override + public int getValueLength() { + return VALUE_LENGTH; + } + + @Override + public Class getOxmClass() { + return Nxm1Class.class; + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpOpCodec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpOpCodec.java new file mode 100644 index 0000000000..ef63b5c23f --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpOpCodec.java @@ -0,0 +1,69 @@ +package org.opendaylight.openflowjava.nx.codec.match; + +import io.netty.buffer.ByteBuf; + +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm0Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmOfArpOp; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.of.match.arp.op.grouping.ArpOpValuesBuilder; + +public class ArpOpCodec extends AbstractMatchCodec { + + private static final int VALUE_LENGTH = 2; + private static final int NXM_FIELD_CODE = 15; + public static final MatchEntrySerializerKey SERIALIZER_KEY = new MatchEntrySerializerKey<>( + EncodeConstants.OF13_VERSION_ID, Nxm0Class.class, NxmOfArpOp.class); + public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey( + EncodeConstants.OF13_VERSION_ID, OxmMatchConstants.NXM_0_CLASS, NXM_FIELD_CODE); + + @Override + public void serialize(MatchEntries input, ByteBuf outBuffer) { + serializeHeader(input, outBuffer); + Integer value = input.getAugmentation(OfjAugNxMatch.class).getArpOpValues().getValue(); + outBuffer.writeShort(value); + } + + @Override + public MatchEntries deserialize(ByteBuf message) { + MatchEntriesBuilder matchEntriesBuilder = deserializeHeader(message); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder(); + augNxMatchBuilder.setArpOpValues(new ArpOpValuesBuilder().setValue(message.readUnsignedShort()).build()); + matchEntriesBuilder.addAugmentation(OfjAugNxMatch.class, augNxMatchBuilder.build()); + return matchEntriesBuilder.build(); + } + + @Override + public int getNxmFieldCode() { + return NXM_FIELD_CODE; + } + + @Override + public int getOxmClassCode() { + return OxmMatchConstants.NXM_0_CLASS; + } + + @Override + public int getValueLength() { + return VALUE_LENGTH; + } + + @Override + public Class getNxmField() { + return NxmOfArpOp.class; + } + + @Override + public Class getOxmClass() { + return Nxm0Class.class; + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpShaCodec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpShaCodec.java new file mode 100644 index 0000000000..9942eddc72 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpShaCodec.java @@ -0,0 +1,74 @@ +package org.opendaylight.openflowjava.nx.codec.match; + +import io.netty.buffer.ByteBuf; + +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants; +import org.opendaylight.openflowjava.util.ByteBufUtils; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxArpSha; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.nx.match.arp.sha.grouping.ArpShaValuesBuilder; + +public class ArpShaCodec extends AbstractMatchCodec { + + private static final int VALUE_LENGTH = 6; + private static final int NXM_FIELD_CODE = 17; + public static final MatchEntrySerializerKey SERIALIZER_KEY = new MatchEntrySerializerKey<>( + EncodeConstants.OF13_VERSION_ID, Nxm1Class.class, NxmNxArpSha.class); + public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey( + EncodeConstants.OF13_VERSION_ID, OxmMatchConstants.NXM_1_CLASS, NXM_FIELD_CODE); + + @Override + public void serialize(MatchEntries input, ByteBuf outBuffer) { + serializeHeader(input, outBuffer); + String value = input.getAugmentation(OfjAugNxMatch.class).getArpShaValues().getMacAddress().getValue(); + outBuffer.writeBytes(ByteBufUtils.macAddressToBytes(value)); + } + + @Override + public MatchEntries deserialize(ByteBuf message) { + MatchEntriesBuilder matchEntriesBuilder = deserializeHeader(message); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder(); + byte[] address = new byte[VALUE_LENGTH]; + message.readBytes(address); + augNxMatchBuilder.setArpShaValues(new ArpShaValuesBuilder().setMacAddress( + new MacAddress(ByteBufUtils.macAddressToString(address))).build()); + matchEntriesBuilder.addAugmentation(OfjAugNxMatch.class, augNxMatchBuilder.build()); + return matchEntriesBuilder.build(); + } + + @Override + public int getNxmFieldCode() { + return NXM_FIELD_CODE; + } + + @Override + public int getOxmClassCode() { + return OxmMatchConstants.NXM_1_CLASS; + } + + @Override + public int getValueLength() { + return VALUE_LENGTH; + } + + @Override + public Class getNxmField() { + return NxmNxArpSha.class; + } + + @Override + public Class getOxmClass() { + return Nxm1Class.class; + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpSpaCodec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpSpaCodec.java new file mode 100644 index 0000000000..a3a2f441d1 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpSpaCodec.java @@ -0,0 +1,69 @@ +package org.opendaylight.openflowjava.nx.codec.match; + +import io.netty.buffer.ByteBuf; + +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm0Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmOfArpSpa; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.of.match.arp.spa.grouping.ArpSpaValuesBuilder; + +public class ArpSpaCodec extends AbstractMatchCodec { + + private static final int VALUE_LENGTH = 4; + private static final int NXM_FIELD_CODE = 16; + public static final MatchEntrySerializerKey SERIALIZER_KEY = new MatchEntrySerializerKey<>( + EncodeConstants.OF13_VERSION_ID, Nxm0Class.class, NxmOfArpSpa.class); + public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey( + EncodeConstants.OF13_VERSION_ID, OxmMatchConstants.NXM_0_CLASS, NXM_FIELD_CODE); + + @Override + public void serialize(MatchEntries input, ByteBuf outBuffer) { + serializeHeader(input, outBuffer); + Long value = input.getAugmentation(OfjAugNxMatch.class).getArpSpaValues().getValue(); + outBuffer.writeInt(value.intValue()); + } + + @Override + public MatchEntries deserialize(ByteBuf message) { + MatchEntriesBuilder matchEntriesBuilder = deserializeHeader(message); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder(); + augNxMatchBuilder.setArpSpaValues(new ArpSpaValuesBuilder().setValue(message.readUnsignedInt()).build()); + matchEntriesBuilder.addAugmentation(OfjAugNxMatch.class, augNxMatchBuilder.build()); + return matchEntriesBuilder.build(); + } + + @Override + public int getNxmFieldCode() { + return NXM_FIELD_CODE; + } + + @Override + public int getOxmClassCode() { + return OxmMatchConstants.NXM_0_CLASS; + } + + @Override + public int getValueLength() { + return VALUE_LENGTH; + } + + @Override + public Class getNxmField() { + return NxmOfArpSpa.class; + } + + @Override + public Class getOxmClass() { + return Nxm0Class.class; + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpThaCodec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpThaCodec.java new file mode 100644 index 0000000000..fa2f0998df --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpThaCodec.java @@ -0,0 +1,74 @@ +package org.opendaylight.openflowjava.nx.codec.match; + +import io.netty.buffer.ByteBuf; + +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants; +import org.opendaylight.openflowjava.util.ByteBufUtils; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxArpTha; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.nx.match.arp.tha.grouping.ArpThaValuesBuilder; + +public class ArpThaCodec extends AbstractMatchCodec { + + private static final int VALUE_LENGTH = 6; + private static final int NXM_FIELD_CODE = 18; + public static final MatchEntrySerializerKey SERIALIZER_KEY = new MatchEntrySerializerKey<>( + EncodeConstants.OF13_VERSION_ID, Nxm1Class.class, NxmNxArpTha.class); + public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey( + EncodeConstants.OF13_VERSION_ID, OxmMatchConstants.NXM_1_CLASS, NXM_FIELD_CODE); + + @Override + public void serialize(MatchEntries input, ByteBuf outBuffer) { + serializeHeader(input, outBuffer); + String value = input.getAugmentation(OfjAugNxMatch.class).getArpThaValues().getMacAddress().getValue(); + outBuffer.writeBytes(ByteBufUtils.macAddressToBytes(value)); + } + + @Override + public MatchEntries deserialize(ByteBuf message) { + MatchEntriesBuilder matchEntriesBuilder = deserializeHeader(message); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder(); + byte[] address = new byte[VALUE_LENGTH]; + message.readBytes(address); + augNxMatchBuilder.setArpThaValues(new ArpThaValuesBuilder().setMacAddress( + new MacAddress(ByteBufUtils.macAddressToString(address))).build()); + matchEntriesBuilder.addAugmentation(OfjAugNxMatch.class, augNxMatchBuilder.build()); + return matchEntriesBuilder.build(); + } + + @Override + public int getNxmFieldCode() { + return NXM_FIELD_CODE; + } + + @Override + public int getOxmClassCode() { + return OxmMatchConstants.NXM_1_CLASS; + } + + @Override + public int getValueLength() { + return VALUE_LENGTH; + } + + @Override + public Class getNxmField() { + return NxmNxArpTha.class; + } + + @Override + public Class getOxmClass() { + return Nxm1Class.class; + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpTpaCodec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpTpaCodec.java new file mode 100644 index 0000000000..821690680a --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpTpaCodec.java @@ -0,0 +1,69 @@ +package org.opendaylight.openflowjava.nx.codec.match; + +import io.netty.buffer.ByteBuf; + +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm0Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmOfArpTpa; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.of.match.arp.tpa.grouping.ArpTpaValuesBuilder; + +public class ArpTpaCodec extends AbstractMatchCodec { + + private static final int VALUE_LENGTH = 4; + private static final int NXM_FIELD_CODE = 17; + public static final MatchEntrySerializerKey SERIALIZER_KEY = new MatchEntrySerializerKey<>( + EncodeConstants.OF13_VERSION_ID, Nxm0Class.class, NxmOfArpTpa.class); + public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey( + EncodeConstants.OF13_VERSION_ID, OxmMatchConstants.NXM_0_CLASS, NXM_FIELD_CODE); + + @Override + public void serialize(MatchEntries input, ByteBuf outBuffer) { + serializeHeader(input, outBuffer); + Long value = input.getAugmentation(OfjAugNxMatch.class).getArpTpaValues().getValue(); + outBuffer.writeInt(value.intValue()); + } + + @Override + public MatchEntries deserialize(ByteBuf message) { + MatchEntriesBuilder matchEntriesBuilder = deserializeHeader(message); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder(); + augNxMatchBuilder.setArpTpaValues(new ArpTpaValuesBuilder().setValue(message.readUnsignedInt()).build()); + matchEntriesBuilder.addAugmentation(OfjAugNxMatch.class, augNxMatchBuilder.build()); + return matchEntriesBuilder.build(); + } + + @Override + public int getNxmFieldCode() { + return NXM_FIELD_CODE; + } + + @Override + public int getOxmClassCode() { + return OxmMatchConstants.NXM_0_CLASS; + } + + @Override + public int getValueLength() { + return VALUE_LENGTH; + } + + @Override + public Class getNxmField() { + return NxmOfArpTpa.class; + } + + @Override + public Class getOxmClass() { + return Nxm0Class.class; + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/EthDstCodec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/EthDstCodec.java new file mode 100644 index 0000000000..1575a37a22 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/EthDstCodec.java @@ -0,0 +1,74 @@ +package org.opendaylight.openflowjava.nx.codec.match; + +import io.netty.buffer.ByteBuf; + +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants; +import org.opendaylight.openflowjava.util.ByteBufUtils; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm0Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmOfEthDst; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.of.match.eth.dst.grouping.EthDstValuesBuilder; + +public class EthDstCodec extends AbstractMatchCodec { + + private static final int VALUE_LENGTH = 6; + private static final int NXM_FIELD_CODE = 1; + public static final MatchEntrySerializerKey SERIALIZER_KEY = new MatchEntrySerializerKey<>( + EncodeConstants.OF13_VERSION_ID, Nxm0Class.class, NxmOfEthDst.class); + public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey( + EncodeConstants.OF13_VERSION_ID, OxmMatchConstants.NXM_0_CLASS, NXM_FIELD_CODE); + + @Override + public void serialize(MatchEntries input, ByteBuf outBuffer) { + serializeHeader(input, outBuffer); + String value = input.getAugmentation(OfjAugNxMatch.class).getEthDstValues().getMacAddress().getValue(); + outBuffer.writeBytes(ByteBufUtils.macAddressToBytes(value)); + } + + @Override + public MatchEntries deserialize(ByteBuf message) { + MatchEntriesBuilder matchEntriesBuilder = deserializeHeader(message); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder(); + byte[] address = new byte[VALUE_LENGTH]; + message.readBytes(address); + augNxMatchBuilder.setEthDstValues(new EthDstValuesBuilder().setMacAddress( + new MacAddress(ByteBufUtils.macAddressToString(address))).build()); + matchEntriesBuilder.addAugmentation(OfjAugNxMatch.class, augNxMatchBuilder.build()); + return matchEntriesBuilder.build(); + } + + @Override + public int getNxmFieldCode() { + return NXM_FIELD_CODE; + } + + @Override + public int getOxmClassCode() { + return OxmMatchConstants.NXM_0_CLASS; + } + + @Override + public int getValueLength() { + return VALUE_LENGTH; + } + + @Override + public Class getNxmField() { + return NxmOfEthDst.class; + } + + @Override + public Class getOxmClass() { + return Nxm0Class.class; + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/EthSrcCodec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/EthSrcCodec.java new file mode 100644 index 0000000000..3983601388 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/EthSrcCodec.java @@ -0,0 +1,74 @@ +package org.opendaylight.openflowjava.nx.codec.match; + +import io.netty.buffer.ByteBuf; + +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants; +import org.opendaylight.openflowjava.util.ByteBufUtils; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm0Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmOfEthSrc; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.of.match.eth.src.grouping.EthSrcValuesBuilder; + +public class EthSrcCodec extends AbstractMatchCodec { + + private static final int VALUE_LENGTH = 6; + private static final int NXM_FIELD_CODE = 2; + public static final MatchEntrySerializerKey SERIALIZER_KEY = new MatchEntrySerializerKey<>( + EncodeConstants.OF13_VERSION_ID, Nxm0Class.class, NxmOfEthSrc.class); + public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey( + EncodeConstants.OF13_VERSION_ID, OxmMatchConstants.NXM_0_CLASS, NXM_FIELD_CODE); + + @Override + public void serialize(MatchEntries input, ByteBuf outBuffer) { + serializeHeader(input, outBuffer); + String value = input.getAugmentation(OfjAugNxMatch.class).getEthSrcValues().getMacAddress().getValue(); + outBuffer.writeBytes(ByteBufUtils.macAddressToBytes(value)); + } + + @Override + public MatchEntries deserialize(ByteBuf message) { + MatchEntriesBuilder matchEntriesBuilder = deserializeHeader(message); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder(); + byte[] address = new byte[VALUE_LENGTH]; + message.readBytes(address); + augNxMatchBuilder.setEthSrcValues(new EthSrcValuesBuilder().setMacAddress( + new MacAddress(ByteBufUtils.macAddressToString(address))).build()); + matchEntriesBuilder.addAugmentation(OfjAugNxMatch.class, augNxMatchBuilder.build()); + return matchEntriesBuilder.build(); + } + + @Override + public int getNxmFieldCode() { + return NXM_FIELD_CODE; + } + + @Override + public int getOxmClassCode() { + return OxmMatchConstants.NXM_0_CLASS; + } + + @Override + public int getValueLength() { + return VALUE_LENGTH; + } + + @Override + public Class getNxmField() { + return NxmOfEthSrc.class; + } + + @Override + public Class getOxmClass() { + return Nxm0Class.class; + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/EthTypeCodec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/EthTypeCodec.java new file mode 100644 index 0000000000..b5ce429336 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/EthTypeCodec.java @@ -0,0 +1,69 @@ +package org.opendaylight.openflowjava.nx.codec.match; + +import io.netty.buffer.ByteBuf; + +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm0Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmOfEthType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.of.match.eth.type.grouping.EthTypeValuesBuilder; + +public class EthTypeCodec extends AbstractMatchCodec { + + private static final int VALUE_LENGTH = 2; + private static final int NXM_FIELD_CODE = 3; + public static final MatchEntrySerializerKey SERIALIZER_KEY = new MatchEntrySerializerKey<>( + EncodeConstants.OF13_VERSION_ID, Nxm0Class.class, NxmOfEthType.class); + public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey( + EncodeConstants.OF13_VERSION_ID, OxmMatchConstants.NXM_0_CLASS, NXM_FIELD_CODE); + + @Override + public void serialize(MatchEntries input, ByteBuf outBuffer) { + serializeHeader(input, outBuffer); + Integer value = input.getAugmentation(OfjAugNxMatch.class).getEthTypeValues().getValue(); + outBuffer.writeShort(value); + } + + @Override + public MatchEntries deserialize(ByteBuf message) { + MatchEntriesBuilder matchEntriesBuilder = deserializeHeader(message); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder(); + augNxMatchBuilder.setEthTypeValues(new EthTypeValuesBuilder().setValue(message.readUnsignedShort()).build()); + matchEntriesBuilder.addAugmentation(OfjAugNxMatch.class, augNxMatchBuilder.build()); + return matchEntriesBuilder.build(); + } + + @Override + public int getNxmFieldCode() { + return NXM_FIELD_CODE; + } + + @Override + public int getOxmClassCode() { + return OxmMatchConstants.NXM_0_CLASS; + } + + @Override + public int getValueLength() { + return VALUE_LENGTH; + } + + @Override + public Class getNxmField() { + return NxmOfEthType.class; + } + + @Override + public Class getOxmClass() { + return Nxm0Class.class; + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/NxmHeader.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/NxmHeader.java new file mode 100644 index 0000000000..ebcf669b9d --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/NxmHeader.java @@ -0,0 +1,94 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowjava.nx.codec.match; + +import com.google.common.primitives.Ints; + +/** + * @author msunal + * + */ +public class NxmHeader { + + private final long headerAsLong; + private final int oxmClass; + private final int nxmField; + private final boolean hasMask; + private final int length; + + public NxmHeader(long header) { + this.headerAsLong = header; + this.oxmClass = Ints.checkedCast(extractSub(header, 16, 16)); + this.nxmField = Ints.checkedCast(extractSub(header, 7, 9)); + this.hasMask = extractSub(header, 1, 8) == 1 ? true : false; + this.length = Ints.checkedCast(extractSub(header, 8, 0)); + } + + public NxmHeader(int oxmClass, int nxmField, boolean hasMask, int length) { + this.oxmClass = oxmClass; + this.nxmField = nxmField; + this.hasMask = hasMask; + this.length = length; + this.headerAsLong = ((((long) oxmClass) << 16) | (nxmField << 9) | ((hasMask ? 1 : 0) << 8) | (length)); + } + + private static long extractSub(final long l, final int nrBits, final int offset) { + final long rightShifted = l >>> offset; + final long mask = (1L << nrBits) - 1L; + return rightShifted & mask; + } + + public long toLong() { + return headerAsLong; + } + + public int getOxmClass() { + return oxmClass; + } + + public int getNxmField() { + return nxmField; + } + + public boolean isHasMask() { + return hasMask; + } + + public int getLength() { + return length; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (int) (headerAsLong ^ (headerAsLong >>> 32)); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + NxmHeader other = (NxmHeader) obj; + if (headerAsLong != other.headerAsLong) + return false; + return true; + } + + @Override + public String toString() { + return "NxmHeader [headerAsLong=" + headerAsLong + ", oxmClass=" + oxmClass + ", nxmField=" + nxmField + + ", hasMask=" + hasMask + ", length=" + length + "]"; + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg0Codec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg0Codec.java new file mode 100644 index 0000000000..3fae832332 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg0Codec.java @@ -0,0 +1,29 @@ +package org.opendaylight.openflowjava.nx.codec.match; + +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg0; + +public class Reg0Codec extends AbstractRegCodec { + + private static final int NXM_FIELD_CODE = 0; + public static final MatchEntrySerializerKey SERIALIZER_KEY = new MatchEntrySerializerKey<>( + EncodeConstants.OF13_VERSION_ID, Nxm1Class.class, NxmNxReg0.class); + public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey( + EncodeConstants.OF13_VERSION_ID, OxmMatchConstants.NXM_1_CLASS, NXM_FIELD_CODE); + + @Override + public int getNxmFieldCode() { + return NXM_FIELD_CODE; + } + + @Override + public Class getNxmField() { + return NxmNxReg0.class; + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg1Codec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg1Codec.java new file mode 100644 index 0000000000..672c21ed55 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg1Codec.java @@ -0,0 +1,29 @@ +package org.opendaylight.openflowjava.nx.codec.match; + +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg1; + +public class Reg1Codec extends AbstractRegCodec { + + private static final int NXM_FIELD_CODE = 1; + public static final MatchEntrySerializerKey SERIALIZER_KEY = new MatchEntrySerializerKey<>( + EncodeConstants.OF13_VERSION_ID, Nxm1Class.class, NxmNxReg1.class); + public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey( + EncodeConstants.OF13_VERSION_ID, OxmMatchConstants.NXM_1_CLASS, NXM_FIELD_CODE); + + @Override + public int getNxmFieldCode() { + return NXM_FIELD_CODE; + } + + @Override + public Class getNxmField() { + return NxmNxReg1.class; + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg2Codec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg2Codec.java new file mode 100644 index 0000000000..30f0cfc9b3 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg2Codec.java @@ -0,0 +1,29 @@ +package org.opendaylight.openflowjava.nx.codec.match; + +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg2; + +public class Reg2Codec extends AbstractRegCodec { + + private static final int NXM_FIELD_CODE = 2; + public static final MatchEntrySerializerKey SERIALIZER_KEY = new MatchEntrySerializerKey<>( + EncodeConstants.OF13_VERSION_ID, Nxm1Class.class, NxmNxReg2.class); + public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey( + EncodeConstants.OF13_VERSION_ID, OxmMatchConstants.NXM_1_CLASS, NXM_FIELD_CODE); + + @Override + public int getNxmFieldCode() { + return NXM_FIELD_CODE; + } + + @Override + public Class getNxmField() { + return NxmNxReg2.class; + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg3Codec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg3Codec.java new file mode 100644 index 0000000000..40697d79de --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg3Codec.java @@ -0,0 +1,29 @@ +package org.opendaylight.openflowjava.nx.codec.match; + +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg3; + +public class Reg3Codec extends AbstractRegCodec { + + private static final int NXM_FIELD_CODE = 3; + public static final MatchEntrySerializerKey SERIALIZER_KEY = new MatchEntrySerializerKey<>( + EncodeConstants.OF13_VERSION_ID, Nxm1Class.class, NxmNxReg3.class); + public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey( + EncodeConstants.OF13_VERSION_ID, OxmMatchConstants.NXM_1_CLASS, NXM_FIELD_CODE); + + @Override + public int getNxmFieldCode() { + return NXM_FIELD_CODE; + } + + @Override + public Class getNxmField() { + return NxmNxReg3.class; + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg4Codec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg4Codec.java new file mode 100644 index 0000000000..267c5312b0 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg4Codec.java @@ -0,0 +1,29 @@ +package org.opendaylight.openflowjava.nx.codec.match; + +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg4; + +public class Reg4Codec extends AbstractRegCodec { + + private static final int NXM_FIELD_CODE = 4; + public static final MatchEntrySerializerKey SERIALIZER_KEY = new MatchEntrySerializerKey<>( + EncodeConstants.OF13_VERSION_ID, Nxm1Class.class, NxmNxReg4.class); + public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey( + EncodeConstants.OF13_VERSION_ID, OxmMatchConstants.NXM_1_CLASS, NXM_FIELD_CODE); + + @Override + public int getNxmFieldCode() { + return NXM_FIELD_CODE; + } + + @Override + public Class getNxmField() { + return NxmNxReg4.class; + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg5Codec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg5Codec.java new file mode 100644 index 0000000000..27eaa6b721 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg5Codec.java @@ -0,0 +1,29 @@ +package org.opendaylight.openflowjava.nx.codec.match; + +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg5; + +public class Reg5Codec extends AbstractRegCodec { + + private static final int NXM_FIELD_CODE = 5; + public static final MatchEntrySerializerKey SERIALIZER_KEY = new MatchEntrySerializerKey<>( + EncodeConstants.OF13_VERSION_ID, Nxm1Class.class, NxmNxReg5.class); + public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey( + EncodeConstants.OF13_VERSION_ID, OxmMatchConstants.NXM_1_CLASS, NXM_FIELD_CODE); + + @Override + public int getNxmFieldCode() { + return NXM_FIELD_CODE; + } + + @Override + public Class getNxmField() { + return NxmNxReg5.class; + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg6Codec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg6Codec.java new file mode 100644 index 0000000000..9ca1b05a98 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg6Codec.java @@ -0,0 +1,29 @@ +package org.opendaylight.openflowjava.nx.codec.match; + +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg6; + +public class Reg6Codec extends AbstractRegCodec { + + private static final int NXM_FIELD_CODE = 6; + public static final MatchEntrySerializerKey SERIALIZER_KEY = new MatchEntrySerializerKey<>( + EncodeConstants.OF13_VERSION_ID, Nxm1Class.class, NxmNxReg6.class); + public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey( + EncodeConstants.OF13_VERSION_ID, OxmMatchConstants.NXM_1_CLASS, NXM_FIELD_CODE); + + @Override + public int getNxmFieldCode() { + return NXM_FIELD_CODE; + } + + @Override + public Class getNxmField() { + return NxmNxReg6.class; + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg7Codec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg7Codec.java new file mode 100644 index 0000000000..9c696edff2 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/Reg7Codec.java @@ -0,0 +1,29 @@ +package org.opendaylight.openflowjava.nx.codec.match; + +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg7; + +public class Reg7Codec extends AbstractRegCodec { + + private static final int NXM_FIELD_CODE = 7; + public static final MatchEntrySerializerKey SERIALIZER_KEY = new MatchEntrySerializerKey<>( + EncodeConstants.OF13_VERSION_ID, Nxm1Class.class, NxmNxReg7.class); + public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey( + EncodeConstants.OF13_VERSION_ID, OxmMatchConstants.NXM_1_CLASS, NXM_FIELD_CODE); + + @Override + public int getNxmFieldCode() { + return NXM_FIELD_CODE; + } + + @Override + public Class getNxmField() { + return NxmNxReg7.class; + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/TunIdCodec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/TunIdCodec.java new file mode 100644 index 0000000000..7f701dbea2 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/TunIdCodec.java @@ -0,0 +1,72 @@ +package org.opendaylight.openflowjava.nx.codec.match; + +import io.netty.buffer.ByteBuf; + +import java.math.BigInteger; + +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxTunId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.nx.match.tun.id.grouping.TunIdValuesBuilder; + +public class TunIdCodec extends AbstractMatchCodec { + + private static final int VALUE_LENGTH = 8; + private static final int NXM_FIELD_CODE = 16; + public static final MatchEntrySerializerKey SERIALIZER_KEY = new MatchEntrySerializerKey<>( + EncodeConstants.OF13_VERSION_ID, Nxm1Class.class, NxmNxTunId.class); + public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey( + EncodeConstants.OF13_VERSION_ID, OxmMatchConstants.NXM_1_CLASS, NXM_FIELD_CODE); + + @Override + public void serialize(MatchEntries input, ByteBuf outBuffer) { + serializeHeader(input, outBuffer); + BigInteger value = input.getAugmentation(OfjAugNxMatch.class).getTunIdValues().getValue(); + outBuffer.writeLong(value.longValue()); + } + + @Override + public MatchEntries deserialize(ByteBuf message) { + MatchEntriesBuilder matchEntriesBuilder = deserializeHeader(message); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder(); + augNxMatchBuilder.setTunIdValues(new TunIdValuesBuilder().setValue(BigInteger.valueOf(message.readLong())) + .build()); + matchEntriesBuilder.addAugmentation(OfjAugNxMatch.class, augNxMatchBuilder.build()); + return matchEntriesBuilder.build(); + } + + @Override + public int getNxmFieldCode() { + return NXM_FIELD_CODE; + } + + @Override + public int getOxmClassCode() { + return OxmMatchConstants.NXM_1_CLASS; + } + + @Override + public int getValueLength() { + return VALUE_LENGTH; + } + + @Override + public Class getNxmField() { + return NxmNxTunId.class; + } + + @Override + public Class getOxmClass() { + return Nxm1Class.class; + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/TunIpv4DstCodec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/TunIpv4DstCodec.java new file mode 100644 index 0000000000..9b2e092393 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/TunIpv4DstCodec.java @@ -0,0 +1,69 @@ +package org.opendaylight.openflowjava.nx.codec.match; + +import io.netty.buffer.ByteBuf; + +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxTunIpv4Dst; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.nx.match.tun.ipv4.dst.grouping.TunIpv4DstValuesBuilder; + +public class TunIpv4DstCodec extends AbstractMatchCodec { + + private static final int VALUE_LENGTH = 4; + private static final int NXM_FIELD_CODE = 32; + public static final MatchEntrySerializerKey SERIALIZER_KEY = new MatchEntrySerializerKey<>( + EncodeConstants.OF13_VERSION_ID, Nxm1Class.class, NxmNxTunIpv4Dst.class); + public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey( + EncodeConstants.OF13_VERSION_ID, OxmMatchConstants.NXM_1_CLASS, NXM_FIELD_CODE); + + @Override + public void serialize(MatchEntries input, ByteBuf outBuffer) { + serializeHeader(input, outBuffer); + Long value = input.getAugmentation(OfjAugNxMatch.class).getTunIpv4DstValues().getValue(); + outBuffer.writeInt(value.intValue()); + } + + @Override + public MatchEntries deserialize(ByteBuf message) { + MatchEntriesBuilder matchEntriesBuilder = deserializeHeader(message); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder(); + augNxMatchBuilder.setTunIpv4DstValues(new TunIpv4DstValuesBuilder().setValue(message.readUnsignedInt()).build()); + matchEntriesBuilder.addAugmentation(OfjAugNxMatch.class, augNxMatchBuilder.build()); + return matchEntriesBuilder.build(); + } + + @Override + public int getNxmFieldCode() { + return NXM_FIELD_CODE; + } + + @Override + public int getOxmClassCode() { + return OxmMatchConstants.NXM_1_CLASS; + } + + @Override + public int getValueLength() { + return VALUE_LENGTH; + } + + @Override + public Class getNxmField() { + return NxmNxTunIpv4Dst.class; + } + + @Override + public Class getOxmClass() { + return Nxm1Class.class; + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/TunIpv4SrcCodec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/TunIpv4SrcCodec.java new file mode 100644 index 0000000000..b6b2102f27 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/TunIpv4SrcCodec.java @@ -0,0 +1,69 @@ +package org.opendaylight.openflowjava.nx.codec.match; + +import io.netty.buffer.ByteBuf; + +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxTunIpv4Src; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.nx.match.tun.ipv4.src.grouping.TunIpv4SrcValuesBuilder; + +public class TunIpv4SrcCodec extends AbstractMatchCodec { + + private static final int VALUE_LENGTH = 4; + private static final int NXM_FIELD_CODE = 31; + public static final MatchEntrySerializerKey SERIALIZER_KEY = new MatchEntrySerializerKey<>( + EncodeConstants.OF13_VERSION_ID, Nxm1Class.class, NxmNxTunIpv4Src.class); + public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey( + EncodeConstants.OF13_VERSION_ID, OxmMatchConstants.NXM_1_CLASS, NXM_FIELD_CODE); + + @Override + public void serialize(MatchEntries input, ByteBuf outBuffer) { + serializeHeader(input, outBuffer); + Long value = input.getAugmentation(OfjAugNxMatch.class).getTunIpv4SrcValues().getValue(); + outBuffer.writeInt(value.intValue()); + } + + @Override + public MatchEntries deserialize(ByteBuf message) { + MatchEntriesBuilder matchEntriesBuilder = deserializeHeader(message); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder(); + augNxMatchBuilder.setTunIpv4SrcValues(new TunIpv4SrcValuesBuilder().setValue(message.readUnsignedInt()).build()); + matchEntriesBuilder.addAugmentation(OfjAugNxMatch.class, augNxMatchBuilder.build()); + return matchEntriesBuilder.build(); + } + + @Override + public int getNxmFieldCode() { + return NXM_FIELD_CODE; + } + + @Override + public int getOxmClassCode() { + return OxmMatchConstants.NXM_1_CLASS; + } + + @Override + public int getValueLength() { + return VALUE_LENGTH; + } + + @Override + public Class getNxmField() { + return NxmNxTunIpv4Src.class; + } + + @Override + public Class getOxmClass() { + return Nxm1Class.class; + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/ofjava/nx/config/rev140711/NiciraExtensionProviderModule.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/ofjava/nx/config/rev140711/NiciraExtensionProviderModule.java new file mode 100644 index 0000000000..6f8cc92031 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/ofjava/nx/config/rev140711/NiciraExtensionProviderModule.java @@ -0,0 +1,26 @@ +package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.ofjava.nx.config.rev140711; + +import org.opendaylight.openflowjava.nx.NiciraExtensionsRegistrator; + +public class NiciraExtensionProviderModule extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.ofjava.nx.config.rev140711.AbstractNiciraExtensionProviderModule { + public NiciraExtensionProviderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } + + public NiciraExtensionProviderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.ofjava.nx.config.rev140711.NiciraExtensionProviderModule oldModule, java.lang.AutoCloseable oldInstance) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } + + @Override + public void customValidation() { + // add custom validation form module attributes here. + } + + @Override + public java.lang.AutoCloseable createInstance() { + NiciraExtensionsRegistrator registrator = new NiciraExtensionsRegistrator(getNiciraExtensionCodecRegistratorDependency()); + registrator.registerNiciraExtensions(); + return registrator; + } + +} diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/ofjava/nx/config/rev140711/NiciraExtensionProviderModuleFactory.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/ofjava/nx/config/rev140711/NiciraExtensionProviderModuleFactory.java new file mode 100644 index 0000000000..b7298746a5 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/ofjava/nx/config/rev140711/NiciraExtensionProviderModuleFactory.java @@ -0,0 +1,13 @@ +/* +* Generated file +* +* Generated from: yang module name: openflowjava-nx-config yang module local name: openflowjava-extension-nicira +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Fri Aug 01 15:15:42 CEST 2014 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.ofjava.nx.config.rev140711; +public class NiciraExtensionProviderModuleFactory extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.ofjava.nx.config.rev140711.AbstractNiciraExtensionProviderModuleFactory { + +} diff --git a/extension/openflowjava-extension-nicira/src/main/resources/initial/44-openflowjava-nx-config.xml b/extension/openflowjava-extension-nicira/src/main/resources/initial/44-openflowjava-nx-config.xml new file mode 100644 index 0000000000..756bd15f28 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/resources/initial/44-openflowjava-nx-config.xml @@ -0,0 +1,24 @@ + + + + + urn:opendaylight:params:xml:ns:yang:openflowplugin:ofjava:nx:config?module=openflowjava-nx-config&revision=2014-07-11 + + + + + + + + prefix:openflowjava-extension-nicira + openflow-nx-bundle + + prefix:nicira-extension-codec-registrator + openflowjava-nicira-ext-registrator + + + + + + + diff --git a/extension/openflowjava-extension-nicira/src/main/yang/nicira-action.yang b/extension/openflowjava-extension-nicira/src/main/yang/nicira-action.yang new file mode 100644 index 0000000000..8483c4b67c --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/yang/nicira-action.yang @@ -0,0 +1,64 @@ +module nicira-action { + yang-version 1; + + namespace "urn:opendaylight:openflowjava:nx:action"; + prefix "nicira-action"; + + import openflow-action {prefix ofaction;} + import openflow-types {prefix oft;} + import yang-ext {prefix ext; revision-date "2013-07-09";} + + description + "Nicira openflow extensions of action."; + + revision "2014-04-21" { + description "Initial revision"; + } + + identity nxm-nx-reg-load { + base ofaction:experimenter-action-sub-type; + } + identity nxm-nx-reg-move { + base ofaction:experimenter-action-sub-type; + } + + grouping ofj-nx-action-reg-load-grouping { + container action-reg-load { + leaf ofs_nbits { + type uint16; + } + leaf dst { + type uint32; + } + leaf value { + type uint64; + } + } + } + grouping ofj-nx-action-reg-move-grouping { + container action-reg-move { + leaf n_bits { + type uint16; + } + leaf src_ofs { + type uint16; + } + leaf dst_ofs { + type uint16; + } + leaf src { + type uint32; + } + leaf dst { + type uint32; + } + } + } + + augment "/ofaction:actions-container/ofaction:action" { + ext:augment-identifier "ofj-aug-nx-action"; + uses ofj-nx-action-reg-load-grouping; + uses ofj-nx-action-reg-move-grouping; + } + +} \ No newline at end of file diff --git a/extension/openflowjava-extension-nicira/src/main/yang/nicira-match.yang b/extension/openflowjava-extension-nicira/src/main/yang/nicira-match.yang new file mode 100644 index 0000000000..05814d2cc0 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/yang/nicira-match.yang @@ -0,0 +1,182 @@ +module nicira-match { + yang-version 1; + + namespace "urn:opendaylight:openflowjava:nx:match"; + prefix "nicira-match"; + + import openflow-extensible-match {prefix ofoxm;} + import openflow-types {prefix oft;} + import ietf-yang-types {prefix yang; revision-date "2010-09-24";} + import yang-ext {prefix ext; revision-date "2013-07-09";} + + description + "Nicira openflow extensions of match."; + + revision "2014-04-21" { + description "Initial revision"; + } + + identity nxm-nx-reg { + base ofoxm:match-field; + } + + identity nxm-nx-reg0 { + base nxm-nx-reg; + } + identity nxm-nx-reg1 { + base nxm-nx-reg; + } + identity nxm-nx-reg2 { + base nxm-nx-reg; + } + identity nxm-nx-reg3 { + base nxm-nx-reg; + } + identity nxm-nx-reg4 { + base nxm-nx-reg; + } + identity nxm-nx-reg5 { + base nxm-nx-reg; + } + identity nxm-nx-reg6 { + base nxm-nx-reg; + } + identity nxm-nx-reg7 { + base nxm-nx-reg; + } + identity nxm-nx-tun-id { + base ofoxm:match-field; + } + identity nxm-nx-arp-sha { + base ofoxm:match-field; + } + identity nxm-nx-arp-tha { + base ofoxm:match-field; + } + identity nxm-of-arp-op { + base ofoxm:match-field; + } + identity nxm-of-arp-spa { + base ofoxm:match-field; + } + identity nxm-of-arp-tpa { + base ofoxm:match-field; + } + identity nxm-nx-tun-ipv4-dst { + base ofoxm:match-field; + } + identity nxm-nx-tun-ipv4-src { + base ofoxm:match-field; + } + identity nxm-of-eth-src { + base ofoxm:match-field; + } + identity nxm-of-eth-dst { + base ofoxm:match-field; + } + identity nxm-of-eth-type { + base ofoxm:match-field; + } + + grouping ofj-nxm-nx-match-reg-grouping { + container reg-values { + leaf value { + type uint32; + } + } + } + grouping ofj-nxm-nx-match-tun-id-grouping { + container tun-id-values { + leaf value { + type uint64; + } + } + } + grouping ofj-nxm-nx-match-arp-sha-grouping { + container arp-sha-values { + leaf mac-address { + type yang:mac-address; + } + } + } + grouping ofj-nxm-nx-match-arp-tha-grouping { + container arp-tha-values { + leaf mac-address { + type yang:mac-address; + } + } + } + grouping ofj-nxm-of-match-arp-op-grouping { + container arp-op-values { + leaf value { + type uint16; + } + } + } + grouping ofj-nxm-of-match-arp-spa-grouping { + container arp-spa-values { + leaf value { + type uint32; + } + } + } + grouping ofj-nxm-of-match-arp-tpa-grouping { + container arp-tpa-values { + leaf value { + type uint32; + } + } + } + grouping ofj-nxm-nx-match-tun-ipv4-dst-grouping { + container tun-ipv4-dst-values { + leaf value { + type uint32; + } + } + } + grouping ofj-nxm-nx-match-tun-ipv4-src-grouping { + container tun-ipv4-src-values { + leaf value { + type uint32; + } + } + } + grouping ofj-nxm-of-match-eth-src-grouping { + container eth-src-values { + leaf mac-address { + type yang:mac-address; + } + } + } + grouping ofj-nxm-of-match-eth-dst-grouping { + container eth-dst-values { + leaf mac-address { + type yang:mac-address; + } + } + } + grouping ofj-nxm-of-match-eth-type-grouping { + container eth-type-values { + leaf value { + type uint16; + } + } + } + + augment "/ofoxm:oxm-container/ofoxm:match-entries" { + ext:augment-identifier "ofj-aug_nx_match"; + uses ofj-nxm-nx-match-reg-grouping; + uses ofj-nxm-nx-match-tun-id-grouping; + uses ofj-nxm-nx-match-arp-sha-grouping; + uses ofj-nxm-nx-match-arp-tha-grouping; + uses ofj-nxm-of-match-arp-op-grouping; + uses ofj-nxm-of-match-arp-spa-grouping; + uses ofj-nxm-of-match-arp-tpa-grouping; + uses ofj-nxm-nx-match-tun-ipv4-dst-grouping; + uses ofj-nxm-nx-match-tun-ipv4-src-grouping; + uses ofj-nxm-of-match-eth-src-grouping; + uses ofj-nxm-of-match-eth-dst-grouping; + uses ofj-nxm-of-match-eth-type-grouping; + } + +} \ No newline at end of file diff --git a/extension/openflowjava-extension-nicira/src/main/yang/openflowjava-nx-config.yang b/extension/openflowjava-extension-nicira/src/main/yang/openflowjava-nx-config.yang new file mode 100644 index 0000000000..8918c91849 --- /dev/null +++ b/extension/openflowjava-extension-nicira/src/main/yang/openflowjava-nx-config.yang @@ -0,0 +1,36 @@ +module openflowjava-nx-config { + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:openflowplugin:ofjava:nx:config"; + prefix "openflowjava-nx"; + + import config {prefix config; revision-date 2013-04-05;} + import openflowjava-nx-api-config {prefix openflowjava-nx-api-config;revision-date 2014-07-11;} + + description + "Nicira extensions in openflow library."; + + revision "2014-07-11" { + description + "Initial revision"; + } + + identity openflowjava-extension-nicira { + base config:module-type; + config:java-name-prefix NiciraExtensionProvider; + } + + augment "/config:modules/config:module/config:configuration" { + case openflowjava-extension-nicira { + when "/config:modules/config:module/config:type = 'openflowjava-extension-nicira'"; + + container nicira-extension-codec-registrator { + uses config:service-ref { + refine type { + mandatory true; + config:required-identity openflowjava-nx-api-config:nicira-extension-codec-registrator; + } + } + } + } + } +} \ No newline at end of file diff --git a/extension/openflowplugin-extension-api/pom.xml b/extension/openflowplugin-extension-api/pom.xml new file mode 100644 index 0000000000..f04ee1703c --- /dev/null +++ b/extension/openflowplugin-extension-api/pom.xml @@ -0,0 +1,114 @@ + + + + 4.0.0 + + org.opendaylight.openflowplugin + openflowplugin-extension-parent + 0.0.3-SNAPSHOT + ../ + + + openflowplugin-extension-api + bundle + + + + org.apache.felix + maven-bundle-plugin + + + + org.opendaylight.yangtools + yang-maven-plugin + + + + generate-sources + + + + + + org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl + + ${project.build.directory}/generated-sources/sal + + + org.opendaylight.yangtools.yang.unified.doc.generator.maven.DocumentationGeneratorImpl + ${project.build.directory}/site/models + + + true + + + + + + org.opendaylight.controller + yang-jmx-generator-plugin + ${config.parent.version} + + + org.opendaylight.yangtools + maven-sal-api-gen-plugin + ${yangtools.version} + jar + + + + + + + + + org.opendaylight.yangtools + yang-model-api + ${yangtools.version} + + + org.opendaylight.openflowplugin + openflowplugin-api + ${project.version} + + + org.opendaylight.openflowjava + openflow-protocol-api + ${openflowjava.version} + + + + + org.opendaylight.openflowjava + openflow-protocol-api + + + + + org.opendaylight.controller.model + model-flow-base + + + org.opendaylight.controller.model + model-flow-service + + + org.opendaylight.controller.model + model-flow-statistics + + + org.opendaylight.controller.model + model-inventory + + + + + junit + junit + test + + + + + \ No newline at end of file diff --git a/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/AugmentTuple.java b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/AugmentTuple.java new file mode 100644 index 0000000000..b75e6e7fa3 --- /dev/null +++ b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/AugmentTuple.java @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.api; + +import org.opendaylight.yangtools.yang.binding.Augmentable; +import org.opendaylight.yangtools.yang.binding.Augmentation; + +/** + * Wrapper over augmentation and it's type in order to ease handing over and hooking of an augmentation + * @param augmentable type where wrapped augmentation belongs + */ +public class AugmentTuple> { + + private final Augmentation augmentationObject; + private final Class> augmentationClass; + + /** + * @param augmentationClass + * @param augmentationObject + */ + public AugmentTuple(Class> augmentationClass, Augmentation augmentationObject) { + this.augmentationClass = augmentationClass; + this.augmentationObject = augmentationObject; + } + + /** + * @return instance of wrapped augmentation + */ + public Augmentation getAugmentationObject() { + return augmentationObject; + } + + /** + * @return type of wrapped augmentation + */ + public Class> getAugmentationClass() { + return augmentationClass; + } +} diff --git a/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConverterExtensionKey.java b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConverterExtensionKey.java new file mode 100644 index 0000000000..0f70cefd38 --- /dev/null +++ b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConverterExtensionKey.java @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.api; + +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; + +/** + * lookup and register key for extension converters, basic case expects this to + * correlate with input model type + * + * @param type of key + */ +public class ConverterExtensionKey extends TypeVersionKey { + + private Class type; + private short ofVersion; + + /** + * @param type + */ + public ConverterExtensionKey(Class type, short ofVersion) { + super(type, ofVersion); + } +} diff --git a/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorActionFromOFJava.java b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorActionFromOFJava.java new file mode 100644 index 0000000000..51e39a33aa --- /dev/null +++ b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorActionFromOFJava.java @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.api; + +import org.opendaylight.openflowplugin.extension.api.path.AugmentationPath; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action; +import org.opendaylight.yangtools.yang.binding.DataContainer; + +/** + * convert message from OFJava-API model into MD-SAL model + * + * @param input message model - OFJava-API + * @param represents possible paths in yang schema for augmentations + */ +public interface ConvertorActionFromOFJava { + + /** + * @param input + * @param path in yang schema where a converted value has to be augmented + * @return message converted to MD-SAL and its type + */ + Action convert(FROM input, PATH path); +} diff --git a/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorActionToOFJava.java b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorActionToOFJava.java new file mode 100644 index 0000000000..4e7fec749f --- /dev/null +++ b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorActionToOFJava.java @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.api; + +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action; +import org.opendaylight.yangtools.yang.binding.DataContainer; + +/** + * convert message from MD-SAL model into OFJava-API model + * @param input message model - MD-SAL model + * @param output message model - OFJava-API + */ +public interface ConvertorActionToOFJava { + + /** + * @param actionCase where is vendor's augmentation + * @return message converted to OFJava-API + */ + TO convert(FROM actionCase); +} diff --git a/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorFromOFJava.java b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorFromOFJava.java new file mode 100644 index 0000000000..2faaf5984b --- /dev/null +++ b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorFromOFJava.java @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.api; + +import org.opendaylight.openflowplugin.extension.api.path.AugmentationPath; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; +import org.opendaylight.yangtools.yang.binding.Augmentation; +import org.opendaylight.yangtools.yang.binding.DataContainer; + +/** + * convert message from OFJava-API model into MD-SAL model + * + * @param input message model - OFJava-API + * @param represents possible paths in yang schema for augmentations + */ +public interface ConvertorFromOFJava { + + /** + * @param input + * @param path in yang schema where a converted value has to be augmented + * @return message converted to MD-SAL and its type + */ + ExtensionAugment> convert(FROM input, PATH path); +} diff --git a/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorToOFJava.java b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorToOFJava.java new file mode 100644 index 0000000000..f3336cd922 --- /dev/null +++ b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ConvertorToOFJava.java @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.api; + +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; +import org.opendaylight.yangtools.yang.binding.DataContainer; + +/** + * convert message from MD-SAL model into OFJava-API model + * + * @param output message model - OFJava-API + */ +public interface ConvertorToOFJava { + + /** + * @param extension where is vendor's augmentation + * @return message converted to OFJava-API + */ + TO convert(Extension extension); +} diff --git a/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ExtensionAugment.java b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ExtensionAugment.java new file mode 100644 index 0000000000..e41146f843 --- /dev/null +++ b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ExtensionAugment.java @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.api; + +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; +import org.opendaylight.yangtools.yang.binding.Augmentation; + +/** + * @author msunal + * @param type of wrapped augmentation + * + */ +public class ExtensionAugment> extends AugmentTuple { + + private final Class key; + + /** + * @param augmentationClass + * @param augmentationObject + */ + public ExtensionAugment(Class augmentationClass, T augmentationObject, Class key) { + super(augmentationClass, augmentationObject); + this.key = key; + } + + /** + * @return key which represents an extension type + */ + public Class getKey() { + return key; + } + +} diff --git a/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ExtensionConverterRegistrator.java b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ExtensionConverterRegistrator.java new file mode 100644 index 0000000000..d7268c7592 --- /dev/null +++ b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/ExtensionConverterRegistrator.java @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.api; + +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionSerializerKey; +import org.opendaylight.openflowplugin.extension.api.path.ActionPath; +import org.opendaylight.openflowplugin.extension.api.path.MatchPath; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; +import org.opendaylight.yangtools.concepts.ObjectRegistration; + +/** + * registration place for message converters provided by vendor extensions + */ +public interface ExtensionConverterRegistrator { + + ObjectRegistration> registerMatchConvertor( + ConverterExtensionKey key, ConvertorToOFJava convertor); + + ObjectRegistration> registerMatchConvertor( + MatchEntrySerializerKey key, + ConvertorFromOFJava convertor); + + /** + * @param key action case type + ofp-version + * @param convertor + * @return closable registration + */ + ObjectRegistration> + registerActionConvertor( + TypeVersionKey key, + ConvertorActionToOFJava convertor); + + /** + * @param key actionSubType, action type (Experimenter), experimenterId, version + * @param convertor + * @return closable registration + */ + ObjectRegistration> registerActionConvertor( + ExperimenterActionSerializerKey key, ConvertorActionFromOFJava convertor); +} diff --git a/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/GroupingLooseResolver.java b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/GroupingLooseResolver.java new file mode 100644 index 0000000000..d7ba47c342 --- /dev/null +++ b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/GroupingLooseResolver.java @@ -0,0 +1,73 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.api; + +import java.util.HashSet; +import java.util.Set; + +import org.opendaylight.yangtools.yang.binding.Augmentable; +import org.opendaylight.yangtools.yang.binding.Augmentation; +import org.opendaylight.yangtools.yang.binding.DataObject; + +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; + +/** + * Provides augmentation resolving upon given {@link Augmentable}. + * Used {@link Augmentation}s do not share {@link Augmentable}. + *
+ * Usage: in case there are multiple {@link Augmentable} classes which might contain + * corresponding {@link Augmentation}s (1:1..n binding). And those {@link Augmentation}s + * are sharing the same grouping so that they could be processed in the same way. + * + * @param + */ +public class GroupingLooseResolver { + + Class commonInterface; + Set>> classes; + + /** + * @param commonInterface + * @param common grouping Interface + */ + public GroupingLooseResolver(Class commonInterface) { + this.commonInterface = commonInterface; + classes = new HashSet<>(); + } + + /** + * @param cls equivalent augmentation class + * @return this for chaining + */ + public GroupingLooseResolver add(Class> cls) { + Preconditions.checkArgument(commonInterface.isAssignableFrom(cls), + "oh man! I got " + cls); + classes.add(cls); + return this; + } + + /** + * @param data expected to match <T extends Augmentable<T>> + * @return shared grouping + */ + @SuppressWarnings("unchecked") + public > Optional getExtension(DataObject data) { + T guessData = (T) data; + + for (Class> cls : classes) { + Augmentation potential = guessData + .getAugmentation((Class>) cls); + if (potential != null) { + return Optional.of((GROUPING) potential); + } + } + + return Optional.absent(); + } +} diff --git a/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/GroupingResolver.java b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/GroupingResolver.java new file mode 100644 index 0000000000..9b6ea0fea0 --- /dev/null +++ b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/GroupingResolver.java @@ -0,0 +1,77 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.api; + +import java.util.HashSet; +import java.util.Set; + +import org.opendaylight.yangtools.yang.binding.Augmentable; +import org.opendaylight.yangtools.yang.binding.Augmentation; + +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; + +/** + * Provides augmentation resolving upon given {@link Augmentable}. + * Used {@link #classes} share the same {@link Augmentable}. + *
+ * Usage: in case there is {@link Augmentable} which might contain + * multiple {@link Augmentation}s depending on origin. And those {@link Augmentation}s + * are sharing the same grouping so that they could be processed in the same way. + * + * @param + * @param + */ +public class GroupingResolver> { + + Class commonInterface; + Set>> classes; + + /** + * @param commonInterface + */ + public GroupingResolver(Class commonInterface) { + this.commonInterface = commonInterface; + classes = new HashSet<>(); + } + + /** + * @param cls equivalent augmentation class + * @return this for chaining + */ + public > GroupingResolver add(Class cls) { + Preconditions.checkArgument(commonInterface.isAssignableFrom(cls)); + classes.add(cls); + return this; + } + + /** + * @param clses set of equivalent augmentation classes + */ + public void setAugmentations(Set>> clses) { + for (Class> cls : clses) { + Preconditions.checkArgument(commonInterface.isAssignableFrom(cls)); + } + classes = clses; + } + + /** + * @param data + * @return shared grouping + */ + @SuppressWarnings("unchecked") + public Optional getExtension(T data) { + for (Class> cls : classes) { + Augmentation potential = data.getAugmentation(cls); + if (potential != null) { + return Optional.of((GROUPING) potential); + } + } + return Optional.absent(); + } +} \ No newline at end of file diff --git a/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/TypeVersionKey.java b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/TypeVersionKey.java new file mode 100644 index 0000000000..98f31fc6cb --- /dev/null +++ b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/TypeVersionKey.java @@ -0,0 +1,66 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.api; + + +/** + * lookup and register key for extension converters, basic case expects this to + * correlate with input model type + * + * @param type of key + */ +public class TypeVersionKey { + + private Class type; + private short ofVersion; + + /** + * @param type + * @param ofVersion + */ + public TypeVersionKey(Class type, short ofVersion) { + this.type = type; + this.ofVersion = ofVersion; + } + + /** + * @return key type + */ + public Class getType() { + return type; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ofVersion; + result = prime * result + ((type == null) ? 0 : type.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + TypeVersionKey other = (TypeVersionKey) obj; + if (ofVersion != other.ofVersion) + return false; + if (type == null) { + if (other.type != null) + return false; + } else if (!type.equals(other.type)) + return false; + return true; + } + +} diff --git a/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/path/ActionPath.java b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/path/ActionPath.java new file mode 100644 index 0000000000..16e12ff894 --- /dev/null +++ b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/path/ActionPath.java @@ -0,0 +1,112 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.api.path; + +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +/** + * @author msunal + * + */ +public enum ActionPath implements AugmentationPath { + + /** + * openflowplugin-extension-general.yang + *
+     * module: opendaylight-inventory
+     *    +--rw nodes
+     *       +--rw node* [id]
+     *          +--rw flownode:table* [id]
+     *          |  +--rw flownode:flow* [id]
+     *          |  |  +--rw flownode:instructions
+     *          |  |  |  +--rw flownode:instruction* [order]
+     *          |  |  |     +--rw (instruction)?
+     *          |  |  |        +--:(write-actions-case)
+     *          |  |  |        |  +--rw flownode:write-actions
+     *          |  |  |        |     +--rw flownode:action* [order]
+     *          |  |  |        |        +--rw (action)?
+     * 
+     */ + NODES_NODE_TABLE_FLOW_INSTRUCTIONS_INSTRUCTION_WRITEACTIONSCASE_WRITEACTIONS_ACTION_ACTION_EXTENSIONLIST_EXTENSION(null), + /** + * module: opendaylight-inventory + * +--rw nodes + * +--rw node* [id] + * +--rw flownode:table* [id] + * | +--rw flownode:flow* [id] + * | | +--rw flownode:instructions + * | | | +--rw flownode:instruction* [order] + * | | | +--rw (instruction)? + * | | | +--:(apply-actions-case) + * | | | | +--rw flownode:apply-actions + * | | | | +--rw flownode:action* [order] + * | | | | +--rw (action)? + * + * +     */ + NODES_NODE_TABLE_FLOW_INSTRUCTIONS_INSTRUCTION_APPLYACTIONSCASE_APPLYACTIONS_ACTION_ACTION_EXTENSIONLIST_EXTENSION(null), + /** + * openflowplugin-extension-general.yang + *
+     * module: opendaylight-flow-statistics
+     * notifications:
+     *    +---n flows-statistics-update             
+     *    |  +--ro flow-and-statistics-map-list* [flow-id]
+     *    |  |  +--ro instructions
+     *    |  |  |  +--ro instruction* [order]
+     *    |  |  |     +--ro (instruction)?
+     *    |  |  |        +--:(write-actions-case)
+     *    |  |  |        |  +--ro write-actions
+     *    |  |  |        |     +--ro action* [order]
+     *    |  |  |        |        +--ro (action)?
+     * 
+ */ + FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_INSTRUCTIONS_INSTRUCTION_INSTRUCTION_WRITEACTIONSCASE_WRITEACTIONS_ACTION_ACTION(null), + /** + * module: opendaylight-flow-statistics + * notifications: + * +---n flows-statistics-update + * | +--ro flow-and-statistics-map-list* [flow-id] + * | | +--ro instructions + * | | | +--ro instruction* [order] + * | | | +--ro (instruction)? + * | | | +--:(apply-actions-case) + * | | | | +--ro apply-actions + * | | | | +--ro action* [order] + * | | | | +--ro (action)? + * + */ + FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_INSTRUCTIONS_INSTRUCTION_INSTRUCTION_APPLYACTIONSCASE_APPLYACTIONS_ACTION_ACTION(null), + /** + * openflowplugin-extension-general.yang + *
+     * module: opendaylight-group-statistics
+     * notifications:
+     *    +---n group-desc-stats-updated    
+     *    |  +--ro group-desc-stats* [group-id]
+     *    |  |  +--ro buckets
+     *    |  |     +--ro bucket* [bucket-id]
+     *    |  |        +--ro action* [order]
+     *    |  |           +--ro (action)?
+     * 
+ */ + GROUPDESCSTATSUPDATED_GROUPDESCSTATS_BUCKETS_BUCKET_ACTION(null); + + private final InstanceIdentifier iid; + + private ActionPath(InstanceIdentifier iid) { + this.iid = iid; + } + + @Override + public final InstanceIdentifier getInstanceIdentifier() { + return iid; + } + +} diff --git a/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/path/AugmentationPath.java b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/path/AugmentationPath.java new file mode 100644 index 0000000000..1eb60e19ec --- /dev/null +++ b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/path/AugmentationPath.java @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.api.path; + +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +/** + * @author msunal + * + */ +public interface AugmentationPath { + + InstanceIdentifier getInstanceIdentifier(); + +} diff --git a/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/path/MatchPath.java b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/path/MatchPath.java new file mode 100644 index 0000000000..5869834771 --- /dev/null +++ b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/path/MatchPath.java @@ -0,0 +1,62 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.api.path; + +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +/** + * @author msunal + * + */ +public enum MatchPath implements AugmentationPath { + + /** + * openflowplugin-extension-general.yang + *
+     * module: sal-flow
+     * notifications:
+     *    +---n switch-flow-removed                     
+     *    |  +--ro match
+     * 
+ */ + SWITCHFLOWREMOVED_MATCH(null), + /** + * openflowplugin-extension-general.yang + *
+     * module: packet-processing
+     * notifications:
+     *    +---n packet-received    
+     *       +--ro match
+     * 
+ */ + PACKETRECEIVED_MATCH(null), + /** + * openflowplugin-extension-general.yang + *
+     * module: opendaylight-flow-statistics
+     * notifications:
+     *    +---n flows-statistics-update             
+     *    |  +--ro flow-and-statistics-map-list* [flow-id]
+     *    |  |  +--ro match
+     * 
+ */ + FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_MATCH(null); + + private final InstanceIdentifier iid; + + private MatchPath(InstanceIdentifier iid) { + this.iid = iid; + } + + @Override + public final InstanceIdentifier getInstanceIdentifier() { + return iid; + } + +} diff --git a/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/path/Util.java b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/path/Util.java new file mode 100644 index 0000000000..deb66d6c52 --- /dev/null +++ b/extension/openflowplugin-extension-api/src/main/java/org/opendaylight/openflowplugin/extension/api/path/Util.java @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.api.path; + +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder; + +/** + * @author msunal + * + */ +final class Util { + + @SuppressWarnings({ "rawtypes", "unchecked" }) + static InstanceIdentifierBuilder createIIdBuilderFor(Class input) { + return InstanceIdentifier.builder((Class) input); + } + +} diff --git a/extension/openflowplugin-extension-api/src/main/yang/openflowplugin-extension-general.yang b/extension/openflowplugin-extension-api/src/main/yang/openflowplugin-extension-general.yang new file mode 100644 index 0000000000..1620f74537 --- /dev/null +++ b/extension/openflowplugin-extension-api/src/main/yang/openflowplugin-extension-general.yang @@ -0,0 +1,107 @@ +module openflowplugin-extension-general { + yang-version 1; + + namespace "urn:opendaylight:openflowplugin:extension:general"; + prefix "openflowplugin-extension-general"; + + import yang-ext {prefix ext; revision-date "2013-07-09";} + import flow-node-inventory {prefix fni; revision-date 2013-08-19; } + import opendaylight-inventory {prefix inv;revision-date "2013-08-19";} + import sal-flow {prefix sal-flow;revision-date "2013-08-19";} + import sal-group {prefix sal-group;revision-date "2013-09-18";} + import packet-processing {prefix sal-packet;revision-date "2013-07-09";} + import opendaylight-flow-statistics {prefix odl-flow-stats;revision-date "2013-08-19";} + import opendaylight-group-statistics {prefix odl-group-stats;revision-date "2013-11-11";} + + + description + "Everything for a vendor who want to implement openflow extensions."; + + revision "2014-07-14" { + description "Initial revision"; + } + + identity extension-key { + description "Base identity for all extension keys."; + } + + grouping general-extension-grouping { + leaf extension-key { + type identityref { + base extension-key; + } + } + container extension { + description "A vendor has to augment this container."; + } + } + + grouping general-extension-list-grouping { + list extension-list { + key extension-key; + uses general-extension-grouping; + } + } + + + + + // MATCH augmentations + // RPCS + augment "/sal-flow:add-flow/sal-flow:input/sal-flow:match" { + ext:augment-identifier "general-aug-match-rpc-add-flow"; + uses general-extension-list-grouping; + } + augment "/sal-flow:remove-flow/sal-flow:input/sal-flow:match" { + ext:augment-identifier "general-aug-match-rpc-remove-flow"; + uses general-extension-list-grouping; + } + augment "/sal-flow:update-flow/sal-flow:input/sal-flow:original-flow/sal-flow:match" { + ext:augment-identifier "general-aug-match-rpc-update-flow-original"; + uses general-extension-list-grouping; + } + augment "/sal-flow:update-flow/sal-flow:input/sal-flow:updated-flow/sal-flow:match" { + ext:augment-identifier "general-aug-match-rpc-update-flow-updated"; + uses general-extension-list-grouping; + } + + // DATA + augment "/inv:nodes/inv:node/fni:table/fni:flow/fni:match" { + ext:augment-identifier "general-aug-match-nodes-node-table-flow"; + uses general-extension-list-grouping; + } + + // NOTIFICATIONS + augment "/sal-flow:switch-flow-removed/sal-flow:match" { + ext:augment-identifier "general-aug-match-notif-switch-flow-removed"; + uses general-extension-list-grouping; + } + augment "/sal-packet:packet-received/sal-packet:match" { + ext:augment-identifier "general-aug-match-notif-packet-in"; + uses general-extension-list-grouping; + } + augment "/odl-flow-stats:flows-statistics-update/odl-flow-stats:flow-and-statistics-map-list/odl-flow-stats:match" { + ext:augment-identifier "general-aug-match-notif-update-flow-stats"; + uses general-extension-list-grouping; + } + + + + + + // VENDOR EXAMPLE -- testing purposes -> remove later! + augment "/inv:nodes/inv:node/fni:table/fni:flow/fni:match/extension-list/extension" { + ext:augment-identifier "vendor-xxx1"; + uses vendor-xxx-grouping; + } + augment "/sal-flow:add-flow/sal-flow:input/sal-flow:match/extension-list/extension" { + ext:augment-identifier "vendor-xxx2"; + uses vendor-xxx-grouping; + } + grouping vendor-xxx-grouping { + leaf dos-ekis { + type string; + } + } + // -----^^^^----- +} \ No newline at end of file diff --git a/extension/openflowplugin-extension-api/src/test/java/org/opendaylight/openflowplugin/extension/api/ConverterExtensionActionKeyTest.java b/extension/openflowplugin-extension-api/src/test/java/org/opendaylight/openflowplugin/extension/api/ConverterExtensionActionKeyTest.java new file mode 100644 index 0000000000..4e23332342 --- /dev/null +++ b/extension/openflowplugin-extension-api/src/test/java/org/opendaylight/openflowplugin/extension/api/ConverterExtensionActionKeyTest.java @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.api; + +import org.junit.Assert; +import org.junit.Test; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match; + +/** + * + */ +public class ConverterExtensionActionKeyTest { + + /** + * Test method for {@link org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey#equals(java.lang.Object)}. + */ + /** + * Test method for {@link org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey#equals(java.lang.Object)}. + */ +// @Test +// public void testEqualsObject() { +// ConverterExtensionMatchKey key1 = new ConverterExtensionMatchKey(Match.class); +// ConverterExtensionMatchKey key2 = new ConverterExtensionMatchKey(Match.class); +// ConverterExtensionMatchKey key3 = new ConverterExtensionMatchKey(SpecialMatch.class); +// ConverterExtensionMatchKey key4 = new ConverterExtensionMatchKey(SpecialMatch.class); +// +// Assert.assertEquals(key1, key2); +// Assert.assertEquals(key3, key4); +// Assert.assertNotEquals(key1, key4); +// } +// +// private static interface SpecialMatch extends Match { +// // nobody +// } + +} diff --git a/extension/openflowplugin-extension-api/src/test/java/org/opendaylight/openflowplugin/extension/api/ConverterExtensionMatchKeyTest.java b/extension/openflowplugin-extension-api/src/test/java/org/opendaylight/openflowplugin/extension/api/ConverterExtensionMatchKeyTest.java new file mode 100644 index 0000000000..dc43966123 --- /dev/null +++ b/extension/openflowplugin-extension-api/src/test/java/org/opendaylight/openflowplugin/extension/api/ConverterExtensionMatchKeyTest.java @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.api; + +import org.junit.Assert; +import org.junit.Test; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCase; + +/** + * + */ +public class ConverterExtensionMatchKeyTest { + + /** + * Test method for {@link org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey#equals(java.lang.Object)}. + */ +// @Test +// public void testEqualsObject() { +// ConverterExtensionActionKey key1 = new ConverterExtensionActionKey(OutputActionCase.class); +// ConverterExtensionActionKey key2 = new ConverterExtensionActionKey(OutputActionCase.class); +// ConverterExtensionActionKey key3 = new ConverterExtensionActionKey(SpecialAction.class); +// ConverterExtensionActionKey key4 = new ConverterExtensionActionKey(SpecialAction.class); +// +// Assert.assertEquals(key1, key2); +// Assert.assertEquals(key3, key4); +// Assert.assertNotEquals(key1, key4); +// } +// +// private static interface SpecialAction extends Action { +// // nobody +// } + +} diff --git a/extension/openflowplugin-extension-api/src/test/java/org/opendaylight/openflowplugin/extension/api/GroupingLooseResolverTest.java b/extension/openflowplugin-extension-api/src/test/java/org/opendaylight/openflowplugin/extension/api/GroupingLooseResolverTest.java new file mode 100644 index 0000000000..44a6b2ee4d --- /dev/null +++ b/extension/openflowplugin-extension-api/src/test/java/org/opendaylight/openflowplugin/extension/api/GroupingLooseResolverTest.java @@ -0,0 +1,57 @@ +package org.opendaylight.openflowplugin.extension.api; + +import java.util.Collections; + +import org.junit.Assert; +import org.junit.Test; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNodesNodeTableFlow; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNodesNodeTableFlowBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNotifPacketIn; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNotifPacketInBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralExtensionListGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.list.grouping.ExtensionList; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.list.grouping.ExtensionListBuilder; +import org.opendaylight.yangtools.yang.binding.Augmentable; + +/** + * Test of {@link GroupingLooseResolver} + */ +public class GroupingLooseResolverTest { + + /** + * test of method {@link GroupingLooseResolver#getExtension(Augmentable)} + */ + @Test + public void testGetExtension() { + GroupingLooseResolver eqGroup = new GroupingLooseResolver<>(GeneralExtensionListGrouping.class); + eqGroup.add(GeneralAugMatchNodesNodeTableFlow.class); + eqGroup.add(GeneralAugMatchNotifPacketIn.class); + + MatchBuilder mb1 = new MatchBuilder(); + ExtensionList extension1 = new ExtensionListBuilder().setExtensionKey(JoachimTheBig.class).build(); + GeneralAugMatchNodesNodeTableFlow odlxxx1 = new GeneralAugMatchNodesNodeTableFlowBuilder() + .setExtensionList(Collections.singletonList(extension1)).build(); + Match match1 = mb1.addAugmentation(GeneralAugMatchNodesNodeTableFlow.class, odlxxx1).build(); + + org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.packet.received.MatchBuilder mb2 = new org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.packet.received.MatchBuilder(); + ExtensionList extension2 = new ExtensionListBuilder().setExtensionKey(JoachimTheTiny.class).build(); + GeneralAugMatchNotifPacketIn odlxxx2 = new GeneralAugMatchNotifPacketInBuilder() + .setExtensionList(Collections.singletonList(extension2)).build(); + org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.packet.received.Match match2 = mb2.addAugmentation(GeneralAugMatchNotifPacketIn.class, odlxxx2).build(); + + Assert.assertEquals(JoachimTheBig.class, eqGroup.getExtension(match1).get().getExtensionList().get(0).getExtensionKey()); + Assert.assertEquals(JoachimTheTiny.class, eqGroup.getExtension(match2).get().getExtensionList().get(0).getExtensionKey()); + } + + private static class JoachimTheBig extends ExtensionKey { + // nobody + } + + private static class JoachimTheTiny extends ExtensionKey { + // nobody + } + +} diff --git a/extension/openflowplugin-extension-api/src/test/java/org/opendaylight/openflowplugin/extension/api/GroupingResolverTest.java b/extension/openflowplugin-extension-api/src/test/java/org/opendaylight/openflowplugin/extension/api/GroupingResolverTest.java new file mode 100644 index 0000000000..140fec50cc --- /dev/null +++ b/extension/openflowplugin-extension-api/src/test/java/org/opendaylight/openflowplugin/extension/api/GroupingResolverTest.java @@ -0,0 +1,53 @@ +package org.opendaylight.openflowplugin.extension.api; + +import java.util.Collections; + +import org.junit.Assert; +import org.junit.Test; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNodesNodeTableFlow; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNodesNodeTableFlowBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchRpcAddFlow; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralExtensionListGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.list.grouping.ExtensionList; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.list.grouping.ExtensionListBuilder; +import org.opendaylight.yangtools.yang.binding.Augmentable; + +/** + * Test of {@link GroupingResolver} + */ +public class GroupingResolverTest { + + /** + * test of method {@link GroupingResolver#getExtension(Augmentable)} + */ + @Test + public void testGetExtension() { + GroupingResolver eqGroup = new GroupingResolver<>(GeneralExtensionListGrouping.class); + eqGroup.add(GeneralAugMatchNodesNodeTableFlow.class); + eqGroup.add(GeneralAugMatchRpcAddFlow.class); + + MatchBuilder mb1 = new MatchBuilder(); + ExtensionList extension1 = new ExtensionListBuilder().setExtensionKey(JoachimTheBig.class).build(); + GeneralAugMatchNodesNodeTableFlow odlxxx1 = new GeneralAugMatchNodesNodeTableFlowBuilder().setExtensionList(Collections.singletonList(extension1)).build(); + Match match1 = mb1.addAugmentation(GeneralAugMatchNodesNodeTableFlow.class, odlxxx1).build(); + + MatchBuilder mb2 = new MatchBuilder(); + ExtensionList extension2 = new ExtensionListBuilder().setExtensionKey(JoachimTheTiny.class).build(); + GeneralAugMatchNodesNodeTableFlow odlxxx2 = new GeneralAugMatchNodesNodeTableFlowBuilder().setExtensionList(Collections.singletonList(extension2)).build(); + Match match2 = mb2.addAugmentation(GeneralAugMatchNodesNodeTableFlow.class, odlxxx2).build(); + + Assert.assertEquals(JoachimTheBig.class, eqGroup.getExtension(match1).get().getExtensionList().get(0).getExtensionKey()); + Assert.assertEquals(JoachimTheTiny.class, eqGroup.getExtension(match2).get().getExtensionList().get(0).getExtensionKey()); + } + + private static class JoachimTheBig extends ExtensionKey { + // nobody + } + + private static class JoachimTheTiny extends ExtensionKey { + // nobody + } +} diff --git a/extension/openflowplugin-extension-nicira/pom.xml b/extension/openflowplugin-extension-nicira/pom.xml new file mode 100644 index 0000000000..4f10299907 --- /dev/null +++ b/extension/openflowplugin-extension-nicira/pom.xml @@ -0,0 +1,125 @@ + + + + 4.0.0 + + org.opendaylight.openflowplugin + openflowplugin-extension-parent + 0.0.3-SNAPSHOT + ../ + + + openflowplugin-extension-nicira + bundle + + + + + org.apache.felix + maven-bundle-plugin + + + + org.opendaylight.yangtools + yang-maven-plugin + + + + generate-sources + + + + + + org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator + + ${project.build.directory}/generated-sources/config + + + urn:opendaylight:params:xml:ns:yang:controller:config==org.opendaylight.controller.config.yang + + + + + + org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl + + ${project.build.directory}/generated-sources/sal + + + org.opendaylight.yangtools.yang.unified.doc.generator.maven.DocumentationGeneratorImpl + ${project.build.directory}/site/models + + + true + + + + + + org.opendaylight.controller + yang-jmx-generator-plugin + ${config.parent.version} + + + org.opendaylight.yangtools + maven-sal-api-gen-plugin + ${yangtools.version} + jar + + + + + + + + + ${project.groupId} + openflowplugin-extension-api + ${project.version} + + + ${project.groupId} + openflowjava-extension-nicira + + + ${project.groupId} + openflowjava-extension-nicira-api + + + + org.opendaylight.openflowplugin + openflowplugin + ${project.version} + + + + + org.opendaylight.controller.model + model-flow-base + + + org.opendaylight.controller.model + model-flow-service + + + org.opendaylight.controller.model + model-flow-statistics + + + org.opendaylight.controller.model + model-inventory + + + + + org.opendaylight.openflowjava + openflow-protocol-api + + + org.opendaylight.openflowjava + openflow-protocol-impl + + + + \ No newline at end of file diff --git a/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/NiciraExtensionProvider.java b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/NiciraExtensionProvider.java new file mode 100644 index 0000000000..5d51cb6da9 --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/NiciraExtensionProvider.java @@ -0,0 +1,206 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.vendor.nicira; + +import java.util.HashSet; +import java.util.Set; + +import org.opendaylight.openflowjava.nx.api.NiciraUtil; +import org.opendaylight.openflowjava.nx.codec.action.RegLoadCodec; +import org.opendaylight.openflowjava.nx.codec.action.RegMoveCodec; +import org.opendaylight.openflowjava.nx.codec.match.ArpOpCodec; +import org.opendaylight.openflowjava.nx.codec.match.ArpShaCodec; +import org.opendaylight.openflowjava.nx.codec.match.ArpSpaCodec; +import org.opendaylight.openflowjava.nx.codec.match.ArpThaCodec; +import org.opendaylight.openflowjava.nx.codec.match.ArpTpaCodec; +import org.opendaylight.openflowjava.nx.codec.match.EthDstCodec; +import org.opendaylight.openflowjava.nx.codec.match.EthSrcCodec; +import org.opendaylight.openflowjava.nx.codec.match.EthTypeCodec; +import org.opendaylight.openflowjava.nx.codec.match.Reg0Codec; +import org.opendaylight.openflowjava.nx.codec.match.Reg1Codec; +import org.opendaylight.openflowjava.nx.codec.match.Reg2Codec; +import org.opendaylight.openflowjava.nx.codec.match.Reg3Codec; +import org.opendaylight.openflowjava.nx.codec.match.Reg4Codec; +import org.opendaylight.openflowjava.nx.codec.match.Reg5Codec; +import org.opendaylight.openflowjava.nx.codec.match.Reg6Codec; +import org.opendaylight.openflowjava.nx.codec.match.Reg7Codec; +import org.opendaylight.openflowjava.nx.codec.match.TunIdCodec; +import org.opendaylight.openflowjava.nx.codec.match.TunIpv4DstCodec; +import org.opendaylight.openflowjava.nx.codec.match.TunIpv4SrcCodec; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey; +import org.opendaylight.openflowplugin.extension.api.ConvertorActionToOFJava; +import org.opendaylight.openflowplugin.extension.api.ExtensionConverterRegistrator; +import org.opendaylight.openflowplugin.extension.api.TypeVersionKey; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.action.RegLoadConvertor; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.action.RegMoveConvertor; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match.ArpOpConvertor; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match.ArpShaConvertor; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match.ArpSpaConvertor; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match.ArpThaConvertor; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match.ArpTpaConvertor; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match.EthDstConvertor; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match.EthSrcConvertor; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match.EthTypeConvertor; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match.RegConvertor; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match.TunIdConvertor; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match.TunIpv4DstConvertor; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match.TunIpv4SrcConvertor; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.add.flow.input.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionRegLoadRpcAddFlowApplyActionsCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.add.flow.input.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionRegMoveRpcAddFlowApplyActionsCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.add.flow.input.instructions.instruction.instruction.write.actions._case.write.actions.action.action.NxActionRegLoadRpcAddFlowWriteActionsCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.add.flow.input.instructions.instruction.instruction.write.actions._case.write.actions.action.action.NxActionRegMoveRpcAddFlowWriteActionsCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nodes.node.table.flow.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionRegLoadNodesNodeTableFlowApplyActionsCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nodes.node.table.flow.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionRegMoveNodesNodeTableFlowApplyActionsCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nodes.node.table.flow.instructions.instruction.instruction.write.actions._case.write.actions.action.action.NxActionRegLoadNodesNodeTableFlowWriteActionsCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nodes.node.table.flow.instructions.instruction.instruction.write.actions._case.write.actions.action.action.NxActionRegMoveNodesNodeTableFlowWriteActionsCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxArpShaKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxArpThaKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg0Key; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg1Key; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg2Key; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg3Key; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg4Key; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg5Key; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg6Key; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg7Key; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIdKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIpv4DstKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIpv4SrcKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpOpKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpSpaKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpTpaKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthDstKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthSrcKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthTypeKey; +import org.opendaylight.yangtools.concepts.ObjectRegistration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.base.Preconditions; + +/** + * + */ +public class NiciraExtensionProvider implements AutoCloseable { + + private static final Logger LOG = LoggerFactory + .getLogger(NiciraExtensionProvider.class); + + private ExtensionConverterRegistrator extensionConverterRegistrator; + private Set> registrations; + + private final static RegConvertor REG_CONVERTOR = new RegConvertor(); + private final static TunIdConvertor TUN_ID_CONVERTOR = new TunIdConvertor(); + private final static ArpOpConvertor ARP_OP_CONVERTOR = new ArpOpConvertor(); + private final static ArpShaConvertor ARP_SHA_CONVERTOR = new ArpShaConvertor(); + private final static ArpSpaConvertor ARP_SPA_CONVERTOR = new ArpSpaConvertor(); + private final static ArpTpaConvertor ARP_TPA_CONVERTOR = new ArpTpaConvertor(); + private final static ArpThaConvertor ARP_THA_CONVERTOR = new ArpThaConvertor(); + private final static EthDstConvertor ETH_DST_CONVERTOR = new EthDstConvertor(); + private final static EthSrcConvertor ETH_SRC_CONVERTOR = new EthSrcConvertor(); + private final static TunIpv4DstConvertor TUN_IPV4_DST_CONVERTOR = new TunIpv4DstConvertor(); + private final static TunIpv4SrcConvertor TUN_IPV4_SRC_CONVERTOR = new TunIpv4SrcConvertor(); + private final static RegLoadConvertor REG_LOAD_CONVERTOR = new RegLoadConvertor(); + private final static RegMoveConvertor REG_MOVE_CONVERTOR = new RegMoveConvertor(); + private final static EthTypeConvertor ETH_TYPE_CONVERTOR = new EthTypeConvertor(); + + @Override + public void close() { + for (AutoCloseable janitor : registrations) { + try { + janitor.close(); + } catch (Exception e) { + LOG.warn("closing of extension converter failed", e); + } + } + extensionConverterRegistrator = null; + } + + /** + * @param extensionConverterRegistrator + */ + public void setExtensionConverterRegistrator( + ExtensionConverterRegistrator extensionConverterRegistrator) { + this.extensionConverterRegistrator = extensionConverterRegistrator; + } + + /** + * register appropriate converters + */ + public void registerConverters() { + Preconditions.checkNotNull(extensionConverterRegistrator); + registrations = new HashSet<>(); + // src=dataStore/config + registerAction13(NxActionRegLoadNodesNodeTableFlowApplyActionsCase.class, REG_LOAD_CONVERTOR); + registerAction13(NxActionRegMoveNodesNodeTableFlowApplyActionsCase.class, REG_MOVE_CONVERTOR); + registerAction13(NxActionRegLoadNodesNodeTableFlowWriteActionsCase.class, REG_LOAD_CONVERTOR); + registerAction13(NxActionRegMoveNodesNodeTableFlowWriteActionsCase.class, REG_MOVE_CONVERTOR); + // src=rpc-addFlow + registerAction13(NxActionRegLoadRpcAddFlowApplyActionsCase.class, REG_LOAD_CONVERTOR); + registerAction13(NxActionRegMoveRpcAddFlowApplyActionsCase.class, REG_MOVE_CONVERTOR); + registerAction13(NxActionRegLoadRpcAddFlowWriteActionsCase.class, REG_LOAD_CONVERTOR); + registerAction13(NxActionRegMoveRpcAddFlowWriteActionsCase.class, REG_MOVE_CONVERTOR); + + registrations.add(extensionConverterRegistrator.registerActionConvertor(NiciraUtil.createOfJavaKeyFrom(RegLoadCodec.SERIALIZER_KEY), REG_LOAD_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerActionConvertor(NiciraUtil.createOfJavaKeyFrom(RegMoveCodec.SERIALIZER_KEY), REG_MOVE_CONVERTOR)); + + registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmNxReg0Key.class, EncodeConstants.OF13_VERSION_ID), REG_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmNxReg1Key.class, EncodeConstants.OF13_VERSION_ID), REG_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmNxReg2Key.class, EncodeConstants.OF13_VERSION_ID), REG_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmNxReg3Key.class, EncodeConstants.OF13_VERSION_ID), REG_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmNxReg4Key.class, EncodeConstants.OF13_VERSION_ID), REG_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmNxReg5Key.class, EncodeConstants.OF13_VERSION_ID), REG_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmNxReg6Key.class, EncodeConstants.OF13_VERSION_ID), REG_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmNxReg7Key.class, EncodeConstants.OF13_VERSION_ID), REG_CONVERTOR)); + + registrations.add(extensionConverterRegistrator.registerMatchConvertor(Reg0Codec.SERIALIZER_KEY, REG_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(Reg1Codec.SERIALIZER_KEY, REG_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(Reg2Codec.SERIALIZER_KEY, REG_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(Reg3Codec.SERIALIZER_KEY, REG_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(Reg4Codec.SERIALIZER_KEY, REG_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(Reg5Codec.SERIALIZER_KEY, REG_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(Reg6Codec.SERIALIZER_KEY, REG_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(Reg7Codec.SERIALIZER_KEY, REG_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmNxTunIdKey.class, EncodeConstants.OF13_VERSION_ID), TUN_ID_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(TunIdCodec.SERIALIZER_KEY, TUN_ID_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmNxArpShaKey.class, EncodeConstants.OF13_VERSION_ID), ARP_SHA_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(ArpShaCodec.SERIALIZER_KEY, ARP_SHA_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmNxArpThaKey.class, EncodeConstants.OF13_VERSION_ID), ARP_THA_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(ArpThaCodec.SERIALIZER_KEY, ARP_THA_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmOfArpOpKey.class, EncodeConstants.OF13_VERSION_ID), ARP_OP_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(ArpOpCodec.SERIALIZER_KEY, ARP_OP_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmOfArpSpaKey.class, EncodeConstants.OF13_VERSION_ID), ARP_SPA_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(ArpSpaCodec.SERIALIZER_KEY, ARP_SPA_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmOfArpTpaKey.class, EncodeConstants.OF13_VERSION_ID), ARP_TPA_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(ArpTpaCodec.SERIALIZER_KEY, ARP_TPA_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmNxTunIpv4DstKey.class, EncodeConstants.OF13_VERSION_ID), TUN_IPV4_DST_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(TunIpv4DstCodec.SERIALIZER_KEY, TUN_IPV4_DST_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmNxTunIpv4SrcKey.class, EncodeConstants.OF13_VERSION_ID), TUN_IPV4_SRC_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(TunIpv4SrcCodec.SERIALIZER_KEY, TUN_IPV4_SRC_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmOfEthSrcKey.class, EncodeConstants.OF13_VERSION_ID), ETH_SRC_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(EthSrcCodec.SERIALIZER_KEY, ETH_SRC_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmOfEthDstKey.class, EncodeConstants.OF13_VERSION_ID), ETH_DST_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(EthDstCodec.SERIALIZER_KEY, ETH_DST_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(new ConverterExtensionKey<>(NxmOfEthTypeKey.class, EncodeConstants.OF13_VERSION_ID), ETH_TYPE_CONVERTOR)); + registrations.add(extensionConverterRegistrator.registerMatchConvertor(EthTypeCodec.SERIALIZER_KEY, ETH_TYPE_CONVERTOR)); + } + + /** + * @param class1 + * @param regLoadConvertor + */ + private void registerAction13( + Class actionCaseType, + ConvertorActionToOFJava actionConvertor) { + TypeVersionKey key = new TypeVersionKey<>(actionCaseType, EncodeConstants.OF13_VERSION_ID); + registrations.add(extensionConverterRegistrator.registerActionConvertor(key, actionConvertor)); + } + +} diff --git a/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/CodecPreconditionException.java b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/CodecPreconditionException.java new file mode 100644 index 0000000000..314ab64017 --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/CodecPreconditionException.java @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.vendor.nicira.convertor; + +import org.opendaylight.openflowplugin.extension.api.path.AugmentationPath; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; + +/** + * @author msunal + * + */ +public class CodecPreconditionException extends RuntimeException { + + private static final long serialVersionUID = 4602742888420994730L; + + public CodecPreconditionException(String msg) { + super(msg); + } + + public CodecPreconditionException(AugmentationPath path) { + super("Augmentation for path " + path + " is not implemented."); + } + + public CodecPreconditionException(Extension extension) { + super("Extension " + extension.getClass() + " does not contain any known augmentation. " + extension); + } +} diff --git a/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/IpConverter.java b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/IpConverter.java new file mode 100644 index 0000000000..2054f24bc7 --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/IpConverter.java @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.vendor.nicira.convertor; + +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address; + +/** + * @author msunal + * + */ +public final class IpConverter { + + public static long Ipv4AddressToLong(Ipv4Address ipv4Address) { + String ipAddress = ipv4Address.getValue(); + long result = 0; + String[] atoms = ipAddress.split("\\."); + for (int i = 3; i >= 0; i--) { + result |= (Long.parseLong(atoms[3 - i]) << (i * 8)); + } + return result & 0xFFFFFFFF; + } + + public static Ipv4Address longToIpv4Address(long ip) { + long tmpIp = ip; + StringBuilder sb = new StringBuilder(15); + for (int i = 0; i < 4; i++) { + sb.insert(0, Long.toString(tmpIp & 0xff)); + if (i < 3) { + sb.insert(0, '.'); + } + tmpIp >>= 8; + } + return new Ipv4Address(sb.toString()); + } + +} diff --git a/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/action/ActionUtil.java b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/action/ActionUtil.java new file mode 100644 index 0000000000..700f5d6aef --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/action/ActionUtil.java @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.action; + +import org.opendaylight.openflowjava.nx.api.NiciraConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.ExperimenterActionSubType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.ActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.OfjAugNxAction; + +/** + * @author msunal + * + */ +public class ActionUtil { + + private final static ExperimenterIdActionBuilder EXPERIMENTER_ID_ACTION_BUILDER; + + static { + EXPERIMENTER_ID_ACTION_BUILDER = new ExperimenterIdActionBuilder(); + EXPERIMENTER_ID_ACTION_BUILDER.setExperimenter(new ExperimenterId(NiciraConstants.NX_VENDOR_ID)); + } + + /** + * @param augNxAction + * @param subType + * @return OFJava action with augmentation containing action subtype and experimenter type + */ + public static Action createNiciraAction(OfjAugNxAction augNxAction, + Class subType) { + ActionBuilder actionBuilder = new ActionBuilder(); + actionBuilder.setType(Experimenter.class); + actionBuilder.addAugmentation(ExperimenterIdAction.class, EXPERIMENTER_ID_ACTION_BUILDER.setSubType(subType) + .build()); + actionBuilder.addAugmentation(OfjAugNxAction.class, augNxAction); + return actionBuilder.build(); + } +} diff --git a/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/action/RegLoadConvertor.java b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/action/RegLoadConvertor.java new file mode 100644 index 0000000000..c2f12396c9 --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/action/RegLoadConvertor.java @@ -0,0 +1,101 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.action; + +import org.opendaylight.openflowplugin.extension.api.ConvertorActionFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorActionToOFJava; +import org.opendaylight.openflowplugin.extension.api.path.ActionPath; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.CodecPreconditionException; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.NxmNxRegLoad; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.OfjAugNxAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.OfjAugNxActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.reg.load.grouping.ActionRegLoad; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.reg.load.grouping.ActionRegLoadBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.NxActionRegLoadGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.flows.statistics.update.flow.and.statistics.map.list.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionRegLoadNotifFlowsStatisticsUpdateApplyActionsCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.flows.statistics.update.flow.and.statistics.map.list.instructions.instruction.instruction.write.actions._case.write.actions.action.action.NxActionRegLoadNotifFlowsStatisticsUpdateWriteActionsCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.group.desc.stats.updated.group.desc.stats.buckets.bucket.action.action.NxActionRegLoadNotifGroupDescStatsUpdatedCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nodes.node.table.flow.instructions.instruction.instruction.write.actions._case.write.actions.action.action.NxActionRegLoadNodesNodeTableFlowWriteActionsCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.NxRegLoad; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.NxRegLoadBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.nx.reg.load.Dst; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.nx.reg.load.DstBuilder; + +import com.google.common.base.Preconditions; + +/** + * @author msunal + * + */ +public class RegLoadConvertor implements +ConvertorActionToOFJava, +ConvertorActionFromOFJava { + + @Override + public org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action convert(Action input, ActionPath path) { + ActionRegLoad actionRegLoad = input.getAugmentation(OfjAugNxAction.class).getActionRegLoad(); + DstBuilder dstBuilder = new DstBuilder(); + dstBuilder.setDstChoice(RegMoveConvertor.resolveDst(actionRegLoad.getDst())); + dstBuilder.setStart(resolveStart(actionRegLoad.getOfsNbits())); + dstBuilder.setEnd(resolveEnd(actionRegLoad.getOfsNbits())); + NxRegLoadBuilder nxRegLoadBuilder = new NxRegLoadBuilder(); + nxRegLoadBuilder.setDst(dstBuilder.build()); + nxRegLoadBuilder.setValue(actionRegLoad.getValue()); + return resolveAction(nxRegLoadBuilder.build(), path); + } + + private static int resolveStart(int ofsNBints) { + return extractSub(ofsNBints, 10, 6); + } + + private static int resolveEnd(int ofsNBints) { + int ofs = extractSub(ofsNBints, 10, 6); + int nBits = extractSub(ofsNBints, 6, 0); + return ofs + nBits; + } + + private static int extractSub(final int l, final int nrBits, final int offset) { + final int rightShifted = l >>> offset; + final int mask = (1 << nrBits) - 1; + return rightShifted & mask; + } + + private static org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action resolveAction(NxRegLoad value, + ActionPath path) { + switch (path) { + case NODES_NODE_TABLE_FLOW_INSTRUCTIONS_INSTRUCTION_WRITEACTIONSCASE_WRITEACTIONS_ACTION_ACTION_EXTENSIONLIST_EXTENSION: + return new NxActionRegLoadNodesNodeTableFlowWriteActionsCaseBuilder().setNxRegLoad(value).build(); + case FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_INSTRUCTIONS_INSTRUCTION_INSTRUCTION_WRITEACTIONSCASE_WRITEACTIONS_ACTION_ACTION: + return new NxActionRegLoadNotifFlowsStatisticsUpdateWriteActionsCaseBuilder().setNxRegLoad(value).build(); + case FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_INSTRUCTIONS_INSTRUCTION_INSTRUCTION_APPLYACTIONSCASE_APPLYACTIONS_ACTION_ACTION: + return new NxActionRegLoadNotifFlowsStatisticsUpdateApplyActionsCaseBuilder().setNxRegLoad(value).build(); + case GROUPDESCSTATSUPDATED_GROUPDESCSTATS_BUCKETS_BUCKET_ACTION: + return new NxActionRegLoadNotifGroupDescStatsUpdatedCaseBuilder().setNxRegLoad(value).build(); + default: + throw new CodecPreconditionException(path); + } + } + + @Override + public Action convert(org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action nxActionArg) { + Preconditions.checkArgument(nxActionArg instanceof NxActionRegLoadGrouping); + + NxActionRegLoadGrouping nxAction = (NxActionRegLoadGrouping) nxActionArg; + Dst dst = nxAction.getNxRegLoad().getDst(); + ActionRegLoadBuilder actionRegLoadBuilder = new ActionRegLoadBuilder(); + actionRegLoadBuilder.setDst(RegMoveConvertor.resolveDst(dst.getDstChoice())); + actionRegLoadBuilder.setOfsNbits((dst.getStart() << 6) | (dst.getEnd() - dst.getStart())); + actionRegLoadBuilder.setValue(nxAction.getNxRegLoad().getValue()); + OfjAugNxActionBuilder augNxActionBuilder = new OfjAugNxActionBuilder(); + augNxActionBuilder.setActionRegLoad(actionRegLoadBuilder.build()); + return ActionUtil.createNiciraAction(augNxActionBuilder.build(), NxmNxRegLoad.class); + } + + +} diff --git a/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/action/RegMoveConvertor.java b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/action/RegMoveConvertor.java new file mode 100644 index 0000000000..b379a5e081 --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/action/RegMoveConvertor.java @@ -0,0 +1,364 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.action; + +import org.opendaylight.openflowjava.nx.NiciraMatchCodecs; +import org.opendaylight.openflowjava.nx.codec.match.NxmHeader; +import org.opendaylight.openflowplugin.extension.api.ConvertorActionFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorActionToOFJava; +import org.opendaylight.openflowplugin.extension.api.path.ActionPath; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.CodecPreconditionException; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.NxmNxRegMove; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.OfjAugNxAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.OfjAugNxActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.reg.move.grouping.ActionRegMove; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.reg.move.grouping.ActionRegMoveBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg0; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg1; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg2; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg3; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg4; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg5; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg6; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg7; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.NxActionRegMoveGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.DstChoice; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxArpShaCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxArpShaCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxArpThaCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxArpThaCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxRegCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxRegCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxTunIdCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxTunIdCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxTunIpv4DstCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxTunIpv4DstCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxTunIpv4SrcCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxTunIpv4SrcCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstOfArpOpCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstOfArpOpCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstOfArpSpaCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstOfArpSpaCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstOfArpTpaCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstOfArpTpaCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstOfEthDstCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstOfEthDstCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstOfEthSrcCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstOfEthSrcCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.flows.statistics.update.flow.and.statistics.map.list.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionRegMoveNotifFlowsStatisticsUpdateApplyActionsCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.flows.statistics.update.flow.and.statistics.map.list.instructions.instruction.instruction.write.actions._case.write.actions.action.action.NxActionRegMoveNotifFlowsStatisticsUpdateWriteActionsCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.group.desc.stats.updated.group.desc.stats.buckets.bucket.action.action.NxActionRegMoveNotifGroupDescStatsUpdatedCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nodes.node.table.flow.instructions.instruction.instruction.write.actions._case.write.actions.action.action.NxActionRegMoveNodesNodeTableFlowWriteActionsCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.move.grouping.NxRegMove; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.move.grouping.NxRegMoveBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.move.grouping.nx.reg.move.Dst; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.move.grouping.nx.reg.move.DstBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.move.grouping.nx.reg.move.Src; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.move.grouping.nx.reg.move.SrcBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.SrcChoice; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcNxArpShaCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcNxArpShaCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcNxArpThaCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcNxArpThaCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcNxRegCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcNxRegCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcNxTunIdCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcNxTunIdCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcNxTunIpv4DstCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcNxTunIpv4DstCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcNxTunIpv4SrcCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcNxTunIpv4SrcCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcOfArpOpCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcOfArpOpCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcOfArpSpaCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcOfArpSpaCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcOfArpTpaCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcOfArpTpaCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcOfEthDstCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcOfEthDstCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcOfEthSrcCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcOfEthSrcCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcOfEthTypeCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcOfEthTypeCaseBuilder; + +import com.google.common.base.Preconditions; + +/** + * @author msunal + * + */ +public class RegMoveConvertor implements +ConvertorActionToOFJava, +ConvertorActionFromOFJava { + + @Override + public org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action convert(Action input, ActionPath path) { + ActionRegMove actionRegMove = input.getAugmentation(OfjAugNxAction.class).getActionRegMove(); + DstBuilder dstBuilder = new DstBuilder(); + dstBuilder.setDstChoice(resolveDst(actionRegMove.getDst())); + dstBuilder.setStart(actionRegMove.getDstOfs()); + dstBuilder.setEnd(actionRegMove.getDstOfs() + actionRegMove.getNBits() - 1); + SrcBuilder srcBuilder = new SrcBuilder(); + srcBuilder.setSrcChoice(resolveSrc(actionRegMove.getSrc())); + srcBuilder.setStart(actionRegMove.getSrcOfs()); + srcBuilder.setEnd(actionRegMove.getSrcOfs() + actionRegMove.getNBits() - 1); + NxRegMoveBuilder nxRegMoveBuilder = new NxRegMoveBuilder(); + nxRegMoveBuilder.setDst(dstBuilder.build()); + nxRegMoveBuilder.setSrc(srcBuilder.build()); + return resolveAction(nxRegMoveBuilder.build(), path); + } + + public static DstChoice resolveDst(long dstValue) { + Class potentialDst = resolveReg(dstValue); + if (potentialDst != null) { + return new DstNxRegCaseBuilder().setNxReg(potentialDst).build(); + } + if (dstValue == NiciraMatchCodecs.TUN_ID_CODEC.getHeaderWithoutHasMask().toLong()) { + return new DstNxTunIdCaseBuilder().setNxTunId(true).build(); + } + if (dstValue == NiciraMatchCodecs.ARP_SHA_CODEC.getHeaderWithoutHasMask().toLong()) { + return new DstNxArpShaCaseBuilder().setNxArpSha(true).build(); + } + if (dstValue == NiciraMatchCodecs.ARP_THA_CODEC.getHeaderWithoutHasMask().toLong()) { + return new DstNxArpThaCaseBuilder().setNxArpTha(true).build(); + } + if (dstValue == NiciraMatchCodecs.ARP_OP_CODEC.getHeaderWithoutHasMask().toLong()) { + return new DstOfArpOpCaseBuilder().setOfArpOp(true).build(); + } + if (dstValue == NiciraMatchCodecs.ARP_SPA_CODEC.getHeaderWithoutHasMask().toLong()) { + return new DstOfArpSpaCaseBuilder().setOfArpSpa(true).build(); + } + if (dstValue == NiciraMatchCodecs.ARP_TPA_CODEC.getHeaderWithoutHasMask().toLong()) { + return new DstOfArpTpaCaseBuilder().setOfArpTpa(true).build(); + } + if (dstValue == NiciraMatchCodecs.TUN_IPV4_DST_CODEC.getHeaderWithoutHasMask().toLong()) { + return new DstNxTunIpv4DstCaseBuilder().setNxTunIpv4Dst(true).build(); + } + if (dstValue == NiciraMatchCodecs.TUN_IPV4_SRC_CODEC.getHeaderWithoutHasMask().toLong()) { + return new DstNxTunIpv4SrcCaseBuilder().setNxTunIpv4Src(true).build(); + } + if (dstValue == NiciraMatchCodecs.ETH_DST_CODEC.getHeaderWithoutHasMask().toLong()) { + return new DstOfEthDstCaseBuilder().setOfEthDst(true).build(); + } + if (dstValue == NiciraMatchCodecs.ETH_SRC_CODEC.getHeaderWithoutHasMask().toLong()) { + return new DstOfEthSrcCaseBuilder().setOfEthSrc(true).build(); + } + throw new CodecPreconditionException("Missing codec for " + new NxmHeader(dstValue)); + } + + private static SrcChoice resolveSrc(long srcValue) { + Class potentialSrc = resolveReg(srcValue); + if (potentialSrc != null) { + return new SrcNxRegCaseBuilder().setNxReg(potentialSrc).build(); + } + if (srcValue == NiciraMatchCodecs.TUN_ID_CODEC.getHeaderWithoutHasMask().toLong()) { + return new SrcNxTunIdCaseBuilder().setNxTunId(true).build(); + } + if (srcValue == NiciraMatchCodecs.ARP_SHA_CODEC.getHeaderWithoutHasMask().toLong()) { + return new SrcNxArpShaCaseBuilder().setNxArpSha(true).build(); + } + if (srcValue == NiciraMatchCodecs.ARP_THA_CODEC.getHeaderWithoutHasMask().toLong()) { + return new SrcNxArpThaCaseBuilder().setNxArpTha(true).build(); + } + if (srcValue == NiciraMatchCodecs.ARP_OP_CODEC.getHeaderWithoutHasMask().toLong()) { + return new SrcOfArpOpCaseBuilder().setOfArpOp(true).build(); + } + if (srcValue == NiciraMatchCodecs.ARP_SPA_CODEC.getHeaderWithoutHasMask().toLong()) { + return new SrcOfArpSpaCaseBuilder().setOfArpSpa(true).build(); + } + if (srcValue == NiciraMatchCodecs.ARP_TPA_CODEC.getHeaderWithoutHasMask().toLong()) { + return new SrcOfArpTpaCaseBuilder().setOfArpTpa(true).build(); + } + if (srcValue == NiciraMatchCodecs.TUN_IPV4_DST_CODEC.getHeaderWithoutHasMask().toLong()) { + return new SrcNxTunIpv4DstCaseBuilder().setNxTunIpv4Dst(true).build(); + } + if (srcValue == NiciraMatchCodecs.TUN_IPV4_SRC_CODEC.getHeaderWithoutHasMask().toLong()) { + return new SrcNxTunIpv4SrcCaseBuilder().setNxTunIpv4Src(true).build(); + } + if (srcValue == NiciraMatchCodecs.ETH_DST_CODEC.getHeaderWithoutHasMask().toLong()) { + return new SrcOfEthDstCaseBuilder().setOfEthDst(true).build(); + } + if (srcValue == NiciraMatchCodecs.ETH_SRC_CODEC.getHeaderWithoutHasMask().toLong()) { + return new SrcOfEthSrcCaseBuilder().setOfEthSrc(true).build(); + } + if (srcValue == NiciraMatchCodecs.ETH_TYPE_CODEC.getHeaderWithoutHasMask().toLong()) { + return new SrcOfEthTypeCaseBuilder().setOfEthType(true).build(); + } + throw new CodecPreconditionException("Missing codec for " + new NxmHeader(srcValue)); + } + + private static Class resolveReg(long value) { + if (value == NiciraMatchCodecs.REG0_CODEC.getHeaderWithoutHasMask().toLong()) { + return NxmNxReg0.class; + } + if (value == NiciraMatchCodecs.REG1_CODEC.getHeaderWithoutHasMask().toLong()) { + return NxmNxReg1.class; + } + if (value == NiciraMatchCodecs.REG2_CODEC.getHeaderWithoutHasMask().toLong()) { + return NxmNxReg2.class; + } + if (value == NiciraMatchCodecs.REG3_CODEC.getHeaderWithoutHasMask().toLong()) { + return NxmNxReg3.class; + } + if (value == NiciraMatchCodecs.REG4_CODEC.getHeaderWithoutHasMask().toLong()) { + return NxmNxReg4.class; + } + if (value == NiciraMatchCodecs.REG5_CODEC.getHeaderWithoutHasMask().toLong()) { + return NxmNxReg5.class; + } + if (value == NiciraMatchCodecs.REG6_CODEC.getHeaderWithoutHasMask().toLong()) { + return NxmNxReg6.class; + } + if (value == NiciraMatchCodecs.REG7_CODEC.getHeaderWithoutHasMask().toLong()) { + return NxmNxReg7.class; + } + return null; + } + + private static org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action resolveAction( + NxRegMove value, ActionPath path) { + switch (path) { + case NODES_NODE_TABLE_FLOW_INSTRUCTIONS_INSTRUCTION_WRITEACTIONSCASE_WRITEACTIONS_ACTION_ACTION_EXTENSIONLIST_EXTENSION: + return new NxActionRegMoveNodesNodeTableFlowWriteActionsCaseBuilder().setNxRegMove(value).build(); + case FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_INSTRUCTIONS_INSTRUCTION_INSTRUCTION_WRITEACTIONSCASE_WRITEACTIONS_ACTION_ACTION: + return new NxActionRegMoveNotifFlowsStatisticsUpdateWriteActionsCaseBuilder().setNxRegMove(value).build(); + case FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_INSTRUCTIONS_INSTRUCTION_INSTRUCTION_APPLYACTIONSCASE_APPLYACTIONS_ACTION_ACTION: + return new NxActionRegMoveNotifFlowsStatisticsUpdateApplyActionsCaseBuilder().setNxRegMove(value).build(); + case GROUPDESCSTATSUPDATED_GROUPDESCSTATS_BUCKETS_BUCKET_ACTION: + return new NxActionRegMoveNotifGroupDescStatsUpdatedCaseBuilder().setNxRegMove(value).build(); + default: + throw new CodecPreconditionException(path); + } + } + + @Override + public Action convert(org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action nxActionArg) { + Preconditions.checkArgument(nxActionArg instanceof NxActionRegMoveGrouping); + NxActionRegMoveGrouping nxAction = (NxActionRegMoveGrouping) nxActionArg; + + Dst dst = nxAction.getNxRegMove().getDst(); + Src src = nxAction.getNxRegMove().getSrc(); + ActionRegMoveBuilder actionRegMoveBuilder = new ActionRegMoveBuilder(); + actionRegMoveBuilder.setDst(resolveDst(dst.getDstChoice())); + actionRegMoveBuilder.setDstOfs(dst.getStart()); + actionRegMoveBuilder.setSrc(resolveSrc(src.getSrcChoice())); + actionRegMoveBuilder.setSrcOfs(src.getStart()); + actionRegMoveBuilder.setNBits(dst.getEnd() - dst.getStart() + 1); + OfjAugNxActionBuilder augNxActionBuilder = new OfjAugNxActionBuilder(); + augNxActionBuilder.setActionRegMove(actionRegMoveBuilder.build()); + return ActionUtil.createNiciraAction(augNxActionBuilder.build(), NxmNxRegMove.class); + } + + public static long resolveDst(DstChoice dstChoice) { + if (dstChoice instanceof DstNxRegCase) { + return resolveReg(((DstNxRegCase) dstChoice).getNxReg()); + } + if (dstChoice instanceof DstNxTunIdCase) { + return NiciraMatchCodecs.TUN_ID_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (dstChoice instanceof DstNxArpShaCase) { + return NiciraMatchCodecs.ARP_SHA_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (dstChoice instanceof DstNxArpThaCase) { + return NiciraMatchCodecs.ARP_THA_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (dstChoice instanceof DstOfArpOpCase) { + return NiciraMatchCodecs.ARP_OP_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (dstChoice instanceof DstOfArpSpaCase) { + return NiciraMatchCodecs.ARP_SPA_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (dstChoice instanceof DstOfArpTpaCase) { + return NiciraMatchCodecs.ARP_TPA_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (dstChoice instanceof DstNxTunIpv4DstCase) { + return NiciraMatchCodecs.TUN_IPV4_DST_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (dstChoice instanceof DstNxTunIpv4SrcCase) { + return NiciraMatchCodecs.TUN_IPV4_SRC_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (dstChoice instanceof DstOfEthDstCase) { + return NiciraMatchCodecs.ETH_DST_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (dstChoice instanceof DstOfEthSrcCase) { + return NiciraMatchCodecs.ETH_SRC_CODEC.getHeaderWithoutHasMask().toLong(); + } + throw new CodecPreconditionException("Missing implementation of a case in dst-choice? " + dstChoice.getClass()); + } + + private static long resolveSrc(SrcChoice srcChoice) { + if (srcChoice instanceof SrcNxRegCase) { + return resolveReg(((SrcNxRegCase) srcChoice).getNxReg()); + } + if (srcChoice instanceof SrcNxTunIdCase) { + return NiciraMatchCodecs.TUN_ID_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (srcChoice instanceof SrcNxArpShaCase) { + return NiciraMatchCodecs.ARP_SHA_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (srcChoice instanceof SrcNxArpThaCase) { + return NiciraMatchCodecs.ARP_THA_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (srcChoice instanceof SrcOfArpOpCase) { + return NiciraMatchCodecs.ARP_OP_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (srcChoice instanceof SrcOfArpSpaCase) { + return NiciraMatchCodecs.ARP_SPA_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (srcChoice instanceof SrcOfArpTpaCase) { + return NiciraMatchCodecs.ARP_TPA_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (srcChoice instanceof SrcNxTunIpv4DstCase) { + return NiciraMatchCodecs.TUN_IPV4_DST_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (srcChoice instanceof SrcNxTunIpv4SrcCase) { + return NiciraMatchCodecs.TUN_IPV4_SRC_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (srcChoice instanceof SrcOfEthDstCase) { + return NiciraMatchCodecs.ETH_DST_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (srcChoice instanceof SrcOfEthSrcCase) { + return NiciraMatchCodecs.ETH_SRC_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (srcChoice instanceof SrcOfEthTypeCase) { + return NiciraMatchCodecs.ETH_TYPE_CODEC.getHeaderWithoutHasMask().toLong(); + } + throw new CodecPreconditionException("Missing implementation of a case in dst-choice? " + srcChoice.getClass()); + } + + private static long resolveReg(Class reg) { + if (reg.equals(NxmNxReg0.class)) { + return NiciraMatchCodecs.REG0_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (reg.equals(NxmNxReg1.class)) { + return NiciraMatchCodecs.REG1_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (reg.equals(NxmNxReg2.class)) { + return NiciraMatchCodecs.REG2_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (reg.equals(NxmNxReg3.class)) { + return NiciraMatchCodecs.REG3_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (reg.equals(NxmNxReg4.class)) { + return NiciraMatchCodecs.REG4_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (reg.equals(NxmNxReg5.class)) { + return NiciraMatchCodecs.REG5_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (reg.equals(NxmNxReg6.class)) { + return NiciraMatchCodecs.REG6_CODEC.getHeaderWithoutHasMask().toLong(); + } + if (reg.equals(NxmNxReg7.class)) { + return NiciraMatchCodecs.REG7_CODEC.getHeaderWithoutHasMask().toLong(); + } + throw new CodecPreconditionException("Missing codec for nxm_nx_reg?" + reg); + } + +} diff --git a/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/ArpOpConvertor.java b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/ArpOpConvertor.java new file mode 100644 index 0000000000..33f777e1e9 --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/ArpOpConvertor.java @@ -0,0 +1,100 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match; + +import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava; +import org.opendaylight.openflowplugin.extension.api.ExtensionAugment; +import org.opendaylight.openflowplugin.extension.api.path.MatchPath; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.CodecPreconditionException; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.of.match.arp.op.grouping.ArpOpValues; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.of.match.arp.op.grouping.ArpOpValuesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm0Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketIn; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketInBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemoved; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemovedBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStats; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStatsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpOpGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpOpKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.of.arp.op.grouping.NxmOfArpOp; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.of.arp.op.grouping.NxmOfArpOpBuilder; +import org.opendaylight.yangtools.yang.binding.Augmentation; + +import com.google.common.base.Optional; + +/** + * @author msunal + * + */ +public class ArpOpConvertor implements ConvertorToOFJava, ConvertorFromOFJava { + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava#convert + * (org.opendaylight.yangtools.yang.binding.DataContainer, + * org.opendaylight.openflowplugin.extension.api.path.AugmentationPath) + */ + @Override + public ExtensionAugment> convert(MatchEntries input, MatchPath path) { + ArpOpValues values = input.getAugmentation(OfjAugNxMatch.class).getArpOpValues(); + return resolveAugmentation(new NxmOfArpOpBuilder().setValue(values.getValue()).build(), path, + NxmOfArpOpKey.class); + } + + private static ExtensionAugment> resolveAugmentation(NxmOfArpOp value, + MatchPath path, Class key) { + switch (path) { + case FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifUpdateFlowStats.class, + new NxAugMatchNotifUpdateFlowStatsBuilder().setNxmOfArpOp(value).build(), key); + case PACKETRECEIVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifPacketIn.class, new NxAugMatchNotifPacketInBuilder() + .setNxmOfArpOp(value).build(), key); + case SWITCHFLOWREMOVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifSwitchFlowRemoved.class, + new NxAugMatchNotifSwitchFlowRemovedBuilder().setNxmOfArpOp(value).build(), key); + default: + throw new CodecPreconditionException(path); + } + } + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava#convert + * (org + * .opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general + * .rev140714.general.extension.grouping.Extension) + */ + @Override + public MatchEntries convert(Extension extension) { + Optional matchGrouping = MatchUtil.arpOpResolver.getExtension(extension); + if (!matchGrouping.isPresent()) { + throw new CodecPreconditionException(extension); + } + Integer value = matchGrouping.get().getNxmOfArpOp().getValue(); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder().setArpOpValues(new ArpOpValuesBuilder() + .setValue(value).build()); + return MatchUtil + .createNiciraMatchEntries( + Nxm0Class.class, + org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmOfArpOp.class, + false, augNxMatchBuilder.build()); + } + +} diff --git a/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/ArpShaConvertor.java b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/ArpShaConvertor.java new file mode 100644 index 0000000000..70a63c9617 --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/ArpShaConvertor.java @@ -0,0 +1,101 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match; + +import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava; +import org.opendaylight.openflowplugin.extension.api.ExtensionAugment; +import org.opendaylight.openflowplugin.extension.api.path.MatchPath; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.CodecPreconditionException; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.nx.match.arp.sha.grouping.ArpShaValues; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.nx.match.arp.sha.grouping.ArpShaValuesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketIn; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketInBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemoved; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemovedBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStats; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStatsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxArpShaGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxArpShaKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.nx.arp.sha.grouping.NxmNxArpSha; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.nx.arp.sha.grouping.NxmNxArpShaBuilder; +import org.opendaylight.yangtools.yang.binding.Augmentation; + +import com.google.common.base.Optional; + +/** + * @author msunal + * + */ +public class ArpShaConvertor implements ConvertorToOFJava, ConvertorFromOFJava { + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava#convert + * (org.opendaylight.yangtools.yang.binding.DataContainer, + * org.opendaylight.openflowplugin.extension.api.path.AugmentationPath) + */ + @Override + public ExtensionAugment> convert(MatchEntries input, MatchPath path) { + ArpShaValues values = input.getAugmentation(OfjAugNxMatch.class).getArpShaValues(); + return resolveAugmentation(new NxmNxArpShaBuilder().setMacAddress(values.getMacAddress()).build(), path, + NxmNxArpShaKey.class); + } + + private static ExtensionAugment> resolveAugmentation(NxmNxArpSha value, + MatchPath path, Class key) { + switch (path) { + case FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifUpdateFlowStats.class, + new NxAugMatchNotifUpdateFlowStatsBuilder().setNxmNxArpSha(value).build(), key); + case PACKETRECEIVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifPacketIn.class, new NxAugMatchNotifPacketInBuilder() + .setNxmNxArpSha(value).build(), key); + case SWITCHFLOWREMOVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifSwitchFlowRemoved.class, + new NxAugMatchNotifSwitchFlowRemovedBuilder().setNxmNxArpSha(value).build(), key); + default: + throw new CodecPreconditionException(path); + } + } + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava#convert + * (org + * .opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general + * .rev140714.general.extension.grouping.Extension) + */ + @Override + public MatchEntries convert(Extension extension) { + Optional matchGrouping = MatchUtil.arpShaResolver.getExtension(extension); + if (!matchGrouping.isPresent()) { + throw new CodecPreconditionException(extension); + } + MacAddress macAddress = matchGrouping.get().getNxmNxArpSha().getMacAddress(); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder().setArpShaValues(new ArpShaValuesBuilder() + .setMacAddress(macAddress).build()); + return MatchUtil + .createNiciraMatchEntries( + Nxm1Class.class, + org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxArpSha.class, + false, augNxMatchBuilder.build()); + } + +} diff --git a/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/ArpSpaConvertor.java b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/ArpSpaConvertor.java new file mode 100644 index 0000000000..0970bebe78 --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/ArpSpaConvertor.java @@ -0,0 +1,103 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match; + +import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava; +import org.opendaylight.openflowplugin.extension.api.ExtensionAugment; +import org.opendaylight.openflowplugin.extension.api.path.MatchPath; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.CodecPreconditionException; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.IpConverter; +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.openflow.oxm.rev130731.Nxm0Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.of.match.arp.spa.grouping.ArpSpaValues; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.of.match.arp.spa.grouping.ArpSpaValuesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketIn; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketInBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemoved; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemovedBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStats; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStatsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpSpaGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpSpaKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.of.arp.spa.grouping.NxmOfArpSpa; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.of.arp.spa.grouping.NxmOfArpSpaBuilder; +import org.opendaylight.yangtools.yang.binding.Augmentation; + +import com.google.common.base.Optional; + +/** + * @author msunal + * + */ +public class ArpSpaConvertor implements ConvertorToOFJava, ConvertorFromOFJava { + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava#convert + * (org.opendaylight.yangtools.yang.binding.DataContainer, + * org.opendaylight.openflowplugin.extension.api.path.AugmentationPath) + */ + @Override + public ExtensionAugment> convert(MatchEntries input, MatchPath path) { + ArpSpaValues values = input.getAugmentation(OfjAugNxMatch.class).getArpSpaValues(); + Ipv4Address ipv4Address = IpConverter.longToIpv4Address(values.getValue()); + return resolveAugmentation(new NxmOfArpSpaBuilder().setIpv4Address(ipv4Address).build(), path, + NxmOfArpSpaKey.class); + } + + private static ExtensionAugment> resolveAugmentation(NxmOfArpSpa value, + MatchPath path, Class key) { + switch (path) { + case FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifUpdateFlowStats.class, + new NxAugMatchNotifUpdateFlowStatsBuilder().setNxmOfArpSpa(value).build(), key); + case PACKETRECEIVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifPacketIn.class, new NxAugMatchNotifPacketInBuilder() + .setNxmOfArpSpa(value).build(), key); + case SWITCHFLOWREMOVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifSwitchFlowRemoved.class, + new NxAugMatchNotifSwitchFlowRemovedBuilder().setNxmOfArpSpa(value).build(), key); + default: + throw new CodecPreconditionException(path); + } + } + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava#convert + * (org + * .opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general + * .rev140714.general.extension.grouping.Extension) + */ + @Override + public MatchEntries convert(Extension extension) { + Optional matchGrouping = MatchUtil.arpSpaResolver.getExtension(extension); + if (!matchGrouping.isPresent()) { + throw new CodecPreconditionException(extension); + } + Long value = IpConverter.Ipv4AddressToLong(matchGrouping.get().getNxmOfArpSpa().getIpv4Address()); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder().setArpSpaValues(new ArpSpaValuesBuilder() + .setValue(value).build()); + return MatchUtil + .createNiciraMatchEntries( + Nxm0Class.class, + org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmOfArpSpa.class, + false, augNxMatchBuilder.build()); + } + +} diff --git a/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/ArpThaConvertor.java b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/ArpThaConvertor.java new file mode 100644 index 0000000000..4f91363e00 --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/ArpThaConvertor.java @@ -0,0 +1,101 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match; + +import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava; +import org.opendaylight.openflowplugin.extension.api.ExtensionAugment; +import org.opendaylight.openflowplugin.extension.api.path.MatchPath; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.CodecPreconditionException; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.nx.match.arp.tha.grouping.ArpThaValues; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.nx.match.arp.tha.grouping.ArpThaValuesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketIn; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketInBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemoved; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemovedBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStats; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStatsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxArpThaGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxArpThaKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.nx.arp.tha.grouping.NxmNxArpTha; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.nx.arp.tha.grouping.NxmNxArpThaBuilder; +import org.opendaylight.yangtools.yang.binding.Augmentation; + +import com.google.common.base.Optional; + +/** + * @author msunal + * + */ +public class ArpThaConvertor implements ConvertorToOFJava, ConvertorFromOFJava { + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava#convert + * (org.opendaylight.yangtools.yang.binding.DataContainer, + * org.opendaylight.openflowplugin.extension.api.path.AugmentationPath) + */ + @Override + public ExtensionAugment> convert(MatchEntries input, MatchPath path) { + ArpThaValues values = input.getAugmentation(OfjAugNxMatch.class).getArpThaValues(); + return resolveAugmentation(new NxmNxArpThaBuilder().setMacAddress(values.getMacAddress()).build(), path, + NxmNxArpThaKey.class); + } + + private static ExtensionAugment> resolveAugmentation(NxmNxArpTha value, + MatchPath path, Class key) { + switch (path) { + case FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifUpdateFlowStats.class, + new NxAugMatchNotifUpdateFlowStatsBuilder().setNxmNxArpTha(value).build(), key); + case PACKETRECEIVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifPacketIn.class, new NxAugMatchNotifPacketInBuilder() + .setNxmNxArpTha(value).build(), key); + case SWITCHFLOWREMOVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifSwitchFlowRemoved.class, + new NxAugMatchNotifSwitchFlowRemovedBuilder().setNxmNxArpTha(value).build(), key); + default: + throw new CodecPreconditionException(path); + } + } + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava#convert + * (org + * .opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general + * .rev140714.general.extension.grouping.Extension) + */ + @Override + public MatchEntries convert(Extension extension) { + Optional matchGrouping = MatchUtil.arpThaResolver.getExtension(extension); + if (!matchGrouping.isPresent()) { + throw new CodecPreconditionException(extension); + } + MacAddress macAddress = matchGrouping.get().getNxmNxArpTha().getMacAddress(); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder().setArpThaValues(new ArpThaValuesBuilder() + .setMacAddress(macAddress).build()); + return MatchUtil + .createNiciraMatchEntries( + Nxm1Class.class, + org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxArpTha.class, + false, augNxMatchBuilder.build()); + } + +} diff --git a/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/ArpTpaConvertor.java b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/ArpTpaConvertor.java new file mode 100644 index 0000000000..1d085375e3 --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/ArpTpaConvertor.java @@ -0,0 +1,103 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match; + +import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava; +import org.opendaylight.openflowplugin.extension.api.ExtensionAugment; +import org.opendaylight.openflowplugin.extension.api.path.MatchPath; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.CodecPreconditionException; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.IpConverter; +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.openflow.oxm.rev130731.Nxm0Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.of.match.arp.tpa.grouping.ArpTpaValues; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.of.match.arp.tpa.grouping.ArpTpaValuesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketIn; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketInBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemoved; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemovedBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStats; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStatsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpTpaGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpTpaKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.of.arp.tpa.grouping.NxmOfArpTpa; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.of.arp.tpa.grouping.NxmOfArpTpaBuilder; +import org.opendaylight.yangtools.yang.binding.Augmentation; + +import com.google.common.base.Optional; + +/** + * @author msunal + * + */ +public class ArpTpaConvertor implements ConvertorToOFJava, ConvertorFromOFJava { + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava#convert + * (org.opendaylight.yangtools.yang.binding.DataContainer, + * org.opendaylight.openflowplugin.extension.api.path.AugmentationPath) + */ + @Override + public ExtensionAugment> convert(MatchEntries input, MatchPath path) { + ArpTpaValues values = input.getAugmentation(OfjAugNxMatch.class).getArpTpaValues(); + Ipv4Address ipv4Address = IpConverter.longToIpv4Address(values.getValue()); + return resolveAugmentation(new NxmOfArpTpaBuilder().setIpv4Address(ipv4Address).build(), path, + NxmOfArpTpaKey.class); + } + + private static ExtensionAugment> resolveAugmentation(NxmOfArpTpa value, + MatchPath path, Class key) { + switch (path) { + case FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifUpdateFlowStats.class, + new NxAugMatchNotifUpdateFlowStatsBuilder().setNxmOfArpTpa(value).build(), key); + case PACKETRECEIVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifPacketIn.class, new NxAugMatchNotifPacketInBuilder() + .setNxmOfArpTpa(value).build(), key); + case SWITCHFLOWREMOVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifSwitchFlowRemoved.class, + new NxAugMatchNotifSwitchFlowRemovedBuilder().setNxmOfArpTpa(value).build(), key); + default: + throw new CodecPreconditionException(path); + } + } + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava#convert + * (org + * .opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general + * .rev140714.general.extension.grouping.Extension) + */ + @Override + public MatchEntries convert(Extension extension) { + Optional matchGrouping = MatchUtil.arpTpaResolver.getExtension(extension); + if (!matchGrouping.isPresent()) { + throw new CodecPreconditionException(extension); + } + Long value = IpConverter.Ipv4AddressToLong(matchGrouping.get().getNxmOfArpTpa().getIpv4Address()); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder().setArpTpaValues(new ArpTpaValuesBuilder() + .setValue(value).build()); + return MatchUtil + .createNiciraMatchEntries( + Nxm0Class.class, + org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmOfArpTpa.class, + false, augNxMatchBuilder.build()); + } + +} diff --git a/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/EthDstConvertor.java b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/EthDstConvertor.java new file mode 100644 index 0000000000..e64d28525d --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/EthDstConvertor.java @@ -0,0 +1,101 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match; + +import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava; +import org.opendaylight.openflowplugin.extension.api.ExtensionAugment; +import org.opendaylight.openflowplugin.extension.api.path.MatchPath; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.CodecPreconditionException; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm0Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.of.match.eth.dst.grouping.EthDstValues; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.of.match.eth.dst.grouping.EthDstValuesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketIn; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketInBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemoved; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemovedBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStats; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStatsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthDstGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthDstKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.of.eth.dst.grouping.NxmOfEthDst; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.of.eth.dst.grouping.NxmOfEthDstBuilder; +import org.opendaylight.yangtools.yang.binding.Augmentation; + +import com.google.common.base.Optional; + +/** + * @author msunal + * + */ +public class EthDstConvertor implements ConvertorToOFJava, ConvertorFromOFJava { + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava#convert + * (org.opendaylight.yangtools.yang.binding.DataContainer, + * org.opendaylight.openflowplugin.extension.api.path.AugmentationPath) + */ + @Override + public ExtensionAugment> convert(MatchEntries input, MatchPath path) { + EthDstValues values = input.getAugmentation(OfjAugNxMatch.class).getEthDstValues(); + return resolveAugmentation(new NxmOfEthDstBuilder().setMacAddress(values.getMacAddress()).build(), path, + NxmOfEthDstKey.class); + } + + private static ExtensionAugment> resolveAugmentation(NxmOfEthDst value, + MatchPath path, Class key) { + switch (path) { + case FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifUpdateFlowStats.class, + new NxAugMatchNotifUpdateFlowStatsBuilder().setNxmOfEthDst(value).build(), key); + case PACKETRECEIVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifPacketIn.class, new NxAugMatchNotifPacketInBuilder() + .setNxmOfEthDst(value).build(), key); + case SWITCHFLOWREMOVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifSwitchFlowRemoved.class, + new NxAugMatchNotifSwitchFlowRemovedBuilder().setNxmOfEthDst(value).build(), key); + default: + throw new CodecPreconditionException(path); + } + } + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava#convert + * (org + * .opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general + * .rev140714.general.extension.grouping.Extension) + */ + @Override + public MatchEntries convert(Extension extension) { + Optional matchGrouping = MatchUtil.ethDstResolver.getExtension(extension); + if (!matchGrouping.isPresent()) { + throw new CodecPreconditionException(extension); + } + MacAddress macAddress = matchGrouping.get().getNxmOfEthDst().getMacAddress(); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder().setEthDstValues(new EthDstValuesBuilder() + .setMacAddress(macAddress).build()); + return MatchUtil + .createNiciraMatchEntries( + Nxm0Class.class, + org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmOfEthDst.class, + false, augNxMatchBuilder.build()); + } + +} diff --git a/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/EthSrcConvertor.java b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/EthSrcConvertor.java new file mode 100644 index 0000000000..41a55780bf --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/EthSrcConvertor.java @@ -0,0 +1,101 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match; + +import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava; +import org.opendaylight.openflowplugin.extension.api.ExtensionAugment; +import org.opendaylight.openflowplugin.extension.api.path.MatchPath; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.CodecPreconditionException; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm0Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.of.match.eth.src.grouping.EthSrcValues; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.of.match.eth.src.grouping.EthSrcValuesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketIn; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketInBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemoved; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemovedBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStats; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStatsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthSrcGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthSrcKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.of.eth.src.grouping.NxmOfEthSrc; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.of.eth.src.grouping.NxmOfEthSrcBuilder; +import org.opendaylight.yangtools.yang.binding.Augmentation; + +import com.google.common.base.Optional; + +/** + * @author msunal + * + */ +public class EthSrcConvertor implements ConvertorToOFJava, ConvertorFromOFJava { + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava#convert + * (org.opendaylight.yangtools.yang.binding.DataContainer, + * org.opendaylight.openflowplugin.extension.api.path.AugmentationPath) + */ + @Override + public ExtensionAugment> convert(MatchEntries input, MatchPath path) { + EthSrcValues values = input.getAugmentation(OfjAugNxMatch.class).getEthSrcValues(); + return resolveAugmentation(new NxmOfEthSrcBuilder().setMacAddress(values.getMacAddress()).build(), path, + NxmOfEthSrcKey.class); + } + + private static ExtensionAugment> resolveAugmentation(NxmOfEthSrc value, + MatchPath path, Class key) { + switch (path) { + case FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifUpdateFlowStats.class, + new NxAugMatchNotifUpdateFlowStatsBuilder().setNxmOfEthSrc(value).build(), key); + case PACKETRECEIVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifPacketIn.class, new NxAugMatchNotifPacketInBuilder() + .setNxmOfEthSrc(value).build(), key); + case SWITCHFLOWREMOVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifSwitchFlowRemoved.class, + new NxAugMatchNotifSwitchFlowRemovedBuilder().setNxmOfEthSrc(value).build(), key); + default: + throw new CodecPreconditionException(path); + } + } + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava#convert + * (org + * .opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general + * .rev140714.general.extension.grouping.Extension) + */ + @Override + public MatchEntries convert(Extension extension) { + Optional matchGrouping = MatchUtil.ethSrcResolver.getExtension(extension); + if (!matchGrouping.isPresent()) { + throw new CodecPreconditionException(extension); + } + MacAddress macAddress = matchGrouping.get().getNxmOfEthSrc().getMacAddress(); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder().setEthSrcValues(new EthSrcValuesBuilder() + .setMacAddress(macAddress).build()); + return MatchUtil + .createNiciraMatchEntries( + Nxm0Class.class, + org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmOfEthSrc.class, + false, augNxMatchBuilder.build()); + } + +} diff --git a/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/EthTypeConvertor.java b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/EthTypeConvertor.java new file mode 100644 index 0000000000..39d7a75cd2 --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/EthTypeConvertor.java @@ -0,0 +1,100 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match; + +import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava; +import org.opendaylight.openflowplugin.extension.api.ExtensionAugment; +import org.opendaylight.openflowplugin.extension.api.path.MatchPath; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.CodecPreconditionException; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm0Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.of.match.eth.type.grouping.EthTypeValues; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.of.match.eth.type.grouping.EthTypeValuesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketIn; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketInBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemoved; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemovedBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStats; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStatsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthTypeGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthTypeKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.of.eth.type.grouping.NxmOfEthType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.of.eth.type.grouping.NxmOfEthTypeBuilder; +import org.opendaylight.yangtools.yang.binding.Augmentation; + +import com.google.common.base.Optional; + +/** + * @author msunal + * + */ +public class EthTypeConvertor implements ConvertorToOFJava, ConvertorFromOFJava { + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava#convert + * (org.opendaylight.yangtools.yang.binding.DataContainer, + * org.opendaylight.openflowplugin.extension.api.path.AugmentationPath) + */ + @Override + public ExtensionAugment> convert(MatchEntries input, MatchPath path) { + EthTypeValues values = input.getAugmentation(OfjAugNxMatch.class).getEthTypeValues(); + return resolveAugmentation(new NxmOfEthTypeBuilder().setValue(values.getValue()).build(), path, + NxmOfEthTypeKey.class); + } + + private static ExtensionAugment> resolveAugmentation(NxmOfEthType value, + MatchPath path, Class key) { + switch (path) { + case FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifUpdateFlowStats.class, + new NxAugMatchNotifUpdateFlowStatsBuilder().setNxmOfEthType(value).build(), key); + case PACKETRECEIVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifPacketIn.class, new NxAugMatchNotifPacketInBuilder() + .setNxmOfEthType(value).build(), key); + case SWITCHFLOWREMOVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifSwitchFlowRemoved.class, + new NxAugMatchNotifSwitchFlowRemovedBuilder().setNxmOfEthType(value).build(), key); + default: + throw new CodecPreconditionException(path); + } + } + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava#convert + * (org + * .opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general + * .rev140714.general.extension.grouping.Extension) + */ + @Override + public MatchEntries convert(Extension extension) { + Optional matchGrouping = MatchUtil.ethTypeResolver.getExtension(extension); + if (!matchGrouping.isPresent()) { + throw new CodecPreconditionException(extension); + } + Integer value = matchGrouping.get().getNxmOfEthType().getValue(); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder().setEthTypeValues(new EthTypeValuesBuilder() + .setValue(value).build()); + return MatchUtil + .createNiciraMatchEntries( + Nxm0Class.class, + org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmOfEthType.class, + false, augNxMatchBuilder.build()); + } + +} diff --git a/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/MatchUtil.java b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/MatchUtil.java new file mode 100644 index 0000000000..3ba9bbe95d --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/MatchUtil.java @@ -0,0 +1,114 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match; + +import java.util.HashSet; +import java.util.Set; + +import org.opendaylight.openflowjava.nx.api.NiciraConstants; +import org.opendaylight.openflowplugin.extension.api.GroupingResolver; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdMatchEntry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdMatchEntryBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNodesNodeTableFlow; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketIn; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemoved; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStats; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchRpcAddFlow; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchRpcRemoveFlow; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchRpcUpdateFlowOriginal; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchRpcUpdateFlowUpdated; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxArpShaGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxArpThaGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxRegGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIdGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIpv4DstGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIpv4SrcGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpOpGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpSpaGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfArpTpaGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthDstGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthSrcGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmOfEthTypeGrouping; +import org.opendaylight.yangtools.yang.binding.Augmentation; + +/** + * @author msunal + * + */ +public class MatchUtil { + + private final static Set>> augmentationsOfExtension = new HashSet<>(); + public final static GroupingResolver regResolver = new GroupingResolver<>( + NxmNxRegGrouping.class); + public final static GroupingResolver tunIdResolver = new GroupingResolver<>( + NxmNxTunIdGrouping.class); + public final static GroupingResolver arpShaResolver = new GroupingResolver<>( + NxmNxArpShaGrouping.class); + public final static GroupingResolver arpThaResolver = new GroupingResolver<>( + NxmNxArpThaGrouping.class); + public final static GroupingResolver arpOpResolver = new GroupingResolver<>( + NxmOfArpOpGrouping.class); + public final static GroupingResolver arpSpaResolver = new GroupingResolver<>( + NxmOfArpSpaGrouping.class); + public final static GroupingResolver arpTpaResolver = new GroupingResolver<>( + NxmOfArpTpaGrouping.class); + public final static GroupingResolver tunIpv4DstResolver = new GroupingResolver<>( + NxmNxTunIpv4DstGrouping.class); + public final static GroupingResolver tunIpv4SrcResolver = new GroupingResolver<>( + NxmNxTunIpv4SrcGrouping.class); + public final static GroupingResolver ethDstResolver = new GroupingResolver<>( + NxmOfEthDstGrouping.class); + public final static GroupingResolver ethSrcResolver = new GroupingResolver<>( + NxmOfEthSrcGrouping.class); + public final static GroupingResolver ethTypeResolver = new GroupingResolver<>( + NxmOfEthTypeGrouping.class); + public final static ExperimenterIdMatchEntry EXPERIMENTER_ID_MATCH_ENTRY; + + static { + augmentationsOfExtension.add(NxAugMatchRpcAddFlow.class); + augmentationsOfExtension.add(NxAugMatchRpcRemoveFlow.class); + augmentationsOfExtension.add(NxAugMatchRpcUpdateFlowOriginal.class); + augmentationsOfExtension.add(NxAugMatchRpcUpdateFlowUpdated.class); + augmentationsOfExtension.add(NxAugMatchNodesNodeTableFlow.class); + augmentationsOfExtension.add(NxAugMatchNotifSwitchFlowRemoved.class); + augmentationsOfExtension.add(NxAugMatchNotifPacketIn.class); + augmentationsOfExtension.add(NxAugMatchNotifUpdateFlowStats.class); + regResolver.setAugmentations(augmentationsOfExtension); + tunIdResolver.setAugmentations(augmentationsOfExtension); + arpShaResolver.setAugmentations(augmentationsOfExtension); + arpThaResolver.setAugmentations(augmentationsOfExtension); + arpOpResolver.setAugmentations(augmentationsOfExtension); + arpSpaResolver.setAugmentations(augmentationsOfExtension); + arpTpaResolver.setAugmentations(augmentationsOfExtension); + tunIpv4DstResolver.setAugmentations(augmentationsOfExtension); + tunIpv4SrcResolver.setAugmentations(augmentationsOfExtension); + ethDstResolver.setAugmentations(augmentationsOfExtension); + ethSrcResolver.setAugmentations(augmentationsOfExtension); + ethTypeResolver.setAugmentations(augmentationsOfExtension); + ExperimenterIdMatchEntryBuilder experimenterIdMatchEntryBuilder = new ExperimenterIdMatchEntryBuilder(); + experimenterIdMatchEntryBuilder.setExperimenter(new ExperimenterId(NiciraConstants.NX_VENDOR_ID)); + EXPERIMENTER_ID_MATCH_ENTRY = experimenterIdMatchEntryBuilder.build(); + } + + public static MatchEntries createNiciraMatchEntries(Class oxmClass, + Class oxmMatchField, boolean hasMask, OfjAugNxMatch augNxMatch) { + MatchEntriesBuilder matchEntriesBuilder = new MatchEntriesBuilder(); + matchEntriesBuilder.setOxmClass(oxmClass).setOxmMatchField(oxmMatchField).setHasMask(hasMask); + matchEntriesBuilder.addAugmentation(ExperimenterIdMatchEntry.class, EXPERIMENTER_ID_MATCH_ENTRY); + matchEntriesBuilder.addAugmentation(OfjAugNxMatch.class, augNxMatch); + return matchEntriesBuilder.build(); + } + +} diff --git a/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/RegConvertor.java b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/RegConvertor.java new file mode 100644 index 0000000000..e1d577ab0f --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/RegConvertor.java @@ -0,0 +1,148 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match; + +import org.opendaylight.openflowjava.nx.NiciraMatchCodecs; +import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava; +import org.opendaylight.openflowplugin.extension.api.ExtensionAugment; +import org.opendaylight.openflowplugin.extension.api.path.MatchPath; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.CodecPreconditionException; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.nx.match.reg.grouping.RegValuesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketIn; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketInBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemoved; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemovedBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStats; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStatsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg0Key; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg1Key; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg2Key; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg3Key; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg4Key; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg5Key; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg6Key; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxReg7Key; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxRegGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.nx.reg.grouping.NxmNxReg; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.nx.reg.grouping.NxmNxRegBuilder; +import org.opendaylight.yangtools.yang.binding.Augmentation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.base.Optional; + +/** + * @author msunal + * + */ +public class RegConvertor implements ConvertorToOFJava, ConvertorFromOFJava { + + private final static Logger LOG = LoggerFactory.getLogger(RegConvertor.class); + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava#convert + * (org.opendaylight.yangtools.yang.binding.DataContainer, + * org.opendaylight.openflowplugin.extension.api.path.AugmentationPath) + */ + @SuppressWarnings("unchecked") + @Override + public ExtensionAugment> convert(MatchEntries input, MatchPath path) { + NxmNxRegBuilder nxRegBuilder = new NxmNxRegBuilder(); + if (!org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg.class + .isAssignableFrom(input.getOxmMatchField())) { + String msg = input.getOxmMatchField() + + " does not implement " + + org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg.class; + LOG.warn(msg); + throw new IllegalStateException(msg); + } + nxRegBuilder + .setReg((Class) input + .getOxmMatchField()); + nxRegBuilder.setValue(input.getAugmentation(OfjAugNxMatch.class).getRegValues().getValue()); + return resolveAugmentation(nxRegBuilder.build(), path, resolveRegKey(input.getOxmMatchField())); + } + + private static Class resolveRegKey(Class oxmMatchField) { + if (NiciraMatchCodecs.REG0_CODEC.getNxmField().isAssignableFrom(oxmMatchField)) { + return NxmNxReg0Key.class; + } + if (NiciraMatchCodecs.REG1_CODEC.getNxmField().isAssignableFrom(oxmMatchField)) { + return NxmNxReg1Key.class; + } + if (NiciraMatchCodecs.REG2_CODEC.getNxmField().isAssignableFrom(oxmMatchField)) { + return NxmNxReg2Key.class; + } + if (NiciraMatchCodecs.REG3_CODEC.getNxmField().isAssignableFrom(oxmMatchField)) { + return NxmNxReg3Key.class; + } + if (NiciraMatchCodecs.REG4_CODEC.getNxmField().isAssignableFrom(oxmMatchField)) { + return NxmNxReg4Key.class; + } + if (NiciraMatchCodecs.REG5_CODEC.getNxmField().isAssignableFrom(oxmMatchField)) { + return NxmNxReg5Key.class; + } + if (NiciraMatchCodecs.REG6_CODEC.getNxmField().isAssignableFrom(oxmMatchField)) { + return NxmNxReg6Key.class; + } + if (NiciraMatchCodecs.REG7_CODEC.getNxmField().isAssignableFrom(oxmMatchField)) { + return NxmNxReg7Key.class; + } + throw new CodecPreconditionException("There is no key for " + oxmMatchField); + } + + private static ExtensionAugment> resolveAugmentation(NxmNxReg nxmNxReg, + MatchPath path, Class key) { + switch (path) { + case FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifUpdateFlowStats.class, + new NxAugMatchNotifUpdateFlowStatsBuilder().setNxmNxReg(nxmNxReg).build(), key); + case PACKETRECEIVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifPacketIn.class, new NxAugMatchNotifPacketInBuilder() + .setNxmNxReg(nxmNxReg).build(), key); + case SWITCHFLOWREMOVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifSwitchFlowRemoved.class, + new NxAugMatchNotifSwitchFlowRemovedBuilder().setNxmNxReg(nxmNxReg).build(), key); + default: + throw new CodecPreconditionException(path); + } + } + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava#convert + * (org + * .opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general + * .rev140714.general.extension.grouping.Extension) + */ + @Override + public MatchEntries convert(Extension extension) { + Optional matchGrouping = MatchUtil.regResolver.getExtension(extension); + if (!matchGrouping.isPresent()) { + throw new CodecPreconditionException(extension); + } + NxmNxReg nxmNxReg = matchGrouping.get().getNxmNxReg(); + RegValuesBuilder regValuesBuilder = new RegValuesBuilder().setValue(nxmNxReg.getValue()); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder().setRegValues(regValuesBuilder.build()); + return MatchUtil.createNiciraMatchEntries(Nxm1Class.class, nxmNxReg.getReg(), false, augNxMatchBuilder.build()); + } + +} diff --git a/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/TunIdConvertor.java b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/TunIdConvertor.java new file mode 100644 index 0000000000..0ac442ae1c --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/TunIdConvertor.java @@ -0,0 +1,102 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match; + +import java.math.BigInteger; + +import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava; +import org.opendaylight.openflowplugin.extension.api.ExtensionAugment; +import org.opendaylight.openflowplugin.extension.api.path.MatchPath; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.CodecPreconditionException; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.nx.match.tun.id.grouping.TunIdValues; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.nx.match.tun.id.grouping.TunIdValuesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketIn; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketInBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemoved; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemovedBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStats; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStatsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIdGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIdKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.nx.tun.id.grouping.NxmNxTunId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.nx.tun.id.grouping.NxmNxTunIdBuilder; +import org.opendaylight.yangtools.yang.binding.Augmentation; + +import com.google.common.base.Optional; + +/** + * @author msunal + * + */ +public class TunIdConvertor implements ConvertorToOFJava, ConvertorFromOFJava { + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava#convert + * (org.opendaylight.yangtools.yang.binding.DataContainer, + * org.opendaylight.openflowplugin.extension.api.path.AugmentationPath) + */ + @Override + public ExtensionAugment> convert(MatchEntries input, MatchPath path) { + TunIdValues values = input.getAugmentation(OfjAugNxMatch.class).getTunIdValues(); + return resolveAugmentation(new NxmNxTunIdBuilder().setValue(values.getValue()).build(), path, + NxmNxTunIdKey.class); + } + + private static ExtensionAugment> resolveAugmentation(NxmNxTunId value, + MatchPath path, Class key) { + switch (path) { + case FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifUpdateFlowStats.class, + new NxAugMatchNotifUpdateFlowStatsBuilder().setNxmNxTunId(value).build(), key); + case PACKETRECEIVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifPacketIn.class, new NxAugMatchNotifPacketInBuilder() + .setNxmNxTunId(value).build(), key); + case SWITCHFLOWREMOVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifSwitchFlowRemoved.class, + new NxAugMatchNotifSwitchFlowRemovedBuilder().setNxmNxTunId(value).build(), key); + default: + throw new CodecPreconditionException(path); + } + } + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava#convert + * (org + * .opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general + * .rev140714.general.extension.grouping.Extension) + */ + @Override + public MatchEntries convert(Extension extension) { + Optional matchGrouping = MatchUtil.tunIdResolver.getExtension(extension); + if (!matchGrouping.isPresent()) { + throw new CodecPreconditionException(extension); + } + BigInteger value = matchGrouping.get().getNxmNxTunId().getValue(); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder().setTunIdValues(new TunIdValuesBuilder() + .setValue(value).build()); + return MatchUtil + .createNiciraMatchEntries( + Nxm1Class.class, + org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxTunId.class, + false, augNxMatchBuilder.build()); + } + +} diff --git a/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/TunIpv4DstConvertor.java b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/TunIpv4DstConvertor.java new file mode 100644 index 0000000000..7b01ca24bf --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/TunIpv4DstConvertor.java @@ -0,0 +1,105 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match; + +import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava; +import org.opendaylight.openflowplugin.extension.api.ExtensionAugment; +import org.opendaylight.openflowplugin.extension.api.path.MatchPath; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.CodecPreconditionException; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.IpConverter; +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.openflow.oxm.rev130731.Nxm1Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.nx.match.tun.ipv4.dst.grouping.TunIpv4DstValues; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.nx.match.tun.ipv4.dst.grouping.TunIpv4DstValuesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketIn; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketInBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemoved; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemovedBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStats; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStatsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIpv4DstGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIpv4DstKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.nx.tun.ipv4.dst.grouping.NxmNxTunIpv4Dst; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.nx.tun.ipv4.dst.grouping.NxmNxTunIpv4DstBuilder; +import org.opendaylight.yangtools.yang.binding.Augmentation; + +import com.google.common.base.Optional; + +/** + * @author msunal + * + */ +public class TunIpv4DstConvertor implements ConvertorToOFJava, + ConvertorFromOFJava { + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava#convert + * (org.opendaylight.yangtools.yang.binding.DataContainer, + * org.opendaylight.openflowplugin.extension.api.path.AugmentationPath) + */ + @Override + public ExtensionAugment> convert(MatchEntries input, MatchPath path) { + TunIpv4DstValues values = input.getAugmentation(OfjAugNxMatch.class).getTunIpv4DstValues(); + Ipv4Address ipv4Address = IpConverter.longToIpv4Address(values.getValue()); + return resolveAugmentation(new NxmNxTunIpv4DstBuilder().setIpv4Address(ipv4Address).build(), path, + NxmNxTunIpv4DstKey.class); + } + + private static ExtensionAugment> resolveAugmentation(NxmNxTunIpv4Dst value, + MatchPath path, Class key) { + switch (path) { + case FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifUpdateFlowStats.class, + new NxAugMatchNotifUpdateFlowStatsBuilder().setNxmNxTunIpv4Dst(value).build(), key); + case PACKETRECEIVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifPacketIn.class, new NxAugMatchNotifPacketInBuilder() + .setNxmNxTunIpv4Dst(value).build(), key); + case SWITCHFLOWREMOVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifSwitchFlowRemoved.class, + new NxAugMatchNotifSwitchFlowRemovedBuilder().setNxmNxTunIpv4Dst(value).build(), key); + default: + throw new CodecPreconditionException(path); + } + } + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava#convert + * (org + * .opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general + * .rev140714.general.extension.grouping.Extension) + */ + @Override + public MatchEntries convert(Extension extension) { + Optional matchGrouping = MatchUtil.tunIpv4DstResolver.getExtension(extension); + if (!matchGrouping.isPresent()) { + throw new CodecPreconditionException(extension); + } + long ipv4AddressAsLong = IpConverter.Ipv4AddressToLong((matchGrouping.get().getNxmNxTunIpv4Dst() + .getIpv4Address())); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder() + .setTunIpv4DstValues(new TunIpv4DstValuesBuilder().setValue(ipv4AddressAsLong).build()); + return MatchUtil + .createNiciraMatchEntries( + Nxm1Class.class, + org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxTunIpv4Dst.class, + false, augNxMatchBuilder.build()); + } + +} diff --git a/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/TunIpv4SrcConvertor.java b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/TunIpv4SrcConvertor.java new file mode 100644 index 0000000000..64979a3646 --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/openflowplugin/extension/vendor/nicira/convertor/match/TunIpv4SrcConvertor.java @@ -0,0 +1,105 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.match; + +import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava; +import org.opendaylight.openflowplugin.extension.api.ExtensionAugment; +import org.opendaylight.openflowplugin.extension.api.path.MatchPath; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.CodecPreconditionException; +import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.IpConverter; +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.openflow.oxm.rev130731.Nxm1Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.nx.match.tun.ipv4.src.grouping.TunIpv4SrcValues; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.ofj.nxm.nx.match.tun.ipv4.src.grouping.TunIpv4SrcValuesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketIn; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifPacketInBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemoved; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifSwitchFlowRemovedBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStats; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNotifUpdateFlowStatsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIpv4SrcGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxmNxTunIpv4SrcKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.nx.tun.ipv4.src.grouping.NxmNxTunIpv4Src; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.nx.tun.ipv4.src.grouping.NxmNxTunIpv4SrcBuilder; +import org.opendaylight.yangtools.yang.binding.Augmentation; + +import com.google.common.base.Optional; + +/** + * @author msunal + * + */ +public class TunIpv4SrcConvertor implements ConvertorToOFJava, + ConvertorFromOFJava { + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava#convert + * (org.opendaylight.yangtools.yang.binding.DataContainer, + * org.opendaylight.openflowplugin.extension.api.path.AugmentationPath) + */ + @Override + public ExtensionAugment> convert(MatchEntries input, MatchPath path) { + TunIpv4SrcValues values = input.getAugmentation(OfjAugNxMatch.class).getTunIpv4SrcValues(); + Ipv4Address ipv4Address = IpConverter.longToIpv4Address(values.getValue()); + return resolveAugmentation(new NxmNxTunIpv4SrcBuilder().setIpv4Address(ipv4Address).build(), path, + NxmNxTunIpv4SrcKey.class); + } + + private static ExtensionAugment> resolveAugmentation(NxmNxTunIpv4Src value, + MatchPath path, Class key) { + switch (path) { + case FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifUpdateFlowStats.class, + new NxAugMatchNotifUpdateFlowStatsBuilder().setNxmNxTunIpv4Src(value).build(), key); + case PACKETRECEIVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifPacketIn.class, new NxAugMatchNotifPacketInBuilder() + .setNxmNxTunIpv4Src(value).build(), key); + case SWITCHFLOWREMOVED_MATCH: + return new ExtensionAugment<>(NxAugMatchNotifSwitchFlowRemoved.class, + new NxAugMatchNotifSwitchFlowRemovedBuilder().setNxmNxTunIpv4Src(value).build(), key); + default: + throw new CodecPreconditionException(path); + } + } + + /* + * (non-Javadoc) + * + * @see + * org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava#convert + * (org + * .opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general + * .rev140714.general.extension.grouping.Extension) + */ + @Override + public MatchEntries convert(Extension extension) { + Optional matchGrouping = MatchUtil.tunIpv4SrcResolver.getExtension(extension); + if (!matchGrouping.isPresent()) { + throw new CodecPreconditionException(extension); + } + long ipv4AddressAsLong = IpConverter.Ipv4AddressToLong(matchGrouping.get().getNxmNxTunIpv4Src() + .getIpv4Address()); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder() + .setTunIpv4SrcValues(new TunIpv4SrcValuesBuilder().setValue(ipv4AddressAsLong).build()); + return MatchUtil + .createNiciraMatchEntries( + Nxm1Class.class, + org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxTunIpv4Src.class, + false, augNxMatchBuilder.build()); + } + +} diff --git a/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/nx/config/impl/rev140711/ConfigurableNiciraExtensionProviderModule.java b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/nx/config/impl/rev140711/ConfigurableNiciraExtensionProviderModule.java new file mode 100644 index 0000000000..5c1f41bfa7 --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/nx/config/impl/rev140711/ConfigurableNiciraExtensionProviderModule.java @@ -0,0 +1,29 @@ +package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.nx.config.impl.rev140711; + +import org.opendaylight.openflowplugin.extension.api.ExtensionConverterRegistrator; +import org.opendaylight.openflowplugin.extension.vendor.nicira.NiciraExtensionProvider; + +public class ConfigurableNiciraExtensionProviderModule extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.nx.config.impl.rev140711.AbstractConfigurableNiciraExtensionProviderModule { + public ConfigurableNiciraExtensionProviderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } + + public ConfigurableNiciraExtensionProviderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.nx.config.impl.rev140711.ConfigurableNiciraExtensionProviderModule oldModule, java.lang.AutoCloseable oldInstance) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } + + @Override + public void customValidation() { + // add custom validation form module attributes here. + } + + @Override + public java.lang.AutoCloseable createInstance() { + NiciraExtensionProvider provider = new NiciraExtensionProvider(); + ExtensionConverterRegistrator registrator = getOpenflowPluginProviderDependency().getExtensionConverterRegistrator(); + provider.setExtensionConverterRegistrator(registrator); + provider.registerConverters(); + return provider; + } + +} diff --git a/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/nx/config/impl/rev140711/ConfigurableNiciraExtensionProviderModuleFactory.java b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/nx/config/impl/rev140711/ConfigurableNiciraExtensionProviderModuleFactory.java new file mode 100644 index 0000000000..32ead6cce2 --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/openflowplugin/nx/config/impl/rev140711/ConfigurableNiciraExtensionProviderModuleFactory.java @@ -0,0 +1,13 @@ +/* +* Generated file +* +* Generated from: yang module name: nicira-extension-impl yang module local name: nicira-extension-provider-impl +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Fri Aug 01 14:44:34 CEST 2014 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.nx.config.impl.rev140711; +public class ConfigurableNiciraExtensionProviderModuleFactory extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.nx.config.impl.rev140711.AbstractConfigurableNiciraExtensionProviderModuleFactory { + +} diff --git a/extension/openflowplugin-extension-nicira/src/main/resources/initial/44-nicira-extension.xml b/extension/openflowplugin-extension-nicira/src/main/resources/initial/44-nicira-extension.xml new file mode 100644 index 0000000000..8ab4fd9a49 --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/resources/initial/44-nicira-extension.xml @@ -0,0 +1,34 @@ + + + + + + urn:opendaylight:params:xml:ns:yang:openflowplugin:nx:config:impl?module=nicira-extension-impl&revision=2014-07-11 + + urn:opendaylight:params:xml:ns:yang:openflow:common:config?module=openflow-provider&revision=2014-03-26 + + + + + + + + prefix:nicira-extension-provider-impl + nicira-extension-provider-default-impl + + + opfprov:openflow-provider + openflow-provider + + + + + + + diff --git a/extension/openflowplugin-extension-nicira/src/main/yang/nicira-exension-cfg.yang b/extension/openflowplugin-extension-nicira/src/main/yang/nicira-exension-cfg.yang new file mode 100644 index 0000000000..176a9917f0 --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/yang/nicira-exension-cfg.yang @@ -0,0 +1,20 @@ +module nicira-extension { + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:controller:config:openflowplugin:nx:config"; + prefix "niciraExt-cfg"; + + import config {prefix config; revision-date 2013-04-05; } + + description + "openflow extension for nicira - config"; + + revision "2014-07-11" { + description + "Initial revision"; + } + + identity nicira-extension-provider { + base config:service-type; + config:java-class "org.opendaylight.openflowplugin.extension.vendor.nicira.NiciraExtensionProvider"; + } +} \ No newline at end of file diff --git a/extension/openflowplugin-extension-nicira/src/main/yang/nicira-extension-cfg-impl.yang b/extension/openflowplugin-extension-nicira/src/main/yang/nicira-extension-cfg-impl.yang new file mode 100644 index 0000000000..27b5a26db4 --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/yang/nicira-extension-cfg-impl.yang @@ -0,0 +1,38 @@ +module nicira-extension-impl { + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:openflowplugin:nx:config:impl"; + prefix "niciraExt-cfg-impl"; + + import config {prefix config; revision-date 2013-04-05;} + import openflow-provider {prefix openflow-provider; revision-date 2014-03-26;} + import nicira-extension {prefix niciraExt-provider;} + + description + "openflow extension for nicira - config-impl"; + + revision "2014-07-11" { + description + "Initial revision"; + } + + identity nicira-extension-provider-impl { + base config:module-type; + config:provided-service niciraExt-provider:nicira-extension-provider; + config:java-name-prefix ConfigurableNiciraExtensionProvider; + } + + augment "/config:modules/config:module/config:configuration" { + case nicira-extension-provider-impl { + when "/config:modules/config:module/config:type = 'nicira-extension-provider-impl'"; + + container openflow-plugin-provider { + uses config:service-ref { + refine type { + mandatory true; + config:required-identity openflow-provider:openflow-provider; + } + } + } + } + } +} diff --git a/extension/openflowplugin-extension-nicira/src/main/yang/openflowplugin-extension-nicira-action.yang b/extension/openflowplugin-extension-nicira/src/main/yang/openflowplugin-extension-nicira-action.yang new file mode 100644 index 0000000000..be1ff263d8 --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/yang/openflowplugin-extension-nicira-action.yang @@ -0,0 +1,419 @@ +module openflowplugin-extension-nicira-action { + yang-version 1; + + namespace "urn:opendaylight:openflowplugin:extension:nicira:action"; + prefix "openflowplugin-nicira-action"; + + import yang-ext {prefix ext; revision-date "2013-07-09";} + import flow-node-inventory {prefix fni; revision-date 2013-08-19; } + import opendaylight-inventory {prefix inv;revision-date "2013-08-19";} + import sal-flow {prefix sal-flow;revision-date "2013-08-19";} + import sal-group {prefix sal-group;revision-date "2013-09-18";} + import packet-processing {prefix sal-packet;revision-date "2013-07-09";} + import opendaylight-flow-statistics {prefix odl-flow-stats;revision-date "2013-08-19";} + import opendaylight-group-statistics {prefix odl-group-stats;revision-date "2013-11-11";} + import nicira-match {prefix nicira-match;revision-date "2014-04-21";} + import openflowplugin-extension-general {prefix ext-gen;revision-date "2014-07-14";} + import openflow-action {prefix ofaction;revision-date "2013-07-31";} + + description + "Nicira openflow action extensions."; + + revision "2014-07-14" { + description "Initial revision"; + } + + identity nx-action-reg-load-key { + base ext-gen:extension-key; + } + identity nx-action-reg-move-key { + base ext-gen:extension-key; + } + + grouping nxm-nx-reg-grouping { + leaf nx-reg { + type identityref { + base nicira-match:nxm-nx-reg; + } + } + } + grouping nxm-nx-tun-id-grouping { + leaf nx-tun-id { + type empty; + } + } + grouping nxm-nx-arp-sha-grouping { + leaf nx-arp-sha { + type empty; + } + } + grouping nxm-nx-arp-tha-grouping { + leaf nx-arp-tha { + type empty; + } + } + grouping nxm-of-arp-op-grouping { + leaf of-arp-op { + type empty; + } + } + grouping nxm-of-arp-spa-grouping { + leaf of-arp-spa { + type empty; + } + } + grouping nxm-of-arp-tpa-grouping { + leaf of-arp-tpa { + type empty; + } + } + grouping nxm-nx-tun-ipv4-dst-grouping { + leaf nx-tun-ipv4-dst { + type empty; + } + } + grouping nxm-nx-tun-ipv4-src-grouping { + leaf nx-tun-ipv4-src { + type empty; + } + } + grouping nxm-of-eth-src-grouping { + leaf of-eth-src { + type empty; + } + } + grouping nxm-of-eth-dst-grouping { + leaf of-eth-dst { + type empty; + } + } + grouping nxm-of-eth-type-grouping { + leaf of-eth-type { + type empty; + } + } + + grouping dst-choice-grouping { + choice dst-choice { + case dst-nx-reg-case { + uses nxm-nx-reg-grouping; + } + case dst-nx-tun-id-case { + uses nxm-nx-tun-id-grouping; + } + case dst-nx-arp-sha-case { + uses nxm-nx-arp-sha-grouping; + } + case dst-nx-arp-tha-case { + uses nxm-nx-arp-tha-grouping; + } + case dst-of-arp-op-case { + uses nxm-of-arp-op-grouping; + } + case dst-of-arp-spa-case { + uses nxm-of-arp-spa-grouping; + } + case dst-of-arp-tpa-case { + uses nxm-of-arp-tpa-grouping; + } + case dst-nx-tun-ipv4-dst-case { + uses nxm-nx-tun-ipv4-dst-grouping; + } + case dst-nx-tun-ipv4-src-case { + uses nxm-nx-tun-ipv4-src-grouping; + } + case dst-of-eth-src-case { + uses nxm-of-eth-src-grouping; + } + case dst-of-eth-dst-case { + uses nxm-of-eth-dst-grouping; + } + } + } + + grouping src-choice-grouping { + choice src-choice { + case src-nx-reg-case { + uses nxm-nx-reg-grouping; + } + case src-nx-tun-id-case { + uses nxm-nx-tun-id-grouping; + } + case src-nx-arp-sha-case { + uses nxm-nx-arp-sha-grouping; + } + case src-nx-arp-tha-case { + uses nxm-nx-arp-tha-grouping; + } + case src-of-arp-op-case { + uses nxm-of-arp-op-grouping; + } + case src-of-arp-spa-case { + uses nxm-of-arp-spa-grouping; + } + case src-of-arp-tpa-case { + uses nxm-of-arp-tpa-grouping; + } + case src-nx-tun-ipv4-dst-case { + uses nxm-nx-tun-ipv4-dst-grouping; + } + case src-nx-tun-ipv4-src-case { + uses nxm-nx-tun-ipv4-src-grouping; + } + case src-of-eth-src-case { + uses nxm-of-eth-src-grouping; + } + case src-of-eth-dst-case { + uses nxm-of-eth-dst-grouping; + } + case src-of-eth-type-case { + uses nxm-of-eth-type-grouping; + } + } + } + + grouping range-grouping { + leaf start { + description "Include value."; + type uint16; + } + leaf end { + description "Include value."; + type uint16; + } + } + + grouping nx-action-reg-load-grouping { + container nx-reg-load { + container dst { + description "Writes value to bits start through end, inclusive, in field dst."; + uses dst-choice-grouping; + uses range-grouping; + } + leaf value { + type uint64; + } + } + } + + grouping nx-action-reg-move-grouping { + container nx-reg-move { + container src { + description "Writes value to bits start through end, inclusive, in field src."; + uses src-choice-grouping; + uses range-grouping; + } + container dst { + description "Writes value to bits start through end, inclusive, in field dst."; + uses dst-choice-grouping; + uses range-grouping; + } + } + } + + // ACTION augmentations + // RPCS + augment "/sal-flow:add-flow/sal-flow:input/sal-flow:instructions/sal-flow:instruction/sal-flow:instruction/sal-flow:write-actions-case/sal-flow:write-actions/sal-flow:action/sal-flow:action" { + case nx-action-reg-load-rpc-add-flow-write-actions-case { + uses nx-action-reg-load-grouping; + } + } + augment "/sal-flow:add-flow/sal-flow:input/sal-flow:instructions/sal-flow:instruction/sal-flow:instruction/sal-flow:write-actions-case/sal-flow:write-actions/sal-flow:action/sal-flow:action" { + case nx-action-reg-move-rpc-add-flow-write-actions-case { + uses nx-action-reg-move-grouping; + } + } + augment "/sal-flow:add-flow/sal-flow:input/sal-flow:instructions/sal-flow:instruction/sal-flow:instruction/sal-flow:apply-actions-case/sal-flow:apply-actions/sal-flow:action/sal-flow:action" { + case nx-action-reg-load-rpc-add-flow-apply-actions-case { + uses nx-action-reg-load-grouping; + } + } + augment "/sal-flow:add-flow/sal-flow:input/sal-flow:instructions/sal-flow:instruction/sal-flow:instruction/sal-flow:apply-actions-case/sal-flow:apply-actions/sal-flow:action/sal-flow:action" { + case nx-action-reg-move-rpc-add-flow-apply-actions-case { + uses nx-action-reg-move-grouping; + } + } + + augment "/sal-flow:remove-flow/sal-flow:input/sal-flow:instructions/sal-flow:instruction/sal-flow:instruction/sal-flow:write-actions-case/sal-flow:write-actions/sal-flow:action/sal-flow:action" { + case "nx-action-reg-load-rpc-remove-flow-write-actions-case" { + uses nx-action-reg-load-grouping; + } + } + augment "/sal-flow:remove-flow/sal-flow:input/sal-flow:instructions/sal-flow:instruction/sal-flow:instruction/sal-flow:write-actions-case/sal-flow:write-actions/sal-flow:action/sal-flow:action" { + case "nx-action-reg-move-rpc-remove-flow-write-actions-case" { + uses nx-action-reg-move-grouping; + } + } + augment "/sal-flow:remove-flow/sal-flow:input/sal-flow:instructions/sal-flow:instruction/sal-flow:instruction/sal-flow:apply-actions-case/sal-flow:apply-actions/sal-flow:action/sal-flow:action" { + case "nx-action-reg-load-rpc-remove-flow-apply-actions-case" { + uses nx-action-reg-load-grouping; + } + } + augment "/sal-flow:remove-flow/sal-flow:input/sal-flow:instructions/sal-flow:instruction/sal-flow:instruction/sal-flow:apply-actions-case/sal-flow:apply-actions/sal-flow:action/sal-flow:action" { + case "nx-action-reg-move-rpc-remove-flow-apply-actions-case" { + uses nx-action-reg-move-grouping; + } + } + + augment "/sal-flow:update-flow/sal-flow:input/sal-flow:original-flow/sal-flow:instructions/sal-flow:instruction/sal-flow:instruction/sal-flow:write-actions-case/sal-flow:write-actions/sal-flow:action/sal-flow:action" { + case "nx-action-reg-load-rpc-update-flow-original-write-actions-case" { + uses nx-action-reg-load-grouping; + } + } + augment "/sal-flow:update-flow/sal-flow:input/sal-flow:original-flow/sal-flow:instructions/sal-flow:instruction/sal-flow:instruction/sal-flow:write-actions-case/sal-flow:write-actions/sal-flow:action/sal-flow:action" { + case "nx-action-reg-move-rpc-update-flow-original-write-actions-case" { + uses nx-action-reg-move-grouping; + } + } + augment "/sal-flow:update-flow/sal-flow:input/sal-flow:original-flow/sal-flow:instructions/sal-flow:instruction/sal-flow:instruction/sal-flow:apply-actions-case/sal-flow:apply-actions/sal-flow:action/sal-flow:action" { + case "nx-action-reg-load-rpc-update-flow-original-apply-actions-case" { + uses nx-action-reg-load-grouping; + } + } + augment "/sal-flow:update-flow/sal-flow:input/sal-flow:original-flow/sal-flow:instructions/sal-flow:instruction/sal-flow:instruction/sal-flow:apply-actions-case/sal-flow:apply-actions/sal-flow:action/sal-flow:action" { + case "nx-action-reg-move-rpc-update-flow-original-apply-actions-case" { + uses nx-action-reg-move-grouping; + } + } + augment "/sal-flow:update-flow/sal-flow:input/sal-flow:updated-flow/sal-flow:instructions/sal-flow:instruction/sal-flow:instruction/sal-flow:write-actions-case/sal-flow:write-actions/sal-flow:action/sal-flow:action" { + case "nx-action-reg-load-rpc-update-flow-updated-write-actions-case" { + uses nx-action-reg-load-grouping; + } + } + augment "/sal-flow:update-flow/sal-flow:input/sal-flow:updated-flow/sal-flow:instructions/sal-flow:instruction/sal-flow:instruction/sal-flow:write-actions-case/sal-flow:write-actions/sal-flow:action/sal-flow:action" { + case "nx-action-reg-move-rpc-update-flow-updated-write-actions-case" { + uses nx-action-reg-move-grouping; + } + } + augment "/sal-flow:update-flow/sal-flow:input/sal-flow:updated-flow/sal-flow:instructions/sal-flow:instruction/sal-flow:instruction/sal-flow:apply-actions-case/sal-flow:apply-actions/sal-flow:action/sal-flow:action" { + case "nx-action-reg-load-rpc-update-flow-updated-apply-actions-case" { + uses nx-action-reg-load-grouping; + } + } + augment "/sal-flow:update-flow/sal-flow:input/sal-flow:updated-flow/sal-flow:instructions/sal-flow:instruction/sal-flow:instruction/sal-flow:apply-actions-case/sal-flow:apply-actions/sal-flow:action/sal-flow:action" { + case "nx-action-reg-move-rpc-update-flow-updated-apply-actions-case" { + uses nx-action-reg-move-grouping; + } + } + + augment "/sal-group:add-group/sal-group:input/sal-group:buckets/sal-group:bucket/sal-group:action/sal-group:action" { + case "nx-action-reg-load-rpc-add-group-case" { + uses nx-action-reg-load-grouping; + } + } + augment "/sal-group:add-group/sal-group:input/sal-group:buckets/sal-group:bucket/sal-group:action/sal-group:action" { + case "nx-action-reg-move-rpc-add-group-case" { + uses nx-action-reg-move-grouping; + } + } + + augment "/sal-group:remove-group/sal-group:input/sal-group:buckets/sal-group:bucket/sal-group:action/sal-group:action" { + case "nx-action-reg-load-rpc-remove-group-case" { + uses nx-action-reg-load-grouping; + } + } + augment "/sal-group:remove-group/sal-group:input/sal-group:buckets/sal-group:bucket/sal-group:action/sal-group:action" { + case "nx-action-reg-move-rpc-remove-group-case" { + uses nx-action-reg-move-grouping; + } + } + + augment "/sal-group:update-group/sal-group:input/sal-group:original-group/sal-group:buckets/sal-group:bucket/sal-group:action/sal-group:action" { + case "nx-action-reg-load-rpc-update-group-original-case" { + uses nx-action-reg-load-grouping; + } + } + augment "/sal-group:update-group/sal-group:input/sal-group:original-group/sal-group:buckets/sal-group:bucket/sal-group:action/sal-group:action" { + case "nx-action-reg-move-rpc-update-group-original-case" { + uses nx-action-reg-move-grouping; + } + } + augment "/sal-group:update-group/sal-group:input/sal-group:updated-group/sal-group:buckets/sal-group:bucket/sal-group:action/sal-group:action" { + case "nx-action-reg-load-rpc-update-group-updated-case" { + uses nx-action-reg-load-grouping; + } + } + augment "/sal-group:update-group/sal-group:input/sal-group:updated-group/sal-group:buckets/sal-group:bucket/sal-group:action/sal-group:action" { + case "nx-action-reg-move-rpc-update-group-updated-case" { + uses nx-action-reg-move-grouping; + } + } + + augment "/sal-packet:transmit-packet/sal-packet:input/sal-packet:action/sal-packet:action" { + case "nx-action-reg-load-rpc-transmit-packet-case" { + uses nx-action-reg-load-grouping; + } + } + augment "/sal-packet:transmit-packet/sal-packet:input/sal-packet:action/sal-packet:action" { + case "nx-action-reg-move-rpc-transmit-packet-case" { + uses nx-action-reg-move-grouping; + } + } + + // DATA + augment "/inv:nodes/inv:node/fni:table/fni:flow/fni:instructions/fni:instruction/fni:instruction/fni:write-actions-case/fni:write-actions/fni:action/fni:action" { + case "nx-action-reg-load-nodes-node-table-flow-write-actions-case" { + uses nx-action-reg-load-grouping; + } + } + augment "/inv:nodes/inv:node/fni:table/fni:flow/fni:instructions/fni:instruction/fni:instruction/fni:write-actions-case/fni:write-actions/fni:action/fni:action" { + case "nx-action-reg-move-nodes-node-table-flow-write-actions-case" { + uses nx-action-reg-move-grouping; + } + } + augment "/inv:nodes/inv:node/fni:table/fni:flow/fni:instructions/fni:instruction/fni:instruction/fni:apply-actions-case/fni:apply-actions/fni:action/fni:action" { + case "nx-action-reg-load-nodes-node-table-flow-apply-actions-case" { + uses nx-action-reg-load-grouping; + } + } + augment "/inv:nodes/inv:node/fni:table/fni:flow/fni:instructions/fni:instruction/fni:instruction/fni:apply-actions-case/fni:apply-actions/fni:action/fni:action" { + case "nx-action-reg-move-nodes-node-table-flow-apply-actions-case" { + uses nx-action-reg-move-grouping; + } + } + + augment "/inv:nodes/inv:node/fni:group/fni:buckets/fni:bucket/fni:action/fni:action" { + case "nx-action-reg-load-nodes-node-group-buckets-bucket-actions-case" { + uses nx-action-reg-load-grouping; + } + } + augment "/inv:nodes/inv:node/fni:group/fni:buckets/fni:bucket/fni:action/fni:action" { + case "nx-action-reg-move-nodes-node-group-buckets-bucket-actions-case" { + uses nx-action-reg-move-grouping; + } + } + + // NOTIFICATIONS + augment "/odl-flow-stats:flows-statistics-update/odl-flow-stats:flow-and-statistics-map-list/odl-flow-stats:instructions/odl-flow-stats:instruction/odl-flow-stats:instruction/odl-flow-stats:write-actions-case/odl-flow-stats:write-actions/odl-flow-stats:action/odl-flow-stats:action" { + case "nx-action-reg-load-notif-flows-statistics-update-write-actions-case" { + uses nx-action-reg-load-grouping; + } + } + augment "/odl-flow-stats:flows-statistics-update/odl-flow-stats:flow-and-statistics-map-list/odl-flow-stats:instructions/odl-flow-stats:instruction/odl-flow-stats:instruction/odl-flow-stats:write-actions-case/odl-flow-stats:write-actions/odl-flow-stats:action/odl-flow-stats:action" { + case "nx-action-reg-move-notif-flows-statistics-update-write-actions-case" { + uses nx-action-reg-move-grouping; + } + } + augment "/odl-flow-stats:flows-statistics-update/odl-flow-stats:flow-and-statistics-map-list/odl-flow-stats:instructions/odl-flow-stats:instruction/odl-flow-stats:instruction/odl-flow-stats:apply-actions-case/odl-flow-stats:apply-actions/odl-flow-stats:action/odl-flow-stats:action" { + case "nx-action-reg-load-notif-flows-statistics-update-apply-actions-case" { + uses nx-action-reg-load-grouping; + } + } + augment "/odl-flow-stats:flows-statistics-update/odl-flow-stats:flow-and-statistics-map-list/odl-flow-stats:instructions/odl-flow-stats:instruction/odl-flow-stats:instruction/odl-flow-stats:apply-actions-case/odl-flow-stats:apply-actions/odl-flow-stats:action/odl-flow-stats:action" { + case "nx-action-reg-move-notif-flows-statistics-update-apply-actions-case" { + uses nx-action-reg-move-grouping; + } + } + + augment "/odl-group-stats:group-desc-stats-updated/odl-group-stats:group-desc-stats/odl-group-stats:buckets/odl-group-stats:bucket/odl-group-stats:action/odl-group-stats:action" { + case "nx-action-reg-load-notif-group-desc-stats-updated-case" { + uses nx-action-reg-load-grouping; + } + } + augment "/odl-group-stats:group-desc-stats-updated/odl-group-stats:group-desc-stats/odl-group-stats:buckets/odl-group-stats:bucket/odl-group-stats:action/odl-group-stats:action" { + case "nx-action-reg-move-notif-group-desc-stats-updated-case" { + uses nx-action-reg-move-grouping; + } + } + +} \ No newline at end of file diff --git a/extension/openflowplugin-extension-nicira/src/main/yang/openflowplugin-extension-nicira-match.yang b/extension/openflowplugin-extension-nicira/src/main/yang/openflowplugin-extension-nicira-match.yang new file mode 100644 index 0000000000..af6797aeab --- /dev/null +++ b/extension/openflowplugin-extension-nicira/src/main/yang/openflowplugin-extension-nicira-match.yang @@ -0,0 +1,225 @@ +module openflowplugin-extension-nicira-match { + yang-version 1; + + namespace "urn:opendaylight:openflowplugin:extension:nicira:match"; + prefix "openflowplugin-nicira-match"; + + import yang-ext {prefix ext; revision-date "2013-07-09";} + import flow-node-inventory {prefix fni; revision-date 2013-08-19; } + import opendaylight-inventory {prefix inv;revision-date "2013-08-19";} + import sal-flow {prefix sal-flow;revision-date "2013-08-19";} + import packet-processing {prefix sal-packet;revision-date "2013-07-09";} + import openflowplugin-extension-general {prefix ext-gen;revision-date "2014-07-14";} + import opendaylight-flow-statistics {prefix odl-flow-stats;revision-date "2013-08-19";} + import nicira-match {prefix nicira-match;revision-date "2014-04-21";} + import ietf-inet-types {prefix inet; revision-date "2010-09-24";} + import ietf-yang-types {prefix yang; revision-date "2010-09-24";} + + description + "Nicira openflow match extensions."; + + revision "2014-07-14" { + description "Initial revision"; + } + + identity nxm-nx-reg0-key { + base ext-gen:extension-key; + } + identity nxm-nx-reg1-key { + base ext-gen:extension-key; + } + identity nxm-nx-reg2-key { + base ext-gen:extension-key; + } + identity nxm-nx-reg3-key { + base ext-gen:extension-key; + } + identity nxm-nx-reg4-key { + base ext-gen:extension-key; + } + identity nxm-nx-reg5-key { + base ext-gen:extension-key; + } + identity nxm-nx-reg6-key { + base ext-gen:extension-key; + } + identity nxm-nx-reg7-key { + base ext-gen:extension-key; + } + identity nxm-nx-tun-id-key { + base ext-gen:extension-key; + } + identity nxm-nx-arp-sha-key { + base ext-gen:extension-key; + } + identity nxm-nx-arp-tha-key { + base ext-gen:extension-key; + } + identity nxm-of-arp-op-key { + base ext-gen:extension-key; + } + identity nxm-of-arp-spa-key { + base ext-gen:extension-key; + } + identity nxm-of-arp-tpa-key { + base ext-gen:extension-key; + } + identity nxm-nx-tun-ipv4-dst-key { + base ext-gen:extension-key; + } + identity nxm-nx-tun-ipv4-src-key { + base ext-gen:extension-key; + } + identity nxm-of-eth-src-key { + base ext-gen:extension-key; + } + identity nxm-of-eth-dst-key { + base ext-gen:extension-key; + } + identity nxm-of-eth-type-key { + base ext-gen:extension-key; + } + + grouping ipv4-address-grouping { + leaf ipv4-address { + type inet:ipv4-address; + } + } + grouping mac-address-grouping { + leaf mac-address { + type yang:mac-address; + } + } + + grouping nxm-nx-reg-grouping { + container nxm-nx-reg { + leaf reg { + type identityref { + base nicira-match:nxm-nx-reg; + } + } + leaf value { + type uint32; + } + } + } + grouping nxm-nx-tun-id-grouping { + container nxm-nx-tun-id { + leaf value { + type uint64; + } + } + } + grouping nxm-nx-arp-sha-grouping { + container nxm-nx-arp-sha { + uses mac-address-grouping; + } + } + grouping nxm-nx-arp-tha-grouping { + container nxm-nx-arp-tha { + uses mac-address-grouping; + } + } + grouping nxm-of-arp-op-grouping { + container nxm-of-arp-op { + description "Prereqs: NXM_OF_ETH_TYPE must match either 0x0806 or 0x8035."; + leaf value { + type uint16; + } + } + } + grouping nxm-of-arp-spa-grouping { + container nxm-of-arp-spa { + description "Prereqs: NXM_OF_ETH_TYPE must match either 0x0806 or 0x8035."; + uses ipv4-address-grouping; + } + } + grouping nxm-of-arp-tpa-grouping { + container nxm-of-arp-tpa { + description "Prereqs: NXM_OF_ETH_TYPE must match either 0x0806 or 0x8035."; + uses ipv4-address-grouping; + } + } + grouping nxm-nx-tun-ipv4-dst-grouping { + container nxm-nx-tun-ipv4-dst { + uses ipv4-address-grouping; + } + } + grouping nxm-nx-tun-ipv4-src-grouping { + container nxm-nx-tun-ipv4-src { + uses ipv4-address-grouping; + } + } + grouping nxm-of-eth-src-grouping { + container nxm-of-eth-src { + uses mac-address-grouping; + } + } + grouping nxm-of-eth-dst-grouping { + container nxm-of-eth-dst { + uses mac-address-grouping; + } + } + grouping nxm-of-eth-type-grouping { + container nxm-of-eth-type { + leaf value { + type uint16; + } + } + } + + grouping all-matches-grouping { + uses nxm-nx-reg-grouping; + uses nxm-nx-tun-id-grouping; + uses nxm-nx-arp-sha-grouping; + uses nxm-nx-arp-tha-grouping; + uses nxm-of-arp-op-grouping; + uses nxm-of-arp-spa-grouping; + uses nxm-of-arp-tpa-grouping; + uses nxm-nx-tun-ipv4-dst-grouping; + uses nxm-nx-tun-ipv4-src-grouping; + uses nxm-of-eth-src-grouping; + uses nxm-of-eth-dst-grouping; + uses nxm-of-eth-type-grouping; + } + + // MATCH augmentations + // RPCS + augment "/sal-flow:add-flow/sal-flow:input/sal-flow:match/ext-gen:extension-list/ext-gen:extension" { + ext:augment-identifier "nx-aug-match-rpc-add-flow"; + uses all-matches-grouping; + } + augment "/sal-flow:remove-flow/sal-flow:input/sal-flow:match/ext-gen:extension-list/ext-gen:extension" { + ext:augment-identifier "nx-aug-match-rpc-remove-flow"; + uses all-matches-grouping; + } + augment "/sal-flow:update-flow/sal-flow:input/sal-flow:original-flow/sal-flow:match/ext-gen:extension-list/ext-gen:extension" { + ext:augment-identifier "nx-aug-match-rpc-update-flow-original"; + uses all-matches-grouping; + } + augment "/sal-flow:update-flow/sal-flow:input/sal-flow:updated-flow/sal-flow:match/ext-gen:extension-list/ext-gen:extension" { + ext:augment-identifier "nx-aug-match-rpc-update-flow-updated"; + uses all-matches-grouping; + } + + // DATA + augment "/inv:nodes/inv:node/fni:table/fni:flow/fni:match/ext-gen:extension-list/ext-gen:extension" { + ext:augment-identifier "nx-aug-match-nodes-node-table-flow"; + uses all-matches-grouping; + } + + // NOTIFICATIONS + augment "/sal-flow:switch-flow-removed/sal-flow:match/ext-gen:extension-list/ext-gen:extension" { + ext:augment-identifier "nx-aug-match-notif-switch-flow-removed"; + uses all-matches-grouping; + } + augment "/sal-packet:packet-received/sal-packet:match/ext-gen:extension-list/ext-gen:extension" { + ext:augment-identifier "nx-aug-match-notif-packet-in"; + uses all-matches-grouping; + } + augment "/odl-flow-stats:flows-statistics-update/odl-flow-stats:flow-and-statistics-map-list/odl-flow-stats:match/ext-gen:extension-list/ext-gen:extension" { + ext:augment-identifier "nx-aug-match-notif-update-flow-stats"; + uses all-matches-grouping; + } + +} \ No newline at end of file diff --git a/extension/pom.xml b/extension/pom.xml new file mode 100644 index 0000000000..6c8c9109b8 --- /dev/null +++ b/extension/pom.xml @@ -0,0 +1,42 @@ + + + + 4.0.0 + + org.opendaylight.openflowplugin + openflowplugin-parent + 0.0.3-SNAPSHOT + ../ + + + + 0.6.2-SNAPSHOT + 0.5-SNAPSHOT + + + openflowplugin-extension-parent + pom + + openflowjava-extension-nicira-api + openflowjava-extension-nicira + openflowplugin-extension-api + openflowplugin-extension-nicira + test-extension + + + + + + ${project.groupId} + openflowjava-extension-nicira + ${project.version} + + + ${project.groupId} + openflowjava-extension-nicira-api + ${project.version} + + + + \ No newline at end of file diff --git a/extension/test-extension/pom.xml b/extension/test-extension/pom.xml new file mode 100644 index 0000000000..aa10c1ea3c --- /dev/null +++ b/extension/test-extension/pom.xml @@ -0,0 +1,132 @@ + + + 4.0.0 + + org.opendaylight.openflowplugin + openflowplugin-extension-parent + 0.0.3-SNAPSHOT + ../ + + test-extension + + + 0.6.2-SNAPSHOT + + + bundle + + + + + org.apache.felix + maven-bundle-plugin + + + + org.opendaylight.yangtools + yang-maven-plugin + + + + generate-sources + + + + + + org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator + + ${project.build.directory}/generated-sources/config + + + urn:opendaylight:params:xml:ns:yang:controller==org.opendaylight.controller.config.yang + + + + + + org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl + + ${project.build.directory}/generated-sources/sal + + + org.opendaylight.yangtools.yang.unified.doc.generator.maven.DocumentationGeneratorImpl + ${project.build.directory}/site/models + + + true + + + + + + org.opendaylight.controller + yang-jmx-generator-plugin + ${config.parent.version} + + + org.opendaylight.yangtools + maven-sal-api-gen-plugin + ${yangtools.version} + jar + + + + + + + + + org.opendaylight.openflowplugin + openflowplugin-extension-nicira + ${project.version} + + + org.opendaylight.openflowplugin + openflowplugin-extension-api + ${project.version} + + + org.opendaylight.openflowplugin + openflowjava-extension-nicira + ${project.version} + + + + org.opendaylight.openflowplugin + openflowplugin + ${project.version} + + + + + org.opendaylight.controller.model + model-flow-base + + + org.opendaylight.controller.model + model-flow-service + + + org.opendaylight.controller.model + model-flow-statistics + + + org.opendaylight.controller.model + model-inventory + + + + + org.opendaylight.openflowjava + openflow-protocol-api + + + org.opendaylight.openflowjava + openflow-protocol-impl + + + + + diff --git a/extension/test-extension/src/main/java/org/opendaylight/controller/config/yang/config/test_provider/impl/TestProviderModule.java b/extension/test-extension/src/main/java/org/opendaylight/controller/config/yang/config/test_provider/impl/TestProviderModule.java new file mode 100644 index 0000000000..5502a35aaa --- /dev/null +++ b/extension/test-extension/src/main/java/org/opendaylight/controller/config/yang/config/test_provider/impl/TestProviderModule.java @@ -0,0 +1,39 @@ +package org.opendaylight.controller.config.yang.config.test_provider.impl; + +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration; +import org.opendaylight.openflowplugin.extension.test.Test; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev130819.TestService; + +public class TestProviderModule extends org.opendaylight.controller.config.yang.config.test_provider.impl.AbstractTestProviderModule { + public TestProviderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + super(identifier, dependencyResolver); + } + + public TestProviderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.controller.config.yang.config.test_provider.impl.TestProviderModule oldModule, java.lang.AutoCloseable oldInstance) { + super(identifier, dependencyResolver, oldModule, oldInstance); + } + + @Override + public void customValidation() { + // add custom validation form module attributes here. + } + + @Override + public java.lang.AutoCloseable createInstance() { + Test extTest = new Test(); + SalFlowService flowService = getRpcRegistryDependency().getRpcService(SalFlowService.class); + extTest.setFlowService(flowService); + + final RpcRegistration registry = getRpcRegistryDependency().addRpcImplementation(TestService.class, extTest); + + return new AutoCloseable() { + + @Override + public void close() throws Exception { + registry.close(); + } + }; + } + +} diff --git a/extension/test-extension/src/main/java/org/opendaylight/controller/config/yang/config/test_provider/impl/TestProviderModuleFactory.java b/extension/test-extension/src/main/java/org/opendaylight/controller/config/yang/config/test_provider/impl/TestProviderModuleFactory.java new file mode 100644 index 0000000000..87f3e3f045 --- /dev/null +++ b/extension/test-extension/src/main/java/org/opendaylight/controller/config/yang/config/test_provider/impl/TestProviderModuleFactory.java @@ -0,0 +1,13 @@ +/* +* Generated file +* +* Generated from: yang module name: test-provider-impl yang module local name: test-provider-impl +* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator +* Generated at: Thu Jul 24 21:33:31 CEST 2014 +* +* Do not modify this file unless it is present under src/main directory +*/ +package org.opendaylight.controller.config.yang.config.test_provider.impl; +public class TestProviderModuleFactory extends org.opendaylight.controller.config.yang.config.test_provider.impl.AbstractTestProviderModuleFactory { + +} diff --git a/extension/test-extension/src/main/java/org/opendaylight/openflowplugin/extension/test/Test.java b/extension/test-extension/src/main/java/org/opendaylight/openflowplugin/extension/test/Test.java new file mode 100644 index 0000000000..288147e85f --- /dev/null +++ b/extension/test-extension/src/main/java/org/opendaylight/openflowplugin/extension/test/Test.java @@ -0,0 +1,201 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.extension.test; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Future; + +import org.opendaylight.openflowplugin.extension.api.AugmentTuple; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtl; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtlBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg0; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxRegCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nodes.node.table.flow.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.NxRegLoadBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.nx.reg.load.DstBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev130819.TestFlowInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.test.rev130819.TestService; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; + +import com.google.common.util.concurrent.Futures; + +/** + * @author msunal + * + */ +public class Test implements TestService { + + private SalFlowService flowService; + + + @Override + public Future> testFlow(TestFlowInput input) { + AddFlowInputBuilder flow = new AddFlowInputBuilder(); + flow.setPriority(2); + flow.setMatch(createMatchBld().build()); + flow.setInstructions(createDecNwTtlInstructionsBld().build()); + flow.setBarrier(Boolean.FALSE); + BigInteger value = BigInteger.valueOf(10L); + flow.setCookie(new FlowCookie(value)); + flow.setCookieMask(new FlowCookie(value)); + flow.setHardTimeout(0); + flow.setIdleTimeout(0); + flow.setInstallHw(false); + flow.setStrict(false); + flow.setContainerName(null); + flow.setFlags(new FlowModFlags(false, false, false, false, true)); + flow.setTableId((short) 0); + + flow.setFlowName("NiciraFLOW"); + + // Construct the flow instance id + final InstanceIdentifier flowInstanceId = InstanceIdentifier + .builder(Nodes.class) // File under nodes + .child(Node.class, new NodeKey(new NodeId("openflow:1"))).toInstance(); // A particular node identified by nodeKey + flow.setNode(new NodeRef(flowInstanceId)); + + pushFlowViaRpc(flow.build()); + + return Futures.immediateFuture(RpcResultBuilder.status(true).build()); + } + + /** + * @param addFlowInput + */ + private void pushFlowViaRpc(AddFlowInput addFlowInput) { + flowService.addFlow(addFlowInput); + } + + /** + * @param flowService the flowService to set + */ + public void setFlowService(SalFlowService flowService) { + this.flowService = flowService; + } + + private static MatchBuilder createMatchBld() { + MatchBuilder match = new MatchBuilder(); + Ipv4MatchBuilder ipv4Match = new Ipv4MatchBuilder(); + Ipv4Prefix prefix = new Ipv4Prefix("10.0.0.1/24"); + ipv4Match.setIpv4Destination(prefix); + Ipv4Match i4m = ipv4Match.build(); + match.setLayer3Match(i4m); + + EthernetMatchBuilder eth = new EthernetMatchBuilder(); + EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder(); + ethTypeBuilder.setType(new EtherType(0x0800L)); + eth.setEthernetType(ethTypeBuilder.build()); + match.setEthernetMatch(eth.build()); + +// AugmentTuple extAugmentWrapper = createNxMatchAugment(); +// match.addAugmentation(extAugmentWrapper.getAugmentationClass(), extAugmentWrapper.getAugmentationObject()); + + return match; + } + + private static AugmentTuple createNxMatchAugment() { + // TODO add example + return null; + } + + private static InstructionsBuilder createDecNwTtlInstructionsBld() { + // Add our drop action to a list + List actionList = new ArrayList(); + actionList.add(createOFAction(0).build()); + actionList.add(createNxActionBld(1).build()); + + // Create an Apply Action + ApplyActionsBuilder aab = new ApplyActionsBuilder(); + aab.setAction(actionList); + + // Wrap our Apply Action in an Instruction + InstructionBuilder ib = new InstructionBuilder(); + ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build()); + ib.setKey(new InstructionKey(0)); + ib.setOrder(0); + + // Put our Instruction in a list of Instructions + InstructionsBuilder isb = new InstructionsBuilder(); + List instructions = new ArrayList(); + instructions.add(ib.build()); + ib.setKey(new InstructionKey(0)); + isb.setInstruction(instructions); + return isb; + } + + /** + * @param actionKeyVal + * @return + */ + private static ActionBuilder createOFAction(int actionKeyVal) { + DecNwTtlBuilder ta = new DecNwTtlBuilder(); + DecNwTtl decNwTtl = ta.build(); + ActionBuilder ab = new ActionBuilder(); + ab.setAction(new DecNwTtlCaseBuilder().setDecNwTtl(decNwTtl).build()); + ab.setKey(new ActionKey(actionKeyVal)); + return ab; + } + + /** + * @param actionKeyVal TODO + * @return + */ + private static ActionBuilder createNxActionBld(int actionKeyVal) { + // vendor part + DstNxRegCaseBuilder nxRegCaseBld = new DstNxRegCaseBuilder().setNxReg(NxmNxReg0.class); + DstBuilder dstBld = new DstBuilder() + .setDstChoice(nxRegCaseBld.build()) + .setStart(0) + .setEnd(5); + NxRegLoadBuilder nxRegLoadBuilder = new NxRegLoadBuilder(); + nxRegLoadBuilder.setDst(dstBld.build()); + nxRegLoadBuilder.setValue(BigInteger.valueOf(55L)); + NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder topNxActionCaseBld = new NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder(); + topNxActionCaseBld.setNxRegLoad(nxRegLoadBuilder.build()); + + // base part + ActionBuilder abExt = new ActionBuilder(); + abExt.setKey(new ActionKey(actionKeyVal)); + abExt.setAction(topNxActionCaseBld.build()); + return abExt; + } + + +} diff --git a/extension/test-extension/src/main/resources/initial/75-test.xml b/extension/test-extension/src/main/resources/initial/75-test.xml new file mode 100644 index 0000000000..f9e2885a4c --- /dev/null +++ b/extension/test-extension/src/main/resources/initial/75-test.xml @@ -0,0 +1,40 @@ + + + + + + + + + + test:test-provider-impl + + test-provider-impl + + + binding:binding-rpc-registry + binding-rpc-broker + + + + binding:binding-async-data-broker + binding-data-broker + + + + + + + + + urn:opendaylight:params:xml:ns:yang:controller:config:test-provider:impl?module=test-provider-impl&revision=2014-06-11 + + + + diff --git a/extension/test-extension/src/main/yang/test-provider-impl.yang b/extension/test-extension/src/main/yang/test-provider-impl.yang new file mode 100644 index 0000000000..ebb557ec11 --- /dev/null +++ b/extension/test-extension/src/main/yang/test-provider-impl.yang @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ + +module test-provider-impl { + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:controller:config:test-provider:impl"; + prefix "test-provider-impl"; + + import config { prefix config; revision-date 2013-04-05; } + import opendaylight-md-sal-binding { prefix mdsal; revision-date 2013-10-28; } + + revision "2014-06-11" { + description + "Initial revision."; + } + + identity test-provider-impl { + base "config:module-type"; + + config:java-name-prefix TestProvider; + } + + // Augments the 'configuration' choice node under modules/module. + augment "/config:modules/config:module/config:configuration" { + case test-provider-impl { + when "/config:modules/config:module/config:type = 'test-provider-impl'"; + + //wires in the data-broker service + container data-broker { + uses config:service-ref { + refine type { + mandatory true; + config:required-identity mdsal:binding-async-data-broker; + } + } + } + // RPC Registry + container rpc-registry { + uses config:service-ref { + refine type { + mandatory true; + config:required-identity mdsal:binding-rpc-registry; + } + } + } + } + } +} diff --git a/extension/test-extension/src/main/yang/test.yang b/extension/test-extension/src/main/yang/test.yang new file mode 100644 index 0000000000..cfba18f387 --- /dev/null +++ b/extension/test-extension/src/main/yang/test.yang @@ -0,0 +1,31 @@ +module test { + namespace "urn:opendaylight:test"; + prefix test; + + import yang-ext {prefix ext; revision-date "2013-07-09";} + + revision "2013-08-19" { + description "Initial revision of flow service"; + } + + rpc test-flow { + input { + leaf dummy { + type string; + } + } + /* + input { + uses tr:transaction-metadata; + leaf flow-ref { + type types:flow-ref; + } + uses node-flow; + } + output { + uses tr:transaction-aware; + } + */ + } + +} diff --git a/openflowplugin-it/pom.xml b/openflowplugin-it/pom.xml index 420dbed197..06cee83c42 100644 --- a/openflowplugin-it/pom.xml +++ b/openflowplugin-it/pom.xml @@ -97,6 +97,12 @@ ${project.version} test
+ + org.opendaylight.openflowplugin + openflowplugin-extension-api + ${project.version} + test + org.opendaylight.openflowjava openflow-protocol-impl diff --git a/openflowplugin-it/src/test/java/org/opendaylight/openflowplugin/openflow/md/it/OFPaxOptionsAssistant.java b/openflowplugin-it/src/test/java/org/opendaylight/openflowplugin/openflow/md/it/OFPaxOptionsAssistant.java index ef770d91af..033803be99 100644 --- a/openflowplugin-it/src/test/java/org/opendaylight/openflowplugin/openflow/md/it/OFPaxOptionsAssistant.java +++ b/openflowplugin-it/src/test/java/org/opendaylight/openflowplugin/openflow/md/it/OFPaxOptionsAssistant.java @@ -77,6 +77,7 @@ public abstract class OFPaxOptionsAssistant { ofLibraryBundles(), mavenBundle(CONTROLLER_MODEL, "model-flow-statistics").versionAsInProject(), mavenBundle(OFPLUGIN, "openflowplugin-api").versionAsInProject(), + mavenBundle(OFPLUGIN, "openflowplugin-extension-api").versionAsInProject(), mavenBundle(OFPLUGIN, "openflowplugin").versionAsInProject(), mavenBundle("org.openexi", "nagasena").versionAsInProject() ); diff --git a/openflowplugin/pom.xml b/openflowplugin/pom.xml index 16df4f5422..d6df815dce 100644 --- a/openflowplugin/pom.xml +++ b/openflowplugin/pom.xml @@ -83,6 +83,11 @@ openflowplugin-api ${project.version} + + org.opendaylight.openflowplugin + openflowplugin-extension-api + ${project.version} + org.opendaylight.controller sal diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/MDController.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/MDController.java index bb333de44e..fdd86d5a8f 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/MDController.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/MDController.java @@ -28,6 +28,7 @@ import java.util.concurrent.TimeoutException; import org.opendaylight.openflowjava.protocol.api.connection.ConnectionConfiguration; import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider; import org.opendaylight.openflowplugin.openflow.md.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionConverterProvider; import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil; import org.opendaylight.openflowplugin.openflow.md.core.translator.ErrorTranslator; import org.opendaylight.openflowplugin.openflow.md.core.translator.ErrorV10Translator; @@ -116,6 +117,8 @@ public class MDController implements IMDController, AutoCloseable { private ErrorHandlerSimpleImpl errorHandler; + private ExtensionConverterProvider extensionConverterProvider; + /** * @return translator mapping */ @@ -218,6 +221,7 @@ public class MDController implements IMDController, AutoCloseable { int rpcThreadLimit = 10; ListeningExecutorService rpcPoolDelegator = createRpcPoolSpyDecorated(rpcThreadLimit, messageSpyCounter); OFSessionUtil.getSessionManager().setRpcPool(rpcPoolDelegator); + OFSessionUtil.getSessionManager().setExtensionConverterProvider(extensionConverterProvider); } @@ -410,4 +414,11 @@ public class MDController implements IMDController, AutoCloseable { OFSessionUtil.releaseSessionManager(); errorHandler = null; } + + /** + * @param extensionConverterProvider + */ + public void setExtensionConverterProvider(ExtensionConverterProvider extensionConverterProvider) { + this.extensionConverterProvider = extensionConverterProvider; + } } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ActionExtensionHelper.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ActionExtensionHelper.java new file mode 100644 index 0000000000..7699149263 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ActionExtensionHelper.java @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.openflow.md.core.extension; + +import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionSerializerKey; +import org.opendaylight.openflowplugin.extension.api.ConvertorActionFromOFJava; +import org.opendaylight.openflowplugin.extension.api.path.ActionPath; +import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil; +import org.opendaylight.openflowplugin.openflow.md.util.OpenflowVersion; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + */ +public final class ActionExtensionHelper { + + private static final Logger LOG = LoggerFactory + .getLogger(ActionExtensionHelper.class); + + private ActionExtensionHelper() { + throw new IllegalAccessError("singleton enforcement"); + } + + /** + * @param action + * @param ofVersion + * @param actionPath + * @return augmentation wrapper containing augmentation depending on matchPath + */ + public static org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action + processAlienAction(Action action, OpenflowVersion ofVersion, ActionPath actionPath) { + + /** TODO: EXTENSION PROPOSAL (action, OFJava to MD-SAL) */ + ExperimenterActionSerializerKey key = new ExperimenterActionSerializerKey( + ofVersion.getVersion(), + action.getAugmentation(ExperimenterIdAction.class).getExperimenter().getValue(), + action.getAugmentation(ExperimenterIdAction.class).getSubType()); + + org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action alienAction = null; + ConvertorActionFromOFJava convertor = OFSessionUtil.getExtensionConvertorProvider().getActionConverter(key); + if (convertor != null) { + alienAction = convertor.convert( + action, actionPath); + } + + return alienAction; + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionConverterManager.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionConverterManager.java new file mode 100644 index 0000000000..e3add99fdc --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionConverterManager.java @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.openflow.md.core.extension; + +import org.opendaylight.openflowplugin.extension.api.ExtensionConverterRegistrator; + +/** + * unifying interface + */ +public interface ExtensionConverterManager extends ExtensionConverterProvider, ExtensionConverterRegistrator { + // see parents +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionConverterManagerImpl.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionConverterManagerImpl.java new file mode 100644 index 0000000000..61aacf2ea8 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionConverterManagerImpl.java @@ -0,0 +1,228 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.openflow.md.core.extension; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionSerializerKey; +import org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey; +import org.opendaylight.openflowplugin.extension.api.ConvertorActionFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorActionToOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava; +import org.opendaylight.openflowplugin.extension.api.TypeVersionKey; +import org.opendaylight.openflowplugin.extension.api.path.ActionPath; +import org.opendaylight.openflowplugin.extension.api.path.AugmentationPath; +import org.opendaylight.openflowplugin.extension.api.path.MatchPath; +import org.opendaylight.openflowplugin.openflow.md.core.extension.RegistrationCloser.RegistrationCloserActionFromOFJava; +import org.opendaylight.openflowplugin.openflow.md.core.extension.RegistrationCloser.RegistrationCloserActionToOFJava; +import org.opendaylight.openflowplugin.openflow.md.core.extension.RegistrationCloser.RegistrationCloserFromOFJava; +import org.opendaylight.openflowplugin.openflow.md.core.extension.RegistrationCloser.RegistrationCloserToOFJava; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; +import org.opendaylight.yangtools.concepts.ObjectRegistration; +import org.opendaylight.yangtools.yang.binding.DataContainer; + +/** + * simple map-based registration engine implementation + */ +public class ExtensionConverterManagerImpl implements ExtensionConverterManager { + + private Map, ConvertorFromOFJava> registryFromOFJAva; + private Map, ConvertorToOFJava> registryToOFJAva; + private Map, ConvertorActionToOFJava> registryActionToOFJAva; + private Map, ConvertorActionFromOFJava> registryActionFromOFJAva; + + /** + * default ctor + */ + public ExtensionConverterManagerImpl() { + registryFromOFJAva = new ConcurrentHashMap<>(); + registryToOFJAva = new ConcurrentHashMap<>(); + registryActionToOFJAva = new ConcurrentHashMap<>(); + registryActionFromOFJAva = new ConcurrentHashMap<>(); + } + + /** + * @param key + * @param extConvertor + * @return + */ + private > + RegistrationCloserFromOFJava hireJanitor( + KEY key, ConvertorFromOFJava extConvertor) { + RegistrationCloserFromOFJava janitor = new RegistrationCloser.RegistrationCloserFromOFJava<>(); + janitor.setConverter(extConvertor); + janitor.setKey(key); + janitor.setRegistrator(this); + return janitor; + } + + /** + * @param key + * @param extConvertor + * @return + */ + private > + RegistrationCloserActionFromOFJava hireJanitor( + KEY key, ConvertorActionFromOFJava extConvertor) { + RegistrationCloserActionFromOFJava janitor = new RegistrationCloser.RegistrationCloserActionFromOFJava<>(); + janitor.setConverter(extConvertor); + janitor.setKey(key); + janitor.setRegistrator(this); + return janitor; + } + + /** + * @param key + * @param extConvertor + * @return + */ + private RegistrationCloserToOFJava hireJanitor( + ConverterExtensionKey key, ConvertorToOFJava extConvertor) { + RegistrationCloserToOFJava janitor = new RegistrationCloser.RegistrationCloserToOFJava<>(); + janitor.setConverter(extConvertor); + janitor.setKey(key); + janitor.setRegistrator(this); + return janitor; + } + + /** + * @param key + * @param extConvertor + * @return + */ + private RegistrationCloserActionToOFJava hireJanitor( + TypeVersionKey key, ConvertorActionToOFJava extConvertor) { + RegistrationCloserActionToOFJava janitor = new RegistrationCloser.RegistrationCloserActionToOFJava<>(); + janitor.setConverter(extConvertor); + janitor.setKey(key); + janitor.setRegistrator(this); + return janitor; + } + + /** + * cancel registration of given converter + * + * @param key + * @param converter + */ + public void unregister(ConverterExtensionKey key, ConvertorToOFJava converter) { + ConvertorToOFJava registeredConverter = registryToOFJAva.get(key); + if (registeredConverter != null && registeredConverter == converter) { + registryToOFJAva.remove(key); + } + } + + /** + * cancel registration of given converter + * + * @param key + * @param converter + */ + public void unregister(TypeVersionKey key, ConvertorActionToOFJava converter) { + ConvertorActionToOFJava registeredConverter = registryActionToOFJAva.get(key); + if (registeredConverter != null && registeredConverter == converter) { + registryActionToOFJAva.remove(key); + } + } + + /** + * cancel registration of given converter + * + * @param key + * @param converter + */ + public void unregister(MessageTypeKey key, ConvertorFromOFJava converter) { + ConvertorFromOFJava registeredConverter = registryFromOFJAva.get(key); + if (registeredConverter != null && registeredConverter == converter) { + registryFromOFJAva.remove(key); + } + } + + /** + * cancel registration of given converter + * + * @param key + * @param converter + */ + public void unregister(MessageTypeKey key, ConvertorActionFromOFJava converter) { + ConvertorActionFromOFJava registeredConverter = registryActionFromOFJAva.get(key); + if (registeredConverter != null && registeredConverter == converter) { + registryActionFromOFJAva.remove(key); + } + } + + @SuppressWarnings("unchecked") + @Override + public ConvertorToOFJava getConverter( + ConverterExtensionKey key) { + return (ConvertorToOFJava) registryToOFJAva.get(key); + } + + @SuppressWarnings("unchecked") + @Override + public ConvertorActionToOFJava getConverter( + TypeVersionKey key) { + return (ConvertorActionToOFJava) registryActionToOFJAva.get(key); + } + + @SuppressWarnings("unchecked") + @Override + public ConvertorFromOFJava getConverter( + MessageTypeKey key) { + return (ConvertorFromOFJava) registryFromOFJAva.get(key); + } + + @SuppressWarnings("unchecked") + @Override + public ConvertorActionFromOFJava getActionConverter( + MessageTypeKey key) { + return (ConvertorActionFromOFJava) registryActionFromOFJAva.get(key); + } + + @Override + public ObjectRegistration> + registerActionConvertor( + TypeVersionKey key, + ConvertorActionToOFJava convertor) { + registryActionToOFJAva.put(key, convertor); + return hireJanitor(key, convertor); + } + + @Override + public ObjectRegistration> + registerActionConvertor( + ExperimenterActionSerializerKey key, + ConvertorActionFromOFJava convertor) { + registryActionFromOFJAva.put(key, convertor); + return hireJanitor(key, convertor); + } + + @Override + public ObjectRegistration> registerMatchConvertor(ConverterExtensionKey key, + ConvertorToOFJava convertor) { + registryToOFJAva.put(key, convertor); + return hireJanitor(key, convertor); + } + + @Override + public ObjectRegistration> registerMatchConvertor( + MatchEntrySerializerKey key, + ConvertorFromOFJava convertor) { + registryFromOFJAva.put(key, convertor); + return hireJanitor(key, convertor); + } + +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionConverterProvider.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionConverterProvider.java new file mode 100644 index 0000000000..9647a1711f --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionConverterProvider.java @@ -0,0 +1,53 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.openflow.md.core.extension; + +import org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey; +import org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey; +import org.opendaylight.openflowplugin.extension.api.ConvertorActionFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorActionToOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava; +import org.opendaylight.openflowplugin.extension.api.TypeVersionKey; +import org.opendaylight.openflowplugin.extension.api.path.AugmentationPath; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action; +import org.opendaylight.yangtools.yang.binding.DataContainer; + +/** + * + */ +public interface ExtensionConverterProvider { + + /** + * lookup converter + * @param key + * @return found converter + */ + ConvertorFromOFJava getConverter(MessageTypeKey key); + + /** + * lookup converter + * @param key + * @return found converter + */ + ConvertorToOFJava getConverter(ConverterExtensionKey key); + + /** + * @param key + * @return found converter + */ + ConvertorActionToOFJava getConverter(TypeVersionKey key); + + /** + * lookup converter
+ * TODO: this method should be compatible with {@link #getConverter(MessageTypeKey)} after matches are migrated to similar structure + * @param key + * @return found converter + */ + ConvertorActionFromOFJava getActionConverter(MessageTypeKey key); +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionResolvers.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionResolvers.java new file mode 100644 index 0000000000..caf03b4c65 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionResolvers.java @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.openflow.md.core.extension; + +import org.opendaylight.openflowplugin.extension.api.GroupingLooseResolver; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNodesNodeTableFlow; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchRpcAddFlow; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchRpcRemoveFlow; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchRpcUpdateFlowOriginal; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchRpcUpdateFlowUpdated; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralExtensionListGrouping; + +/** + * + */ +public class ExtensionResolvers { + + private static GroupingLooseResolver matchExtensionResolver = + new GroupingLooseResolver<>(GeneralExtensionListGrouping.class) + .add(GeneralAugMatchRpcAddFlow.class) + .add(GeneralAugMatchRpcRemoveFlow.class) + .add(GeneralAugMatchRpcUpdateFlowOriginal.class) + .add(GeneralAugMatchRpcUpdateFlowUpdated.class) + .add(GeneralAugMatchNodesNodeTableFlow.class); + + /** + * @return the matchExtensionResolver (covers match rpcs and inventory augmentations) + */ + public static GroupingLooseResolver getMatchExtensionResolver() { + return matchExtensionResolver; + } + +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/MatchExtensionHelper.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/MatchExtensionHelper.java new file mode 100644 index 0000000000..2a8cd8ad41 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/MatchExtensionHelper.java @@ -0,0 +1,133 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.openflow.md.core.extension; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowplugin.extension.api.AugmentTuple; +import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ExtensionAugment; +import org.opendaylight.openflowplugin.extension.api.path.MatchPath; +import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil; +import org.opendaylight.openflowplugin.openflow.md.util.OpenflowVersion; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNotifPacketIn; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNotifPacketInBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNotifSwitchFlowRemoved; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNotifSwitchFlowRemovedBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNotifUpdateFlowStats; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNotifUpdateFlowStatsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.ExtensionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.list.grouping.ExtensionList; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.list.grouping.ExtensionListBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.packet.received.Match; +import org.opendaylight.yangtools.yang.binding.Augmentable; +import org.opendaylight.yangtools.yang.binding.Augmentation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + */ +public final class MatchExtensionHelper { + + private static final Logger LOG = LoggerFactory + .getLogger(MatchExtensionHelper.class); + + private MatchExtensionHelper() { + throw new IllegalAccessError("singleton enforcement"); + } + + /** + * @param matchEntries + * @param ofVersion + * @param matchPath + * @return augmentation wrapper containing augmentation depending on matchPath + */ + @SuppressWarnings("unchecked") + public static > + AugmentTuple processAllExtensions(Collection matchEntries, + OpenflowVersion ofVersion, MatchPath matchPath) { + List extensionsList = new ArrayList<>(); + + for (MatchEntries matchEntry : matchEntries) { + ExtensionListBuilder extensionListBld = processExtension(matchEntry, ofVersion, matchPath); + if (extensionListBld == null) { + continue; + } + + extensionsList.add(extensionListBld.build()); + } + + AugmentTuple augmentTuple = null; + if (! extensionsList.isEmpty()) { + switch (matchPath) { + case FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_MATCH: + GeneralAugMatchNotifUpdateFlowStatsBuilder generalExtMatchAugBld1 = new GeneralAugMatchNotifUpdateFlowStatsBuilder(); + generalExtMatchAugBld1.setExtensionList(extensionsList); + augmentTuple = (AugmentTuple) + new AugmentTuple( + GeneralAugMatchNotifUpdateFlowStats.class, generalExtMatchAugBld1.build()); + break; + case PACKETRECEIVED_MATCH: + GeneralAugMatchNotifPacketInBuilder generalExtMatchAugBld2 = new GeneralAugMatchNotifPacketInBuilder(); + generalExtMatchAugBld2.setExtensionList(extensionsList); + augmentTuple = (AugmentTuple) + new AugmentTuple(GeneralAugMatchNotifPacketIn.class, generalExtMatchAugBld2.build()); + break; + case SWITCHFLOWREMOVED_MATCH: + GeneralAugMatchNotifSwitchFlowRemovedBuilder generalExtMatchAugBld3 = new GeneralAugMatchNotifSwitchFlowRemovedBuilder(); + generalExtMatchAugBld3.setExtensionList(extensionsList); + augmentTuple = (AugmentTuple) + new AugmentTuple( + GeneralAugMatchNotifSwitchFlowRemoved.class, generalExtMatchAugBld3.build()); + break; + default: + LOG.warn("matchPath not supported: {}", matchPath); + } + } + + return augmentTuple; + } + + /** + * @param ofVersion + * @param matchPath + * @param matchBuilder + * @param match + * @return + */ + private static ExtensionListBuilder processExtension(MatchEntries matchEntry, OpenflowVersion ofVersion, MatchPath matchPath) { + ExtensionListBuilder extListBld = null; + + /** TODO: EXTENSION PROPOSAL (match, OFJava to MD-SAL) */ + MatchEntrySerializerKey key = new MatchEntrySerializerKey<>( + ofVersion.getVersion(), matchEntry.getOxmClass(), matchEntry.getOxmMatchField()); + ConvertorFromOFJava convertor = OFSessionUtil.getExtensionConvertorProvider().getConverter(key); + if (convertor != null) { + ExtensionAugment> extensionMatch = + convertor.convert(matchEntry, matchPath); + ExtensionBuilder extBld = new ExtensionBuilder(); + extBld.addAugmentation(extensionMatch.getAugmentationClass(), extensionMatch.getAugmentationObject()); + + extListBld = new ExtensionListBuilder(); + extListBld.setExtension(extBld.build()); + extListBld.setExtensionKey(extensionMatch.getKey()); + } + + + return extListBld; + } + +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/RegistrationCloser.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/RegistrationCloser.java new file mode 100644 index 0000000000..0d1b6b1f94 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/extension/RegistrationCloser.java @@ -0,0 +1,126 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.openflow.md.core.extension; + +import org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey; +import org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey; +import org.opendaylight.openflowplugin.extension.api.ConvertorActionFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorActionToOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava; +import org.opendaylight.openflowplugin.extension.api.TypeVersionKey; +import org.opendaylight.openflowplugin.extension.api.path.AugmentationPath; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; +import org.opendaylight.yangtools.concepts.ObjectRegistration; +import org.opendaylight.yangtools.yang.binding.DataContainer; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action; + +/** + * @param converter key + * @param converter instance + */ +public abstract class RegistrationCloser implements ObjectRegistration { + + private ExtensionConverterManagerImpl registrator; + private KEY key; + private CONVERTER converter; + + /** + * @param registrator the registrator to set + */ + public void setRegistrator(ExtensionConverterManagerImpl registrator) { + this.registrator = registrator; + } + /** + * @param key the key to set + */ + public void setKey(KEY key) { + this.key = key; + } + /** + * @param converter the converter to set + */ + public void setConverter(CONVERTER converter) { + this.converter = converter; + } + /** + * @return the registrator + */ + public ExtensionConverterManagerImpl getRegistrator() { + return registrator; + } + /** + * @return the key + */ + public KEY getKey() { + return key; + } + /** + * @return the converter + */ + public CONVERTER getConverter() { + return converter; + } + + @Override + public CONVERTER getInstance() { + return getConverter(); + } + + /** + * standalone deregistrator + * @param target type of wrapped convertor + */ + public static class RegistrationCloserToOFJava extends + RegistrationCloser, ConvertorToOFJava> { + + @Override + public void close() throws Exception { + getRegistrator().unregister(getKey(), getConverter()); + } + } + + /** + * standalone deregistrator + * @param source type of wrapped convertor + * @param associated augmentation path + */ + public static class RegistrationCloserFromOFJava extends RegistrationCloser, ConvertorFromOFJava> { + + @Override + public void close() throws Exception { + getRegistrator().unregister(getKey(), getConverter()); + } + } + + /** + * standalone deregistrator + * @param target type of wrapped convertor + */ + public static class RegistrationCloserActionToOFJava extends + RegistrationCloser, ConvertorActionToOFJava> { + + @Override + public void close() throws Exception { + getRegistrator().unregister(getKey(), getConverter()); + } + } + + /** + * standalone deregistrator + * @param source type of wrapped convertor + * @param associated augmentation path + */ + public static class RegistrationCloserActionFromOFJava extends RegistrationCloser, ConvertorActionFromOFJava> { + + @Override + public void close() throws Exception { + getRegistrator().unregister(getKey(), getConverter()); + } + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/OpenflowPluginProvider.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/OpenflowPluginProvider.java index 4e34451db0..24fa9084ee 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/OpenflowPluginProvider.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/OpenflowPluginProvider.java @@ -15,7 +15,10 @@ import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ConsumerCo import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext; import org.opendaylight.controller.sal.binding.api.BindingAwareProvider; import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider; +import org.opendaylight.openflowplugin.extension.api.ExtensionConverterRegistrator; import org.opendaylight.openflowplugin.openflow.md.core.MDController; +import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionConverterManagerImpl; +import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionConverterManager; import org.opendaylight.openflowplugin.statistics.MessageCountCommandProvider; import org.opendaylight.openflowplugin.statistics.MessageCountDumper; import org.opendaylight.openflowplugin.statistics.MessageObservatory; @@ -46,12 +49,15 @@ public class OpenflowPluginProvider implements BindingAwareProvider, AutoCloseab private MessageObservatory messageCountProvider; private SalRegistrationManager registrationManager; + + private ExtensionConverterManager extensionConverterManager; /** * Initialization of services and msgSpy counter */ public void initialization() { messageCountProvider = new MessageSpyCounterImpl(); + extensionConverterManager = new ExtensionConverterManagerImpl(); this.registerProvider(); } @@ -88,6 +94,7 @@ public class OpenflowPluginProvider implements BindingAwareProvider, AutoCloseab mdController = new MDController(); mdController.setSwitchConnectionProviders(switchConnectionProviders); mdController.setMessageSpyCounter(messageCountProvider); + mdController.setExtensionConverterProvider(extensionConverterManager); mdController.init(); mdController.start(); messageCountCommandProvider = new MessageCountCommandProvider(context, messageCountProvider); @@ -162,4 +169,11 @@ public class OpenflowPluginProvider implements BindingAwareProvider, AutoCloseab public MessageCountDumper getMessageCountDumper() { return messageCountProvider; } + + /** + * @return the extensionConverterRegistry + */ + public ExtensionConverterRegistrator getExtensionConverterRegistrator() { + return extensionConverterManager; + } } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ActionConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ActionConvertor.java index 9e6ab50d29..c1773eb06f 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ActionConvertor.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ActionConvertor.java @@ -9,17 +9,69 @@ */ package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; + +import org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey; +import org.opendaylight.openflowplugin.extension.api.ConvertorActionToOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava; +import org.opendaylight.openflowplugin.extension.api.TypeVersionKey; +import org.opendaylight.openflowplugin.extension.api.path.ActionPath; import org.opendaylight.openflowplugin.openflow.md.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.extension.ActionExtensionHelper; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.ActionSetNwDstReactor; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.ActionSetNwSrcReactor; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorImpl; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor; +import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil; import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil; import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil; import org.opendaylight.openflowplugin.openflow.md.util.OpenflowVersion; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Dscp; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri; -import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.*; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlDstActionCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlSrcActionCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwDstActionCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwSrcActionCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTosActionCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlActionCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlActionCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueActionCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueActionCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpDstActionCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpSrcActionCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanPcpActionCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.StripVlanActionCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.in._case.CopyTtlInBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.out._case.CopyTtlOutBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.mpls.ttl._case.DecMplsTtlBuilder; @@ -48,8 +100,42 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.acti import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.id.action._case.SetVlanIdAction; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.pcp.action._case.SetVlanPcpAction; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.CommonPort; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.*; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.*; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTosAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTosActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidMatchEntry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidMatchEntryBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopMpls; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopVlan; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushMpls; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.ActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType; @@ -60,14 +146,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Open import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanVid; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder; -import org.opendaylight.yangtools.yang.binding.Augmentation; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralExtensionGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.List; - /** * @author usha@ericsson Action List:This class takes data from SAL layer and * converts into OF Data @@ -159,7 +243,35 @@ public final class ActionConvertor { ofAction = SalToOFSetTpDst(action, actionBuilder, version); else if (action instanceof SetNwTosActionCase) ofAction = SalToOFSetNwTos(action, actionBuilder, version); - + else if (action instanceof GeneralExtensionGrouping) { + + /** + * TODO: EXTENSION PROPOSAL (action, MD-SAL to OFJava) + * - we might need sessionContext as converter input + * + */ + + GeneralExtensionGrouping extensionCaseGrouping = (GeneralExtensionGrouping) action; + Extension extAction = extensionCaseGrouping.getExtension(); + ConverterExtensionKey key = new ConverterExtensionKey<>(extensionCaseGrouping.getExtensionKey(), version); + ConvertorToOFJava convertor = + OFSessionUtil.getExtensionConvertorProvider().getConverter(key); + if (convertor != null) { + ofAction = convertor.convert(extAction); + } + } else { + // try vendor codecs + TypeVersionKey key = + new TypeVersionKey<>( + (Class) action.getImplementedInterface(), + version); + ConvertorActionToOFJava convertor = + OFSessionUtil.getExtensionConvertorProvider().getConverter(key); + if (convertor != null) { + ofAction = convertor.convert(action); + } + } + if (ofAction != null) { actionsList.add(ofAction); } @@ -617,10 +729,11 @@ public final class ActionConvertor { * * @param actionList * @param ofVersion current ofp version + * @param actionPath TODO * @return List of converted SAL Actions. */ public static List toMDSalActions( - List actionList, OpenflowVersion ofVersion) { + List actionList, OpenflowVersion ofVersion, ActionPath actionPath) { List bucketActions = new ArrayList<>(); for (Action action : actionList) { @@ -697,11 +810,17 @@ public final class ActionConvertor { } else if (action.getType().equals( org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter.class)) { - // bucketActions.add(ofToSALExperimenter(action)); - // TODO: Need to explore/discuss on how to handle experimenter - // case. + /** + * TODO: EXTENSION PROPOSAL (action, OFJava to MD-SAL) + * - we might also need a way on how to identify exact type of augmentation to be + * used as match can be bound to multiple models + */ + org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action processedAction = + ActionExtensionHelper.processAlienAction(action, ofVersion, actionPath); + if (processedAction != null) { + bucketActions.add(processedAction); + } } - } return bucketActions; } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/FlowStatsResponseConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/FlowStatsResponseConvertor.java index 067037b0ec..1e0639d286 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/FlowStatsResponseConvertor.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/FlowStatsResponseConvertor.java @@ -7,6 +7,9 @@ */ package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor; +import org.opendaylight.openflowplugin.extension.api.AugmentTuple; +import org.opendaylight.openflowplugin.extension.api.path.MatchPath; +import org.opendaylight.openflowplugin.openflow.md.core.extension.MatchExtensionHelper; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorImpl; import org.opendaylight.openflowplugin.openflow.md.util.OpenflowVersion; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.Counter32; @@ -15,6 +18,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.f import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.flow.and.statistics.map.list.FlowAndStatisticsMapListBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.duration.DurationBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.multipart.reply.flow.FlowStats; @@ -76,7 +81,17 @@ public class FlowStatsResponseConvertor { } } if(flowStats.getMatch() != null){ - salFlowStatsBuilder.setMatch(MatchConvertorImpl.fromOFMatchToSALMatch(flowStats.getMatch(),datapathid, ofVersion)); + MatchBuilder matchBuilder = MatchConvertorImpl.fromOFMatchToSALMatch(flowStats.getMatch(),datapathid, ofVersion); + + AugmentTuple matchExtensionWrap = + MatchExtensionHelper.processAllExtensions( + flowStats.getMatch().getMatchEntries(), ofVersion, MatchPath.FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_MATCH); + if (matchExtensionWrap != null) { + matchBuilder.addAugmentation(matchExtensionWrap.getAugmentationClass(), matchExtensionWrap.getAugmentationObject()); + } + + + salFlowStatsBuilder.setMatch(matchBuilder.build()); salFlowStatsBuilder.setFlags( new FlowModFlags(flowStats.getFlags().isOFPFFCHECKOVERLAP(), flowStats.getFlags().isOFPFFRESETCOUNTS(), diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertor.java index 944b3748c1..5318eedcd9 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertor.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertor.java @@ -11,6 +11,7 @@ package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor; import java.util.ArrayList; import java.util.List; +import org.opendaylight.openflowplugin.extension.api.path.ActionPath; import org.opendaylight.openflowplugin.openflow.md.util.OpenflowVersion; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.Counter32; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.Counter64; @@ -145,7 +146,8 @@ public class GroupStatsResponseConvertor { for(BucketsList bucketDetails : bucketDescStats){ BucketBuilder bucketDesc = new BucketBuilder(); List convertedSalActions = - ActionConvertor.toMDSalActions (bucketDetails.getAction(), ofVersion); + ActionConvertor.toMDSalActions (bucketDetails.getAction(), ofVersion, + ActionPath.GROUPDESCSTATSUPDATED_GROUPDESCSTATS_BUCKETS_BUCKET_ACTION); List actions = new ArrayList<>(); int actionKey = 0; diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/OFToMDSalFlowConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/OFToMDSalFlowConvertor.java index 72066e8ffe..45a9148c6d 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/OFToMDSalFlowConvertor.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/OFToMDSalFlowConvertor.java @@ -7,6 +7,15 @@ */ package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; +import java.util.Map.Entry; + +import org.opendaylight.openflowjava.protocol.api.extensibility.EnhancedMessageTypeKey; +import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava; +import org.opendaylight.openflowplugin.extension.api.path.ActionPath; +import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil; import org.opendaylight.openflowplugin.openflow.md.util.OpenflowVersion; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder; @@ -33,10 +42,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MetadataInstruction; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MeterIdInstruction; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TableIdInstruction; - -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.List; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.InstructionBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; +import org.opendaylight.yangtools.yang.binding.Augmentation; +import org.opendaylight.yangtools.yang.binding.DataContainer; public class OFToMDSalFlowConvertor { @@ -62,7 +71,7 @@ public class OFToMDSalFlowConvertor { ApplyActionsBuilder applyActionsBuilder = new ApplyActionsBuilder(); - applyActionsBuilder.setAction(wrapActionList(ActionConvertor.toMDSalActions(actionsInstruction.getAction(), ofVersion))); + applyActionsBuilder.setAction(wrapActionList(ActionConvertor.toMDSalActions(actionsInstruction.getAction(), ofVersion, ActionPath.FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_INSTRUCTIONS_INSTRUCTION_INSTRUCTION_APPLYACTIONSCASE_APPLYACTIONS_ACTION_ACTION))); applyActionsCaseBuilder.setApplyActions(applyActionsBuilder.build()); @@ -124,7 +133,7 @@ public class OFToMDSalFlowConvertor { WriteActionsCaseBuilder writeActionsCaseBuilder = new WriteActionsCaseBuilder(); WriteActionsBuilder writeActionsBuilder = new WriteActionsBuilder(); - writeActionsBuilder.setAction(wrapActionList(ActionConvertor.toMDSalActions(actionsInstruction.getAction(), ofVersion))); + writeActionsBuilder.setAction(wrapActionList(ActionConvertor.toMDSalActions(actionsInstruction.getAction(), ofVersion, ActionPath.FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_INSTRUCTIONS_INSTRUCTION_INSTRUCTION_WRITEACTIONSCASE_WRITEACTIONS_ACTION_ACTION))); writeActionsCaseBuilder.setWriteActions(writeActionsBuilder.build()); InstructionBuilder instBuilder = new InstructionBuilder(); @@ -193,7 +202,7 @@ public class OFToMDSalFlowConvertor { ApplyActionsCaseBuilder applyActionsCaseBuilder = new ApplyActionsCaseBuilder(); ApplyActionsBuilder applyActionsBuilder = new ApplyActionsBuilder(); - applyActionsBuilder.setAction(wrapActionList(ActionConvertor.toMDSalActions(actionsList, ofVersion))); + applyActionsBuilder.setAction(wrapActionList(ActionConvertor.toMDSalActions(actionsList, ofVersion, ActionPath.FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_INSTRUCTIONS_INSTRUCTION_INSTRUCTION_WRITEACTIONSCASE_WRITEACTIONS_ACTION_ACTION))); applyActionsCaseBuilder.setApplyActions(applyActionsBuilder.build()); diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java index 3b0816ef13..addc33a461 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java @@ -15,7 +15,11 @@ import java.util.Iterator; import java.util.List; import org.opendaylight.openflowjava.util.ByteBufUtils; +import org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey; +import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava; import org.opendaylight.openflowplugin.openflow.md.OFConstants; +import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionResolvers; +import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil; import org.opendaylight.openflowplugin.openflow.md.util.ByteUtil; import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil; import org.opendaylight.openflowplugin.openflow.md.util.OpenflowVersion; @@ -166,6 +170,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Mpls import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsLabel; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsTc; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.PbbIsid; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpDst; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpSrc; @@ -182,9 +187,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Vlan import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralExtensionListGrouping; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.list.grouping.ExtensionList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.base.Optional; import com.google.common.base.Splitter; /** @@ -433,6 +442,24 @@ public class MatchConvertorImpl implements MatchConvertor> { if (tunnel != null) { matchEntriesList.add(toOfMetadata(TunnelId.class, tunnel.getTunnelId(), tunnel.getTunnelMask())); } + + + /** + * TODO: EXTENSION PROPOSAL (match, MD-SAL to OFJava) + * - we might need version for conversion and for key + * - sanitize NPE + */ + Optional extensionListOpt = ExtensionResolvers.getMatchExtensionResolver().getExtension(match); + if (extensionListOpt.isPresent()) { + for (ExtensionList extensionItem : extensionListOpt.get().getExtensionList()) { + // TODO: get real version + ConverterExtensionKey key = new ConverterExtensionKey<>(extensionItem.getExtensionKey(), OFConstants.OFP_VERSION_1_3); + ConvertorToOFJava convertor = + OFSessionUtil.getExtensionConvertorProvider().getConverter(key); + MatchEntries ofMatch = convertor.convert(extensionItem.getExtension()); + matchEntriesList.add(ofMatch); + } + } return matchEntriesList; } @@ -564,16 +591,19 @@ public class MatchConvertorImpl implements MatchConvertor> { * match * * @param match - * @return + * @param swMatch + * @param datapathid + * @param ofVersion + * @return md-sal match instance * @author avishnoi@in.ibm.com */ - public static Match fromOFMatchToSALMatch( + public static MatchBuilder fromOFMatchToSALMatch( final org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.grouping.Match swMatch, final BigInteger datapathid, final OpenflowVersion ofVersion) { return OfMatchToSALMatchConvertor(swMatch.getMatchEntries(), datapathid, ofVersion); } - private static Match OfMatchToSALMatchConvertor(List swMatchList, final BigInteger datapathid, + private static MatchBuilder OfMatchToSALMatchConvertor(List swMatchList, final BigInteger datapathid, OpenflowVersion ofVersion){ MatchBuilder matchBuilder = new MatchBuilder(); @@ -951,9 +981,9 @@ public class MatchConvertorImpl implements MatchConvertor> { tcpFlagMatchBuilder.setTcpFlag(tcpFlagMatch.getTcpFlag()); matchBuilder.setTcpFlagMatch(tcpFlagMatchBuilder.build()); } - } + } } - return matchBuilder.build(); + return matchBuilder; } private static MatchEntries toOfMplsPbb(final Pbb pbb) { MatchEntriesBuilder matchEntriesBuilder = new MatchEntriesBuilder(); @@ -1369,8 +1399,8 @@ public class MatchConvertorImpl implements MatchConvertor> { logger.debug("Converting OF SetField action to SAL SetField action"); SetFieldBuilder setField = new SetFieldBuilder(); OxmFieldsAction oxmFields = action.getAugmentation(OxmFieldsAction.class); - Match match = OfMatchToSALMatchConvertor(oxmFields.getMatchEntries(), null, ofVersion); - setField.fieldsFrom(match); + MatchBuilder match = OfMatchToSALMatchConvertor(oxmFields.getMatchEntries(), null, ofVersion); + setField.fieldsFrom(match.build()); return setField.build(); } } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/OFSessionUtil.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/OFSessionUtil.java index 9465f985a4..7d4cc8ebe9 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/OFSessionUtil.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/OFSessionUtil.java @@ -18,6 +18,7 @@ import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor; import org.opendaylight.openflowplugin.openflow.md.core.IMDMessageTranslator; import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher; import org.opendaylight.openflowplugin.openflow.md.core.TranslatorKey; +import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionConverterProvider; import org.opendaylight.openflowplugin.openflow.md.queue.PopListener; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; @@ -172,4 +173,11 @@ public abstract class OFSessionUtil { return getSessionManager().getPopListenerMapping(); } + /** + * @return extension converters provider + */ + public static ExtensionConverterProvider getExtensionConvertorProvider() { + return getSessionManager().getExtensionConverterProvider(); + } + } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/SessionManager.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/SessionManager.java index 0bfcc9478d..be708d292d 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/SessionManager.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/SessionManager.java @@ -19,6 +19,7 @@ import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor; import org.opendaylight.openflowplugin.openflow.md.core.IMDMessageTranslator; import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher; import org.opendaylight.openflowplugin.openflow.md.core.TranslatorKey; +import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionConverterProvider; import org.opendaylight.openflowplugin.openflow.md.queue.PopListener; import org.opendaylight.openflowplugin.statistics.MessageSpy; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; @@ -135,4 +136,14 @@ public interface SessionManager extends AutoCloseable { * @return the messageSpy */ MessageSpy getMessageSpy(); + + /** + * @param extensionConverterProvider + */ + void setExtensionConverterProvider(ExtensionConverterProvider extensionConverterProvider); + + /** + * @return extensionConverterProvider + */ + ExtensionConverterProvider getExtensionConverterProvider(); } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/SessionManagerOFImpl.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/SessionManagerOFImpl.java index a9ce909503..3350f0e20b 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/SessionManagerOFImpl.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/SessionManagerOFImpl.java @@ -21,6 +21,7 @@ import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor; import org.opendaylight.openflowplugin.openflow.md.core.IMDMessageTranslator; import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher; import org.opendaylight.openflowplugin.openflow.md.core.TranslatorKey; +import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionConverterProvider; import org.opendaylight.openflowplugin.openflow.md.queue.PopListener; import org.opendaylight.openflowplugin.statistics.MessageSpy; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; @@ -211,6 +212,7 @@ public class SessionManagerOFImpl implements SessionManager { } }; private MessageSpy messageSpy; + private ExtensionConverterProvider extensionConverterProvider; @Override @@ -284,4 +286,18 @@ public class SessionManagerOFImpl implements SessionManager { public MessageSpy getMessageSpy() { return messageSpy; } + + @Override + public void setExtensionConverterProvider( + ExtensionConverterProvider extensionConverterProvider) { + this.extensionConverterProvider = extensionConverterProvider; + } + + /** + * @return the extensionConverterProvider + */ + @Override + public ExtensionConverterProvider getExtensionConverterProvider() { + return extensionConverterProvider; + } } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/FlowRemovedTranslator.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/FlowRemovedTranslator.java index 98c64aa1a6..c9b072285a 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/FlowRemovedTranslator.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/FlowRemovedTranslator.java @@ -9,10 +9,16 @@ */ package org.opendaylight.openflowplugin.openflow.md.core.translator; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowplugin.extension.api.AugmentTuple; +import org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava; +import org.opendaylight.openflowplugin.extension.api.path.MatchPath; import org.opendaylight.openflowplugin.openflow.md.OFConstants; import org.opendaylight.openflowplugin.openflow.md.core.IMDMessageTranslator; import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher; +import org.opendaylight.openflowplugin.openflow.md.core.extension.MatchExtensionHelper; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorImpl; +import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil; import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext; import org.opendaylight.openflowplugin.openflow.md.util.ByteUtil; import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil; @@ -110,6 +116,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Meta import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsBos; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsLabel; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsTc; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.PbbIsid; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpDst; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpSrc; @@ -125,6 +132,14 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Vlan import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowRemovedMessage; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNodesNodeTableFlow; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNodesNodeTableFlowBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNotifSwitchFlowRemoved; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNotifSwitchFlowRemovedBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.Extension; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.grouping.ExtensionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.list.grouping.ExtensionListBuilder; +import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.DataObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -452,9 +467,17 @@ public class FlowRemovedTranslator implements IMDMessageTranslator matchExtensionWrap = + MatchExtensionHelper.processAllExtensions( + ofMatch.getMatchEntries(), ofVersion, MatchPath.SWITCHFLOWREMOVED_MATCH); + if (matchExtensionWrap != null) { + matchBuilder.addAugmentation(matchExtensionWrap.getAugmentationClass(), matchExtensionWrap.getAugmentationObject()); + } + + if (ethernetMatch != null) { matchBuilder.setEthernetMatch(ethernetMatch.build()); } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/PacketInTranslator.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/PacketInTranslator.java index ece40020ab..429da6e31f 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/PacketInTranslator.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/PacketInTranslator.java @@ -10,9 +10,13 @@ package org.opendaylight.openflowplugin.openflow.md.core.translator; import java.math.BigInteger; import java.util.Collections; import java.util.List; +import java.util.Map.Entry; +import org.opendaylight.openflowplugin.extension.api.AugmentTuple; +import org.opendaylight.openflowplugin.extension.api.path.MatchPath; import org.opendaylight.openflowplugin.openflow.md.core.IMDMessageTranslator; import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher; +import org.opendaylight.openflowplugin.openflow.md.core.extension.MatchExtensionHelper; import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorImpl; import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext; import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil; @@ -25,10 +29,14 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm. import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessage; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNotifPacketIn; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNotifPacketInBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNotifUpdateFlowStatsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.ConnectionCookie; import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketReceived; import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketReceivedBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.packet.received.MatchBuilder; +import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.DataObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -96,10 +104,18 @@ public class PacketInTranslator implements IMDMessageTranslator matchExtensionWrap = + MatchExtensionHelper.processAllExtensions( + message.getMatch().getMatchEntries(), ofVersion, MatchPath.PACKETRECEIVED_MATCH); + if (matchExtensionWrap != null) { + matchBuilder.addAugmentation(matchExtensionWrap.getAugmentationClass(), matchExtensionWrap.getAugmentationObject()); + } + + org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.packet.received.Match packetInMatch = matchBuilder.build(); + pktInBuilder.setMatch(packetInMatch); pktInBuilder.setPacketInReason(PacketInUtil.getMdSalPacketInReason(message.getReason())); pktInBuilder.setTableId(new org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableId(message.getTableId().getValue().shortValue())); pktInBuilder.setIngress(InventoryDataServiceUtil.nodeConnectorRefFromDatapathIdPortno(dpid, port, ofVersion)); diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/OpenflowVersion.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/OpenflowVersion.java index d08f49d696..705aa71f9f 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/OpenflowVersion.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/OpenflowVersion.java @@ -25,5 +25,12 @@ public enum OpenflowVersion { } return UNSUPPORTED; } + + /** + * @return the version + */ + public short getVersion() { + return version; + } } diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionConverterManagerImplTest.java b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionConverterManagerImplTest.java new file mode 100644 index 0000000000..705dca89cf --- /dev/null +++ b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/extension/ExtensionConverterManagerImplTest.java @@ -0,0 +1,108 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. 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 + */ +package org.opendaylight.openflowplugin.openflow.md.core.extension; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionSerializerKey; +import org.opendaylight.openflowplugin.extension.api.ConvertorActionFromOFJava; +import org.opendaylight.openflowplugin.extension.api.ConvertorActionToOFJava; +import org.opendaylight.openflowplugin.extension.api.TypeVersionKey; +import org.opendaylight.openflowplugin.extension.api.path.ActionPath; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.ExperimenterActionSubType; + +/** + * {@link ExtensionConverterManagerImpl} test + */ +@RunWith(MockitoJUnitRunner.class) +public class ExtensionConverterManagerImplTest { + + private ExtensionConverterManagerImpl manager; + @Mock + private ConvertorActionToOFJava extConvertorToOFJava; + private TypeVersionKey keyToOFJava; + @Mock + private ConvertorActionFromOFJava extConvertorFromOFJava; + private ExperimenterActionSerializerKey keyFromOFJava; + private AutoCloseable regFromOFJava; + private AutoCloseable regToOFJava; + + /** + * prepare required stuff + */ + @Before + public void setUp() { + manager = new ExtensionConverterManagerImpl(); + keyFromOFJava = new ExperimenterActionSerializerKey((short) 1, 42L, ExpSubType.class); + regFromOFJava = manager.registerActionConvertor(keyFromOFJava, extConvertorFromOFJava); + + keyToOFJava = new TypeVersionKey<>(ActionExpCase.class, (short) 1); + regToOFJava = manager.registerActionConvertor(keyToOFJava, extConvertorToOFJava); + } + + /** + * tear down test case - close registrations + * @throws Exception + */ + @After + public void tearDown() throws Exception { + regToOFJava.close(); + regToOFJava.close(); + } + + /** + * Test method for {@link org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionConverterManagerImpl#unregister(org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey, org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava)}. + * @throws Exception + */ + @Test + public void testUnregisterConverterExtensionKeyOfQConvertorToOFJavaOfQQ() throws Exception { + regToOFJava.close(); + Assert.assertNull(manager.getConverter(keyToOFJava)); + } + + /** + * Test method for {@link org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionConverterManagerImpl#unregister(org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey, org.opendaylight.openflowplugin.extension.api.ConvertorFromOFJava)}. + * @throws Exception + */ + @Test + public void testUnregisterMessageTypeKeyOfQConvertorFromOFJavaOfQQ() throws Exception { + regFromOFJava.close(); + Assert.assertNull(manager.getConverter(keyFromOFJava)); + } + + /** + * Test method for {@link org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionConverterManagerImpl#getConverter(org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey)}. + */ + @Test + public void testGetConverterConverterExtensionKeyOfQ() { + Assert.assertEquals(extConvertorToOFJava, manager.getConverter(keyToOFJava)); + } + + /** + * Test method for {@link org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionConverterManagerImpl#getConverter(org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey)}. + */ + @Test + public void testGetConverterMessageTypeKeyOfQ() { + Assert.assertEquals(extConvertorFromOFJava, manager.getActionConverter(keyFromOFJava)); + } + + private static class ExpSubType extends ExperimenterActionSubType { + // NOOP + } + + private static interface ActionExpCase extends Action { + // NOOP + } + +} diff --git a/pom.xml b/pom.xml index 59133bb44d..29899c7998 100644 --- a/pom.xml +++ b/pom.xml @@ -613,6 +613,7 @@ openflowplugin-api openflowplugin + extension distribution/base distribution/cbench openflowplugin-controller-config -- 2.36.6