Bump to odlparent 3.1.0 and yangtools 2.0.3
[packetcable.git] / packetcable-driver / src / main / java / org / pcmm / PCMMPdpMsgSender.java
index a13ec99f44e7fccaac0189c935cc12d96c54c9f0..aa86745462ab5276577d4e8f7465e0c546501cba 100644 (file)
@@ -1,23 +1,38 @@
-/**
- @header@
+/*
+ * Copyright (c) 2014, 2015 Cable Television Laboratories, Inc. 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.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
  *
@@ -33,31 +48,16 @@ import java.net.UnknownHostException;
 /**
  * COPS message transceiver class for provisioning connections at the PDP side.
  */
-public class PCMMPdpMsgSender {
-
-    /**
-     * Socket connected to PEP
-     */
-    protected Socket _sock;
-
-    /**
-     * COPS client-type that identifies the policy client
-     */
-    protected short _clientType;
+public class PCMMPdpMsgSender extends COPSMsgSender {
 
-    /**
-     * COPS client handle used to uniquely identify a particular PEP's request
-     * for a client-type
-     */
-    protected COPSHandle _handle;
-
-    /**
-     *
-     */
+    public final static Logger logger = LoggerFactory.getLogger(PCMMPdpMsgSender.class);
+       private static final int MAX_TRANSACTION_ID = 65_536;
+       
     protected short _transactionID;
-    protected short _classifierID;
+    protected final short _classifierID;
+
     // XXX - this does not need to be here
-    protected int _gateID;
+    protected IGateID _gateID;
 
     /**
      * Creates a PCMMPdpMsgSender
@@ -69,534 +69,83 @@ public class 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 ? generateNewTransactionID() : 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 = (short) (_transactionID == 0 ? (short) (Math.random() * hashCode())
-                                  : _transactionID);
-        trID.setTransactionIdentifier(_transactionID);
-
+       // generate a new TransactionID
+       _transactionID = generateNewTransactionID();
+        final ITransactionID trID = new TransactionID(_transactionID, GateCommandType.GATE_SET);
+       
         gate.setTransactionID(trID);
-
+        // retain the transactitrIDnumonId 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 - " + (int) (trIDnum & 0xffff));
+        PCMMGlobalConfig.transactionGateMap.put(trIDnum, gate);
 
         // new pcmm specific clientsi
-        COPSClientSI clientSD = new COPSClientSI(COPSObjHeader.COPS_DEC, (byte) 4);
-        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) {
-            System.out.println("Error making Msg" + e.getMessage());
-        }
-
-        // ** Send the GateSet Decision
-        // **
-        try {
-            decisionMsg.writeData(_sock);
-        } catch (IOException e) {
-            System.out.println("Failed to send the decision, reason: "
-                               + e.getMessage());
-        }
-
-    }
-
-    /**
-     * 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();
-        int TrafficRate = 0;
-
-        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(COPSObjHeader.COPS_DEC, (byte) 4);
-
-        final COPSHandle handle = new COPSHandle(getClientHandle().getId());
 
-        // set transaction ID to gate set
-        trID.setGateCommandType(ITransactionID.GateSet);
-        _transactionID = (short) (_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) {
-                System.out.println("Error getByName" + unae.getMessage());
-            }
-            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) {
-                System.out.println("Error getByName" + unae.getMessage());
-            }
-            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);
+        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);
 
-        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) {
-            System.out.println("Error making Msg" + e.getMessage());
-        }
+        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) {
-            System.out.println("Failed to send the decision, reason: "
-                               + e.getMessage());
+            logger.error("Failed to send the decision", 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(COPSObjHeader.COPS_DEC,
-                (byte) 4);
-
-        // 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 = (short) (_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) {
-                System.out.println("Error getByName" + unae.getMessage());
-            }
-            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) {
-                System.out.println("Error getByName" + unae.getMessage());
-            }
-            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) {
-            System.out.println("Error making Msg" + e.getMessage());
-        }
-
-        // ** Send the GateSet Decision
-        // **
-        try {
-            decisionMsg.writeData(_sock);
-        } catch (IOException e) {
-            System.out.println("Failed to send the decision, reason: "
-                               + e.getMessage());
-        }
-
-    }
-
-
-    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()) {
-                System.out.println("processing received report from CMTS");
-                COPSReportMsg reportMsg = (COPSReportMsg) responseMsg;
-                if (reportMsg.getClientSI().size() == 0) {
+            final COPSMsg responseMsg = COPSTransceiver.receiveMsg(socket);
+            if (responseMsg.getHeader().getOpCode().equals(OPCode.RPT)) {
+                logger.info("processing received report from CMTS");
+                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) {
-                    System.out.println("the CMTS has sent a Gate-Set-Ack response");
+                        && 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;
@@ -604,215 +153,44 @@ public class PCMMPdpMsgSender {
             }
             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(COPSObjHeader.COPS_DEC,
-                (byte) 4);
-
-        // 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 = (short) (_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) {
-            System.out.println("Error getByName" + unae.getMessage());
-        }
-        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) {
-            System.out.println("Error making Msg" + e.getMessage());
-        }
-
-        // ** Send the GateSet Decision
-        // **
-        try {
-            decisionMsg.writeData(_sock);
-        } catch (IOException e) {
-            System.out.println("Failed to send the decision, reason: "
-                               + e.getMessage());
-        }
-
-    }
-
     /**
      * 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();
-        IGateSpec gateSpec = new GateSpec();
-        IGateID gateID = new GateID();
-
-        // new pcmm specific clientsi
-        COPSClientSI clientSD = new COPSClientSI(COPSObjHeader.COPS_DEC, (byte) 4);
-
-        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 = (short) (_transactionID == 0 ? (short) (Math.random() * hashCode())
-                                  : _transactionID);
-        trID.setTransactionIdentifier(_transactionID);
-
-        amid.setApplicationType((short) 1);
-        amid.setApplicationMgrTag((short) 1);
-        gateID.setGateID(gID);
-
-        try {
-            InetAddress subIP = InetAddress.getByName(PCMMGlobalConfig.SubscriberID);
-            subscriberID.setSourceIPAddress(subIP);
-        } catch (UnknownHostException unae) {
-            System.out.println("Error getByName" + unae.getMessage());
-        }
-
-        gate.setTransactionID(trID);
-        gate.setAMID(amid);
-        gate.setSubscriberID(subscriberID);
-        gate.setGateID(gateID);
+        // generate a new TransactionID
+       short _transactionID = generateNewTransactionID();
+        final ITransactionID trID = new TransactionID(_transactionID, GateCommandType.GATE_DELETE);
+        
+       gate.setTransactionID(trID);
+
+        Short trIDnum = trID.getTransactionIdentifier();
+        PCMMGlobalConfig.transactionGateMap.put(trIDnum, gate);
+
+        // 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) {
-            System.out.println("Error making Msg" + e.getMessage());
-        }
+        final COPSDecisionMsg decisionMsg = new COPSDecisionMsg(getClientType(), _handle, decisionMap, null, clientSD);
 
         // ** Send the GateDelete Decision
         // **
@@ -820,8 +198,7 @@ public class PCMMPdpMsgSender {
             decisionMsg.writeData(_sock);
             // decisionMsg.writeData(socket_id);
         } catch (IOException e) {
-            System.out.println("Failed to send the decision, reason: "
-                               + e.getMessage());
+            logger.error("Failed to send the decision", e);
         }
     }
 
@@ -837,36 +214,17 @@ public class PCMMPdpMsgSender {
          * <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());
-
-        // 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);
+        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);
 
-        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);
         }
     }
 
@@ -875,31 +233,49 @@ public class PCMMPdpMsgSender {
      *
      * @throws COPSPdpException
      */
-    public void sendGateInfo() throws COPSPdpException {
+    public void sendGateInfo(final IPCMMGate gate) throws COPSPdpException {
         /*
          * <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");
-        }
-
+       
+       // added
+        // generate a new TransactionID
+       short _transactionID = generateNewTransactionID();
+       final ITransactionID trID = new TransactionID(_transactionID, GateCommandType.GATE_INFO);
+        
+        
+        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 - " + (int) (trIDnum & 0xffff));
+        PCMMGlobalConfig.transactionGateMap.put(trIDnum, gate);
+        
+        // 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
+        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));
+       
+        //final COPSSyncStateMsg msg = new COPSSyncStateMsg(getClientType(), _handle, null);
+        final COPSDecisionMsg decisionMsg = new COPSDecisionMsg(getClientType(), _handle, decisionMap, null, clientSD);
+        
         try {
-            msg.writeData(_sock);
+            //msg.writeData(_sock);
+            decisionMsg.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);
         }
     }
 
@@ -914,26 +290,12 @@ public class PCMMPdpMsgSender {
          * [<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
@@ -942,4 +304,7 @@ public class PCMMPdpMsgSender {
     // XXX - Temp
     public void sendDeleteRequestState() throws COPSPdpException {
     }
+       private static short generateNewTransactionID() {
+           return (short) (Math.random() * MAX_TRANSACTION_ID);
+       }
 }