Jonathan Hart

Move reactive forwarding to flow objectives

Change-Id: I8c77e5e04d7d7a4480dbff47578ef46aa7637054
...@@ -39,13 +39,14 @@ import org.onosproject.net.Host; ...@@ -39,13 +39,14 @@ import org.onosproject.net.Host;
39 import org.onosproject.net.HostId; 39 import org.onosproject.net.HostId;
40 import org.onosproject.net.Path; 40 import org.onosproject.net.Path;
41 import org.onosproject.net.PortNumber; 41 import org.onosproject.net.PortNumber;
42 -import org.onosproject.net.flow.DefaultFlowRule;
43 import org.onosproject.net.flow.DefaultTrafficSelector; 42 import org.onosproject.net.flow.DefaultTrafficSelector;
44 import org.onosproject.net.flow.DefaultTrafficTreatment; 43 import org.onosproject.net.flow.DefaultTrafficTreatment;
45 -import org.onosproject.net.flow.FlowRule;
46 import org.onosproject.net.flow.FlowRuleService; 44 import org.onosproject.net.flow.FlowRuleService;
47 import org.onosproject.net.flow.TrafficSelector; 45 import org.onosproject.net.flow.TrafficSelector;
48 import org.onosproject.net.flow.TrafficTreatment; 46 import org.onosproject.net.flow.TrafficTreatment;
47 +import org.onosproject.net.flowobjective.DefaultForwardingObjective;
48 +import org.onosproject.net.flowobjective.FlowObjectiveService;
49 +import org.onosproject.net.flowobjective.ForwardingObjective;
49 import org.onosproject.net.host.HostService; 50 import org.onosproject.net.host.HostService;
50 import org.onosproject.net.packet.InboundPacket; 51 import org.onosproject.net.packet.InboundPacket;
51 import org.onosproject.net.packet.PacketContext; 52 import org.onosproject.net.packet.PacketContext;
...@@ -86,6 +87,9 @@ public class ReactiveForwarding { ...@@ -86,6 +87,9 @@ public class ReactiveForwarding {
86 protected FlowRuleService flowRuleService; 87 protected FlowRuleService flowRuleService;
87 88
88 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 89 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
90 + protected FlowObjectiveService flowObjectiveService;
91 +
92 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
89 protected CoreService coreService; 93 protected CoreService coreService;
90 94
91 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 95 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
...@@ -466,7 +470,7 @@ public class ReactiveForwarding { ...@@ -466,7 +470,7 @@ public class ReactiveForwarding {
466 // packet out first. 470 // packet out first.
467 // 471 //
468 Ethernet inPkt = context.inPacket().parsed(); 472 Ethernet inPkt = context.inPacket().parsed();
469 - TrafficSelector.Builder builder = DefaultTrafficSelector.builder(); 473 + TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder();
470 474
471 // If PacketOutOnly or ARP packet than forward directly to output port 475 // If PacketOutOnly or ARP packet than forward directly to output port
472 if (packetOutOnly || inPkt.getEtherType() == Ethernet.TYPE_ARP) { 476 if (packetOutOnly || inPkt.getEtherType() == Ethernet.TYPE_ARP) {
...@@ -481,15 +485,15 @@ public class ReactiveForwarding { ...@@ -481,15 +485,15 @@ public class ReactiveForwarding {
481 // Create flows with default matching and include configured fields 485 // Create flows with default matching and include configured fields
482 // 486 //
483 if (matchDstMacOnly) { 487 if (matchDstMacOnly) {
484 - builder.matchEthDst(inPkt.getDestinationMAC()); 488 + selectorBuilder.matchEthDst(inPkt.getDestinationMAC());
485 } else { 489 } else {
486 - builder.matchInPort(context.inPacket().receivedFrom().port()) 490 + selectorBuilder.matchInPort(context.inPacket().receivedFrom().port())
487 .matchEthSrc(inPkt.getSourceMAC()) 491 .matchEthSrc(inPkt.getSourceMAC())
488 .matchEthDst(inPkt.getDestinationMAC()); 492 .matchEthDst(inPkt.getDestinationMAC());
489 493
490 // If configured Match Vlan ID 494 // If configured Match Vlan ID
491 if (matchVlanId && inPkt.getVlanID() != Ethernet.VLAN_UNTAGGED) { 495 if (matchVlanId && inPkt.getVlanID() != Ethernet.VLAN_UNTAGGED) {
492 - builder.matchVlanId(VlanId.vlanId(inPkt.getVlanID())); 496 + selectorBuilder.matchVlanId(VlanId.vlanId(inPkt.getVlanID()));
493 } 497 }
494 498
495 // 499 //
...@@ -505,31 +509,31 @@ public class ReactiveForwarding { ...@@ -505,31 +509,31 @@ public class ReactiveForwarding {
505 Ip4Prefix matchIp4DstPrefix = 509 Ip4Prefix matchIp4DstPrefix =
506 Ip4Prefix.valueOf(ipv4Packet.getDestinationAddress(), 510 Ip4Prefix.valueOf(ipv4Packet.getDestinationAddress(),
507 Ip4Prefix.MAX_MASK_LENGTH); 511 Ip4Prefix.MAX_MASK_LENGTH);
508 - builder.matchEthType(inPkt.getEtherType()) 512 + selectorBuilder.matchEthType(inPkt.getEtherType())
509 .matchIPSrc(matchIp4SrcPrefix) 513 .matchIPSrc(matchIp4SrcPrefix)
510 .matchIPDst(matchIp4DstPrefix); 514 .matchIPDst(matchIp4DstPrefix);
511 515
512 if (matchIpv4Dscp) { 516 if (matchIpv4Dscp) {
513 byte dscp = ipv4Packet.getDscp(); 517 byte dscp = ipv4Packet.getDscp();
514 byte ecn = ipv4Packet.getEcn(); 518 byte ecn = ipv4Packet.getEcn();
515 - builder.matchIPDscp(dscp).matchIPEcn(ecn); 519 + selectorBuilder.matchIPDscp(dscp).matchIPEcn(ecn);
516 } 520 }
517 521
518 if (matchTcpUdpPorts && ipv4Protocol == IPv4.PROTOCOL_TCP) { 522 if (matchTcpUdpPorts && ipv4Protocol == IPv4.PROTOCOL_TCP) {
519 TCP tcpPacket = (TCP) ipv4Packet.getPayload(); 523 TCP tcpPacket = (TCP) ipv4Packet.getPayload();
520 - builder.matchIPProtocol(ipv4Protocol) 524 + selectorBuilder.matchIPProtocol(ipv4Protocol)
521 .matchTcpSrc(tcpPacket.getSourcePort()) 525 .matchTcpSrc(tcpPacket.getSourcePort())
522 .matchTcpDst(tcpPacket.getDestinationPort()); 526 .matchTcpDst(tcpPacket.getDestinationPort());
523 } 527 }
524 if (matchTcpUdpPorts && ipv4Protocol == IPv4.PROTOCOL_UDP) { 528 if (matchTcpUdpPorts && ipv4Protocol == IPv4.PROTOCOL_UDP) {
525 UDP udpPacket = (UDP) ipv4Packet.getPayload(); 529 UDP udpPacket = (UDP) ipv4Packet.getPayload();
526 - builder.matchIPProtocol(ipv4Protocol) 530 + selectorBuilder.matchIPProtocol(ipv4Protocol)
527 .matchUdpSrc(udpPacket.getSourcePort()) 531 .matchUdpSrc(udpPacket.getSourcePort())
528 .matchUdpDst(udpPacket.getDestinationPort()); 532 .matchUdpDst(udpPacket.getDestinationPort());
529 } 533 }
530 if (matchIcmpFields && ipv4Protocol == IPv4.PROTOCOL_ICMP) { 534 if (matchIcmpFields && ipv4Protocol == IPv4.PROTOCOL_ICMP) {
531 ICMP icmpPacket = (ICMP) ipv4Packet.getPayload(); 535 ICMP icmpPacket = (ICMP) ipv4Packet.getPayload();
532 - builder.matchIPProtocol(ipv4Protocol) 536 + selectorBuilder.matchIPProtocol(ipv4Protocol)
533 .matchIcmpType(icmpPacket.getIcmpType()) 537 .matchIcmpType(icmpPacket.getIcmpType())
534 .matchIcmpCode(icmpPacket.getIcmpCode()); 538 .matchIcmpCode(icmpPacket.getIcmpCode());
535 } 539 }
...@@ -548,42 +552,48 @@ public class ReactiveForwarding { ...@@ -548,42 +552,48 @@ public class ReactiveForwarding {
548 Ip6Prefix matchIp6DstPrefix = 552 Ip6Prefix matchIp6DstPrefix =
549 Ip6Prefix.valueOf(ipv6Packet.getDestinationAddress(), 553 Ip6Prefix.valueOf(ipv6Packet.getDestinationAddress(),
550 Ip6Prefix.MAX_MASK_LENGTH); 554 Ip6Prefix.MAX_MASK_LENGTH);
551 - builder.matchIPv6Src(matchIp6SrcPrefix) 555 + selectorBuilder.matchIPv6Src(matchIp6SrcPrefix)
552 .matchIPv6Dst(matchIp6DstPrefix); 556 .matchIPv6Dst(matchIp6DstPrefix);
553 557
554 if (matchIpv6FlowLabel) { 558 if (matchIpv6FlowLabel) {
555 - builder.matchIPv6FlowLabel(ipv6Packet.getFlowLabel()); 559 + selectorBuilder.matchIPv6FlowLabel(ipv6Packet.getFlowLabel());
556 } 560 }
557 561
558 if (matchTcpUdpPorts && ipv6NextHeader == IPv6.PROTOCOL_TCP) { 562 if (matchTcpUdpPorts && ipv6NextHeader == IPv6.PROTOCOL_TCP) {
559 TCP tcpPacket = (TCP) ipv6Packet.getPayload(); 563 TCP tcpPacket = (TCP) ipv6Packet.getPayload();
560 - builder.matchIPProtocol(ipv6NextHeader) 564 + selectorBuilder.matchIPProtocol(ipv6NextHeader)
561 .matchTcpSrc(tcpPacket.getSourcePort()) 565 .matchTcpSrc(tcpPacket.getSourcePort())
562 .matchTcpDst(tcpPacket.getDestinationPort()); 566 .matchTcpDst(tcpPacket.getDestinationPort());
563 } 567 }
564 if (matchTcpUdpPorts && ipv6NextHeader == IPv6.PROTOCOL_UDP) { 568 if (matchTcpUdpPorts && ipv6NextHeader == IPv6.PROTOCOL_UDP) {
565 UDP udpPacket = (UDP) ipv6Packet.getPayload(); 569 UDP udpPacket = (UDP) ipv6Packet.getPayload();
566 - builder.matchIPProtocol(ipv6NextHeader) 570 + selectorBuilder.matchIPProtocol(ipv6NextHeader)
567 .matchUdpSrc(udpPacket.getSourcePort()) 571 .matchUdpSrc(udpPacket.getSourcePort())
568 .matchUdpDst(udpPacket.getDestinationPort()); 572 .matchUdpDst(udpPacket.getDestinationPort());
569 } 573 }
570 if (matchIcmpFields && ipv6NextHeader == IPv6.PROTOCOL_ICMP6) { 574 if (matchIcmpFields && ipv6NextHeader == IPv6.PROTOCOL_ICMP6) {
571 ICMP6 icmp6Packet = (ICMP6) ipv6Packet.getPayload(); 575 ICMP6 icmp6Packet = (ICMP6) ipv6Packet.getPayload();
572 - builder.matchIPProtocol(ipv6NextHeader) 576 + selectorBuilder.matchIPProtocol(ipv6NextHeader)
573 .matchIcmpv6Type(icmp6Packet.getIcmpType()) 577 .matchIcmpv6Type(icmp6Packet.getIcmpType())
574 .matchIcmpv6Code(icmp6Packet.getIcmpCode()); 578 .matchIcmpv6Code(icmp6Packet.getIcmpCode());
575 } 579 }
576 } 580 }
577 } 581 }
578 - TrafficTreatment.Builder treat = DefaultTrafficTreatment.builder(); 582 + TrafficTreatment treatment = DefaultTrafficTreatment.builder()
579 - treat.setOutput(portNumber); 583 + .setOutput(portNumber)
580 - 584 + .build();
581 - FlowRule f = 585 +
582 - new DefaultFlowRule(context.inPacket().receivedFrom().deviceId(), 586 + ForwardingObjective forwardingObjective = DefaultForwardingObjective.builder()
583 - builder.build(), treat.build(), flowPriority, 587 + .withSelector(selectorBuilder.build())
584 - appId, flowTimeout, false); 588 + .withTreatment(treatment)
585 - 589 + .withPriority(flowPriority)
586 - flowRuleService.applyFlowRules(f); 590 + .withFlag(ForwardingObjective.Flag.VERSATILE)
591 + .fromApp(appId)
592 + .makeTemporary(flowTimeout)
593 + .add();
594 +
595 + flowObjectiveService.forward(context.inPacket().receivedFrom().deviceId(),
596 + forwardingObjective);
587 597
588 // 598 //
589 // If packetOutOfppTable 599 // If packetOutOfppTable
......