|
32 | 32 |
|
33 | 33 | #include "net/ieee802154/radio.h" |
34 | 34 | #include "socket_zep.h" |
| 35 | +#include "random.h" |
35 | 36 |
|
36 | 37 | #define ENABLE_DEBUG 0 |
37 | 38 | #include "debug.h" |
|
47 | 48 | /* dummy packet to register with ZEP dispatcher */ |
48 | 49 | #define SOCKET_ZEP_V2_TYPE_HELLO (255) |
49 | 50 |
|
| 51 | +/* simulate RSSI by calculating error function of LQI */ |
| 52 | +static const uint8_t lqi_to_rssi[256] = { |
| 53 | + 74, 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, |
| 54 | + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, |
| 55 | + 75, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, |
| 56 | + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, |
| 57 | + 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, |
| 58 | + 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 83, |
| 59 | + 83, 83, 83, 83, 83, 84, 84, 84, 84, 85, 85, 85, 85, 85, 86, 86, |
| 60 | + 86, 86, 87, 87, 87, 87, 88, 88, 88, 88, 89, 89, 89, 90, 90, 90, |
| 61 | + 90, 91, 91, 91, 92, 92, 92, 93, 93, 93, 94, 94, 94, 95, 95, 95, |
| 62 | + 96, 96, 96, 97, 97, 97, 98, 98, 98, 99, 99, 100, 100, 100, 101, 101, |
| 63 | + 102, 102, 102, 103, 103, 104, 104, 104, 105, 105, 106, 106, 107, 107, 107, 108, |
| 64 | + 108, 109, 109, 110, 110, 111, 111, 112, 112, 112, 113, 113, 114, 114, 115, 115, |
| 65 | + 116, 116, 117, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 122, 123, 123, |
| 66 | + 124, 124, 125, 125, 126, 126, 127, 127, 128, 128, 129, 129, 130, 130, 131, 131, |
| 67 | + 132, 132, 133, 133, 134, 135, 135, 136, 136, 137, 137, 138, 138, 139, 139, 140, |
| 68 | + 140, 141, 141, 142, 142, 143, 143, 144, 144, 145, 145, 146, 146, 147, 147, 148, |
| 69 | +}; |
| 70 | + |
50 | 71 | static size_t _zep_hdr_fill_v2_data(socket_zep_t *dev, zep_v2_data_hdr_t *hdr, |
51 | 72 | size_t payload_len) |
52 | 73 | { |
@@ -245,12 +266,14 @@ static void _send_ack(void *arg) |
245 | 266 | uint8_t ack[3]; |
246 | 267 | zep_v2_data_hdr_t hdr; |
247 | 268 |
|
| 269 | + /* sending ACK should only happen if we received a frame */ |
248 | 270 | assert(zepdev->state == ZEPDEV_STATE_RX_RECV); |
| 271 | + /* ACK request bit should be set if we get here */ |
249 | 272 | assert((rxbuf[0] & IEEE802154_FCF_ACK_REQ) != 0); |
250 | 273 |
|
251 | 274 | DEBUG("socket_zep::send_ack: seq_no: %u\n", rxbuf[2]); |
252 | 275 |
|
253 | | - _zep_hdr_fill(zepdev, &hdr.hdr, sizeof(ack) + 2); |
| 276 | + _zep_hdr_fill(zepdev, &hdr.hdr, sizeof(ack) + IEEE802154_FCF_LEN); |
254 | 277 |
|
255 | 278 | ack[0] = IEEE802154_FCF_TYPE_ACK; /* FCF */ |
256 | 279 | ack[1] = 0; /* FCF */ |
@@ -561,35 +584,39 @@ static int _read(ieee802154_dev_t *dev, void *buf, size_t max_size, |
561 | 584 | ieee802154_rx_info_t *info) |
562 | 585 | { |
563 | 586 | socket_zep_t *zepdev = dev->priv; |
564 | | - int res = 0; |
| 587 | + size_t res; |
565 | 588 |
|
566 | 589 | DEBUG("socket_zep::read: reading up to %zu bytes into %p\n", max_size, buf); |
567 | 590 |
|
568 | 591 | if (buf == NULL || zepdev->rcv_len == 0) { |
569 | | - goto out; |
| 592 | + return 0; |
570 | 593 | } |
571 | 594 |
|
572 | 595 | DEBUG("socket_zep::read: %zu/%zu bytes into %p\n", |
573 | 596 | max_size, zepdev->rcv_len - sizeof(zep_v2_data_hdr_t) - IEEE802154_FCS_LEN, buf); |
574 | 597 |
|
575 | 598 | if (max_size != zepdev->rcv_len - sizeof(zep_v2_data_hdr_t) - IEEE802154_FCS_LEN) { |
576 | 599 | DEBUG("socket_zep::read: size mismatch!\n"); |
577 | | - res = -EINVAL; |
578 | | - goto out; |
| 600 | + return -EINVAL; |
579 | 601 | } |
580 | 602 |
|
581 | 603 | zep_v2_data_hdr_t *zep = (zep_v2_data_hdr_t *)zepdev->rcv_buf; |
582 | 604 |
|
583 | 605 | if (info) { |
584 | 606 | info->lqi = zep->lqi_val; |
585 | | - info->rssi = -IEEE802154_RADIO_RSSI_OFFSET; |
| 607 | + info->rssi = lqi_to_rssi[zep->lqi_val] |
| 608 | + /* slightly randomize simulated RSSI */ |
| 609 | + + ((random_uint32() & 0x3) - 2); |
586 | 610 | } |
587 | 611 |
|
588 | 612 | /* return payload size without frame checksum */ |
589 | 613 | res = zep->length - IEEE802154_FCS_LEN; |
| 614 | + if (res > max_size) { |
| 615 | + return -ENOBUFS; |
| 616 | + } |
| 617 | + |
590 | 618 | /* skip the ZEP header, just copy payload without FCS */ |
591 | 619 | memcpy(buf, zep + 1, res); |
592 | | -out: |
593 | 620 | return res; |
594 | 621 | } |
595 | 622 |
|
|
0 commit comments