+ /**
+ * Create a DHCP match with port provided.
+ *
+ * @param matchBuilder the match builder
+ * @param srcPort the source port
+ * @param dstPort the destination port
+ * @return the DHCP match
+ */
+ public static MatchBuilder createDhcpMatch(MatchBuilder matchBuilder,
+ int srcPort, int dstPort) {
+
+ EthernetMatchBuilder ethernetMatch = new EthernetMatchBuilder();
+ EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
+ ethTypeBuilder.setType(new EtherType(0x0800L));
+ ethernetMatch.setEthernetType(ethTypeBuilder.build());
+ matchBuilder.setEthernetMatch(ethernetMatch.build());
+
+ IpMatchBuilder ipmatch = new IpMatchBuilder();
+ ipmatch.setIpProtocol(UDP_SHORT);
+ matchBuilder.setIpMatch(ipmatch.build());
+
+ UdpMatchBuilder udpmatch = new UdpMatchBuilder();
+ udpmatch.setUdpSourcePort(new PortNumber(srcPort));
+ udpmatch.setUdpDestinationPort(new PortNumber(dstPort));
+ matchBuilder.setLayer4Match(udpmatch.build());
+
+ return matchBuilder;
+
+ }
+
+ /**
+ * Create a DHCP match with port provided.
+ *
+ * @param matchBuilder the match builder
+ * @param srcPort the source port
+ * @param dstPort the destination port
+ * @return the DHCP match
+ */
+ public static MatchBuilder createDhcpv6Match(MatchBuilder matchBuilder,
+ int srcPort, int dstPort) {
+
+ EthernetMatchBuilder ethernetMatch = new EthernetMatchBuilder();
+ EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
+ ethTypeBuilder.setType(new EtherType(0x86DDL));
+ ethernetMatch.setEthernetType(ethTypeBuilder.build());
+ matchBuilder.setEthernetMatch(ethernetMatch.build());
+
+ IpMatchBuilder ipmatch = new IpMatchBuilder();
+ ipmatch.setIpProtocol(UDP_SHORT);
+ matchBuilder.setIpMatch(ipmatch.build());
+
+ UdpMatchBuilder udpmatch = new UdpMatchBuilder();
+ udpmatch.setUdpSourcePort(new PortNumber(srcPort));
+ udpmatch.setUdpDestinationPort(new PortNumber(dstPort));
+ matchBuilder.setLayer4Match(udpmatch.build());
+
+ return matchBuilder;
+
+ }
+
+ /**
+ * Creates DHCP server packet match with DHCP mac address and port.
+ *
+ * @param matchBuilder the matchbuilder
+ * @param dhcpServerMac MAc address of the DHCP server of the subnet
+ * @param srcPort the source port
+ * @param dstPort the destination port
+ * @return the DHCP server match
+ */
+ public static MatchBuilder createDhcpServerMatch(MatchBuilder matchBuilder, String dhcpServerMac, int srcPort,
+ int dstPort) {
+
+ EthernetMatchBuilder ethernetMatch = new EthernetMatchBuilder();
+ EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
+ ethTypeBuilder.setType(new EtherType(0x0800L));
+ ethernetMatch.setEthernetType(ethTypeBuilder.build());
+ matchBuilder.setEthernetMatch(ethernetMatch.build());
+
+ EthernetSourceBuilder ethSourceBuilder = new EthernetSourceBuilder();
+ ethSourceBuilder.setAddress(new MacAddress(dhcpServerMac));
+ ethernetMatch.setEthernetSource(ethSourceBuilder.build());
+ matchBuilder.setEthernetMatch(ethernetMatch.build());
+
+ IpMatchBuilder ipmatch = new IpMatchBuilder();
+ ipmatch.setIpProtocol(UDP_SHORT);
+ matchBuilder.setIpMatch(ipmatch.build());
+
+ UdpMatchBuilder udpmatch = new UdpMatchBuilder();
+ udpmatch.setUdpSourcePort(new PortNumber(srcPort));
+ udpmatch.setUdpDestinationPort(new PortNumber(dstPort));
+ matchBuilder.setLayer4Match(udpmatch.build());
+
+ return matchBuilder;
+
+ }
+
+ /**
+ * Creates DHCPv6 server packet match with DHCP mac address and port.
+ *
+ * @param matchBuilder the matchbuilder
+ * @param dhcpServerMac MAc address of the DHCP server of the subnet
+ * @param srcPort the source port
+ * @param dstPort the destination port
+ * @return the DHCP server match
+ */
+ public static MatchBuilder createDhcpv6ServerMatch(MatchBuilder matchBuilder, String dhcpServerMac, int srcPort,
+ int dstPort) {
+
+ EthernetMatchBuilder ethernetMatch = new EthernetMatchBuilder();
+ EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
+ ethTypeBuilder.setType(new EtherType(0x86DDL));
+ ethernetMatch.setEthernetType(ethTypeBuilder.build());
+ matchBuilder.setEthernetMatch(ethernetMatch.build());
+
+ EthernetSourceBuilder ethSourceBuilder = new EthernetSourceBuilder();
+ ethSourceBuilder.setAddress(new MacAddress(dhcpServerMac));
+ ethernetMatch.setEthernetSource(ethSourceBuilder.build());
+ matchBuilder.setEthernetMatch(ethernetMatch.build());
+
+ IpMatchBuilder ipmatch = new IpMatchBuilder();
+ ipmatch.setIpProtocol(UDP_SHORT);
+ matchBuilder.setIpMatch(ipmatch.build());
+
+ UdpMatchBuilder udpmatch = new UdpMatchBuilder();
+ udpmatch.setUdpSourcePort(new PortNumber(srcPort));
+ udpmatch.setUdpDestinationPort(new PortNumber(dstPort));
+ matchBuilder.setLayer4Match(udpmatch.build());
+
+ return matchBuilder;
+
+ }
+
+ /**
+ * Creates a Match with src ip address mac address set.
+ * @param matchBuilder MatchBuilder Object
+ * @param srcip String containing an IPv4 prefix
+ * @param srcMac The source macAddress
+ * @return matchBuilder Map Object with a match
+ */
+ public static MatchBuilder createSrcL3Ipv4MatchWithMac(MatchBuilder matchBuilder, Ipv4Prefix srcip, MacAddress srcMac) {
+
+ Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder();
+ ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix(srcip));
+ EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
+ ethTypeBuilder.setType(new EtherType(0x0800L));
+ EthernetMatchBuilder eth = new EthernetMatchBuilder();
+ eth.setEthernetType(ethTypeBuilder.build());
+ eth.setEthernetSource(new EthernetSourceBuilder()
+ .setAddress(srcMac)
+ .build());
+
+ matchBuilder.setLayer3Match(ipv4MatchBuilder.build());
+ matchBuilder.setEthernetMatch(eth.build());
+ return matchBuilder;
+
+ }
+
+ /**
+ * Creates a Match with src ip address mac address set.
+ * @param matchBuilder MatchBuilder Object
+ * @param srcip String containing an IPv6 prefix
+ * @param srcMac The source macAddress
+ * @return matchBuilder Map Object with a match
+ */
+ public static MatchBuilder createSrcL3Ipv6MatchWithMac(MatchBuilder matchBuilder, Ipv6Prefix srcip, MacAddress srcMac) {
+
+ Ipv6MatchBuilder ipv6MatchBuilder = new Ipv6MatchBuilder();
+ ipv6MatchBuilder.setIpv6Source(new Ipv6Prefix(srcip));
+ EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
+ ethTypeBuilder.setType(new EtherType(0x86DDL));
+ EthernetMatchBuilder eth = new EthernetMatchBuilder();
+ eth.setEthernetType(ethTypeBuilder.build());
+ eth.setEthernetSource(new EthernetSourceBuilder()
+ .setAddress(srcMac)
+ .build());
+
+ matchBuilder.setLayer3Match(ipv6MatchBuilder.build());
+ matchBuilder.setEthernetMatch(eth.build());
+ return matchBuilder;
+
+ }
+
+ /**
+ * Creates a ether net match with ether type set to 0x0800L.
+ * @param matchBuilder MatchBuilder Object
+ * @param srcMac The source macAddress
+ * @param dstMac The destination mac address
+ * @return matchBuilder Map Object with a match
+ */
+ public static MatchBuilder createV4EtherMatchWithType(MatchBuilder matchBuilder,String srcMac, String dstMac)
+ {
+ EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
+ ethTypeBuilder.setType(new EtherType(0x0800L));
+ EthernetMatchBuilder eth = new EthernetMatchBuilder();
+ eth.setEthernetType(ethTypeBuilder.build());
+ if (null != srcMac) {
+ eth.setEthernetSource(new EthernetSourceBuilder()
+ .setAddress(new MacAddress(srcMac)).build());
+ }
+ if (null != dstMac) {
+ eth.setEthernetDestination(new EthernetDestinationBuilder()
+ .setAddress(new MacAddress(dstMac)).build());
+ }
+ matchBuilder.setEthernetMatch(eth.build());
+ return matchBuilder;
+ }
+
+ /**
+ * Creates a ether net match with ether type set to 0x86DDL.
+ * @param matchBuilder MatchBuilder Object
+ * @param srcMac The source macAddress
+ * @param dstMac The destination mac address
+ * @return matchBuilder Map Object with a match
+ */
+ public static MatchBuilder createV6EtherMatchWithType(MatchBuilder matchBuilder,String srcMac, String dstMac)
+ {
+ EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
+ ethTypeBuilder.setType(new EtherType(0x86DDL));
+ EthernetMatchBuilder eth = new EthernetMatchBuilder();
+ eth.setEthernetType(ethTypeBuilder.build());
+ if (null != srcMac) {
+ eth.setEthernetSource(new EthernetSourceBuilder()
+ .setAddress(new MacAddress(srcMac)).build());
+ }
+ if (null != dstMac) {
+ eth.setEthernetDestination(new EthernetDestinationBuilder()
+ .setAddress(new MacAddress(dstMac)).build());
+ }
+ matchBuilder.setEthernetMatch(eth.build());
+ return matchBuilder;
+ }
+
+ /**
+ * Adds remote Ip prefix to existing match.
+ * @param matchBuilder The match builder
+ * @param sourceIpPrefix The source IP prefix
+ * @param destIpPrefix The destination IP prefix
+ * @return matchBuilder Map Object with a match
+ */
+ public static MatchBuilder addRemoteIpPrefix(MatchBuilder matchBuilder,
+ Ipv4Prefix sourceIpPrefix,Ipv4Prefix destIpPrefix) {
+ Ipv4MatchBuilder ipv4match = new Ipv4MatchBuilder();
+ if (null != sourceIpPrefix) {
+ ipv4match.setIpv4Source(sourceIpPrefix);
+ }
+ if (null != destIpPrefix) {
+ ipv4match.setIpv4Destination(destIpPrefix);
+ }
+ matchBuilder.setLayer3Match(ipv4match.build());
+
+ return matchBuilder;
+ }
+
+ /**
+ * Adds remote Ipv6 prefix to existing match.
+ * @param matchBuilder The match builder
+ * @param sourceIpPrefix The source IP prefix
+ * @param destIpPrefix The destination IP prefix
+ * @return matchBuilder Map Object with a match
+ */
+ public static MatchBuilder addRemoteIpv6Prefix(MatchBuilder matchBuilder,
+ Ipv6Prefix sourceIpPrefix,Ipv6Prefix destIpPrefix) {
+ Ipv6MatchBuilder ipv6match = new Ipv6MatchBuilder();
+ if (null != sourceIpPrefix) {
+ ipv6match.setIpv6Source(sourceIpPrefix);
+ }
+ if (null != destIpPrefix) {
+ ipv6match.setIpv6Destination(destIpPrefix);
+ }
+ matchBuilder.setLayer3Match(ipv6match.build());
+
+ return matchBuilder;
+ }
+
+ /**
+ * Add a DSCP match to an existing match
+ * @param matchBuilder Map matchBuilder MatchBuilder Object with a match
+ * @param dscpValue
+ * @return {@link MatchBuilder}
+ */
+ public static MatchBuilder addDscp(MatchBuilder matchBuilder, short dscpValue) {
+ createEtherTypeMatch(matchBuilder, new EtherType(ETHERTYPE_IPV4));
+ return matchBuilder.setIpMatch(
+ new IpMatchBuilder()
+ .setIpDscp(new Dscp(dscpValue))
+ .build());
+ }
+
+ /**
+ * Add a layer4 match to an existing match
+ *
+ * @param matchBuilder Map matchBuilder MatchBuilder Object with a match
+ * @param protocol The layer4 protocol
+ * @param srcPort The src port
+ * @param destPort The destination port
+ * @return matchBuilder Map Object with a match
+ */
+ public static MatchBuilder addLayer4Match(MatchBuilder matchBuilder,
+ int protocol, int srcPort, int destPort) {
+ IpMatchBuilder ipmatch = new IpMatchBuilder();
+ if (TCP_SHORT == protocol) {
+ ipmatch.setIpProtocol(TCP_SHORT);
+ TcpMatchBuilder tcpmatch = new TcpMatchBuilder();
+ if (0 != srcPort) {
+ tcpmatch.setTcpSourcePort(new PortNumber(srcPort));
+ }
+ if (0 != destPort) {
+ tcpmatch.setTcpDestinationPort(new PortNumber(destPort));
+ }
+ matchBuilder.setLayer4Match(tcpmatch.build());
+ } else if (UDP_SHORT == protocol) {
+ ipmatch.setIpProtocol(UDP_SHORT);
+ UdpMatchBuilder udpMatch = new UdpMatchBuilder();
+ if (0 != srcPort) {
+ udpMatch.setUdpSourcePort(new PortNumber(srcPort));
+ }
+ if (0 != destPort) {
+ udpMatch.setUdpDestinationPort(new PortNumber(destPort));
+ }
+ matchBuilder.setLayer4Match(udpMatch.build());
+ } else if (SCTP_SHORT == protocol) {
+ ipmatch.setIpProtocol(SCTP_SHORT);
+ SctpMatchBuilder sctpMatchBuilder = new SctpMatchBuilder();
+ if (0 != srcPort) {
+ sctpMatchBuilder.setSctpSourcePort(new PortNumber(srcPort));
+ }
+ if (0 != destPort) {
+ sctpMatchBuilder.setSctpDestinationPort(new PortNumber(destPort));
+ }
+ matchBuilder.setLayer4Match(sctpMatchBuilder.build());
+ }
+ matchBuilder.setIpMatch(ipmatch.build());
+
+ return matchBuilder;
+ }
+
+ /**
+ * Add a layer4 match to an existing match with mask
+ *
+ * @param matchBuilder Map matchBuilder MatchBuilder Object with a match.
+ * @param protocol The layer4 protocol
+ * @param srcPort The src port
+ * @param destPort The destination port
+ * @param mask the mask for the port
+ * @return matchBuilder Map Object with a match
+ */
+ public static MatchBuilder addLayer4MatchWithMask(MatchBuilder matchBuilder,
+ int protocol, int srcPort, int destPort,int mask) {
+
+ IpMatchBuilder ipmatch = new IpMatchBuilder();
+
+ NxAugMatchNodesNodeTableFlow nxAugMatch = null;
+ GeneralAugMatchNodesNodeTableFlow genAugMatch = null;
+ if (protocol == TCP_SHORT) {
+ ipmatch.setIpProtocol(TCP_SHORT);
+ if (0 != srcPort) {
+ NxmOfTcpSrcBuilder tcpSrc = new NxmOfTcpSrcBuilder();
+ tcpSrc.setPort(new PortNumber(srcPort));
+ tcpSrc.setMask(mask);
+ nxAugMatch = new NxAugMatchNodesNodeTableFlowBuilder().setNxmOfTcpSrc(tcpSrc.build()).build();
+ genAugMatch = new GeneralAugMatchNodesNodeTableFlowBuilder()
+ .setExtensionList(ImmutableList.of(new ExtensionListBuilder().setExtensionKey(NxmOfTcpSrcKey.class)
+ .setExtension(new ExtensionBuilder()
+ .addAugmentation(NxAugMatchNodesNodeTableFlow.class, nxAugMatch)
+ .build()).build())).build();
+ } else if (0 != destPort) {
+ NxmOfTcpDstBuilder tcpDst = new NxmOfTcpDstBuilder();
+ tcpDst.setPort(new PortNumber(destPort));
+ tcpDst.setMask(mask);
+ nxAugMatch = new NxAugMatchNodesNodeTableFlowBuilder()
+ .setNxmOfTcpDst(tcpDst.build())
+ .build();
+ genAugMatch = new GeneralAugMatchNodesNodeTableFlowBuilder()
+ .setExtensionList(ImmutableList.of(new ExtensionListBuilder().setExtensionKey(NxmOfTcpDstKey.class)
+ .setExtension(new ExtensionBuilder()
+ .addAugmentation(NxAugMatchNodesNodeTableFlow.class, nxAugMatch)
+ .build()).build())).build();
+ }
+
+ } else if (UDP_SHORT == protocol) {
+ ipmatch.setIpProtocol(UDP_SHORT);
+ UdpMatchBuilder udpMatch = new UdpMatchBuilder();
+ if (0 != srcPort) {
+ NxmOfUdpSrcBuilder udpSrc = new NxmOfUdpSrcBuilder();
+ udpSrc.setPort(new PortNumber(srcPort));
+ udpSrc.setMask(mask);
+ nxAugMatch = new NxAugMatchNodesNodeTableFlowBuilder().setNxmOfUdpSrc(udpSrc.build()).build();
+ genAugMatch = new GeneralAugMatchNodesNodeTableFlowBuilder()
+ .setExtensionList(ImmutableList.of(new ExtensionListBuilder().setExtensionKey(NxmOfUdpSrcKey.class)
+ .setExtension(new ExtensionBuilder()
+ .addAugmentation(NxAugMatchNodesNodeTableFlow.class, nxAugMatch)
+ .build()).build())).build();
+ } else if (0 != destPort) {
+ NxmOfUdpDstBuilder udpDst = new NxmOfUdpDstBuilder();
+ udpDst.setPort(new PortNumber(destPort));
+ udpDst.setMask(mask);
+ nxAugMatch = new NxAugMatchNodesNodeTableFlowBuilder()
+ .setNxmOfUdpDst(udpDst.build())
+ .build();
+ genAugMatch = new GeneralAugMatchNodesNodeTableFlowBuilder()
+ .setExtensionList(ImmutableList.of(new ExtensionListBuilder().setExtensionKey(NxmOfUdpDstKey.class)
+ .setExtension(new ExtensionBuilder()
+ .addAugmentation(NxAugMatchNodesNodeTableFlow.class, nxAugMatch)
+ .build()).build())).build();
+ }
+ }
+ matchBuilder.setIpMatch(ipmatch.build());
+ matchBuilder.addAugmentation(GeneralAugMatchNodesNodeTableFlow.class, genAugMatch);
+ return matchBuilder;
+ }
+
+ public static MatchBuilder addCtState(MatchBuilder matchBuilder,int ct_state, int mask) {
+ NxmNxCtStateBuilder ctStateBuilder = new NxmNxCtStateBuilder();
+ ctStateBuilder.setCtState((long)ct_state);
+ ctStateBuilder.setMask((long)mask);
+ NxAugMatchNodesNodeTableFlow nxAugMatch = new NxAugMatchNodesNodeTableFlowBuilder()
+ .setNxmNxCtState(ctStateBuilder.build())
+ .build();
+ GeneralAugMatchNodesNodeTableFlow genAugMatch = new GeneralAugMatchNodesNodeTableFlowBuilder()
+ .setExtensionList(ImmutableList.of(new ExtensionListBuilder().setExtensionKey(NxmNxCtStateKey.class)
+ .setExtension(new ExtensionBuilder()
+ .addAugmentation(NxAugMatchNodesNodeTableFlow.class, nxAugMatch)
+ .build()).build())).build();
+ matchBuilder.addAugmentation(GeneralAugMatchNodesNodeTableFlow.class, genAugMatch);
+ return matchBuilder;
+ }
+
+ public static MatchBuilder addCtZone(MatchBuilder matchBuilder,int ct_zone) {
+ NxmNxCtZoneBuilder ctZoneBuilder = new NxmNxCtZoneBuilder();
+ ctZoneBuilder.setCtZone(ct_zone);
+ NxAugMatchNodesNodeTableFlow nxAugMatch = new NxAugMatchNodesNodeTableFlowBuilder()
+ .setNxmNxCtZone(ctZoneBuilder.build())
+ .build();
+ GeneralAugMatchNodesNodeTableFlow genAugMatch = new GeneralAugMatchNodesNodeTableFlowBuilder()
+ .setExtensionList(ImmutableList.of(new ExtensionListBuilder().setExtensionKey(NxmNxCtZoneKey.class)
+ .setExtension(new ExtensionBuilder()
+ .addAugmentation(NxAugMatchNodesNodeTableFlow.class, nxAugMatch)
+ .build()).build())).build();
+ matchBuilder.addAugmentation(GeneralAugMatchNodesNodeTableFlow.class, genAugMatch);
+ return matchBuilder;
+ }
+