public static InstructionsBuilder createControllerInstructions() {
    // ActionList
    List<Action> actionList = Lists.newArrayList();
    // Action 1
    ActionBuilder ab = new ActionBuilder();
    OutputActionBuilder oab = new OutputActionBuilder();
    oab.setMaxLength(65535);
    Uri value = new Uri("CONTROLLER");
    oab.setOutputNodeConnector(value);
    ab.setAction(new OutputActionCaseBuilder().setOutputAction(oab.build()).build());
    ab.setOrder(0);
    ab.setKey(new ActionKey(0));

    actionList.add(ab.build());
    // Action End

    // 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.setOrder(0);
    ib.setKey(new InstructionKey(0));

    // Put our Instruction in a list of Instructions
    InstructionsBuilder isb = new InstructionsBuilder();
    List<Instruction> instructions = new ArrayList<Instruction>();
    instructions.add(ib.build());
    isb.setInstruction(instructions);
    return isb;
  }
  public static InstructionsBuilder createDropInstructions() {
    // Add our drop action to a list
    List<Action> actionList = Lists.newArrayList();

    // Drop Action
    DropActionBuilder dab = new DropActionBuilder();
    DropAction dropAction = dab.build();
    ActionBuilder ab = new ActionBuilder();
    ab.setAction(new DropActionCaseBuilder().setDropAction(dropAction).build());
    ab.setOrder(0);
    ab.setKey(new ActionKey(0));

    actionList.add(ab.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.setOrder(0);
    ib.setKey(new InstructionKey(0));

    // Put our Instruction in a list of Instructions
    InstructionsBuilder isb = new InstructionsBuilder();
    List<Instruction> instructions = new ArrayList<Instruction>();
    instructions.add(ib.build());
    isb.setInstruction(instructions);
    return isb;
  }
  // createDlSrcInstructions(InstructionBuilder ib, MacAddress macAddress) {
  //	public static InstructionsBuilder create_DlSrc_NwSrc_Instructions(MacAddress macAddress,
  // Ipv4Prefix prefixSrc) {
  public static InstructionsBuilder create_DlSrc_NwSrc_outputPort_Instructions(
      MacAddress macAddress, Ipv4Prefix prefixSrc, String outputPort) {
    // ActionList
    List<Action> actionList = Lists.newArrayList();
    // Action 1
    ActionBuilder ab = new ActionBuilder();
    SetDlSrcActionBuilder dlSrcActionBuilder = new SetDlSrcActionBuilder();
    dlSrcActionBuilder.setAddress(macAddress);
    ab.setAction(
        new SetDlSrcActionCaseBuilder().setSetDlSrcAction(dlSrcActionBuilder.build()).build());
    ab.setOrder(0);
    ab.setKey(new ActionKey(0));

    // Action 2
    ActionBuilder ab2 = new ActionBuilder();
    SetNwSrcActionBuilder setNwsrcActionBuilder = new SetNwSrcActionBuilder();
    Ipv4Builder ipsrc = new Ipv4Builder();
    ipsrc.setIpv4Address(prefixSrc);
    setNwsrcActionBuilder.setAddress(ipsrc.build());
    ab2.setAction(
        new SetNwSrcActionCaseBuilder().setSetNwSrcAction(setNwsrcActionBuilder.build()).build());
    ab2.setOrder(1);
    ab2.setKey(new ActionKey(1));

    // - have to make nodeconnectionid store table
    // Action 3
    ActionBuilder ab3 = new ActionBuilder();
    OutputActionBuilder outputActionBuilder = new OutputActionBuilder();
    if (outputPort.equals("4294967291")) {
      outputActionBuilder.setOutputNodeConnector(new Uri("FLOOD"));
    } else {
      outputActionBuilder.setOutputNodeConnector(new Uri("output:" + outputPort));
    }
    ab3.setAction(
        new OutputActionCaseBuilder().setOutputAction(outputActionBuilder.build()).build());
    ab3.setOrder(2);
    ab3.setKey(new ActionKey(2));

    actionList.add(ab.build());
    actionList.add(ab2.build());
    actionList.add(ab3.build());
    // Action End

    // 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.setOrder(0);
    ib.setKey(new InstructionKey(0));

    // Put our Instruction in a list of Instructions
    InstructionsBuilder isb = new InstructionsBuilder();
    List<Instruction> instructions = new ArrayList<Instruction>();
    instructions.add(ib.build());
    isb.setInstruction(instructions);
    return isb;
  }
  @Override
  public Status programIpRewriteExclusion(
      Long dpid, String segmentationId, String excludedCidr, Action action) {
    String nodeName = Constants.OPENFLOW_NODE_PREFIX + dpid;

    MatchBuilder matchBuilder = new MatchBuilder();
    NodeBuilder nodeBuilder = OF13Provider.createNodeBuilder(nodeName);

    // Instructions List Stores Individual Instructions
    InstructionsBuilder isb = new InstructionsBuilder();
    List<Instruction> instructions = Lists.newArrayList();
    InstructionBuilder ib;

    MatchUtils.createTunnelIDMatch(matchBuilder, new BigInteger(segmentationId));
    String ipAddress = excludedCidr.substring(0, excludedCidr.indexOf("/"));
    InetAddress inetAddress;
    try {
      inetAddress = InetAddress.getByName(ipAddress);
    } catch (UnknownHostException e) {
      return new Status(StatusCode.BADREQUEST);
    }
    if (inetAddress instanceof Inet6Address) {
      // WORKAROUND: For now ipv6 is not supported
      // TODO: implement ipv6 cidr case
      LOG.debug("ipv6 cidr is not implemented yet. cidr {}", excludedCidr);
      return new Status(StatusCode.NOTIMPLEMENTED);
    }
    MatchUtils.createDstL3IPv4Match(matchBuilder, new Ipv4Prefix(excludedCidr));

    // Goto Next Table
    ib = getMutablePipelineInstructionBuilder();
    ib.setOrder(0);
    ib.setKey(new InstructionKey(0));
    instructions.add(ib.build());

    FlowBuilder flowBuilder = new FlowBuilder();
    flowBuilder.setMatch(matchBuilder.build());
    flowBuilder.setInstructions(isb.setInstruction(instructions).build());

    String flowId = "InboundNATExclusion_" + segmentationId + "_" + excludedCidr;
    flowBuilder.setId(new FlowId(flowId));
    FlowKey key = new FlowKey(new FlowId(flowId));
    flowBuilder.setBarrier(true);
    flowBuilder.setTableId(this.getTable());
    flowBuilder.setKey(key);
    flowBuilder.setPriority(1024);
    flowBuilder.setFlowName(flowId);
    flowBuilder.setHardTimeout(0);
    flowBuilder.setIdleTimeout(0);

    if (action.equals(Action.ADD)) {
      writeFlow(flowBuilder, nodeBuilder);
    } else {
      removeFlow(flowBuilder, nodeBuilder);
    }

    // ToDo: WriteFlow/RemoveFlow should return something we can use to check success
    return new Status(StatusCode.SUCCESS);
  }
  public static InstructionsBuilder create_DlSrc_NwSrc_Controller_Instructions(
      MacAddress macAddress, Ipv4Prefix prefixSrc) {
    // ActionList
    List<Action> actionList = Lists.newArrayList();
    // Action 1
    ActionBuilder ab = new ActionBuilder();
    SetDlSrcActionBuilder dlSrcActionBuilder = new SetDlSrcActionBuilder();
    dlSrcActionBuilder.setAddress(macAddress);
    ab.setAction(
        new SetDlSrcActionCaseBuilder().setSetDlSrcAction(dlSrcActionBuilder.build()).build());
    ab.setOrder(0);
    ab.setKey(new ActionKey(0));

    // Action 2
    ActionBuilder ab2 = new ActionBuilder();
    SetNwSrcActionBuilder setNwsrcActionBuilder = new SetNwSrcActionBuilder();
    Ipv4Builder ipsrc = new Ipv4Builder();
    ipsrc.setIpv4Address(prefixSrc);
    setNwsrcActionBuilder.setAddress(ipsrc.build());
    ab2.setAction(
        new SetNwSrcActionCaseBuilder().setSetNwSrcAction(setNwsrcActionBuilder.build()).build());
    ab2.setOrder(1);
    ab2.setKey(new ActionKey(1));

    // Action 3
    ActionBuilder ab3 = new ActionBuilder();
    OutputActionBuilder oab = new OutputActionBuilder();
    oab.setMaxLength(65535);
    Uri value = new Uri("CONTROLLER");
    oab.setOutputNodeConnector(value);
    ab3.setAction(new OutputActionCaseBuilder().setOutputAction(oab.build()).build());
    ab3.setOrder(2);
    ab3.setKey(new ActionKey(2));

    actionList.add(ab.build());
    actionList.add(ab2.build());
    actionList.add(ab3.build());
    // Action End

    // 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.setOrder(0);
    ib.setKey(new InstructionKey(0));

    // Put our Instruction in a list of Instructions
    InstructionsBuilder isb = new InstructionsBuilder();
    List<Instruction> instructions = new ArrayList<Instruction>();
    instructions.add(ib.build());
    isb.setInstruction(instructions);
    return isb;
  }
  @Override
  public Status programIpRewriteRule(
      Long dpid,
      Long inPort,
      String destSegId,
      InetAddress matchAddress,
      InetAddress rewriteAddress,
      Action action) {
    String nodeName = Constants.OPENFLOW_NODE_PREFIX + dpid;

    MatchBuilder matchBuilder = new MatchBuilder();
    NodeBuilder nodeBuilder = OF13Provider.createNodeBuilder(nodeName);

    // Instructions List Stores Individual Instructions
    InstructionsBuilder isb = new InstructionsBuilder();
    List<Instruction> instructions = Lists.newArrayList();
    InstructionBuilder ib = new InstructionBuilder();

    MatchUtils.createInPortMatch(matchBuilder, dpid, inPort);
    MatchUtils.createDstL3IPv4Match(
        matchBuilder, MatchUtils.iPv4PrefixFromIPv4Address(matchAddress.getHostAddress()));

    // Set register to indicate that rewrite took place
    ActionBuilder actionBuilder = new ActionBuilder();
    actionBuilder.setAction(
        ActionUtils.nxLoadRegAction(
            new DstNxRegCaseBuilder().setNxReg(REG_FIELD).build(), new BigInteger(destSegId)));

    // Set Dest IP address and set REG_FIELD
    InstructionUtils.createNwDstInstructions(
        ib, MatchUtils.iPv4PrefixFromIPv4Address(rewriteAddress.getHostAddress()), actionBuilder);
    ib.setOrder(0);
    ib.setKey(new InstructionKey(0));
    instructions.add(ib.build());

    // Goto Next Table
    ib = getMutablePipelineInstructionBuilder();
    ib.setOrder(1);
    ib.setKey(new InstructionKey(1));
    instructions.add(ib.build());

    FlowBuilder flowBuilder = new FlowBuilder();
    flowBuilder.setMatch(matchBuilder.build());
    flowBuilder.setInstructions(isb.setInstruction(instructions).build());

    String flowId = "InboundNAT_" + inPort + "_" + destSegId + "_" + matchAddress.getHostAddress();
    flowBuilder.setId(new FlowId(flowId));
    FlowKey key = new FlowKey(new FlowId(flowId));
    flowBuilder.setBarrier(true);
    flowBuilder.setTableId(this.getTable());
    flowBuilder.setKey(key);
    flowBuilder.setPriority(1024);
    flowBuilder.setFlowName(flowId);
    flowBuilder.setHardTimeout(0);
    flowBuilder.setIdleTimeout(0);

    if (action.equals(Action.ADD)) {
      writeFlow(flowBuilder, nodeBuilder);
    } else {
      removeFlow(flowBuilder, nodeBuilder);
    }

    // ToDo: WriteFlow/RemoveFlow should return something we can use to check success
    return new Status(StatusCode.SUCCESS);
  }
  //	public static InstructionsBuilder create_DlDst_NwDst_Instructions(MacAddress macAddress,
  // Ipv4Prefix prefixDst) {
  public static InstructionsBuilder create_DlDst_NwDst_outputPort_Instructions(
      MacAddress macAddress, Ipv4Prefix prefixDst, String outputPort) {
    //	public static InstructionsBuilder
    // create_DlDst_NwDst_outputPort_controller_Instructions(MacAddress macAddress, Ipv4Prefix
    // prefixDst, String outputPort) {
    // ActionList
    List<Action> actionList = Lists.newArrayList();
    // Action 1
    ActionBuilder ab = new ActionBuilder();
    SetDlDstActionBuilder dlDstActionBuilder = new SetDlDstActionBuilder();
    dlDstActionBuilder.setAddress(macAddress);
    ab.setAction(
        new SetDlDstActionCaseBuilder().setSetDlDstAction(dlDstActionBuilder.build()).build());
    ab.setOrder(0);
    ab.setKey(new ActionKey(0));

    // Action 2
    ActionBuilder ab2 = new ActionBuilder();
    SetNwDstActionBuilder setNwDstActionBuilder = new SetNwDstActionBuilder();
    Ipv4Builder ipDst = new Ipv4Builder();
    ipDst.setIpv4Address(prefixDst);
    setNwDstActionBuilder.setAddress(ipDst.build());
    ab2.setAction(
        new SetNwDstActionCaseBuilder().setSetNwDstAction(setNwDstActionBuilder.build()).build());
    ab2.setOrder(1);
    ab2.setKey(new ActionKey(1));

    // - have to make nodeconnectionid store table
    // Action 3
    ActionBuilder ab3 = new ActionBuilder();
    OutputActionBuilder outputActionBuilder = new OutputActionBuilder();
    //		outputActionBuilder.setOutputNodeConnector(new Uri("output:1"));
    outputActionBuilder.setOutputNodeConnector(new Uri("output:" + outputPort));
    ab3.setAction(
        new OutputActionCaseBuilder().setOutputAction(outputActionBuilder.build()).build());
    ab3.setOrder(2);
    ab3.setKey(new ActionKey(2));

    //		// Action 4
    //		ActionBuilder ab4 = new ActionBuilder();
    //		OutputActionBuilder outputActionBuilder2 = new OutputActionBuilder();
    //		outputActionBuilder2.setMaxLength(65535);
    //		outputActionBuilder2.setOutputNodeConnector(new Uri("CONTROLLER"));
    //		ab4.setAction(new
    // OutputActionCaseBuilder().setOutputAction(outputActionBuilder2.build()).build());
    //		ab4.setOrder(3);
    //		ab4.setKey(new ActionKey(3));

    actionList.add(ab.build());
    actionList.add(ab2.build());
    actionList.add(ab3.build());
    //		actionList.add(ab4.build());
    // Action End

    // 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.setOrder(0);
    ib.setKey(new InstructionKey(0));

    // Put our Instruction in a list of Instructions
    InstructionsBuilder isb = new InstructionsBuilder();
    List<Instruction> instructions = new ArrayList<Instruction>();
    instructions.add(ib.build());

    isb.setInstruction(instructions);
    return isb;
  }