X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=packetcable-driver%2Fsrc%2Fmain%2Fjava%2Forg%2Fpcmm%2FPCMMPdpAgent.java;h=1cbe6d244a8a39e6f9488075087bc2a08a635126;hb=586d0e05ba562aca40498c40bba719398c2eec2f;hp=3044b1b2e52f440d6c8878888a457a8353b2754e;hpb=4c5ee34cb796bae9e07053508dd0dbaf801fd1b4;p=packetcable.git diff --git a/packetcable-driver/src/main/java/org/pcmm/PCMMPdpAgent.java b/packetcable-driver/src/main/java/org/pcmm/PCMMPdpAgent.java index 3044b1b..1cbe6d2 100644 --- a/packetcable-driver/src/main/java/org/pcmm/PCMMPdpAgent.java +++ b/packetcable-driver/src/main/java/org/pcmm/PCMMPdpAgent.java @@ -4,401 +4,60 @@ package org.pcmm; -import org.pcmm.objects.MMVersionInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.umu.cops.common.COPSDebug; -import org.umu.cops.ospep.COPSPepException; import org.umu.cops.prpdp.COPSPdpAgent; +import org.umu.cops.prpdp.COPSPdpConnection; import org.umu.cops.prpdp.COPSPdpException; -import org.umu.cops.stack.*; +import org.umu.cops.stack.COPSHandle; -import java.io.IOException; -import java.net.InetAddress; import java.net.Socket; -import java.net.UnknownHostException; - -// import org.umu.cops.prpdp.COPSPdpDataProcess; - /** * Core PDP agent for provisioning */ public class PCMMPdpAgent extends COPSPdpAgent { - public final static Logger logger = LoggerFactory.getLogger(PCMMPdpAgent.class); + private static final Logger logger = LoggerFactory.getLogger(PCMMPdpAgent.class); /** Well-known port for PCMM */ public static final int WELL_KNOWN_PDP_PORT = 3918; - private COPSPepId _pepId; - private String _pepIdString; - /** - * PEP host name - */ - private String psHost; - - /** - * PEP port - */ - private int psPort; - - private Socket socket; - /** * Policy data processing object */ - private PCMMPdpDataProcess _process; - private MMVersionInfo _mminfo; - private COPSHandle _handle; - private short _transactionID; + private final PCMMPdpDataProcess _thisProcess; /** * Creates a PDP Agent * - * @param clientType - * COPS Client-type - * @param process - * Object to perform policy data processing - */ - public PCMMPdpAgent(short clientType, PCMMPdpDataProcess process) { - this(clientType, null, WELL_KNOWN_PDP_PORT, process); - } - - /** - * Creates a PDP Agent - * - * @param clientType - * COPS Client-type - * @param psHost - * Host to connect to - * @param psPort - * Port to connect to - * @param process - * Object to perform policy data processing - */ - public PCMMPdpAgent(short clientType, String psHost, int psPort, PCMMPdpDataProcess process) { - super(psPort, clientType, null); - this._process = process; - this.psHost = psHost; - } - - /** - * XXX -tek- This is the retooled connect. Not sure if the while forever - * loop is needed. Socket accept --> handleClientOpenMsg --> pdpConn.run() - * - * Below is new Thread(pdpConn).start(); Does that do it? - * - */ - /** - * Connects to a PDP - * - * @param psHost - * CMTS host name - * @param psPort - * CMTS port - * @return true if PDP accepts the connection; false - * otherwise - * @throws java.net.UnknownHostException - * @throws java.io.IOException - * @throws COPSException - * @throws COPSPepException - */ - public boolean connect(String psHost, int psPort) - throws UnknownHostException, IOException, COPSException, - COPSPdpException { - - this.psHost = psHost; - this.psPort = psPort; - // Create Socket and send OPN - InetAddress addr = InetAddress.getByName(psHost); - try { - socket = new Socket(addr, psPort); - } catch (IOException e) { - COPSDebug.err(getClass().getName(), COPSDebug.ERROR_SOCKET, e); - return (false); - } - COPSDebug.err(getClass().getName(), "PDP Socket Opened"); - // Loop through for Incoming messages - - // server infinite loop - // while(true) - { - - // We're waiting for an message - try { - COPSDebug.err(getClass().getName(), - "PDP COPSTransceiver.receiveMsg "); - COPSMsg msg = COPSTransceiver.receiveMsg(socket); - if (msg.getHeader().isAClientOpen()) { - COPSDebug.err(getClass().getName(), - "PDP msg.getHeader().isAClientOpen"); - handleClientOpenMsg(socket, msg); - } else { - // COPSDebug.err(getClass().getName(), - // COPSDebug.ERROR_NOEXPECTEDMSG); - try { - socket.close(); - } catch (Exception ex) { - } - ; - } - } catch (Exception e) { // COPSException, IOException - // COPSDebug.err(getClass().getName(), - // COPSDebug.ERROR_EXCEPTION, - // "(" + socket.getInetAddress() + ":" + socket.getPort() + ")", - // e); - try { - socket.close(); - } catch (Exception ex) { - } - ; - return true; - } - } - return false; - } - - /** - * Handles a COPS client-open message - * - * @param conn - * Socket to the PEP - * @param msg - * COPSMsg 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() != getClientType()) { - // Unsupported client type - COPSHeader cHdr = new COPSHeader(COPSHeader.COPS_OP_CC, msg - .getHeader().getClientType()); - COPSError err = new COPSError( - COPSError.COPS_ERR_UNSUPPORTED_CLIENT_TYPE, (short) 0); - COPSClientCloseMsg closeMsg = new COPSClientCloseMsg(); - closeMsg.add(cHdr); - closeMsg.add(err); - try { - closeMsg.writeData(conn); - } catch (IOException 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( - COPSError.COPS_ERR_MANDATORY_OBJECT_MISSING, (short) 0); - COPSClientCloseMsg closeMsg = new COPSClientCloseMsg(); - closeMsg.add(cHdr); - closeMsg.add(err); - try { - closeMsg.writeData(conn); - } catch (IOException unae) { - } - - throw new COPSException("Mandatory COPS object missing (PEPId)"); - } - setPepId(pepId); - // Support - if ((cMsg.getClientSI() != null) ) { - _mminfo = new MMVersionInfo(cMsg - .getClientSI().getData().getData()); - logger.info("CMTS sent MMVersion info : major:" - + _mminfo.getMajorVersionNB() + " minor:" - + _mminfo.getMinorVersionNB()); - - } else { - // Unsupported objects - COPSHeader cHdr = new COPSHeader(COPSHeader.COPS_OP_CC, msg - .getHeader().getClientType()); - COPSError err = new COPSError(COPSError.COPS_ERR_UNKNOWN_OBJECT, - (short) 0); - COPSClientCloseMsg closeMsg = new COPSClientCloseMsg(); - closeMsg.add(cHdr); - closeMsg.add(err); - try { - closeMsg.writeData(conn); - } catch (IOException unae) { - } - - throw new COPSException("Unsupported objects (PdpAddress, Integrity)"); - } - /* - */ - - // Connection accepted - COPSHeader ahdr = new COPSHeader(COPSHeader.COPS_OP_CAT, msg - .getHeader().getClientType()); - COPSKATimer katimer = new COPSKATimer(getKaTimer()); - COPSAcctTimer acctTimer = new COPSAcctTimer(getAcctTimer()); - COPSClientAcceptMsg acceptMsg = new COPSClientAcceptMsg(); - acceptMsg.add(ahdr); - acceptMsg.add(katimer); - if (getAcctTimer() != 0) - acceptMsg.add(acctTimer); - acceptMsg.writeData(conn); - // XXX - handleRequestMsg - try { - COPSDebug.err(getClass().getName(), "PDP COPSTransceiver.receiveMsg "); - COPSMsg rmsg = COPSTransceiver.receiveMsg(socket); - // Client-Close - if (rmsg.getHeader().isAClientClose()) { - logger.info("Client close description - " + ((COPSClientCloseMsg) rmsg).getError().getDescription()); - // close the socket - COPSHeader cHdr = new COPSHeader(COPSHeader.COPS_OP_CC, msg - .getHeader().getClientType()); - COPSError err = new COPSError(COPSError.COPS_ERR_UNKNOWN_OBJECT, - (short) 0); - COPSClientCloseMsg closeMsg = new COPSClientCloseMsg(); - closeMsg.add(cHdr); - closeMsg.add(err); - try { - closeMsg.writeData(conn); - } catch (IOException unae) { - } - throw new COPSException("CMTS requetsed Client-Close"); - } else { - // Request - if (rmsg.getHeader().isARequest()) { - COPSReqMsg rMsg = (COPSReqMsg) rmsg; - _handle = rMsg.getClientHandle(); - } else - throw new COPSException("Can't understand request"); - - } - } catch (Exception e) { // COPSException, IOException - throw new COPSException("Error COPSTransceiver.receiveMsg"); - } - - COPSDebug.err(getClass().getName(), "PDPCOPSConnection"); - PCMMPdpConnection pdpConn = new PCMMPdpConnection(pepId, conn, _process); - pdpConn.setKaTimer(getKaTimer()); - if (getAcctTimer() != 0) - pdpConn.setAccTimer(getAcctTimer()); - - // XXX - handleRequestMsg - // XXX - check handle is valid - PCMMPdpReqStateMan man = new PCMMPdpReqStateMan(getClientType(), _handle.getId().str()); - pdpConn.getReqStateMans().put(_handle.getId().str(),man); - man.setDataProcess(_process); + * @param clientType - COPS Client-type + * @param psHost - Host to connect to + * @param psPort - Port to connect to + * @param process - Object to perform policy data processing + */ + public PCMMPdpAgent(final String psHost, final int psPort, final short clientType, + final PCMMPdpDataProcess process) { + super(psHost, psPort, clientType, process); + _thisProcess = process; + } + + @Override + protected COPSPdpConnection setputPdpConnection(final Socket conn, final COPSHandle handle) { + logger.debug("PDPCOPSConnection"); + final PCMMPdpConnection pdpConn = new PCMMPdpConnection(_pepId, conn, _thisProcess, _kaTimer, _acctTimer); + final PCMMPdpReqStateMan man = new PCMMPdpReqStateMan(_clientType, handle, _thisProcess); + pdpConn.addStateMan(handle, man); try { man.initRequestState(conn); } catch (COPSPdpException unae) { + logger.error("Unexpected error initializing state", unae); } // XXX - End handleRequestMsg - COPSDebug.err(getClass().getName(), "PDP Thread(pdpConn).start"); - new Thread(pdpConn).start(); - getConnectionMap().put(pepId.getData().str(), pdpConn); + logger.info("Starting PDP connection thread to - " + _host); + return pdpConn; } - /** - * @return the _psHost - */ - public String getPsHost() { - return psHost; - } - - /** - * @param _psHost - * the _psHost to set - */ - public void setPsHost(String _psHost) { - this.psHost = _psHost; - } - - /** - * @return the _psPort - */ - public int getPsPort() { - return psPort; - } - - /** - * @param _psPort - * the _psPort to set - */ - public void setPsPort(int _psPort) { - this.psPort = _psPort; - } - - /** - * @return the socket - */ - public Socket getSocket() { - return socket; - } - - /** - * @param socket - * the socket to set - */ - public void setSocket(Socket socket) { - this.socket = socket; - } - - /** - * @return the _process - */ - public PCMMPdpDataProcess getProcess() { - return _process; - } - - /** - * @param _process - * the _process to set - */ - public void setProcess(PCMMPdpDataProcess _process) { - this._process = _process; - } - - /** - * Gets the client handle - * @return Client's COPSHandle - */ - public COPSHandle getClientHandle() { - return _handle; - } - - /** - * Gets the PepId - * @return COPSPepId - */ - public COPSPepId getPepId() { - return _pepId; - } - - public String getPepIdString() { - return _pepIdString; - } - - /** - * Sets the PepId - * @param pepId - COPSPepId - */ - public void setPepId(COPSPepId pepId) { - _pepId = pepId; - _pepIdString = pepId.getData().str(); - } - /* - * (non-Javadoc) - * - * @see org.pcmm.rcd.IPCMMClient#isConnected() - */ - public boolean isConnected() { - return socket != null && socket.isConnected(); - } - - } +