message.hh
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:6k
源码类别:

通讯编程

开发平台:

Visual C++

  1. // 
  2. // message.hh    : Message definitions
  3. // authors       : Fabio Silva
  4. //
  5. // Copyright (C) 2000-2003 by the University of Southern California
  6. // $Id: message.hh,v 1.8 2005/09/13 04:53:50 tomh Exp $
  7. //
  8. // This program is free software; you can redistribute it and/or
  9. // modify it under the terms of the GNU General Public License,
  10. // version 2, as published by the Free Software Foundation.
  11. //
  12. // This program is distributed in the hope that it will be useful,
  13. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. // GNU General Public License for more details.
  16. //
  17. // You should have received a copy of the GNU General Public License along
  18. // with this program; if not, write to the Free Software Foundation, Inc.,
  19. // 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  20. //
  21. // Linking this file statically or dynamically with other modules is making
  22. // a combined work based on this file.  Thus, the terms and conditions of
  23. // the GNU General Public License cover the whole combination.
  24. //
  25. // In addition, as a special exception, the copyright holders of this file
  26. // give you permission to combine this file with free software programs or
  27. // libraries that are released under the GNU LGPL and with code included in
  28. // the standard release of ns-2 under the Apache 2.0 license or under
  29. // otherwise-compatible licenses with advertising requirements (or modified
  30. // versions of such code, with unchanged license).  You may copy and
  31. // distribute such a system following the terms of the GNU GPL for this
  32. // file and the licenses of the other code concerned, provided that you
  33. // include the source code of that other code when and as the GNU GPL
  34. // requires distribution of source code.
  35. //
  36. // Note that people who make modified versions of this file are not
  37. // obligated to grant this special exception for their modified versions;
  38. // it is their choice whether to do so.  The GNU General Public License
  39. // gives permission to release a modified version without this exception;
  40. // this exception also makes it possible to release a modified version
  41. // which carries forward this exception.
  42. // This file defines the Message class, used inside a node to
  43. // represent a diffusion message. It contains all elements from the
  44. // packet header in addition to the packet's attributes. The Message
  45. // class also contains other flags that are not part of diffusion
  46. // packets. new_message_ indicates if this packet/message was seen in
  47. // the past, indicating a loop (this is set by diffusion upon
  48. // receiving the packet). next_port_ is used by the Filter API to
  49. // indicate the packet's next destination.
  50. //
  51. // This file also defines two other attributes (ControlMsgAttr and
  52. // OriginalHdrAttr) and two classes (ControlMessage and
  53. // OriginalHeader). These are used when sending packets/messages from
  54. // the diffusion core to the library API.
  55. //
  56. // The function CopyMessage can be used to copy a message. It returns
  57. // a pointer to the newly created message. The original message is not
  58. // changed.
  59. #ifndef _MESSAGE_HH_
  60. #define _MESSAGE_HH_
  61. #ifdef HAVE_CONFIG_H
  62. #include "config.h"
  63. #endif // HAVE_CONFIG_H
  64. #include "nr/nr.hh"
  65. #include "header.hh"
  66. #include "attrs.hh"
  67. class Message {
  68. public:
  69.   // Read directly from the packet header
  70.   int8_t  version_;
  71.   int8_t  msg_type_;
  72.   u_int16_t source_port_;
  73.   int16_t data_len_;
  74.   int16_t num_attr_;
  75.   int32_t pkt_num_;
  76.   int32_t rdm_id_;
  77.   int32_t next_hop_;
  78.   int32_t last_hop_;
  79.   // Added variables
  80.   int new_message_;
  81.   u_int16_t next_port_;
  82.   // Message attributes
  83.   NRAttrVec *msg_attr_vec_;
  84.   Message(int8_t version, int8_t msg_type, u_int16_t source_port,
  85.   u_int16_t data_len, u_int16_t num_attr, int32_t pkt_num,
  86.   int32_t rdm_id, int32_t next_hop, int32_t last_hop) :
  87.     version_(version),
  88.     msg_type_(msg_type),
  89.     source_port_(source_port),
  90.     data_len_(data_len),
  91.     num_attr_(num_attr),
  92.     pkt_num_(pkt_num),
  93.     rdm_id_(rdm_id),
  94.     next_hop_(next_hop),
  95.     last_hop_(last_hop)
  96.   {
  97.     msg_attr_vec_ = NULL;
  98.     next_port_ = 0;
  99.     new_message_ = 1;             // New message by default, will be changed
  100.                                   // later if message is found to be old
  101.   }
  102.   ~Message()
  103.   {
  104.     if (msg_attr_vec_){
  105.       ClearAttrs(msg_attr_vec_);
  106.       delete msg_attr_vec_;
  107.     }
  108.   }
  109. };
  110. extern NRSimpleAttributeFactory<void *> ControlMsgAttr;
  111. extern NRSimpleAttributeFactory<void *> OriginalHdrAttr;
  112. #define CONTROL_MESSAGE_KEY  1400
  113. #define ORIGINAL_HEADER_KEY  1401
  114. // Control Message types
  115. typedef enum ctl_t_ {
  116.   ADD_UPDATE_FILTER,
  117.   REMOVE_FILTER,
  118.   SEND_MESSAGE,
  119.   ADD_TO_BLACKLIST,
  120.   CLEAR_BLACKLIST
  121. } ctl_t;
  122. class ControlMessage {
  123. public:
  124.   ControlMessage(int32_t command, int32_t param1, int32_t param2) :
  125.     command_(command), param1_(param1), param2_(param2) {};
  126.   int32_t command_;
  127.   int32_t param1_;
  128.   int32_t param2_;
  129. };
  130. class RedirectMessage {
  131. public:
  132.   RedirectMessage(int8_t new_message, int8_t msg_type, u_int16_t source_port,
  133.   u_int16_t data_len, u_int16_t num_attr, int32_t rdm_id,
  134.   int32_t pkt_num, int32_t next_hop, int32_t last_hop,
  135.   int32_t handle, u_int16_t next_port) :
  136.     new_message_(new_message), msg_type_(msg_type), source_port_(source_port),
  137.     data_len_(data_len), num_attr_(num_attr), rdm_id_(rdm_id),
  138.     pkt_num_(pkt_num), next_hop_(next_hop), last_hop_(last_hop),
  139.     handle_(handle), next_port_(next_port) {};
  140.   int8_t  new_message_;
  141.   int8_t  msg_type_;
  142.   u_int16_t source_port_;
  143.   u_int16_t data_len_;
  144.   u_int16_t num_attr_;
  145.   int32_t rdm_id_;
  146.   int32_t pkt_num_;
  147.   int32_t next_hop_;
  148.   int32_t last_hop_;
  149.   int32_t handle_;
  150.   u_int16_t next_port_;
  151. };
  152. Message * CopyMessage(Message *msg);
  153. #endif // !_MESSAGE_HH_