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

通讯编程

开发平台:

Visual C++

  1. //
  2. // log.cc         : Log Filter
  3. // author         : Fabio Silva
  4. //
  5. // Copyright (C) 2000-2002 by the University of Southern California
  6. // $Id: log.cc,v 1.2 2005/09/13 04:53:48 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. #include "log.hh"
  43. char *msg_types[] = {"INTEREST", "POSITIVE REINFORCEMENT",
  44.      "NEGATIVE REINFORCEMENT", "DATA",
  45.      "EXPLORATORY DATA", "PUSH EXPLORATORY DATA",
  46.      "CONTROL", "REDIRECT"};
  47. #ifdef NS_DIFFUSION
  48. static class LogFilterClass : public TclClass {
  49. public:
  50.   LogFilterClass() : TclClass("Application/DiffApp/LogFilter") {}
  51.   TclObject * create(int argc, const char*const* argv) {
  52.     return(new LogFilter());
  53.   }
  54. } class_log_filter;
  55. int LogFilter::command(int argc, const char*const* argv) {
  56.   if (argc == 2) {
  57.     if (strcmp(argv[1], "start") == 0) {
  58.       run();
  59.       return TCL_OK;
  60.     }
  61.   }
  62.   return DiffApp::command(argc, argv);
  63. }
  64. #endif // NS_DIFFUSION
  65. void LogFilterReceive::recv(Message *msg, handle h)
  66. {
  67.   app_->recv(msg, h);
  68. }
  69. void LogFilter::recv(Message *msg, handle h)
  70. {
  71.   if (h != filter_handle_){
  72.     DiffPrint(DEBUG_ALWAYS,
  73.       "Error: recv received message for handle %d when subscribing to handle %d !n", h, filter_handle_);
  74.     return;
  75.   }
  76.   ProcessMessage(msg);
  77.   ((DiffusionRouting *)dr_)->sendMessage(msg, h);
  78. }
  79. void LogFilter::ProcessMessage(Message *msg)
  80. {
  81.   DiffPrint(DEBUG_ALWAYS, "Received a");
  82.   if (msg->new_message_)
  83.     DiffPrint(DEBUG_ALWAYS, " new ");
  84.   else
  85.     DiffPrint(DEBUG_ALWAYS, "n old ");
  86.   if (msg->last_hop_ != LOCALHOST_ADDR)
  87.     DiffPrint(DEBUG_ALWAYS, "%s message from node %d, %d bytesn",
  88.       msg_types[msg->msg_type_], msg->last_hop_,
  89.       CalculateSize(msg->msg_attr_vec_));
  90.   else
  91.     DiffPrint(DEBUG_ALWAYS, "%s message from agent %d, %d bytesn",
  92.       msg_types[msg->msg_type_], msg->source_port_,
  93.       CalculateSize(msg->msg_attr_vec_));
  94. }
  95. handle LogFilter::setupFilter()
  96. {
  97.   NRAttrVec attrs;
  98.   handle h;
  99.   // This is a dummy attribute for filtering that matches everything
  100.   attrs.push_back(NRClassAttr.make(NRAttribute::IS, NRAttribute::INTEREST_CLASS));
  101.   h = ((DiffusionRouting *)dr_)->addFilter(&attrs, LOG_FILTER_PRIORITY,
  102.    filter_callback_);
  103.   ClearAttrs(&attrs);
  104.   return h;
  105. }
  106. void LogFilter::run()
  107. {
  108. #ifdef NS_DIFFUSION
  109.   filter_handle_ = setupFilter();
  110.   DiffPrint(DEBUG_ALWAYS, "Log filter subscribed to *, received handle %dn",
  111.     filter_handle_);
  112.   DiffPrint(DEBUG_ALWAYS, "Log filter initialized !n");
  113. #else
  114.   // Doesn't do anything
  115.   while (1){
  116.     sleep(1000);
  117.   }
  118. #endif // NS_DIFFUSION
  119. }
  120. #ifdef NS_DIFFUSION
  121. LogFilter::LogFilter()
  122. #else
  123. LogFilter::LogFilter(int argc, char **argv)
  124. #endif // NS_DIFFUSION
  125. {
  126.   // Create Diffusion Routing class
  127. #ifndef NS_DIFFUSION
  128.   parseCommandLine(argc, argv);
  129.   dr_ = NR::createNR(diffusion_port_);
  130. #endif // !NS_DIFFUSION
  131.   filter_callback_ = new LogFilterReceive(this);
  132. #ifndef NS_DIFFUSION
  133.   // Set up the filter
  134.   filter_handle_ = setupFilter();
  135.   DiffPrint(DEBUG_ALWAYS, "Log filter subscribed to *, received handle %dn", filter_handle_);
  136.   DiffPrint(DEBUG_ALWAYS, "Log filter initialized !n");
  137. #endif // !NS_DIFFUSION
  138. }
  139. #ifndef USE_SINGLE_ADDRESS_SPACE
  140. int main(int argc, char **argv)
  141. {
  142.   LogFilter *app;
  143.   // Initialize and run the Log Filter
  144.   app = new LogFilter(argc, argv);
  145.   app->run();
  146.   return 0;
  147. }
  148. #endif // !USE_SINGLE_ADDRESS_SPACE