]> git.stg.codes - ssmd.git/commitdiff
Add max_acl_per_pdu param
authorMaxim Mamontov <faust.madf@gmail.com>
Wed, 23 Nov 2011 19:19:40 +0000 (21:19 +0200)
committerMaxim Mamontov <faust.madf@gmail.com>
Wed, 23 Nov 2011 19:19:40 +0000 (21:19 +0200)
include/settings.h
include/settings.inl.h
src/settings.cpp
src/settingsfileparser.cpp
src/switch.cpp

index e061b96d8e641fabd44ba9a4a8021ebc2b3d0e54..e384a423ee584ae44c77965661253881fbd67ef6 100644 (file)
@@ -36,6 +36,8 @@ class Settings {
         unsigned upProfileId() const throw() { return _upProfileId; }
         unsigned downProfileId() const throw() { return _downProfileId; }
 
+        size_t maxACLPerPDU() const throw() { return _maxACLPerPDU; }
+
         const std::string & dataURL() const throw() { return _dataURL; }
 
         // Setters
@@ -54,6 +56,8 @@ class Settings {
         void setUpProfileId(unsigned value) throw() { _upProfileId = value; }
         void setDownProfileId(unsigned value) throw() { _downProfileId = value; }
 
+        void setMaxACLPerPDU(size_t value) throw() { _maxACLPerPDU = value; }
+
         void setDataURL(const std::string & value) throw() { _dataURL = value; }
 
     private:
@@ -72,6 +76,8 @@ class Settings {
         unsigned _upProfileId;
         unsigned _downProfileId;
 
+        size_t _maxACLPerPDU;
+
         std::string _dataURL;
 
         friend class SettingsParser;
index e67aab790e79269742fe622379c5a08194701080..1c771ced8dc42b2df16d6402d6f5f96f85d1dc8d 100644 (file)
@@ -18,7 +18,9 @@ Settings::Settings()
       _switchSyncInterval(180),
       _infoSyncInterval(60),
       _upProfileId(1),
-      _downProfileId(2)
+      _downProfileId(2),
+      _maxACLPerPDU(50),
+      _dataURL()
 {
 }
 
@@ -35,6 +37,7 @@ Settings::Settings(const Settings & rvalue)
       _infoSyncInterval(rvalue._infoSyncInterval),
       _upProfileId(rvalue._upProfileId),
       _downProfileId(rvalue._downProfileId),
+      _maxACLPerPDU(rvalue._maxACLPerPDU),
       _dataURL(rvalue._dataURL)
 {
 }
@@ -58,6 +61,7 @@ const Settings & Settings::operator=(const Settings & rvalue)
     _infoSyncInterval = rvalue._infoSyncInterval;
     _upProfileId = rvalue._upProfileId;
     _downProfileId = rvalue._downProfileId;
+    _maxACLPerPDU = rvalue._maxACLPerPDU;
     _dataURL = rvalue._dataURL;
     return *this;
 }
index 5d04ad230a36ac78b482a9b394eea78d22f61b1b..330a574ea20f9ff7d2c8e72ed37c7763d1ca28a7 100644 (file)
@@ -19,6 +19,7 @@ SettingsParser::SettingsParser()
         ("info-sync-interval,i", po::value<time_t>(), "info synchronization interval")
         ("up-profile-id", po::value<unsigned>(), "switch's upload profile id")
         ("down-profile-id", po::value<unsigned>(), "switch's download profile id")
+        ("max-acl-per-pdu", po::value<size_t>(), "maximum ACL's per PDU")
         ("data-url", po::value<std::string>(), "data access URL")
         ("version,v", "show gssmd version and exit")
     ;
@@ -78,6 +79,10 @@ void SettingsParser::init(int argc, char * argv[])
         _settings._downProfileId = vm["down-profile-id"].as<unsigned>();
     }
 
+    if (vm.count("max-acl-per-pdu")) {
+        _settings._downProfileId = vm["max-acl-per-pdu"].as<unsigned>();
+    }
+
     if (vm.count("data-url")) {
         _settings._dataURL = vm["data-url"].as<std::string>();
     }
index 64f0d0b465ffdff557401a8d84f60b27728cd53e..10514ce7cb4c960808e2f54fc5215f979be9ace6 100644 (file)
@@ -119,6 +119,9 @@ void SettingsParser::parseFile(const std::string & fileName)
     if (fieldValue(data, "sync", "down_profile_id", res)){
         _settings._downProfileId = boost::lexical_cast<unsigned>(res);
     }
+    if (fieldValue(data, "sync", "max_acl_per_pdu", res)){
+        _settings._maxACLPerPDU = boost::lexical_cast<size_t>(res);
+    }
     if (fieldValue(data, "sync", "data_url", res)){
         _settings._dataURL = res;
     }
index b70540294d9c1fa6ad4246366c17d9b99bb6e284..bf18aa3e227dd1e2006b1d9474bea0e83d47cb58 100644 (file)
@@ -174,24 +174,27 @@ bool Switch::dropACLsByTable(const CTarget & target, unsigned profileId, const S
     dropACLOidPrefix += ".";
     dropACLOidPrefix += boost::lexical_cast<std::string>(profileId);
     SNMPList aclsList(table.getList());
-    Pdu pdu;
-    SNMPList::const_iterator it;
-    for (it = aclsList.begin(); it != aclsList.end(); ++it) {
-        int id;
-        if (int c = it->get_value(id) != SNMP_CLASS_SUCCESS) {
-            logger << "Switch::dropACLsByTable() - failed to get ACL id for the switch '" << _ip << "'. Error message: '" << Snmp::error_msg(c) << "'" << std::endl;
+    SNMPList::const_iterator it(aclsList.begin());
+    size_t chunks = aclsList.size() / _settings.maxACLPerPDU() + 1;
+    for (size_t i = 0; i < chunks && it != aclsList.end(); ++i) {
+        Pdu pdu;
+        for (size_t j = 0; j < _settings.maxACLPerPDU() && it != aclsList.end(); ++j, ++it) {
+            int id;
+            if (int c = it->get_value(id) != SNMP_CLASS_SUCCESS) {
+                logger << "Switch::dropACLsByTable() - failed to get ACL id for the switch '" << _ip << "'. Error message: '" << Snmp::error_msg(c) << "'" << std::endl;
+                return false;
+            }
+            std::string dropACLOid(dropACLOidPrefix);
+            dropACLOid += ".";
+            dropACLOid += boost::lexical_cast<std::string>(id);
+            Vb vb(Oid(dropACLOid.c_str()));
+            vb.set_value(int(6));
+            pdu += vb;
+        }
+        if (int c = _snmp.set(pdu, target) != SNMP_CLASS_SUCCESS) {
+            logger << "Switch::dropACLsByTable() - failed to invoke Snmp::set for the switch '" << _ip << "'. Error message: '" << Snmp::error_msg(c) << "'" << std::endl;
             return false;
         }
-        std::string dropACLOid(dropACLOidPrefix);
-        dropACLOid += ".";
-        dropACLOid += boost::lexical_cast<std::string>(id);
-        Vb vb(Oid(dropACLOid.c_str()));
-        vb.set_value(int(6));
-        pdu += vb;
-    }
-    if (int c = _snmp.set(pdu, target) != SNMP_CLASS_SUCCESS) {
-        logger << "Switch::dropACLsByTable() - failed to invoke Snmp::set for the switch '" << _ip << "'. Error message: '" << Snmp::error_msg(c) << "'" << std::endl;
-        return false;
     }
     return true;
 }