From 5544e382e7f30cd9cbc3a5fbf47daba7e2bda0ad Mon Sep 17 00:00:00 2001 From: Tony Tkacik Date: Tue, 24 Sep 2013 11:19:30 +0200 Subject: [PATCH] Action mapping To|From SAL conversion. - action was defined in flow-type.yang file according to actions in SAL - action mapping was added to FromSalConversionsUtils.actionFrom - action mapping was added to ToSalConversionsUtils.actionFrom Change-Id: I3bd1c2eba896fb3a305da6ad698db9f0275d6f50 Signed-off-by: Jozef Gloncak Signed-off-by: Tony Tkacik --- .../src/main/yang/flow-types.yang | 117 +++++++++++- .../compability/FromSalConversionsUtils.java | 175 ++++++++++------- .../compability/ToSalConversionsUtils.java | 179 ++++++++++++++++-- 3 files changed, 384 insertions(+), 87 deletions(-) diff --git a/opendaylight/md-sal/model/model-flow-base/src/main/yang/flow-types.yang b/opendaylight/md-sal/model/model-flow-base/src/main/yang/flow-types.yang index cd364b5402..634c8dbd72 100644 --- a/opendaylight/md-sal/model/model-flow-base/src/main/yang/flow-types.yang +++ b/opendaylight/md-sal/model/model-flow-base/src/main/yang/flow-types.yang @@ -5,11 +5,31 @@ module opendaylight-flow-types { import ietf-inet-types {prefix inet;} import opendaylight-match-types {prefix match;} import ietf-yang-types {prefix yang;} - + import opendaylight-l2-types {prefix l2t;} revision "2013-08-19" { description "Initial revision of flow service"; } + + + typedef vlan-cfi { + type int32; + } + + grouping address { + choice address { + case ipv4 { + leaf ipv4-address { + type inet:ipv4-prefix; + } + } + case ipv6 { + leaf ipv6-address { + type inet:ipv6-prefix; + } + } + } + } grouping action { choice action { @@ -59,9 +79,102 @@ module opendaylight-flow-types { } + case drop-action { + } + + case flood-action { + } + + case flood-all-action { + } + + case hw-path-action { + } + + case loopback-action { + } + + case pop-vlan-action { + } + case push-vlan-action { - + leaf tag { // TPID - 16 bits + type int32; + } + leaf pcp { // PCP - 3 bits + type int32; + } + leaf cfi { // CFI - 1 bit (drop eligible) + type vlan-cfi; + } + leaf vlan-id { // VID - 12 bits + type l2t:vlan-id; + } +// leaf tci { //TCI = [PCP + CFI + VID] +// } +// leaf header { //header = [TPID + TCI] +// } + } + case set-dl-dst-action { + leaf address { + type yang:mac-address; + } + } + + case set-dl-src-action { + leaf address { + type yang:mac-address; + } + } + case set-dl-type-action { + leaf dl-type { + type l2t:ether-type; + } + } + case set-next-hop-action { + uses address; + } + case set-nw-dst-action { + uses address; + } + case set-nw-src-action{ + uses address; + } + case set-nw-tos-action { + leaf tos { + type int32; + } + } + + case set-tp-dst-action { + leaf port { + type inet:port-number; + } + } + case set-tp-src-action { + leaf port { + type inet:port-number; + } + } + case set-vlan-cfi-action { + leaf vlan-cfi { + type vlan-cfi; + } + } + case set-vlan-id-action { + leaf vlan-id { + type l2t:vlan-id; + } + } + case set-vlan-pcp-action { + leaf vlan-pcp { + type l2t:vlan-pcp; + } + } + case sw-path-action { } + + } } diff --git a/opendaylight/md-sal/sal-compability/src/main/java/org/opendaylight/controller/sal/compability/FromSalConversionsUtils.java b/opendaylight/md-sal/sal-compability/src/main/java/org/opendaylight/controller/sal/compability/FromSalConversionsUtils.java index e77375fc41..1d4f42c799 100644 --- a/opendaylight/md-sal/sal-compability/src/main/java/org/opendaylight/controller/sal/compability/FromSalConversionsUtils.java +++ b/opendaylight/md-sal/sal-compability/src/main/java/org/opendaylight/controller/sal/compability/FromSalConversionsUtils.java @@ -12,43 +12,21 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import org.opendaylight.controller.sal.action.Controller; -import org.opendaylight.controller.sal.action.Drop; -import org.opendaylight.controller.sal.action.Flood; -import org.opendaylight.controller.sal.action.FloodAll; -import org.opendaylight.controller.sal.action.HwPath; -import org.opendaylight.controller.sal.action.Loopback; -import org.opendaylight.controller.sal.action.Output; -import org.opendaylight.controller.sal.action.PopVlan; -import org.opendaylight.controller.sal.action.PushVlan; -import org.opendaylight.controller.sal.action.SetDlDst; -import org.opendaylight.controller.sal.action.SetDlSrc; -import org.opendaylight.controller.sal.action.SetDlType; -import org.opendaylight.controller.sal.action.SetNextHop; -import org.opendaylight.controller.sal.action.SetNwDst; -import org.opendaylight.controller.sal.action.SetNwSrc; -import org.opendaylight.controller.sal.action.SetNwTos; -import org.opendaylight.controller.sal.action.SetTpDst; -import org.opendaylight.controller.sal.action.SetTpSrc; -import org.opendaylight.controller.sal.action.SetVlanCfi; -import org.opendaylight.controller.sal.action.SetVlanId; -import org.opendaylight.controller.sal.action.SetVlanPcp; -import org.opendaylight.controller.sal.action.SwPath; +import org.opendaylight.controller.sal.action.*; import org.opendaylight.controller.sal.core.NodeConnector; import org.opendaylight.controller.sal.flowprogrammer.Flow; import org.opendaylight.controller.sal.match.Match; import org.opendaylight.controller.sal.match.MatchField; import org.opendaylight.controller.sal.match.MatchType; -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.Ipv4Prefix; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.*; 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.flow.service.rev130819.FlowAdded; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowAddedBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.ControllerActionBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.OutputActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.VlanCfi; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.*; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.Address; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.address.Ipv4Builder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.address.Ipv6Builder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.Action; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.ActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType; @@ -59,14 +37,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.ethernet.match.fields.EthernetDestinationBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.ethernet.match.fields.EthernetSourceBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.ethernet.match.fields.EthernetTypeBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.EthernetMatch; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.EthernetMatchBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.IpMatch; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.IpMatchBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.Layer3Match; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.Layer4Match; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.VlanMatch; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.VlanMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.*; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._3.match.ArpMatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._3.match.Ipv4MatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._3.match.Ipv6MatchBuilder; @@ -120,15 +91,15 @@ public class FromSalConversionsUtils { if (sourceAction instanceof Controller) { targetAction = new ControllerActionBuilder().build(); } else if (sourceAction instanceof Drop) { - // TODO: define maping + targetAction = new DropActionBuilder().build(); } else if (sourceAction instanceof Flood) { - // TODO: define maping + targetAction = new FloodActionBuilder().build(); } else if (sourceAction instanceof FloodAll) { - // TODO: define maping + targetAction = new FloodAllActionBuilder().build(); } else if (sourceAction instanceof HwPath) { - // TODO: define maping + targetAction = new HwPathActionBuilder().build(); } else if (sourceAction instanceof Loopback) { - // TODO: define maping + targetAction = new LoopbackActionBuilder().build(); } else if (sourceAction instanceof Output) { NodeConnector nodeConnector = ((Output) sourceAction).getPort(); @@ -137,35 +108,101 @@ public class FromSalConversionsUtils { targetAction = outputActionBuilder.build(); } else if (sourceAction instanceof PopVlan) { - // TODO: define maping + targetAction = new PopVlanActionBuilder().build(); } else if (sourceAction instanceof PushVlan) { - // TODO: define maping + PushVlan pushVlan = (PushVlan) sourceAction; + PushVlanActionBuilder pushVlanActionBuilder = new PushVlanActionBuilder(); + + pushVlanActionBuilder.setCfi(new VlanCfi(pushVlan.getCfi())); + pushVlanActionBuilder.setVlanId(new VlanId(pushVlan.getVlanId())); + pushVlanActionBuilder.setPcp(pushVlan.getPcp()); + pushVlanActionBuilder.setTag(pushVlan.getTag()); + targetAction = pushVlanActionBuilder.build(); } else if (sourceAction instanceof SetDlDst) { - // TODO: define maping + SetDlDst setDlDst = (SetDlDst) sourceAction; + SetDlDstActionBuilder setDlDstActionBuilder = new SetDlDstActionBuilder(); + + setDlDstActionBuilder.setAddress(new MacAddress(Arrays.toString(setDlDst.getDlAddress()))); + targetAction = setDlDstActionBuilder.build(); } else if (sourceAction instanceof SetDlSrc) { - // TODO: define maping + SetDlSrc setDlSrc = (SetDlSrc) sourceAction; + SetDlSrcActionBuilder setDlSrcActionBuilder = new SetDlSrcActionBuilder(); + + setDlSrcActionBuilder.setAddress(new MacAddress(Arrays.toString(setDlSrc.getDlAddress()))); + targetAction = setDlSrcActionBuilder.build(); } else if (sourceAction instanceof SetDlType) { - // TODO: define maping + SetDlType setDlType = (SetDlType) sourceAction; + SetDlTypeActionBuilder setDlTypeActionBuilder = new SetDlTypeActionBuilder(); + + setDlTypeActionBuilder.setDlType(new EtherType(new Long(setDlType.getDlType()))); + targetAction = setDlTypeActionBuilder.build(); } else if (sourceAction instanceof SetNextHop) { - // TODO: define maping + SetNextHop setNextHop = (SetNextHop) sourceAction; + SetNextHopActionBuilder setNextHopActionBuilder = new SetNextHopActionBuilder(); + + InetAddress inetAddress = setNextHop.getAddress(); + setNextHopActionBuilder.setAddress(addressFromAction(inetAddress)); + + targetAction = setNextHopActionBuilder.build(); } else if (sourceAction instanceof SetNwDst) { - // TODO: define maping + SetNwDst setNwDst = (SetNwDst) sourceAction; + SetNwDstActionBuilder setNwDstActionBuilder = new SetNwDstActionBuilder(); + + InetAddress inetAddress = setNwDst.getAddress(); + setNwDstActionBuilder.setAddress(addressFromAction(inetAddress)); + + targetAction = setNwDstActionBuilder.build(); } else if (sourceAction instanceof SetNwSrc) { - // TODO: define maping + SetNwSrc setNwSrc = (SetNwSrc) sourceAction; + SetNwSrcActionBuilder setNwSrcActionBuilder = new SetNwSrcActionBuilder(); + + InetAddress inetAddress = setNwSrc.getAddress(); + setNwSrcActionBuilder.setAddress(addressFromAction(inetAddress)); + + targetAction = setNwSrcActionBuilder.build(); } else if (sourceAction instanceof SetNwTos) { - // TODO: define maping + SetNwTos setNwTos = (SetNwTos) sourceAction; + SetNwTosActionBuilder setNwTosActionBuilder = new SetNwTosActionBuilder(); + + setNwTosActionBuilder.setTos(setNwTos.getNwTos()); + targetAction = setNwTosActionBuilder.build(); } else if (sourceAction instanceof SetTpDst) { - // TODO: define maping + SetTpDst setTpDst = (SetTpDst) sourceAction; + SetTpDstActionBuilder setTpDstActionBuilder = new SetTpDstActionBuilder(); + + setTpDstActionBuilder.setPort(new PortNumber(setTpDst.getPort())); + + targetAction = setTpDstActionBuilder.build(); } else if (sourceAction instanceof SetTpSrc) { - // TODO: define maping + SetTpSrc setTpSrc = (SetTpSrc) sourceAction; + SetTpSrcActionBuilder setTpSrcActionBuilder = new SetTpSrcActionBuilder(); + + setTpSrcActionBuilder.setPort(new PortNumber(setTpSrc.getPort())); + + targetAction = setTpSrcActionBuilder.build(); } else if (sourceAction instanceof SetVlanCfi) { - // TODO: define maping + SetVlanCfi setVlanCfi = (SetVlanCfi) sourceAction; + SetVlanCfiActionBuilder setVlanCfiActionBuilder = new SetVlanCfiActionBuilder(); + + setVlanCfiActionBuilder.setVlanCfi(new VlanCfi(setVlanCfi.getCfi())); + + targetAction = setVlanCfiActionBuilder.build(); } else if (sourceAction instanceof SetVlanId) { - // TODO: define maping + SetVlanId setVlanId = (SetVlanId) sourceAction; + SetVlanIdActionBuilder setVlanIdActionBuilder = new SetVlanIdActionBuilder(); + + setVlanIdActionBuilder.setVlanId(new VlanId(setVlanId.getVlanId())); + + targetAction = setVlanIdActionBuilder.build(); } else if (sourceAction instanceof SetVlanPcp) { - // TODO: define maping + SetVlanPcp setVlanPcp = (SetVlanPcp) sourceAction; + SetVlanPcpActionBuilder setVlanPcpActionBuilder = new SetVlanPcpActionBuilder(); + + setVlanPcpActionBuilder.setVlanPcp(new VlanPcp((short) setVlanPcp.getPcp())); + + targetAction = setVlanPcpActionBuilder.build(); } else if (sourceAction instanceof SwPath) { - // TODO: define maping + targetAction = new SwPathActionBuilder().build(); } targetActionBuilder.setAction(targetAction); @@ -173,6 +210,20 @@ public class FromSalConversionsUtils { return targetActionBuilder.build(); } + private static Address addressFromAction(InetAddress inetAddress) { + byte[] byteInetAddresss = inetAddress.getAddress(); + if (inetAddress instanceof Inet4Address) { + Ipv4Builder ipv4Builder = new Ipv4Builder(); + ipv4Builder.setIpv4Address(new Ipv4Prefix(Arrays.toString(byteInetAddresss))); + return ipv4Builder.build(); + } else if (inetAddress instanceof Inet6Address) { + Ipv6Builder ipv6Builder = new Ipv6Builder(); + ipv6Builder.setIpv6Address(new Ipv6Prefix(Arrays.toString(byteInetAddresss))); + return ipv6Builder.build(); + } + return null; + } + private static List nodeConnectorToUri(NodeConnector nodeConnector) { // TODO Define mapping return null; @@ -312,13 +363,9 @@ public class FromSalConversionsUtils { .setAddress(ethernetSourceAddressFrom(sourceMatch)); targetEthMatchBuild.setEthernetSource(ethSourBuild.build()); - final MatchField dataLinkDest = sourceMatch.getField(DL_DST); - if (dataLinkDest != null && dataLinkDest.getValue() != null) { - final MacAddress macDestAddress; - macDestAddress = new MacAddress((String) (dataLinkDest.getValue())); - EthernetDestinationBuilder ethDestBuild = new EthernetDestinationBuilder().setAddress(macDestAddress); - targetEthMatchBuild.setEthernetDestination(ethDestBuild.build()); - } + EthernetDestinationBuilder ethDestBuild = new EthernetDestinationBuilder() + .setAddress(ethernetDestAddressFrom(sourceMatch)); + targetEthMatchBuild.setEthernetDestination(ethDestBuild.build()); final MatchField dataLinkType = sourceMatch.getField(MatchType.DL_TYPE); if (dataLinkType != null && dataLinkType.getValue() != null) { diff --git a/opendaylight/md-sal/sal-compability/src/main/java/org/opendaylight/controller/sal/compability/ToSalConversionsUtils.java b/opendaylight/md-sal/sal-compability/src/main/java/org/opendaylight/controller/sal/compability/ToSalConversionsUtils.java index c113cd8924..ad1a2f9387 100644 --- a/opendaylight/md-sal/sal-compability/src/main/java/org/opendaylight/controller/sal/compability/ToSalConversionsUtils.java +++ b/opendaylight/md-sal/sal-compability/src/main/java/org/opendaylight/controller/sal/compability/ToSalConversionsUtils.java @@ -17,37 +17,24 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import org.opendaylight.controller.sal.action.Controller; -import org.opendaylight.controller.sal.action.Output; +import org.opendaylight.controller.sal.action.*; import org.opendaylight.controller.sal.core.NodeConnector; import org.opendaylight.controller.sal.flowprogrammer.Flow; import org.opendaylight.controller.sal.match.Match; -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.Ipv4Prefix; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.*; 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.flow.service.rev130819.NodeFlow; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.ControllerAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.OutputAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.PopMplsAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.PushMplsAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.PushPbbAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.PushVlanAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetMplsTtlAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetNwTtlAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetQueueAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.VlanCfi; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.*; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.Address; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.address.Ipv4; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.address.Ipv6; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.Action; import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType; import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.MacAddressFilter; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.ethernet.match.fields.EthernetType; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.EthernetMatch; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.IpMatch; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.Layer3Match; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.Layer4Match; -import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.VlanMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.*; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._3.match.ArpMatch; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._3.match.Ipv4Match; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._3.match.Ipv6Match; @@ -128,11 +115,161 @@ public class ToSalConversionsUtils { } else if (sourceAction instanceof SetQueueAction) { // TODO: define maping // targetAction = //no action to map + } else if (sourceAction instanceof DropAction) { + targetAction.add(new Drop()); + } else if (sourceAction instanceof FloodAction) { + targetAction.add(new Flood()); + } else if (sourceAction instanceof FloodAllAction) { + targetAction.add(new FloodAll()); + } else if (sourceAction instanceof HwPathAction) { + targetAction.add(new HwPath()); + } else if (sourceAction instanceof LoopbackAction) { + targetAction.add(new Loopback()); + } else if (sourceAction instanceof PopVlanAction) { + targetAction.add(new PopVlan()); + } else if (sourceAction instanceof PushVlanAction) { + PushVlanAction pushVlanAction = (PushVlanAction) sourceAction; + PushVlan pushVlan = pushVlanFrom(pushVlanAction); + if (pushVlan != null) { + targetAction.add(pushVlan); + } + } else if (sourceAction instanceof SetDlDstAction) { + MacAddress addressL2Dest = ((SetDlDstAction) sourceAction).getAddress(); + if (addressL2Dest != null) { + String addressValue = addressL2Dest.getValue(); + if (addressValue != null) { + targetAction.add(new SetDlDst(addressValue.getBytes())); + } + } + } else if (sourceAction instanceof SetDlSrcAction) { + MacAddress addressL2Src = ((SetDlSrcAction) sourceAction).getAddress(); + if (addressL2Src != null) { + String addressValue = addressL2Src.getValue(); + if (addressValue != null) { + targetAction.add(new SetDlSrc(addressValue.getBytes())); + } + } + } else if (sourceAction instanceof SetDlTypeAction) { + EtherType dlType = ((SetDlTypeAction) sourceAction).getDlType(); + if (dlType != null) { + Long dlTypeValue = dlType.getValue(); + if (dlTypeValue != null) { + targetAction.add(new SetDlType(dlTypeValue.intValue())); + } + } + } else if (sourceAction instanceof SetNextHopAction) { + Address addressL3 = ((SetNextHopAction) sourceAction).getAddress(); + + InetAddress inetAddress = inetAddressFrom(addressL3); + if (inetAddress != null) { + targetAction.add(new SetNextHop(inetAddress)); + } + } else if (sourceAction instanceof SetNwDstAction) { + Address addressL3 = ((SetNwDstAction) sourceAction).getAddress(); + + InetAddress inetAddress = inetAddressFrom(addressL3); + if (inetAddress != null) { + targetAction.add(new SetNwDst(inetAddress)); + } + } else if (sourceAction instanceof SetNwSrcAction) { + Address addressL3 = ((SetNwDstAction) sourceAction).getAddress(); + + InetAddress inetAddress = inetAddressFrom(addressL3); + if (inetAddress != null) { + targetAction.add(new SetNwSrc(inetAddress)); + } + } else if (sourceAction instanceof SetNwTosAction) { + Integer tos = ((SetNwTosAction) sourceAction).getTos(); + if (tos != null) { + targetAction.add(new SetNwTos(tos)); + } + } else if (sourceAction instanceof SetTpDstAction) { + PortNumber port = ((SetTpDstAction) sourceAction).getPort(); + if (port != null) { + Integer portValue = port.getValue(); + if (port.getValue() != null) { + targetAction.add(new SetTpDst(portValue)); + } + } + } else if (sourceAction instanceof SetTpSrcAction) { + PortNumber port = ((SetTpSrcAction) sourceAction).getPort(); + if (port != null) { + Integer portValue = port.getValue(); + if (port.getValue() != null) { + targetAction.add(new SetTpSrc(portValue)); + } + } + } else if (sourceAction instanceof SetVlanCfiAction) { + VlanCfi vlanCfi = ((SetVlanCfiAction) sourceAction).getVlanCfi(); + if (vlanCfi != null) { + Integer vlanCfiValue = vlanCfi.getValue(); + if (vlanCfiValue != null) { + targetAction.add(new SetVlanCfi(vlanCfiValue)); + } + } + } else if (sourceAction instanceof SetVlanIdAction) { + org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId vlanID = ((SetVlanIdAction) sourceAction) + .getVlanId(); + if (vlanID != null) { + Integer vlanIdValue = vlanID.getValue(); + if (vlanIdValue != null) { + targetAction.add(new SetVlanId(vlanIdValue)); + } + } + } else if (sourceAction instanceof SetVlanPcpAction) { + VlanPcp vlanPcp = ((SetVlanPcpAction) sourceAction).getVlanPcp(); + if (vlanPcp != null) { + Short vlanPcpValue = vlanPcp.getValue(); + if (vlanPcpValue != null) { + targetAction.add(new SetVlanPcp(vlanPcpValue)); + } + } + } else if (sourceAction instanceof SwPathAction) { + targetAction.add(new SwPath()); } return targetAction; } + private static InetAddress inetAddressFrom(Address addressL3) { + if (addressL3 != null) { + if (addressL3 instanceof Ipv4) { + Ipv4Prefix addressL3Ipv4 = ((Ipv4) addressL3).getIpv4Address(); + if (addressL3Ipv4 != null) { + return inetAddressFrom(addressL3Ipv4); + } + } else if (addressL3 instanceof Ipv6) { + Ipv6Prefix addressL3Ipv6 = ((Ipv6) addressL3).getIpv6Address(); + if (addressL3Ipv6 != null) { + return inetAddressFrom(addressL3Ipv6); + } + } + } + return null; + } + + private static PushVlan pushVlanFrom(PushVlanAction pushVlanAction) { + final int tag; + final int pcp; + final int cfi; + final int vlanId; + + if (pushVlanAction.getTag() != null) { + tag = pushVlanAction.getTag(); + if (pushVlanAction.getPcp() != null) { + pcp = pushVlanAction.getPcp(); + if (pushVlanAction.getCfi() != null && pushVlanAction.getCfi().getValue() != null) { + cfi = pushVlanAction.getCfi().getValue(); + if (pushVlanAction.getVlanId() != null && pushVlanAction.getVlanId().getValue() != null) { + vlanId = pushVlanAction.getVlanId().getValue(); + return new PushVlan(tag, pcp, cfi, vlanId); + } + } + } + } + return null; + } + private static NodeConnector fromNodeConnectorRef(Uri uri) { // TODO: Define mapping return null; -- 2.36.6