/// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public static bool Shutdown()
        {
            try
            {
                if (stackContext != null)
                {
                    isStopping = true;

                    EventHandlersTable.Clear();

                    stackContext.dictionary.Clear();

                    stackContext.peers.Clear();

                    if (TransportListner != null)
                    {
                        TransportListner.Stop();
                    }

                    stackContext = null;

                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            catch (Exception exp)
            {
                Common.StackLog.Write2ErrorLog("Shutdown", "Error:" + exp.Message + " Stack:" + exp.StackTrace);
                return(false);
            }
        }
        //Starts a Listner Thread
        private static void StartListenerThread(StackContext stackContext)
        {
            try
            {
                Thread listenThread = new Thread(StartListener);

                listenThread.Start(stackContext);
            }
            catch (Exception exp)
            {
                Common.StackLog.Write2ErrorLog("DiameterAAAStack::StartListenerThread", "Error:" + exp.Message + " Stack:" + exp.StackTrace);
            }
        }
 /// <summary>
 /// Initializes the Peer State Machine
 /// </summary>
 /// <param name="stackContext"></param>
 /// <returns></returns>
 private static bool StartPSM(StackContext stackContext)
 {
     Common.StackLog.Write2TraceLog("DiameterAAAStack::StartPSM", "Entering StartPSM ...");
     try
     {
         RaisePeerStateChangeEvent(PEER_STATE_EVENT.Start, stackContext);
         Common.StackLog.Write2TraceLog("DiameterAAAStack::StartPSM", "Exiting StartPSM ...");
         return(true);
     }
     catch (Exception exp)
     {
         Common.StackLog.Write2ErrorLog("DiameterAAAStack::StartPSM", "Error:" + exp.Message + " Stack:" + exp.StackTrace);
         return(false);
     }
 }
        /// <summary>
        /// Start Listner
        /// </summary>
        ///
        private static void StartListener(object data)
        {
            try
            {
                StackContext stackContext = data as StackContext;

                List <ListenAddress> listenAddress = new List <ListenAddress>();

                listenAddress.Add(new ListenAddress()
                {
                    IPAddress = stackContext.ListenerIP, Port = stackContext.ListenerPort
                });

                transport.StartListners(listenAddress, ref TransportListner);
            }
            catch (Exception exp)
            {
                Common.StackLog.Write2ErrorLog("DiameterAAAStack::StartListener", "Error:" + exp.Message + " Stack:" + exp.StackTrace);
            }
        }
        public static void Reconnect(StackContext pStackContext)
        {
            try
            {
                if (isReconnecting)
                {
                    return;
                }
                Common.StackLog.Write2TraceLog("DiameterAAAStack::Reconnect", "Entering ...");
                isReconnecting = true;
                //Update Peer Entry in PeerTable
                Common.StackLog.Write2TraceLog("\tDiameterAAAStack::Reconnect", "Shuttingdown Client ...");

                //if(pStackContext.peers[0].PeerConnection.Client.
                try
                {
                    pStackContext.peers[0].PeerConnection.Client.Shutdown(SocketShutdown.Both);
                }
                catch (Exception ex)
                {
                    Common.StackLog.Write2ErrorLog("DiameterAAAStack::Reconnect", "Socket was already shutdown, error: " + ex.Message);
                }
                UpdateConnectionState(pStackContext.peers[0], PeerState.CLOSED);
                Common.StackLog.Write2TraceLog("\tDiameterAAAStack::Reconnect", "Connection closed ...");

                while (!isStopping && pStackContext.peers[0].PeerState != PeerState.OPEN)
                {
                    Common.StackLog.Write2TraceLog("\tDiameterAAAStack::Reconnect", "Calling StartPSM ...");
                    StartPSM(pStackContext);
                    Common.StackLog.Write2TraceLog("\tDiameterAAAStack::Reconnect", "StartPSM Ended...");
                    //Thread.Sleep(5000);
                }
                isReconnecting = false;
                Common.StackLog.Write2TraceLog("DiameterAAAStack::Reconnect", "Exiting ...");
            }
            catch (Exception ex)
            {
                Common.StackLog.Write2ErrorLog("DiameterAAAStack::Reconnect", "Error:" + ex.Message + " Stack:" + ex.StackTrace);
            }
        }
Exemple #6
0
        /// <summary>
        /// This method create Credit Control Request for DCCA Server
        /// </summary>
        /// <param name="userName"></param>
        /// <param name="destinationHost"></param>
        /// <param name="destinationRealm"></param>
        /// <param name="requestType"></param>
        /// <param name="UserName"></param>
        /// <param name="MSIDN"></param>
        /// <param name="callingPartyAddress"></param>
        /// <param name="calledPartyAddress"></param>
        /// <param name="realCalledNumber"></param>
        /// <returns></returns>
        public Message CreditControlRequest(StackContext stackContext, string OrigionHost, string OrigionRealm, string DestinationRealm, int AuthApplicationId, CC_Request_Type CCRequestType, int CCRequestNumber, string SessionId)
        {
            Message ccrReq = new Message(stackContext);

            ccrReq.CommandCode        = 272;
            ccrReq.EndtoEndIdentifier = ccrReq.GetEndToEndIdentifier();
            ccrReq.HopbyHopIdentifier = ccrReq.GetHopByHopIdentifier();
            ccrReq.ApplicationID      = 4;

            //Set Mandatory Attributes
            ccrReq.avps.Add(new Avp(DiameterAvpCode.Session_Id, SessionId));
            ccrReq.SetSessionId(SessionId);
            //Origion and Destination attrib s

            ccrReq.avps.Add(new Avp(DiameterAvpCode.Origin_Host, OrigionHost));
            ccrReq.avps.Add(new Avp(DiameterAvpCode.Origin_Realm, OrigionRealm));
            ccrReq.avps.Add(new Avp(DiameterAvpCode.Destination_Realm, DestinationRealm));

            ccrReq.avps.Add(new Avp(DiameterAvpCode.Auth_Application_Id, AuthApplicationId));
            ccrReq.avps.Add(new Avp(DiameterAvpCode.CC_Request_Type, CCRequestType));
            ccrReq.avps.Add(new Avp(DiameterAvpCode.CC_Request_Number, CCRequestNumber));

            return(ccrReq);
        }
Exemple #7
0
        /// <summary>
        /// This method Creates CAPABILITY EXCHANGE REQUEST MESSAGE
        /// </summary>
        /// <returns></returns>

        public Message CapabilityExchangeRequest(StackContext stackContext)
        {
            Message cerReq = new Message(stackContext);

            cerReq.CommandCode        = DiameterMessageCode.CAPABILITY_EXCHANGE;
            cerReq.EndtoEndIdentifier = cerReq.GetEndToEndIdentifier();
            cerReq.HopbyHopIdentifier = cerReq.GetHopByHopIdentifier();
            cerReq.ApplicationID      = 0;


            //Set Mandatory Attributes
            cerReq.avps.Add(new Avp(DiameterAvpCode.Origin_Host, stackContext.OrigionHost)
            {
                isMandatory = true
            });
            cerReq.avps.Add(new Avp(DiameterAvpCode.Origin_Realm, stackContext.OrigionRealm)
            {
                isMandatory = true
            });
            cerReq.avps.Add(new Avp(DiameterAvpCode.Host_IP_Address, IPAddress.Parse(Utility.LocalIPAddress()))
            {
                isMandatory = true
            });
            cerReq.avps.Add(new Avp(DiameterAvpCode.Vendor_Id, 42452)
            {
                isMandatory = true
            });
            cerReq.avps.Add(new Avp(DiameterAvpCode.Product_Name, "EMI Networks (SMC-PVT) LTD.")
            {
                isMandatory = true
            });

            cerReq.avps.Add(new Avp(DiameterAvpCode.Origin_State_Id, 1));
            cerReq.avps.Add(new Avp(DiameterAvpCode.Supported_Vendor_Id, 10415));
            cerReq.avps.Add(new Avp(DiameterAvpCode.Auth_Application_Id, 167772151));
            //cerReq.avps.Add(new Avp(DiameterAvpCode.Inband_Security_Id, 1234)); //Not Recommended in CER/CEA Messages
            cerReq.avps.Add(new Avp(DiameterAvpCode.Acct_Application_Id, 0));

            ////Create Vendor_Specific_Application_Id Grouped Avp
            Avp avpVendorSpecificAppId = new Avp(DiameterAvpCode.Vendor_Specific_Application_Id)
            {
                isGrouped = true
            };
            Avp avpVendorId          = new Avp(DiameterAvpCode.Vendor_Id, 11);
            Avp avpAuthApplicationId = new Avp(DiameterAvpCode.Auth_Application_Id, 167772151);

            avpVendorSpecificAppId.groupedAvps.Add(avpVendorId);          //Add Avp to Grouped Avp
            avpVendorSpecificAppId.groupedAvps.Add(avpAuthApplicationId); //Add Avp to Grouped Avp

            cerReq.avps.Add(avpVendorSpecificAppId);                      //Now Add Avp to CER Command

            //Second Loop
            avpVendorSpecificAppId = new Avp(DiameterAvpCode.Vendor_Specific_Application_Id)
            {
                isGrouped = true
            };
            avpVendorSpecificAppId.groupedAvps.Clear();
            avpVendorSpecificAppId.groupedAvps.Add(avpVendorId);
            Avp avpAcctApplicationId = new Avp(DiameterAvpCode.Acct_Application_Id, 0);

            avpVendorSpecificAppId.groupedAvps.Add(avpAcctApplicationId);
            cerReq.avps.Add(avpVendorSpecificAppId);


            cerReq.avps.Add(new Avp(DiameterAvpCode.Firmware_Revision, 1));

            return(cerReq);
        }
 public Answer(StackContext stackContext)
 {
     this.stackContext = stackContext;
 }
 /// <summary>
 /// Default Constructor
 /// </summary>
 public Transport(StackContext stackContext)
 {
     this.stackContext = stackContext;
 }
        private void Reconnect(Object obj)
        {
            StackContext stackContext = (StackContext)obj;

            DiameterAAAStack.Reconnect(stackContext);
        }