X-Git-Url: https://git.teslayout.com/public/public/public/?a=blobdiff_plain;f=include%2Fanna%2Fdiameter%2Fcodec%2Ffunctions.hpp;h=44a8f15b334c62389fa7ebc65a036eafd3238d4a;hb=4c3f0a4d7e4db76996404d80c6f939548fca656f;hp=3bd66a37b431b309eb0538c9a0aa02389b017a01;hpb=3e258840b15577cb8bda3cdedd0b9b88e16404b3;p=anna.git diff --git a/include/anna/diameter/codec/functions.hpp b/include/anna/diameter/codec/functions.hpp index 3bd66a3..44a8f15 100644 --- a/include/anna/diameter/codec/functions.hpp +++ b/include/anna/diameter/codec/functions.hpp @@ -1,37 +1,9 @@ -// ANNA - Anna is Not Nothingness Anymore -// -// (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo -// -// https://bitbucket.org/testillano/anna -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Authors: eduardo.ramos.testillano@gmail.com -// cisco.tierra@gmail.com +// ANNA - Anna is Not Nothingness Anymore // +// // +// (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo // +// // +// See project site at http://redmine.teslayout.com/projects/anna-suite // +// See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE // #ifndef anna_diameter_codec_functions_hpp @@ -45,6 +17,8 @@ // STL #include +#include + //------------------------------------------------------------------------------ //---------------------------------------------------------------------- #define @@ -67,6 +41,25 @@ namespace diameter { namespace codec { +// Used for alarms, tracing and Failed-AVP construction: +typedef struct parent { + + // Used on decoding: + anna::diameter::CommandId MessageId; + std::string MessageName; + + std::vector AvpsId; + std::vector AvpsName; + + void setMessage(const anna::diameter::CommandId & mid, const char *mname = NULL /* well known in validation */) throw(); + void addAvp(const anna::diameter::AvpId & aid, const char *aname = NULL /* well known in validation */) throw(); + std::string asString() const throw(); + +} parent_t; + + + + struct functions { // getters & helpers @@ -75,12 +68,19 @@ struct functions { static HopByHop getHopByHop(const anna::DataBlock &) throw(anna::RuntimeException); static EndToEnd getEndToEnd(const anna::DataBlock &) throw(anna::RuntimeException); + static bool requestBit(const anna::DataBlock &) throw(anna::RuntimeException); + static bool proxiableBit(const anna::DataBlock &) throw(anna::RuntimeException); + static bool errorBit(const anna::DataBlock &) throw(anna::RuntimeException); + static bool potentiallyReTransmittedMessageBit(const anna::DataBlock &) throw(anna::RuntimeException); + static bool isRequest(const CommandId & cid) throw() { return (cid.second); } - static bool isRequest(const anna::DataBlock &) throw(anna::RuntimeException); + static bool isRequest(const anna::DataBlock & db) throw(anna::RuntimeException) { return requestBit(db); } static bool isAnswer(const CommandId & cid) throw() { return (!isRequest(cid)); } static bool isAnswer(const anna::DataBlock & db) throw(anna::RuntimeException) { return (!isRequest(db)); } + + /** * Decodes a Command Header. This helper cannot check boundaries. start pointer must be a valid command context. * @@ -107,32 +107,57 @@ struct functions { static void decodeAVP(const char *start, AvpId & id, char & flags, int & length, std::string & data) throw(anna::RuntimeException); /** - * Gets the next AVP pointer reference starting from a first-avp datablock. It could be the first avp within + * Gets the next AVP pointer reference starting from a first-avp data block. It could be the first avp within * a command, or within an grouped avp. * - * @param avpsDB AVPs set as datablock + * @param avpsDB AVP data block buffer pointer + * @param avpsLen AVP data block buffer length * @param start Point to start the search. Must be a valid avp start (point to the 32-bits avp code word). * * @return Pointer to the next AVP found. NULL if no more. */ - static const char * nextAVP(const anna::DataBlock & avpsDB, const char *start) throw(anna::RuntimeException); + static const char * nextAVP(const char *avpsDB, int avpsLen, const char *start) throw(anna::RuntimeException); + +// /** +// * Gets the next AVP pointer reference starting from a first-avp datablock. It could be the first avp within +// * a command, or within an grouped avp. +// * +// * @param avpsDB AVPs set as datablock +// * @param start Point to start the search. Must be a valid avp start (point to the 32-bits avp code word). +// * +// * @return Pointer to the next AVP found. NULL if no more. +// */ +// static const char * nextAVP(const anna::DataBlock & avpsDB, const char *start) throw(anna::RuntimeException); /** - * Gets the next AVP pointer reference within an AVPs set datablock with a certain AVP identification. + * Gets the next AVP pointer reference within an AVPs set data block with a certain AVP identification. * - * @param avpsDB AVPs set as datablock + * @param avpsDB AVP data block buffer pointer + * @param avpsLen AVP data block buffer length * @param id Avp identification (code, vendorId). - * @param n Ocurrence number (first avp, second avp, etc.) + * @param n Ocurrence number (first avp, second avp, etc.). 1 by default. * * @return Pointer to first AVP found with identification provided. NULL if not found. */ - static const char * findAVP(const anna::DataBlock & avpsDB, const AvpId & id, int n = 1) throw(anna::RuntimeException); + static const char *findAVP(const char *avpsDB, int avpsLen, const diameter::AvpId & id, int n = 1) throw(anna::RuntimeException); + +// /** +// * Gets the next AVP pointer reference within an AVPs set datablock with a certain AVP identification. +// * +// * @param avpsDB AVPs set as datablock +// * @param id Avp identification (code, vendorId). +// * @param n Ocurrence number (first avp, second avp, etc.). 1 by default. +// * +// * @return Pointer to first AVP found with identification provided. NULL if not found. +// */ +// static const char * findAVP(const anna::DataBlock & avpsDB, const AvpId & id, int n = 1) throw(anna::RuntimeException); // modifiers static void setHopByHop(anna::DataBlock &, HopByHop) throw(anna::RuntimeException); static void setEndToEnd(anna::DataBlock &, EndToEnd) throw(anna::RuntimeException); + static void setPotentiallyReTransmittedMessageBit(const anna::DataBlock & db, bool activate = true) throw(anna::RuntimeException); };