[Iscs-developers] ISCS/spm/src iputilities.cpp,1.6,1.7 iputilities.h,1.5,1.6
Status: Beta
Brought to you by:
jsulliva
From: John A. S. I. <jsu...@us...> - 2004-05-12 14:46:35
|
Update of /cvsroot/iscs/ISCS/spm/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16014/spm/src Modified Files: iputilities.cpp iputilities.h Log Message: Restored training files to CVS Added MaskLength to IPRange Index: iputilities.h =================================================================== RCS file: /cvsroot/iscs/ISCS/spm/src/iputilities.h,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** iputilities.h 8 May 2004 17:41:48 -0000 1.5 --- iputilities.h 12 May 2004 14:45:41 -0000 1.6 *************** *** 30,44 **** virtual QString bin2DotDec(unsigned long int bin); ! // returns the broadcast address as an unsigned long int given an IP address and a netmask. Returns the invalid broadcast value "2" if passed an invalid value ! virtual unsigned long int broadcastAddressBin(const QString & Addr, const QString & NetMask); ! // returns the broadcast address as an a dotted decimal QString given an IP address and a netmask. Returns an empty string if passed an invalid value ! virtual QString broadcastAddressDotDec(const QString & Addr, const QString & NetMask); // returns the binary equivalent of the provided dotted decimal IP address virtual unsigned long int dotDec2Bin(QString DotDec); ! // Returns the base network address given an IP address and a netmask. Returns an empty string if passed invalid values ! virtual QString ip2Network(const QString & IP, const QString & NetMask); // Returns the dotted decimal network mask given the length of the mask Returns an empty string if passed an invalid value --- 30,47 ---- virtual QString bin2DotDec(unsigned long int bin); ! // returns the number of bits in the SubnetMask expressed as a QString ! virtual QString bin2MaskLength(unsigned long int bin); ! // returns the broadcast address as an unsigned long int given an IP address and either a netmask or mask length. Returns the invalid broadcast value "2" if passed an invalid value ! virtual unsigned long int broadcastAddressBin(const QString & Addr, const QString & Mask); ! ! // returns the broadcast address as an a dotted decimal QString given an IP address and either a netmask or mask length. Returns an empty string if passed an invalid value ! virtual QString broadcastAddressDotDec(const QString & Addr, const QString & Mask); // returns the binary equivalent of the provided dotted decimal IP address virtual unsigned long int dotDec2Bin(QString DotDec); ! // Returns the base network address given an IP address and eithera netmask or a mask length. Returns an empty string if passed invalid values ! virtual QString ip2Network(const QString & IP, const QString & Mask); // Returns the dotted decimal network mask given the length of the mask Returns an empty string if passed an invalid value *************** *** 48,51 **** --- 51,62 ---- virtual QString mask2Length( QString Mask ); + /* + returns the binary equivalent of the Mask Length + maskLength2Bin takes an int rather than a QString because the calling function must validate the + Mask Length. We have no simple way of identifying a bad mask length value without complicating this + simple function + */ + virtual unsigned long int maskLength2Bin( int ML ); + // Returns true of the given range is within the given network. Returns false if passed an invalid value virtual bool rangeInNetwork( QString Low, QString High, QString Network, QString NetMask ); *************** *** 79,90 **** virtual int conflict(const QString & IPR) const; virtual int conflict(const unsigned long int Low, const unsigned long int High) const; ! virtual bool equals( const unsigned long int Low, const unsigned long int High ) const {return (LowBin == Low && HighBin == High);} ! virtual QString getBaseNet() const {return Net;} ! virtual unsigned long int getHighBinary() const {return HighBin;} ! virtual QString getHighIP() const {return Range.mid(Range.find("-") + 1);} ! virtual unsigned long int getLowBinary() const {return LowBin;} ! virtual QString getLowIP() const {return Range.left(Range.find("-"));} ! virtual QString getNetMask() const {return Mask;} ! virtual QString getRange() const {return Range;} virtual QString getSubnet() const; virtual bool overlapRange( const unsigned long int Low, const unsigned long int High) const; --- 90,103 ---- virtual int conflict(const QString & IPR) const; virtual int conflict(const unsigned long int Low, const unsigned long int High) const; ! virtual bool equals( const unsigned long int Low, const unsigned long int High ) const; ! virtual QString getBaseNet() const; ! virtual QString getCIDR() const; ! virtual unsigned long int getHighBinary() const; ! virtual QString getHighIP() const; ! virtual unsigned long int getLowBinary() const; ! virtual QString getLowIP() const; ! virtual QString getMaskLength() const; ! virtual QString getNetMask() const; ! virtual QString getRange() const; virtual QString getSubnet() const; virtual bool overlapRange( const unsigned long int Low, const unsigned long int High) const; *************** *** 92,114 **** virtual bool setBaseNet( QString Base ); virtual void setBinaries( const unsigned long int Low, const unsigned long int High ); ! virtual bool setHighIP( QString IP ); ! virtual bool setLowIP( QString IP ); virtual bool setNetMask( QString NetMask ); virtual bool setRange( const QString & IPR ); virtual bool subRange( const unsigned long int Low, const unsigned long int High) const; virtual bool superRange( const unsigned long int Low, const unsigned long int High) const; ! // All operator functions will return false if passed an invalid string virtual bool operator<(const IPRange & IPR) const; virtual bool operator<(const QString & IPR) const; ! virtual bool operator==(const IPRange & IPR) const {return equals(IPR.LowBin, IPR.HighBin);} virtual bool operator==(const QString & IPR) const; protected: IPUtilities * IPUtils; ! QString Range, Net, Mask; unsigned long int LowBin, HighBin; virtual QString cleanIP( QString IP ) const; virtual QString cleanNetMask( QString NetMask ) const; ! virtual bool digestString( const QString & IPR, QString & S1, QString & S2, bool & Subnet, unsigned long int & Low, unsigned long int & High) const; virtual void test4Subnet( const QString & Low, const QString & High ); --- 105,131 ---- virtual bool setBaseNet( QString Base ); virtual void setBinaries( const unsigned long int Low, const unsigned long int High ); ! virtual bool setHighIP( QString IP ); // returns false if passed a bad IP or IP < LowBin ! virtual bool setLowIP( QString IP ); // returns false if passed a bad IP or IP > HighBin ! virtual bool setMaskLength( QString ML ); virtual bool setNetMask( QString NetMask ); virtual bool setRange( const QString & IPR ); virtual bool subRange( const unsigned long int Low, const unsigned long int High) const; virtual bool superRange( const unsigned long int Low, const unsigned long int High) const; ! virtual void operator=(const IPRange & IPR); ! // All comparison operator functions will return false if passed an invalid string virtual bool operator<(const IPRange & IPR) const; virtual bool operator<(const QString & IPR) const; ! virtual bool operator==(const IPRange & IPR) const; virtual bool operator==(const QString & IPR) const; protected: IPUtilities * IPUtils; ! QString Net, Mask; unsigned long int LowBin, HighBin; virtual QString cleanIP( QString IP ) const; + virtual QString cleanMaskLength( QString Length ) const; virtual QString cleanNetMask( QString NetMask ) const; ! virtual bool digestString( const QString & IPR, QString & S1, QString & S2, int & Subnet, unsigned long int & Low, unsigned long int & High) const; ! virtual bool properOrder( unsigned long int & Low, unsigned long int & High ) const; // ensures Low <= High, returns false if they had to be swapped otherwise it returns true virtual void test4Subnet( const QString & Low, const QString & High ); Index: iputilities.cpp =================================================================== RCS file: /cvsroot/iscs/ISCS/spm/src/iputilities.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** iputilities.cpp 8 May 2004 17:41:48 -0000 1.6 --- iputilities.cpp 12 May 2004 14:45:41 -0000 1.7 *************** *** 49,68 **** //====================================================== ! unsigned long int IPUtilities::broadcastAddressBin(const QString & Addr, const QString & NetMask) { ! if ( Addr.find(rxip) == -1 || NetMask.find(rxip) == -1 ) { // i.e., we have been passed an invalid value return 2; // 2 can never be a valid broadcast address } ! return dotDec2Bin(ip2Network(Addr, NetMask)) | (~(dotDec2Bin(NetMask))); // the broadcast address is the result of the base address OR'd with the ones complement of the netmask } //====================================================== ! QString IPUtilities::broadcastAddressDotDec(const QString & Addr, const QString & NetMask) { ! if ( Addr.find(rxip) == -1 || NetMask.find(rxip) == -1 ) { // i.e., we have been passed an invalid value ! return ""; ! } ! return bin2DotDec(broadcastAddressBin(Addr, NetMask)); } // dotDec2Bin returns an unsigned long int given a dotted decimal IP address --- 49,93 ---- //====================================================== ! QString IPUtilities::bin2MaskLength(unsigned long int bin) { ! int i = 0; ! while( bin ){ ! i++; ! bin <<= 1; ! } ! return QString::number(i); ! } ! //====================================================== ! ! unsigned long int IPUtilities::broadcastAddressBin(const QString & Addr, const QString & Mask) ! { ! if ( Addr.find(rxip) == -1 ) { // i.e., we have been passed an invalid value return 2; // 2 can never be a valid broadcast address } ! unsigned long int M; ! if ( Mask.find(".") == -1 ) { // possible CIDR notation ! bool Ok; ! int L = Mask.toInt(&Ok); ! if ( !Ok || L < 0 || L > 32 ) { // invalid mask length ! return 2; ! } ! M = maskLength2Bin(L); ! } ! else { ! if ( Mask.find(rxnetmask) == -1 ) { ! return 2; ! } ! M = dotDec2Bin(Mask); ! } ! return dotDec2Bin(ip2Network(Addr, Mask)) | (~(M)); // the broadcast address is the result of the base address OR'd with the ones complement of the netmask } //====================================================== ! QString IPUtilities::broadcastAddressDotDec(const QString & Addr, const QString & Mask) { ! unsigned long int R = broadcastAddressBin(Addr, Mask); ! return ( R == 2 ? "" : bin2DotDec(R) ); } + //====================================================== // dotDec2Bin returns an unsigned long int given a dotted decimal IP address *************** *** 74,86 **** //====================================================== ! QString IPUtilities::ip2Network(const QString & IP, const QString & NetMask) { ! unsigned long int Address, Mask; ! if ( IP.find(rxip) == -1 || NetMask.find(rxnetmask) == -1 ) { // i.e., we were passed invalid values return ""; } Address = dotDec2Bin(IP); ! Mask = dotDec2Bin(NetMask); ! return bin2DotDec(Address & Mask); } //====================================================== --- 99,124 ---- //====================================================== ! QString IPUtilities::ip2Network(const QString & IP, const QString & Mask) { ! unsigned long int Address, M; ! if ( IP.find(rxip) == -1 ) { // i.e., we were passed invalid values return ""; } + if ( Mask.find(".") == -1 ) { // possible CIDR notation + bool Ok; + int L = Mask.toInt(&Ok); + if ( ! Ok || L < 0 || L > 32 ) { + return ""; + } + M = maskLength2Bin(L); + } + else { + if ( Mask.find(rxnetmask) == -1 ) { + return ""; + } + M = dotDec2Bin(Mask); + } Address = dotDec2Bin(IP); ! return bin2DotDec(Address & M); } //====================================================== *************** *** 88,100 **** QString IPUtilities::length2Mask( QString Length) { ! int L = Length.toInt(); ! if ( L < 0 || L > 32 ) { // i.e., we have been passed an invalid length return ""; } ! unsigned long int AllOnes = 4294967295; ! for (int i = 0; i < 32 - L; i++) { ! AllOnes <<= 1; ! } ! return bin2DotDec(AllOnes); } //====================================================== --- 126,135 ---- QString IPUtilities::length2Mask( QString Length) { ! bool Ok; ! int L = Length.toInt(&Ok); ! if ( L < 0 || L > 32 || !Ok ) { // i.e., we have been passed an invalid length return ""; } ! return bin2DotDec(maskLength2Bin(L)); } //====================================================== *************** *** 102,115 **** QString IPUtilities::mask2Length( QString Mask ) { - unsigned long int MaskInt, i = 0; if ( Mask.find(rxnetmask) == -1 ) { // i.e., we have been passed an invalid mask return ""; } ! MaskInt = dotDec2Bin(Mask); ! while( MaskInt ){ ! i++; ! MaskInt <<= 1; } ! return QString::number(i); } //====================================================== --- 137,154 ---- QString IPUtilities::mask2Length( QString Mask ) { if ( Mask.find(rxnetmask) == -1 ) { // i.e., we have been passed an invalid mask return ""; } ! return bin2MaskLength(dotDec2Bin(Mask)); ! } ! //====================================================== ! ! unsigned long int IPUtilities::maskLength2Bin( int ML ) ! { ! unsigned long int AllOnes = 4294967295; ! for (int i = 0; i < 32 - ML; i++) { ! AllOnes <<= 1; } ! return AllOnes; } //====================================================== *************** *** 359,367 **** { IPUtils = new IPUtilities(); ! Range = IPR.Range; ! Net = IPR.Net; ! Mask = IPR.Mask; ! LowBin = IPR.LowBin; ! HighBin = IPR.HighBin; } //====================================================== --- 398,402 ---- { IPUtils = new IPUtilities(); ! operator=(IPR); } //====================================================== *************** *** 398,411 **** { IP.stripWhiteSpace(); ! QString S = IP; ! return ( ( S.contains(IPUtils->rxip) == 1 && S.remove(IPUtils->rxip).isEmpty() ) ? IP : QString::null ); } //====================================================== QString IPRange::cleanNetMask ( QString NetMask ) const { NetMask.stripWhiteSpace(); ! QString S = NetMask; ! return ( ( S.contains(IPUtils->rxnetmask) == 1 && S.remove(IPUtils->rxnetmask).isEmpty() ) ? NetMask : QString::null ); } //====================================================== --- 433,454 ---- { IP.stripWhiteSpace(); ! return ( IP.find(IPUtils->rxip) == -1 ? QString::null : IP ); } //====================================================== + QString IPRange::cleanMaskLength( QString Length ) const + { + bool Ok; + int L; + Length.stripWhiteSpace(); + L = Length.toInt(&Ok); + return ( ( L >= 0 && L <=32 && Ok ) ? Length : QString::null ); + } + //====================================================== + QString IPRange::cleanNetMask ( QString NetMask ) const { NetMask.stripWhiteSpace(); ! return ( NetMask.find(IPUtils->rxnetmask) == -1 ? QString::null : NetMask ); } //====================================================== *************** *** 419,423 **** int IPRange::conflict(const QString & IPR) const { ! bool Subnet; QString S1, S2; unsigned long int Low, High; --- 462,466 ---- int IPRange::conflict(const QString & IPR) const { ! int Subnet; QString S1, S2; unsigned long int Low, High; *************** *** 447,455 **** //====================================================== ! bool IPRange::digestString( const QString & IPR, QString & S1, QString & S2, bool & Subnet, unsigned long int & Low, unsigned long int & High) const { int Delim = IPR.find("-"); ! Subnet = (Delim == -1); ! if ( Subnet ) { Delim = IPR.find("/"); if ( Delim == -1 ) { // we have been passed an invalid string --- 490,505 ---- //====================================================== ! /* ! S1 contains either the low boundary of the range or the base address of the subnet. S2 contains either ! the upper boundary of the range or the subnet mask in either dotted decimal or CIDR notation. Subnet ! is set to 0 if we were passed a range, 1 if we were passed a Subnet with a dotted decimal mask and 2 if ! we were passed a CIDR Subnet. Low and High contain the binary equivalent of the range boundaries ! */ ! bool IPRange::digestString( const QString & IPR, QString & S1, QString & S2, int & Subnet, unsigned long int & Low, unsigned long int & High) const { int Delim = IPR.find("-"); ! Subnet = 0; ! if ( Delim == -1 ) { ! Subnet = 1; Delim = IPR.find("/"); if ( Delim == -1 ) { // we have been passed an invalid string *************** *** 464,469 **** S2 = IPR.mid(Delim + 1); if ( Subnet ) { ! if ( (S2 = cleanNetMask(S2)).isNull() ) { ! return false; } High = IPUtils->broadcastAddressBin(S1, S2); --- 514,527 ---- S2 = IPR.mid(Delim + 1); if ( Subnet ) { ! if ( S2.find(".") == -1 ) { //possible CIDR notation ! if ( (S2 = cleanMaskLength(S2)).isNull() ) { ! return false; ! } ! Subnet = 2; ! } ! else { ! if ( (S2 = cleanNetMask(S2)).isNull() ) { ! return false; ! } } High = IPUtils->broadcastAddressBin(S1, S2); *************** *** 474,477 **** --- 532,540 ---- } High = IPUtils->dotDec2Bin(S2); + if ( ! properOrder( Low, High ) ) { // the IPs could only be out of order if we passed a Range + QString HoldString = S1; + S1 = S2; + S2 = HoldString; + } } return true; *************** *** 479,482 **** --- 542,605 ---- //====================================================== + bool IPRange::equals( const unsigned long int Low, const unsigned long int High ) const + { + return (LowBin == Low && HighBin == High); + } + //====================================================== + + QString IPRange::getBaseNet() const + { + return Net; + } + //====================================================== + + QString IPRange::getCIDR() const + { + return Net + QString( Net.isNull() ? QString::null : "/" + Mask); + } + //====================================================== + + unsigned long int IPRange::getHighBinary() const + { + return HighBin; + } + //====================================================== + + QString IPRange::getHighIP() const + { + return IPUtils->bin2DotDec(HighBin); + } + //====================================================== + + unsigned long int IPRange::getLowBinary() const + { + return LowBin; + } + //====================================================== + + QString IPRange::getLowIP() const + { + return IPUtils->bin2DotDec(LowBin); + } + //====================================================== + + QString IPRange::getMaskLength() const + { + return Mask; + } + //====================================================== + + QString IPRange::getNetMask() const + { + return IPUtils->length2Mask(Mask); + } + //====================================================== + + QString IPRange::getRange() const + { + return IPUtils->bin2DotDec(LowBin) + "-" + IPUtils->bin2DotDec(HighBin); + } + //====================================================== + QString IPRange::getSubnet() const { *************** *** 484,488 **** return Mask; } ! return Net + "/" + Mask; } //====================================================== --- 607,611 ---- return Mask; } ! return Net + "/" + IPUtils->length2Mask(Mask); } //====================================================== *************** *** 494,497 **** --- 617,632 ---- //====================================================== + bool IPRange::properOrder( unsigned long int & Low, unsigned long int & High ) const + { + if ( High < Low ) { + unsigned long int Hold = High; + High = Low; + Low = Hold; + return false; + } + return true; + } + //====================================================== + bool IPRange::setBaseNet( QString Base ) { *************** *** 507,511 **** return false; } - Range = Base + "-" + High; LowBin = IPUtils->dotDec2Bin(Base); HighBin = IPUtils->dotDec2Bin(High); --- 642,645 ---- *************** *** 516,524 **** void IPRange::setBinaries( const unsigned long int Low, const unsigned long int High ) { - QString LowIP = IPUtils->bin2DotDec(Low); - QString HighIP = IPUtils->bin2DotDec(High); LowBin = Low; HighBin = High; ! Range = LowIP + "-" + HighIP; test4Subnet(LowIP, HighIP); } --- 650,658 ---- void IPRange::setBinaries( const unsigned long int Low, const unsigned long int High ) { LowBin = Low; HighBin = High; ! properOrder( LowBin, HighBin ); ! QString LowIP = IPUtils->bin2DotDec(LowBin); ! QString HighIP = IPUtils->bin2DotDec(HighBin); test4Subnet(LowIP, HighIP); } *************** *** 527,534 **** bool IPRange::setHighIP( QString IP ) { ! if ( (IP = cleanIP(IP)).isNull() ) { return false; } ! setBinaries( LowBin, IPUtils->dotDec2Bin(IP) ); return true; } --- 661,669 ---- bool IPRange::setHighIP( QString IP ) { ! unsigned long int NewHigh; ! if ( (IP = cleanIP(IP)).isNull() || (NewHigh = IPUtils->dotDec2Bin(IP)) < LowBin ) { return false; } ! setBinaries( LowBin, NewHigh ); return true; } *************** *** 537,548 **** bool IPRange::setLowIP( QString IP ) { ! if ( (IP = cleanIP(IP)).isNull() ) { return false; } ! setBinaries( IPUtils->dotDec2Bin(IP), HighBin ); return true; } //====================================================== bool IPRange::setNetMask( QString NetMask ) { --- 672,695 ---- bool IPRange::setLowIP( QString IP ) { ! unsigned long int NewLow; ! if ( (IP = cleanIP(IP)).isNull() || (NewLow = IPUtils->dotDec2Bin(IP)) > HighBin ) { return false; } ! setBinaries( NewLow, HighBin ); return true; } //====================================================== + bool IPRange::setMaskLength( QString ML ) + { + if (Net.isNull() || (ML = cleanMaskLength(ML)).isNull() ) { + return false; + } + HighBin = IPUtils->broadcastAddressBin(Net, ML); + Mask = ML; + return true; + } + //====================================================== + bool IPRange::setNetMask( QString NetMask ) { *************** *** 550,557 **** return false; } ! unsigned long int HoldBin = IPUtils->broadcastAddressBin(Net, NetMask); ! Mask = NetMask; ! Range.replace("-" + IPUtils->bin2DotDec(HighBin), "-" + IPUtils->bin2DotDec(HoldBin) ); ! HighBin = HoldBin; return true; } --- 697,702 ---- return false; } ! HighBin = IPUtils->broadcastAddressBin(Net, NetMask); ! Mask = IPUtils->mask2Length(NetMask); return true; } *************** *** 560,564 **** bool IPRange::setRange( const QString & IPR ) { ! bool Subnet; QString S1, S2; if ( ! digestString(IPR, S1, S2, Subnet, LowBin, HighBin) ) { --- 705,709 ---- bool IPRange::setRange( const QString & IPR ) { ! int Subnet; QString S1, S2; if ( ! digestString(IPR, S1, S2, Subnet, LowBin, HighBin) ) { *************** *** 567,575 **** if (Subnet) { Net = S1; ! Mask = S2; ! Range = Net + "-" + IPUtils->broadcastAddressDotDec(Net, Mask); } else { - Range = S1 + "-" + S2; test4Subnet(S1, S2); } --- 712,718 ---- if (Subnet) { Net = S1; ! Mask = ( Subnet == 2 ? S2 : IPUtils->mask2Length(S2) ); } else { test4Subnet(S1, S2); } *************** *** 597,601 **** HoldS = SList.first(); int Slash = HoldS.find("/"); ! Mask = HoldS.mid(Slash + 1); Net = HoldS.left(Slash); } --- 740,744 ---- HoldS = SList.first(); int Slash = HoldS.find("/"); ! Mask = IPUtils->mask2Length(HoldS.mid(Slash + 1)); Net = HoldS.left(Slash); } *************** *** 606,609 **** --- 749,761 ---- //====================================================== + void IPRange::operator=(const IPRange & IPR) + { + Net = IPR.Net; + Mask = IPR.Mask; + LowBin = IPR.LowBin; + HighBin = IPR.HighBin; + } + //====================================================== + bool IPRange::operator<(const IPRange & IPR) const { *************** *** 615,619 **** bool IPRange::operator<(const QString & IPR) const { ! bool Subnet; unsigned long int Low, High; QString S1, S2; --- 767,771 ---- bool IPRange::operator<(const QString & IPR) const { ! int Subnet; unsigned long int Low, High; QString S1, S2; *************** *** 625,631 **** //====================================================== bool IPRange::operator==(const QString & IPR) const { ! bool Subnet; unsigned long int Low, High; QString S1, S2; --- 777,789 ---- //====================================================== + bool IPRange::operator==(const IPRange & IPR) const + { + return (IPR.LowBin == LowBin && IPR.HighBin == HighBin); + } + //====================================================== + bool IPRange::operator==(const QString & IPR) const { ! int Subnet; unsigned long int Low, High; QString S1, S2; *************** *** 633,637 **** return false; } ! return equals( Low, High ); } //====================================================== --- 791,795 ---- return false; } ! return (Low == LowBin && High == HighBin); } //====================================================== |