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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) Sun Microsystems, Inc. 1998 All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  *
  12.  * 2. Redistributions in binary form must reproduce the above copyright
  13.  *    notice, this list of conditions and the following disclaimer in the
  14.  *    documentation and/or other materials provided with the distribution.
  15.  *
  16.  * 3. All advertising materials mentioning features or use of this software
  17.  *    must display the following acknowledgement:
  18.  *      This product includes software developed by Sun Microsystems, Inc.
  19.  *
  20.  * 4. The name of the Sun Microsystems, Inc nor may not be used to endorse or
  21.  *      promote products derived from this software without specific prior
  22.  *      written permission.
  23.  *
  24.  * SUN MICROSYSTEMS MERCHANTABILITY OF THIS SOFTWARE OR THE SUITABILITY OF THIS
  25.  * SOFTWARE FOR ANY PARTICULAR PURPOSE.  The software is provided "as is"
  26.  * without express or implied warranty of any kind.
  27.  *
  28.  * These notices must be retained in any copies of any part of this software.
  29.  */
  30. // #ident "@(#)mip.cc  1.4     98/08/21 SMI"
  31. #include <address.h>
  32. #include "mip.h"
  33. #define IP_HEADER_SIZE 20
  34. int hdr_ipinip::offset_;
  35. static class IPinIPHeaderClass : public PacketHeaderClass {
  36. public:
  37.         IPinIPHeaderClass() : PacketHeaderClass("PacketHeader/IPinIP",
  38.     sizeof(hdr_ipinip*)) {
  39. bind_offset(&hdr_ipinip::offset_);
  40. }
  41. } class_ipiniphdr;
  42. static class MIPEncapsulatorClass : public TclClass {
  43. public:
  44. MIPEncapsulatorClass() : TclClass("MIPEncapsulator") {}
  45. TclObject* create(int, const char*const*) {
  46. return (new MIPEncapsulator());
  47. }
  48. } class_mipencapsulator;
  49. MIPEncapsulator::MIPEncapsulator() : Connector(), mask_(0xffffffff), 
  50. shift_(8), defttl_(32)
  51. {
  52. bind("addr_", (int*)&(here_.addr_));
  53. bind("port_", (int*)&(here_.port_));
  54. bind("shift_", &shift_);
  55. bind("mask_", &mask_);
  56. bind("ttl_", &defttl_);
  57. }
  58. void MIPEncapsulator::recv(Packet* p, Handler *h)
  59. {
  60. Tcl& tcl = Tcl::instance();
  61. hdr_ip* hdr = hdr_ip::access(p);
  62. hdr_ipinip **ppinhdr = (hdr_ipinip**)hdr_ipinip::access(p);
  63. if (--hdr->ttl_ <= 0) {
  64. /*
  65.  * XXX this should be "dropped" somehow.  Right now,
  66.  * these events aren't traced.
  67.  */
  68. hdr_ipinip *ptr = *ppinhdr, *temp;
  69. while (ptr != NULL) {
  70. temp = ptr;
  71. ptr = ptr->next_;
  72. delete temp;
  73. }
  74. *ppinhdr = NULL;
  75. Packet::free(p);
  76. return;
  77. }
  78. hdr_ipinip *inhdr = new hdr_ipinip;
  79. //int dst = ((hdr->dst() >> shift_) & mask_);
  80. int dst = Address::instance().get_nodeaddr(hdr->daddr());
  81. tcl.evalf("%s tunnel-exit %d", name_, dst);
  82. int te = atoi(tcl.result());
  83. inhdr->next_ = *ppinhdr;
  84. *ppinhdr = inhdr;
  85. inhdr->hdr_ = *hdr;
  86. hdr->saddr() = here_.addr_;
  87. hdr->sport() = here_.port_;
  88. //hdr->dst() = addr_ & ~(~(nsaddr_t)0 << shift_) | (te & mask_) << shift_;;
  89. hdr->daddr() = te;
  90. hdr->dport() = 1;
  91. hdr->ttl() = defttl_;
  92. hdr_cmn::access(p)->size() += IP_HEADER_SIZE;
  93. target_->recv(p,h);
  94. }
  95. static class MIPDecapsulatorClass : public TclClass {
  96. public:
  97. MIPDecapsulatorClass() : TclClass("Classifier/Addr/MIPDecapsulator") {}
  98. TclObject* create(int, const char*const*) {
  99. return (new MIPDecapsulator());
  100. }
  101. } class_mipdecapsulator;
  102. MIPDecapsulator::MIPDecapsulator() : AddressClassifier()
  103. {
  104. }
  105. void MIPDecapsulator::recv(Packet* p, Handler *h)
  106. {
  107. hdr_ipinip **ppinhdr = (hdr_ipinip **)hdr_ipinip::access(p);
  108. // restore inner header
  109. hdr_ip *pouthdr = hdr_ip::access(p);
  110. assert(ppinhdr);
  111. hdr_ip *pinhdr = &(*ppinhdr)->hdr_;
  112. *ppinhdr = (*ppinhdr)->next_;
  113. *pouthdr = *pinhdr;
  114. NsObject* link = find(p);
  115. // for mobilenodes use default-target which is probably the 
  116. // RA. cannot use node_entry point instead, as hier address
  117. // of MH point to HA. hence hand decapsulated pkt directly 
  118. // to RA.
  119. if (link == NULL || pinhdr->ttl_ <= 0) {
  120. /*
  121.  * XXX this should be "dropped" somehow.  Right now,
  122.  * these events aren't traced.
  123.  */
  124. hdr_ipinip *ptr = *ppinhdr, *temp;
  125. while (ptr != NULL) {
  126. temp = ptr;
  127. ptr = ptr->next_;
  128. delete temp;
  129. }
  130. *ppinhdr = NULL;
  131. delete pinhdr;
  132. Packet::free(p);
  133. return;
  134. }
  135. delete pinhdr;
  136. hdr_cmn::access(p)->size() -= IP_HEADER_SIZE;
  137. link->recv(p,h);
  138. }