private void processMembershipProposal (Message m) {
        
        if (runLevel < 3) {
            return;
        }
        
        log.fine("Processing membership proposal 'p'");
        ControlMessage p = (ControlMessage) m;
        String response;
        ClusterTableRecord tempRec = null;
        
        try {
            tempRec = p.parsePControl();
            if (tempRec == null) {
                response = "deny";
            } else if (clusterTable.exists(tempRec.getNodeId())) {
                response = "deny";
            } else {
                response = "accept";
            }
            
        } catch (UnknownHostException e) {
            response = "deny";
        }
        
        log.log(Level.FINE, "Sending reply {0} 'a'", response);
        ControlMessage reply = new ControlMessage ('a', p.getSourceIp(),
                response);
        
        try {
            comm.send(reply);
        } catch (IOException e) {
            // do nothing. The contact node will timeout and try again.
            log.warning("Sending membership reply 'a' failed");
            return;
        }
        
        if (tempRec != null && response.equalsIgnoreCase("accept")) {
            tempRecs.put(tempRec.getNodeId(), tempRec);
        }
        
    }