Example #1
0
 /// <summary>
 /// Creates a new instance of this class.
 /// </summary>
 /// <param name="ipProtocol">The IP portocol</param>
 /// <param name="ipaSource">The original source address</param>
 /// <param name="ipaTranslatedSource">The translated source address</param>
 /// <param name="ipaDestination">The destination address</param>
 /// <param name="iSourcePort">The original source port</param>
 /// <param name="iTranslatedSourcePort">The translated source port</param>
 /// <param name="iDestinationPort">The destination port</param>
 public NATEntry(IP.IPProtocol ipProtocol, IPAddress ipaSource, IPAddress ipaTranslatedSource, IPAddress ipaDestination, int iSourcePort, int iTranslatedSourcePort, int iDestinationPort)
 {
     this.ipProtocol            = ipProtocol;
     this.ipaOriginalSource     = ipaSource;
     this.ipaTranslatedSource   = ipaTranslatedSource;
     this.ipaDestination        = ipaDestination;
     this.iOriginalSourcePort   = iSourcePort;
     this.iTranslatedSourcePort = iTranslatedSourcePort;
     this.iDestinationPort      = iDestinationPort;
 }
Example #2
0
        // Seen from inside
        private NATEntry CreateTranslationEntry(IPAddress ipaSource, IPAddress ipaDestination, int iSourcePort, int iDestinationPort, IP.IPProtocol iIPProtocol)
        {
            int iTranslatedSourcePort = 0;

            NATEntry eNatEntry;

            lock (lExternalRange)
            {
                foreach (IPAddress ipa in lExternalAddressPool)
                {
                    if (iIPProtocol == IP.IPProtocol.UDP || iIPProtocol == IP.IPProtocol.TCP)
                    {
                        iTranslatedSourcePort = iRangeStartPort;
                    }
                    do
                    {
                        if (GetReTranslationEntry(ipa, ipaDestination, iTranslatedSourcePort, iDestinationPort, iIPProtocol) == null)
                        {
                            eNatEntry     = new NATEntry(iIPProtocol, ipaSource, ipa, ipaDestination, iSourcePort, iTranslatedSourcePort, iDestinationPort);
                            eNatEntry.TTL = iNATTimer;
                            lock (lNATDatabase)
                            {
                                lNATDatabase.Add(eNatEntry);
                            }
                            InvokeExternalAsync(NATEntryCreated, new NATEventArgs(eNatEntry));
                            return(eNatEntry);
                        }
                        iTranslatedSourcePort++;
                    }while ((iIPProtocol == IP.IPProtocol.UDP || iIPProtocol == IP.IPProtocol.TCP) && iRangeStartPort < iRangeEndPort);
                }
            }

            throw new Exception("A NAT entry could not be created cause the pools are exhausted. (Source: " + ipaSource + "/" + iSourcePort + ", Destination: " + ipaDestination + "/" + iDestinationPort + ", Protocol: " + iIPProtocol.ToString());
        }
Example #3
0
 //Seen from inside
 private NATEntry GetReTranslationEntry(IPAddress ipaTranslatedSource, IPAddress ipaDestination, int iTranslatedSourcePort, int iDestinationPort, IP.IPProtocol iProtocol)
 {
     lock (lNATDatabase)
     {
         foreach (NATEntry ne in lNATDatabase)
         {
             if (ne.TranslatedSourceAddress.Equals(ipaTranslatedSource) &&
                 ne.DestinationAddress.Equals(ipaDestination) &&
                 ne.TranslatedSourcePort.Equals(iTranslatedSourcePort) &&
                 ne.DestinationPort.Equals(iDestinationPort) &&
                 ne.IPProtocol.Equals(iProtocol))
             {
                 ne.TTL = iNATTimer;
                 return(ne);
             }
         }
     }
     return(null);
 }