X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fprotocol_plugins%2Fopenflow%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fprotocol_plugin%2Fopenflow%2Finternal%2FFlowConverter.java;h=8fa4941b88771c94dbf3b578a3f89717339f899e;hb=f853f4cb2c1bd86ec2f227d34fad097073e5c1ee;hp=daf1aa8b7168a8b3a4670f21d0468036e42a380f;hpb=da83334266c05cdbd01b438dae795180ffc133d3;p=controller.git diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowConverter.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowConverter.java index daf1aa8b71..8fa4941b88 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowConverter.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/FlowConverter.java @@ -12,7 +12,9 @@ import java.math.BigInteger; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.opendaylight.controller.protocol_plugin.openflow.vendorextension.v6extension.V6FlowMod; import org.opendaylight.controller.protocol_plugin.openflow.vendorextension.v6extension.V6Match; @@ -20,6 +22,7 @@ import org.opendaylight.controller.sal.action.Action; import org.opendaylight.controller.sal.action.ActionType; import org.opendaylight.controller.sal.action.Controller; import org.opendaylight.controller.sal.action.Drop; +import org.opendaylight.controller.sal.action.Enqueue; import org.opendaylight.controller.sal.action.Flood; import org.opendaylight.controller.sal.action.FloodAll; import org.opendaylight.controller.sal.action.HwPath; @@ -451,13 +454,10 @@ public class FlowConverter { if (port != null) { ((OFFlowMod) fm).setOutPort(port); } - if (command == OFFlowMod.OFPFC_ADD - || command == OFFlowMod.OFPFC_MODIFY + if (command == OFFlowMod.OFPFC_ADD || command == OFFlowMod.OFPFC_MODIFY || command == OFFlowMod.OFPFC_MODIFY_STRICT) { - if (flow.getIdleTimeout() != 0 || flow.getHardTimeout() != 0) { - // Instruct switch to let controller know when flow expires - ((OFFlowMod) fm).setFlags((short) 1); - } + // Instruct switch to let controller know when flow is removed + ((OFFlowMod) fm).setFlags((short) 1); } } else { ((V6FlowMod) fm).setVendor(); @@ -475,13 +475,10 @@ public class FlowConverter { if (port != null) { ((V6FlowMod) fm).setOutPort(port); } - if (command == OFFlowMod.OFPFC_ADD - || command == OFFlowMod.OFPFC_MODIFY + if (command == OFFlowMod.OFPFC_ADD || command == OFFlowMod.OFPFC_MODIFY || command == OFFlowMod.OFPFC_MODIFY_STRICT) { - if (flow.getIdleTimeout() != 0 || flow.getHardTimeout() != 0) { - // Instruct switch to let controller know when flow expires - ((V6FlowMod) fm).setFlags((short) 1); - } + // Instruct switch to let controller know when flow is removed + ((V6FlowMod) fm).setFlags((short) 1); } } logger.trace("Openflow Match: {} Openflow Actions: {}", ofMatch, @@ -753,4 +750,50 @@ public class FlowConverter { return flow; } + private static final Map> actionMap = new HashMap>() { + private static final long serialVersionUID = 1L; + { + put(1 << 0, Output.class); + put(1 << 1, SetVlanId.class); + put(1 << 2, SetVlanPcp.class); + put(1 << 3, PopVlan.class); + put(1 << 4, SetDlSrc.class); + put(1 << 5, SetDlDst.class); + put(1 << 6, SetNwSrc.class); + put(1 << 7, SetNwDst.class); + put(1 << 8, SetNwTos.class); + put(1 << 9, SetTpSrc.class); + put(1 << 10, SetTpDst.class); + put(1 << 11, Enqueue.class); + } + }; + + /** + * Returns the supported flow actions for the netwrok node given the bitmask + * representing the actions the Openflow 1.0 switch supports + * + * @param ofActionBitmask + * OF 1.0 action bitmask + * @return The correspondent list of SAL Action classes + */ + public static List> getFlowActions(int ofActionBitmask) { + List> list = new ArrayList>(); + + for (int i = 0; i < Integer.SIZE; i++) { + int index = 1 << i; + if ((index & ofActionBitmask) > 0) { + if (actionMap.containsKey(index)) { + list.add(actionMap.get(index)); + } + } + } + // Add implicit SAL actions + list.add(Controller.class); + list.add(SwPath.class); + list.add(HwPath.class); + list.add(Drop.class); + + return list; + } + }