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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1997 Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  * This product includes software developed by the Daedalus Research
  17.  * Group at the University of California Berkeley.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  *
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  *
  34.  * Contributed by the Daedalus Research Group, http://daedalus.cs.berkeley.edu
  35.  */
  36. #ifndef lint
  37. static const char rcsid[] =
  38.     "@(#) $Header: /cvsroot/nsnam/ns-2/mac/ll.cc,v 1.46 2002/03/14 01:12:52 haldar Exp $ (UCB)";
  39. #endif
  40. #include <errmodel.h>
  41. #include <mac.h>
  42. #include <ll.h>
  43. #include <address.h>
  44. #include <dsr/hdr_sr.h>
  45. int hdr_ll::offset_;
  46. static class LLHeaderClass : public PacketHeaderClass {
  47. public:
  48. LLHeaderClass() : PacketHeaderClass("PacketHeader/LL",
  49.     sizeof(hdr_ll)) {
  50. bind_offset(&hdr_ll::offset_);
  51. }
  52. } class_hdr_ll;
  53. static class LLClass : public TclClass {
  54. public:
  55. LLClass() : TclClass("LL") {}
  56. TclObject* create(int, const char*const*) {
  57. return (new LL);
  58. }
  59. } class_ll;
  60. LL::LL() : LinkDelay(), seqno_(0), ackno_(0), macDA_(0), ifq_(0),
  61. mac_(0), lanrouter_(0), arptable_(0), varp_(0),
  62. downtarget_(0), uptarget_(0)
  63. {
  64. bind("macDA_", &macDA_);
  65. }
  66. int LL::command(int argc, const char*const* argv)
  67. {
  68. Tcl& tcl = Tcl::instance();
  69. if (argc == 3) {
  70. if (strcmp(argv[1], "ifq") == 0) {
  71. ifq_ = (Queue*) TclObject::lookup(argv[2]);
  72. return (TCL_OK);
  73. }
  74. if(strcmp(argv[1], "arptable") == 0) {
  75.                         arptable_ = (ARPTable*)TclObject::lookup(argv[2]);
  76.                         assert(arptable_);
  77.                         return TCL_OK;
  78.                 }
  79. if(strcmp(argv[1], "varp") == 0) {
  80.                         varp_ = (VARPTable*)TclObject::lookup(argv[2]);
  81.                         assert(varp_);
  82.                         return TCL_OK;
  83.                 }
  84. if (strcmp(argv[1], "mac") == 0) {
  85. mac_ = (Mac*) TclObject::lookup(argv[2]);
  86.                         assert(mac_);
  87. return (TCL_OK);
  88. }
  89. if (strcmp(argv[1], "down-target") == 0) {
  90. downtarget_ = (NsObject*) TclObject::lookup(argv[2]);
  91. return (TCL_OK);
  92. }
  93. if (strcmp(argv[1], "up-target") == 0) {
  94. uptarget_ = (NsObject*) TclObject::lookup(argv[2]);
  95. return (TCL_OK);
  96. }
  97. if (strcmp(argv[1], "lanrouter") == 0) {
  98. lanrouter_ = (LanRouter*) TclObject::lookup(argv[2]);
  99. return (TCL_OK);
  100. }
  101. }
  102. else if (argc == 2) {
  103. if (strcmp(argv[1], "ifq") == 0) {
  104. tcl.resultf("%s", ifq_->name());
  105. return (TCL_OK);
  106. }
  107. if (strcmp(argv[1], "mac") == 0) {
  108. tcl.resultf("%s", mac_->name());
  109. return (TCL_OK);
  110. }
  111. if (strcmp(argv[1], "down-target") == 0) {
  112. tcl.resultf("%s", downtarget_->name());
  113. return (TCL_OK);
  114. }
  115. if (strcmp(argv[1], "up-target") == 0) {
  116. tcl.resultf("%s", uptarget_->name());
  117. return (TCL_OK);
  118. }
  119. }
  120. return LinkDelay::command(argc, argv);
  121. }
  122. void LL::recv(Packet* p, Handler* /*h*/)
  123. {
  124. hdr_cmn *ch = HDR_CMN(p);
  125. //char *mh = (char*) HDR_MAC(p);
  126. //struct hdr_sr *hsr = HDR_SR(p);
  127. /*
  128.  * Sanity Check
  129.  */
  130. assert(initialized());
  131. //if(p->incoming) {
  132. //p->incoming = 0;
  133. //}
  134. // XXXXX NOTE: use of incoming flag has been depracated; In order to track direction of pkt flow, direction_ in hdr_cmn is used instead. see packet.h for details.
  135. // If direction = UP, then pass it up the stack
  136. // Otherwise, set direction to DOWN and pass it down the stack
  137. if(ch->direction() == hdr_cmn::UP) {
  138. //if(mac_->hdr_type(mh) == ETHERTYPE_ARP)
  139. if(ch->ptype_ == PT_ARP)
  140. arptable_->arpinput(p, this);
  141. else
  142. uptarget_ ? sendUp(p) : drop(p);
  143. return;
  144. }
  145. ch->direction() = hdr_cmn::DOWN;
  146. sendDown(p);
  147. }
  148. void LL::sendDown(Packet* p)
  149. {
  150. hdr_cmn *ch = HDR_CMN(p);
  151. hdr_ip *ih = HDR_IP(p);
  152. nsaddr_t dst = (nsaddr_t)Address::instance().get_nodeaddr(ih->daddr());
  153. //nsaddr_t dst = ih->dst();
  154. hdr_ll *llh = HDR_LL(p);
  155. char *mh = (char*)p->access(hdr_mac::offset_);
  156. llh->seqno_ = ++seqno_;
  157. llh->lltype() = LL_DATA;
  158. mac_->hdr_src(mh, mac_->addr());
  159. mac_->hdr_type(mh, ETHERTYPE_IP);
  160. int tx = 0;
  161. switch(ch->addr_type()) {
  162. case NS_AF_ILINK:
  163. mac_->hdr_dst((char*) HDR_MAC(p), ch->next_hop());
  164. break;
  165. case NS_AF_INET:
  166. dst = ch->next_hop();
  167. /* FALL THROUGH */
  168. case NS_AF_NONE:
  169. if (IP_BROADCAST == (u_int32_t) dst)
  170. {
  171. mac_->hdr_dst((char*) HDR_MAC(p), MAC_BROADCAST);
  172. break;
  173. }
  174. /* Assuming arptable is present, send query */
  175. if (arptable_) {
  176. tx = arptable_->arpresolve(dst, p, this);
  177. break;
  178. }
  179. //if (varp_) {
  180. //tx = varp_->arpresolve(dst, p);
  181. //break;
  182. //}
  183. /* FALL THROUGH */
  184. default:
  185. int IPnh = (lanrouter_) ? lanrouter_->next_hop(p) : -1;
  186. if (IPnh < 0)
  187. mac_->hdr_dst((char*) HDR_MAC(p),macDA_);
  188. else if (varp_)
  189. tx = varp_->arpresolve(IPnh, p);
  190. else
  191. mac_->hdr_dst((char*) HDR_MAC(p), IPnh);
  192. break;
  193. }
  194. if (tx == 0) {
  195. Scheduler& s = Scheduler::instance();
  196. // let mac decide when to take a new packet from the queue.
  197. s.schedule(downtarget_, p, delay_);
  198. }
  199. }
  200. void LL::sendUp(Packet* p)
  201. {
  202. Scheduler& s = Scheduler::instance();
  203. if (hdr_cmn::access(p)->error() > 0)
  204. drop(p);
  205. else
  206. s.schedule(uptarget_, p, delay_);
  207. }