The second patch of an estimated 4 to complete the COPS message refactoring as descri...
[packetcable.git] / packetcable-driver / src / main / java / org / umu / cops / ospdp / COPSPdpOSAgent.java
index d701d8fd9a720cc59ab84ab8ccfe7add976a17e4..7069c93f2c171d593627fc0f5f8dad6ebf482523 100644 (file)
-package org.umu.cops.ospdp;\r
-\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-import org.umu.cops.stack.*;\r
-\r
-import java.io.IOException;\r
-import java.net.ServerSocket;\r
-import java.net.Socket;\r
-import java.util.Map;\r
-import java.util.concurrent.ConcurrentHashMap;\r
-\r
-/**\r
- * Core PDP agent for outsourcing.\r
- */\r
-public class COPSPdpOSAgent extends Thread {\r
-\r
-    public final static Logger logger = LoggerFactory.getLogger(COPSPdpOSAgent.class);\r
-\r
-    /** Well-known port for COPS */\r
-    public static final int WELL_KNOWN_PDP_PORT = 3288;\r
-    /** Default keep-alive timer value (secs) */\r
-    public static final short KA_TIMER_VALUE = 30;\r
-    /** Default accounting timer value (secs) */\r
-    public static final short ACCT_TIMER_VALUE = 0;\r
-\r
-    /**\r
-        PDP host port\r
-     */\r
-    private int _serverPort;\r
-\r
-    /**\r
-        Client-type of connecting PEP\r
-     */\r
-    private short _clientType;\r
-\r
-    /**\r
-        Accounting timer (secs)\r
-     */\r
-    private short _acctTimer;\r
-\r
-    /**\r
-        Keep-alive timer (secs)\r
-     */\r
-    private short _kaTimer;\r
-\r
-    /**\r
-        Maps a PEP-ID to a connection\r
-     */\r
-    private final Map<String, COPSPdpOSConnection> _connectionMap;\r
-    // map < String(PEPID), COPSPdpOSConnection > ConnectionMap;\r
-\r
-    /**\r
-     *  Policy data processing object\r
-     */\r
-    private COPSPdpOSDataProcess _process;\r
-\r
-    /**\r
-     * Creates a PDP Agent\r
-     *\r
-     * @param clientType    COPS Client-type\r
-     * @param process       Object to perform policy data processing\r
-     */\r
-    public COPSPdpOSAgent(short clientType, COPSPdpOSDataProcess process) {\r
-        _serverPort = WELL_KNOWN_PDP_PORT;\r
-        _kaTimer = KA_TIMER_VALUE;\r
-        _acctTimer = ACCT_TIMER_VALUE;\r
-\r
-        _clientType = clientType;\r
-        _connectionMap = new ConcurrentHashMap<>();\r
-        _process = process;\r
-    }\r
-\r
-    /**\r
-     * Creates a PDP Agent\r
-     *\r
-     * @param port  Port to listen to\r
-     * @param clientType    COPS Client-type\r
-     * @param process   Object to perform policy data processing\r
-     */\r
-    public COPSPdpOSAgent(int port, short clientType, COPSPdpOSDataProcess process) {\r
-        _serverPort = port;\r
-\r
-        _kaTimer = KA_TIMER_VALUE;\r
-        _acctTimer = ACCT_TIMER_VALUE;\r
-\r
-        _clientType = clientType;\r
-        _connectionMap = new ConcurrentHashMap<>();\r
-        _process = process;\r
-    }\r
-\r
-    /**\r
-     * Sets the keep-alive timer value\r
-     * @param    kaTimer    Keep alive timer value (secs)\r
-     */\r
-    public void setKaTimer (short kaTimer) {\r
-        _kaTimer = kaTimer;\r
-    }\r
-\r
-    /**\r
-     * Sets the accounting timer value\r
-     * @param    acctTimer  Accounting timer value (secs)\r
-     */\r
-    public void setAcctTimer (short acctTimer) {\r
-        _acctTimer = acctTimer;\r
-    }\r
-\r
-    /**\r
-     * Gets the value of the keep-alive timer\r
-     * @return   Keep-alive timer value (secs)\r
-     */\r
-    public short getKaTimer () {\r
-        return _kaTimer;\r
-    }\r
-\r
-    /**\r
-     * Gets the accounting timer value\r
-     * @return   Accounting timer value (secs)\r
-     */\r
-    public short getAcctTimer () {\r
-        return _acctTimer;\r
-    }\r
-\r
-    /**\r
-     * Gets the client-type\r
-     * @return   The client-type\r
-     */\r
-    public short getClientType() {\r
-        return _clientType;\r
-    }\r
-\r
-    /**\r
-     * Disconnects a PEP\r
-     * @param pepID PEP-ID of the PEP to be disconnected\r
-     * @param error COPS Error to be reported as a reason\r
-     * @throws COPSException\r
-     * @throws IOException\r
-     */\r
-    public void disconnect (String pepID, COPSError error) throws COPSException, IOException {\r
-        COPSPdpOSConnection pdpConn = _connectionMap.get(pepID);\r
-\r
-        COPSHeader cHdr = new COPSHeader(COPSHeader.COPS_OP_CC, _clientType);\r
-        COPSClientCloseMsg closeMsg = new COPSClientCloseMsg();\r
-        closeMsg.add(cHdr);\r
-        if (error != null)\r
-            closeMsg.add(error);\r
-\r
-        closeMsg.writeData(pdpConn.getSocket());\r
-        pdpConn.close();\r
-    }\r
-\r
-    /**\r
-     * Requests a COPS sync for a PEP\r
-     * @param pepID PEP-ID of the PEP to be synced\r
-     * @throws COPSException\r
-     * @throws COPSPdpException\r
-     */\r
-    public void sync(String pepID) throws COPSException, COPSPdpException {\r
-        COPSPdpOSConnection pdpConn = _connectionMap.get(pepID);\r
-        pdpConn.syncAllRequestState();\r
-    }\r
-\r
-    /**\r
-     * Removes a PEP from the connection map\r
-     * @param pepID PEP-ID of the PEP to be removed\r
-     */\r
-    public void delete (String pepID) {\r
-        _connectionMap.remove(pepID);\r
-    }\r
-\r
-    /**\r
-     * Runs the PDP process\r
-     */\r
-    public void run() {\r
-        try {\r
-            final ServerSocket serverSocket = new ServerSocket (_serverPort);\r
-\r
-            //Loop through for Incoming messages\r
-\r
-            // server infinite loop\r
-            while (true) {\r
-                // Wait for an incoming connection from a PEP\r
-                Socket socket = serverSocket.accept();\r
-\r
-                // COPSDebug.out(getClass().getName(),"New connection accepted " +\r
-                //           socket.getInetAddress() +\r
-                //           ":" + socket.getPort());\r
-\r
-                // We're waiting for an OPN message\r
-                try {\r
-                    COPSMsg msg = COPSTransceiver.receiveMsg(socket);\r
-                    if (msg.getHeader().isAClientOpen()) {\r
-                        handleClientOpenMsg(socket, msg);\r
-                    } else {\r
-                        // COPSDebug.err(getClass().getName(), COPSDebug.ERROR_NOEXPECTEDMSG);\r
-                        try {\r
-                            socket.close();\r
-                        } catch (Exception ex) {\r
-                            logger.error("Error closing socket", ex);\r
-                        }\r
-                    }\r
-                } catch (Exception e) { // COPSException, IOException\r
-                    // COPSDebug.err(getClass().getName(), COPSDebug.ERROR_EXCEPTION,\r
-                    //    "(" + socket.getInetAddress() + ":" + socket.getPort() + ")", e);\r
-                    try {\r
-                        socket.close();\r
-                    } catch (Exception ex) {\r
-                        logger.error("Error closing socket", ex);\r
-                    }\r
-                }\r
-            }\r
-        } catch (IOException e) {\r
-            logger.error("Error processing socket messages", e);\r
-        }\r
-    }\r
-\r
-    /**\r
-      * Handles a COPS client-open message\r
-      * @param    conn Socket to the PEP\r
-      * @param    msg <tt>COPSMsg</tt> holding the client-open message\r
-      * @throws COPSException\r
-      * @throws IOException\r
-      */\r
-    private void handleClientOpenMsg(Socket conn, COPSMsg msg) throws COPSException, IOException {\r
-        COPSClientOpenMsg cMsg = (COPSClientOpenMsg) msg;\r
-        COPSPepId pepId = cMsg.getPepId();\r
-\r
-        // Validate Client Type\r
-        if (msg.getHeader().getClientType() != _clientType) {\r
-            // Unsupported client type\r
-            COPSHeader cHdr = new COPSHeader(COPSHeader.COPS_OP_CC, msg.getHeader().getClientType());\r
-            COPSError err = new COPSError(COPSError.COPS_ERR_UNSUPPORTED_CLIENT_TYPE, (short) 0);\r
-            COPSClientCloseMsg closeMsg = new COPSClientCloseMsg();\r
-            closeMsg.add(cHdr);\r
-            closeMsg.add(err);\r
-            try {\r
-                closeMsg.writeData(conn);\r
-            } catch (IOException unae) {\r
-                logger.error("Error writing data", unae);\r
-            }\r
-\r
-            throw new COPSException("Unsupported client type");\r
-        }\r
-\r
-        // PEPId is mandatory\r
-        if (pepId == null) {\r
-            // Mandatory COPS object missing\r
-            COPSHeader cHdr = new COPSHeader(COPSHeader.COPS_OP_CC, msg.getHeader().getClientType());\r
-            COPSError err = new COPSError(COPSError.COPS_ERR_MANDATORY_OBJECT_MISSING, (short) 0);\r
-            COPSClientCloseMsg closeMsg = new COPSClientCloseMsg();\r
-            closeMsg.add(cHdr);\r
-            closeMsg.add(err);\r
-            try {\r
-                closeMsg.writeData(conn);\r
-            } catch (IOException unae) {\r
-                logger.error("Error writing data", unae);\r
-            }\r
-\r
-            throw new COPSException("Mandatory COPS object missing (PEPId)");\r
-        }\r
-\r
-        // Support\r
-        if ( (cMsg.getClientSI() != null) ||\r
-                (cMsg.getPdpAddress() != null) ||\r
-                (cMsg.getIntegrity() != null)) {\r
-\r
-            // Unsupported objects\r
-            COPSHeader cHdr = new COPSHeader(COPSHeader.COPS_OP_CC, msg.getHeader().getClientType());\r
-            COPSError err = new COPSError(COPSError.COPS_ERR_UNKNOWN_OBJECT, (short) 0);\r
-            COPSClientCloseMsg closeMsg = new COPSClientCloseMsg();\r
-            closeMsg.add(cHdr);\r
-            closeMsg.add(err);\r
-            try {\r
-                closeMsg.writeData(conn);\r
-            } catch (IOException unae) {\r
-                logger.error("Error writing data", unae);\r
-            }\r
-\r
-            throw new COPSException("Unsupported objects (ClientSI, PdpAddress, Integrity)");\r
-        }\r
-\r
-        // Connection accepted\r
-        COPSHeader ahdr = new COPSHeader(COPSHeader.COPS_OP_CAT, msg.getHeader().getClientType());\r
-        COPSKATimer katimer = new COPSKATimer(_kaTimer);\r
-        COPSAcctTimer acctTimer = new COPSAcctTimer(_acctTimer);\r
-        COPSClientAcceptMsg acceptMsg = new COPSClientAcceptMsg();\r
-        acceptMsg.add(ahdr);\r
-        acceptMsg.add(katimer) ;\r
-        if (_acctTimer != 0) acceptMsg.add(acctTimer);\r
-        acceptMsg.writeData(conn);\r
-\r
-        COPSPdpOSConnection pdpConn = new COPSPdpOSConnection(pepId, conn, _process);\r
-        pdpConn.setKaTimer(_kaTimer);\r
-        if (_acctTimer != 0) pdpConn.setAccTimer(_acctTimer);\r
-        new Thread(pdpConn).start();\r
-        _connectionMap.put(pepId.getData().str(),pdpConn);\r
-    }\r
-}\r
+package org.umu.cops.ospdp;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.umu.cops.stack.*;
+import org.umu.cops.stack.COPSError.ErrorTypes;
+
+import java.io.IOException;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Core PDP agent for outsourcing.
+ */
+public class COPSPdpOSAgent extends Thread {
+
+    public final static Logger logger = LoggerFactory.getLogger(COPSPdpOSAgent.class);
+
+    /** Well-known port for COPS */
+    public static final int WELL_KNOWN_PDP_PORT = 3288;
+    /** Default keep-alive timer value (secs) */
+    public static final short KA_TIMER_VALUE = 30;
+    /** Default accounting timer value (secs) */
+    public static final short ACCT_TIMER_VALUE = 0;
+
+    /**
+        PDP host port
+     */
+    private int _serverPort;
+
+    /**
+        Client-type of connecting PEP
+     */
+    private short _clientType;
+
+    /**
+        Accounting timer (secs)
+     */
+    private short _acctTimer;
+
+    /**
+        Keep-alive timer (secs)
+     */
+    private short _kaTimer;
+
+    /**
+        Maps a PEP-ID to a connection
+     */
+    private final Map<String, COPSPdpOSConnection> _connectionMap;
+    // map < String(PEPID), COPSPdpOSConnection > ConnectionMap;
+
+    /**
+     *  Policy data processing object
+     */
+    private COPSPdpOSDataProcess _process;
+
+    /**
+     * Creates a PDP Agent
+     *
+     * @param clientType    COPS Client-type
+     * @param process       Object to perform policy data processing
+     */
+    public COPSPdpOSAgent(short clientType, COPSPdpOSDataProcess process) {
+        _serverPort = WELL_KNOWN_PDP_PORT;
+        _kaTimer = KA_TIMER_VALUE;
+        _acctTimer = ACCT_TIMER_VALUE;
+
+        _clientType = clientType;
+        _connectionMap = new ConcurrentHashMap<>();
+        _process = process;
+    }
+
+    /**
+     * Creates a PDP Agent
+     *
+     * @param port  Port to listen to
+     * @param clientType    COPS Client-type
+     * @param process   Object to perform policy data processing
+     */
+    public COPSPdpOSAgent(int port, short clientType, COPSPdpOSDataProcess process) {
+        _serverPort = port;
+
+        _kaTimer = KA_TIMER_VALUE;
+        _acctTimer = ACCT_TIMER_VALUE;
+
+        _clientType = clientType;
+        _connectionMap = new ConcurrentHashMap<>();
+        _process = process;
+    }
+
+    /**
+     * Sets the keep-alive timer value
+     * @param    kaTimer    Keep alive timer value (secs)
+     */
+    public void setKaTimer (short kaTimer) {
+        _kaTimer = kaTimer;
+    }
+
+    /**
+     * Sets the accounting timer value
+     * @param    acctTimer  Accounting timer value (secs)
+     */
+    public void setAcctTimer (short acctTimer) {
+        _acctTimer = acctTimer;
+    }
+
+    /**
+     * Gets the value of the keep-alive timer
+     * @return   Keep-alive timer value (secs)
+     */
+    public short getKaTimer () {
+        return _kaTimer;
+    }
+
+    /**
+     * Gets the accounting timer value
+     * @return   Accounting timer value (secs)
+     */
+    public short getAcctTimer () {
+        return _acctTimer;
+    }
+
+    /**
+     * Gets the client-type
+     * @return   The client-type
+     */
+    public short getClientType() {
+        return _clientType;
+    }
+
+    /**
+     * Disconnects a PEP
+     * @param pepID PEP-ID of the PEP to be disconnected
+     * @param error COPS Error to be reported as a reason
+     * @throws COPSException
+     * @throws IOException
+     */
+    public void disconnect (String pepID, COPSError error) throws COPSException, IOException {
+        COPSPdpOSConnection pdpConn = _connectionMap.get(pepID);
+
+        COPSHeader cHdr = new COPSHeader(COPSHeader.COPS_OP_CC, _clientType);
+        COPSClientCloseMsg closeMsg = new COPSClientCloseMsg();
+        closeMsg.add(cHdr);
+        if (error != null)
+            closeMsg.add(error);
+
+        closeMsg.writeData(pdpConn.getSocket());
+        pdpConn.close();
+    }
+
+    /**
+     * Requests a COPS sync for a PEP
+     * @param pepID PEP-ID of the PEP to be synced
+     * @throws COPSException
+     * @throws COPSPdpException
+     */
+    public void sync(String pepID) throws COPSException, COPSPdpException {
+        COPSPdpOSConnection pdpConn = _connectionMap.get(pepID);
+        pdpConn.syncAllRequestState();
+    }
+
+    /**
+     * Removes a PEP from the connection map
+     * @param pepID PEP-ID of the PEP to be removed
+     */
+    public void delete (String pepID) {
+        _connectionMap.remove(pepID);
+    }
+
+    /**
+     * Runs the PDP process
+     */
+    public void run() {
+        try {
+            final ServerSocket serverSocket = new ServerSocket (_serverPort);
+
+            //Loop through for Incoming messages
+
+            // server infinite loop
+            while (true) {
+                // Wait for an incoming connection from a PEP
+                Socket socket = serverSocket.accept();
+
+                // COPSDebug.out(getClass().getName(),"New connection accepted " +
+                //           socket.getInetAddress() +
+                //           ":" + socket.getPort());
+
+                // We're waiting for an OPN message
+                try {
+                    COPSMsg msg = COPSTransceiver.receiveMsg(socket);
+                    if (msg.getHeader().isAClientOpen()) {
+                        handleClientOpenMsg(socket, msg);
+                    } else {
+                        // COPSDebug.err(getClass().getName(), COPSDebug.ERROR_NOEXPECTEDMSG);
+                        try {
+                            socket.close();
+                        } catch (Exception ex) {
+                            logger.error("Error closing socket", ex);
+                        }
+                    }
+                } catch (Exception e) { // COPSException, IOException
+                    // COPSDebug.err(getClass().getName(), COPSDebug.ERROR_EXCEPTION,
+                    //    "(" + socket.getInetAddress() + ":" + socket.getPort() + ")", e);
+                    try {
+                        socket.close();
+                    } catch (Exception ex) {
+                        logger.error("Error closing socket", ex);
+                    }
+                }
+            }
+        } catch (IOException e) {
+            logger.error("Error processing socket messages", e);
+        }
+    }
+
+    /**
+      * Handles a COPS client-open message
+      * @param    conn Socket to the PEP
+      * @param    msg <tt>COPSMsg</tt> holding the client-open message
+      * @throws COPSException
+      * @throws IOException
+      */
+    private void handleClientOpenMsg(Socket conn, COPSMsg msg) throws COPSException, IOException {
+        COPSClientOpenMsg cMsg = (COPSClientOpenMsg) msg;
+        COPSPepId pepId = cMsg.getPepId();
+
+        // Validate Client Type
+        if (msg.getHeader().getClientType() != _clientType) {
+            // Unsupported client type
+            COPSHeader cHdr = new COPSHeader(COPSHeader.COPS_OP_CC, msg.getHeader().getClientType());
+            COPSError err = new COPSError(ErrorTypes.UNSUPPORTED_CLIENT_TYPE, ErrorTypes.NA);
+            COPSClientCloseMsg closeMsg = new COPSClientCloseMsg();
+            closeMsg.add(cHdr);
+            closeMsg.add(err);
+            try {
+                closeMsg.writeData(conn);
+            } catch (IOException unae) {
+                logger.error("Error writing data", unae);
+            }
+
+            throw new COPSException("Unsupported client type");
+        }
+
+        // PEPId is mandatory
+        if (pepId == null) {
+            // Mandatory COPS object missing
+            COPSHeader cHdr = new COPSHeader(COPSHeader.COPS_OP_CC, msg.getHeader().getClientType());
+            COPSError err = new COPSError(ErrorTypes.MANDATORY_OBJECT_MISSING, ErrorTypes.NA);
+            COPSClientCloseMsg closeMsg = new COPSClientCloseMsg();
+            closeMsg.add(cHdr);
+            closeMsg.add(err);
+            try {
+                closeMsg.writeData(conn);
+            } catch (IOException unae) {
+                logger.error("Error writing data", unae);
+            }
+
+            throw new COPSException("Mandatory COPS object missing (PEPId)");
+        }
+
+        // Support
+        if ( (cMsg.getClientSI() != null) ||
+                (cMsg.getPdpAddress() != null) ||
+                (cMsg.getIntegrity() != null)) {
+
+            // Unsupported objects
+            COPSHeader cHdr = new COPSHeader(COPSHeader.COPS_OP_CC, msg.getHeader().getClientType());
+            COPSError err = new COPSError(ErrorTypes.UNKNOWN_OBJECT, ErrorTypes.NA);
+            COPSClientCloseMsg closeMsg = new COPSClientCloseMsg();
+            closeMsg.add(cHdr);
+            closeMsg.add(err);
+            try {
+                closeMsg.writeData(conn);
+            } catch (IOException unae) {
+                logger.error("Error writing data", unae);
+            }
+
+            throw new COPSException("Unsupported objects (ClientSI, PdpAddress, Integrity)");
+        }
+
+        // Connection accepted
+        COPSHeader ahdr = new COPSHeader(COPSHeader.COPS_OP_CAT, msg.getHeader().getClientType());
+        COPSKATimer katimer = new COPSKATimer(_kaTimer);
+        COPSAcctTimer acctTimer = new COPSAcctTimer(_acctTimer);
+        COPSClientAcceptMsg acceptMsg = new COPSClientAcceptMsg();
+        acceptMsg.add(ahdr);
+        acceptMsg.add(katimer) ;
+        if (_acctTimer != 0) acceptMsg.add(acctTimer);
+        acceptMsg.writeData(conn);
+
+        COPSPdpOSConnection pdpConn = new COPSPdpOSConnection(pepId, conn, _process);
+        pdpConn.setKaTimer(_kaTimer);
+        if (_acctTimer != 0) pdpConn.setAccTimer(_acctTimer);
+        new Thread(pdpConn).start();
+        _connectionMap.put(pepId.getData().str(),pdpConn);
+    }
+}