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

3G开发

开发平台:

C/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: /nfs/jade/vint/CVSROOT/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. class Mac802_11;
  46. int hdr_ll::offset_;
  47. static class LLHeaderClass : public PacketHeaderClass {
  48. public:
  49. LLHeaderClass() : PacketHeaderClass("PacketHeader/LL",
  50.     sizeof(hdr_ll)) {
  51. bind_offset(&hdr_ll::offset_);
  52. }
  53. } class_hdr_ll;
  54. static class LLClass : public TclClass {
  55. public:
  56. LLClass() : TclClass("LL") {}
  57. TclObject* create(int, const char*const*) {
  58. return (new LL);
  59. }
  60. } class_ll;
  61. LL::LL() : LinkDelay(), seqno_(0), ackno_(0), macDA_(0), ifq_(0),
  62. mac_(0), lanrouter_(0), arptable_(0), varp_(0),
  63. downtarget_(0), uptarget_(0)
  64. {
  65. bind("macDA_", &macDA_);
  66. }
  67. int LL::command(int argc, const char*const* argv)
  68. {
  69. Tcl& tcl = Tcl::instance();
  70. if (argc == 3) {
  71. if (strcmp(argv[1], "ifq") == 0) {
  72. ifq_ = (Queue*) TclObject::lookup(argv[2]);
  73. return (TCL_OK);
  74. }
  75. if(strcmp(argv[1], "arptable") == 0) {
  76.                         arptable_ = (ARPTable*)TclObject::lookup(argv[2]);
  77.                         assert(arptable_);
  78.                         return TCL_OK;
  79.                 }
  80. if(strcmp(argv[1], "varp") == 0) {
  81.                         varp_ = (VARPTable*)TclObject::lookup(argv[2]);
  82.                         assert(varp_);
  83.                         return TCL_OK;
  84.                 }
  85. if (strcmp(argv[1], "mac") == 0) {
  86. mac_ = (Mac*) TclObject::lookup(argv[2]);
  87.                         assert(mac_);
  88. //JUNGMIN
  89. mac_->setll(this);
  90. if(ifq_ != 0) {
  91. mac_->set_queue(ifq_);
  92. ifq_->set_wmac((Mac802_11*)mac_);
  93. }
  94. return (TCL_OK);
  95. }
  96. if (strcmp(argv[1], "down-target") == 0) {
  97. downtarget_ = (NsObject*) TclObject::lookup(argv[2]);
  98. ifq_ = (Queue*)downtarget_;
  99. if(mac_ != 0) {
  100. mac_->set_queue(ifq_);
  101. ifq_->set_wmac((Mac802_11*)mac_);
  102. }
  103. //end of JUNGMIN
  104. return (TCL_OK);
  105. }
  106. if (strcmp(argv[1], "up-target") == 0) {
  107. uptarget_ = (NsObject*) TclObject::lookup(argv[2]);
  108. return (TCL_OK);
  109. }
  110. if (strcmp(argv[1], "lanrouter") == 0) {
  111. lanrouter_ = (LanRouter*) TclObject::lookup(argv[2]);
  112. return (TCL_OK);
  113. }
  114. }
  115. else if (argc == 2) {
  116. if (strcmp(argv[1], "ifq") == 0) {
  117. tcl.resultf("%s", ifq_->name());
  118. return (TCL_OK);
  119. }
  120. if (strcmp(argv[1], "mac") == 0) {
  121. tcl.resultf("%s", mac_->name());
  122. return (TCL_OK);
  123. }
  124. if (strcmp(argv[1], "down-target") == 0) {
  125. tcl.resultf("%s", downtarget_->name());
  126. return (TCL_OK);
  127. }
  128. if (strcmp(argv[1], "up-target") == 0) {
  129. tcl.resultf("%s", uptarget_->name());
  130. return (TCL_OK);
  131. }
  132. }
  133. return LinkDelay::command(argc, argv);
  134. }
  135. void LL::recv(Packet* p, Handler* /*h*/)
  136. {
  137. hdr_cmn *ch = HDR_CMN(p);
  138. //char *mh = (char*) HDR_MAC(p);
  139. //struct hdr_sr *hsr = HDR_SR(p);
  140. /*
  141.  * Sanity Check
  142.  */
  143. assert(initialized());
  144. //if(p->incoming) {
  145. //p->incoming = 0;
  146. //}
  147. // 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.
  148. // If direction = UP, then pass it up the stack
  149. // Otherwise, set direction to DOWN and pass it down the stack
  150. if(ch->direction() == hdr_cmn::UP) {
  151. //if(mac_->hdr_type(mh) == ETHERTYPE_ARP)
  152. if(ch->ptype_ == PT_ARP)
  153. arptable_->arpinput(p, this);
  154. else
  155. uptarget_ ? sendUp(p) : drop(p);
  156. return;
  157. }
  158. ch->direction() = hdr_cmn::DOWN;
  159. sendDown(p);
  160. }
  161. void LL::sendDown(Packet* p)
  162. {
  163. hdr_cmn *ch = HDR_CMN(p);
  164. hdr_ip *ih = HDR_IP(p);
  165. nsaddr_t dst = (nsaddr_t)Address::instance().get_nodeaddr(ih->daddr());
  166. //nsaddr_t dst = ih->dst();
  167. hdr_ll *llh = HDR_LL(p);
  168. char *mh = (char*)p->access(hdr_mac::offset_);
  169. llh->seqno_ = ++seqno_;
  170. llh->lltype() = LL_DATA;
  171. mac_->hdr_src(mh, mac_->addr());
  172. mac_->hdr_type(mh, ETHERTYPE_IP);
  173. int tx = 0;
  174. switch(ch->addr_type()) {
  175. case NS_AF_ILINK:
  176. mac_->hdr_dst((char*) HDR_MAC(p), ch->next_hop());
  177. break;
  178. case NS_AF_INET:
  179. dst = ch->next_hop();
  180. /* FALL THROUGH */
  181. case NS_AF_NONE:
  182. if (IP_BROADCAST == (u_int32_t) dst)
  183. {
  184. mac_->hdr_dst((char*) HDR_MAC(p), MAC_BROADCAST);
  185. break;
  186. }
  187. /* Assuming arptable is present, send query */
  188. if (arptable_) {
  189. tx = arptable_->arpresolve(dst, p, this);
  190. break;
  191. }
  192. //if (varp_) {
  193. //tx = varp_->arpresolve(dst, p);
  194. //break;
  195. //}
  196. /* FALL THROUGH */
  197. default:
  198. int IPnh = (lanrouter_) ? lanrouter_->next_hop(p) : -1;
  199. if (IPnh < 0)
  200. mac_->hdr_dst((char*) HDR_MAC(p),macDA_);
  201. else if (varp_)
  202. tx = varp_->arpresolve(IPnh, p);
  203. else
  204. mac_->hdr_dst((char*) HDR_MAC(p), IPnh);
  205. break;
  206. }
  207. if (tx == 0) {
  208. Scheduler& s = Scheduler::instance();
  209. // ***
  210. // let mac decide when to take a new packet from the queue.
  211. s.schedule(downtarget_, p, delay_);
  212. }
  213. }
  214. void LL::sendUp(Packet* p)
  215. {
  216. Scheduler& s = Scheduler::instance();
  217. if (hdr_cmn::access(p)->error() > 0)
  218. drop(p);
  219. else
  220. s.schedule(uptarget_, p, delay_);
  221. }