Advertisement
Guest User

Untitled

a guest
Apr 25th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.14 KB | None | 0 0
  1. /* Protocol 5 (Go-back-n) allows multiple outstanding frames. The sender may transmit up
  2. to MAX SEQ frames without waiting for an ack. In addition, unlike in the previous
  3. protocols, the network layer is not assumed to have a new packet all the time. Instead,
  4. the network layer causes a network layer ready event when there is a packet to send. */
  5. #define MAX SEQ 7
  6. typedef enum {frame arrival, cksum err, timeout, network layer ready} event type;
  7. #include "protocol.h"
  8. static boolean between(seq_nr a, seq_nr b, seq_nr c)
  9. {
  10.     /* Return true if a <= b < c circularly; false otherwise. */
  11.     if (((a <= b) && (b < c)) || ((c < a) && (a <= b)) || ((b < c) && (c < a)))
  12.     return(true);
  13.     else
  14.     return(false);
  15. }
  16. static void send data(seq_nr frame_nr, seq_nr frame expected, packet buffer[ ])
  17. {
  18.     /* Construct and send a data frame. */
  19.     frame s; /* scratch variable */
  20.     s.info = buffer[frame_nr]; /* insert packet into frame */
  21.     s.seq = frame_nr; /* insert sequence number into frame */
  22.     s.ack = (frame expected + MAX SEQ) % (MAX SEQ + 1);/* piggyback ack */
  23.     to physical layer(&s); /* transmit the frame */
  24.     start timer(frame_nr); /* start the timer running */
  25. }
  26. void protocol5(void)
  27. {
  28.     seq_nr next frame to send; /* MAX SEQ > 1; used for outbound stream */
  29.     seq_nr ack expected; /* oldest frame as yet unacknowledged */
  30.     seq_nr frame expected; /* next frame expected on inbound stream */
  31.     frame r; /* scratch variable */
  32.     packet buffer[MAX SEQ + 1]; /* buffers for the outbound stream */
  33.     seq_nr nbuffered; /* number of output buffers currently in use */
  34.     seq_nr i; /* used to index into the buffer array */
  35.     event type event;
  36.     enable network layer(); /* allow network layer ready events */
  37.     ack expected = 0; /* next ack expected inbound */
  38.     next frame to send = 0; /* next frame going out */
  39.     frame expected = 0; /* number of frame expected inbound */
  40.     nbuffered = 0; /* initially no packets are buffered */
  41.     while (true) {
  42.         wait for event(&event); /* four possibilities: see event type above */
  43.         switch(event) {
  44.             case network layer ready: /* the network layer has a packet to send */
  45.                 /* Accept, save, and transmit a new frame. */
  46.                 from network layer(&buffer[next frame to send]); /* fetch new packet */
  47.                 nbuffered = nbuffered + 1; /* expand the sender’s window */
  48.                 send data(next frame to send, frame expected, buffer);/* transmit the frame */
  49.                 inc(next frame to send); /* advance sender’s upper window edge */
  50.                 break;
  51.             case frame arrival: /* a data or control frame has arrived */
  52.                 from physical layer(&r); /* get incoming frame from physical layer */
  53.                 if (r.seq == frame expected) {
  54.                     /* Frames are accepted only in order. */
  55.                     to network layer(&r.info); /* pass packet to network layer */
  56.                     inc(frame expected); /* advance lower edge of receiver’s window */
  57.                 }
  58.                 /* Ack n implies n − 1, n − 2, etc. Check for this. */
  59.                 while (between(ack expected, r.ack, next frame to send)) {
  60.                     /* Handle piggybacked ack. */
  61.                     nbuffered = nbuffered − 1; /* one frame fewer buffered */
  62.                     stop timer(ack expected); /* frame arrived intact; stop timer */
  63.                     inc(ack expected); /* contract sender’s window */
  64.                 }
  65.                 break;
  66.             case cksum err:
  67.                 break; /* just ignore bad frames */
  68.             case timeout: /* trouble; retransmit all outstanding frames */
  69.                 next frame to send = ack expected; /* start retransmitting here */
  70.                 for (i = 1; i <= nbuffered; i++) {
  71.                     send data(next frame to send, frame expected, buffer);/* resend frame */
  72.                     inc(next frame to send); /* prepare to send the next one */
  73.                 }
  74.         }
  75.         if (nbuffered < MAX SEQ)
  76.             enable network layer();
  77.         else
  78.             disable network layer();
  79.     }
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement