Advertisement
Guest User

Untitled

a guest
May 26th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.41 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <math.h>
  4.  
  5. #include "protocol.h"
  6. #include "datalink.h"
  7.  
  8. #define max(x, y) ((x) > (y) ? (x) : (y))
  9. #define min(x, y) ((x) < (y) ? (x) : (y))
  10.  
  11. /* selective */
  12. #define DATA_TIMER  2500
  13. #define ACK_TIMER  1000
  14. #define SEQ_SIZE 44 // 序号空间大小
  15. #define MAX_SEND_WINDOW_SIZE (SEQ_SIZE / 2)
  16. #define MAX_RECV_WINDOW_SIZE (SEQ_SIZE / 2)
  17. #define CRC_CODE_LEN 4
  18.  
  19. /* 宏函数,返回发送窗口的大小 */
  20. #define send_window_size() \
  21.     (send_buffer_l <= send_buffer_r \
  22.         ? send_buffer_r - send_buffer_l : send_buffer_r + SEQ_SIZE - send_buffer_l)
  23. /* 宏函数,返回x+1对序号空间大小取模的结果 */
  24. #define xadd1(x) ((x + 1) % SEQ_SIZE)
  25. /* 宏函数,返回x-1对序号空间大小取模的结果 */
  26. #define xsub1(x) ((x - 1 + SEQ_SIZE) % SEQ_SIZE)
  27. /* 帧的头部的大小,也就是data字段在FRAME结构体中的偏移量 */
  28. #define FRAME_HEAD_SIZE ((unsigned long)&(((struct FRAME*)NULL)->data))
  29.  
  30. struct FRAME {
  31.     unsigned char kind;             /* 帧的类型 */
  32.     unsigned char ack;              /* 数据帧中捎带的ACK字段、ACK帧中的ACK字段、NAK帧中的NAK字段 */
  33.     unsigned char seq;              /* 帧的序号字段 */
  34.     unsigned char data[PKT_LEN];    /* 帧的数据字段 */
  35.     unsigned int  padding;          /* 四字节填充,给CRC校验留位置 */
  36. };
  37. /* 发送缓冲,发送窗口左边界,发送窗口右边界(左开右闭) */
  38. static unsigned char send_buff[SEQ_SIZE][PKT_LEN], send_buffer_l = 0, send_buffer_r = 0;
  39. /* 发送缓冲中数据帧中数据的长度 */
  40. static unsigned int send_data_len[SEQ_SIZE];
  41. /* 接收缓冲,接收窗口左边界,接收窗口右边界(左开右闭) */
  42. static unsigned char recv_buff[SEQ_SIZE][PKT_LEN], recv_buffer_l = 0, recv_buffer_r = MAX_RECV_WINDOW_SIZE;
  43. /* 接收缓冲中数据帧中数据的长度 */
  44. static unsigned int recv_data_len[SEQ_SIZE];
  45. /* 将接收缓冲中数据的长度当成bool值来标识接收窗口中的某一帧是否已经收到 */
  46. #define received recv_data_len
  47. /* 上一次发送的NAK编号 */
  48. static unsigned char last_nak = SEQ_SIZE - 1;
  49. /* 物理层是否准备好 */
  50. static int phl_ready = 0;
  51.  
  52. /*
  53.  * 判断序号k是否在窗口左边界l和右边界r之间
  54.  * l: 窗口左边界
  55.  * r: 窗口右边界
  56.  * k: 要被判断的序号
  57.  */
  58. static int between(unsigned char l, unsigned char r, int k) {
  59.     return (l <= k && k < r) || (l > r && l <= k) || (l > r && k < r);
  60. }
  61.  
  62. /*
  63.  * 在帧末尾添上crc32校验位,然后发送一帧到物理层
  64.  * frame: 指向要发送的整个帧的指针
  65.  * len: 要发送的该帧的长度(包括帧头部一直到数据的结尾,不包括crc校验位)
  66.  */
  67. static void put_frame(unsigned char *frame, unsigned int len) {
  68.     *(unsigned int *)(frame + len) = crc32(frame, len);
  69.     send_frame(frame, len + 4);
  70.     phl_ready = 0;
  71. }
  72.  
  73. /*
  74.  * 从发送缓冲中读取序号为seq的数据帧发送
  75.  * seq: 将要发送的数据帧号
  76.  */
  77. static void send_data_frame(unsigned char seq) {
  78.     struct FRAME s;
  79.  
  80.     s.kind = FRAME_DATA;
  81.     s.seq = seq;
  82.     s.ack = xsub1(recv_buffer_l);
  83.     memcpy(s.data, send_buff[seq], send_data_len[seq]);
  84.     dbg_frame("Send DATA %d %d, ID %d\n", s.seq, s.ack, *(short *)s.data);
  85.  
  86.     put_frame((unsigned char *)&s, FRAME_HEAD_SIZE + send_data_len[seq]);
  87.     stop_ack_timer();
  88.     start_timer(seq, DATA_TIMER);
  89. }
  90.  
  91. /*
  92.  * 发送一个ack帧作为对序号为ack的数据帧的回应
  93.  * ack: 要回复的数据帧的序号
  94.  */
  95. static void send_ack_frame(unsigned char ack) {
  96.     struct FRAME s;
  97.  
  98.     s.kind = FRAME_ACK;
  99.     s.ack = ack;
  100.  
  101.     dbg_frame("Send ACK  %d\n", s.ack);
  102.  
  103.     put_frame((unsigned char *)&s, 2);
  104. }
  105.  
  106. /*
  107.  * 发送一个nak帧给发送方
  108.  * nak: nak帧编号
  109.  */
  110. static void send_nak_frame(unsigned char nak) {
  111.     struct FRAME s;
  112.  
  113.     s.kind = FRAME_NAK;
  114.     s.ack = nak;// nak
  115.  
  116.     dbg_frame("Send NAK  %d\n", s.ack);
  117.  
  118.     put_frame((unsigned char *)&s, 2);
  119.     last_nak = nak;
  120. }
  121.  
  122. /*
  123.  * 程序主函数
  124.  * argc: 参数个数
  125.  * argv: 参数字符串指针
  126.  */
  127. int main(int argc, char **argv) {
  128.     int event, arg;
  129.     struct FRAME f;
  130.     int len = 0;
  131.  
  132.     protocol_init(argc, argv);
  133.     lprintf("Designed by imlk, build: " __DATE__"  "__TIME__"\n");
  134.  
  135.     disable_network_layer();
  136.  
  137.     for (;;) {
  138.         event = wait_for_event(&arg);
  139.  
  140.         switch (event) {
  141.         case NETWORK_LAYER_READY:
  142.             send_buffer_r = xadd1(send_buffer_r);
  143.             unsigned int get_packet_len = get_packet(send_buff[xsub1(send_buffer_r)]);
  144.             send_data_len[xsub1(send_buffer_r)] = get_packet_len;
  145.             send_data_frame(xsub1(send_buffer_r));
  146.             break;
  147.  
  148.         case PHYSICAL_LAYER_READY:
  149.             phl_ready = 1;
  150.             break;
  151.  
  152.         case FRAME_RECEIVED:
  153.             len = recv_frame((unsigned char *)&f, sizeof f);
  154.             if (len < 5 || crc32((unsigned char *)&f, len) != 0) {
  155.                 dbg_event("**** Receiver Error, Bad CRC Checksum\n");
  156.                 break;
  157.             }
  158.             if (f.kind == FRAME_NAK) {
  159.                 dbg_frame("Recv NAK  %d\n", f.ack);
  160.                 send_data_frame(f.ack);
  161.                 // start_timer(f.ack, DATA_TIMER);
  162.                 break;
  163.             }
  164.  
  165.             if (f.kind == FRAME_ACK)
  166.                 dbg_frame("Recv ACK  %d\n", f.ack);
  167.             if (f.kind == FRAME_DATA) {
  168.                 dbg_frame("Recv DATA %d %d, ID %d\n", f.seq, f.ack, *(short *)f.data);
  169.                 len -= (FRAME_HEAD_SIZE + CRC_CODE_LEN);
  170.                 // 是想要的数据
  171.                 if (between(recv_buffer_l, recv_buffer_r, f.seq)) {
  172.                     // 是新包
  173.                     if (!received[f.seq]) {
  174.                         memcpy(recv_buff[f.seq], f.data, len);
  175.                         recv_data_len[f.seq] = len;
  176.                     }
  177.  
  178.                     if (!received[recv_buffer_l]) {
  179.                         if (last_nak != recv_buffer_l) {
  180.                             send_nak_frame(recv_buffer_l);
  181.                         }
  182.                     }
  183.                     // 传送收到的包到网络层
  184.                     while (received[recv_buffer_l]) {
  185.                         put_packet(recv_buff[recv_buffer_l], recv_data_len[recv_buffer_l]);
  186.                         recv_buffer_l = xadd1(recv_buffer_l);
  187.                         received[recv_buffer_r] = 0;
  188.                         recv_buffer_r = xadd1(recv_buffer_r);
  189.                     }
  190.                 }
  191.                 start_ack_timer(ACK_TIMER);
  192.             }
  193.  
  194.             if (between(send_buffer_l, send_buffer_r, f.ack)) { // 在发送区间内
  195.                 while (send_buffer_l != xadd1(f.ack)) {
  196.                     stop_timer(send_buffer_l);
  197.                     send_buffer_l = xadd1(send_buffer_l);
  198.                 }
  199.             }
  200.             break;
  201.  
  202.         case DATA_TIMEOUT:
  203.             dbg_event("---- DATA_TIMEOUT\n");
  204.             send_data_frame(send_buffer_l);
  205.             break;
  206.         case ACK_TIMEOUT:
  207.             send_ack_frame(xsub1(recv_buffer_l));
  208.             break;
  209.         }
  210.  
  211.         dbg_event("---- PHYSICAL_SQ_LEN %d\n", phl_sq_len());
  212.  
  213.         if (send_window_size() < MAX_SEND_WINDOW_SIZE && phl_ready) {
  214.             enable_network_layer();
  215.         } else {
  216.             disable_network_layer();
  217.         }
  218.     }
  219. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement