@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); }
@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); }