-/**
- @header@
+/*
+ * (c) 2015 Cable Television Laboratories, Inc. All rights reserved.
*/
package org.pcmm;
-import org.pcmm.gates.*;
-import org.pcmm.gates.IGateSpec.DSCPTOS;
-import org.pcmm.gates.IGateSpec.Direction;
-import org.pcmm.gates.impl.*;
+import org.pcmm.gates.IGateID;
+import org.pcmm.gates.IPCMMGate;
+import org.pcmm.gates.ITransactionID;
+import org.pcmm.gates.ITransactionID.GateCommandType;
+import org.pcmm.gates.impl.PCMMGateReq;
+import org.pcmm.gates.impl.TransactionID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.umu.cops.COPSMsgSender;
import org.umu.cops.prpdp.COPSPdpException;
import org.umu.cops.stack.*;
+import org.umu.cops.stack.COPSContext.RType;
+import org.umu.cops.stack.COPSDecision.Command;
+import org.umu.cops.stack.COPSDecision.DecisionFlag;
+import org.umu.cops.stack.COPSHeader.OPCode;
import org.umu.cops.stack.COPSObjHeader.CNum;
import org.umu.cops.stack.COPSObjHeader.CType;
import java.io.IOException;
-import java.net.InetAddress;
import java.net.Socket;
-import java.net.UnknownHostException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
-//temp
-//pcmm
/*
* Example of an UNSOLICITED decision
*
/**
* COPS message transceiver class for provisioning connections at the PDP side.
*/
-public class PCMMPdpMsgSender {
+public class PCMMPdpMsgSender extends COPSMsgSender {
public final static Logger logger = LoggerFactory.getLogger(PCMMPdpMsgSender.class);
- /**
- * Socket connected to PEP
- */
- protected Socket _sock;
-
- /**
- * COPS client-type that identifies the policy client
- */
- protected short _clientType;
-
- /**
- * COPS client handle used to uniquely identify a particular PEP's request
- * for a client-type
- */
- protected COPSHandle _handle;
+ protected final short _transactionID;
+ protected final short _classifierID;
- /**
- *
- */
- protected short _transactionID;
- protected short _classifierID;
// XXX - this does not need to be here
- protected int _gateID;
+ protected IGateID _gateID;
/**
* Creates a PCMMPdpMsgSender
* @param sock
* Socket to the PEP
*/
- public PCMMPdpMsgSender(short clientType, COPSHandle clientHandle,
- Socket sock) {
- // COPS Handle
- _handle = clientHandle;
- _clientType = clientType;
-
- _transactionID = 0;
- _classifierID = 0;
- _sock = sock;
+ public PCMMPdpMsgSender(final short clientType, final COPSHandle clientHandle, final Socket sock) {
+ this(clientType, (short)0, clientHandle, sock);
}
- public PCMMPdpMsgSender(short clientType, short tID,
- COPSHandle clientHandle, Socket sock) {
- // COPS Handle
- _handle = clientHandle;
- _clientType = clientType;
- _transactionID = tID;
+ public PCMMPdpMsgSender(final short clientType, final short tID, final COPSHandle clientHandle,
+ final Socket sock) {
+ super(clientType, clientHandle, sock);
+ _transactionID = tID == 0 ? (short) (Math.random() * hashCode()) : tID;
_classifierID = 0;
- _sock = sock;
- }
-
- /**
- * Gets the client handle
- *
- * @return Client's <tt>COPSHandle</tt>
- */
- public COPSHandle getClientHandle() {
- return _handle;
- }
-
- /**
- * Gets the client-type
- *
- * @return Client-type value
- */
- public short getClientType() {
- return _clientType;
}
/**
- * Gets the transaction-id
+ * Gets the gate-id
*
- * @return transaction-id value
+ * @return the gate-id value
*/
- public short getTransactionID() {
- return _transactionID;
+ public IGateID getGateID() {
+ return _gateID;
}
-
/**
* Sends a PCMM GateSet COPS Decision message
- *
- * @param
+ * @param gate - the gate
* @throws COPSPdpException
*/
- public void sendGateSet(IPCMMGate gate)
- throws COPSPdpException {
- // Common Header with the same ClientType as the request
-
- COPSHeader hdr = new COPSHeader(COPSHeader.COPS_OP_DEC, getClientType());
-
- // Client Handle with the same clientHandle as the request
- final COPSHandle handle = new COPSHandle(getClientHandle().getId());
- COPSDecisionMsg decisionMsg = new COPSDecisionMsg();
- ITransactionID trID = new TransactionID();
-
+ public void sendGateSet(final IPCMMGate gate) throws COPSPdpException {
// set transaction ID to gate set
- trID.setGateCommandType(ITransactionID.GateSet);
- _transactionID = (_transactionID == 0 ? (short) (Math.random() * hashCode()) : _transactionID);
- trID.setTransactionIdentifier(_transactionID);
+ final ITransactionID trID = new TransactionID(_transactionID, GateCommandType.GATE_SET);
gate.setTransactionID(trID);
-
+ // retain the transactionId to gate request mapping for gateID recovery after response
+ // see PCMMPdpReqStateMan.processReport()
+ final Short trIDnum = trID.getTransactionIdentifier();
+ logger.info("Adding gate to cache - " + gate + " with key - " + trIDnum);
+ PCMMGlobalConfig.transactionGateMap.put(trIDnum, gate);
// new pcmm specific clientsi
- COPSClientSI clientSD = new COPSClientSI((byte)CNum.DEC.ordinal(), (byte)CType.CSI.ordinal());
- byte[] data = gate.getData();
- clientSD.setData(new COPSData(data, 0, data.length));
- try {
- decisionMsg.add(hdr);
- decisionMsg.add(handle);
- // Decisions (no flags supplied)
- // <Context>
- COPSContext cntxt = new COPSContext(COPSContext.CONFIG, (short) 0);
- COPSDecision install = new COPSDecision();
- install.setCmdCode(COPSDecision.DEC_INSTALL);
- install.setFlags(COPSDecision.F_REQERROR);
- decisionMsg.addDecision(install, cntxt);
- decisionMsg.add(clientSD); // setting up the gate
- /*
- try {
- decisionMsg.dump(System.out);
- } catch (IOException unae) {
- System.out.println("Error dumping " + unae.getMessage());
- }
- */
-
- } catch (COPSException e) {
- logger.error("Error making Msg", e);
- }
-
- // ** Send the GateSet Decision
- // **
- try {
- decisionMsg.writeData(_sock);
- } catch (IOException e) {
- logger.error("Failed to send the decision, reason: ", e);
- }
-
- }
-
- /**
- * Sends a PCMM GateSet COPS Decision message
- *
- * @param
- * @throws COPSPdpException
- */
- public void sendGateSetDemo(int num)
- throws COPSPdpException {
-
+ final byte[] data = gate.getData();
// Common Header with the same ClientType as the request
-
- COPSHeader hdr = new COPSHeader(COPSHeader.COPS_OP_DEC, getClientType());
-
- // Client Handle with the same clientHandle as the request
- COPSDecisionMsg decisionMsg = new COPSDecisionMsg();
-
- IPCMMGate gate = new PCMMGateReq();
- ITransactionID trID = new TransactionID();
-
- IAMID amid = new AMID();
- ISubscriberID subscriberID = new SubscriberID();
- IGateSpec gateSpec = new GateSpec();
- IClassifier classifier = new Classifier();
- IExtendedClassifier eclassifier = new ExtendedClassifier();
- final int trafficRate;
-
- if (num == 1)
- trafficRate = PCMMGlobalConfig.DefaultBestEffortTrafficRate;
- else
- trafficRate = PCMMGlobalConfig.DefaultLowBestEffortTrafficRate;
-
- ITrafficProfile trafficProfile = new BestEffortService(
- (byte) 7); //BestEffortService.DEFAULT_ENVELOP);
- ((BestEffortService) trafficProfile).getAuthorizedEnvelop()
- .setTrafficPriority(BestEffortService.DEFAULT_TRAFFIC_PRIORITY);
- ((BestEffortService) trafficProfile).getAuthorizedEnvelop()
- .setMaximumTrafficBurst(
- BestEffortService.DEFAULT_MAX_TRAFFIC_BURST);
- ((BestEffortService) trafficProfile).getAuthorizedEnvelop()
- .setRequestTransmissionPolicy(
- PCMMGlobalConfig.BETransmissionPolicy);
- ((BestEffortService) trafficProfile).getAuthorizedEnvelop()
- .setMaximumSustainedTrafficRate(
- trafficRate);
- // PCMMGlobalConfig.DefaultLowBestEffortTrafficRate );
- // PCMMGlobalConfig.DefaultBestEffortTrafficRate);
-
- ((BestEffortService) trafficProfile).getReservedEnvelop()
- .setTrafficPriority(BestEffortService.DEFAULT_TRAFFIC_PRIORITY);
- ((BestEffortService) trafficProfile).getReservedEnvelop()
- .setMaximumTrafficBurst(
- BestEffortService.DEFAULT_MAX_TRAFFIC_BURST);
- ((BestEffortService) trafficProfile).getReservedEnvelop()
- .setRequestTransmissionPolicy(
- PCMMGlobalConfig.BETransmissionPolicy);
- ((BestEffortService) trafficProfile).getReservedEnvelop()
- .setMaximumSustainedTrafficRate(
- trafficRate);
- // PCMMGlobalConfig.DefaultLowBestEffortTrafficRate );
- // PCMMGlobalConfig.DefaultBestEffortTrafficRate);
-
-
- ((BestEffortService) trafficProfile).getCommittedEnvelop()
- .setTrafficPriority(BestEffortService.DEFAULT_TRAFFIC_PRIORITY);
- ((BestEffortService) trafficProfile).getCommittedEnvelop()
- .setMaximumTrafficBurst(
- BestEffortService.DEFAULT_MAX_TRAFFIC_BURST);
- ((BestEffortService) trafficProfile).getCommittedEnvelop()
- .setRequestTransmissionPolicy(
- PCMMGlobalConfig.BETransmissionPolicy);
- ((BestEffortService) trafficProfile).getCommittedEnvelop()
- .setMaximumSustainedTrafficRate(
- trafficRate);
- // PCMMGlobalConfig.DefaultLowBestEffortTrafficRate );
- // PCMMGlobalConfig.DefaultBestEffortTrafficRate);
-
-
-
- // new pcmm specific clientsi
- COPSClientSI clientSD = new COPSClientSI((byte)CNum.DEC.ordinal(), (byte)CType.CSI.ordinal());
-
- final COPSHandle handle = new COPSHandle(getClientHandle().getId());
-
- // set transaction ID to gate set
- trID.setGateCommandType(ITransactionID.GateSet);
- _transactionID = (_transactionID == 0 ? (short) (Math.random() * hashCode()) : _transactionID);
- trID.setTransactionIdentifier(_transactionID);
-
- amid.setApplicationType((short) 1);
- amid.setApplicationMgrTag((short) 1);
- gateSpec.setDirection(Direction.UPSTREAM);
- gateSpec.setDSCP_TOSOverwrite(DSCPTOS.OVERRIDE);
- gateSpec.setTimerT1(PCMMGlobalConfig.GateT1);
- gateSpec.setTimerT2(PCMMGlobalConfig.GateT2);
- gateSpec.setTimerT3(PCMMGlobalConfig.GateT3);
- gateSpec.setTimerT4(PCMMGlobalConfig.GateT4);
-
- // XXX - if the version major is less than 4 we need to use Classifier
- if (true) {
- //eclassifier.setProtocol(IClassifier.Protocol.NONE);
- eclassifier.setProtocol(IClassifier.Protocol.TCP);
- try {
- InetAddress subIP = InetAddress
- .getByName(PCMMGlobalConfig.SubscriberID);
- InetAddress srcIP = InetAddress
- .getByName(PCMMGlobalConfig.srcIP);
- InetAddress dstIP = InetAddress
- .getByName(PCMMGlobalConfig.dstIP);
- InetAddress mask = InetAddress.getByName("0.0.0.0");
- subscriberID.setSourceIPAddress(subIP);
- eclassifier.setSourceIPAddress(srcIP);
- eclassifier.setDestinationIPAddress(dstIP);
- eclassifier.setIPDestinationMask(mask);
- eclassifier.setIPSourceMask(mask);
- } catch (UnknownHostException unae) {
- logger.error("Error getByName", unae);
- }
- eclassifier.setSourcePortStart(PCMMGlobalConfig.srcPort);
- eclassifier.setSourcePortEnd(PCMMGlobalConfig.srcPort);
- eclassifier.setDestinationPortStart(PCMMGlobalConfig.dstPort);
- eclassifier.setDestinationPortEnd(PCMMGlobalConfig.dstPort);
- eclassifier.setActivationState((byte) 0x01);
- // check if we have a stored value of classifierID else we just
- // create
- // one
- // eclassifier.setClassifierID((short) 0x01);
- eclassifier.setClassifierID((short) (_classifierID == 0 ? Math
- .random() * hashCode() : _classifierID));
- // XXX - testie
- // eclassifier.setClassifierID((short) 1);
-
- eclassifier.setAction((byte) 0x00);
- // XXX - temp default until Gate Modify is hacked in
- // eclassifier.setPriority(PCMMGlobalConfig.EClassifierPriority);
- eclassifier.setPriority((byte) 65);
-
- } else {
- classifier.setProtocol(IClassifier.Protocol.TCP);
- try {
- InetAddress subIP = InetAddress
- .getByName(PCMMGlobalConfig.SubscriberID);
- InetAddress srcIP = InetAddress
- .getByName(PCMMGlobalConfig.srcIP);
- InetAddress dstIP = InetAddress
- .getByName(PCMMGlobalConfig.dstIP);
- subscriberID.setSourceIPAddress(subIP);
- classifier.setSourceIPAddress(srcIP);
- classifier.setDestinationIPAddress(dstIP);
- } catch (UnknownHostException unae) {
- logger.error("Error getByName", unae);
- }
- classifier.setSourcePort(PCMMGlobalConfig.srcPort);
- classifier.setDestinationPort(PCMMGlobalConfig.dstPort);
- }
-
- gate.setTransactionID(trID);
- gate.setAMID(amid);
- gate.setSubscriberID(subscriberID);
- gate.setGateSpec(gateSpec);
- gate.setTrafficProfile(trafficProfile);
- gate.setClassifier(eclassifier);
-
- byte[] data = gate.getData();
-
- // new pcmm specific clientsi
- clientSD.setData(new COPSData(data, 0, data.length));
- try {
- decisionMsg.add(hdr);
- decisionMsg.add(handle);
- // Decisions (no flags supplied)
- // <Context>
- COPSContext cntxt = new COPSContext(COPSContext.CONFIG, (short) 0);
- COPSDecision install = new COPSDecision();
- install.setCmdCode(COPSDecision.DEC_INSTALL);
- install.setFlags(COPSDecision.F_REQERROR);
- decisionMsg.addDecision(install, cntxt);
- decisionMsg.add(clientSD); // setting up the gate
- /*
- try {
- decisionMsg.dump(System.out);
- } catch (IOException unae) {
- System.out.println("Error dumping " + unae.getMessage());
- }
- */
-
- } catch (COPSException e) {
- logger.error("Error making Msg", e);
- }
-
- // ** Send the GateSet Decision
- // **
- try {
- decisionMsg.writeData(_sock);
- } catch (IOException e) {
- logger.error("Failed to send the decision, reason: ", e);
- }
-
- }
- /**
- * Sends a PCMM GateSet COPS Decision message
- *
- * @param
- * @throws COPSPdpException
- */
- public void sendGateSetBestEffortWithExtendedClassifier()
- throws COPSPdpException {
- // Common Header with the same ClientType as the request
-
- COPSHeader hdr = new COPSHeader(COPSHeader.COPS_OP_DEC, getClientType());
-
- COPSDecisionMsg decisionMsg = new COPSDecisionMsg();
-
- IPCMMGate gate = new PCMMGateReq();
- ITransactionID trID = new TransactionID();
-
- IAMID amid = new AMID();
- ISubscriberID subscriberID = new SubscriberID();
- IGateSpec gateSpec = new GateSpec();
- IClassifier classifier = new Classifier();
- IExtendedClassifier eclassifier = new ExtendedClassifier();
-
- // XXX check if other values should be provided
- //
- ITrafficProfile trafficProfile = new BestEffortService(
- (byte) 7); //BestEffortService.DEFAULT_ENVELOP);
- ((BestEffortService) trafficProfile).getAuthorizedEnvelop()
- .setTrafficPriority(BestEffortService.DEFAULT_TRAFFIC_PRIORITY);
- ((BestEffortService) trafficProfile).getAuthorizedEnvelop()
- .setMaximumTrafficBurst(
- BestEffortService.DEFAULT_MAX_TRAFFIC_BURST);
- ((BestEffortService) trafficProfile).getAuthorizedEnvelop()
- .setRequestTransmissionPolicy(
- PCMMGlobalConfig.BETransmissionPolicy);
- ((BestEffortService) trafficProfile).getAuthorizedEnvelop()
- .setMaximumSustainedTrafficRate(
- PCMMGlobalConfig.DefaultLowBestEffortTrafficRate );
- // PCMMGlobalConfig.DefaultBestEffortTrafficRate);
-
- ((BestEffortService) trafficProfile).getReservedEnvelop()
- .setTrafficPriority(BestEffortService.DEFAULT_TRAFFIC_PRIORITY);
- ((BestEffortService) trafficProfile).getReservedEnvelop()
- .setMaximumTrafficBurst(
- BestEffortService.DEFAULT_MAX_TRAFFIC_BURST);
- ((BestEffortService) trafficProfile).getReservedEnvelop()
- .setRequestTransmissionPolicy(
- PCMMGlobalConfig.BETransmissionPolicy);
- ((BestEffortService) trafficProfile).getReservedEnvelop()
- .setMaximumSustainedTrafficRate(
- PCMMGlobalConfig.DefaultLowBestEffortTrafficRate );
- // PCMMGlobalConfig.DefaultBestEffortTrafficRate);
-
-
- ((BestEffortService) trafficProfile).getCommittedEnvelop()
- .setTrafficPriority(BestEffortService.DEFAULT_TRAFFIC_PRIORITY);
- ((BestEffortService) trafficProfile).getCommittedEnvelop()
- .setMaximumTrafficBurst(
- BestEffortService.DEFAULT_MAX_TRAFFIC_BURST);
- ((BestEffortService) trafficProfile).getCommittedEnvelop()
- .setRequestTransmissionPolicy(
- PCMMGlobalConfig.BETransmissionPolicy);
- ((BestEffortService) trafficProfile).getCommittedEnvelop()
- .setMaximumSustainedTrafficRate(
- PCMMGlobalConfig.DefaultLowBestEffortTrafficRate );
- // PCMMGlobalConfig.DefaultBestEffortTrafficRate);
-
-
-
- // new pcmm specific clientsi
- COPSClientSI clientSD = new COPSClientSI((byte)CNum.DEC.ordinal(), (byte)CType.CSI.ordinal());
-
// Client Handle with the same clientHandle as the request
- final COPSHandle handle = new COPSHandle(getClientHandle().getId());
-
- // set transaction ID to gate set
- trID.setGateCommandType(ITransactionID.GateSet);
- _transactionID = (_transactionID == 0 ? (short) (Math.random() * hashCode()) : _transactionID);
- trID.setTransactionIdentifier(_transactionID);
-
- amid.setApplicationType((short) 1);
- amid.setApplicationMgrTag((short) 1);
- gateSpec.setDirection(Direction.UPSTREAM);
- gateSpec.setDSCP_TOSOverwrite(DSCPTOS.OVERRIDE);
- gateSpec.setTimerT1(PCMMGlobalConfig.GateT1);
- gateSpec.setTimerT2(PCMMGlobalConfig.GateT2);
- gateSpec.setTimerT3(PCMMGlobalConfig.GateT3);
- gateSpec.setTimerT4(PCMMGlobalConfig.GateT4);
-
- // XXX - if the version major is less than 4 we need to use Classifier
- if (true) {
- //eclassifier.setProtocol(IClassifier.Protocol.NONE);
- eclassifier.setProtocol(IClassifier.Protocol.TCP);
- try {
- InetAddress subIP = InetAddress
- .getByName(PCMMGlobalConfig.SubscriberID);
- InetAddress srcIP = InetAddress
- .getByName(PCMMGlobalConfig.srcIP);
- InetAddress dstIP = InetAddress
- .getByName(PCMMGlobalConfig.dstIP);
- InetAddress mask = InetAddress.getByName("0.0.0.0");
- subscriberID.setSourceIPAddress(subIP);
- eclassifier.setSourceIPAddress(srcIP);
- eclassifier.setDestinationIPAddress(dstIP);
- eclassifier.setIPDestinationMask(mask);
- eclassifier.setIPSourceMask(mask);
- } catch (UnknownHostException unae) {
- logger.error("Error getByName", unae);
- }
- eclassifier.setSourcePortStart(PCMMGlobalConfig.srcPort);
- eclassifier.setSourcePortEnd(PCMMGlobalConfig.srcPort);
- eclassifier.setDestinationPortStart(PCMMGlobalConfig.dstPort);
- eclassifier.setDestinationPortEnd(PCMMGlobalConfig.dstPort);
- eclassifier.setActivationState((byte) 0x01);
- // check if we have a stored value of classifierID else we just
- // create
- // one
- // eclassifier.setClassifierID((short) 0x01);
- eclassifier.setClassifierID((short) (_classifierID == 0 ? Math
- .random() * hashCode() : _classifierID));
- // XXX - testie
- // eclassifier.setClassifierID((short) 1);
-
- eclassifier.setAction((byte) 0x00);
- // XXX - temp default until Gate Modify is hacked in
- // eclassifier.setPriority(PCMMGlobalConfig.EClassifierPriority);
- eclassifier.setPriority((byte) 65);
-
- } else {
- classifier.setProtocol(IClassifier.Protocol.TCP);
- try {
- InetAddress subIP = InetAddress
- .getByName(PCMMGlobalConfig.SubscriberID);
- InetAddress srcIP = InetAddress
- .getByName(PCMMGlobalConfig.srcIP);
- InetAddress dstIP = InetAddress
- .getByName(PCMMGlobalConfig.dstIP);
- subscriberID.setSourceIPAddress(subIP);
- classifier.setSourceIPAddress(srcIP);
- classifier.setDestinationIPAddress(dstIP);
- } catch (UnknownHostException unae) {
- logger.error("Error getByName", unae);
- }
- classifier.setSourcePort(PCMMGlobalConfig.srcPort);
- classifier.setDestinationPort(PCMMGlobalConfig.dstPort);
- }
- gate.setTransactionID(trID);
- gate.setAMID(amid);
- gate.setSubscriberID(subscriberID);
- gate.setGateSpec(gateSpec);
- gate.setTrafficProfile(trafficProfile);
- gate.setClassifier(eclassifier);
-
- byte[] data = gate.getData();
+ final Set<COPSDecision> decisionSet = new HashSet<>();
+ decisionSet.add(new COPSDecision(CType.DEF, Command.INSTALL, DecisionFlag.REQERROR));
+ final Map<COPSContext, Set<COPSDecision>> decisionMap = new HashMap<>();
+ decisionMap.put(new COPSContext(RType.CONFIG, (short)0), decisionSet);
- // new pcmm specific clientsi
- clientSD.setData(new COPSData(data, 0, data.length));
- try {
- decisionMsg.add(hdr);
- decisionMsg.add(handle);
- // Decisions (no flags supplied)
- // <Context>
- COPSContext cntxt = new COPSContext(COPSContext.CONFIG, (short) 0);
- COPSDecision install = new COPSDecision();
- install.setCmdCode(COPSDecision.DEC_INSTALL);
- install.setFlags(COPSDecision.F_REQERROR);
- decisionMsg.addDecision(install, cntxt);
- decisionMsg.add(clientSD); // setting up the gate
- /*
- try {
- decisionMsg.dump(System.out);
- } catch (IOException unae) {
- System.out.println("Error dumping " + unae.getMessage());
- }
- */
-
- } catch (COPSException e) {
- logger.error("Error making Msg", e);
- }
+ final COPSClientSI clientSD = new COPSClientSI(CNum.DEC, CType.CSI, new COPSData(data, 0, data.length));
+ final COPSDecisionMsg decisionMsg = new COPSDecisionMsg(_clientType, _handle, decisionMap, null, clientSD);
// ** Send the GateSet Decision
- // **
try {
decisionMsg.writeData(_sock);
} catch (IOException e) {
}
-
- public boolean handleGateReport(Socket socket) throws COPSPdpException {
+ public boolean handleGateReport(final Socket socket) throws COPSPdpException {
try {
// waits for the gate-set-ack or error
- COPSMsg responseMsg = COPSTransceiver.receiveMsg(socket);
- if (responseMsg.getHeader().isAReport()) {
+ final COPSMsg responseMsg = COPSTransceiver.receiveMsg(socket);
+ if (responseMsg.getHeader().getOpCode().equals(OPCode.RPT)) {
logger.info("processing received report from CMTS");
- COPSReportMsg reportMsg = (COPSReportMsg) responseMsg;
- if (reportMsg.getClientSI().size() == 0) {
+ final COPSReportMsg reportMsg = (COPSReportMsg) responseMsg;
+ if (reportMsg.getClientSI() == null) {
return false;
}
- COPSClientSI clientSI = (COPSClientSI) reportMsg.getClientSI()
- .elementAt(0);
- IPCMMGate responseGate = new PCMMGateReq(clientSI.getData()
- .getData());
+ final IPCMMGate responseGate = PCMMGateReq.parse(reportMsg.getClientSI().getData().getData());
if (responseGate.getTransactionID() != null
- && responseGate.getTransactionID().getGateCommandType() == ITransactionID.GateSetAck) {
+ && responseGate.getTransactionID().getGateCommandType().equals(GateCommandType.GATE_SET_ACK)) {
logger.info("the CMTS has sent a Gate-Set-Ack response");
// here CMTS responded that he acknowledged the Gate-Set
// TODO do further check of Gate-Set-Ack GateID etc...
- _gateID = responseGate.getGateID().getGateID();
+ _gateID = responseGate.getGateID();
return true;
} else {
return false;
}
return false;
} catch (Exception e) { // COPSException, IOException
- throw new COPSPdpException("Error COPSTransceiver.receiveMsg");
+ throw new COPSPdpException("Error COPSTransceiver.receiveMsg", e);
}
}
- /**
- * Sends a PCMM GateSet COPS Decision message
- *
- * @param
- * @throws COPSPdpException
- */
- public void sendGateSet() throws COPSPdpException {
- // Common Header with the same ClientType as the request
-
- COPSHeader hdr = new COPSHeader(COPSHeader.COPS_OP_DEC, getClientType());
-
- COPSDecisionMsg decisionMsg = new COPSDecisionMsg();
-
- IPCMMGate gate = new PCMMGateReq();
- ITransactionID trID = new TransactionID();
-
- IAMID amid = new AMID();
- ISubscriberID subscriberID = new SubscriberID();
- IGateSpec gateSpec = new GateSpec();
- IClassifier classifier = new Classifier();
- // XXX check if other values should be provided
- ITrafficProfile trafficProfile = new BestEffortService(
- BestEffortService.DEFAULT_ENVELOP);
- ((BestEffortService) trafficProfile).getAuthorizedEnvelop()
- .setTrafficPriority(BestEffortService.DEFAULT_TRAFFIC_PRIORITY);
- ((BestEffortService) trafficProfile).getAuthorizedEnvelop()
- .setMaximumTrafficBurst(
- BestEffortService.DEFAULT_MAX_TRAFFIC_BURST);
- ((BestEffortService) trafficProfile).getAuthorizedEnvelop()
- .setRequestTransmissionPolicy(
- PCMMGlobalConfig.BETransmissionPolicy);
-
- // new pcmm specific clientsi
- COPSClientSI clientSD = new COPSClientSI((byte)CNum.DEC.ordinal(), (byte)CType.CSI.ordinal());
-
- // Client Handle with the same clientHandle as the request
- final COPSHandle handle = new COPSHandle(getClientHandle().getId());
- // byte[] content = "1234".getBytes();
-
- // handle.setId(new COPSData(content, 0, content.length));
-
- // set transaction ID to gate set
- trID.setGateCommandType(ITransactionID.GateSet);
- _transactionID = (_transactionID == 0 ? (short) (Math.random() * hashCode()) : _transactionID);
- trID.setTransactionIdentifier(_transactionID);
-
- amid.setApplicationType((short) 1);
- amid.setApplicationMgrTag((short) 1);
- gateSpec.setDirection(Direction.UPSTREAM);
- gateSpec.setDSCP_TOSOverwrite(DSCPTOS.OVERRIDE);
- gateSpec.setTimerT1(PCMMGlobalConfig.GateT1);
- gateSpec.setTimerT2(PCMMGlobalConfig.GateT2);
- gateSpec.setTimerT3(PCMMGlobalConfig.GateT3);
- gateSpec.setTimerT4(PCMMGlobalConfig.GateT4);
-
- /*
- * ((DOCSISServiceClassNameTrafficProfile) trafficProfile)
- * .setServiceClassName("S_up");
- */
-
- classifier.setProtocol(IClassifier.Protocol.TCP);
- try {
- InetAddress subIP = InetAddress.getByName(PCMMGlobalConfig.SubscriberID);
- InetAddress srcIP = InetAddress.getByName(PCMMGlobalConfig.srcIP);
- InetAddress dstIP = InetAddress.getByName(PCMMGlobalConfig.dstIP);
- subscriberID.setSourceIPAddress(subIP);
- classifier.setSourceIPAddress(srcIP);
- classifier.setDestinationIPAddress(dstIP);
- } catch (UnknownHostException unae) {
- logger.error("Error getByName", unae);
- }
- classifier.setSourcePort(PCMMGlobalConfig.srcPort);
- classifier.setDestinationPort(PCMMGlobalConfig.dstPort);
-
- gate.setTransactionID(trID);
- gate.setAMID(amid);
- gate.setSubscriberID(subscriberID);
- gate.setGateSpec(gateSpec);
- gate.setTrafficProfile(trafficProfile);
- gate.setClassifier(classifier);
-
- byte[] data = gate.getData();
-
- // new pcmm specific clientsi
- clientSD.setData(new COPSData(data, 0, data.length));
-
- try {
- decisionMsg.add(hdr);
- decisionMsg.add(handle);
- // Decisions (no flags supplied)
- // <Context>
- COPSContext cntxt = new COPSContext(COPSContext.CONFIG, (short) 0);
- COPSDecision install = new COPSDecision();
- install.setCmdCode(COPSDecision.DEC_INSTALL);
- install.setFlags(COPSDecision.F_REQERROR);
- decisionMsg.addDecision(install, cntxt);
- decisionMsg.add(clientSD); // setting up the gate
- /*
- try {
- decisionMsg.dump(System.out);
- } catch (IOException unae) {
- System.out.println("Error dumping " + unae.getMessage());
- }
- */
-
- } catch (COPSException e) {
- logger.error("Error making Msg", e);
- }
-
- // ** Send the GateSet Decision
- // **
- try {
- decisionMsg.writeData(_sock);
- } catch (IOException e) {
- logger.error("Failed to send the decision", e);
- }
-
- }
-
/**
* Sends a message asking that the request state be deleted
*
* @throws COPSPdpException
*/
- public void sendGateDelete(int gID) throws COPSPdpException {
- /*
- * Example of an UNSOLICITED decision <Gate Control Command> = <COPS
- * Common Header> <Client Handle> <Context> <Decision Flags> <ClientSI
- * Data> <ClientSI Data> = <Gate-Set> | <Gate-Info> | <Gate-Delete> |
- * <PDP-Config> | <Synch-Request> | <Msg-Receipt> <Gate-Delete> =
- * <Decision Header> <TransactionID> <AMID> <SubscriberID> <GateID>
- */
- // Common Header with the same ClientType as the request
- COPSHeader hdr = new COPSHeader(COPSHeader.COPS_OP_DEC, getClientType());
-
- // Client Handle with the same clientHandle as the request
- COPSDecisionMsg decisionMsg = new COPSDecisionMsg();
-
- IPCMMGate gate = new PCMMGateReq();
- ITransactionID trID = new TransactionID();
-
- IAMID amid = new AMID();
- ISubscriberID subscriberID = new SubscriberID();
- IGateID gateID = new GateID();
-
- // new pcmm specific clientsi
- COPSClientSI clientSD = new COPSClientSI((byte)CNum.DEC.ordinal(), (byte)CType.CSI.ordinal());
-
- final COPSHandle handle = new COPSHandle(getClientHandle().getId());
-
+ public void sendGateDelete(final IPCMMGate gate) throws COPSPdpException {
// set transaction ID to gate set
- trID.setGateCommandType(ITransactionID.GateDelete);
- _transactionID = (_transactionID == 0 ? (short) (Math.random() * hashCode()) : _transactionID);
- trID.setTransactionIdentifier(_transactionID);
-
- amid.setApplicationType((short) 1);
- amid.setApplicationMgrTag((short) 1);
- gateID.setGateID(gID);
+ final ITransactionID trID = new TransactionID(_transactionID, GateCommandType.GATE_DELETE);
+ gate.setTransactionID(trID);
- try {
- InetAddress subIP = InetAddress.getByName(PCMMGlobalConfig.SubscriberID);
- subscriberID.setSourceIPAddress(subIP);
- } catch (UnknownHostException unae) {
- logger.error("Error getByName", unae);
- }
+ Short trIDnum = trID.getTransactionIdentifier();
+ PCMMGlobalConfig.transactionGateMap.put(trIDnum, gate);
- gate.setTransactionID(trID);
- gate.setAMID(amid);
- gate.setSubscriberID(subscriberID);
- gate.setGateID(gateID);
+ // gateDelete only requires AMID, subscriberID, and gateID
+ // remove the gateSpec, traffic profile, and classifiers from original gate request
+ gate.setGateSpec(null);
+ gate.setTrafficProfile(null);
+ gate.setClassifiers(null);
+ // clear the error object
+ gate.setError(null);
// XXX - GateID
- byte[] data = gate.getData();
+ final byte[] data = gate.getData();
+ final Set<COPSDecision> decisionSet = new HashSet<>();
+ decisionSet.add(new COPSDecision(CType.DEF, Command.INSTALL, DecisionFlag.REQERROR));
+ final Map<COPSContext, Set<COPSDecision>> decisionMap = new HashMap<>();
+ decisionMap.put(new COPSContext(RType.CONFIG, (short)0), decisionSet);
+ final COPSClientSI clientSD = new COPSClientSI(CNum.DEC, CType.CSI, new COPSData(data, 0, data.length));
- // new pcmm specific clientsi
- clientSD.setData(new COPSData(data, 0, data.length));
-
- try {
- decisionMsg.add(hdr);
- decisionMsg.add(handle);
- // Decisions (no flags supplied)
- // <Context>
- COPSContext cntxt = new COPSContext(COPSContext.CONFIG, (short) 0);
- COPSDecision install = new COPSDecision();
- install.setCmdCode(COPSDecision.DEC_INSTALL);
- install.setFlags(COPSDecision.F_REQERROR);
- decisionMsg.addDecision(install, cntxt);
- decisionMsg.add(clientSD); // setting up the gate
- /*
- try {
- decisionMsg.dump(System.out);
- } catch (IOException unae) {
- System.out.println("Error dumping " + unae.getMessage());
- }
- */
-
- } catch (COPSException e) {
- logger.error("Error making Msg", e);
- }
+ final COPSDecisionMsg decisionMsg = new COPSDecisionMsg(getClientType(), _handle, decisionMap, null, clientSD);
// ** Send the GateDelete Decision
// **
* <Decision: Flags> <Decision: Flags> ::= Install Request-State
*/
- // Common Header with the same ClientType as the request (default
- // UNSOLICITED)
- COPSHeader hdr = new COPSHeader(COPSHeader.COPS_OP_DEC, getClientType());
+ final Set<COPSDecision> decisionSet = new HashSet<>();
+ decisionSet.add(new COPSDecision(Command.INSTALL, DecisionFlag.REQSTATE));
+ final Map<COPSContext, Set<COPSDecision>> decisionMap = new HashMap<>();
+ decisionMap.put(new COPSContext(RType.CONFIG, (short)0), decisionSet);
- // Client Handle with the same clientHandle as the request
- final COPSHandle clienthandle = new COPSHandle(_handle.getId());
-
- // Decisions
- // <Context>
- COPSContext cntxt = new COPSContext(COPSContext.CONFIG, (short) 0);
- // <Decision: Flags>
- COPSDecision dec = new COPSDecision();
- dec.setCmdCode(COPSDecision.DEC_INSTALL);
- dec.setFlags(COPSDecision.F_REQSTATE);
-
- COPSDecisionMsg decisionMsg = new COPSDecisionMsg();
- try {
- decisionMsg.add(hdr);
- decisionMsg.add(clienthandle);
- decisionMsg.addDecision(dec, cntxt);
- } catch (COPSException e) {
- throw new COPSPdpException("Error making Msg");
- }
+ final COPSDecisionMsg decisionMsg = new COPSDecisionMsg(getClientType(), _handle, decisionMap, null, null);
try {
decisionMsg.writeData(_sock);
} catch (IOException e) {
- throw new COPSPdpException(
- "Failed to send the open new request state, reason: "
- + e.getMessage());
+ throw new COPSPdpException("Failed to send the open new request state", e);
}
}
/*
* <Gate-Info> ::= <Common Header> [<Client Handle>] [<Integrity>]
*/
-
- // Common Header with the same ClientType as the request
- COPSHeader hdr = new COPSHeader(COPSHeader.COPS_OP_SSQ, getClientType());
-
- // Client Handle with the same clientHandle as the request
- final COPSHandle clienthandle = new COPSHandle(_handle.getId());
-
- COPSSyncStateMsg msg = new COPSSyncStateMsg();
- try {
- msg.add(hdr);
- msg.add(clienthandle);
- } catch (Exception e) {
- throw new COPSPdpException("Error making Msg");
- }
-
+ final COPSSyncStateMsg msg = new COPSSyncStateMsg(getClientType(), _handle, null);
try {
msg.writeData(_sock);
} catch (IOException e) {
- throw new COPSPdpException(
- "Failed to send the GateInfo request, reason: "
- + e.getMessage());
+ throw new COPSPdpException("Failed to send the GateInfo request", e);
}
}
* [<Integrity>]
*/
- // Common Header with the same ClientType as the request
- COPSHeader hdr = new COPSHeader(COPSHeader.COPS_OP_SSQ, getClientType());
-
// Client Handle with the same clientHandle as the request
- final COPSHandle clienthandle = new COPSHandle(_handle.getId());
-
- COPSSyncStateMsg msg = new COPSSyncStateMsg();
- try {
- msg.add(hdr);
- msg.add(clienthandle);
- } catch (Exception e) {
- throw new COPSPdpException("Error making Msg");
- }
-
+ final COPSSyncStateMsg msg = new COPSSyncStateMsg(getClientType(), _handle, null);
try {
msg.writeData(_sock);
} catch (IOException e) {
- throw new COPSPdpException(
- "Failed to send the sync state request, reason: "
- + e.getMessage());
+ throw new COPSPdpException("Failed to send the sync state request", e);
}
}
// XXX - Temp