Guest User

Untitled

a guest
Jan 23rd, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.22 KB | None | 0 0
  1. static void *receive_handler(void *args) {
  2.  
  3. struct thread_args *local_args = args;
  4. struct sockaddr_in6 *client_address = local_args->client_address;
  5. //struct itimerval timer_val;
  6. int32_t conn_fd = local_args->conn_fd;
  7. int32_t val_read = 0;
  8. int32_t resp_code = 0;
  9. uint32_t sendBuffLen = 0;
  10. int8_t buffer[BUFFER_SIZE] = { 0 };
  11. uint8_t RetBuff[1024] = { 0 };
  12. int8_t rx_addr_str[INET6_ADDRSTRLEN];
  13. int8_t byte = 0;
  14. int16_t idx = ePacketType;
  15. int16_t packet_len = 0;
  16. int16_t calculated_crc = 0, recv_crc = 0;
  17. uint16_t num_bytes = 0;
  18.  
  19. memset(rx_addr_str, 0, INET6_ADDRSTRLEN);
  20. inet_ntop(AF_INET6, &(client_address->sin6_addr), rx_addr_str, INET6_ADDRSTRLEN);
  21. printf("nRx Thread (%d) Created for %sn", local_args->connection_no, rx_addr_str);
  22.  
  23. int eState = eStart_Frame;
  24.  
  25. memcpy(rx_Packet_Info[local_args->connection_no].inet6, rx_addr_str, INET6_ADDRSTRLEN);
  26.  
  27. //timerclear(&timer_val.it_interval); /* zero interval means no reset of timer */
  28. //timerclear(&timer_val.it_value);
  29. //timer_val.it_value.tv_sec = 10; /* 10 second timeout */
  30.  
  31. //(void) signal(SIGALRM, state_reset_handler);
  32.  
  33. while (1) {
  34.  
  35. if (eState != eChecksum_Verify) {
  36. val_read = -1;
  37. val_read = recv(conn_fd, &byte, sizeof(byte), 0);
  38. debug_printf(INFO, "Amount Read: %d Byte Rxd: 0x%x => 0x%Xn", val_read, (byte & 0xFF), byte);
  39. if (val_read <= 0) {
  40. if (parse_packet("ERR_DISCONNECT", rx_addr_str, local_args->connection_no) < 0) {
  41. debug_printf(ERR, "Error parsing packet: %sn", strerror(errno));
  42. }
  43. debug_printf(ERR, "May be closed by client %s: %sn", rx_addr_str, strerror(errno));
  44. debug_printf(ERR, "Exiting Rx Thread: ConnIdx: %d", num_connections);
  45. close(conn_fd);
  46. pthread_exit(NULL);
  47. }
  48. }
  49.  
  50. switch (eState) {
  51.  
  52. case eStart_Frame:
  53. debug_printf(DEBG, "Current State: %dn", eState);
  54. if ((val_read > 0) && (byte & 0xFF) == SOP) {
  55. memset(buffer, 0, BUFFER_SIZE);
  56. val_read = -1;
  57. buffer[eSOP] = (byte & 0xFF);
  58. eState = eFrame_Len;
  59. }
  60. break;
  61.  
  62. case eFrame_Len: {
  63. static char MSB_Rxd = 0;
  64. debug_printf(DEBG, "Current State: %dn", eState);
  65. if (val_read > 0) {
  66. if (MSB_Rxd == 0) {
  67. buffer[ePacket_length] = byte;
  68. MSB_Rxd = 1;
  69. }
  70. else {
  71. buffer[ePacket_length + 1] = byte;
  72. eState = eFrame;
  73. num_bytes = 0;
  74. MSB_Rxd = 0;
  75. packet_len = (buffer[ePacket_length] & 0xFF << 8) | (buffer[ePacket_length + 1]);
  76. debug_printf(INFO, "Packet Length: %d : 0x%x 0x%xn", packet_len,
  77. buffer[ePacket_length], buffer[ePacket_length + 1]);
  78. }
  79. }
  80. }
  81. break;
  82.  
  83. case eFrame:
  84. debug_printf(DEBG, "Current State: %dn", eState);
  85. num_bytes++;
  86. buffer[idx] = byte;
  87. if (num_bytes == packet_len) {
  88. eState = eEnd_Frame;
  89. debug_printf(DEBG, "Num bytes: 0x%xn", num_bytes);
  90. }
  91. else {
  92. debug_printf(ERR, "Num bytes: 0x%x Pkt Len: 0x%xn", num_bytes, packet_len);
  93. }
  94. idx++;
  95. break;
  96.  
  97. case eEnd_Frame:
  98. debug_printf(ERR, "Current State: %d val read %dn", eState, val_read);
  99. if ((val_read > 0) && (byte & 0xFF) == EOP) {
  100. val_read = -1;
  101. eState = eChecksum_Verify;
  102. }
  103. break;
  104.  
  105. case eChecksum_Verify: {
  106.  
  107. calculated_crc = crc_16(&buffer[ePacket_length], (num_bytes));
  108. recv_crc = buffer[num_bytes + 1] << 8 | (buffer[num_bytes + 2] & 0xFF);
  109.  
  110. if (calculated_crc != recv_crc) {
  111. debug_printf(ERR, "CRC Error! CRC do not match!!n");
  112. debug_printf(ERR, "Calculated CRC: 0x%XnCRC Rxd: 0x%Xn", calculated_crc, recv_crc);
  113. resp_code = CRC_ERR;
  114. send(conn_fd, &resp_code, sizeof(resp_code), 0);
  115. }
  116. else {
  117. if (rx_Packet_Info[local_args->connection_no].packetUUID != NULL) {
  118. free(rx_Packet_Info[local_args->connection_no].packetUUID);
  119. rx_Packet_Info[local_args->connection_no].packetUUID = NULL;
  120. }
  121.  
  122. rx_Packet_Info[local_args->connection_no].packetUUID = calloc(buffer[ePacketUUIDLen],
  123. sizeof(uint8_t));
  124. memcpy(rx_Packet_Info[local_args->connection_no].packetUUID, &buffer[ePacketUUID],
  125. buffer[ePacketUUIDLen]);
  126. rx_Packet_Info[local_args->connection_no].packetUUIDlength = buffer[ePacketUUIDLen];
  127.  
  128. printf("nRX-Thread-UUID %d: ConnNo: %dn", buffer[ePacketUUIDLen],
  129. local_args->connection_no);
  130. for (char i = 0; i < buffer[ePacketUUIDLen]; i++) {
  131. printf("0x%x ", rx_Packet_Info[local_args->connection_no].packetUUID[i]);
  132. }
  133. printf("n");
  134. if (parse_packet(buffer, rx_addr_str, local_args->connection_no) < 0) {
  135. debug_printf(ERR, "Error parsing packet: %sn", strerror(errno));
  136. }
  137. }
  138. num_bytes = 0;
  139. eState = eStart_Frame;
  140. idx = ePacketType;
  141. }
  142. break;
  143.  
  144. default:
  145. debug_printf(DEBG, "Invalid State!! Should not come here.n");
  146. num_bytes = 0;
  147. eState = eStart_Frame;
  148. idx = ePacketType;
  149. break;
  150. }
  151. }
  152.  
  153. return NULL;
  154. }
Add Comment
Please, Sign In to add comment