X-Git-Url: https://git.teslayout.com/public/public/public/?p=anna.git;a=blobdiff_plain;f=source%2Fdiameter%2Fcodec%2FAvp.cpp;h=be51349b25189c37c348179f1949aab199a77e7b;hp=89884be105caee03860fcc977c7af538b9b832c9;hb=7b7396649970852a360255f1db2f044d13913e39;hpb=e80e62a5cf9aacad1a9551c68c432147ef98cd29 diff --git a/source/diameter/codec/Avp.cpp b/source/diameter/codec/Avp.cpp index 89884be..be51349 100644 --- a/source/diameter/codec/Avp.cpp +++ b/source/diameter/codec/Avp.cpp @@ -428,7 +428,9 @@ bool Avp::flagsOK() const throw() { const stack::Avp *stackAvp = getStackAvp(); if(!stackAvp) { - anna::Logger::error("Impossible to decide if flags are correct because stack avp is not identified. Assume flags ok", ANNA_FILE_LOCATION); + std::string msg = "Impossible to decide if flags are correct because stack avp is not identified. Assume flags ok for Avp "; + msg += anna::diameter::functions::avpIdAsPairString(a_id); + anna::Logger::error(msg, ANNA_FILE_LOCATION); return true; }; @@ -453,7 +455,9 @@ bool Avp::flagsOK() const throw() { // V-bit if((Vnone && Mnone && Pnone && vendorBit()) || (Vmust && !vendorBit()) || (Vmustnot && vendorBit())) { - anna::Logger::error("Vendor Bit (V) incoherence found", ANNA_FILE_LOCATION); + std::string msg = "Vendor Bit (V) incoherence found for Avp "; + msg += stackAvp->getName(); + anna::Logger::error(msg, ANNA_FILE_LOCATION); return false; } @@ -462,19 +466,25 @@ bool Avp::flagsOK() const throw() { // M-bit if((Mmust && !mandatoryBit()) || (Mmustnot && mandatoryBit())) { - anna::Logger::error("Mandatory Bit (M) incoherence found", ANNA_FILE_LOCATION); + std::string msg = "Mandatory Bit (M) incoherence found for Avp "; + msg += stackAvp->getName(); + anna::Logger::error(msg, ANNA_FILE_LOCATION); return false; } // P-bit if((Pmust && !encryptionBit()) || (Pmustnot && encryptionBit())) { - anna::Logger::error("Encryption Bit (P) incoherence found", ANNA_FILE_LOCATION); + std::string msg = "Encryption Bit (P) incoherence found for Avp "; + msg += stackAvp->getName(); + anna::Logger::error(msg, ANNA_FILE_LOCATION); return false; } // Reserved bits if((a_flags & 0x1f) != 0x00) { - anna::Logger::error("Any (or more than one) of the reserved avp flags bit has been activated. Reserved bits must be null", ANNA_FILE_LOCATION); + std::string msg = "Any (or more than one) of the reserved avp flags bit has been activated. Reserved bits must be null. Avp is "; + msg += stackAvp->getName(); + anna::Logger::error(msg, ANNA_FILE_LOCATION); return false; } @@ -1364,20 +1374,28 @@ void Avp::fromXML(const anna::xml::Node* avpNode) throw(anna::RuntimeException) // Check attributes exclusiveness if(name) { // compact mode - bool allowFlagsField = ( stackAvp->getVbit() == anna::diameter::stack::Avp::FlagRule::may || stackAvp->getVbit() == anna::diameter::stack::Avp::FlagRule::shouldnot + + if(code || vendorCode) { + std::string msg = "Error processing avp getValue(); + msg += "'>: avp attributes <'code' + 'vendorCode'> are not allowed if <'name'> is provided"; + throw anna::RuntimeException(msg, ANNA_FILE_LOCATION); + } + + // flags uncertainty: + bool flagsUncertainty = ( stackAvp->getVbit() == anna::diameter::stack::Avp::FlagRule::may || stackAvp->getVbit() == anna::diameter::stack::Avp::FlagRule::shouldnot || stackAvp->getMbit() == anna::diameter::stack::Avp::FlagRule::may || stackAvp->getMbit() == anna::diameter::stack::Avp::FlagRule::shouldnot /* umm, perhaps we could omit for bit P, whic is deprecated ... */ /* || stackAvp->getPbit() == anna::diameter::stack::Avp::FlagRule::may || stackAvp->getPbit() == anna::diameter::stack::Avp::FlagRule::shouldnot*/ ); - if(code || (flags && !allowFlagsField) || vendorCode) { - std::string msg = "Error processing avp getValue(); - if (flags) msg += "'>: avp attributes <'code' + 'flags' + 'vendorCode'> are not allowed if <'name'> is provided (also flags is not permitted: no may, no shouldnot)"; - else msg += "'>: avp attributes <'code' + 'vendorCode'> are not allowed if <'name'> is provided"; - throw anna::RuntimeException(msg, ANNA_FILE_LOCATION); + if(flags && !flagsUncertainty) { + std::string msg = "Be careful processing avp getValue(); + msg += "'> together with avp 'flags' attribute, because may/shouldnot uncertainty was not specified"; + LOGINFORMATION(Logger::information(msg, ANNA_FILE_LOCATION)); } setId(stackAvp->getId()); - if (flags && allowFlagsField) { + //if (flags && flagsUncertainty) { + if (flags) { // Flags check int i_aux = flags->getIntegerValue();