lapb.c
上传用户:hepax88
上传日期:2007-01-03
资源大小:1101k
文件大小:17k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

  1. /* Link Access Procedures Balanced (LAPB), the upper sublayer of
  2.  * AX.25 Level 2.
  3.  *
  4.  * Copyright 1991 Phil Karn, KA9Q
  5.  */
  6. #include "global.h"
  7. #include "mbuf.h"
  8. #include "timer.h"
  9. #include "ax25.h"
  10. #include "lapb.h"
  11. #include "ip.h"
  12. #include "netrom.h"
  13. static void handleit(struct ax25_cb *axp,int pid,struct mbuf **bp);
  14. static void procdata(struct ax25_cb *axp,struct mbuf **bp);
  15. static int ackours(struct ax25_cb *axp,uint16 n);
  16. static void clr_ex(struct ax25_cb *axp);
  17. static void enq_resp(struct ax25_cb *axp);
  18. static void inv_rex(struct ax25_cb *axp);
  19. /* Process incoming frames */
  20. int
  21. lapb_input(
  22. struct ax25_cb *axp, /* Link control structure */
  23. int cmdrsp, /* Command/response flag */
  24. struct mbuf **bpp /* Rest of frame, starting with ctl */
  25. ){
  26. int control;
  27. int class; /* General class (I/S/U) of frame */
  28. uint16 type; /* Specific type (I/RR/RNR/etc) of frame */
  29. char pf; /* extracted poll/final bit */
  30. char poll = 0;
  31. char final = 0;
  32. uint16 nr; /* ACK number of incoming frame */
  33. uint16 ns; /* Seq number of incoming frame */
  34. uint16 tmp;
  35. if(bpp == NULL || *bpp == NULL || axp == NULL){
  36. free_p(bpp);
  37. return -1;
  38. }
  39. /* Extract the various parts of the control field for easy use */
  40. if((control = PULLCHAR(bpp)) == -1){
  41. free_p(bpp); /* Probably not necessary */
  42. return -1;
  43. }
  44. type = ftype(control);
  45. class = type & 0x3;
  46. pf = control & PF;
  47. /* Check for polls and finals */
  48. if(pf){
  49. switch(cmdrsp){
  50. case LAPB_COMMAND:
  51. poll = YES;
  52. break;
  53. case LAPB_RESPONSE:
  54. final = YES;
  55. break;
  56. }
  57. }
  58. /* Extract sequence numbers, if present */
  59. switch(class){
  60. case I:
  61. case I+2:
  62. ns = (control >> 1) & MMASK;
  63. case S: /* Note fall-thru */
  64. nr = (control >> 5) & MMASK;
  65. break;
  66. }
  67. /* This section follows the SDL diagrams by K3NA fairly closely */
  68. switch(axp->state){
  69. case LAPB_DISCONNECTED:
  70. switch(type){
  71. case SABM: /* Initialize or reset link */
  72. sendctl(axp,LAPB_RESPONSE,UA|pf); /* Always accept */
  73. clr_ex(axp);
  74. axp->unack = axp->vr = axp->vs = 0;
  75. lapbstate(axp,LAPB_CONNECTED);/* Resets state counters */
  76. axp->srt = Axirtt;
  77. axp->mdev = 0;
  78. set_timer(&axp->t1,2*axp->srt);
  79. start_timer(&axp->t3);
  80. break;
  81. case DM: /* Ignore to avoid infinite loops */
  82. break;
  83. default: /* All others get DM */
  84. if(poll)
  85. sendctl(axp,LAPB_RESPONSE,DM|pf);
  86. break;
  87. }
  88. break;
  89. case LAPB_SETUP:
  90. switch(type){
  91. case SABM: /* Simultaneous open */
  92. sendctl(axp,LAPB_RESPONSE,UA|pf);
  93. break;
  94. case DISC:
  95. sendctl(axp,LAPB_RESPONSE,DM|pf);
  96. break;
  97. case UA: /* Connection accepted */
  98. /* Note: xmit queue not cleared */
  99. stop_timer(&axp->t1);
  100. start_timer(&axp->t3);
  101. axp->unack = axp->vr = axp->vs = 0;
  102. lapbstate(axp,LAPB_CONNECTED);
  103. break;
  104. case DM: /* Connection refused */
  105. free_q(&axp->txq);
  106. stop_timer(&axp->t1);
  107. axp->reason = LB_DM;
  108. lapbstate(axp,LAPB_DISCONNECTED);
  109. break;
  110. default: /* All other frames ignored */
  111. break;
  112. }
  113. break;
  114. case LAPB_DISCPENDING:
  115. switch(type){
  116. case SABM:
  117. sendctl(axp,LAPB_RESPONSE,DM|pf);
  118. break;
  119. case DISC:
  120. sendctl(axp,LAPB_RESPONSE,UA|pf);
  121. break;
  122. case UA:
  123. case DM:
  124. stop_timer(&axp->t1);
  125. lapbstate(axp,LAPB_DISCONNECTED);
  126. break;
  127. default: /* Respond with DM only to command polls */
  128. if(poll)
  129. sendctl(axp,LAPB_RESPONSE,DM|pf);
  130. break;
  131. }
  132. break;
  133. case LAPB_CONNECTED:
  134. switch(type){
  135. case SABM:
  136. sendctl(axp,LAPB_RESPONSE,UA|pf);
  137. clr_ex(axp);
  138. free_q(&axp->txq);
  139. stop_timer(&axp->t1);
  140. start_timer(&axp->t3);
  141. axp->unack = axp->vr = axp->vs = 0;
  142. lapbstate(axp,LAPB_CONNECTED); /* Purge queues */
  143. break;
  144. case DISC:
  145. free_q(&axp->txq);
  146. sendctl(axp,LAPB_RESPONSE,UA|pf);
  147. stop_timer(&axp->t1);
  148. stop_timer(&axp->t3);
  149. axp->reason = LB_NORMAL;
  150. lapbstate(axp,LAPB_DISCONNECTED);
  151. break;
  152. case DM:
  153. axp->reason = LB_DM;
  154. lapbstate(axp,LAPB_DISCONNECTED);
  155. break;
  156. case UA:
  157. est_link(axp);
  158. lapbstate(axp,LAPB_SETUP); /* Re-establish */
  159. break;
  160. case FRMR:
  161. est_link(axp);
  162. lapbstate(axp,LAPB_SETUP); /* Re-establish link */
  163. break;
  164. case RR:
  165. case RNR:
  166. axp->flags.remotebusy = (control == RNR) ? YES : NO;
  167. if(poll)
  168. enq_resp(axp);
  169. ackours(axp,nr);
  170. break;
  171. case REJ:
  172. axp->flags.remotebusy = NO;
  173. if(poll)
  174. enq_resp(axp);
  175. ackours(axp,nr);
  176. stop_timer(&axp->t1);
  177. start_timer(&axp->t3);
  178. /* This may or may not actually invoke transmission,
  179.  * depending on whether this REJ was caused by
  180.  * our losing his prior ACK.
  181.  */
  182. inv_rex(axp);
  183. break;
  184. case I:
  185. ackours(axp,nr); /** == -1) */
  186. if(len_p(axp->rxq) >= axp->window){
  187. /* Too bad he didn't listen to us; he'll
  188.  * have to resend the frame later. This
  189.  * drastic action is necessary to avoid
  190.  * deadlock.
  191.  */
  192. if(poll)
  193. sendctl(axp,LAPB_RESPONSE,RNR|pf);
  194. free_p(bpp);
  195. break;
  196. }
  197. /* Reject or ignore I-frames with receive sequence number errors */
  198. if(ns != axp->vr){
  199. if(axp->proto == V1 || !axp->flags.rejsent){
  200. axp->flags.rejsent = YES;
  201. sendctl(axp,LAPB_RESPONSE,REJ | pf);
  202. } else if(poll)
  203. enq_resp(axp);
  204. axp->response = 0;
  205. break;
  206. }
  207. axp->flags.rejsent = NO;
  208. axp->vr = (axp->vr+1) & MMASK;
  209. tmp = len_p(axp->rxq) >= axp->window ? RNR : RR;
  210. if(poll){
  211. sendctl(axp,LAPB_RESPONSE,tmp|PF);
  212. } else {
  213. axp->response = tmp;
  214. }
  215. procdata(axp,bpp);
  216. break;
  217. default: /* All others ignored */
  218. break;
  219. }
  220. break;
  221. case LAPB_RECOVERY:
  222. switch(type){
  223. case SABM:
  224. sendctl(axp,LAPB_RESPONSE,UA|pf);
  225. clr_ex(axp);
  226. stop_timer(&axp->t1);
  227. start_timer(&axp->t3);
  228. axp->unack = axp->vr = axp->vs = 0;
  229. lapbstate(axp,LAPB_CONNECTED); /* Purge queues */
  230. break;
  231. case DISC:
  232. free_q(&axp->txq);
  233. sendctl(axp,LAPB_RESPONSE,UA|pf);
  234. stop_timer(&axp->t1);
  235. stop_timer(&axp->t3);
  236. axp->response = UA;
  237. axp->reason = LB_NORMAL;
  238. lapbstate(axp,LAPB_DISCONNECTED);
  239. break;
  240. case DM:
  241. axp->reason = LB_DM;
  242. lapbstate(axp,LAPB_DISCONNECTED);
  243. break;
  244. case UA:
  245. est_link(axp);
  246. lapbstate(axp,LAPB_SETUP); /* Re-establish */
  247. break;
  248. case FRMR:
  249. est_link(axp);
  250. lapbstate(axp,LAPB_SETUP); /* Re-establish link */
  251. break;
  252. case RR:
  253. case RNR:
  254. axp->flags.remotebusy = (control == RNR) ? YES : NO;
  255. if(axp->proto == V1 || final){
  256. stop_timer(&axp->t1);
  257. ackours(axp,nr);
  258. if(axp->unack != 0){
  259. inv_rex(axp);
  260. } else {
  261. start_timer(&axp->t3);
  262. lapbstate(axp,LAPB_CONNECTED);
  263. }
  264. } else {
  265. if(poll)
  266. enq_resp(axp);
  267. ackours(axp,nr);
  268. /* Keep timer running even if all frames
  269.  * were acked, since we must see a Final
  270.  */
  271. if(!run_timer(&axp->t1))
  272. start_timer(&axp->t1);
  273. }
  274. break;
  275. case REJ:
  276. axp->flags.remotebusy = NO;
  277. /* Don't insist on a Final response from the old proto */
  278. if(axp->proto == V1 || final){
  279. stop_timer(&axp->t1);
  280. ackours(axp,nr);
  281. if(axp->unack != 0){
  282. inv_rex(axp);
  283. } else {
  284. start_timer(&axp->t3);
  285. lapbstate(axp,LAPB_CONNECTED);
  286. }
  287. } else {
  288. if(poll)
  289. enq_resp(axp);
  290. ackours(axp,nr);
  291. if(axp->unack != 0){
  292. /* This is certain to trigger output */
  293. inv_rex(axp);
  294. }
  295. /* A REJ that acks everything but doesn't
  296.  * have the F bit set can cause a deadlock.
  297.  * So make sure the timer is running.
  298.  */
  299. if(!run_timer(&axp->t1))
  300. start_timer(&axp->t1);
  301. }
  302. break;
  303. case I:
  304. ackours(axp,nr); /** == -1) */
  305. /* Make sure timer is running, since an I frame
  306.  * cannot satisfy a poll
  307.  */
  308. if(!run_timer(&axp->t1))
  309. start_timer(&axp->t1);
  310. if(len_p(axp->rxq) >= axp->window){
  311. /* Too bad he didn't listen to us; he'll
  312.  * have to resend the frame later. This
  313.  * drastic action is necessary to avoid
  314.  * memory deadlock.
  315.  */
  316. sendctl(axp,LAPB_RESPONSE,RNR | pf);
  317. free_p(bpp);
  318. break;
  319. }
  320. /* Reject or ignore I-frames with receive sequence number errors */
  321. if(ns != axp->vr){
  322. if(axp->proto == V1 || !axp->flags.rejsent){
  323. axp->flags.rejsent = YES;
  324. sendctl(axp,LAPB_RESPONSE,REJ | pf);
  325. } else if(poll)
  326. enq_resp(axp);
  327. axp->response = 0;
  328. break;
  329. }
  330. axp->flags.rejsent = NO;
  331. axp->vr = (axp->vr+1) & MMASK;
  332. tmp = len_p(axp->rxq) >= axp->window ? RNR : RR;
  333. if(poll){
  334. sendctl(axp,LAPB_RESPONSE,tmp|PF);
  335. } else {
  336. axp->response = tmp;
  337. }
  338. procdata(axp,bpp);
  339. break;
  340. default:
  341. break; /* Ignored */
  342. }
  343. break;
  344. }
  345. free_p(bpp); /* In case anything's left */
  346. /* See if we can send some data, perhaps piggybacking an ack.
  347.  * If successful, lapb_output will clear axp->response.
  348.  */
  349. lapb_output(axp);
  350. if(axp->response != 0){
  351. sendctl(axp,LAPB_RESPONSE,axp->response);
  352. axp->response = 0;
  353. }
  354. return 0;
  355. }
  356. /* Handle incoming acknowledgements for frames we've sent.
  357.  * Free frames being acknowledged.
  358.  * Return -1 to cause a frame reject if number is bad, 0 otherwise
  359.  */
  360. static int
  361. ackours(
  362. struct ax25_cb *axp,
  363. uint16 n
  364. ){
  365. struct mbuf *bp;
  366. int acked = 0; /* Count of frames acked by this ACK */
  367. uint16 oldest; /* Seq number of oldest unacked I-frame */
  368. int32 rtt,abserr;
  369. /* Free up acknowledged frames by purging frames from the I-frame
  370.  * transmit queue. Start at the remote end's last reported V(r)
  371.  * and keep going until we reach the new sequence number.
  372.  * If we try to free a null pointer,
  373.  * then we have a frame reject condition.
  374.  */
  375. oldest = (axp->vs - axp->unack) & MMASK;
  376. while(axp->unack != 0 && oldest != n){
  377. if((bp = dequeue(&axp->txq)) == NULL){
  378. /* Acking unsent frame */
  379. return -1;
  380. }
  381. free_p(&bp);
  382. axp->unack--;
  383. acked++;
  384. if(axp->flags.rtt_run && axp->rtt_seq == oldest){
  385. /* A frame being timed has been acked */
  386. axp->flags.rtt_run = 0;
  387. /* Update only if frame wasn't retransmitted */
  388. if(!axp->flags.retrans){
  389. rtt = msclock() - axp->rtt_time;
  390. abserr = (rtt > axp->srt) ? rtt - axp->srt :
  391.  axp->srt - rtt;
  392. /* Run SRT and mdev integrators */
  393. axp->srt = ((axp->srt * 7) + rtt + 4) >> 3;
  394. axp->mdev = ((axp->mdev*3) + abserr + 2) >> 2;
  395. /* Update timeout */
  396. set_timer(&axp->t1,4*axp->mdev+axp->srt);
  397. }
  398. }
  399. axp->flags.retrans = 0;
  400. axp->retries = 0;
  401. oldest = (oldest + 1) & MMASK;
  402. }
  403. if(axp->unack == 0){
  404. /* All frames acked, stop timeout */
  405. stop_timer(&axp->t1);
  406. start_timer(&axp->t3);
  407. } else if(acked != 0) { 
  408. /* Partial ACK; restart timer */
  409. start_timer(&axp->t1);
  410. }
  411. if(acked != 0){
  412. /* If user has set a transmit upcall, indicate how many frames
  413.  * may be queued
  414.  */
  415. if(axp->t_upcall != NULL)
  416. (*axp->t_upcall)(axp,axp->paclen * (axp->maxframe - axp->unack));
  417. }
  418. return 0;
  419. }
  420. /* Establish data link */
  421. void
  422. est_link(axp)
  423. struct ax25_cb *axp;
  424. {
  425. clr_ex(axp);
  426. axp->retries = 0;
  427. sendctl(axp,LAPB_COMMAND,SABM|PF);
  428. stop_timer(&axp->t3);
  429. start_timer(&axp->t1);
  430. }
  431. /* Clear exception conditions */
  432. static void
  433. clr_ex(axp)
  434. struct ax25_cb *axp;
  435. {
  436. axp->flags.remotebusy = NO;
  437. axp->flags.rejsent = NO;
  438. axp->response = 0;
  439. stop_timer(&axp->t3);
  440. }
  441. /* Enquiry response */
  442. static void
  443. enq_resp(axp)
  444. struct ax25_cb *axp;
  445. {
  446. char ctl;
  447. ctl = len_p(axp->rxq) >= axp->window ? RNR|PF : RR|PF;
  448. sendctl(axp,LAPB_RESPONSE,ctl);
  449. axp->response = 0;
  450. stop_timer(&axp->t3);
  451. }
  452. /* Invoke retransmission */
  453. static void
  454. inv_rex(axp)
  455. struct ax25_cb *axp;
  456. {
  457. axp->vs -= axp->unack;
  458. axp->vs &= MMASK;
  459. axp->unack = 0;
  460. }
  461. /* Send S or U frame to currently connected station */
  462. int
  463. sendctl(axp,cmdrsp,cmd)
  464. struct ax25_cb *axp;
  465. int cmdrsp;
  466. int cmd;
  467. {
  468. if((ftype((char)cmd) & 0x3) == S) /* Insert V(R) if S frame */
  469. cmd |= (axp->vr << 5);
  470. return sendframe(axp,cmdrsp,cmd,NULL);
  471. }
  472. /* Start data transmission on link, if possible
  473.  * Return number of frames sent
  474.  */
  475. int
  476. lapb_output(axp)
  477. register struct ax25_cb *axp;
  478. {
  479. register struct mbuf *bp;
  480. struct mbuf *tbp;
  481. char control;
  482. int sent = 0;
  483. int i;
  484. if(axp == NULL
  485.  || (axp->state != LAPB_RECOVERY && axp->state != LAPB_CONNECTED)
  486.  || axp->flags.remotebusy)
  487. return 0;
  488. /* Dig into the send queue for the first unsent frame */
  489. bp = axp->txq;
  490. for(i = 0; i < axp->unack; i++){
  491. if(bp == NULL)
  492. break; /* Nothing to do */
  493. bp = bp->anext;
  494. }
  495. /* Start at first unsent I-frame, stop when either the
  496.  * number of unacknowledged frames reaches the maxframe limit,
  497.  * or when there are no more frames to send
  498.  */
  499. while(bp != NULL && axp->unack < axp->maxframe){
  500. control = I | (axp->vs++ << 1) | (axp->vr << 5);
  501. axp->vs &= MMASK;
  502. dup_p(&tbp,bp,0,len_p(bp));
  503. if(tbp == NULL)
  504. return sent; /* Probably out of memory */
  505. sendframe(axp,LAPB_COMMAND,control,&tbp);
  506. axp->unack++;
  507. /* We're implicitly acking any data he's sent, so stop any
  508.  * delayed ack
  509.  */
  510. axp->response = 0;
  511. if(!run_timer(&axp->t1)){
  512. stop_timer(&axp->t3);
  513. start_timer(&axp->t1);
  514. }
  515. sent++;
  516. bp = bp->anext;
  517. if(!axp->flags.rtt_run){
  518. /* Start round trip timer */
  519. axp->rtt_seq = (control >> 1) & MMASK;
  520. axp->rtt_time = msclock();
  521. axp->flags.rtt_run = 1;
  522. }
  523. }
  524. return sent;
  525. }
  526. /* General purpose AX.25 frame output */
  527. int
  528. sendframe(
  529. struct ax25_cb *axp,
  530. int cmdrsp,
  531. int ctl,
  532. struct mbuf **data
  533. ){
  534. return axsend(axp->iface,axp->remote,axp->local,cmdrsp,ctl,data);
  535. }
  536. /* Set new link state */
  537. void
  538. lapbstate(
  539. struct ax25_cb *axp,
  540. int s
  541. ){
  542. int oldstate;
  543. oldstate = axp->state;
  544. axp->state = s;
  545. if(s == LAPB_DISCONNECTED){
  546. stop_timer(&axp->t1);
  547. stop_timer(&axp->t3);
  548. free_q(&axp->txq);
  549. }
  550. /* Don't bother the client unless the state is really changing */
  551. if(oldstate != s && axp->s_upcall != NULL)
  552. (*axp->s_upcall)(axp,oldstate,s);
  553. }
  554. /* Process a valid incoming I frame */
  555. static void
  556. procdata(
  557. struct ax25_cb *axp,
  558. struct mbuf **bpp
  559. ){
  560. int pid;
  561. int seq;
  562. /* Extract level 3 PID */
  563. if((pid = PULLCHAR(bpp)) == -1)
  564. return; /* No PID */
  565. if(axp->segremain != 0){
  566. /* Reassembly in progress; continue */
  567. seq = PULLCHAR(bpp);
  568. if(pid == PID_SEGMENT
  569.  && (seq & SEG_REM) == axp->segremain - 1){
  570. /* Correct, in-order segment */
  571. append(&axp->rxasm,bpp);
  572. if((axp->segremain = (seq & SEG_REM)) == 0){
  573. /* Done; kick it upstairs */
  574. *bpp = axp->rxasm;
  575. axp->rxasm = NULL;
  576. pid = PULLCHAR(bpp);
  577. handleit(axp,pid,bpp);
  578. }
  579. } else {
  580. /* Error! */
  581. free_p(&axp->rxasm);
  582. axp->rxasm = NULL;
  583. axp->segremain = 0;
  584. free_p(bpp);
  585. }
  586. } else {
  587. /* No reassembly in progress */
  588. if(pid == PID_SEGMENT){
  589. /* Start reassembly */
  590. seq = PULLCHAR(bpp);
  591. if(!(seq & SEG_FIRST)){
  592. free_p(bpp); /* not first seg - error! */
  593. } else {
  594. /* Put first segment on list */
  595. axp->segremain = seq & SEG_REM;
  596. axp->rxasm = (*bpp);
  597. *bpp = NULL;
  598. }
  599. } else {
  600. /* Normal frame; send upstairs */
  601. handleit(axp,pid,bpp);
  602. }
  603. }
  604. }
  605. /* New-style frame segmenter. Returns queue of segmented fragments, or
  606.  * original packet if small enough
  607.  */
  608. struct mbuf *
  609. segmenter(
  610. struct mbuf **bpp, /* Complete packet */
  611. uint16 ssize /* Max size of frame segments */
  612. ){
  613. struct mbuf *result = NULL;
  614. struct mbuf *bptmp;
  615. uint16 len,offset;
  616. int segments;
  617. /* See if packet is too small to segment. Note 1-byte grace factor
  618.  * so the PID will not cause segmentation of a 256-byte IP datagram.
  619.  */
  620. len = len_p(*bpp);
  621. if(len <= ssize+1){
  622. result = *bpp;
  623. *bpp = NULL;
  624. return result; /* Too small to segment */
  625. }
  626. ssize -= 2; /* ssize now equal to data portion size */
  627. segments = 1 + (len - 1) / ssize; /* # segments  */
  628. offset = 0;
  629. while(segments != 0){
  630. offset += dup_p(&bptmp,*bpp,offset,ssize);
  631. if(bptmp == NULL){
  632. free_q(&result);
  633. break;
  634. }
  635. /* Make room for segmentation header */
  636. pushdown(&bptmp,NULL,2);
  637. bptmp->data[0] = PID_SEGMENT;
  638. bptmp->data[1] = --segments;
  639. if(offset == ssize)
  640. bptmp->data[1] |= SEG_FIRST;
  641. enqueue(&result,&bptmp);
  642. }
  643. free_p(bpp);
  644. return result;
  645. }
  646. static void
  647. handleit(
  648. struct ax25_cb *axp,
  649. int pid,
  650. struct mbuf **bpp
  651. ){
  652. struct axlink *ipp;
  653. for(ipp = Axlink;ipp->funct != NULL;ipp++){
  654. if(ipp->pid == pid)
  655. break;
  656. }
  657. if(ipp->funct != NULL)
  658. (*ipp->funct)(axp->iface,axp,NULL,NULL,bpp,0);
  659. else
  660. free_p(bpp);
  661. }
  662. /* Handle ordinary incoming data (no network protocol) */
  663. void
  664. axnl3(
  665. struct iface *iface,
  666. struct ax25_cb *axp,
  667. uint8 *src,
  668. uint8 *dest,
  669. struct mbuf **bpp,
  670. int mcast
  671. ){
  672. if(axp == NULL){
  673. beac_input(iface,src,bpp);
  674. } else {
  675. append(&axp->rxq,bpp);
  676. if(axp->r_upcall != NULL)
  677. (*axp->r_upcall)(axp,len_p(axp->rxq));
  678. }
  679. }