void process_rf_serial_byte(uint8_t byte) { switch (rcv_state) { case UART_RX_STATE_SOT: rcv_buff_ptr = rcv_buffer; if (SOT == byte) { rcv_state = UART_RX_STATE_LENGTH; } break; case UART_RX_STATE_LENGTH: rcv_length = byte; if (rcv_length) { rcv_state = UART_RX_STATE_DATA; *rcv_buff_ptr = rcv_length; rcv_buff_ptr++; } else { /* NULL message */ rcv_buff_ptr = rcv_buffer; rcv_state = UART_RX_STATE_SOT; } break; case UART_RX_STATE_DATA: *rcv_buff_ptr = byte; rcv_buff_ptr++; rcv_length--; if (!rcv_length) { rcv_state = UART_RX_STATE_EOT; } break; case UART_RX_STATE_EOT: if (EOT == byte) { /* Message received successfully */ handle_rx_frame(); } /* Make rx buffer ready for next reception before handling received data. */ rcv_buff_ptr = rcv_buffer; rcv_state = UART_RX_STATE_SOT; break; default: rcv_buff_ptr = rcv_buffer; rcv_state = UART_RX_STATE_SOT; break; } }
/** * @brief Process data received from SIO */ static void api_process_incoming_sio_data(void) { switch (rcv_state) { case UART_RX_STATE_SOT: rcv_buff_ptr = rcv_buffer; if (SOT == data[rx_index]) { rcv_state = UART_RX_STATE_LENGTH; } break; case UART_RX_STATE_LENGTH: rcv_length = data[rx_index]; if (rcv_length) { rcv_state = UART_RX_STATE_DATA; *rcv_buff_ptr = rcv_length; rcv_buff_ptr++; } else { /* NULL message */ rcv_buff_ptr = rcv_buffer; rcv_state = UART_RX_STATE_SOT; } break; case UART_RX_STATE_DATA: *rcv_buff_ptr = data[rx_index]; rcv_buff_ptr++; rcv_length--; if (!rcv_length) { rcv_state = UART_RX_STATE_EOT; } break; case UART_RX_STATE_EOT: if (EOT == data[rx_index]) { /* Message received successfully */ handle_rx_frame(); } /* Make rx buffer ready for next reception before handling * received data. */ rcv_buff_ptr = rcv_buffer; rcv_state = UART_RX_STATE_SOT; break; default: rcv_buff_ptr = rcv_buffer; rcv_state = UART_RX_STATE_SOT; break; } }
static void handle_monitor_read(int sock, void *eloop_ctx, void *sock_ctx) { struct nl80211_data* ctx = eloop_ctx; int len; unsigned char buf[3000]; struct ieee80211_radiotap_iterator iter; int ret; int datarate = 0, ssi_signal = 0; int injected = 0, failed = 0, rxflags = 0; len = recv(sock, buf, sizeof(buf), 0); if (len < 0) { fprintf(stderr, "nl80211: Monitor socket recv failed: %s\n", strerror(errno)); return; } if (ieee80211_radiotap_iterator_init(&iter, (void *) buf, len, NULL)) { fprintf(stderr, "nl80211: received invalid radiotap frame\n"); return; } while (1) { ret = ieee80211_radiotap_iterator_next(&iter); if (ret == -ENOENT) break; if (ret) { fprintf(stderr, "nl80211: received invalid radiotap frame (%d)\n", ret); return; } switch (iter.this_arg_index) { case IEEE80211_RADIOTAP_FLAGS: if (*iter.this_arg & IEEE80211_RADIOTAP_F_FCS) len -= 4; break; case IEEE80211_RADIOTAP_RX_FLAGS: rxflags = 1; break; case IEEE80211_RADIOTAP_TX_FLAGS: injected = 1; failed = le_to_host16((*(uint16_t *) iter.this_arg)) &IEEE80211_RADIOTAP_F_TX_FAIL; break; case IEEE80211_RADIOTAP_DATA_RETRIES: break; case IEEE80211_RADIOTAP_CHANNEL: /* TODO: convert from freq/flags to channel number */ break; case IEEE80211_RADIOTAP_RATE: datarate = *iter.this_arg * 5; break; case IEEE80211_RADIOTAP_DBM_ANTSIGNAL: ssi_signal = (s8) *iter.this_arg; break; } } if (rxflags && injected) return; if (!injected) handle_rx_frame(ctx, buf + iter._max_length, len - iter._max_length, datarate, ssi_signal); else handle_tx_frame(ctx, buf + iter._max_length, len - iter._max_length, !failed); }