Base protocol codec for comm::Engine. Supported retransmissions
[anna.git] / include / anna / diameter / codec / functions.hpp
1 // ANNA - Anna is Not Nothingness Anymore                                                         //
2 //                                                                                                //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
4 //                                                                                                //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite                           //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7
8
9 #ifndef anna_diameter_codec_functions_hpp
10 #define anna_diameter_codec_functions_hpp
11
12
13 // Local
14 #include <anna/diameter/defines.hpp>
15
16 #include <anna/core/RuntimeException.hpp>
17
18 // STL
19 #include <string>
20 #include <vector>
21
22
23 //------------------------------------------------------------------------------
24 //---------------------------------------------------------------------- #define
25 //------------------------------------------------------------------------------
26
27 // Diameter words are four-byte size. Store n bytes requires 1 word more than former multiple of 4:
28 #define REQUIRED_WORDS(bytes)  ((bytes)/4+((((bytes)%4)!=0)?1:0 ))
29
30
31
32 namespace anna {
33 class DataBlock;
34 }
35
36
37 namespace anna {
38
39 namespace diameter {
40
41 namespace codec {
42
43
44 // Used for alarms, tracing and Failed-AVP construction:
45 typedef struct parent {
46
47   // Used on decoding:
48   anna::diameter::CommandId MessageId;
49   std::string MessageName;
50
51   std::vector<anna::diameter::AvpId> AvpsId;
52   std::vector<std::string> AvpsName;
53
54   void setMessage(const anna::diameter::CommandId & mid, const char *mname = NULL /* well known in validation */) throw();
55   void addAvp(const anna::diameter::AvpId & aid, const char *aname = NULL /* well known in validation */) throw();
56   std::string asString() const throw();
57
58 } parent_t;
59
60
61
62
63 struct functions {
64
65   // getters & helpers
66   static CommandId getCommandId(const anna::DataBlock &) throw(anna::RuntimeException);
67   static ApplicationId getApplicationId(const anna::DataBlock &) throw(anna::RuntimeException);
68   static HopByHop getHopByHop(const anna::DataBlock &) throw(anna::RuntimeException);
69   static EndToEnd getEndToEnd(const anna::DataBlock &) throw(anna::RuntimeException);
70
71   static bool requestBit(const anna::DataBlock &) throw(anna::RuntimeException);
72   static bool proxiableBit(const anna::DataBlock &) throw(anna::RuntimeException);
73   static bool errorBit(const anna::DataBlock &) throw(anna::RuntimeException);
74   static bool potentiallyReTransmittedMessageBit(const anna::DataBlock &) throw(anna::RuntimeException);
75
76   static bool isRequest(const CommandId & cid) throw() { return (cid.second); }
77   static bool isRequest(const anna::DataBlock & db) throw(anna::RuntimeException) { return requestBit(db); }
78
79   static bool isAnswer(const CommandId & cid) throw() { return (!isRequest(cid)); }
80   static bool isAnswer(const anna::DataBlock & db) throw(anna::RuntimeException) { return (!isRequest(db)); }
81
82
83
84   /**
85   * Decodes a Command Header. This helper cannot check boundaries. start pointer must be a valid command context.
86   *
87   * @param start Must be a valid command start (point to the command version byte).
88   * @param version Diameter version.
89   * @param length Message length.
90   * @param flags Command flags.
91   * @param id Command identification (code, request<true,false>).
92   * @param appId Application-ID.
93   * @param hbh Hop-by-Hop Identifier.
94   * @param ete End-to-End Identifier.
95   */
96   static void decodeCommandHeader(const char *start, char & version, U24 & length, char & flags, CommandId & id, int & appId, int & hbh, int & ete) throw(anna::RuntimeException);
97
98   /**
99   * Decodes an AVP. This helper cannot check boundaries. start pointer must be a valid avp context.
100   *
101   * @param start Must be a valid avp start (point to the 32-bits avp code word).
102   * @param id Avp identification (code, vendorId).
103   * @param flags Avp flags byte.
104   * @param length Avp length (includes code, flags, length itself, vendorId if exists and data length).
105   * @param data Avp data part.
106   */
107   static void decodeAVP(const char *start, AvpId & id, char & flags, int & length, std::string & data) throw(anna::RuntimeException);
108
109   /**
110   * Gets the next AVP pointer reference starting from a first-avp datablock. It could be the first avp within
111   * a command, or within an grouped avp.
112   *
113   * @param avpsDB AVPs set as datablock
114   * @param start Point to start the search. Must be a valid avp start (point to the 32-bits avp code word).
115   *
116   * @return Pointer to the next AVP found. NULL if no more.
117   */
118   static const char * nextAVP(const anna::DataBlock & avpsDB, const char *start) throw(anna::RuntimeException);
119
120   /**
121   * Gets the next AVP pointer reference within an AVPs set datablock with a certain AVP identification.
122   *
123   * @param avpsDB AVPs set as datablock
124   * @param id Avp identification (code, vendorId).
125   * @param n Ocurrence number (first avp, second avp, etc.)
126   *
127   * @return Pointer to first AVP found with identification provided. NULL if not found.
128   */
129   static const char * findAVP(const anna::DataBlock & avpsDB, const AvpId & id, int n = 1) throw(anna::RuntimeException);
130
131
132
133   // modifiers
134   static void setHopByHop(anna::DataBlock &, HopByHop) throw(anna::RuntimeException);
135   static void setEndToEnd(anna::DataBlock &, EndToEnd) throw(anna::RuntimeException);
136   static void setPotentiallyReTransmittedMessageBit(const anna::DataBlock & db, bool activate = true) throw(anna::RuntimeException);
137 };
138
139
140 }
141 }
142 }
143
144
145 #endif
146