/// <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; }
// 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()); }
//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); }