[5641] | 1 | /// ----------------------------------------*- mode: C++; -*--
|
---|
| 2 | /// @file tp.cpp
|
---|
| 3 | /// generic interface for sending/receiving network messages via a transport protocol
|
---|
| 4 | /// ----------------------------------------------------------
|
---|
| 5 | /// $Id: tp.cpp 2872 2008-02-18 10:58:03Z bless $
|
---|
| 6 | /// $HeadURL: https://svn.ipv6.tm.uka.de/nsis/protlib/trunk/src/tp.cpp $
|
---|
| 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 transport
|
---|
| 31 | * This is the interface for sending network messages over a transport
|
---|
| 32 | * protocol. You can receive messages through queues.
|
---|
| 33 | */
|
---|
| 34 |
|
---|
| 35 | #include "tp.h"
|
---|
| 36 | #include "threadsafe_db.h"
|
---|
| 37 | #include "logfile.h"
|
---|
| 38 |
|
---|
| 39 | namespace protlib {
|
---|
| 40 |
|
---|
| 41 | /** @addtogroup transport Transport Protocol
|
---|
| 42 | * @ingroup network
|
---|
| 43 | * @{
|
---|
| 44 | */
|
---|
| 45 |
|
---|
| 46 | using namespace log;
|
---|
| 47 |
|
---|
| 48 |
|
---|
| 49 | /***** class TP *****/
|
---|
| 50 |
|
---|
| 51 | /** Set ID of the underlying transport protocol, e.g. TCP, SCTP or UDP.
|
---|
| 52 | * Init is set false here, set to true in constructors of derived classes if
|
---|
| 53 | * initialization is done.
|
---|
| 54 | * If the maximum payload is greater than the maximum size of a network
|
---|
| 55 | * message, it is decreased.
|
---|
| 56 | */
|
---|
| 57 | TP::TP(protocol_t p, const string& pname, const string& tpn,
|
---|
| 58 | const unsigned short common_header_length,
|
---|
| 59 | bool (*const getmsglength)(NetMsg& netmsg, uint32& msglen),
|
---|
| 60 | uint32 mp)
|
---|
| 61 | : protocol(p), protoname(pname), tp_name(tpn),
|
---|
| 62 | common_header_length(common_header_length),
|
---|
| 63 | getmsglength(getmsglength),
|
---|
| 64 | init(false),
|
---|
| 65 | max_payload((mp<NetMsg::max_size)?mp:(NetMsg::max_size))
|
---|
| 66 | {}
|
---|
| 67 |
|
---|
| 68 | /** TP destructor does nothing. */
|
---|
| 69 | TP::~TP() { init = false; }
|
---|
| 70 |
|
---|
| 71 | /** Get the ID of the underlying transport protocol. */
|
---|
| 72 | protocol_t TP::get_underlying_protocol() const { return protocol; }
|
---|
| 73 |
|
---|
| 74 | /** Get the name of the underlying transport protocol. */
|
---|
| 75 | string TP::get_underlying_protocol_name() const { return protoname; }
|
---|
| 76 |
|
---|
| 77 | /** Get the name of this TP implementation. */
|
---|
| 78 | string TP::get_tp_name() const { return tp_name; }
|
---|
| 79 |
|
---|
| 80 | uint32 TP::get_max_payload() const { return max_payload; }
|
---|
| 81 |
|
---|
| 82 | /* @param msg NetMsg to send
|
---|
| 83 | * @param addr destination address
|
---|
| 84 | * @return true if args are OK.
|
---|
| 85 | */
|
---|
| 86 |
|
---|
| 87 | void TP::check_send_args(const NetMsg& msg, const address& addr)
|
---|
| 88 | const {
|
---|
| 89 | if (!init) {
|
---|
| 90 | Log(ERROR_LOG,LOG_NORMAL, "TP", "TP::check_send_args: " << tp_name << " not initialized");
|
---|
| 91 | throw TPErrorArgsNotInit();
|
---|
| 92 | } // end if not init
|
---|
| 93 |
|
---|
| 94 | if ((msg.get_size()==0) || (msg.get_size()>max_payload)) {
|
---|
| 95 | Log(ERROR_LOG,LOG_NORMAL, "TP", "TP::check_send_args: NetMsg empty or too big. Size: " << msg.get_size() << ", " << tp_name << ", max_payload " << max_payload);
|
---|
| 96 | throw TPErrorPayload();
|
---|
| 97 | } // end if too big
|
---|
| 98 |
|
---|
| 99 | } // end check_send_args
|
---|
| 100 |
|
---|
| 101 |
|
---|
| 102 | //@}
|
---|
| 103 |
|
---|
| 104 | } // end namespace protlib
|
---|