An Overlay-based
Virtual Network Substrate
SpoVNet

source: trash/old-modules/transport/protlib/network_message.h @ 5641

Last change on this file since 5641 was 5641, checked in by Christoph Mayer, 14 years ago
File size: 5.3 KB
Line 
1/// ----------------------------------------*- mode: C++; -*--
2/// @file network_message.h
3/// generic class for network messages (PDUs coming from/going to network)
4/// ----------------------------------------------------------
5/// $Id: network_message.h 3247 2008-07-28 20:54:54Z bless $
6/// $HeadURL: https://svn.ipv6.tm.uka.de/nsis/protlib/trunk/include/network_message.h $
7// ===========================================================
8//                     
9// Copyright (C) 2005-2007, all rights reserved by
10// - Institute of Telematics, Universitaet Karlsruhe (TH)
11//
12// More information and contact:
13// https://projekte.tm.uka.de/trac/NSIS
14//                     
15// This program is free software; you can redistribute it and/or modify
16// it under the terms of the GNU General Public License as published by
17// the Free Software Foundation; version 2 of the License
18//
19// This program is distributed in the hope that it will be useful,
20// but WITHOUT ANY WARRANTY; without even the implied warranty of
21// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22// GNU General Public License for more details.
23//
24// You should have received a copy of the GNU General Public License along
25// with this program; if not, write to the Free Software Foundation, Inc.,
26// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27//
28// ===========================================================
29
30/** @ingroup networkmsg
31 *
32 * This is a generic class for network messages.
33 * A network message consists of a number of bytes.
34 * There are no access member functions. So the user has full control over
35 * the buffer.
36 */
37 
38#ifndef _PROTLIB__NETWORK_MESSAGE_H_
39#define _PROTLIB__NETWORK_MESSAGE_H_
40
41#include <netinet/in.h>
42#include <string>
43#include <ostream>
44
45#include "protlib_types.h"
46
47namespace protlib {
48
49/** @addtogroup networkmsg Network Messages
50 * @ingroup network
51 * @{
52 */
53
54class NetMsgError : public ProtLibException {
55public:
56        enum error_t {
57                ERROR_TOO_LONG,
58                ERROR_NO_MEM,
59                ERROR_INVALID_POS,
60                ERROR_NULL_POINTER,
61                ERROR_INVALID_START_OFFSET,
62                ERROR_TOO_SHORT,
63                ERROR_INVALID_BUFSIZE
64        };
65        NetMsgError(error_t e);
66        const char * getstr() const;
67        virtual const char *what() const throw() { return getstr(); }
68        const error_t err;
69private:
70        static const char* const errstr[];
71}; // end NetMsgError
72
73/// network message
74/** This class is used to exchange data between signalling and transport
75* protocol.
76*/
77class NetMsg {
78public:
79        static const uint32 max_size;
80        /// constructor
81        NetMsg(uint32 s);
82        /// constructor
83        NetMsg(uchar *b, uint32 s, bool copy = true);
84        /// copy constructor
85        NetMsg(const NetMsg& n);
86        /// destructor
87        ~NetMsg();
88        /// get buffer size
89        uint32 get_size() const;
90        /// get bytes left until buffer ends
91        uint32 get_bytes_left() const;
92        /// get pointer offset
93        uint32 get_pos() const;
94        /// move pointer to offset
95        NetMsg& set_pos(uint32 p);
96        /// move pointer relative
97        NetMsg& set_pos_r(int32 rp);
98        /// set pointer to beginning
99        NetMsg& to_start();
100        /// copy into NetMsg buffer
101        uint32 copy_from(const uchar *b, uint32 n);
102        /// copy into NetMsg buffer
103        uint32 copy_from(const uchar *b, uint32 start, uint32 end);
104        /// copy from NetMsg buffer
105        uint32 copy_to(uchar *b, uint32 n) const;
106        /// copy from NetMsg buffer
107        uint32 copy_to(uchar *b, uint32 start, uint32 n) const;
108        /// get pointer to buffer
109        uchar* get_buffer() const;
110        /// decode uint8
111        uint8 decode8(bool move = true);
112        /// decode uint16
113        uint16 decode16(bool move = true);
114        /// decode uint32
115        uint32 decode32(bool move = true);
116        /// decode uint64
117        uint64 decode64(bool move = true);
118        /// decode uint128
119        uint128 decode128(bool move = true);
120        /// encode uint8
121        void encode8(uint8 i, bool move = true);
122        /// encode uint16
123        void encode16(uint16 i, bool move = true);
124        /// encode uint32
125        void encode32(uint32 i, bool move = true);
126        /// encode uint64
127        void encode64(uint64 i, bool move = true);
128        /// encode uint128
129        void encode128(uint128 i, bool move = true);
130        /// decode uchars
131        void decode(uchar *c, uint32 len, bool move = true);
132        /// encode uchars
133        void encode(const uchar *c, uint32 len, bool move = true);
134        /// decode string
135        uint32 decode(string& s, uint32 len, bool move = true);
136        /// encode string
137        uint32 encode(const string& s, bool move = true);
138        /// decode IPv4
139        void decode(struct in_addr& in, bool move = true);
140        /// encode IPv4
141        void encode(const struct in_addr& in, bool move = true);
142        /// decode IPv6
143        void decode(struct in6_addr& in, bool move = true);
144        /// encode IPv6
145        void encode(const struct in6_addr& in, bool move = true);
146        /// truncate buffer
147        uint32 truncate();
148        /// truncate buffer
149        uint32 truncate(uint32 t);
150        /// apply padding
151        void padding(uint32 len, bool move = true);
152        /// test for equality
153        bool operator==(const NetMsg& n) const;
154        /// encode a NetMsg into this NetMsg
155        void encode(const NetMsg& m, uint32 len, bool move = true);
156        /// decode a NetMsg from this NetMsg
157        void decode(NetMsg& m, bool move = true);
158        /// print a raw hexdump of the buffer
159        ostream& hexdump(ostream& os, uchar *startpos=0, uint32 length=0) const;
160
161private:
162        /// buffer for data
163        uchar *buf;
164        /// buffer size
165        uint32 buf_len;     
166        /// current reading/writing position
167        uchar *pos;
168        /// buffer end
169        /** Ponter to the last byte of the buffer. */   
170        uchar *buf_end;
171};
172
173inline std::ostream &operator<<(std::ostream &out, const NetMsg &msg) {
174        msg.hexdump(out);
175        return out;
176}
177
178//@}
179
180} // namespace protlib
181
182#endif // _PROTLIB__NETWORK_MESSAGE_H_
Note: See TracBrowser for help on using the repository browser.