generateRibForwardingObj(IpPrefix.valueOf(route.nextHop(), 32), nextId).add(); flowObjectiveService.forward(deviceId, fob);
/** * Install a rule for pushing node labels to the device of other nodes. * * @param deviceId device to which flow should be pushed * @param labelId label for the device * @param ipPrefix device for which label is pushed * @param type type of operation * @param bBos is this the end of sync push */ public void advertiseNodeLabelRule(DeviceId deviceId, LabelResourceId labelId, IpPrefix ipPrefix, Objective.Operation type, boolean bBos) { checkNotNull(flowObjectiveService); checkNotNull(appId); TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder(); selectorBuilder.matchMplsLabel(MplsLabel.mplsLabel(labelId.id().intValue())); selectorBuilder.matchIPSrc(ipPrefix); if (bBos) { selectorBuilder.matchMplsBos(bBos); } TrafficTreatment treatment = DefaultTrafficTreatment.builder().build(); ForwardingObjective.Builder forwardingObjective = DefaultForwardingObjective.builder() .withSelector(selectorBuilder.build()).withTreatment(treatment) .withFlag(ForwardingObjective.Flag.VERSATILE).fromApp(appId).makePermanent(); if (type.equals(Objective.Operation.ADD)) { flowObjectiveService.forward(deviceId, forwardingObjective.add()); } else { flowObjectiveService.forward(deviceId, forwardingObjective.remove()); } }
@Override public void programTunnelIn(DeviceId deviceId, SegmentationId segmentationId, Iterable<PortNumber> localTunnelPorts, Objective.Operation type) { if (localTunnelPorts == null) { log.info("No tunnel port in device"); return; } Sets.newHashSet(localTunnelPorts).stream().forEach(tp -> { TrafficSelector selector = DefaultTrafficSelector.builder() .matchInPort(tp).add(Criteria.matchTunnelId(Long .parseLong(segmentationId.toString()))) .build(); TrafficTreatment treatment = DefaultTrafficTreatment.builder() .build(); ForwardingObjective.Builder objective = DefaultForwardingObjective .builder().withTreatment(treatment).withSelector(selector) .fromApp(appId).makePermanent().withFlag(Flag.SPECIFIC) .withPriority(L2_CLASSIFIER_PRIORITY); if (type.equals(Objective.Operation.ADD)) { log.debug("programTunnelIn-->ADD"); flowObjectiveService.forward(deviceId, objective.add()); } else { log.debug("programTunnelIn-->REMOVE"); flowObjectiveService.forward(deviceId, objective.remove()); } }); }
private void peerAdded(HostEvent event) { Host peer = event.subject(); Optional<Interface> peerIntf = interfaceService.getInterfacesByPort(peer.location()).stream() .filter(intf -> interfaces.isEmpty() || interfaces.contains(intf.name())) .filter(intf -> peer.vlan().equals(intf.vlan())) .findFirst(); if (!peerIntf.isPresent()) { log.debug("Adding peer {}/{} on {} but the interface is not configured", peer.mac(), peer.vlan(), peer.location()); return; } // Generate L3 Unicast groups and store it in the map int toRouterL3Unicast = createPeerGroup(peer.mac(), peerIntf.get().mac(), peer.vlan(), peer.location().deviceId(), controlPlaneConnectPoint.port()); int toPeerL3Unicast = createPeerGroup(peerIntf.get().mac(), peer.mac(), peer.vlan(), peer.location().deviceId(), peer.location().port()); peerNextId.put(peer, ImmutableSortedSet.of(toRouterL3Unicast, toPeerL3Unicast)); // From peer to router peerIntf.get().ipAddresses().forEach(routerIp -> { flowObjectiveService.forward(peer.location().deviceId(), createPeerObjBuilder(toRouterL3Unicast, routerIp.ipAddress().toIpPrefix()).add()); }); // From router to peer peer.ipAddresses().forEach(peerIp -> { flowObjectiveService.forward(peer.location().deviceId(), createPeerObjBuilder(toPeerL3Unicast, peerIp.toIpPrefix()).add()); }); }
@Override public void programRouteRules(DeviceId deviceId, SegmentationId l3Vni, IpAddress dstVmIP, SegmentationId dstVni, MacAddress dstVmGwMac, MacAddress dstVmMac, Operation type) { TrafficSelector selector = DefaultTrafficSelector.builder() .matchEthType(IP_TYPE) .matchTunnelId(Long.parseLong(l3Vni.segmentationId())) .matchIPDst(IpPrefix.valueOf(dstVmIP, PREFIX_LENGTH)).build(); TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder(); treatment.setEthSrc(dstVmGwMac) .setEthDst(dstVmMac) .add(Instructions.modTunnelId(Long.parseLong(dstVni .segmentationId()))); ForwardingObjective.Builder objective = DefaultForwardingObjective .builder().withTreatment(treatment.build()) .withSelector(selector).fromApp(appId).withFlag(Flag.SPECIFIC) .withPriority(L3FWD_PRIORITY); if (type.equals(Objective.Operation.ADD)) { log.debug("RouteRules-->ADD"); flowObjectiveService.forward(deviceId, objective.add()); } else { log.debug("RouteRules-->REMOVE"); flowObjectiveService.forward(deviceId, objective.remove()); } }
@Override public void programSnatSameSegmentUploadControllerRules(DeviceId deviceId, SegmentationId matchVni, IpAddress srcIP, IpAddress dstIP, IpPrefix prefix, Operation type) { TrafficSelector selector = DefaultTrafficSelector.builder() .matchEthType(Ethernet.TYPE_IPV4) .matchTunnelId(Long.parseLong(matchVni.segmentationId())) .matchIPSrc(IpPrefix.valueOf(srcIP, PREFIC_LENGTH)) .matchIPDst(IpPrefix.valueOf(dstIP, prefix.prefixLength())) .build(); TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder(); treatment.add(Instructions.createOutput(PortNumber.CONTROLLER)); ForwardingObjective.Builder objective = DefaultForwardingObjective .builder().withTreatment(treatment.build()) .withSelector(selector).fromApp(appId).withFlag(Flag.SPECIFIC) .withPriority(SNAT_SAME_SEG_CON_PRIORITY); if (type.equals(Objective.Operation.ADD)) { flowObjectiveService.forward(deviceId, objective.add()); } else { flowObjectiveService.forward(deviceId, objective.remove()); } }
@Override public void programUserdataClassifierRules(DeviceId deviceId, IpPrefix ipPrefix, IpAddress dstIp, MacAddress dstmac, SegmentationId actionVni, Objective.Operation type) { TrafficSelector selector = DefaultTrafficSelector.builder() .matchEthType(Ethernet.TYPE_IPV4).matchIPSrc(ipPrefix) .matchIPDst(IpPrefix.valueOf(dstIp, 32)).build(); TrafficTreatment treatment = DefaultTrafficTreatment.builder() .setTunnelId(Long.parseLong(actionVni.segmentationId())) .setEthDst(dstmac).build(); ForwardingObjective.Builder objective = DefaultForwardingObjective .builder().withTreatment(treatment).withSelector(selector) .fromApp(appId).withFlag(Flag.SPECIFIC) .withPriority(USERDATA_CLASSIFIER_PRIORITY); if (type.equals(Objective.Operation.ADD)) { log.debug("UserdataClassifierRules-->ADD"); flowObjectiveService.forward(deviceId, objective.add()); } else { log.debug("UserdataClassifierRules-->REMOVE"); flowObjectiveService.forward(deviceId, objective.remove()); } }
@Override public void programSnatSameSegmentRules(DeviceId deviceId, SegmentationId matchVni, IpAddress srcIP, IpAddress dstIP, MacAddress ethDst, MacAddress ethSrc, IpAddress ipSrc, SegmentationId actionVni, Objective.Operation type) { TrafficSelector selector = DefaultTrafficSelector.builder() .matchEthType(Ethernet.TYPE_IPV4) .matchTunnelId(Long.parseLong(matchVni.segmentationId())) .matchIPSrc(IpPrefix.valueOf(srcIP, PREFIC_LENGTH)) .matchIPDst(IpPrefix.valueOf(dstIP, PREFIC_LENGTH)).build(); TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder(); treatment.setEthDst(ethDst).setEthSrc(ethSrc).setIpSrc(ipSrc) .setTunnelId(Long.parseLong(actionVni.segmentationId())); ForwardingObjective.Builder objective = DefaultForwardingObjective .builder().withTreatment(treatment.build()) .withSelector(selector).fromApp(appId).withFlag(Flag.SPECIFIC) .withPriority(SNAT_SAME_SEG_PRIORITY); if (type.equals(Objective.Operation.ADD)) { flowObjectiveService.forward(deviceId, objective.add()); } else { flowObjectiveService.forward(deviceId, objective.remove()); } }
@Override public void programRules(DeviceId deviceId, IpAddress dstIp, MacAddress ethSrc, IpAddress ipDst, SegmentationId actionVni, Objective.Operation type) { TrafficSelector selector = DefaultTrafficSelector.builder() .matchEthType(Ethernet.TYPE_IPV4) .matchIPDst(IpPrefix.valueOf(dstIp, PREFIX_LENGTH)).build(); TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder(); treatment.setEthSrc(ethSrc).setIpDst(ipDst) .setTunnelId(Long.parseLong(actionVni.segmentationId())); ForwardingObjective.Builder objective = DefaultForwardingObjective .builder().withTreatment(treatment.build()) .withSelector(selector).fromApp(appId).withFlag(Flag.SPECIFIC) .withPriority(DNAT_PRIORITY); if (type.equals(Objective.Operation.ADD)) { log.debug("RouteRules-->ADD"); flowObjectiveService.forward(deviceId, objective.add()); } else { log.debug("RouteRules-->REMOVE"); flowObjectiveService.forward(deviceId, objective.remove()); } } }
@Override public void programArpClassifierRules(DeviceId deviceId, PortNumber inPort, IpAddress dstIp, SegmentationId actionVni, Objective.Operation type) { TrafficSelector selector = DefaultTrafficSelector.builder() .matchInPort(inPort).matchEthType(ETH_TYPE.ethType().toShort()) .matchArpTpa(Ip4Address.valueOf(dstIp.toString())).build(); TrafficTreatment treatment = DefaultTrafficTreatment.builder() .setTunnelId(Long.parseLong(actionVni.segmentationId())) .build(); ForwardingObjective.Builder objective = DefaultForwardingObjective .builder().withTreatment(treatment).withSelector(selector) .fromApp(appId).withFlag(Flag.SPECIFIC) .withPriority(ARP_CLASSIFIER_PRIORITY); if (type.equals(Objective.Operation.ADD)) { log.debug("ArpClassifierRules-->ADD"); flowObjectiveService.forward(deviceId, objective.add()); } else { log.debug("ArpClassifierRules-->REMOVE"); flowObjectiveService.forward(deviceId, objective.remove()); } }
@Override public void programL3InPortClassifierRules(DeviceId deviceId, PortNumber inPort, MacAddress srcMac, MacAddress dstMac, SegmentationId actionVni, Objective.Operation type) { TrafficSelector selector = DefaultTrafficSelector.builder() .matchInPort(inPort).matchEthSrc(srcMac).matchEthDst(dstMac) .build(); TrafficTreatment treatment = DefaultTrafficTreatment.builder() .setTunnelId(Long.parseLong(actionVni.segmentationId())).build(); ForwardingObjective.Builder objective = DefaultForwardingObjective .builder().withTreatment(treatment).withSelector(selector) .fromApp(appId).withFlag(Flag.SPECIFIC) .withPriority(L3_CLASSIFIER_PRIORITY); if (type.equals(Objective.Operation.ADD)) { log.debug("L3InternalClassifierRules-->ADD"); flowObjectiveService.forward(deviceId, objective.add()); } else { log.debug("L3InternalClassifierRules-->REMOVE"); flowObjectiveService.forward(deviceId, objective.remove()); } }
private void installLocalLabelRule(DeviceId deviceId, LabelResourceId labelId, PortNumber portNum, TunnelId tunnelId, Boolean isBos, Long labelType, Objective.Operation type) { checkNotNull(flowObjectiveService); checkNotNull(appId); TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder(); selectorBuilder.matchMplsLabel(MplsLabel.mplsLabel(labelId.id().intValue())); selectorBuilder.matchInPort(portNum); selectorBuilder.matchTunnelId(Long.parseLong(tunnelId.id())); selectorBuilder.matchMplsBos(isBos); selectorBuilder.matchMetadata(labelType); TrafficTreatment treatment = DefaultTrafficTreatment.builder().build(); ForwardingObjective.Builder forwardingObjective = DefaultForwardingObjective.builder() .withSelector(selectorBuilder.build()) .withTreatment(treatment) .withFlag(ForwardingObjective.Flag.VERSATILE) .fromApp(appId) .makePermanent(); if (type.equals(Objective.Operation.ADD)) { flowObjectiveService.forward(deviceId, forwardingObjective.add()); } else { flowObjectiveService.forward(deviceId, forwardingObjective.remove()); } } }
@Override public void programArpClassifierRules(DeviceId deviceId, IpAddress dstIp, SegmentationId actionVni, Objective.Operation type) { TrafficSelector selector = DefaultTrafficSelector.builder() .matchEthType(ETH_TYPE.ethType().toShort()) .matchArpTpa(Ip4Address.valueOf(dstIp.toString())) .build(); TrafficTreatment treatment = DefaultTrafficTreatment.builder() .setTunnelId(Long.parseLong(actionVni.segmentationId())) .build(); ForwardingObjective.Builder objective = DefaultForwardingObjective .builder().withTreatment(treatment).withSelector(selector) .fromApp(appId).withFlag(Flag.SPECIFIC) .withPriority(ARP_CLASSIFIER_PRIORITY); if (type.equals(Objective.Operation.ADD)) { log.debug("ArpClassifierRules-->ADD"); flowObjectiveService.forward(deviceId, objective.add()); } else { log.debug("ArpClassifierRules-->REMOVE"); flowObjectiveService.forward(deviceId, objective.remove()); } }
/** * Send bgp flow forwarder to bgp provider. * * @param selector traffic selector * @param treatment traffic treatment * @param deviceId device id * @param type operation type */ public void sendBgpFlowRuleForwarder(TrafficSelector.Builder selector, TrafficTreatment.Builder treatment, DeviceId deviceId, Objective.Operation type) { ForwardingObjective.Builder objective = DefaultForwardingObjective.builder().withTreatment(treatment.build()) .withSelector(selector.build()).fromApp(appId).makePermanent().withFlag(Flag.VERSATILE); if (type.equals(Objective.Operation.ADD)) { log.debug("ADD"); flowObjectiveService.forward(deviceId, objective.add()); } else { log.debug("REMOVE"); flowObjectiveService.forward(deviceId, objective.remove()); } } }