Flow.Builder flowBuilder = headerConstraintsToFlow(question.getHeaders(), null); flowBuilder.setIngressNode(node); flowBuilder.setIngressInterface(null); flowBuilder.setIngressVrf(
private Optional<Flow> getFlow( BDDPacket pkt, BDDSourceManager bddSourceManager, String hostname, BDD bdd) { if (bdd.isZero()) { return Optional.empty(); } BDD assignment = bdd.fullSatOne(); return Optional.of( pkt.getFlowFromAssignment(assignment) .setTag(getFlowTag()) .setIngressNode(hostname) .setIngressInterface(bddSourceManager.getSourceFromAssignment(assignment).orElse(null)) .build()); }
switch (loc.getType()) { case INTERFACE_LINK: fb.setIngressInterface(loc.getInterface()); break; case VRF:
switch (loc.getType()) { case INTERFACE_LINK: flow.setIngressInterface(loc.getInterface()); break; case VRF:
break; case INTERFACE_LINK: flow.setIngressInterface(source.getInterface()); break; default:
protected static Flow createFlow( IngressLocation ingressLocation, Map<String, Long> constraints, String tag) { Flow.Builder flowBuilder = new Flow.Builder(); switch (ingressLocation.getType()) { case INTERFACE_LINK: flowBuilder .setIngressNode(ingressLocation.getNode()) .setIngressInterface(ingressLocation.getInterface()); break; case VRF: flowBuilder .setIngressNode(ingressLocation.getNode()) .setIngressVrf(ingressLocation.getVrf()); break; default: throw new BatfishException("Unexpected IngressLocation Type: " + ingressLocation.getType()); } flowBuilder.setTag(tag); constraints.forEach( (name, value) -> { if (!flowBuilders.containsKey(name)) { return; } flowBuilders.get(name).accept(flowBuilder, value); }); return flowBuilder.build(); }
/** * Creates a return {@link Flow} for the input {@param forwardFlow}. Swaps the source/destination * IPs/ports, and sets the ingress node/vrf/interface. */ static Flow returnFlow( Flow forwardFlow, String returnIngressNode, @Nullable String returnIngressVrf, @Nullable String returnIngressIface) { checkArgument( returnIngressVrf == null ^ returnIngressIface == null, "Either returnIngressVrf or returnIngressIface required, but not both"); return forwardFlow .toBuilder() .setDstIp(forwardFlow.getSrcIp()) .setDstPort(forwardFlow.getSrcPort()) .setSrcIp(forwardFlow.getDstIp()) .setSrcPort(forwardFlow.getDstPort()) .setIngressNode(returnIngressNode) .setIngressVrf(returnIngressVrf) .setIngressInterface(returnIngressIface) .build(); }
@VisibleForTesting static Flow multipathInconsistencyToFlow( BDDPacket bddPacket, MultipathInconsistency violation, String flowTag) { Flow.Builder fb = bddPacket .getFlow(violation.getBDD()) .orElseGet( () -> { throw new BatfishException("MultipathConsistencyViolation with UNSAT predicate"); }); fb.setTag(flowTag); IngressLocation ingressLocation = violation.getIngressLocation(); if (ingressLocation.isIngressVrf()) { fb.setIngressNode(ingressLocation.getNode()); fb.setIngressVrf(ingressLocation.getVrf()); } else { fb.setIngressNode(ingressLocation.getNode()); fb.setIngressInterface(ingressLocation.getInterface()); } return fb.build(); } }
@Override public Void visitInterfaceLocation(@Nonnull InterfaceLocation interfaceLocation) { flowBuilder .setIngressInterface(null) .setIngressNode(interfaceLocation.getNodeName()) .setIngressVrf( c.getAllInterfaces() .get(interfaceLocation.getInterfaceName()) .getVrf() .getName()); return null; } });
@Override public Void visitInterfaceLocation(@Nonnull InterfaceLocation interfaceLocation) { flowBuilder .setIngressInterface(null) .setIngressNode(interfaceLocation.getNodeName()) .setIngressVrf( interfaceVrf( interfaceLocation.getNodeName(), interfaceLocation.getInterfaceName())); return null; } });
@Override public Void visitInterfaceLinkLocation( @Nonnull InterfaceLinkLocation interfaceLinkLocation) { flowBuilder .setIngressInterface(interfaceLinkLocation.getInterfaceName()) .setIngressNode(interfaceLinkLocation.getNodeName()) .setIngressVrf(null); return null; }
@Test public void testSetFlowStates() { Builder builder = Flow.builder().setIngressNode("node").setIngressInterface("iface").setTag("tag"); PacketHeaderConstraints phc = PacketHeaderConstraints.builder() .setFlowStates(Collections.singleton(FlowState.ESTABLISHED)) .build(); setFlowStates(phc, builder); assertThat(builder.build().getState(), equalTo(FlowState.ESTABLISHED)); }
@Test public void testDefaultPacketLength() { Builder builder = Flow.builder().setIngressNode("node").setIngressInterface("iface").setTag("tag"); PacketHeaderConstraints phc = PacketHeaderConstraints.unconstrained(); setPacketLength(phc, builder); assertThat(builder.build().getPacketLength(), equalTo(DEFAULT_PACKET_LENGTH)); }
@Test public void testSetFragmentOffsets() { Builder builder = Flow.builder().setIngressNode("node").setIngressInterface("iface").setTag("tag"); PacketHeaderConstraints phc = PacketHeaderConstraints.builder() .setFragmentOffsets(IntegerSpace.of(new SubRange(2, 2))) .build(); setFragmentOffsets(phc, builder); assertThat(builder.build().getFragmentOffset(), equalTo(2)); }
@Test public void testSetTcpFlags() { Builder builder = Flow.builder().setIngressNode("node").setIngressInterface("iface").setTag("tag"); PacketHeaderConstraints phc = PacketHeaderConstraints.builder() .setTcpFlags(Collections.singleton(TcpFlagsMatchConditions.ACK_TCP_FLAG)) .build(); setTcpFlags(phc, builder); assertThat(builder.build().getTcpFlagsAck(), equalTo(1)); }
@Test public void testSetEcnValue() { Builder builder = Flow.builder().setIngressNode("node").setIngressInterface("iface").setTag("tag"); PacketHeaderConstraints phc = PacketHeaderConstraints.builder().setEcns(IntegerSpace.of(1)).build(); setEcnValue(phc, builder); assertThat(builder.build().getEcn(), equalTo(1)); }
@Override public Void visitInterfaceLinkLocation( @Nonnull InterfaceLinkLocation interfaceLinkLocation) { flowBuilder .setIngressInterface(interfaceLinkLocation.getInterfaceName()) .setIngressNode(interfaceLinkLocation.getNodeName()) .setIngressVrf(null); return null; }