import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
import org.opendaylight.controller.md.sal.common.api.data.DataModification;
import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
-import org.opendaylight.controller.sal.binding.api.NotificationListener;
import org.opendaylight.controller.sal.binding.api.NotificationService;
import org.opendaylight.controller.sal.binding.api.data.DataBrokerService;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Dscp;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlDstActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlSrcActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlTypeActionCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNextHopActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwDstActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpSrcActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanCfiActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanPcpActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.StripVlanActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SwPathActionCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.address.Ipv4Builder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.Flows;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowAdded;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowRemoved;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowUpdated;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowListener;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SwitchFlowRemoved;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRemoved;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorUpdated;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRemoved;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdated;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.OpendaylightInventoryListener;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.ExperimenterBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddressBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddressBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
import org.opendaylight.yangtools.concepts.Registration;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.osgi.framework.BundleContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey;
public class OpenflowpluginTestCommandProvider implements CommandProvider {
private NodeBuilder testNode;
private final String originalFlowName = "Foo";
private final String updatedFlowName = "Bar";
- private FlowEventListener flowEventListener = new FlowEventListener();
+ private final FlowEventListener flowEventListener = new FlowEventListener();
+ private final PortEventListener portEventListener = new PortEventListener();
private static NotificationService notificationService;
private Registration<org.opendaylight.yangtools.yang.binding.NotificationListener> listener1Reg;
+ private Registration<org.opendaylight.yangtools.yang.binding.NotificationListener> listener2Reg;
public OpenflowpluginTestCommandProvider(BundleContext ctx) {
this.ctx = ctx;
public void onSessionInitiated(ProviderContext session) {
pc = session;
notificationService = session.getSALService(NotificationService.class);
- // For switch events
+ // For switch events
listener1Reg = notificationService.registerNotificationListener(flowEventListener);
+ listener2Reg = notificationService.registerNotificationListener(portEventListener);
dataBrokerService = session.getSALService(DataBrokerService.class);
ctx.registerService(CommandProvider.class.getName(), this, null);
createTestFlow(createTestNode(null), null, null);
}
final class FlowEventListener implements SalFlowListener {
-
+
List<FlowAdded> addedFlows = new ArrayList<>();
List<FlowRemoved> removedFlows = new ArrayList<>();
List<FlowUpdated> updatedFlows = new ArrayList<>();
-
+
@Override
public void onFlowAdded(FlowAdded notification) {
- System.out.println("flow to be added.........................."+notification.toString());
- System.out.println("added flow Xid........................."+notification.getTransactionId().getValue());
+ System.out.println("flow to be added.........................." + notification.toString());
+ System.out.println("added flow Xid........................." + notification.getTransactionId().getValue());
System.out.println("-----------------------------------------------------------------------------------");
addedFlows.add(notification);
}
-
+
@Override
public void onFlowRemoved(FlowRemoved notification) {
System.out.println("removed flow.........................." + notification.toString());
System.out.println("-----------------------------------------------------------------------------------");
removedFlows.add(notification);
};
-
+
@Override
public void onFlowUpdated(FlowUpdated notification) {
System.out.println("updated flow.........................." + notification.toString());
- System.out.println("updated flow Xid........................." + notification.getTransactionId().getValue());
+ System.out
+ .println("updated flow Xid........................." + notification.getTransactionId().getValue());
System.out.println("-----------------------------------------------------------------------------------");
updatedFlows.add(notification);
}
@Override
public void onNodeErrorNotification(NodeErrorNotification notification) {
- System.out.println("Error notification flow Xid........................." + notification.getTransactionId().getValue());
+ System.out.println("Error notification flow Xid........................."
+ + notification.getTransactionId().getValue());
System.out.println("-----------------------------------------------------------------------------------");
}
@Override
public void onNodeExperimenterErrorNotification(NodeExperimenterErrorNotification notification) {
// TODO Auto-generated method stub
-
+
}
@Override
public void onSwitchFlowRemoved(SwitchFlowRemoved notification) {
- System.out.println("Switch flow removed flow..........................");
- // TODO Auto-generated method stub
-
+ System.out
+ .println("Switch flow removed : Cookies..................." + notification.getCookie().toString());
+ System.out.println("-----------------------------------------------------------------------------------");
+ }
+
+ }
+
+ final class PortEventListener implements OpendaylightInventoryListener {
+
+ List<NodeUpdated> nodeUpdated = new ArrayList<>();
+ List<NodeRemoved> nodeRemoved = new ArrayList<>();
+ List<NodeConnectorUpdated> nodeConnectorUpdated = new ArrayList<>();
+ List<NodeConnectorRemoved> nodeConnectorRemoved = new ArrayList<>();
+
+ @Override
+ public void onNodeConnectorRemoved(NodeConnectorRemoved notification) {
+ System.out.println("NodeConnectorRemoved Notification ...................");
+ System.out.println(notification.getNodeConnectorRef());
+ System.out.println("----------------------------------------------------------------------");
+ nodeConnectorRemoved.add(notification);
+ }
+
+ @Override
+ public void onNodeConnectorUpdated(NodeConnectorUpdated notification) {
+ System.out.println("NodeConnectorUpdated Notification...................");
+ System.out.println(notification.getNodeConnectorRef());
+ System.out.println("----------------------------------------------------------------------");
+ nodeConnectorUpdated.add(notification);
+ }
+
+ @Override
+ public void onNodeRemoved(NodeRemoved notification) {
+ System.out.println("NodeConnectorUpdated Notification ...................");
+ System.out.println(notification.getNodeRef());
+ System.out.println("----------------------------------------------------------------------");
+ nodeRemoved.add(notification);
+ }
+
+ @Override
+ public void onNodeUpdated(NodeUpdated notification) {
+ System.out.println("NodeConnectorUpdated Notification ...................");
+ System.out.println(notification.getNodeRef());
+ System.out.println("----------------------------------------------------------------------");
+ nodeUpdated.add(notification);
}
-
}
-
+
private InstanceIdentifier<Node> nodeBuilderToInstanceId(NodeBuilder node) {
return InstanceIdentifier.builder(Nodes.class).child(Node.class, node.getKey()).toInstance();
}
flow.setMatch(createTunnelIDMatch().build());
flow.setInstructions(createAppyActionInstruction48().build());
break;
+ case "f78":
+ id += 78;
+ flow.setMatch(createMatch33().build());
+ flow.setInstructions(createDropInstructions().build());
+ break;
+ case "f79":
+ id += 79;
+ flow.setMatch(createICMPv6Match1().build());
+ flow.setInstructions(createDecNwTtlInstructions().build());
+ break;
+ case "f80":
+ id += 80;
+ flow.setMatch(createMatch1().build());
+ flow.setInstructions(createAppyActionInstruction88().build());
+ break;
default:
LOG.warn("flow type not understood: {}", flowType);
}
flow.setInstallHw(false);
flow.setStrict(false);
flow.setContainerName(null);
- flow.setFlags(new FlowModFlags(false, false, false, false, false));
+ flow.setFlags(new FlowModFlags(false, false, false, false, true));
flow.setId(new FlowId(new Long(12)));
flow.setTableId(getTableId(tableId));
flow.setOutGroup(new Long(2));
return isb;
}
+ private static InstructionsBuilder createAppyActionInstruction88() {
+
+ List<Action> actionList = new ArrayList<Action>();
+ ActionBuilder ab = new ActionBuilder();
+
+ SetVlanPcpActionBuilder pcp = new SetVlanPcpActionBuilder();
+ VlanPcp pcp1 = new VlanPcp((short) 9);
+ pcp.setVlanPcp(pcp1);
+ ab.setAction(new SetVlanPcpActionCaseBuilder().setSetVlanPcpAction(pcp.build()).build());
+ 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());
+
+ // 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;
+ }
+
+
private static InstructionsBuilder createAppyActionInstruction9() {
List<Action> actionList = new ArrayList<Action>();
// Wrap our Apply Action in an Instruction
InstructionBuilder ib = new InstructionBuilder();
ib.setInstruction(new ApplyActionsCaseBuilder().setApplyActions(aab.build()).build());
+ ib.setKey(new InstructionKey(0));
+ ib.setOrder(0);
- // Put our Instruction in a list of Instructions
+ // Put our Instruction in a list of Instruction
InstructionsBuilder isb = new InstructionsBuilder();
List<Instruction> instructions = new ArrayList<Instruction>();
instructions.add(ib.build());
isb.setInstruction(instructions);
return isb;
}
-
+
private static InstructionsBuilder createAppyActionInstruction33() {
List<Action> actionList = new ArrayList<Action>();
// setting the values of ARP
MacAddress macdest = new MacAddress("ff:ff:ff:ff:ff:ff");
MacAddress macsrc = new MacAddress("00:00:00:00:23:ae");
- Ipv4Prefix dstiparp = new Ipv4Prefix("200.71.9.52/10");
- Ipv4Prefix srciparp = new Ipv4Prefix("100.1.1.1/8");
+ Ipv4Prefix dstiparp = new Ipv4Prefix("200.71.9.52");
+ Ipv4Prefix srciparp = new Ipv4Prefix("100.1.1.1");
// create ARP match action
ArpMatchBuilder arpmatch = new ArpMatchBuilder();
ArpMatchBuilder arpmatch1 = new ArpMatchBuilder();
private static InstructionsBuilder createAppyActionInstruction44() {
- List<Action> actionList = new ArrayList<Action>();
+ List<Action> actionLists = new ArrayList<Action>();
ActionBuilder ab = new ActionBuilder();
SetFieldBuilder setFieldBuilder = new SetFieldBuilder();
ActionBuilder ab1 = new ActionBuilder();
SetFieldBuilder setFieldBuilder1 = new SetFieldBuilder();
+ /* ActionBuilder ab2 = new ActionBuilder();
+ SetFieldBuilder setFieldBuilder2 = new SetFieldBuilder();
+ ActionBuilder ab3 = new ActionBuilder();
+ SetFieldBuilder setFieldBuilder3 = new SetFieldBuilder();
+ ActionBuilder ab4 = new ActionBuilder();
+ SetFieldBuilder setFieldBuilder4 = new SetFieldBuilder(); */
+ ActionBuilder ab5 = new ActionBuilder();
+ SetFieldBuilder setFieldBuilder5 = new SetFieldBuilder();
+ ActionBuilder ab6 = new ActionBuilder();
+ SetFieldBuilder setFieldBuilder6 = new SetFieldBuilder();
// IPv6
Ipv6MatchBuilder ipv6Builder = new Ipv6MatchBuilder();
Ipv6MatchBuilder ipv6Builder1 = new Ipv6MatchBuilder();
+ // Ipv6MatchBuilder ipv6Builder2 = new Ipv6MatchBuilder();
+ // Ipv6MatchBuilder ipv6Builder3 = new Ipv6MatchBuilder();
+ // Ipv6MatchBuilder ipv6Builder4 = new Ipv6MatchBuilder();
+ Ipv6MatchBuilder ipv6Builder5 = new Ipv6MatchBuilder();
+ Ipv6MatchBuilder ipv6Builder6 = new Ipv6MatchBuilder();
+
Ipv6Prefix dstip6 = new Ipv6Prefix("2002::2");
Ipv6Prefix srcip6 = new Ipv6Prefix("2001:0:0:0:0:0:0:1");
- ipv6Builder1.setIpv6Destination(dstip6);
+ // Ipv6Address ndtarget = new Ipv6Address("2001:db8:0:1:fd97:f9f0:a810:782e");
+ // MacAddress ndsll = new MacAddress("c2:00:54:f5:00:00");
+ // MacAddress ndtll = new MacAddress("00:0c:29:0e:4c:67");
+ Ipv6ExtHeaderBuilder nextheader = new Ipv6ExtHeaderBuilder();
+ nextheader.setIpv6Exthdr(58);
+ Ipv6LabelBuilder ipv6label = new Ipv6LabelBuilder();
+ Ipv6FlowLabel label = new Ipv6FlowLabel(10028L);
+ ipv6label.setIpv6Flabel(label);
+
ipv6Builder.setIpv6Source(srcip6);
+ ipv6Builder1.setIpv6Destination(dstip6);
+ // ipv6Builder2.setIpv6NdTarget(ndtarget);
+ // ipv6Builder3.setIpv6NdSll(ndsll);
+ // ipv6Builder4.setIpv6NdTll(ndtll);
+ ipv6Builder5.setIpv6ExtHeader(nextheader.build());
+ ipv6Builder6.setIpv6Label(ipv6label.build());
+
setFieldBuilder.setLayer3Match(ipv6Builder.build());
ab.setAction(new SetFieldCaseBuilder().setSetField(setFieldBuilder.build()).build());
ab.setKey(new ActionKey(0));
- actionList.add(ab.build());
+ actionLists.add(ab.build());
setFieldBuilder1.setLayer3Match(ipv6Builder1.build());
ab1.setAction(new SetFieldCaseBuilder().setSetField(setFieldBuilder1.build()).build());
ab1.setKey(new ActionKey(1));
- actionList.add(ab1.build());
+ actionLists.add(ab1.build());
+
+ /* setFieldBuilder2.setLayer3Match(ipv6Builder2.build());
+ ab2.setAction(new SetFieldCaseBuilder().setSetField(setFieldBuilder2.build()).build());
+ ab2.setKey(new ActionKey(2));
+ actionLists.add(ab2.build());
+
+ setFieldBuilder3.setLayer3Match(ipv6Builder3.build());
+ ab3.setAction(new SetFieldCaseBuilder().setSetField(setFieldBuilder3.build()).build());
+ ab3.setKey(new ActionKey(3));
+ actionLists.add(ab3.build());
+
+ setFieldBuilder4.setLayer3Match(ipv6Builder4.build());
+ ab4.setAction(new SetFieldCaseBuilder().setSetField(setFieldBuilder4.build()).build());
+ ab4.setKey(new ActionKey(4));
+ actionLists.add(ab4.build());
+*/
+ setFieldBuilder5.setLayer3Match(ipv6Builder5.build());
+ ab5.setAction(new SetFieldCaseBuilder().setSetField(setFieldBuilder5.build()).build());
+ ab5.setKey(new ActionKey(5));
+ actionLists.add(ab5.build());
+
+ setFieldBuilder6.setLayer3Match(ipv6Builder6.build());
+ ab6.setAction(new SetFieldCaseBuilder().setSetField(setFieldBuilder6.build()).build());
+ ab6.setKey(new ActionKey(6));
+ actionLists.add(ab6.build());
ApplyActionsBuilder aab = new ApplyActionsBuilder();
- aab.setAction(actionList);
+ aab.setAction(actionLists);
InstructionBuilder ib = new InstructionBuilder();
ib.setKey(new InstructionKey(0));
return isb;
}
+
private static InstructionsBuilder createAppyActionInstruction45() {
List<Action> actionList = new ArrayList<Action>();
return match;
}
+
+ /**
+ * @return
+ */
+ private static MatchBuilder createICMPv6Match1() {
+
+ MatchBuilder match = new MatchBuilder();
+ EthernetMatchBuilder eth = new EthernetMatchBuilder();
+ EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
+ ethTypeBuilder.setType(new EtherType(0x86ddL));
+ eth.setEthernetType(ethTypeBuilder.build());
+ match.setEthernetMatch(eth.build());
+
+ IpMatchBuilder ipmatch = new IpMatchBuilder(); // ipv4 version
+ ipmatch.setIpProtocol((short) 256);
+ match.setIpMatch(ipmatch.build());
+
+ Icmpv6MatchBuilder icmpv6match = new Icmpv6MatchBuilder(); // icmpv6
+ // match
+ icmpv6match.setIcmpv6Type((short) 135);
+ icmpv6match.setIcmpv6Code((short) 1);
+ match.setIcmpv6Match(icmpv6match.build());
+
+ return match;
+ }
+
+ private static MatchBuilder createMatch33() {
+
+ MatchBuilder match = new MatchBuilder();
+ Ipv4MatchBuilder ipv4Match = new Ipv4MatchBuilder();
+ Ipv4Prefix prefix = new Ipv4Prefix("10.0.0.10");
+ ipv4Match.setIpv4Source(prefix);
+ Ipv4Match i4m = ipv4Match.build();
+ match.setLayer3Match(i4m);
+
+ EthernetMatchBuilder eth = new EthernetMatchBuilder();
+ EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
+ ethTypeBuilder.setType(new EtherType(0xfffeL));
+ eth.setEthernetType(ethTypeBuilder.build());
+ match.setEthernetMatch(eth.build());
+ return match;
+ }
private static MatchBuilder createInphyportMatch() {
MatchBuilder match = new MatchBuilder();