-/**
- * Build PCMM gate requests from API QoS Gate objects
+/*
+ * Copyright (c) 2015 CableLabs and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
*/
+
package org.opendaylight.controller.packetcable.provider;
-import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.ServiceFlowDirection;
-import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.TosByte;
-import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.ccap.attributes.AmId;
-import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.classifier.Classifier;
-import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.ext.classifier.ExtClassifier;
-import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.gate.spec.GateSpec;
-import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.ipv6.classifier.Ipv6Classifier;
-import org.opendaylight.yang.gen.v1.urn.packetcable.rev150327.pcmm.qos.traffic.profile.TrafficProfile;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import com.google.common.collect.Lists;
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.List;
+import org.opendaylight.yang.gen.v1.urn.packetcable.rev151101.ServiceFlowDirection;
+import org.opendaylight.yang.gen.v1.urn.packetcable.rev151101.TosByte;
+import org.opendaylight.yang.gen.v1.urn.packetcable.rev151101.ccap.attributes.AmId;
+import org.opendaylight.yang.gen.v1.urn.packetcable.rev151101.classifier.attributes.classifiers.ClassifierContainer;
+import org.opendaylight.yang.gen.v1.urn.packetcable.rev151101.classifier.attributes.classifiers.classifier.container.ClassifierChoice;
+import org.opendaylight.yang.gen.v1.urn.packetcable.rev151101.classifier.attributes.classifiers.classifier.container.classifier.choice.ExtClassifierChoice;
+import org.opendaylight.yang.gen.v1.urn.packetcable.rev151101.classifier.attributes.classifiers.classifier.container.classifier.choice.Ipv6ClassifierChoice;
+import org.opendaylight.yang.gen.v1.urn.packetcable.rev151101.classifier.attributes.classifiers.classifier.container.classifier.choice.QosClassifierChoice;
+import org.opendaylight.yang.gen.v1.urn.packetcable.rev151101.pcmm.qos.classifier.Classifier;
+import org.opendaylight.yang.gen.v1.urn.packetcable.rev151101.pcmm.qos.ext.classifier.ExtClassifier;
+import org.opendaylight.yang.gen.v1.urn.packetcable.rev151101.pcmm.qos.gate.spec.GateSpec;
+import org.opendaylight.yang.gen.v1.urn.packetcable.rev151101.pcmm.qos.ipv6.classifier.Ipv6Classifier;
+import org.opendaylight.yang.gen.v1.urn.packetcable.rev151101.pcmm.qos.traffic.profile.TrafficProfile;
import org.pcmm.gates.IClassifier;
import org.pcmm.gates.IClassifier.Protocol;
+import org.pcmm.gates.IExtendedClassifier;
import org.pcmm.gates.IExtendedClassifier.ActivationState;
import org.pcmm.gates.IGateSpec.Direction;
import org.pcmm.gates.IIPv6Classifier.FlowLabel;
import org.pcmm.gates.ITrafficProfile;
-import org.pcmm.gates.impl.*;
+import org.pcmm.gates.impl.AMID;
+import org.pcmm.gates.impl.DOCSISServiceClassNameTrafficProfile;
+import org.pcmm.gates.impl.GateID;
+import org.pcmm.gates.impl.GateState;
+import org.pcmm.gates.impl.GateTimeInfo;
+import org.pcmm.gates.impl.GateUsageInfo;
+import org.pcmm.gates.impl.PCMMError;
+import org.pcmm.gates.impl.PCMMGateReq;
+import org.pcmm.gates.impl.SubscriberID;
+import org.pcmm.gates.impl.TransactionID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.net.Inet4Address;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-
/**
- * PacketCable data processor
+ * Build PCMM gate requests from API QoS Gate objects
*/
public class PCMMGateReqBuilder {
- private Logger logger = LoggerFactory.getLogger(PCMMGateReqBuilder.class);
+ private final Logger logger = LoggerFactory.getLogger(PCMMGateReqBuilder.class);
private GateID gateID = null;
private AMID amid = null;
private TransactionID transactionID = null;
private org.pcmm.gates.impl.GateSpec gateSpec = null;
private ITrafficProfile trafficProfile = null;
- private IClassifier classifier = null;
+ private final List<IClassifier> classifiers = Lists.newArrayListWithExpectedSize(4);
private PCMMError error = null;
+ private GateState gateState = null;
+ private GateTimeInfo gateTimeInfo = null;
+ private GateUsageInfo gateUsageInfo = null;
- public PCMMGateReq getGateReq() {
- return new PCMMGateReq(amid, subscriberID, transactionID, gateSpec, trafficProfile, classifier, gateID, error);
+ public PCMMGateReq build() {
+ return new PCMMGateReq(amid, subscriberID, transactionID, gateSpec, trafficProfile, classifiers,
+ gateID, error, gateState, gateTimeInfo, gateUsageInfo);
}
- public void build(final AmId qosAmId) {
+ public void setAmId(final AmId qosAmId) {
amid = new AMID(qosAmId.getAmType().shortValue(), qosAmId.getAmTag().shortValue());
}
- public void build(final InetAddress qosSubId) {
+ public void setSubscriberId(final InetAddress qosSubId) {
subscriberID = new SubscriberID(qosSubId);
}
- public void build(final GateSpec qosGateSpec, final ServiceFlowDirection scnDirection) {
+ public void setGateSpec(final GateSpec qosGateSpec, final ServiceFlowDirection scnDirection) {
final ServiceFlowDirection qosDir;
if (scnDirection != null) {
gateSpec = new org.pcmm.gates.impl.GateSpec(gateDir, dscptos, gateTosMask);
}
- public void build(final TrafficProfile qosTrafficProfile) {
+ public void setTrafficProfile(final TrafficProfile qosTrafficProfile) {
if (qosTrafficProfile.getServiceClassName() != null) {
trafficProfile =
new DOCSISServiceClassNameTrafficProfile(qosTrafficProfile.getServiceClassName().getValue());
return null;
}
- public void build(final Classifier qosClassifier) {
+ public void setClassifiers(final List<ClassifierContainer> classifiers) {
+ checkNotNull(classifiers);
+
+ for (ClassifierContainer container : classifiers) {
+ final ClassifierChoice choice = container.getClassifierChoice();
+ final Short index = container.getClassifierId();
+
+ if (choice instanceof QosClassifierChoice) {
+ addClassifier(index, ((QosClassifierChoice) choice).getClassifier());
+ }
+ else if (choice instanceof ExtClassifierChoice) {
+ addExtClassifier(index, ((ExtClassifierChoice) choice).getExtClassifier());
+ }
+ else if (choice instanceof Ipv6ClassifierChoice) {
+ addIpv6Classifier(index, ((Ipv6ClassifierChoice) choice).getIpv6Classifier());
+ }
+ else {
+ throw new IllegalStateException("Unknown ClassifierChoice: " + choice);
+ }
+ }
+ }
+
+ private void addClassifier(final Short index,final Classifier qosClassifier) {
// TODO - try and make these variables immutable
Protocol protocol = null;
byte tosOverwrite = 0;
byte tosMask = (byte)0x0;
- Inet4Address srcAddress = null;
- Inet4Address dstAddress = null;
short srcPort = (short) 0;
short dstPort = (short) 0;
byte priority = (byte) 64;
-
+ //byte priority = index.byteValue();
+
// Legacy classifier
+
+ // Protocol -- zero is match any
if (qosClassifier.getProtocol() != null) {
protocol = Protocol.valueOf(qosClassifier.getProtocol().getValue().shortValue());
+ } else {
+ protocol = Protocol.NONE;
}
+
+ // IP Addresss and mask wildcards - addr byte 0 for no match (or match anything)
+
+ Inet4Address srcAddress = (Inet4Address) getByName("0.0.0.0");
+
if (qosClassifier.getSrcIp() != null) {
- final InetAddress sip = getByName(qosClassifier.getSrcIp().getValue());
- if (sip != null && sip instanceof Inet4Address) {
- srcAddress = (Inet4Address) sip;
- }
+ srcAddress = (Inet4Address) getByName(qosClassifier.getSrcIp().getValue());
}
+
+ Inet4Address dstAddress = (Inet4Address) getByName("0.0.0.0");
+
if (qosClassifier.getDstIp() != null) {
- final InetAddress dip = getByName(qosClassifier.getDstIp().getValue());
- if (dip != null && dip instanceof Inet4Address) {
- dstAddress = (Inet4Address) dip;
- }
+ dstAddress = (Inet4Address) getByName(qosClassifier.getDstIp().getValue());
}
+
+
if (qosClassifier.getSrcPort() != null) {
srcPort = qosClassifier.getSrcPort().getValue().shortValue();
}
}
}
// push the classifier to the gate request
- classifier =
- new org.pcmm.gates.impl.Classifier(protocol, tosOverwrite, tosMask, srcAddress, dstAddress, srcPort,
- dstPort, priority);
+ classifiers.add(new org.pcmm.gates.impl.Classifier(protocol, tosOverwrite, tosMask, srcAddress, dstAddress, srcPort,
+ dstPort, priority));
}
-
- public void build(final ExtClassifier qosExtClassifier) {
+
+ private void addExtClassifier(final Short index, final ExtClassifier qosExtClassifier) {
// Extended classifier
final byte priority = (byte) 64;
final ActivationState activationState = ActivationState.ACTIVE;
if (qosExtClassifier.getSrcPortEnd() != null) {
srcEndPort = qosExtClassifier.getSrcPortEnd().getValue().shortValue();
}
- if (srcStartPort > srcEndPort) {
+ if ((int)(srcStartPort & 0xffff) > (int) (srcEndPort & 0xffff)) {
logger.warn("Start port %d > End port %d in ext-classifier source port range -- forcing to same",
srcStartPort, srcEndPort);
srcEndPort = srcStartPort;
if (qosExtClassifier.getDstPortEnd() != null) {
dstEndPort = qosExtClassifier.getDstPortEnd().getValue().shortValue();
}
- if (dstStartPort > dstEndPort) {
+ if ((int)(dstStartPort & 0xffff) > (int)(dstEndPort & 0xffff)) {
logger.warn("Start port %d > End port %d in ext-classifier destination port range -- forcing to same",
dstStartPort, dstEndPort);
dstEndPort = dstStartPort;
}
}
+ // IP Addresss and mask wildcards - addr byte 0 for no match (or match anything) and mask is 255.255.255.255 by default
+ Inet4Address srcIpAddr = (Inet4Address) getByName("0.0.0.0");
+
+ if (qosExtClassifier.getSrcIp() != null) {
+ srcIpAddr = getInet4Address(qosExtClassifier.getSrcIp());
+ }
+
+ Inet4Address dstIpAddr = (Inet4Address) getByName("0.0.0.0");
+ if (qosExtClassifier.getDstIp() != null) {
+ dstIpAddr = getInet4Address(qosExtClassifier.getDstIp());
+ }
+
+ //mask
+ Inet4Address srcIpMask = (Inet4Address) getByName("255.255.255.255");
+ if (qosExtClassifier.getSrcIpMask() != null) {
+ srcIpMask = getInet4Address(qosExtClassifier.getSrcIpMask());
+ }
+
+ Inet4Address dstIpMask = (Inet4Address) getByName("255.255.255.255");
+ if (qosExtClassifier.getDstIpMask() != null) {
+ dstIpMask = getInet4Address(qosExtClassifier.getDstIpMask());
+ }
+
// TODO - find out what the classifier ID should really be. It was never getting set previously
- final short classifierId = (short)0;
+ final short classifierId = (short)index;
// TODO - find out what the action value should really be. It was never getting set previously
- final byte action = (byte)0;
+ final IExtendedClassifier.Action action = IExtendedClassifier.Action.ADD;
// push the extended classifier to the gate request
- classifier = new org.pcmm.gates.impl.ExtendedClassifier(protocol, tosOverwrite, tosMask,
- getInet4Address(qosExtClassifier.getSrcIp()), getInet4Address(qosExtClassifier.getDstIp()),
- srcStartPort, dstStartPort, priority, getInet4Address(qosExtClassifier.getSrcIpMask()),
- getInet4Address(qosExtClassifier.getDstIpMask()), srcEndPort, dstEndPort, classifierId, activationState,
- action);
+ classifiers.add(new org.pcmm.gates.impl.ExtendedClassifier(protocol, tosOverwrite, tosMask,
+ srcIpAddr, dstIpAddr,
+ srcStartPort, dstStartPort, priority, srcIpMask, dstIpMask, srcEndPort, dstEndPort, classifierId, activationState,
+ action));
}
private Inet4Address getInet4Address(
return null;
}
- public void build(final Ipv6Classifier qosIpv6Classifier) {
+ private void addIpv6Classifier(final Short index, final Ipv6Classifier qosIpv6Classifier) {
// Next Header
final short nextHdr;
if (qosIpv6Classifier.getNextHdr() != null) {
// Source IPv6 address & prefix len
// TODO - try to make these two variables immutable
byte srcPrefixLen = (byte) 128;
- Inet6Address srcAddress = null;
+ Inet6Address srcAddress = (Inet6Address) getByName("0::0");
+
if (qosIpv6Classifier.getSrcIp6() != null) {
String[] parts = qosIpv6Classifier.getSrcIp6().getValue().split("/");
String Ipv6AddressStr = parts[0];
}
// TODO - try to make these two variables immutable
- Inet6Address dstAddress = null;
+ Inet6Address dstAddress = (Inet6Address) getByName("0::0");
+
byte dstPrefLen = (byte) 128;
// Destination IPv6 address & prefix len
if (qosIpv6Classifier.getDstIp6() != null) {
if (qosIpv6Classifier.getSrcPortEnd() != null) {
srcPortEnd = qosIpv6Classifier.getSrcPortEnd().getValue().shortValue();
}
- if (srcPortBegin > srcPortEnd) {
+ if ((int)(srcPortBegin & 0xffff) > (int)(srcPortEnd & 0xffff)) {
logger.warn("Start port %d > End port %d in ipv6-classifier source port range -- forcing to same",
srcPortBegin, srcPortEnd);
srcPortEnd = srcPortBegin;
if (qosIpv6Classifier.getDstPortEnd() != null) {
dstPortEnd = qosIpv6Classifier.getDstPortEnd().getValue().shortValue();
}
- if (dstPortBegin > dstPortEnd) {
+ if ( (int)(dstPortBegin & 0xffff) > (int)(dstPortEnd & 0xffff)) {
logger.warn("Start port %d > End port %d in ipv6-classifier destination port range -- forcing to same",
dstPortBegin, dstPortEnd);
dstPortEnd = dstPortBegin;
tcMask = qosIpv6Classifier.getTcHigh().getValue().byteValue();
else if (qosIpv6Classifier.getTcLow() != null) tcMask = (byte) 0xff;
else tcMask = (byte) 0x00;
+
+ FlowLabel flowLabelFlag = FlowLabel.IRRELEVANT;
+ int flowLabelId = 0;
+
+ if (qosIpv6Classifier.getFlowLabel() != null) {
+ flowLabelFlag = FlowLabel.VALID;
+ flowLabelId = qosIpv6Classifier.getFlowLabel().intValue();
+ }
+
// TODO - find out what the classifier ID should really be. It was never getting set previously
- final short classifierId = (short)0;
+ final short classifierId = (short)index;
// TODO - find out what the action value should really be. It was never getting set previously
- final byte action = (byte)0;
+ final IExtendedClassifier.Action action = IExtendedClassifier.Action.ADD;
// push the IPv6 classifier to the gate request
- classifier = new org.pcmm.gates.impl.IPv6Classifier(srcAddress, dstAddress, srcPortBegin, dstPortBegin,
- (byte) 64, srcPortEnd, dstPortEnd, classifierId, ActivationState.ACTIVE, action, FlowLabel.VALID, tcLow,
- tcHigh, tcMask, qosIpv6Classifier.getFlowLabel().intValue(), nextHdr, srcPrefixLen, dstPrefLen);
+ classifiers.add(
+ new org.pcmm.gates.impl.IPv6Classifier(srcAddress, dstAddress, srcPortBegin, dstPortBegin, (byte) 64,
+ srcPortEnd, dstPortEnd, classifierId, ActivationState.ACTIVE, action, flowLabelFlag, tcLow,
+ tcHigh, tcMask, flowLabelId, nextHdr, srcPrefixLen, dstPrefLen));
}
}