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;
};
// 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;
}
// 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;
}
// 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 <name '"; msg += name->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 <name '"; msg += name->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 <name '"; msg += name->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();
int i_aux = code->getIntegerValue();
if(i_aux < 0) {
- std::string msg = "Error processing avp <code '"; msg += code->getValue();
- msg += "': negative values are not allowed";
- throw anna::RuntimeException(msg, ANNA_FILE_LOCATION);
+ LOGWARNING(
+ std::string msg = "Error processing avp <code '"; msg += code->getValue();
+ msg += "': negative value read from xml";
+ anna::Logger::warning(msg, ANNA_FILE_LOCATION);
+ );
}
U24 u_code = i_aux;