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

通讯编程

开发平台:

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. #include <sat-hdlc.h>
  37. #include <mac.h>
  38. // setting this allows HDLC to reset once it reaches the max-retries.
  39. #define RESET_HDLC 1
  40. int HDLC::uidcnt_;
  41. // int hdr_hdlc::offset_;
  42. // static class HDLCHeaderClass : public PacketHeaderClass {
  43. // public:
  44. //  HDLCHeaderClass() : PacketHeaderClass("PacketHeader/HDLC",
  45. //      sizeof(hdr_hdlc)) {
  46. //  bind_offset(&hdr_hdlc::offset_);
  47. //  }
  48. // } class_hdr_hdlc;
  49. static class HDLCClass : public TclClass {
  50. public:
  51. HDLCClass() : TclClass("LL/Sat/HDLC") {}
  52. TclObject* create(int, const char*const*) {
  53. return (new HDLC);
  54. }
  55. } class_hdlc;
  56. void HdlcTimer::expire(Event *)
  57. {
  58. (*agent_.*callback_)(a_);
  59. }
  60. HDLC::HDLC() : SatLL(), list_head_(0)
  61. {
  62. bind("window_size_", &wnd_);
  63. bind("queue_size_", &queueSize_);
  64. bind_time("timeout_", &timeout_);
  65. bind("max_timeouts_", &maxTimeouts_);
  66. bind("selRepeat_", &selRepeat_);
  67. bind("delAck_", &delAck_);
  68. bind("delAckVal_", &delAckVal_);
  69. wndmask_ = HDLC_MWM;
  70. }
  71. void HDLC::recv(Packet* p, Handler* h)
  72. {
  73. hdr_cmn *ch = HDR_CMN(p);
  74. /*
  75.  * Sanity Check
  76.  */
  77. assert(initialized());
  78. // If direction = UP, then HDLC is recv'ing pkt from the network
  79. // Otherwise, set direction to DOWN and pass it down the stack
  80. if (ch->direction() == hdr_cmn::UP) {
  81. if (ch->ptype_ == PT_ARP)
  82. arptable_->arpinput(p, this);
  83. else 
  84. recvIncoming(p);
  85. return;
  86. }
  87. ch->direction() = hdr_cmn::DOWN;
  88. recvOutgoing(p);
  89. }
  90. // Functions for sending packets out to network
  91. void HDLC::recvOutgoing(Packet* p)
  92. {
  93. ARQstate *a;
  94. int next_hop = getRoute(p);
  95. //if (disconnect_) {
  96. // if (!sentDISC_) {
  97. //  sendUA(p, DISC);
  98. //  sentDISC_ = 1;
  99. //  set_rtx_timer();
  100. //  drop(p);
  101. //  return;
  102. //  }
  103. //  drop(p);
  104. //  return;
  105. //  }
  106. a = checkState(next_hop);
  107. if (a == 0)
  108. a = createState(next_hop);
  109. if (!(a->SABME_req_) && a->t_seqno_ == 0) {
  110. // this is the first pkt being sent
  111. // send out SABME request to start connection
  112. sendUA(p, SABME);
  113. // set SABME request flag to 1
  114. // have sent request, not yet confirmed
  115. a->SABME_req_ = 1;
  116. // set some timer for SABME?
  117. set_rtx_timer(a);
  118. }
  119.         
  120.         // place pkt in outgoing queue
  121. inSendBuffer(p, a);
  122. // send data pkts only after recving UA
  123. // in reply to SABME request
  124. if (a->SABME_req_ == 2) 
  125. sendMuch(a);
  126. }
  127. void HDLC::inSendBuffer(Packet *p, ARQstate *a) 
  128. {
  129. // check for HDLC buffer overflow
  130. if (a->sendBuf_.length() >= queueSize_) {
  131. drop(p, "HDLC queue full");
  132. return;
  133. }
  134. hdr_cmn *ch = HDR_CMN(p);
  135. hdr_ip *ih = HDR_IP(p);
  136. hdr_hdlc *hh = HDR_HDLC(p);
  137. struct I_frame* ifr = (struct I_frame *)&(hh->hdlc_fc_);
  138. nsaddr_t src = (nsaddr_t)Address::instance().get_nodeaddr(ih->saddr());
  139. nsaddr_t dst = (nsaddr_t)Address::instance().get_nodeaddr(ih->daddr());
  140. hh->fc_type_ = HDLC_I_frame;
  141. hh->saddr_ = src;
  142. hh->daddr_ = dst;
  143. ifr->send_seqno = a->seqno_++;
  144. ch->size() += HDLC_HDR_LEN;
  145. a->sendBuf_.enque(p);
  146. }
  147. Packet *HDLC::dataToSend(ARQstate *a)
  148. {
  149. Packet *dp;
  150. // if have any data to send
  151. if (a->t_seqno_ <= a->highest_ack_ + wnd_ && 
  152.     (dp = getPkt(a->sendBuf_, a->t_seqno_)) != 0) {
  153. // XXcheck if the destinations match for data and RR??
  154. Packet *np = dp->copy();
  155. return np;
  156. }
  157. return NULL;
  158. }
  159. // try to send as much as possible if have any pkts to send
  160. void HDLC::sendMuch(ARQstate *a)
  161. {
  162. // sanity check for a connection
  163. assert(a->SABME_req_ == 2);
  164. Packet *p;
  165. while (a->t_seqno_ <= a->highest_ack_ + wnd_ && (p = getPkt(a->sendBuf_, a->t_seqno_)) != 0) {
  166. Packet *dp = p->copy();
  167. output(dp, a, a->t_seqno_);
  168. a->t_seqno_++;
  169. }
  170. void HDLC::output(Packet *p, ARQstate *a, int seqno)
  171. {
  172. int force_set_rtx_timer = 0;
  173. hdr_hdlc* hh = HDR_HDLC(p);
  174. struct I_frame* ifr = (struct I_frame *)&(hh->hdlc_fc_);
  175. // piggyback the last seqno recvd
  176. if (selRepeat_)
  177. ifr->recv_seqno = a->nextpkt_;
  178. else
  179. ifr->recv_seqno = a->recv_seqno_;
  180. // cancel the delay timer if pending
  181. if (a->delay_timer_->status() == TIMER_PENDING) 
  182. cancel_delay_timer(a);
  183. if (a->save_ != NULL) {
  184.                 Packet::free(a->save_);
  185.                 a->save_ = NULL;
  186.         }
  187. sendDown(p);
  188. // if no outstanding data set rtx timer again
  189. if (a->highest_ack_ == a->maxseq_)
  190. force_set_rtx_timer = 1;
  191. if (seqno > a->maxseq_) 
  192. a->maxseq_ = seqno;
  193. else if (seqno < a->maxseq_)
  194. ++(a->nrexmit_);
  195. if (!(a->rtx_timer_->status() == TIMER_PENDING) || force_set_rtx_timer)
  196. // No timer pending.  Schedule one.
  197. set_rtx_timer(a);
  198. }
  199. void HDLC::sendUA(Packet *p, COMMAND_t cmd)
  200. {
  201. Packet *np = Packet::alloc();
  202. hdr_cmn *ch = HDR_CMN(p);
  203. hdr_cmn *nch = HDR_CMN(np);
  204. hdr_ip *ih = HDR_IP(p);
  205. hdr_ip *nih = HDR_IP(np);
  206. struct hdr_hdlc* nhh = HDR_HDLC(np);
  207. struct U_frame* uf = (struct U_frame *)&(nhh->hdlc_fc_);
  208. nsaddr_t src = (nsaddr_t)Address::instance().get_nodeaddr(ih->saddr());
  209. nsaddr_t dst = (nsaddr_t)Address::instance().get_nodeaddr(ih->daddr());
  210.         // setup common hdr
  211. nch->addr_type() = ch->addr_type();
  212. nch->uid() = uidcnt_++;
  213. nch->ptype() = PT_HDLC;
  214. nch->size() = HDLC_HDR_LEN;
  215. nch->error() = 0;
  216. nch->iface() = -2;
  217. //nih->daddr() = ih->daddr();
  218. nhh->fc_type_ = HDLC_U_frame;
  219. switch(cmd) {
  220. case SABME:
  221. case DISC:
  222. // use same dst and src address
  223. nih->daddr() = ih->daddr();
  224. nih->saddr() = ih->saddr();
  225. nhh->daddr_ = dst;
  226. nhh->saddr_ = src;
  227. break;
  228. case UA:
  229. // use reply mode; src and dst get reversed
  230. nih->daddr() = ih->saddr();
  231. nih->saddr() = ih->daddr();
  232. nhh->daddr_ = src;
  233. nhh->saddr_ = dst;
  234. break;
  235. default:
  236. fprintf(stderr, "Unknown type of U framen");
  237. exit(1);
  238. }
  239. uf->utype = cmd;
  240. sendDown(np);
  241. //return (np);
  242. }
  243. void HDLC::sendDISC(Packet *p)
  244. {
  245. sendUA(p, DISC);
  246. }
  247. void HDLC::delayTimeout(ARQstate *state)
  248. {
  249. // The delay timer expired so we ACK the last pkt seen
  250. if (state->save_ != NULL) {
  251. Packet* pkt = state->save_;
  252. ack(pkt);
  253. state->save_ = NULL;
  254. Packet::free(pkt);
  255. }
  256. }
  257. void HDLC::ack(Packet *p)
  258. {
  259. hdr_cmn *ch = HDR_CMN(p);
  260. int last_hop = ch->last_hop_;
  261. ARQstate *a = checkState(last_hop);
  262. // sanity check; but should not come here.
  263. if (a == 0) {
  264. printf("ack(): No state found for %dn",last_hop);
  265. return;
  266. }
  267. Packet *dp;
  268. if (a->t_seqno_ > 0 && (dp = dataToSend(a)) != NULL) {
  269. output(dp, a, a->t_seqno_);
  270. a->t_seqno_++;
  271. } else {
  272. sendRR(p,a);
  273. }
  274. }
  275. void HDLC::sendRR(Packet *p, ARQstate *a)
  276. {
  277. Packet *np = Packet::alloc();
  278. hdr_cmn *ch = HDR_CMN(p);
  279. hdr_ip *ih = HDR_IP(p);
  280. struct hdr_hdlc *hh = HDR_HDLC(p);
  281. hdr_cmn *nch = HDR_CMN(np);
  282. hdr_ip *nih = HDR_IP(np);
  283. struct hdr_hdlc *nhh = HDR_HDLC(np);
  284. struct S_frame *sf = (struct S_frame*)&(nhh->hdlc_fc_);
  285. // common hdr
  286. nch->addr_type() = ch->addr_type();
  287. nch->uid() = uidcnt_++;
  288. nch->ptype() = PT_HDLC;
  289. nch->size() = HDLC_HDR_LEN;
  290. nch->error() = 0;
  291. nch->iface() = -2;
  292. nih->daddr() = ih->saddr();
  293. nih->saddr() = ih->daddr();
  294. nhh->fc_type_ = HDLC_S_frame;
  295. if (selRepeat_)
  296. sf->recv_seqno = a->nextpkt_;
  297. else
  298. sf->recv_seqno = a->recv_seqno_;
  299. sf->stype = RR;
  300. nhh->saddr_ = hh->daddr();
  301. nhh->daddr_ = hh->saddr();
  302. sendDown(np);
  303. }
  304. void HDLC::sendRNR(Packet *p)
  305. {}
  306. void HDLC::sendREJ(Packet *p, ARQstate *a)
  307. {
  308. Packet *np = Packet::alloc();
  309. hdr_cmn *ch = HDR_CMN(p);
  310. hdr_ip *ih = HDR_IP(p);
  311. struct hdr_hdlc *hh = HDR_HDLC(p);
  312. hdr_cmn *nch = HDR_CMN(np);
  313. hdr_ip *nih = HDR_IP(np);
  314. struct hdr_hdlc *nhh = HDR_HDLC(np);
  315. struct S_frame *sf = (struct S_frame *)&(nhh->hdlc_fc_);
  316. // common hdr
  317. nch->addr_type() = ch->addr_type();
  318. nch->uid() = uidcnt_++;
  319. nch->ptype() = PT_HDLC;
  320. nch->size() = HDLC_HDR_LEN;
  321. nch->error() = 0;
  322. nch->iface() = -2;
  323. nih->daddr() = ih->saddr();
  324. nih->saddr() = ih->daddr();
  325. nhh->fc_type_ = HDLC_S_frame;
  326. sf->recv_seqno = a->recv_seqno_;
  327. sf->stype = REJ;
  328. nhh->saddr_ = hh->daddr();
  329. nhh->daddr_ = hh->saddr();
  330. sendDown(np);
  331. }
  332. void HDLC::sendSREJ(Packet *p, int seq)
  333. {
  334. Packet *np = Packet::alloc();
  335. hdr_cmn *ch = HDR_CMN(p);
  336. hdr_ip *ih = HDR_IP(p);
  337. struct hdr_hdlc *hh = HDR_HDLC(p);
  338. hdr_cmn *nch = HDR_CMN(np);
  339. hdr_ip *nih = HDR_IP(np);
  340. struct hdr_hdlc *nhh = HDR_HDLC(np);
  341. struct S_frame *sf = (struct S_frame *)&(nhh->hdlc_fc_);
  342. // common hdr
  343. nch->addr_type() = ch->addr_type();
  344. nch->uid() = uidcnt_++;
  345. nch->ptype() = PT_HDLC;
  346. nch->size() = HDLC_HDR_LEN;
  347. nch->error() = 0;
  348. nch->iface() = -2;
  349. nih->daddr() = ih->saddr();
  350. nih->saddr() = ih->daddr();
  351. nhh->fc_type_ = HDLC_S_frame;
  352. sf->recv_seqno = seq;
  353. sf->stype = SREJ;
  354. nhh->saddr_ = hh->daddr();
  355. nhh->daddr_ = hh->saddr();
  356. sendDown(np);
  357. }
  358. void HDLC::sendDown(Packet* p)
  359. {
  360. hdr_cmn *ch = HDR_CMN(p);
  361. char *mh = (char*)p->access(hdr_mac::offset_);
  362. int peer_mac_;
  363. SatChannel* satchannel_;
  364. getRoute(p);
  365. // Set mac src, type, and dst
  366. mac_->hdr_src(mh, mac_->addr());
  367. mac_->hdr_type(mh, ETHERTYPE_IP); // We'll just use ETHERTYPE_IP
  368. nsaddr_t dst = ch->next_hop();
  369. // a value of -1 is IP_BROADCAST
  370. if (dst < -1) {
  371. printf("Error:  next_hop_ field not set by routing agentn");
  372. exit(1);
  373. }
  374. switch(ch->addr_type()) {
  375. case NS_AF_INET:
  376. case NS_AF_NONE:
  377. if (IP_BROADCAST == (u_int32_t) dst)
  378. {
  379. mac_->hdr_dst((char*) HDR_MAC(p), MAC_BROADCAST);
  380. break;
  381. }
  382. /* 
  383.  * Here is where arp would normally occur.  In the satellite
  384.  * case, we don't arp (for now).  Instead, use destination
  385.  * address to find the mac address corresponding to the
  386.  * peer connected to this channel.  If someone wants to
  387.  * add arp, look at how the wireless code does it.
  388.  */ 
  389. // Cache latest value used
  390. if (dst == arpcachedst_) {
  391. mac_->hdr_dst((char*) HDR_MAC(p), arpcache_);
  392. break;
  393. }
  394. // Search for peer's mac address (this is the pseudo-ARP)
  395. satchannel_ = (SatChannel*) channel();
  396. peer_mac_ = satchannel_->find_peer_mac_addr(dst);
  397. if (peer_mac_ < 0 ) {
  398. printf("Error:  couldn't find dest mac on channel ");
  399. printf("for src/dst %d %d at NOW %fn", 
  400.     ch->last_hop_, dst, NOW); 
  401. exit(1);
  402. } else {
  403. mac_->hdr_dst((char*) HDR_MAC(p), peer_mac_);
  404. arpcachedst_ = dst;
  405. arpcache_ = peer_mac_;
  406. break;
  407. default:
  408. printf("Error:  addr_type not set to NS_AF_INET or NS_AF_NONEn");
  409. exit(1);
  410. }
  411. // let mac decide when to take a new packet from the queue.
  412. Scheduler& s = Scheduler::instance();
  413. s.schedule(downtarget_, p, delay_);
  414. }
  415. // functions for receiving pkts from the network
  416. void HDLC::recvIncoming(Packet* p)
  417. {
  418. // This pkt is coming from the network
  419. // check if pkt has error
  420. if (hdr_cmn::access(p)->error() > 0)
  421. drop(p);
  422. else {
  423. hdr_hdlc* hh = HDR_HDLC(p);
  424. switch (hh->fc_type_) {
  425. case HDLC_I_frame:
  426. recvIframe(p);
  427. break;
  428. case HDLC_S_frame:
  429. recvSframe(p);
  430. break;
  431. case HDLC_U_frame:
  432. recvUframe(p);
  433. break;
  434. default:
  435. fprintf(stderr, "Invalid HDLC control typen");
  436. exit(1);
  437. }
  438. }
  439. }
  440. // recv data pkt
  441. void HDLC::recvIframe(Packet *p) 
  442. {
  443. struct I_frame* ifr = (struct I_frame *)&(HDR_HDLC(p)->hdlc_fc_);
  444. int rseq = ((struct I_frame*)&(HDR_HDLC(p)->hdlc_fc_))->recv_seqno;
  445. // check if any ack is piggybacking
  446. // and update highest_ack_
  447. int last_hop = HDR_CMN(p)->last_hop_;
  448. ARQstate *a = checkState(last_hop);
  449. // if state doesn't exist, or connection not setup yet
  450. // drop data pkt
  451. if (a == 0 || a->SABME_req_ == 1) {
  452. printf("recvIframe(): No state/connection found for %dn",last_hop);
  453. return;
  454. }
  455. // if this is the first data pkt we recv, set the
  456. // SABME flag, as this is the third leg of the 3 way handshake
  457. // for connection setup for HDLC
  458. if (a->recv_seqno_ == -1 && a->SABME_req_ == 0)
  459. a->SABME_req_ = 2;
  460. if (rseq > -1)  // valid ack
  461. handlePiggyAck(p,a);
  462. // recvd first data pkt
  463. if (ifr->send_seqno == 0 && a->recv_seqno_ == -1) 
  464. a->recv_seqno_ = 0;
  465. if (selRepeat_) // do selective repeat
  466. selectiveRepeatMode(p);
  467. else
  468. // default to go back N
  469. goBackNMode(p);
  470. // if we had got a valid piggy ack
  471. // see if we can send more
  472. if (rseq > -1)  
  473. sendMuch(a);
  474. }
  475. void HDLC::recvSframe(Packet* p)
  476. {
  477. hdr_hdlc* hh = HDR_HDLC(p);
  478. struct S_frame *sf = (struct S_frame*)&(hh->hdlc_fc_);
  479. switch(sf->stype)
  480. {
  481. case RR:
  482. handleRR(p);
  483. break;
  484. case REJ:
  485. handleREJ(p);
  486. break;
  487. case RNR:
  488. handleRNR(p);
  489. break;
  490. case SREJ:
  491. handleSREJ(p);
  492. break;
  493. default:
  494. fprintf(stderr, "Unknown type of S framen");
  495. exit(0);
  496. }
  497. }
  498. void HDLC::recvUframe(Packet* p)
  499. {
  500. // U frames supported for now are ABME/UA/DISC
  501. hdr_hdlc* hh = HDR_HDLC(p);
  502. struct U_frame *uf = (struct U_frame*)&(hh->hdlc_fc_);
  503. switch(uf->utype) 
  504. {
  505. case SABME:
  506. handleSABMErequest(p);
  507. break;
  508. case UA:
  509. handleUA(p);
  510. break;
  511. case DISC:
  512. handleDISC(p);
  513. break;
  514. default:
  515. fprintf(stderr, "Unknown type of U framen");
  516. exit(1);
  517. }
  518. }
  519. void HDLC::handleSABMErequest(Packet *p)
  520. {
  521. hdr_cmn *ch = HDR_CMN(p);
  522. int last_hop = ch->last_hop_;
  523. ARQstate *a = checkState(last_hop);
  524. #ifdef RESET_HDLC
  525. if (a != 0) {
  526. // For HDLC resetting option, we might recv a SABME req since the sender got reset but the recvr didn't. In that case the recvr should reset in order to synchronise with sender.
  527. printf("Got SABME req for existing connection; resettingn");
  528. reset(a);
  529. }
  530. // create new state
  531. a = createState(last_hop);
  532. #else
  533. // create state only if one is not present already
  534. if (a == 0)
  535. a = createState(last_hop);
  536. #endif
  537.         // got a request to either open a connection
  538. // or reset an old connection as sender may have reset due to timeout
  539.         // ack back an UA
  540. //if (a->recv_seqno_ == -1) {
  541. sendUA(p, UA);
  542. //closed_ = 0;
  543. //}
  544. Packet::free(p);
  545. }
  546. void HDLC::handleDISC(Packet *p)
  547. {
  548. hdr_cmn *ch = HDR_CMN(p);
  549. int last_hop = ch->last_hop_;
  550. ARQstate *a = checkState(last_hop);
  551.         // got request for disconnect
  552. // send UA 
  553. reset(a);
  554. sendUA(p, UA);
  555. Packet::free(p);
  556. }
  557. void HDLC::handleUA(Packet *p)
  558. {
  559. hdr_cmn *ch = HDR_CMN(p);
  560. int last_hop = ch->last_hop_;
  561. ARQstate *a = checkState(last_hop);
  562. if (a == 0) {
  563. printf("handleUA: No state found for %dn", last_hop);
  564. return;
  565. }
  566. // recv ok for connection
  567. // if waiting to send, start sending
  568. // ?? shouldn't I match the addresses here??
  569. if (a->t_seqno_ == 0 && a->SABME_req_ == 1) {
  570. // set SABME request flag to 2
  571. // indicating a confirmed connection
  572. a->SABME_req_ = 2;
  573. // cancel the SABME timers
  574. cancel_rtx_timer(a);
  575. sendMuch(a);
  576. //closed_ = 0;
  577. } else { // have I sent a DISCONNECT?
  578. if (a->disconnect_) {
  579. // recvd confirmation on disconnect
  580. reset(a);
  581. }
  582. }
  583. Packet::free(p);
  584. }
  585. void HDLC::handlePiggyAck(Packet *p, ARQstate *a)
  586. {
  587. hdr_hdlc* hh = HDR_HDLC(p);
  588. struct I_frame *ifr =  (struct I_frame*)&(hh->hdlc_fc_);
  589. int seqno = ifr->recv_seqno - 1;
  590. if (seqno > a->highest_ack_) {  // recvd a new ack
  591. Packet *datapkt = getPkt(a->sendBuf_, seqno);
  592. a->sendBuf_.remove(datapkt);
  593. Packet::free(datapkt);
  594. // update highest_ack_
  595. a->highest_ack_ = seqno;
  596. // set retx_timer
  597. if (a->t_seqno_ > seqno || seqno < a->maxseq_)
  598. set_rtx_timer(a);
  599. else
  600. cancel_rtx_timer(a);
  601. } else { // got duplicate acks
  602. // do nothing as piggyback ack
  603. }
  604. // if had timeouts, should reset it now
  605. a->ntimeouts_ = 0;
  606. }
  607. // receiver ready - ack for a pkt successfully recvd by receiver, send next pkt pl
  608. void HDLC::handleRR(Packet *p)
  609. {
  610. // recvd an ack for a pkt
  611. // remove data pkt from outgoing buffer, if applicable
  612. struct S_frame *sf = (struct S_frame *)&(HDR_HDLC(p)->hdlc_fc_);
  613. int seqno = sf->recv_seqno - 1;
  614. int last_hop = HDR_CMN(p)->last_hop_;
  615. ARQstate *a = checkState(last_hop);
  616. if (a == 0 || a->SABME_req_ != 2){
  617. printf("handleRR: No state/connection found for %dn", last_hop);
  618. return;
  619. }
  620. if (seqno > a->highest_ack_) {  // recvd a new ack
  621. Packet *datapkt = getPkt(a->sendBuf_, seqno);
  622. if (datapkt != NULL) {
  623. a->sendBuf_.remove(datapkt);
  624. Packet::free(datapkt);
  625. // update highest_ack_
  626. a->highest_ack_ = seqno;
  627. }
  628. // set retx_timer
  629. if ((a->t_seqno_-1) > seqno || seqno < a->maxseq_ )
  630. set_rtx_timer(a);
  631. else
  632. cancel_rtx_timer(a);
  633. } else { // got duplicate acks
  634. drop(p);
  635. }
  636. // if had timeouts, should reset it now
  637. a->ntimeouts_ = 0;
  638. // try to send more
  639. Packet::free(p);
  640. sendMuch(a);
  641. }
  642. Packet *HDLC::getPkt(PacketQueue buffer, int seqno)
  643. {
  644. Packet *p;
  645. buffer.resetIterator();
  646. for (p = buffer.getNext(); p != 0; p = buffer.getNext()) {
  647. if (((struct I_frame *)&(HDR_HDLC(p)->hdlc_fc_))->send_seqno == seqno)
  648. return p;
  649. }
  650. return(NULL);
  651. }
  652. // receiver not ready
  653. void HDLC::handleRNR(Packet *p)
  654. {
  655. // stop sending pkts and wait until RR is recved.
  656. // wait for how long?
  657. }
  658. // handle reject or a go-back-N request from receiver
  659. void HDLC::handleREJ(Packet *rejp)
  660. {
  661. // set seqno_ = seqno in REJ
  662. // and start sending
  663. struct S_frame *sf = (struct S_frame *)&(HDR_HDLC(rejp)->hdlc_fc_);
  664. int seqno = sf->recv_seqno;
  665. int last_hop = HDR_CMN(rejp)->last_hop_;
  666. ARQstate *a = checkState(last_hop);
  667. if (a == 0 || a->SABME_req_ != 2) {
  668. printf("handleREJ: No state/connection found for %dn", last_hop);
  669. return;
  670. }
  671. a->t_seqno_ = seqno;
  672. sendMuch(a);
  673. Packet::free(rejp);
  674. }
  675. // selective reject or a NACK for a data pkt not recvd from the receiver
  676. void HDLC::handleSREJ(Packet *rejp)
  677. {
  678. struct S_frame *sf = (struct S_frame *)&(HDR_HDLC(rejp)->hdlc_fc_);
  679. int seqno = sf->recv_seqno;
  680. int last_hop = HDR_CMN(rejp)->last_hop_;
  681. ARQstate *a = checkState(last_hop);
  682. if (a == 0 || a->SABME_req_ != 2) {
  683. printf("handleSREJ: No state/connection found for %dn", last_hop);
  684. return;
  685. }
  686. // resend only the pkt that was requested
  687. Packet *p = getPkt(a->sendBuf_, seqno);
  688. Packet *dp = p->copy();
  689. output(dp, a, seqno);
  690. Packet::free(rejp);
  691. }
  692. void HDLC::reset(ARQstate *a)
  693. {
  694. Packet *p;
  695. int n;
  696. // cancel all pending timeouts
  697. if (a->rtx_timer_->status() == TIMER_PENDING) 
  698. cancel_rtx_timer(a);
  699. if (a->reset_timer_->status() == TIMER_PENDING)
  700. cancel_reset_timer(a);
  701. if (a->delay_timer_->status() == TIMER_PENDING)
  702. cancel_delay_timer(a);
  703. // now delete timers
  704. delete a->rtx_timer_;
  705.   delete a->reset_timer_;
  706.   delete a->delay_timer_;
  707. // purge send buffer, if any
  708. n = a->highest_ack_ + 1;
  709. while ((p = getPkt(a->sendBuf_, n)) != NULL) 
  710.   {
  711.   a->sendBuf_.remove(p);
  712.   Packet::free(p);
  713.   n++;
  714.   }
  715. // purge recv buffer, if any
  716. if (selRepeat_)
  717.   {
  718.   // purge recv side buffer
  719.   // to send up out-of-order pkts
  720.   // should we drop these pkts instead ??
  721. for (n=0; n <= HDLC_MWM; n++) {
  722.   Packet *p = a->seen_[n];
  723. if (p != 0) {
  724. uptarget_ ? sendUp(p) : drop(p);
  725. a->seen_[n] = 0;
  726. }
  727.   }
  728. delete a->seen_;
  729. }
  730. if (a->save_)
  731. delete a->save_;
  732. removeState(a->nh_);
  733. }
  734. // void HDLC::reset_recvr(ARQstate *a)
  735. // {
  736. //  int n = 0;
  737. //  if (selRepeat_)
  738. //  {
  739. //  // purge recv side buffer
  740. //  // to send up out-of-order pkts
  741. //  // should we drop these pkts instead ??
  742. //  while (a->seen_[n] != NULL){
  743. //  Packet *p = a->seen_[n];
  744. //  a->seen_[n] = 0;
  745. //  uptarget_ ? sendUp(p) : drop(p);
  746. //  ++n;
  747. //  }
  748. //  delete a->seen_;
  749. //  delete a->save_;
  750. //  }
  751. //  delete rtx_timer_;
  752. //  delete reset_timer_;
  753. //  delete delay_timer_;
  754. //  removeState(a);
  755. // }
  756. // void HDLC::reset_sender(ARQstate *a)
  757. // {
  758. //  Packet *p;
  759. //  int n = a->highest_ack_ + 1;
  760. //  // purge pkts in sendBuf
  761. //  while ((p = getPkt(a->sendBuf_, n)) != NULL) 
  762. //  {
  763. //  a->sendBuf_.remove(p);
  764. //  Packet::free(p);
  765. //  n++;
  766. //  }
  767. //         // delete timers
  768.  
  769. // }
  770. // void HDLC::set_ack_timer()
  771. // {
  772. //  ack_timer_.sched(DELAY_ACK_VAL);
  773. // }
  774. void HDLC::reset_rtx_timer(ARQstate *a, int backoff)
  775. {
  776. if (backoff)
  777. rtt_backoff();
  778. set_rtx_timer(a);
  779. a->t_seqno_ = a->highest_ack_ + 1;
  780. }
  781. void HDLC::set_rtx_timer(ARQstate *a)
  782. {
  783. a->rtx_timer_->resched(rtt_timeout());
  784. }
  785. void HDLC::set_reset_timer(ARQstate *a)
  786. {
  787. a->reset_timer_->resched(reset_timeout());
  788. }
  789. void HDLC::timeout(ARQstate *a)
  790. {
  791. //char buf[SMALL_LEN];
  792. //if (disconnect_) {
  793. //sentDISC_ = 0;
  794. //return;
  795. //}
  796. double now = Scheduler::instance().clock();
  797. a->ntimeouts_++;
  798. printf("hdlc TIMEOUT:%f, nh=%d, nto=%dn", now, a->nh_,a->ntimeouts_);
  799. //trace_event(buf);
  800. if (a->ntimeouts_ > maxTimeouts_) {
  801. //disconnect_ = 1;
  802. //sendDISC();
  803. #ifdef RESET_HDLC
  804. reset(a);
  805. #endif
  806. return;
  807. }
  808. // SABME timeout
  809. if (a->SABME_req_ && a->t_seqno_ == 0 ) {
  810. if (a->ntimeouts_ <= maxTimeouts_) {
  811. Packet *p = getPkt(a->sendBuf_, 0);
  812. sendUA(p, SABME);
  813. set_rtx_timer(a);
  814. } else {
  815. fprintf(stderr,"SABME timeout: No connectionn");
  816. #ifdef RESET_HDLC
  817. // flush all pkts 
  818. reset(a);
  819. #endif
  820. }
  821. return;
  822. }
  823. if (a->highest_ack_ == a->maxseq_) {
  824. // no outstanding data
  825. // then don't do  anything
  826. reset_rtx_timer(a,0);
  827. } else {
  828. a->t_seqno_ = a->highest_ack_ + 1;
  829. sendMuch(a);
  830. }
  831. }
  832. double HDLC::rtt_timeout()
  833. {
  834. return timeout_;
  835. }
  836. double HDLC::reset_timeout()
  837. {
  838. if (maxTimeouts_ < 1)
  839. maxTimeouts_ = 1;
  840. return (timeout_ * maxTimeouts_);
  841. }
  842. void HDLC::rtt_backoff()
  843. {
  844. // no backoff for now
  845. }
  846. // doing GoBAckN error recovery
  847. void HDLC::goBackNMode(Packet *p)
  848. {
  849. hdr_cmn *ch = HDR_CMN(p);
  850. hdr_hdlc* hh = HDR_HDLC(p);
  851. struct I_frame* ifr = (struct I_frame *)&(hh->hdlc_fc_);
  852. int last_hop = ch->last_hop_;
  853. ARQstate *a = checkState(last_hop);
  854. // recv data in order
  855. if (ifr->send_seqno == a->recv_seqno_) {
  856. if (a->sentREJ_)
  857. a->sentREJ_ = 0;
  858. a->recv_seqno_++;
  859.                 // strip off hdlc hdr
  860. ch->size() -= HDLC_HDR_LEN;
  861. // send ack back
  862. // start a timer to delay the ack so that
  863. // we can try and piggyback the ack in some data pkt
  864. if (delAck_) {
  865. if (a->delay_timer_->status() != TIMER_PENDING) {
  866. assert(a->save_ == NULL);
  867. a->save_ = p->copy();
  868. a->delay_timer_->sched(delAckVal_);
  869. } else {
  870. ack(p);
  871. }
  872. uptarget_ ? sendUp(p) : drop(p);
  873. } else if (ifr->send_seqno > a->recv_seqno_) {
  874. if (!a->sentREJ_) {
  875. a->sentREJ_ = 1;
  876. // since GoBackN send REJ for the first
  877. // out of order pkt
  878. sendREJ(p,a);
  879. // set a timer for resetting recvr on timeout
  880. // waiting for in order pkt
  881. #ifdef RESET_HDLC
  882. set_reset_timer(a);
  883. #endif
  884. }
  885. drop(p, "Pkt out of order");
  886. } else {
  887. // send_seqno < recv_seqno; duplicate data pkts
  888. // send ack back as previous RR maybe lost
  889. ack(p);
  890. //ack();
  891. drop(p, "Duplicate pkt");
  892. }
  893. }
  894. // Selective Repeat mode of error recovery
  895. // in case of a missing pkt, send SREJ for that pkt only
  896. void HDLC::selectiveRepeatMode(Packet* p)
  897. {
  898. hdr_cmn *ch = HDR_CMN(p);
  899. int seq =  ((struct I_frame *)&(HDR_HDLC(p)->hdlc_fc_))->send_seqno;
  900. bool just_marked_as_seen = FALSE;
  901. int last_hop = ch->last_hop_;
  902. ARQstate *a = checkState(last_hop);
  903. // resize buffers
  904. // while (seq + 1 - next >= wndmask_) {
  905. //  resize_buffers((wndmask_+1)*2);
  906. //  }
  907. // strip off hdlc hdr
  908. ch->size() -= HDLC_HDR_LEN;
  909. if (seq > a->maxseen_) {
  910. // the packet is the highest we've seen so far
  911. int i;
  912. for (i = a->maxseen_ + 1; i < seq; i++) {
  913. sendSREJ(p, i);
  914. }
  915. // we record the packets between the old maximum and
  916. // the new max as being "unseen" i.e. 0 
  917. a->maxseen_ = seq;
  918. // place pkt in buffer
  919. a->seen_[a->maxseen_ & wndmask_] = p;
  920. // necessary so this packet isn't confused as being a duplicate
  921. just_marked_as_seen = TRUE;
  922. }
  923. if (seq < a->nextpkt_) {
  924. // Duplicate packet case 1: the packet is to the left edge of
  925. // the receive window; therefore we must have seen it
  926. // before
  927. #ifdef DEBUGHDLC
  928. printf("%ft Received duplicate packet %dn",Scheduler::instance().clock(),seq);
  929. #endif
  930. ack(p);
  931. drop(p);
  932. return;
  933. }
  934. int next = a->nextpkt_;
  935. if (seq >= a->nextpkt_ && seq <= a->maxseen_) {
  936. // next is the left edge of the recv window; maxseen_
  937. // is the right edge; execute this block if there are
  938. // missing packets in the recv window AND if current
  939. // packet falls within those gaps
  940. if (a->seen_[seq & wndmask_] && !just_marked_as_seen) {
  941. // Duplicate case 2: the segment has already been
  942. // recorded as being received (AND not because we just
  943. // marked it as such)
  944. #ifdef DEBUGHDLC
  945. printf("%ft Received duplicate packet %dn",Scheduler::instance().clock(),seq);
  946. #endif
  947. ack(p);
  948. drop(p);
  949. return;
  950. }
  951. // record the packet as being seen
  952. a->seen_[seq & wndmask_] = p;
  953. while ( a->seen_[next & wndmask_] != NULL ) {
  954. // this loop first gets executed if seq==next;
  955. // i.e., this is the next packet in order that
  956. // we've been waiting for.  the loop sets how
  957. // many pkt we can now deliver to the
  958. // application, due to this packet arriving
  959. // (and the prior arrival of any pkts
  960. // immediately to the right)
  961. Packet* rpkt = a->seen_[next & wndmask_];
  962. a->seen_[next & wndmask_] = 0;
  963. uptarget_ ? sendUp(rpkt) : drop(rpkt);
  964. ++next;
  965. }
  966. // store the new left edge of the window
  967. a->nextpkt_ = next;
  968. // send ack 
  969. ack(p);
  970. }
  971. }
  972. ARQstate *HDLC::newEntry(int next_hop)
  973. {
  974. ARQstate *a = new ARQstate;
  975. a->nh_ = next_hop;
  976. a->t_seqno_ = 0;
  977. a->seqno_ = 0;
  978. a->maxseq_ = 0;
  979. a->highest_ack_ = -1;
  980. a->recv_seqno_ = -1;
  981. a->nrexmit_ = 0;
  982. a->ntimeouts_ = 0;
  983. a->closed_ = 0;
  984. a->disconnect_ = 0;
  985. a->sentDISC_ = 0;
  986. a->SABME_req_ = 0;
  987. a->sentREJ_ = 0;
  988. a->save_ = NULL;
  989. a->rtx_timer_ = new HdlcTimer(this, a, &HDLC::timeout);
  990. a->reset_timer_ = new HdlcTimer(this, a, &HDLC::reset);
  991.         a->delay_timer_ = new HdlcTimer(this, a, &HDLC::delayTimeout);
  992. a->nextpkt_ = 0;
  993. a->next_ = 0;
  994. if (selRepeat_) {
  995. a->seen_ = new Packet*[(HDLC_MWM+1)];
  996. memset(a->seen_, 0, (sizeof(Packet *) * (HDLC_MWM+1)));
  997. }
  998. return a;
  999. }
  1000. ARQstate *HDLC::createState(int next_hop)
  1001. {
  1002. ARQstate *a = list_head_;
  1003. if (list_head_ == 0 ) {
  1004. list_head_ = newEntry(next_hop);
  1005. return list_head_;
  1006. } else {
  1007. while (a->next_)
  1008. a = a->next_;
  1009. a->next_ = newEntry(next_hop);
  1010. return (a->next_);
  1011. }
  1012. }
  1013. ARQstate *HDLC::checkState(int next_hop)
  1014. {
  1015. ARQstate *a;
  1016. if (list_head_ == 0)
  1017. return 0;
  1018. for(a=list_head_; a != 0; a=a->next_) {
  1019. if (a->nh_ == next_hop)
  1020. return a;
  1021. }
  1022. // no existing state
  1023. return 0;
  1024. }
  1025. void HDLC::removeState(int next_hop)
  1026. {
  1027. ARQstate *a, *p;
  1028. for(p=0, a=list_head_; a != 0; p=a, a=a->next_) {
  1029. if (a->nh_ == next_hop) {
  1030. if (a == list_head_) {
  1031. if (a->next_ == 0)
  1032. list_head_ = 0;
  1033. else
  1034. list_head_ = a->next_;
  1035. delete a;
  1036. return;
  1037. } else {
  1038. p->next_ = a->next_;
  1039. delete a;
  1040. return;
  1041. }
  1042. }
  1043. }
  1044. fprintf(stderr, "HDLC:removeState() couldn't find staten");
  1045. }