An Overlay-based
Virtual Network Substrate
SpoVNet

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

Last change on this file since 5641 was 5641, checked in by Christoph Mayer, 14 years ago
File size: 6.3 KB
Line 
1/// ----------------------------------------*- mode: C++; -*--
2/// @file tp_over_udp.h
3/// Transport over UDP
4/// ----------------------------------------------------------
5/// $Id: tp_over_udp.h 2718 2007-07-24 03:23:14Z bless $
6/// $HeadURL: https://svn.ipv6.tm.uka.de/nsis/protlib/trunk/include/tp_over_udp.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/** @ingroup tpudp
30 * @ file
31 * TP over UDP
32 */
33
34#ifndef TP_OVER_UDP_H
35#define TP_OVER_UDP_H
36
37#include <ext/hash_map>
38
39#include "tp.h"
40#include "threads.h"
41#include "threadsafe_db.h"
42#include "connectionmap.h"
43#include "assocdata.h"
44
45namespace protlib
46{
47/** this struct conatains parameters that determine
48  * the behavior of listener and receiver threads in TPoverUDP
49  * @param port - port number for master listener thread (server port)
50  * @param sleep - time (in ms) that listener and receiver wait at a poll() call
51  * @param d - destination module, where internal message are sent
52  */
53struct TPoverUDPParam : public ThreadParam
54{
55  /// constructor
56    TPoverUDPParam(
57                 unsigned short common_header_length,
58                 bool (*const getmsglength) (NetMsg& m, uint32& clen_words),
59                 port_t listen_port,
60                 uint32 sleep = ThreadParam::default_sleep_time,
61                 bool debug_pdu = false,
62                 message::qaddr_t source = message::qaddr_tp_over_udp,
63                 message::qaddr_t dest = message::qaddr_signaling,
64                 bool sendaborts = false,
65                 uint8 tos = 0x10) :
66    ThreadParam(sleep,"TPoverUDP",1,1),
67    port(listen_port),
68    debug_pdu(debug_pdu),
69    source(source),
70    dest(dest),
71    common_header_length(common_header_length),
72    getmsglength(getmsglength),
73    terminate(false),
74    ip_tos(tos)
75        {};
76
77    /// port to bind master listener thread to
78    const port_t port;
79    bool debug_pdu;
80    /// message source
81    const message::qaddr_t source;
82    const message::qaddr_t dest;
83    /// what is the length of the common header
84    const unsigned short common_header_length;
85   
86    /// function pointer to a function that figures out the msg length in number of 4 byte words
87    /// it returns false if error occured (e.g., malformed header), result is returned in variable clen_words
88    bool (*const getmsglength) (NetMsg& m, uint32& clen_words);
89   
90    /// should master thread terminate?
91    const bool terminate;
92    const uint8 ip_tos;
93   
94    bool (*rao_lookup) (uint32);
95   
96   
97}; // end TPoverUDPParam
98   
99
100/// TP over UDP
101/** This class implements the TP interface using UDP. */
102class TPoverUDP : public TP, public Thread
103{
104/***** inherited from TP *****/
105public:
106  /// sends a network message, spawns receiver thread if necessary
107  virtual void send(NetMsg* msg, const address& addr, bool use_existing_connection);
108  virtual void terminate(const address& addr);
109 
110  /***** inherited from Thread *****/
111public:
112  /// main loop
113  virtual void main_loop(uint32 nr);
114 
115/***** other members *****/
116public:
117  /// constructor
118  TPoverUDP(const TPoverUDPParam& p) :
119    TP(tsdb::getprotobyname("udp"),"udp",p.name,p.common_header_length,p.getmsglength),
120    Thread(p), tpparam(p), already_aborted(false), msgqueue(NULL), debug_pdu(p.debug_pdu),
121    master_listener_socket(-1)
122  { 
123    // perform some initializing actions
124    // currently not required (SCTP had to init its library)
125    init= true; ///< init done;
126  }
127  /// virtual destructor
128  virtual ~TPoverUDP();
129
130  class sender_thread_start_arg_t
131  {
132  public:
133    TPoverUDP* instance;
134    FastQueue* sender_thread_queue;
135   
136    sender_thread_start_arg_t(TPoverUDP* instance, FastQueue* sq) :
137      instance(instance), sender_thread_queue(sq) {};
138  };
139
140  int get_listener_socket() const { return master_listener_socket; }
141 
142private:
143
144
145  /// send a message to the network via UDP
146  void udpsend(NetMsg* msg, appladdress* addr);
147 
148  /// a static starter method to invoke the listener thread
149  static void* listener_thread_starter(void *argp);
150
151  /// listener thread procedure
152  void listener_thread();
153
154  /// terminates all active receiver or sender threads
155  void terminate_all_threads();
156 
157  /// parameters for main TPoverUDP thread
158  const TPoverUDPParam tpparam;
159 
160  /// did we already abort at thread shutdown
161  bool already_aborted;
162  /// message queue
163  FastQueue* msgqueue;
164 
165  bool debug_pdu;
166
167  int master_listener_socket;
168
169}; // end class TPoverUDP
170
171/** A simple internal message for selfmessages
172 * please note that carried items may get deleted after use of this message
173 * the message destructor does not delete any item automatically
174 */
175class TPoverUDPMsg : public message
176{
177 public:
178  // message type start/stop thread, send data
179  enum msg_t { start, 
180               stop,
181               send_data
182  };
183
184 private:
185  const AssocData* peer_assoc;
186  const TPoverUDPMsg::msg_t type;
187  NetMsg* netmsg;
188  appladdress* addr;
189
190public:
191  TPoverUDPMsg(const AssocData* peer_assoc, message::qaddr_t source= qaddr_unknown, TPoverUDPMsg::msg_t type= stop) : 
192    message(type_transport, source), peer_assoc(peer_assoc), type(type), netmsg(0), addr(0)  {}
193
194  TPoverUDPMsg(NetMsg* netmsg, appladdress* addr, message::qaddr_t source= qaddr_unknown) : 
195    message(type_transport, source), peer_assoc(0), type(send_data), netmsg(netmsg), addr(addr) {}
196
197  const AssocData* get_peer_assoc() const { return peer_assoc; }
198  TPoverUDPMsg::msg_t get_msgtype() const { return type; }
199  NetMsg* get_netmsg() const { return netmsg; }
200  appladdress* get_appladdr() const { return addr; } 
201};
202
203} // end namespace protlib
204
205#endif
Note: See TracBrowser for help on using the repository browser.