Example #1
0
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;
    }
}
Example #2
0
/**
 * @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;
	}
}
Example #3
0
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);
}