|
@@ -142,7 +142,8 @@ public:
|
|
|
* Key is multicast group in lower case hex format: MAC (without :s) /
|
|
|
* ADI (hex). Value is a comma-delimited list of: preload, min, max,
|
|
|
* rate of accrual for bandwidth accounts. A key called '*' indicates
|
|
|
- * the default for unlisted groups.
|
|
|
+ * the default for unlisted groups. Values are in hexadecimal and may
|
|
|
+ * be prefixed with '-' to indicate a negative value.
|
|
|
*/
|
|
|
class MulticastRates : private Dictionary
|
|
|
{
|
|
@@ -153,16 +154,17 @@ public:
|
|
|
struct Rate
|
|
|
{
|
|
|
Rate() {}
|
|
|
- Rate(double pl,double minr,double maxr,double bps)
|
|
|
+ Rate(int32_t pl,int32_t minb,int32_t maxb,int32_t acc)
|
|
|
{
|
|
|
preload = pl;
|
|
|
- accrual.bytesPerSecond = bps;
|
|
|
- accrual.maxBalance = maxr;
|
|
|
- accrual.minBalance = minr;
|
|
|
+ minBalance = minb;
|
|
|
+ maxBalance = maxb;
|
|
|
+ accrual = acc;
|
|
|
}
|
|
|
-
|
|
|
- double preload;
|
|
|
- BandwidthAccount::Accrual accrual;
|
|
|
+ int32_t preload;
|
|
|
+ int32_t minBalance;
|
|
|
+ int32_t maxBalance;
|
|
|
+ int32_t accrual;
|
|
|
};
|
|
|
|
|
|
MulticastRates() {}
|
|
@@ -178,7 +180,7 @@ public:
|
|
|
/**
|
|
|
* @return Default rate, or GLOBAL_DEFAULT_RATE if not specified
|
|
|
*/
|
|
|
- Rate defaultRate() const
|
|
|
+ inline Rate defaultRate() const
|
|
|
{
|
|
|
Rate r;
|
|
|
const_iterator dfl(find("*"));
|
|
@@ -193,7 +195,7 @@ public:
|
|
|
* @param mg Multicast group
|
|
|
* @return Rate or default() rate if not specified
|
|
|
*/
|
|
|
- Rate get(const MulticastGroup &mg) const
|
|
|
+ inline Rate get(const MulticastGroup &mg) const
|
|
|
{
|
|
|
const_iterator r(find(mg.toString()));
|
|
|
if (r == end())
|
|
@@ -206,26 +208,22 @@ public:
|
|
|
{
|
|
|
char tmp[16384];
|
|
|
Utils::scopy(tmp,sizeof(tmp),s.c_str());
|
|
|
- Rate r;
|
|
|
- r.preload = 0.0;
|
|
|
- r.accrual.bytesPerSecond = 0.0;
|
|
|
- r.accrual.maxBalance = 0.0;
|
|
|
- r.accrual.minBalance = 0.0;
|
|
|
+ Rate r(0,0,0,0);
|
|
|
char *saveptr = (char *)0;
|
|
|
unsigned int fn = 0;
|
|
|
for(char *f=Utils::stok(tmp,",",&saveptr);(f);f=Utils::stok((char *)0,",",&saveptr)) {
|
|
|
switch(fn++) {
|
|
|
case 0:
|
|
|
- r.preload = Utils::strToDouble(f);
|
|
|
+ r.preload = (int32_t)Utils::hexStrToLong(f);
|
|
|
break;
|
|
|
case 1:
|
|
|
- r.accrual.minBalance = Utils::strToDouble(f);
|
|
|
+ r.minBalance = (int32_t)Utils::hexStrToLong(f);
|
|
|
break;
|
|
|
case 2:
|
|
|
- r.accrual.maxBalance = Utils::strToDouble(f);
|
|
|
+ r.maxBalance = (int32_t)Utils::hexStrToLong(f);
|
|
|
break;
|
|
|
case 3:
|
|
|
- r.accrual.bytesPerSecond = Utils::strToDouble(f);
|
|
|
+ r.accrual = (int32_t)Utils::hexStrToLong(f);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
@@ -538,10 +536,24 @@ public:
|
|
|
else return ((_etWhitelist[etherType / 8] & (unsigned char)(1 << (etherType % 8))) != 0);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Update multicast balance for an address and multicast group, return whether packet is allowed
|
|
|
+ *
|
|
|
+ * @param a Address that wants to send/relay packet
|
|
|
+ * @param mg Multicast group
|
|
|
+ * @param bytes Size of packet
|
|
|
+ * @return True if packet is within budget
|
|
|
+ */
|
|
|
inline bool updateAndCheckMulticastBalance(const Address &a,const MulticastGroup &mg,unsigned int bytes)
|
|
|
{
|
|
|
Mutex::Lock _l(_lock);
|
|
|
- std::map< std::pair<Address,MulticastGroup>,BandwidthAccount >::iterator bal(_multicastRateAccounts.find(std::pair<Address,MulticastGroup>(a,mg)));
|
|
|
+ std::pair<Address,MulticastGroup> k(a,mg);
|
|
|
+ std::map< std::pair<Address,MulticastGroup>,BandwidthAccount >::iterator bal(_multicastRateAccounts.find(k));
|
|
|
+ if (bal == _multicastRateAccounts.end()) {
|
|
|
+ MulticastRates::Rate r(_mcRates.get(mg));
|
|
|
+ bal = _multicastRateAccounts.insert(std::make_pair(k,BandwidthAccount(r.preload,r.minBalance,r.maxBalance,r.accrual))).first;
|
|
|
+ }
|
|
|
+ return (bal->second.update((int32_t)bytes) < (int32_t)bytes);
|
|
|
}
|
|
|
|
|
|
private:
|
|
@@ -563,6 +575,7 @@ private:
|
|
|
// Configuration from network master node
|
|
|
Config _configuration;
|
|
|
Certificate _myCertificate;
|
|
|
+ MulticastRates _mcRates;
|
|
|
|
|
|
// Ethertype whitelist bit field, set from config, for really fast lookup
|
|
|
unsigned char _etWhitelist[65536 / 8];
|