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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. #ifndef lint
  3. static const char rcsid[] =
  4. "@(#) $Header: /cvsroot/nsnam/ns-2/link/hackloss.cc,v 1.6 2000/09/01 03:04:05 haoboy Exp $";
  5. #endif
  6. #include "connector.h"
  7. #include "packet.h"
  8. #include "queue.h"
  9. class HackLossyLink : public Connector {
  10. public:
  11. HackLossyLink() : down_(0), src_(0), dst_(0), fid_(0), ctr_(0), nth_(0){
  12. }
  13. protected:
  14. int command(int argc, const char*const* argv);
  15. void recv(Packet* p, Handler* h);
  16. NsObject* down_;
  17. int src_, dst_, fid_;
  18. int ctr_, nth_;
  19. };
  20. static class HackLossyLinkClass : public TclClass {
  21. public:
  22. HackLossyLinkClass() : TclClass("HackLossyLink") {}
  23. TclObject* create(int, const char*const*) {
  24. return (new HackLossyLink);
  25. }
  26. } class_dynamic_link;
  27. int HackLossyLink::command(int argc, const char*const* argv)
  28. {
  29. if (strcmp(argv[1], "down-target") == 0) {
  30. NsObject* p = (NsObject*)TclObject::lookup(argv[2]);
  31. if (p == 0) {
  32. Tcl::instance().resultf("no object %s", argv[2]);
  33. return TCL_ERROR;
  34. }
  35. down_ = p;
  36. return TCL_OK;
  37. }
  38. if (strcmp(argv[1], "show-params") == 0) {
  39. Tcl::instance().resultf("src_ = %d, dst_ = %d, fid_ = %d, nth_ = %d",
  40. src_, dst_, fid_, nth_);
  41. return TCL_OK;
  42. }
  43. if (strcmp(argv[1], "set-params") == 0) {
  44. src_ = atoi(argv[2]);
  45. dst_ = atoi(argv[3]);
  46. fid_ = atoi(argv[4]);
  47. return TCL_OK;
  48. }
  49. if (strcmp(argv[1], "nth") == 0) {
  50. nth_ = atoi(argv[2]);
  51. return TCL_OK;
  52. }
  53. return Connector::command(argc, argv);
  54. }
  55. void HackLossyLink::recv(Packet* p, Handler* h)
  56. {
  57. hdr_ip* iph = hdr_ip::access(p);
  58. if (nth_ && (iph->flowid() == fid_) &&
  59.     (iph->saddr() == src_) && (iph->daddr() == dst_) &&
  60.     ((++ctr_ % nth_) == 0))
  61. down_->recv(p); // XXX  Why no handler?
  62. else
  63. target_->recv(p, h);
  64. }