From ba3088c4bd22ddb8d2a5f93a02c96d612caf0271 Mon Sep 17 00:00:00 2001 From: Thomas Eichinger <thomas.eichinger1@gmail.com> Date: Thu, 24 Apr 2014 16:25:24 +0200 Subject: [PATCH] added iot-lab_M3 and temporarily dropped telosb support; split patch.txt into separate patch files --- pkg/openwsn/Makefile | 5 +- pkg/openwsn/Makefile.include | 1 + pkg/openwsn/README.md | 28 +- pkg/openwsn/apply_patches.sh | 14 + pkg/openwsn/patch.txt | 38412 ---------------- .../patches/02a-MAClow_IEEE802154.c.patch | Bin 0 -> 10561 bytes .../patches/02a-MAClow_IEEE802154.h.patch | Bin 0 -> 3023 bytes .../patches/02a-MAClow_IEEE802154E.c.patch | Bin 0 -> 67753 bytes .../patches/02a-MAClow_IEEE802154E.h.patch | Bin 0 -> 10500 bytes pkg/openwsn/patches/02a-MAClow_Makefile.patch | Bin 0 -> 1319 bytes .../02a-MAClow_stupidmac_Makefile.patch | Bin 0 -> 531 bytes .../02a-MAClow_stupidmac_stupidmac.c.patch | Bin 0 -> 3894 bytes .../02a-MAClow_stupidmac_stupidmac.h.patch | Bin 0 -> 1230 bytes .../patches/02a-MAClow_topology.c.patch | Bin 0 -> 1715 bytes .../patches/02a-MAClow_topology.h.patch | Bin .../patches/02b-MAChigh_Makefile.patch | Bin 0 -> 1321 bytes .../patches/02b-MAChigh_neighbors.c.patch | Bin 0 -> 14774 bytes .../patches/02b-MAChigh_neighbors.h.patch | Bin 0 -> 3927 bytes pkg/openwsn/patches/02b-MAChigh_res.c.patch | Bin 0 -> 14675 bytes pkg/openwsn/patches/02b-MAChigh_res.h.patch | Bin 0 -> 1902 bytes .../patches/02b-MAChigh_schedule.c.patch | Bin 0 -> 18904 bytes .../patches/02b-MAChigh_schedule.h.patch | Bin 0 -> 6975 bytes pkg/openwsn/patches/03a-IPHC_Makefile.patch | Bin 0 -> 1315 bytes pkg/openwsn/patches/03a-IPHC_iphc.c.patch | Bin 0 -> 24912 bytes pkg/openwsn/patches/03a-IPHC_iphc.h.patch | Bin 0 -> 4003 bytes .../patches/03a-IPHC_openbridge.c.patch | Bin 0 -> 3953 bytes .../patches/03a-IPHC_openbridge.h.patch | Bin 0 -> 740 bytes pkg/openwsn/patches/03b-IPv6_Makefile.patch | Bin 0 -> 1315 bytes .../patches/03b-IPv6_forwarding.c.patch | Bin 0 -> 18996 bytes .../patches/03b-IPv6_forwarding.h.patch | Bin 0 -> 1455 bytes pkg/openwsn/patches/03b-IPv6_icmpv6.c.patch | Bin 0 -> 1122 bytes pkg/openwsn/patches/03b-IPv6_icmpv6.h.patch | Bin 0 -> 758 bytes .../patches/03b-IPv6_icmpv6echo.c.patch | Bin 0 -> 3201 bytes .../patches/03b-IPv6_icmpv6echo.h.patch | Bin 0 -> 1189 bytes .../patches/03b-IPv6_icmpv6rpl.c.patch | Bin 0 -> 13672 bytes .../patches/03b-IPv6_icmpv6rpl.h.patch | Bin 0 -> 3401 bytes pkg/openwsn/patches/04-TRAN_Makefile.patch | Bin 0 -> 1732 bytes pkg/openwsn/patches/04-TRAN_opencoap.c.patch | Bin 0 -> 14142 bytes pkg/openwsn/patches/04-TRAN_opencoap.h.patch | Bin 0 -> 8272 bytes pkg/openwsn/patches/04-TRAN_opentcp.c.patch | Bin 0 -> 13212 bytes pkg/openwsn/patches/04-TRAN_opentcp.h.patch | Bin 0 -> 2150 bytes pkg/openwsn/patches/04-TRAN_openudp.c.patch | Bin 0 -> 2263 bytes pkg/openwsn/patches/04-TRAN_openudp.h.patch | Bin 0 -> 1012 bytes pkg/openwsn/patches/04-TRAN_rsvp.c.patch | Bin 0 -> 1221 bytes pkg/openwsn/patches/04-TRAN_rsvp.h.patch | Bin 0 -> 440 bytes pkg/openwsn/patches/07-App_Makefile.patch | Bin 0 -> 1776 bytes pkg/openwsn/patches/07-App_heli_heli.c.patch | Bin pkg/openwsn/patches/07-App_heli_heli.h.patch | Bin 0 -> 1103 bytes pkg/openwsn/patches/07-App_heli_heli.py.patch | Bin pkg/openwsn/patches/07-App_imu_imu.c.patch | Bin 0 -> 718 bytes pkg/openwsn/patches/07-App_imu_imu.h.patch | Bin 0 -> 716 bytes pkg/openwsn/patches/07-App_imu_imu.py.patch | Bin .../07-App_layerdebug_layerdebug.c.patch | Bin 0 -> 7696 bytes .../07-App_layerdebug_layerdebug.h.patch | Bin 0 -> 370 bytes .../patches/07-App_ohlone_Makefile.patch | Bin 0 -> 1334 bytes .../patches/07-App_ohlone_ohlone.c.patch | Bin 0 -> 2688 bytes .../patches/07-App_ohlone_ohlone.h.patch | Bin 0 -> 1764 bytes .../07-App_ohlone_ohlone_webpages.c.patch | Bin 0 -> 702 bytes .../07-App_ohlone_ohlone_webpages.h.patch | Bin 0 -> 698 bytes pkg/openwsn/patches/07-App_rex_rex.c.patch | Bin 0 -> 4404 bytes pkg/openwsn/patches/07-App_rex_rex.h.patch | Bin 0 -> 327 bytes .../patches/07-App_rheli_rheli.c.patch | Bin 0 -> 2416 bytes .../patches/07-App_rheli_rheli.h.patch | Bin 0 -> 346 bytes .../patches/07-App_rinfo_Makefile.patch | Bin 0 -> 1332 bytes .../patches/07-App_rinfo_rinfo.c.patch | Bin 0 -> 3356 bytes .../patches/07-App_rinfo_rinfo.h.patch | Bin 0 -> 628 bytes .../patches/07-App_rleds_rleds.c.patch | Bin 0 -> 3663 bytes .../patches/07-App_rleds_rleds.h.patch | Bin 0 -> 631 bytes pkg/openwsn/patches/07-App_rreg_rreg.c.patch | Bin 0 -> 6004 bytes pkg/openwsn/patches/07-App_rreg_rreg.h.patch | Bin 0 -> 338 bytes .../patches/07-App_rrube_rrube.c.patch | Bin 0 -> 4738 bytes .../patches/07-App_rrube_rrube.h.patch | Bin 0 -> 346 bytes pkg/openwsn/patches/07-App_rt_rt.c.patch | Bin 0 -> 4505 bytes pkg/openwsn/patches/07-App_rt_rt.h.patch | Bin 0 -> 322 bytes .../patches/07-App_rwellknown_Makefile.patch | Bin 0 -> 1342 bytes .../07-App_rwellknown_rwellknown.c.patch | Bin 0 -> 4232 bytes .../07-App_rwellknown_rwellknown.h.patch | Bin 0 -> 680 bytes pkg/openwsn/patches/07-App_rxl1_rxl1.c.patch | Bin 0 -> 4314 bytes pkg/openwsn/patches/07-App_rxl1_rxl1.h.patch | Bin 0 -> 338 bytes .../patches/07-App_tcpecho_Makefile.patch | Bin 0 -> 1336 bytes .../patches/07-App_tcpecho_tcpecho.c.patch | Bin 0 -> 1388 bytes .../patches/07-App_tcpecho_tcpecho.h.patch | Bin 0 -> 1076 bytes .../patches/07-App_tcpinject_Makefile.patch | Bin 0 -> 1340 bytes .../07-App_tcpinject_tcpinject.c.patch | Bin 0 -> 2961 bytes .../07-App_tcpinject_tcpinject.h.patch | Bin 0 -> 1703 bytes .../patches/07-App_tcpprint_Makefile.patch | Bin 0 -> 1338 bytes .../patches/07-App_tcpprint_tcpprint.c.patch | Bin 0 -> 1045 bytes .../patches/07-App_tcpprint_tcpprint.h.patch | Bin 0 -> 1109 bytes .../patches/07-App_udpecho_Makefile.patch | Bin 0 -> 1336 bytes .../patches/07-App_udpecho_udpecho.c.patch | Bin 0 -> 1281 bytes .../patches/07-App_udpecho_udpecho.h.patch | Bin 0 -> 933 bytes .../patches/07-App_udpecho_udpecho.py.patch | Bin 0 -> 2113 bytes .../patches/07-App_udpinject_Makefile.patch | Bin 0 -> 1340 bytes .../07-App_udpinject_udpinject.c.patch | Bin 0 -> 1487 bytes .../07-App_udpinject_udpinject.h.patch | Bin 0 -> 1025 bytes .../patches/07-App_udplatency_Makefile.patch | Bin 0 -> 1342 bytes .../07-App_udplatency_udplatency.c.patch | Bin 0 -> 7332 bytes .../07-App_udplatency_udplatency.h.patch | Bin 0 -> 1673 bytes .../patches/07-App_udpprint_Makefile.patch | Bin 0 -> 1338 bytes .../patches/07-App_udpprint_udpprint.c.patch | Bin 0 -> 1151 bytes .../patches/07-App_udpprint_udpprint.h.patch | Bin 0 -> 949 bytes .../patches/07-App_udprand_Makefile.patch | Bin 0 -> 1336 bytes .../patches/07-App_udprand_udprand.c.patch | Bin 0 -> 3254 bytes .../patches/07-App_udprand_udprand.h.patch | Bin 0 -> 1050 bytes .../patches/07-App_udpstorm_Makefile.patch | Bin 0 -> 1338 bytes .../patches/07-App_udpstorm_udpstorm.c.patch | Bin 0 -> 5734 bytes .../patches/07-App_udpstorm_udpstorm.h.patch | Bin 0 -> 659 bytes pkg/openwsn/patches/Makefile.patch | Bin 0 -> 2074 bytes pkg/openwsn/patches/Systick.c.patch | Bin 0 -> 368 bytes pkg/openwsn/patches/Systick.h.patch | Bin 0 -> 303 bytes pkg/openwsn/patches/at86rf231.h.patch | Bin 0 -> 24775 bytes pkg/openwsn/patches/board_info.h.patch | Bin 0 -> 3418 bytes pkg/openwsn/patches/board_ow.c.patch | Bin 0 -> 3509 bytes pkg/openwsn/patches/board_ow.h.patch | Bin 0 -> 1965 bytes .../patches/cross-layers_Makefile.patch | Bin 0 -> 1323 bytes .../patches/cross-layers_idmanager.c.patch | Bin 0 -> 13766 bytes .../patches/cross-layers_idmanager.h.patch | Bin 0 -> 2237 bytes .../patches/cross-layers_openqueue.c.patch | Bin 0 -> 3493 bytes .../patches/cross-layers_openqueue.h.patch | Bin 0 -> 2098 bytes .../patches/cross-layers_openrandom.c.patch | Bin 0 -> 1693 bytes .../patches/cross-layers_openrandom.h.patch | Bin 0 -> 1226 bytes .../cross-layers_packetfunctions.c.patch | Bin 0 -> 4864 bytes .../cross-layers_packetfunctions.h.patch | Bin 0 -> 415 bytes pkg/openwsn/patches/debugpins.c.patch | Bin 0 -> 1330 bytes pkg/openwsn/patches/debugpins.h.patch | Bin 0 -> 2423 bytes pkg/openwsn/patches/eui64.c.patch | Bin 0 -> 1256 bytes pkg/openwsn/patches/eui64.h.patch | Bin 0 -> 937 bytes pkg/openwsn/patches/exti.c.patch | Bin 0 -> 484 bytes pkg/openwsn/patches/gpio.c.patch | Bin 0 -> 1504 bytes pkg/openwsn/patches/gpio.h.patch | Bin 0 -> 533 bytes pkg/openwsn/patches/isr.c.patch | Bin 0 -> 1693 bytes pkg/openwsn/patches/leds_ow.c.patch | Bin 0 -> 3946 bytes pkg/openwsn/patches/leds_ow.h.patch | Bin 0 -> 2461 bytes pkg/openwsn/patches/nvic.c.patch | Bin 0 -> 5022 bytes pkg/openwsn/patches/nvic.h.patch | Bin 0 -> 972 bytes pkg/openwsn/patches/openhdlc.c.patch | Bin pkg/openwsn/patches/openhdlc.h.patch | Bin 0 -> 343 bytes pkg/openwsn/patches/openserial.c.patch | Bin 0 -> 39039 bytes pkg/openwsn/patches/openserial.h.patch | Bin 0 -> 3847 bytes pkg/openwsn/patches/opentimers.c.patch | Bin 0 -> 9303 bytes pkg/openwsn/patches/opentimers.h.patch | Bin 0 -> 2082 bytes pkg/openwsn/patches/openwsn.c.patch | Bin 0 -> 4949 bytes pkg/openwsn/patches/openwsn.h.patch | Bin 0 -> 17260 bytes pkg/openwsn/patches/radio.c.patch | Bin 0 -> 13229 bytes pkg/openwsn/patches/radio.h.patch | Bin 0 -> 3313 bytes pkg/openwsn/patches/radiotimer.c.patch | Bin 0 -> 7856 bytes pkg/openwsn/patches/radiotimer.h.patch | Bin 0 -> 3241 bytes pkg/openwsn/patches/rcc.c.patch | Bin 0 -> 2635 bytes pkg/openwsn/patches/rcc.h.patch | Bin 0 -> 673 bytes pkg/openwsn/patches/scheduler.c.patch | Bin 0 -> 4816 bytes pkg/openwsn/patches/scheduler.h.patch | Bin 0 -> 1868 bytes pkg/openwsn/patches/spi.c.patch | Bin 0 -> 8853 bytes pkg/openwsn/patches/spi.h.patch | Bin 0 -> 1129 bytes pkg/openwsn/patches/stm32f10x_lib.h.patch | Bin 0 -> 3506 bytes pkg/openwsn/patches/uart_ow.c.patch | Bin 0 -> 4194 bytes pkg/openwsn/patches/uart_ow.h.patch | Bin 0 -> 2351 bytes pkg/openwsn/structure_changes.sh | 85 +- 157 files changed, 103 insertions(+), 38442 deletions(-) create mode 100644 pkg/openwsn/Makefile.include create mode 100644 pkg/openwsn/apply_patches.sh delete mode 100644 pkg/openwsn/patch.txt create mode 100644 pkg/openwsn/patches/02a-MAClow_IEEE802154.c.patch create mode 100644 pkg/openwsn/patches/02a-MAClow_IEEE802154.h.patch create mode 100644 pkg/openwsn/patches/02a-MAClow_IEEE802154E.c.patch create mode 100644 pkg/openwsn/patches/02a-MAClow_IEEE802154E.h.patch create mode 100644 pkg/openwsn/patches/02a-MAClow_Makefile.patch create mode 100644 pkg/openwsn/patches/02a-MAClow_stupidmac_Makefile.patch create mode 100644 pkg/openwsn/patches/02a-MAClow_stupidmac_stupidmac.c.patch create mode 100644 pkg/openwsn/patches/02a-MAClow_stupidmac_stupidmac.h.patch create mode 100644 pkg/openwsn/patches/02a-MAClow_topology.c.patch create mode 100644 pkg/openwsn/patches/02a-MAClow_topology.h.patch create mode 100644 pkg/openwsn/patches/02b-MAChigh_Makefile.patch create mode 100644 pkg/openwsn/patches/02b-MAChigh_neighbors.c.patch create mode 100644 pkg/openwsn/patches/02b-MAChigh_neighbors.h.patch create mode 100644 pkg/openwsn/patches/02b-MAChigh_res.c.patch create mode 100644 pkg/openwsn/patches/02b-MAChigh_res.h.patch create mode 100644 pkg/openwsn/patches/02b-MAChigh_schedule.c.patch create mode 100644 pkg/openwsn/patches/02b-MAChigh_schedule.h.patch create mode 100644 pkg/openwsn/patches/03a-IPHC_Makefile.patch create mode 100644 pkg/openwsn/patches/03a-IPHC_iphc.c.patch create mode 100644 pkg/openwsn/patches/03a-IPHC_iphc.h.patch create mode 100644 pkg/openwsn/patches/03a-IPHC_openbridge.c.patch create mode 100644 pkg/openwsn/patches/03a-IPHC_openbridge.h.patch create mode 100644 pkg/openwsn/patches/03b-IPv6_Makefile.patch create mode 100644 pkg/openwsn/patches/03b-IPv6_forwarding.c.patch create mode 100644 pkg/openwsn/patches/03b-IPv6_forwarding.h.patch create mode 100644 pkg/openwsn/patches/03b-IPv6_icmpv6.c.patch create mode 100644 pkg/openwsn/patches/03b-IPv6_icmpv6.h.patch create mode 100644 pkg/openwsn/patches/03b-IPv6_icmpv6echo.c.patch create mode 100644 pkg/openwsn/patches/03b-IPv6_icmpv6echo.h.patch create mode 100644 pkg/openwsn/patches/03b-IPv6_icmpv6rpl.c.patch create mode 100644 pkg/openwsn/patches/03b-IPv6_icmpv6rpl.h.patch create mode 100644 pkg/openwsn/patches/04-TRAN_Makefile.patch create mode 100644 pkg/openwsn/patches/04-TRAN_opencoap.c.patch create mode 100644 pkg/openwsn/patches/04-TRAN_opencoap.h.patch create mode 100644 pkg/openwsn/patches/04-TRAN_opentcp.c.patch create mode 100644 pkg/openwsn/patches/04-TRAN_opentcp.h.patch create mode 100644 pkg/openwsn/patches/04-TRAN_openudp.c.patch create mode 100644 pkg/openwsn/patches/04-TRAN_openudp.h.patch create mode 100644 pkg/openwsn/patches/04-TRAN_rsvp.c.patch create mode 100644 pkg/openwsn/patches/04-TRAN_rsvp.h.patch create mode 100644 pkg/openwsn/patches/07-App_Makefile.patch create mode 100644 pkg/openwsn/patches/07-App_heli_heli.c.patch create mode 100644 pkg/openwsn/patches/07-App_heli_heli.h.patch create mode 100644 pkg/openwsn/patches/07-App_heli_heli.py.patch create mode 100644 pkg/openwsn/patches/07-App_imu_imu.c.patch create mode 100644 pkg/openwsn/patches/07-App_imu_imu.h.patch create mode 100644 pkg/openwsn/patches/07-App_imu_imu.py.patch create mode 100644 pkg/openwsn/patches/07-App_layerdebug_layerdebug.c.patch create mode 100644 pkg/openwsn/patches/07-App_layerdebug_layerdebug.h.patch create mode 100644 pkg/openwsn/patches/07-App_ohlone_Makefile.patch create mode 100644 pkg/openwsn/patches/07-App_ohlone_ohlone.c.patch create mode 100644 pkg/openwsn/patches/07-App_ohlone_ohlone.h.patch create mode 100644 pkg/openwsn/patches/07-App_ohlone_ohlone_webpages.c.patch create mode 100644 pkg/openwsn/patches/07-App_ohlone_ohlone_webpages.h.patch create mode 100644 pkg/openwsn/patches/07-App_rex_rex.c.patch create mode 100644 pkg/openwsn/patches/07-App_rex_rex.h.patch create mode 100644 pkg/openwsn/patches/07-App_rheli_rheli.c.patch create mode 100644 pkg/openwsn/patches/07-App_rheli_rheli.h.patch create mode 100644 pkg/openwsn/patches/07-App_rinfo_Makefile.patch create mode 100644 pkg/openwsn/patches/07-App_rinfo_rinfo.c.patch create mode 100644 pkg/openwsn/patches/07-App_rinfo_rinfo.h.patch create mode 100644 pkg/openwsn/patches/07-App_rleds_rleds.c.patch create mode 100644 pkg/openwsn/patches/07-App_rleds_rleds.h.patch create mode 100644 pkg/openwsn/patches/07-App_rreg_rreg.c.patch create mode 100644 pkg/openwsn/patches/07-App_rreg_rreg.h.patch create mode 100644 pkg/openwsn/patches/07-App_rrube_rrube.c.patch create mode 100644 pkg/openwsn/patches/07-App_rrube_rrube.h.patch create mode 100644 pkg/openwsn/patches/07-App_rt_rt.c.patch create mode 100644 pkg/openwsn/patches/07-App_rt_rt.h.patch create mode 100644 pkg/openwsn/patches/07-App_rwellknown_Makefile.patch create mode 100644 pkg/openwsn/patches/07-App_rwellknown_rwellknown.c.patch create mode 100644 pkg/openwsn/patches/07-App_rwellknown_rwellknown.h.patch create mode 100644 pkg/openwsn/patches/07-App_rxl1_rxl1.c.patch create mode 100644 pkg/openwsn/patches/07-App_rxl1_rxl1.h.patch create mode 100644 pkg/openwsn/patches/07-App_tcpecho_Makefile.patch create mode 100644 pkg/openwsn/patches/07-App_tcpecho_tcpecho.c.patch create mode 100644 pkg/openwsn/patches/07-App_tcpecho_tcpecho.h.patch create mode 100644 pkg/openwsn/patches/07-App_tcpinject_Makefile.patch create mode 100644 pkg/openwsn/patches/07-App_tcpinject_tcpinject.c.patch create mode 100644 pkg/openwsn/patches/07-App_tcpinject_tcpinject.h.patch create mode 100644 pkg/openwsn/patches/07-App_tcpprint_Makefile.patch create mode 100644 pkg/openwsn/patches/07-App_tcpprint_tcpprint.c.patch create mode 100644 pkg/openwsn/patches/07-App_tcpprint_tcpprint.h.patch create mode 100644 pkg/openwsn/patches/07-App_udpecho_Makefile.patch create mode 100644 pkg/openwsn/patches/07-App_udpecho_udpecho.c.patch create mode 100644 pkg/openwsn/patches/07-App_udpecho_udpecho.h.patch create mode 100644 pkg/openwsn/patches/07-App_udpecho_udpecho.py.patch create mode 100644 pkg/openwsn/patches/07-App_udpinject_Makefile.patch create mode 100644 pkg/openwsn/patches/07-App_udpinject_udpinject.c.patch create mode 100644 pkg/openwsn/patches/07-App_udpinject_udpinject.h.patch create mode 100644 pkg/openwsn/patches/07-App_udplatency_Makefile.patch create mode 100644 pkg/openwsn/patches/07-App_udplatency_udplatency.c.patch create mode 100644 pkg/openwsn/patches/07-App_udplatency_udplatency.h.patch create mode 100644 pkg/openwsn/patches/07-App_udpprint_Makefile.patch create mode 100644 pkg/openwsn/patches/07-App_udpprint_udpprint.c.patch create mode 100644 pkg/openwsn/patches/07-App_udpprint_udpprint.h.patch create mode 100644 pkg/openwsn/patches/07-App_udprand_Makefile.patch create mode 100644 pkg/openwsn/patches/07-App_udprand_udprand.c.patch create mode 100644 pkg/openwsn/patches/07-App_udprand_udprand.h.patch create mode 100644 pkg/openwsn/patches/07-App_udpstorm_Makefile.patch create mode 100644 pkg/openwsn/patches/07-App_udpstorm_udpstorm.c.patch create mode 100644 pkg/openwsn/patches/07-App_udpstorm_udpstorm.h.patch create mode 100644 pkg/openwsn/patches/Makefile.patch create mode 100644 pkg/openwsn/patches/Systick.c.patch create mode 100644 pkg/openwsn/patches/Systick.h.patch create mode 100644 pkg/openwsn/patches/at86rf231.h.patch create mode 100644 pkg/openwsn/patches/board_info.h.patch create mode 100644 pkg/openwsn/patches/board_ow.c.patch create mode 100644 pkg/openwsn/patches/board_ow.h.patch create mode 100644 pkg/openwsn/patches/cross-layers_Makefile.patch create mode 100644 pkg/openwsn/patches/cross-layers_idmanager.c.patch create mode 100644 pkg/openwsn/patches/cross-layers_idmanager.h.patch create mode 100644 pkg/openwsn/patches/cross-layers_openqueue.c.patch create mode 100644 pkg/openwsn/patches/cross-layers_openqueue.h.patch create mode 100644 pkg/openwsn/patches/cross-layers_openrandom.c.patch create mode 100644 pkg/openwsn/patches/cross-layers_openrandom.h.patch create mode 100644 pkg/openwsn/patches/cross-layers_packetfunctions.c.patch create mode 100644 pkg/openwsn/patches/cross-layers_packetfunctions.h.patch create mode 100644 pkg/openwsn/patches/debugpins.c.patch create mode 100644 pkg/openwsn/patches/debugpins.h.patch create mode 100644 pkg/openwsn/patches/eui64.c.patch create mode 100644 pkg/openwsn/patches/eui64.h.patch create mode 100644 pkg/openwsn/patches/exti.c.patch create mode 100644 pkg/openwsn/patches/gpio.c.patch create mode 100644 pkg/openwsn/patches/gpio.h.patch create mode 100644 pkg/openwsn/patches/isr.c.patch create mode 100644 pkg/openwsn/patches/leds_ow.c.patch create mode 100644 pkg/openwsn/patches/leds_ow.h.patch create mode 100644 pkg/openwsn/patches/nvic.c.patch create mode 100644 pkg/openwsn/patches/nvic.h.patch create mode 100644 pkg/openwsn/patches/openhdlc.c.patch create mode 100644 pkg/openwsn/patches/openhdlc.h.patch create mode 100644 pkg/openwsn/patches/openserial.c.patch create mode 100644 pkg/openwsn/patches/openserial.h.patch create mode 100644 pkg/openwsn/patches/opentimers.c.patch create mode 100644 pkg/openwsn/patches/opentimers.h.patch create mode 100644 pkg/openwsn/patches/openwsn.c.patch create mode 100644 pkg/openwsn/patches/openwsn.h.patch create mode 100644 pkg/openwsn/patches/radio.c.patch create mode 100644 pkg/openwsn/patches/radio.h.patch create mode 100644 pkg/openwsn/patches/radiotimer.c.patch create mode 100644 pkg/openwsn/patches/radiotimer.h.patch create mode 100644 pkg/openwsn/patches/rcc.c.patch create mode 100644 pkg/openwsn/patches/rcc.h.patch create mode 100644 pkg/openwsn/patches/scheduler.c.patch create mode 100644 pkg/openwsn/patches/scheduler.h.patch create mode 100644 pkg/openwsn/patches/spi.c.patch create mode 100644 pkg/openwsn/patches/spi.h.patch create mode 100644 pkg/openwsn/patches/stm32f10x_lib.h.patch create mode 100644 pkg/openwsn/patches/uart_ow.c.patch create mode 100644 pkg/openwsn/patches/uart_ow.h.patch mode change 100755 => 100644 pkg/openwsn/structure_changes.sh diff --git a/pkg/openwsn/Makefile b/pkg/openwsn/Makefile index d11a230bb8..bb584e2a7b 100644 --- a/pkg/openwsn/Makefile +++ b/pkg/openwsn/Makefile @@ -21,13 +21,14 @@ endif .PHONY: all clean all: $(CURDIR)/$(PKG_NAME)-$(PKG_VERSION)/ + $(info *INFO* Building OpenWSN pkg) make -C $(CURDIR)/$(PKG_NAME)-$(PKG_VERSION) $(CURDIR)/$(PKG_NAME)-$(PKG_VERSION)/: $(CURDIR)/$(PKG_NAME)-$(PKG_VERSION).$(PKG_EXT) $(AD)rm -rf $(CURDIR)/$(PKG_NAME)-$(PKG_VERSION) - $(AD)$(UNPACK) $< -d $(PKG_NAME)-$(PKG_VERSION) + $(AD)$(UNPACK) -q $< -d $(PKG_NAME)-$(PKG_VERSION) $(AD)cd $@ && sh ../structure_changes.sh - $(AD)cd $@ && patch -p0 -N -i ../patch.txt + $(AD)cd $@ && sh ../apply_patches.sh $(CURDIR)/$(PKG_NAME)-$(PKG_VERSION).$(PKG_EXT): # Get PKG_VERSION of package from PKG_URL diff --git a/pkg/openwsn/Makefile.include b/pkg/openwsn/Makefile.include new file mode 100644 index 0000000000..0bf5c69c22 --- /dev/null +++ b/pkg/openwsn/Makefile.include @@ -0,0 +1 @@ +export INCLUDES += -I${RIOTBASE}/drivers/include/ diff --git a/pkg/openwsn/README.md b/pkg/openwsn/README.md index 15ef36f405..5d52db1d5c 100644 --- a/pkg/openwsn/README.md +++ b/pkg/openwsn/README.md @@ -1,8 +1,32 @@ +# OpenWSN on RIOT + +This port of OpenWSN to RIOT is based on release RB-1.4 with backported support +for the iot-lab_M3 board from the develop branch. + # Compatibility -This port of the openwsn stack is compatible with the TelosB board only for now. +This port of the openwsn stack is compatible with the iot-lab_M3 board only for now. +The TelosB board support was temporarily dropped but will return soon again. The hardware dependency will be reduced in the future and thous running on more hardware platforms. +# Usage + A test can be found in the [projects repository](https://github.com/RIOT-OS/projects/) -named ```test_openwsn_pkg``` with an example ```Makefile```. \ No newline at end of file +named ```test_openwsn_pkg``` with an example ```Makefile```. + +Build using +```Bash +$> export BOARD=iot-lab_M3 +$> export PORT=/dev/ttyTHEPORTOFYOURIOTLAB +$> make -B clean flash +``` + +To use OpenWSN with RIOT it has to be added to the used packages variable +```Makefile +USEPKG += openwsn +``` + +On the first build the archive will be fetched, patched and built. +**WARNING** A call of `make clean` also cleans the OpenWSN tree right now so +changes to the source code will be lost in the next build. diff --git a/pkg/openwsn/apply_patches.sh b/pkg/openwsn/apply_patches.sh new file mode 100644 index 0000000000..773c47d4c6 --- /dev/null +++ b/pkg/openwsn/apply_patches.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env sh + +set -o nounset # Treat unset variables as an error + +if [[ $QUIET == "1" ]]; then + for i in `ls ../patches`; do + patch -p1 -N -i ../patches/$i > /dev/null + done +else + for i in `ls ../patches`; do + patch -p1 -N -i ../patches/$i + done +fi +exit 0 diff --git a/pkg/openwsn/patch.txt b/pkg/openwsn/patch.txt deleted file mode 100644 index 0828c6f171..0000000000 --- a/pkg/openwsn/patch.txt +++ /dev/null @@ -1,38412 +0,0 @@ -diff -crB openwsn/02a-MAClow/IEEE802154.c ../../../sys/net/openwsn/02a-MAClow/IEEE802154.c -*** openwsn/02a-MAClow/IEEE802154.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/02a-MAClow/IEEE802154.c Wed Jan 15 13:48:26 2014 -*************** -*** 1,220 **** -! #include "openwsn.h" -! #include "IEEE802154.h" -! #include "packetfunctions.h" -! #include "idmanager.h" -! #include "openserial.h" -! #include "topology.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! /** -! \brief Prepend the IEEE802.15.4 MAC header to a (to be transmitted) packet. -! -! Note that we are writing the field from the end of the header to the beginning. -! -! \param msg [in,out] The message to append the header to. -! \param frameType [in] Type of IEEE802.15.4 frame. -! \param securityEnabled [in] Is security enabled on this frame? -! \param nextHop [in] Address of the next hop -! */ -! void ieee802154_prependHeader(OpenQueueEntry_t* msg, -! uint8_t frameType, -! bool securityEnabled, -! uint8_t sequenceNumber, -! open_addr_t* nextHop) { -! uint8_t temp_8b; -! -! // previousHop address (always 64-bit) -! packetfunctions_writeAddress(msg,idmanager_getMyID(ADDR_64B),LITTLE_ENDIAN); -! // nextHop address -! if (packetfunctions_isBroadcastMulticast(nextHop)) { -! //broadcast address is always 16-bit -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = 0xFF; -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = 0xFF; -! } else { -! switch (nextHop->type) { -! case ADDR_16B: -! case ADDR_64B: -! packetfunctions_writeAddress(msg,nextHop,LITTLE_ENDIAN); -! break; -! default: -! openserial_printCritical(COMPONENT_IEEE802154,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)nextHop->type, -! (errorparameter_t)1); -! } -! -! } -! // destpan -! packetfunctions_writeAddress(msg,idmanager_getMyID(ADDR_PANID),LITTLE_ENDIAN); -! //dsn -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = sequenceNumber; -! //fcf (2nd byte) -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! temp_8b = 0; -! if (packetfunctions_isBroadcastMulticast(nextHop)) { -! temp_8b |= IEEE154_ADDR_SHORT << IEEE154_FCF_DEST_ADDR_MODE; -! } else { -! switch (nextHop->type) { -! case ADDR_16B: -! temp_8b |= IEEE154_ADDR_SHORT << IEEE154_FCF_DEST_ADDR_MODE; -! break; -! case ADDR_64B: -! temp_8b |= IEEE154_ADDR_EXT << IEEE154_FCF_DEST_ADDR_MODE; -! break; -! // no need for a default, since it would have been caught above. -! } -! } -! temp_8b |= IEEE154_ADDR_EXT << IEEE154_FCF_SRC_ADDR_MODE; -! *((uint8_t*)(msg->payload)) = temp_8b; -! //fcf (1st byte) -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! temp_8b = 0; -! temp_8b |= frameType << IEEE154_FCF_FRAME_TYPE; -! temp_8b |= securityEnabled << IEEE154_FCF_SECURITY_ENABLED; -! temp_8b |= IEEE154_PENDING_NO_FRAMEPENDING << IEEE154_FCF_FRAME_PENDING; -! if (frameType==IEEE154_TYPE_ACK || packetfunctions_isBroadcastMulticast(nextHop)) { -! temp_8b |= IEEE154_ACK_NO_ACK_REQ << IEEE154_FCF_ACK_REQ; -! } else { -! temp_8b |= IEEE154_ACK_YES_ACK_REQ << IEEE154_FCF_ACK_REQ; -! } -! temp_8b |= IEEE154_PANID_COMPRESSED << IEEE154_FCF_INTRAPAN; -! *((uint8_t*)(msg->payload)) = temp_8b; -! } -! -! /** -! \brief Retreieve the IEEE802.15.4 MAC header from a (just received) packet. -! -! Note We are writing the fields from the begnning of the header to the end. -! -! \param msg [in,out] The message just received. -! \param ieee802514_header [out] The internal header to write the data to. -! */ -! void ieee802154_retrieveHeader(OpenQueueEntry_t* msg, -! ieee802154_header_iht* ieee802514_header) { -! uint8_t temp_8b; -! -! // by default, let's assume the header is not valid, in case we leave this -! // function because the packet ends up being shorter than the header. -! ieee802514_header->valid=FALSE; -! -! ieee802514_header->headerLength = 0; -! // fcf, byte 1 -! if (ieee802514_header->headerLength>msg->length) { return; } // no more to read! -! temp_8b = *((uint8_t*)(msg->payload)+ieee802514_header->headerLength); -! ieee802514_header->frameType = (temp_8b >> IEEE154_FCF_FRAME_TYPE ) & 0x07;//3b -! ieee802514_header->securityEnabled = (temp_8b >> IEEE154_FCF_SECURITY_ENABLED) & 0x01;//1b -! ieee802514_header->framePending = (temp_8b >> IEEE154_FCF_FRAME_PENDING ) & 0x01;//1b -! ieee802514_header->ackRequested = (temp_8b >> IEEE154_FCF_ACK_REQ ) & 0x01;//1b -! ieee802514_header->panIDCompression = (temp_8b >> IEEE154_FCF_INTRAPAN ) & 0x01;//1b -! ieee802514_header->headerLength += 1; -! // fcf, byte 2 -! if (ieee802514_header->headerLength>msg->length) { return; } // no more to read! -! temp_8b = *((uint8_t*)(msg->payload)+ieee802514_header->headerLength); -! switch ( (temp_8b >> IEEE154_FCF_DEST_ADDR_MODE ) & 0x03 ) { -! case IEEE154_ADDR_NONE: -! ieee802514_header->dest.type = ADDR_NONE; -! break; -! case IEEE154_ADDR_SHORT: -! ieee802514_header->dest.type = ADDR_16B; -! break; -! case IEEE154_ADDR_EXT: -! ieee802514_header->dest.type = ADDR_64B; -! break; -! default: -! openserial_printError(COMPONENT_IEEE802154,ERR_IEEE154_UNSUPPORTED, -! (errorparameter_t)1, -! (errorparameter_t)(temp_8b >> IEEE154_FCF_DEST_ADDR_MODE ) & 0x03); -! return; // this is an invalid packet, return -! } -! switch ( (temp_8b >> IEEE154_FCF_SRC_ADDR_MODE ) & 0x03 ) { -! case IEEE154_ADDR_NONE: -! ieee802514_header->src.type = ADDR_NONE; -! break; -! case IEEE154_ADDR_SHORT: -! ieee802514_header->src.type = ADDR_16B; -! break; -! case IEEE154_ADDR_EXT: -! ieee802514_header->src.type = ADDR_64B; -! break; -! default: -! openserial_printError(COMPONENT_IEEE802154,ERR_IEEE154_UNSUPPORTED, -! (errorparameter_t)2, -! (errorparameter_t)(temp_8b >> IEEE154_FCF_SRC_ADDR_MODE ) & 0x03); -! return; // this is an invalid packet, return -! } -! ieee802514_header->headerLength += 1; -! // sequenceNumber -! if (ieee802514_header->headerLength>msg->length) { return; } // no more to read! -! ieee802514_header->dsn = *((uint8_t*)(msg->payload)+ieee802514_header->headerLength); -! ieee802514_header->headerLength += 1; -! // panID -! if (ieee802514_header->headerLength>msg->length) { return; } // no more to read! -! packetfunctions_readAddress(((uint8_t*)(msg->payload)+ieee802514_header->headerLength), -! ADDR_PANID, -! &ieee802514_header->panid, -! LITTLE_ENDIAN); -! ieee802514_header->headerLength += 2; -! // dest -! if (ieee802514_header->headerLength>msg->length) { return; } // no more to read! -! switch (ieee802514_header->dest.type) { -! case ADDR_NONE: -! break; -! case ADDR_16B: -! packetfunctions_readAddress( -! ((uint8_t*)(msg->payload)+ieee802514_header->headerLength), -! ADDR_16B, -! &ieee802514_header->dest, -! LITTLE_ENDIAN -! ); -! ieee802514_header->headerLength += 2; -! if (ieee802514_header->headerLength>msg->length) { return; } // no more to read! -! break; -! case ADDR_64B: -! packetfunctions_readAddress(((uint8_t*)(msg->payload)+ieee802514_header->headerLength), -! ADDR_64B, -! &ieee802514_header->dest, -! LITTLE_ENDIAN); -! ieee802514_header->headerLength += 8; -! if (ieee802514_header->headerLength>msg->length) { return; } // no more to read! -! break; -! // no need for a default, since case would have been caught above -! } -! //src -! switch (ieee802514_header->src.type) { -! case ADDR_NONE: -! break; -! case ADDR_16B: -! packetfunctions_readAddress(((uint8_t*)(msg->payload)+ieee802514_header->headerLength), -! ADDR_16B, -! &ieee802514_header->src, -! LITTLE_ENDIAN); -! ieee802514_header->headerLength += 2; -! if (ieee802514_header->headerLength>msg->length) { return; } // no more to read! -! break; -! case ADDR_64B: -! packetfunctions_readAddress(((uint8_t*)(msg->payload)+ieee802514_header->headerLength), -! ADDR_64B, -! &ieee802514_header->src, -! LITTLE_ENDIAN); -! ieee802514_header->headerLength += 8; -! if (ieee802514_header->headerLength>msg->length) { return; } // no more to read! -! break; -! // no need for a default, since case would have been caught above -! } -! // apply topology filter -! if (topology_isAcceptablePacket(ieee802514_header)==FALSE) { -! // the topology filter does accept this packet, return -! return; -! } -! // if you reach this, the header is valid -! ieee802514_header->valid=TRUE; -! } -! - //=========================== private ========================================= -\ No newline at end of file ---- 1,244 ---- -! #include "openwsn.h" -! #include "IEEE802154.h" -! #include "packetfunctions.h" -! #include "idmanager.h" -! #include "openserial.h" -! #include "topology.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! /** -! \brief Prepend the IEEE802.15.4 MAC header to a (to be transmitted) packet. -! -! Note that we are writing the field from the end of the header to the beginning. -! -! \param[in,out] msg The message to append the header to. -! \param[in] frameType Type of IEEE802.15.4 frame. -! \param[in] ielistpresent Is the IE list present� -! \param[in] frameVersion IEEE802.15.4 frame version. -! \param[in] securityEnabled Is security enabled on this frame? -! \param[in] sequenceNumber Sequence number of this frame. -! \param[in] nextHop Address of the next hop -! */ -! void ieee802154_prependHeader(OpenQueueEntry_t* msg, -! uint8_t frameType, -! uint8_t ielistpresent, -! uint8_t frameversion, -! bool securityEnabled, -! uint8_t sequenceNumber, -! open_addr_t* nextHop) { -! uint8_t temp_8b; -! -! //General IEs here (those that are carried in all packets) -- None by now. -! -! // previousHop address (always 64-bit) -! packetfunctions_writeAddress(msg,idmanager_getMyID(ADDR_64B),OW_LITTLE_ENDIAN); -! // nextHop address -! if (packetfunctions_isBroadcastMulticast(nextHop)) { -! //broadcast address is always 16-bit -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = 0xFF; -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = 0xFF; -! } else { -! switch (nextHop->type) { -! case ADDR_16B: -! case ADDR_64B: -! packetfunctions_writeAddress(msg,nextHop,OW_LITTLE_ENDIAN); -! break; -! default: -! openserial_printCritical(COMPONENT_IEEE802154,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)nextHop->type, -! (errorparameter_t)1); -! } -! -! } -! // destpan -! packetfunctions_writeAddress(msg,idmanager_getMyID(ADDR_PANID),OW_LITTLE_ENDIAN); -! //dsn -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = sequenceNumber; -! //fcf (2nd byte) -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! temp_8b = 0; -! if (packetfunctions_isBroadcastMulticast(nextHop)) { -! temp_8b |= IEEE154_ADDR_SHORT << IEEE154_FCF_DEST_ADDR_MODE; -! } else { -! switch (nextHop->type) { -! case ADDR_16B: -! temp_8b |= IEEE154_ADDR_SHORT << IEEE154_FCF_DEST_ADDR_MODE; -! break; -! case ADDR_64B: -! temp_8b |= IEEE154_ADDR_EXT << IEEE154_FCF_DEST_ADDR_MODE; -! break; -! // no need for a default, since it would have been caught above. -! } -! } -! temp_8b |= IEEE154_ADDR_EXT << IEEE154_FCF_SRC_ADDR_MODE; -! //poipoi xv IE list present -! temp_8b |= ielistpresent << IEEE154_FCF_IELIST_PRESENT; -! temp_8b |= frameversion << IEEE154_FCF_FRAME_VERSION; -! -! *((uint8_t*)(msg->payload)) = temp_8b; -! //fcf (1st byte) -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! temp_8b = 0; -! temp_8b |= frameType << IEEE154_FCF_FRAME_TYPE; -! temp_8b |= securityEnabled << IEEE154_FCF_SECURITY_ENABLED; -! temp_8b |= IEEE154_PENDING_NO_FRAMEPENDING << IEEE154_FCF_FRAME_PENDING; -! if (frameType==IEEE154_TYPE_ACK || packetfunctions_isBroadcastMulticast(nextHop)) { -! temp_8b |= IEEE154_ACK_NO_ACK_REQ << IEEE154_FCF_ACK_REQ; -! } else { -! temp_8b |= IEEE154_ACK_YES_ACK_REQ << IEEE154_FCF_ACK_REQ; -! } -! temp_8b |= IEEE154_PANID_COMPRESSED << IEEE154_FCF_INTRAPAN; -! *((uint8_t*)(msg->payload)) = temp_8b; -! } -! -! /** -! \brief Retreieve the IEEE802.15.4 MAC header from a (just received) packet. -! -! Note We are writing the fields from the begnning of the header to the end. -! -! \param[in,out] msg The message just received. -! \param[out] ieee802514_header The internal header to write the data to. -! */ -! void ieee802154_retrieveHeader(OpenQueueEntry_t* msg, -! ieee802154_header_iht* ieee802514_header) { -! uint8_t temp_8b; -! -! // by default, let's assume the header is not valid, in case we leave this -! // function because the packet ends up being shorter than the header. -! ieee802514_header->valid=FALSE; -! -! ieee802514_header->headerLength = 0; -! // fcf, byte 1 -! if (ieee802514_header->headerLength>msg->length) { return; } // no more to read! -! temp_8b = *((uint8_t*)(msg->payload)+ieee802514_header->headerLength); -! ieee802514_header->frameType = (temp_8b >> IEEE154_FCF_FRAME_TYPE ) & 0x07;//3b -! ieee802514_header->securityEnabled = (temp_8b >> IEEE154_FCF_SECURITY_ENABLED) & 0x01;//1b -! ieee802514_header->framePending = (temp_8b >> IEEE154_FCF_FRAME_PENDING ) & 0x01;//1b -! ieee802514_header->ackRequested = (temp_8b >> IEEE154_FCF_ACK_REQ ) & 0x01;//1b -! ieee802514_header->panIDCompression = (temp_8b >> IEEE154_FCF_INTRAPAN ) & 0x01;//1b -! ieee802514_header->headerLength += 1; -! // fcf, byte 2 -! if (ieee802514_header->headerLength>msg->length) { return; } // no more to read! -! temp_8b = *((uint8_t*)(msg->payload)+ieee802514_header->headerLength); -! //poipoi xv IE list present -! ieee802514_header->ieListPresent = (temp_8b >> IEEE154_FCF_IELIST_PRESENT ) & 0x01;//1b -! ieee802514_header->frameVersion = (temp_8b >> IEEE154_FCF_FRAME_VERSION ) & 0x03;//2b -! -! if (ieee802514_header->ieListPresent==TRUE && ieee802514_header->frameVersion!=IEEE154_FRAMEVERSION){ -! return; //invalid packet accordint to p.64 IEEE15.4e -! } -! -! switch ( (temp_8b >> IEEE154_FCF_DEST_ADDR_MODE ) & 0x03 ) { -! case IEEE154_ADDR_NONE: -! ieee802514_header->dest.type = ADDR_NONE; -! break; -! case IEEE154_ADDR_SHORT: -! ieee802514_header->dest.type = ADDR_16B; -! break; -! case IEEE154_ADDR_EXT: -! ieee802514_header->dest.type = ADDR_64B; -! break; -! default: -! openserial_printError(COMPONENT_IEEE802154,ERR_IEEE154_UNSUPPORTED, -! (errorparameter_t)1, -! (errorparameter_t)(temp_8b >> IEEE154_FCF_DEST_ADDR_MODE ) & 0x03); -! return; // this is an invalid packet, return -! } -! switch ( (temp_8b >> IEEE154_FCF_SRC_ADDR_MODE ) & 0x03 ) { -! case IEEE154_ADDR_NONE: -! ieee802514_header->src.type = ADDR_NONE; -! break; -! case IEEE154_ADDR_SHORT: -! ieee802514_header->src.type = ADDR_16B; -! break; -! case IEEE154_ADDR_EXT: -! ieee802514_header->src.type = ADDR_64B; -! break; -! default: -! openserial_printError(COMPONENT_IEEE802154,ERR_IEEE154_UNSUPPORTED, -! (errorparameter_t)2, -! (errorparameter_t)(temp_8b >> IEEE154_FCF_SRC_ADDR_MODE ) & 0x03); -! return; // this is an invalid packet, return -! } -! ieee802514_header->headerLength += 1; -! // sequenceNumber -! if (ieee802514_header->headerLength>msg->length) { return; } // no more to read! -! ieee802514_header->dsn = *((uint8_t*)(msg->payload)+ieee802514_header->headerLength); -! ieee802514_header->headerLength += 1; -! // panID -! if (ieee802514_header->headerLength>msg->length) { return; } // no more to read! -! packetfunctions_readAddress(((uint8_t*)(msg->payload)+ieee802514_header->headerLength), -! ADDR_PANID, -! &ieee802514_header->panid, -! OW_LITTLE_ENDIAN); -! ieee802514_header->headerLength += 2; -! // dest -! if (ieee802514_header->headerLength>msg->length) { return; } // no more to read! -! switch (ieee802514_header->dest.type) { -! case ADDR_NONE: -! break; -! case ADDR_16B: -! packetfunctions_readAddress( -! ((uint8_t*)(msg->payload)+ieee802514_header->headerLength), -! ADDR_16B, -! &ieee802514_header->dest, -! OW_LITTLE_ENDIAN -! ); -! ieee802514_header->headerLength += 2; -! if (ieee802514_header->headerLength>msg->length) { return; } // no more to read! -! break; -! case ADDR_64B: -! packetfunctions_readAddress(((uint8_t*)(msg->payload)+ieee802514_header->headerLength), -! ADDR_64B, -! &ieee802514_header->dest, -! OW_LITTLE_ENDIAN); -! ieee802514_header->headerLength += 8; -! if (ieee802514_header->headerLength>msg->length) { return; } // no more to read! -! break; -! // no need for a default, since case would have been caught above -! } -! //src -! switch (ieee802514_header->src.type) { -! case ADDR_NONE: -! break; -! case ADDR_16B: -! packetfunctions_readAddress(((uint8_t*)(msg->payload)+ieee802514_header->headerLength), -! ADDR_16B, -! &ieee802514_header->src, -! OW_LITTLE_ENDIAN); -! ieee802514_header->headerLength += 2; -! if (ieee802514_header->headerLength>msg->length) { return; } // no more to read! -! break; -! case ADDR_64B: -! packetfunctions_readAddress(((uint8_t*)(msg->payload)+ieee802514_header->headerLength), -! ADDR_64B, -! &ieee802514_header->src, -! OW_LITTLE_ENDIAN); -! ieee802514_header->headerLength += 8; -! if (ieee802514_header->headerLength>msg->length) { return; } // no more to read! -! break; -! // no need for a default, since case would have been caught above -! } -! -! if (ieee802514_header->ieListPresent==TRUE && ieee802514_header->frameVersion!=IEEE154_FRAMEVERSION){ -! return; //invalid packet accordint to p.64 IEEE15.4e -! } -! -! // apply topology filter -! if (topology_isAcceptablePacket(ieee802514_header)==FALSE) { -! // the topology filter does accept this packet, return -! return; -! } -! // if you reach this, the header is valid -! ieee802514_header->valid=TRUE; -! } -! - //=========================== private ========================================= -\ No newline at end of file -diff -crB openwsn/02a-MAClow/IEEE802154.h ../../../sys/net/openwsn/02a-MAClow/IEEE802154.h -*** openwsn/02a-MAClow/IEEE802154.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/02a-MAClow/IEEE802154.h Wed Jan 15 13:48:26 2014 -*************** -*** 1,94 **** -! #ifndef __IEEE802154_H -! #define __IEEE802154_H -! -! /** -! \addtogroup helpers -! \{ -! \addtogroup IEEE802154 -! \{ -! */ -! -! #include "openwsn.h" -! -! //=========================== define ========================================== -! -! enum IEEE802154_fcf_enums { -! IEEE154_FCF_FRAME_TYPE = 0, -! IEEE154_FCF_SECURITY_ENABLED = 3, -! IEEE154_FCF_FRAME_PENDING = 4, -! IEEE154_FCF_ACK_REQ = 5, -! IEEE154_FCF_INTRAPAN = 6, -! IEEE154_FCF_DEST_ADDR_MODE = 2, -! IEEE154_FCF_SRC_ADDR_MODE = 6, -! }; -! -! enum IEEE802154_fcf_type_enums { -! IEEE154_TYPE_BEACON = 0, -! IEEE154_TYPE_DATA = 1, -! IEEE154_TYPE_ACK = 2, -! IEEE154_TYPE_CMD = 3, -! IEEE154_TYPE_UNDEFINED = 5, -! }; -! -! enum IEEE802154_fcf_sec_enums { -! IEEE154_SEC_NO_SECURITY = 0, -! IEEE154_SEC_YES_SECURITY = 1, -! }; -! -! enum IEEE802154_fcf_pending_enums { -! IEEE154_PENDING_NO_FRAMEPENDING = 0, -! IEEE154_PENDING_YES_FRAMEPENDING = 1, -! }; -! -! enum IEEE802154_fcf_ack_enums { -! IEEE154_ACK_NO_ACK_REQ = 0, -! IEEE154_ACK_YES_ACK_REQ = 1, -! }; -! -! enum IEEE802154_fcf_panid_enums { -! IEEE154_PANID_UNCOMPRESSED = 0, -! IEEE154_PANID_COMPRESSED = 1, -! }; -! -! enum IEEE802154_fcf_addr_mode_enums { -! IEEE154_ADDR_NONE = 0, -! IEEE154_ADDR_SHORT = 2, -! IEEE154_ADDR_EXT = 3, -! }; -! -! //=========================== typedef ========================================= -! -! typedef struct { -! bool valid; -! uint8_t headerLength; //including the length field -! uint8_t frameType; -! bool securityEnabled; -! bool framePending; -! bool ackRequested; -! bool panIDCompression; -! uint8_t dsn; -! open_addr_t panid; -! open_addr_t dest; -! open_addr_t src; -! } ieee802154_header_iht; //iht for "internal header type" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== prototypes ====================================== -! -! void ieee802154_prependHeader (OpenQueueEntry_t* msg, -! uint8_t frameType, -! bool securityEnabled, -! uint8_t sequenceNumber, -! open_addr_t* nextHop); -! void ieee802154_retrieveHeader (OpenQueueEntry_t* msg, -! ieee802154_header_iht* ieee802514_header); -! -! /** -! \} -! \} -! */ -! - #endif -\ No newline at end of file ---- 1,113 ---- -! #ifndef __IEEE802154_H -! #define __IEEE802154_H -! -! /** -! \addtogroup MAClow -! \{ -! \addtogroup IEEE802154 -! \{ -! */ -! -! #include "openwsn.h" -! -! //=========================== define ========================================== -! -! enum IEEE802154_fcf_enums { -! IEEE154_FCF_FRAME_TYPE = 0, -! IEEE154_FCF_SECURITY_ENABLED = 3, -! IEEE154_FCF_FRAME_PENDING = 4, -! IEEE154_FCF_ACK_REQ = 5, -! IEEE154_FCF_INTRAPAN = 6, -! IEEE154_FCF_IELIST_PRESENT = 1, -! IEEE154_FCF_DEST_ADDR_MODE = 2, -! IEEE154_FCF_FRAME_VERSION = 4, -! IEEE154_FCF_SRC_ADDR_MODE = 6, -! }; -! -! -! enum IEEE802154_fcf_frameversion_enums { -! IEEE154_FRAMEVERSION_2003 = 0, //ieee154-2003 -! IEEE154_FRAMEVERSION_2006 = 1, //ieee154-2006 -! IEEE154_FRAMEVERSION = 2, //ieee154 -! }; -! -! enum IEEE802154_fcf_type_enums { -! IEEE154_TYPE_BEACON = 0, -! IEEE154_TYPE_DATA = 1, -! IEEE154_TYPE_ACK = 2, -! IEEE154_TYPE_CMD = 3, -! IEEE154_TYPE_UNDEFINED = 5, -! }; -! -! enum IEEE802154_fcf_sec_enums { -! IEEE154_SEC_NO_SECURITY = 0, -! IEEE154_SEC_YES_SECURITY = 1, -! }; -! -! enum IEEE802154_fcf_ielist_enums { -! IEEE154_IELIST_NO = 0, -! IEEE154_IELIST_YES = 1, -! }; -! -! enum IEEE802154_fcf_pending_enums { -! IEEE154_PENDING_NO_FRAMEPENDING = 0, -! IEEE154_PENDING_YES_FRAMEPENDING = 1, -! }; -! -! enum IEEE802154_fcf_ack_enums { -! IEEE154_ACK_NO_ACK_REQ = 0, -! IEEE154_ACK_YES_ACK_REQ = 1, -! }; -! -! enum IEEE802154_fcf_panid_enums { -! IEEE154_PANID_UNCOMPRESSED = 0, -! IEEE154_PANID_COMPRESSED = 1, -! }; -! -! enum IEEE802154_fcf_addr_mode_enums { -! IEEE154_ADDR_NONE = 0, -! IEEE154_ADDR_SHORT = 2, -! IEEE154_ADDR_EXT = 3, -! }; -! -! //=========================== typedef ========================================= -! -! typedef struct { -! bool valid; -! uint8_t headerLength; //including the length field -! uint8_t frameType; -! bool securityEnabled; -! bool framePending; -! bool ackRequested; -! bool panIDCompression; -! bool ieListPresent; -! uint8_t frameVersion; -! uint8_t dsn; -! open_addr_t panid; -! open_addr_t dest; -! open_addr_t src; -! } ieee802154_header_iht; //iht for "internal header type" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== prototypes ====================================== -! -! void ieee802154_prependHeader(OpenQueueEntry_t* msg, -! uint8_t frameType, -! uint8_t ielistpresent, -! uint8_t frameversion, -! bool securityEnabled, -! uint8_t sequenceNumber, -! open_addr_t* nextHop); -! -! void ieee802154_retrieveHeader (OpenQueueEntry_t* msg, -! ieee802154_header_iht* ieee802514_header); -! -! /** -! \} -! \} -! */ -! - #endif -\ No newline at end of file -diff -crB openwsn/02a-MAClow/IEEE802154E.c ../../../sys/net/openwsn/02a-MAClow/IEEE802154E.c -*** openwsn/02a-MAClow/IEEE802154E.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/02a-MAClow/IEEE802154E.c Wed Jan 15 13:48:26 2014 -*************** -*** 1,1908 **** -! #include "openwsn.h" -! #include "IEEE802154E.h" -! #include "radio.h" -! #include "radiotimer.h" -! #include "IEEE802154.h" -! #include "openqueue.h" -! #include "idmanager.h" -! #include "openserial.h" -! #include "schedule.h" -! #include "packetfunctions.h" -! #include "scheduler.h" -! #include "leds.h" -! #include "neighbors.h" -! #include "debugpins.h" -! #include "res.h" -! -! //=========================== variables ======================================= -! -! typedef struct { -! // misc -! asn_t asn; // current absolute slot number -! slotOffset_t slotOffset; // current slot offset -! slotOffset_t nextActiveSlotOffset; // next active slot offset -! PORT_TIMER_WIDTH deSyncTimeout; // how many slots left before looses sync -! bool isSync; // TRUE iff mote is synchronized to network -! // as shown on the chronogram -! ieee154e_state_t state; // state of the FSM -! OpenQueueEntry_t* dataToSend; // pointer to the data to send -! OpenQueueEntry_t* dataReceived; // pointer to the data received -! OpenQueueEntry_t* ackToSend; // pointer to the ack to send -! OpenQueueEntry_t* ackReceived; // pointer to the ack received -! PORT_TIMER_WIDTH lastCapturedTime; // last captured time -! PORT_TIMER_WIDTH syncCapturedTime; // captured time used to sync -! //channel hopping -! uint8_t freq; // frequency of the current slot -! uint8_t asnOffset; // offset inside the frame -! } ieee154e_vars_t; -! -! ieee154e_vars_t ieee154e_vars; -! -! typedef struct { -! PORT_TIMER_WIDTH num_newSlot; -! PORT_TIMER_WIDTH num_timer; -! PORT_TIMER_WIDTH num_startOfFrame; -! PORT_TIMER_WIDTH num_endOfFrame; -! } ieee154e_dbg_t; -! -! ieee154e_dbg_t ieee154e_dbg; -! -! PRAGMA(pack(1)); -! typedef struct { -! uint8_t numSyncPkt; // how many times synchronized on a non-ACK packet -! uint8_t numSyncAck; // how many times synchronized on an ACK -! PORT_SIGNED_INT_WIDTH minCorrection; // minimum time correction -! PORT_SIGNED_INT_WIDTH maxCorrection; // maximum time correction -! uint8_t numDeSync; // number of times a desync happened -! } ieee154e_stats_t; -! PRAGMA(pack()); -! -! ieee154e_stats_t ieee154e_stats; -! -! //=========================== prototypes ====================================== -! -! // SYNCHRONIZING -! void activity_synchronize_newSlot(); -! void activity_synchronize_startOfFrame(PORT_TIMER_WIDTH capturedTime); -! void activity_synchronize_endOfFrame(PORT_TIMER_WIDTH capturedTime); -! // TX -! void activity_ti1ORri1(); -! void activity_ti2(); -! void activity_tie1(); -! void activity_ti3(); -! void activity_tie2(); -! void activity_ti4(PORT_TIMER_WIDTH capturedTime); -! void activity_tie3(); -! void activity_ti5(PORT_TIMER_WIDTH capturedTime); -! void activity_ti6(); -! void activity_tie4(); -! void activity_ti7(); -! void activity_tie5(); -! void activity_ti8(PORT_TIMER_WIDTH capturedTime); -! void activity_tie6(); -! void activity_ti9(PORT_TIMER_WIDTH capturedTime); -! // RX -! void activity_ri2(); -! void activity_rie1(); -! void activity_ri3(); -! void activity_rie2(); -! void activity_ri4(PORT_TIMER_WIDTH capturedTime); -! void activity_rie3(); -! void activity_ri5(PORT_TIMER_WIDTH capturedTime); -! void activity_ri6(); -! void activity_rie4(); -! void activity_ri7(); -! void activity_rie5(); -! void activity_ri8(PORT_TIMER_WIDTH capturedTime); -! void activity_rie6(); -! void activity_ri9(PORT_TIMER_WIDTH capturedTime); -! // frame validity check -! bool isValidAdv(ieee802154_header_iht* ieee802514_header); -! bool isValidRxFrame(ieee802154_header_iht* ieee802514_header); -! bool isValidAck(ieee802154_header_iht* ieee802514_header, -! OpenQueueEntry_t* packetSent); -! // ASN handling -! void incrementAsnOffset(); -! void asnWriteToAdv(OpenQueueEntry_t* advFrame); -! void asnStoreFromAdv(OpenQueueEntry_t* advFrame); -! // synchronization -! void synchronizePacket(PORT_TIMER_WIDTH timeReceived); -! void synchronizeAck(PORT_SIGNED_INT_WIDTH timeCorrection); -! void changeIsSync(bool newIsSync); -! // notifying upper layer -! void notif_sendDone(OpenQueueEntry_t* packetSent, error_t error); -! void notif_receive(OpenQueueEntry_t* packetReceived); -! // statistics -! void resetStats(); -! void updateStats(PORT_SIGNED_INT_WIDTH timeCorrection); -! // misc -! uint8_t calculateFrequency(uint8_t channelOffset); -! void changeState(ieee154e_state_t newstate); -! void endSlot(); -! bool debugPrint_asn(); -! bool debugPrint_isSync(); -! -! //=========================== admin =========================================== -! -! /** -! \brief This function initializes this module. -! -! Call this function once before any other function in this module, possibly -! during boot-up. -! */ -! void ieee154e_init() { -! -! // initialize variables -! memset(&ieee154e_vars,0,sizeof(ieee154e_vars_t)); -! memset(&ieee154e_dbg,0,sizeof(ieee154e_dbg_t)); -! -! if (idmanager_getIsDAGroot()==TRUE) { -! changeIsSync(TRUE); -! } else { -! changeIsSync(FALSE); -! } -! -! resetStats(); -! ieee154e_stats.numDeSync = 0; -! -! // switch radio on -! radio_rfOn(); -! -! // set callback functions for the radio -! radio_setOverflowCb(isr_ieee154e_newSlot); -! radio_setCompareCb(isr_ieee154e_timer); -! radio_setStartFrameCb(ieee154e_startOfFrame); -! radio_setEndFrameCb(ieee154e_endOfFrame); -! // have the radio start its timer -! radio_startTimer(TsSlotDuration); -! } -! -! //=========================== public ========================================== -! -! /** -! /brief Difference between some older ASN and the current ASN. -! -! \param someASN [in] some ASN to compare to the current -! -! \returns The ASN difference, or 0xffff if more than 65535 different -! */ -! PORT_TIMER_WIDTH ieee154e_asnDiff(asn_t* someASN) { -! PORT_TIMER_WIDTH diff; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! if (ieee154e_vars.asn.byte4 != someASN->byte4) { -! ENABLE_INTERRUPTS(); -! return (PORT_TIMER_WIDTH)0xFFFFFFFF;; -! } -! -! diff = 0; -! if (ieee154e_vars.asn.bytes2and3 == someASN->bytes2and3) { -! ENABLE_INTERRUPTS(); -! return ieee154e_vars.asn.bytes0and1-someASN->bytes0and1; -! } else if (ieee154e_vars.asn.bytes2and3-someASN->bytes2and3==1) { -! diff = ieee154e_vars.asn.bytes0and1; -! diff += 0xffff-someASN->bytes0and1; -! diff += 1; -! } else { -! diff = (PORT_TIMER_WIDTH)0xFFFFFFFF;; -! } -! ENABLE_INTERRUPTS(); -! return diff; -! } -! -! //======= events -! -! /** -! \brief Indicates a new slot has just started. -! -! This function executes in ISR mode, when the new slot timer fires. -! */ -! void isr_ieee154e_newSlot() { -! radio_setTimerPeriod(TsSlotDuration); -! if (ieee154e_vars.isSync==FALSE) { -! activity_synchronize_newSlot(); -! } else { -! activity_ti1ORri1(); -! } -! ieee154e_dbg.num_newSlot++; -! } -! -! /** -! \brief Indicates the FSM timer has fired. -! -! This function executes in ISR mode, when the FSM timer fires. -! */ -! void isr_ieee154e_timer() { -! switch (ieee154e_vars.state) { -! case S_TXDATAOFFSET: -! activity_ti2(); -! break; -! case S_TXDATAPREPARE: -! activity_tie1(); -! break; -! case S_TXDATAREADY: -! activity_ti3(); -! break; -! case S_TXDATADELAY: -! activity_tie2(); -! break; -! case S_TXDATA: -! activity_tie3(); -! break; -! case S_RXACKOFFSET: -! activity_ti6(); -! break; -! case S_RXACKPREPARE: -! activity_tie4(); -! break; -! case S_RXACKREADY: -! activity_ti7(); -! break; -! case S_RXACKLISTEN: -! activity_tie5(); -! break; -! case S_RXACK: -! activity_tie6(); -! break; -! case S_RXDATAOFFSET: -! activity_ri2(); -! break; -! case S_RXDATAPREPARE: -! activity_rie1(); -! break; -! case S_RXDATAREADY: -! activity_ri3(); -! break; -! case S_RXDATALISTEN: -! activity_rie2(); -! break; -! case S_RXDATA: -! activity_rie3(); -! break; -! case S_TXACKOFFSET: -! activity_ri6(); -! break; -! case S_TXACKPREPARE: -! activity_rie4(); -! break; -! case S_TXACKREADY: -! activity_ri7(); -! break; -! case S_TXACKDELAY: -! activity_rie5(); -! break; -! case S_TXACK: -! activity_rie6(); -! break; -! default: -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_WRONG_STATE_IN_TIMERFIRES, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! // abort -! endSlot(); -! break; -! } -! ieee154e_dbg.num_timer++; -! } -! -! /** -! \brief Indicates the radio just received the first byte of a packet. -! -! This function executes in ISR mode. -! */ -! void ieee154e_startOfFrame(PORT_TIMER_WIDTH capturedTime) { -! if (ieee154e_vars.isSync==FALSE) { -! activity_synchronize_startOfFrame(capturedTime); -! } else { -! switch (ieee154e_vars.state) { -! case S_TXDATADELAY: -! activity_ti4(capturedTime); -! break; -! case S_RXACKREADY: -! /* -! It is possible to receive in this state for radio where there is no -! way of differentiated between "ready to listen" and "listening" -! (e.g. CC2420). We must therefore expect to the start of a packet in -! this "ready" state. -! */ -! // no break! -! case S_RXACKLISTEN: -! activity_ti8(capturedTime); -! break; -! case S_RXDATAREADY: -! /* -! Similarly as above. -! */ -! // no break! -! case S_RXDATALISTEN: -! activity_ri4(capturedTime); -! break; -! case S_TXACKDELAY: -! activity_ri8(capturedTime); -! break; -! default: -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_WRONG_STATE_IN_NEWSLOT, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! // abort -! endSlot(); -! break; -! } -! } -! ieee154e_dbg.num_startOfFrame++; -! } -! -! /** -! \brief Indicates the radio just received the last byte of a packet. -! -! This function executes in ISR mode. -! */ -! void ieee154e_endOfFrame(PORT_TIMER_WIDTH capturedTime) { -! if (ieee154e_vars.isSync==FALSE) { -! activity_synchronize_endOfFrame(capturedTime); -! } else { -! switch (ieee154e_vars.state) { -! case S_TXDATA: -! activity_ti5(capturedTime); -! break; -! case S_RXACK: -! activity_ti9(capturedTime); -! break; -! case S_RXDATA: -! activity_ri5(capturedTime); -! break; -! case S_TXACK: -! activity_ri9(capturedTime); -! break; -! default: -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_WRONG_STATE_IN_ENDOFFRAME, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! // abort -! endSlot(); -! break; -! } -! } -! ieee154e_dbg.num_endOfFrame++; -! } -! -! //======= misc -! -! /** -! \brief Trigger this module to print status information, over serial. -! -! debugPrint_* functions are used by the openserial module to continuously print -! status information about several modules in the OpenWSN stack. -! -! \returns TRUE if this function printed something, FALSE otherwise. -! */ -! bool debugPrint_asn() { -! asn_t output; -! output.byte4 = ieee154e_vars.asn.byte4; -! output.bytes2and3 = ieee154e_vars.asn.bytes2and3; -! output.bytes0and1 = ieee154e_vars.asn.bytes0and1; -! openserial_printStatus(STATUS_ASN,(uint8_t*)&output,sizeof(output)); -! return TRUE; -! } -! -! /** -! \brief Trigger this module to print status information, over serial. -! -! debugPrint_* functions are used by the openserial module to continuously print -! status information about several modules in the OpenWSN stack. -! -! \returns TRUE if this function printed something, FALSE otherwise. -! */ -! bool debugPrint_isSync() { -! uint8_t output=0; -! output = ieee154e_vars.isSync; -! openserial_printStatus(STATUS_ISSYNC,(uint8_t*)&output,sizeof(uint8_t)); -! return TRUE; -! } -! -! /** -! \brief Trigger this module to print status information, over serial. -! -! debugPrint_* functions are used by the openserial module to continuously print -! status information about several modules in the OpenWSN stack. -! -! \returns TRUE if this function printed something, FALSE otherwise. -! */ -! bool debugPrint_macStats() { -! // send current stats over serial -! openserial_printStatus(STATUS_MACSTATS,(uint8_t*)&ieee154e_stats,sizeof(ieee154e_stats_t)); -! return TRUE; -! } -! -! //=========================== private ========================================= -! -! //======= SYNCHRONIZING -! -! port_INLINE void activity_synchronize_newSlot() { -! // I'm in the middle of receiving a packet -! if (ieee154e_vars.state==S_SYNCRX) { -! return; -! } -! -! // if this is the first time I call this function while not synchronized, -! // switch on the radio in Rx mode -! if (ieee154e_vars.state!=S_SYNCLISTEN) { -! // change state -! changeState(S_SYNCLISTEN); -! -! // turn off the radio (in case it wasn't yet) -! radio_rfOff(); -! -! // configure the radio to listen to the default synchronizing channel -! radio_setFrequency(SYNCHRONIZING_CHANNEL); -! -! // update record of current channel -! ieee154e_vars.freq = SYNCHRONIZING_CHANNEL; -! -! // switch on the radio in Rx mode. -! radio_rxEnable(); -! radio_rxNow(); -! } -! -! // increment ASN (used only to schedule serial activity) -! incrementAsnOffset(); -! -! // to be able to receive and transmist serial even when not synchronized -! // take turns every 8 slots sending and receiving -! if ((ieee154e_vars.asn.bytes0and1&0x000f)==0x0000) { -! openserial_stop(); -! openserial_startOutput(); -! } else if ((ieee154e_vars.asn.bytes0and1&0x000f)==0x0008) { -! openserial_stop(); -! openserial_startInput(); -! } -! } -! -! port_INLINE void activity_synchronize_startOfFrame(PORT_TIMER_WIDTH capturedTime) { -! -! // don't care about packet if I'm not listening -! if (ieee154e_vars.state!=S_SYNCLISTEN) { -! return; -! } -! -! // change state -! changeState(S_SYNCRX); -! -! // stop the serial -! openserial_stop(); -! -! // record the captured time -! ieee154e_vars.lastCapturedTime = capturedTime; -! -! // record the captured time (for sync) -! ieee154e_vars.syncCapturedTime = capturedTime; -! } -! -! port_INLINE void activity_synchronize_endOfFrame(PORT_TIMER_WIDTH capturedTime) { -! ieee802154_header_iht ieee802514_header; -! -! // check state -! if (ieee154e_vars.state!=S_SYNCRX) { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_WRONG_STATE_IN_ENDFRAME_SYNC, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)0); -! // abort -! endSlot(); -! } -! -! // change state -! changeState(S_SYNCPROC); -! -! // get a buffer to put the (received) frame in -! ieee154e_vars.dataReceived = openqueue_getFreePacketBuffer(COMPONENT_IEEE802154E); -! if (ieee154e_vars.dataReceived==NULL) { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! // abort -! endSlot(); -! return; -! } -! -! // declare ownership over that packet -! ieee154e_vars.dataReceived->creator = COMPONENT_IEEE802154E; -! ieee154e_vars.dataReceived->owner = COMPONENT_IEEE802154E; -! -! /* -! The do-while loop that follows is a little parsing trick. -! Because it contains a while(0) condition, it gets executed only once. -! The behavior is: -! - if a break occurs inside the do{} body, the error code below the loop -! gets executed. This indicates something is wrong with the packet being -! parsed. -! - if a return occurs inside the do{} body, the error code below the loop -! does not get executed. This indicates the received packet is correct. -! */ -! do { // this "loop" is only executed once -! -! // retrieve the received data frame from the radio's Rx buffer -! ieee154e_vars.dataReceived->payload = &(ieee154e_vars.dataReceived->packet[FIRST_FRAME_BYTE]); -! radio_getReceivedFrame( ieee154e_vars.dataReceived->payload, -! &ieee154e_vars.dataReceived->length, -! sizeof(ieee154e_vars.dataReceived->packet), -! &ieee154e_vars.dataReceived->l1_rssi, -! &ieee154e_vars.dataReceived->l1_lqi, -! &ieee154e_vars.dataReceived->l1_crc); -! -! // break if packet too short -! if (ieee154e_vars.dataReceived->length<LENGTH_CRC || ieee154e_vars.dataReceived->length>LENGTH_IEEE154_MAX) { -! // break from the do-while loop and execute abort code below -! openserial_printError(COMPONENT_IEEE802154E,ERR_INVALIDPACKETFROMRADIO, -! (errorparameter_t)0, -! ieee154e_vars.dataReceived->length); -! break; -! } -! -! // toss CRC (2 last bytes) -! packetfunctions_tossFooter( ieee154e_vars.dataReceived, LENGTH_CRC); -! -! // break if invalid CRC -! if (ieee154e_vars.dataReceived->l1_crc==FALSE) { -! // break from the do-while loop and execute abort code below -! break; -! } -! -! // parse the IEEE802.15.4 header (synchronize, end of frame) -! ieee802154_retrieveHeader(ieee154e_vars.dataReceived,&ieee802514_header); -! -! // break if invalid IEEE802.15.4 header -! if (ieee802514_header.valid==FALSE) { -! // break from the do-while loop and execute the clean-up code below -! break; -! } -! -! // store header details in packet buffer -! ieee154e_vars.dataReceived->l2_frameType = ieee802514_header.frameType; -! ieee154e_vars.dataReceived->l2_dsn = ieee802514_header.dsn; -! memcpy(&(ieee154e_vars.dataReceived->l2_nextORpreviousHop),&(ieee802514_header.src),sizeof(open_addr_t)); -! -! // toss the IEEE802.15.4 header -! packetfunctions_tossHeader(ieee154e_vars.dataReceived,ieee802514_header.headerLength); -! -! // break if invalid ADV -! if (isValidAdv(&ieee802514_header)==FALSE) { -! // break from the do-while loop and execute the clean-up code below -! break; -! } -! -! // turn off the radio -! radio_rfOff(); -! -! // record the ASN from the ADV payload -! asnStoreFromAdv(ieee154e_vars.dataReceived); -! -! // toss the ADV payload -! packetfunctions_tossHeader(ieee154e_vars.dataReceived,ADV_PAYLOAD_LENGTH); -! -! // synchronize (for the first time) to the sender's ADV -! synchronizePacket(ieee154e_vars.syncCapturedTime); -! -! // declare synchronized -! changeIsSync(TRUE); -! -! // log the info -! openserial_printInfo(COMPONENT_IEEE802154E,ERR_SYNCHRONIZED, -! (errorparameter_t)ieee154e_vars.slotOffset, -! (errorparameter_t)0); -! -! // send received ADV up the stack so RES can update statistics (synchronizing) -! notif_receive(ieee154e_vars.dataReceived); -! -! // clear local variable -! ieee154e_vars.dataReceived = NULL; -! -! // official end of synchronization -! endSlot(); -! -! // everything went well, return here not to execute the error code below -! return; -! -! } while (0); -! -! // free the (invalid) received data buffer so RAM memory can be recycled -! openqueue_freePacketBuffer(ieee154e_vars.dataReceived); -! -! // clear local variable -! ieee154e_vars.dataReceived = NULL; -! -! // return to listening state -! changeState(S_SYNCLISTEN); -! } -! -! //======= TX -! -! port_INLINE void activity_ti1ORri1() { -! cellType_t cellType; -! open_addr_t neighbor; -! uint8_t i; -! -! // increment ASN (do this first so debug pins are in sync) -! incrementAsnOffset(); -! -! // wiggle debug pins -! debugpins_slot_toggle(); -! if (ieee154e_vars.slotOffset==0) { -! debugpins_frame_toggle(); -! } -! -! // desynchronize if needed -! if (idmanager_getIsDAGroot()==FALSE) { -! ieee154e_vars.deSyncTimeout--; -! if (ieee154e_vars.deSyncTimeout==0) { -! // declare myself desynchronized -! changeIsSync(FALSE); -! -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_DESYNCHRONIZED, -! (errorparameter_t)ieee154e_vars.slotOffset, -! (errorparameter_t)0); -! -! // update the statistics -! ieee154e_stats.numDeSync++; -! -! // abort -! endSlot(); -! return; -! } -! } -! -! // if the previous slot took too long, we will not be in the right state -! if (ieee154e_vars.state!=S_SLEEP) { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_WRONG_STATE_IN_STARTSLOT, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! // abort -! endSlot(); -! return; -! } -! -! if (ieee154e_vars.slotOffset==ieee154e_vars.nextActiveSlotOffset) { -! // this is the next active slot -! -! // advance the schedule -! schedule_advanceSlot(); -! -! // find the next one -! ieee154e_vars.nextActiveSlotOffset = schedule_getNextActiveSlotOffset(); -! } else { -! // this is NOT the next active slot, abort -! // stop using serial -! openserial_stop(); -! // abort the slot -! endSlot(); -! //start outputing serial -! openserial_startOutput(); -! return; -! } -! -! // check the schedule to see what type of slot this is -! cellType = schedule_getType(); -! switch (cellType) { -! case CELLTYPE_ADV: -! // stop using serial -! openserial_stop(); -! // look for an ADV packet in the queue -! ieee154e_vars.dataToSend = openqueue_macGetAdvPacket(); -! if (ieee154e_vars.dataToSend==NULL) { // I will be listening for an ADV -! // change state -! changeState(S_RXDATAOFFSET); -! // arm rt1 -! radiotimer_schedule(DURATION_rt1); -! } else { // I will be sending an ADV -! // change state -! changeState(S_TXDATAOFFSET); -! // change owner -! ieee154e_vars.dataToSend->owner = COMPONENT_IEEE802154E; -! // fill in the ASN field of the ADV -! asnWriteToAdv(ieee154e_vars.dataToSend); -! // record that I attempt to transmit this packet -! ieee154e_vars.dataToSend->l2_numTxAttempts++; -! // arm tt1 -! radiotimer_schedule(DURATION_tt1); -! } -! break; -! case CELLTYPE_TXRX: -! case CELLTYPE_TX: -! // stop using serial -! openserial_stop(); -! // check whether we can send -! if (schedule_getOkToSend()) { -! schedule_getNeighbor(&neighbor); -! ieee154e_vars.dataToSend = openqueue_macGetDataPacket(&neighbor); -! } else { -! ieee154e_vars.dataToSend = NULL; -! } -! if (ieee154e_vars.dataToSend!=NULL) { // I have a packet to send -! // change state -! changeState(S_TXDATAOFFSET); -! // change owner -! ieee154e_vars.dataToSend->owner = COMPONENT_IEEE802154E; -! // record that I attempt to transmit this packet -! ieee154e_vars.dataToSend->l2_numTxAttempts++; -! // arm tt1 -! radiotimer_schedule(DURATION_tt1); -! } else if (cellType==CELLTYPE_TX){ -! // abort -! endSlot(); -! } -! if (cellType==CELLTYPE_TX || -! (cellType==CELLTYPE_TXRX && ieee154e_vars.dataToSend!=NULL)) { -! break; -! } -! case CELLTYPE_RX: -! // stop using serial -! openserial_stop(); -! // change state -! changeState(S_RXDATAOFFSET); -! // arm rt1 -! radiotimer_schedule(DURATION_rt1); -! break; -! case CELLTYPE_SERIALRX: -! // stop using serial -! openserial_stop(); -! // abort the slot -! endSlot(); -! //start inputting serial data -! openserial_startInput(); -! //this is to emulate a set of serial input slots without having the slotted structure. -! radio_setTimerPeriod(TsSlotDuration*(NUMSERIALRX)); -! -! //increase ASN by NUMSERIALRX-1 slots as at this slot is already incremented by 1 -! for (i=0;i<NUMSERIALRX-1;i++){ -! incrementAsnOffset(); -! } -! break; -! case CELLTYPE_MORESERIALRX: -! // do nothing (not even endSlot()) -! break; -! default: -! // stop using serial -! openserial_stop(); -! // log the error -! openserial_printCritical(COMPONENT_IEEE802154E,ERR_WRONG_CELLTYPE, -! (errorparameter_t)cellType, -! (errorparameter_t)ieee154e_vars.slotOffset); -! // abort -! endSlot(); -! break; -! } -! } -! -! port_INLINE void activity_ti2() { -! // change state -! changeState(S_TXDATAPREPARE); -! -! // calculate the frequency to transmit on -! ieee154e_vars.freq = calculateFrequency(schedule_getChannelOffset()); -! -! // configure the radio for that frequency -! //radio_setFrequency(frequency); -! radio_setFrequency(ieee154e_vars.freq); -! -! // load the packet in the radio's Tx buffer -! radio_loadPacket(ieee154e_vars.dataToSend->payload, -! ieee154e_vars.dataToSend->length); -! -! // enable the radio in Tx mode. This does not send the packet. -! radio_txEnable(); -! -! // arm tt2 -! radiotimer_schedule(DURATION_tt2); -! -! // change state -! changeState(S_TXDATAREADY); -! } -! -! port_INLINE void activity_tie1() { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_MAXTXDATAPREPARE_OVERFLOW, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ti3() { -! // change state -! changeState(S_TXDATADELAY); -! -! // arm tt3 -! radiotimer_schedule(DURATION_tt3); -! -! // give the 'go' to transmit -! radio_txNow(); -! } -! -! port_INLINE void activity_tie2() { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_WDRADIO_OVERFLOWS, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ti4(PORT_TIMER_WIDTH capturedTime) { -! // change state -! changeState(S_TXDATA); -! -! // cancel tt3 -! radiotimer_cancel(); -! -! // record the captured time -! ieee154e_vars.lastCapturedTime = capturedTime; -! -! // arm tt4 -! radiotimer_schedule(DURATION_tt4); -! } -! -! port_INLINE void activity_tie3() { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_WDDATADURATION_OVERFLOWS, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ti5(PORT_TIMER_WIDTH capturedTime) { -! bool listenForAck; -! -! // change state -! changeState(S_RXACKOFFSET); -! -! // cancel tt4 -! radiotimer_cancel(); -! -! // turn off the radio -! radio_rfOff(); -! -! // record the captured time -! ieee154e_vars.lastCapturedTime = capturedTime; -! -! // decides whether to listen for an ACK -! if (packetfunctions_isBroadcastMulticast(&ieee154e_vars.dataToSend->l2_nextORpreviousHop)==TRUE) { -! listenForAck = FALSE; -! } else { -! listenForAck = TRUE; -! } -! -! if (listenForAck==TRUE) { -! // arm tt5 -! radiotimer_schedule(DURATION_tt5); -! } else { -! // indicate succesful Tx to schedule to keep statistics -! schedule_indicateTx(&ieee154e_vars.asn,TRUE); -! // indicate to upper later the packet was sent successfully -! notif_sendDone(ieee154e_vars.dataToSend,E_SUCCESS); -! // reset local variable -! ieee154e_vars.dataToSend = NULL; -! // abort -! endSlot(); -! } -! } -! -! port_INLINE void activity_ti6() { -! // change state -! changeState(S_RXACKPREPARE); -! -! // calculate the frequency to transmit on -! ieee154e_vars.freq = calculateFrequency(schedule_getChannelOffset()); -! -! // configure the radio for that frequency -! //radio_setFrequency(frequency); -! radio_setFrequency(ieee154e_vars.freq); -! -! // enable the radio in Rx mode. The radio is not actively listening yet. -! radio_rxEnable(); -! -! // arm tt6 -! radiotimer_schedule(DURATION_tt6); -! -! // change state -! changeState(S_RXACKREADY); -! } -! -! port_INLINE void activity_tie4() { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_MAXRXACKPREPARE_OVERFLOWS, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ti7() { -! // change state -! changeState(S_RXACKLISTEN); -! -! // start listening -! radio_rxNow(); -! -! // arm tt7 -! radiotimer_schedule(DURATION_tt7); -! } -! -! port_INLINE void activity_tie5() { -! // indicate transmit failed to schedule to keep stats -! schedule_indicateTx(&ieee154e_vars.asn,FALSE); -! -! // decrement transmits left counter -! ieee154e_vars.dataToSend->l2_retriesLeft--; -! -! if (ieee154e_vars.dataToSend->l2_retriesLeft==0) { -! // indicate tx fail if no more retries left -! notif_sendDone(ieee154e_vars.dataToSend,E_FAIL); -! } else { -! // return packet to the virtual COMPONENT_RES_TO_IEEE802154E component -! ieee154e_vars.dataToSend->owner = COMPONENT_RES_TO_IEEE802154E; -! } -! -! // reset local variable -! ieee154e_vars.dataToSend = NULL; -! -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ti8(PORT_TIMER_WIDTH capturedTime) { -! // change state -! changeState(S_RXACK); -! -! // cancel tt7 -! radiotimer_cancel(); -! -! // record the captured time -! ieee154e_vars.lastCapturedTime = capturedTime; -! -! // arm tt8 -! radiotimer_schedule(DURATION_tt8); -! } -! -! port_INLINE void activity_tie6() { -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ti9(PORT_TIMER_WIDTH capturedTime) { -! ieee802154_header_iht ieee802514_header; -! volatile PORT_SIGNED_INT_WIDTH timeCorrection; -! uint8_t byte0; -! uint8_t byte1; -! -! // change state -! changeState(S_TXPROC); -! -! // cancel tt8 -! radiotimer_cancel(); -! -! // turn off the radio -! radio_rfOff(); -! -! // record the captured time -! ieee154e_vars.lastCapturedTime = capturedTime; -! -! // get a buffer to put the (received) ACK in -! ieee154e_vars.ackReceived = openqueue_getFreePacketBuffer(COMPONENT_IEEE802154E); -! if (ieee154e_vars.ackReceived==NULL) { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! // abort -! endSlot(); -! return; -! } -! -! // declare ownership over that packet -! ieee154e_vars.ackReceived->creator = COMPONENT_IEEE802154E; -! ieee154e_vars.ackReceived->owner = COMPONENT_IEEE802154E; -! -! /* -! The do-while loop that follows is a little parsing trick. -! Because it contains a while(0) condition, it gets executed only once. -! Below the do-while loop is some code to cleans up the ack variable. -! Anywhere in the do-while loop, a break statement can be called to jump to -! the clean up code early. If the loop ends without a break, the received -! packet was correct. If it got aborted early (through a break), the packet -! was faulty. -! */ -! do { // this "loop" is only executed once -! -! // retrieve the received ack frame from the radio's Rx buffer -! ieee154e_vars.ackReceived->payload = &(ieee154e_vars.ackReceived->packet[FIRST_FRAME_BYTE]); -! radio_getReceivedFrame( ieee154e_vars.ackReceived->payload, -! &ieee154e_vars.ackReceived->length, -! sizeof(ieee154e_vars.ackReceived->packet), -! &ieee154e_vars.ackReceived->l1_rssi, -! &ieee154e_vars.ackReceived->l1_lqi, -! &ieee154e_vars.ackReceived->l1_crc); -! -! // break if wrong length -! if (ieee154e_vars.ackReceived->length<LENGTH_CRC || ieee154e_vars.ackReceived->length>LENGTH_IEEE154_MAX) { -! // break from the do-while loop and execute the clean-up code below -! openserial_printError(COMPONENT_IEEE802154E,ERR_INVALIDPACKETFROMRADIO, -! (errorparameter_t)1, -! ieee154e_vars.ackReceived->length); -! -! break; -! } -! -! // toss CRC (2 last bytes) -! packetfunctions_tossFooter( ieee154e_vars.ackReceived, LENGTH_CRC); -! -! // break if invalid CRC -! if (ieee154e_vars.ackReceived->l1_crc==FALSE) { -! // break from the do-while loop and execute the clean-up code below -! break; -! } -! -! // parse the IEEE802.15.4 header (RX ACK) -! ieee802154_retrieveHeader(ieee154e_vars.ackReceived,&ieee802514_header); -! -! // break if invalid IEEE802.15.4 header -! if (ieee802514_header.valid==FALSE) { -! // break from the do-while loop and execute the clean-up code below -! break; -! } -! -! // store header details in packet buffer -! ieee154e_vars.ackReceived->l2_frameType = ieee802514_header.frameType; -! ieee154e_vars.ackReceived->l2_dsn = ieee802514_header.dsn; -! memcpy(&(ieee154e_vars.ackReceived->l2_nextORpreviousHop),&(ieee802514_header.src),sizeof(open_addr_t)); -! -! // toss the IEEE802.15.4 header -! packetfunctions_tossHeader(ieee154e_vars.ackReceived,ieee802514_header.headerLength); -! -! // break if invalid ACK -! if (isValidAck(&ieee802514_header,ieee154e_vars.dataToSend)==FALSE) { -! // break from the do-while loop and execute the clean-up code below -! break; -! } -! -! // resynchronize if I'm not a DAGroot and ACK from preferred parent -! if (idmanager_getIsDAGroot()==FALSE && -! neighbors_isPreferredParent(&(ieee154e_vars.ackReceived->l2_nextORpreviousHop)) ) { -! byte0 = ieee154e_vars.ackReceived->payload[0]; -! byte1 = ieee154e_vars.ackReceived->payload[1]; -! timeCorrection = (PORT_SIGNED_INT_WIDTH)((PORT_TIMER_WIDTH)byte1<<8 | (PORT_TIMER_WIDTH)byte0); -! timeCorrection /= US_PER_TICK; -! timeCorrection = -timeCorrection; -! synchronizeAck(timeCorrection); -! } -! -! // inform schedule of successful transmission -! schedule_indicateTx(&ieee154e_vars.asn,TRUE); -! -! // inform upper layer -! notif_sendDone(ieee154e_vars.dataToSend,E_SUCCESS); -! ieee154e_vars.dataToSend = NULL; -! -! // in any case, execute the clean-up code below (processing of ACK done) -! } while (0); -! -! // free the received ack so corresponding RAM memory can be recycled -! openqueue_freePacketBuffer(ieee154e_vars.ackReceived); -! -! // clear local variable -! ieee154e_vars.ackReceived = NULL; -! -! // official end of Tx slot -! endSlot(); -! } -! -! //======= RX -! -! port_INLINE void activity_ri2() { -! // change state -! changeState(S_RXDATAPREPARE); -! -! // calculate the frequency to transmit on -! ieee154e_vars.freq = calculateFrequency(schedule_getChannelOffset()); -! -! // configure the radio for that frequency -! //radio_setFrequency(frequency); -! radio_setFrequency(ieee154e_vars.freq); -! -! // enable the radio in Rx mode. The radio does not actively listen yet. -! radio_rxEnable(); -! -! -! // arm rt2 -! radiotimer_schedule(DURATION_rt2); -! -! // change state -! changeState(S_RXDATAREADY); -! } -! -! port_INLINE void activity_rie1() { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_MAXRXDATAPREPARE_OVERFLOWS, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ri3() { -! // change state -! changeState(S_RXDATALISTEN); -! -! // give the 'go' to receive -! radio_rxNow(); -! -! // arm rt3 -! radiotimer_schedule(DURATION_rt3); -! } -! -! port_INLINE void activity_rie2() { -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ri4(PORT_TIMER_WIDTH capturedTime) { -! // change state -! changeState(S_RXDATA); -! -! // cancel rt3 -! radiotimer_cancel(); -! -! // record the captured time -! ieee154e_vars.lastCapturedTime = capturedTime; -! -! // record the captured time to sync -! ieee154e_vars.syncCapturedTime = capturedTime; -! -! // arm rt4 -! radiotimer_schedule(DURATION_rt4); -! } -! -! port_INLINE void activity_rie3() { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_WDDATADURATION_OVERFLOWS, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ri5(PORT_TIMER_WIDTH capturedTime) { -! ieee802154_header_iht ieee802514_header; -! -! // change state -! changeState(S_TXACKOFFSET); -! -! // cancel rt4 -! radiotimer_cancel(); -! -! // turn off the radio -! radio_rfOff(); -! -! // get a buffer to put the (received) data in -! ieee154e_vars.dataReceived = openqueue_getFreePacketBuffer(COMPONENT_IEEE802154E); -! if (ieee154e_vars.dataReceived==NULL) { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! // abort -! endSlot(); -! return; -! } -! -! // declare ownership over that packet -! ieee154e_vars.dataReceived->creator = COMPONENT_IEEE802154E; -! ieee154e_vars.dataReceived->owner = COMPONENT_IEEE802154E; -! -! /* -! The do-while loop that follows is a little parsing trick. -! Because it contains a while(0) condition, it gets executed only once. -! The behavior is: -! - if a break occurs inside the do{} body, the error code below the loop -! gets executed. This indicates something is wrong with the packet being -! parsed. -! - if a return occurs inside the do{} body, the error code below the loop -! does not get executed. This indicates the received packet is correct. -! */ -! do { // this "loop" is only executed once -! -! // retrieve the received data frame from the radio's Rx buffer -! ieee154e_vars.dataReceived->payload = &(ieee154e_vars.dataReceived->packet[FIRST_FRAME_BYTE]); -! radio_getReceivedFrame( ieee154e_vars.dataReceived->payload, -! &ieee154e_vars.dataReceived->length, -! sizeof(ieee154e_vars.dataReceived->packet), -! &ieee154e_vars.dataReceived->l1_rssi, -! &ieee154e_vars.dataReceived->l1_lqi, -! &ieee154e_vars.dataReceived->l1_crc); -! -! // break if wrong length -! if (ieee154e_vars.dataReceived->length<LENGTH_CRC || ieee154e_vars.dataReceived->length>LENGTH_IEEE154_MAX ) { -! // jump to the error code below this do-while loop -! openserial_printError(COMPONENT_IEEE802154E,ERR_INVALIDPACKETFROMRADIO, -! (errorparameter_t)2, -! ieee154e_vars.dataReceived->length); -! break; -! } -! -! // toss CRC (2 last bytes) -! packetfunctions_tossFooter( ieee154e_vars.dataReceived, LENGTH_CRC); -! -! // if CRC doesn't check, stop -! if (ieee154e_vars.dataReceived->l1_crc==FALSE) { -! // jump to the error code below this do-while loop -! break; -! } -! -! // parse the IEEE802.15.4 header (RX DATA) -! ieee802154_retrieveHeader(ieee154e_vars.dataReceived,&ieee802514_header); -! -! // break if invalid IEEE802.15.4 header -! if (ieee802514_header.valid==FALSE) { -! // break from the do-while loop and execute the clean-up code below -! break; -! } -! -! // store header details in packet buffer -! ieee154e_vars.dataReceived->l2_frameType = ieee802514_header.frameType; -! ieee154e_vars.dataReceived->l2_dsn = ieee802514_header.dsn; -! memcpy(&(ieee154e_vars.dataReceived->l2_nextORpreviousHop),&(ieee802514_header.src),sizeof(open_addr_t)); -! -! // toss the IEEE802.15.4 header -! packetfunctions_tossHeader(ieee154e_vars.dataReceived,ieee802514_header.headerLength); -! -! // if I just received a valid ADV, record the ASN and toss the ADV payload -! if (isValidAdv(&ieee802514_header)==TRUE) { -! if (idmanager_getIsDAGroot()==FALSE) { -! asnStoreFromAdv(ieee154e_vars.dataReceived); -! } -! // toss the ADV payload -! packetfunctions_tossHeader(ieee154e_vars.dataReceived,ADV_PAYLOAD_LENGTH); -! } -! -! // record the captured time -! ieee154e_vars.lastCapturedTime = capturedTime; -! -! // if I just received an invalid frame, stop -! if (isValidRxFrame(&ieee802514_header)==FALSE) { -! // jump to the error code below this do-while loop -! break; -! } -! -! // check if ack requested -! if (ieee802514_header.ackRequested==1) { -! // arm rt5 -! radiotimer_schedule(DURATION_rt5); -! } else { -! // synchronize to the received packet iif I'm not a DAGroot and this is my preferred parent -! if (idmanager_getIsDAGroot()==FALSE && neighbors_isPreferredParent(&(ieee154e_vars.dataReceived->l2_nextORpreviousHop))) { -! synchronizePacket(ieee154e_vars.syncCapturedTime); -! } -! // indicate reception to upper layer (no ACK asked) -! notif_receive(ieee154e_vars.dataReceived); -! // reset local variable -! ieee154e_vars.dataReceived = NULL; -! // abort -! endSlot(); -! } -! -! // everything went well, return here not to execute the error code below -! return; -! -! } while(0); -! -! // free the (invalid) received data so RAM memory can be recycled -! openqueue_freePacketBuffer(ieee154e_vars.dataReceived); -! -! // clear local variable -! ieee154e_vars.dataReceived = NULL; -! -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ri6() { -! PORT_SIGNED_INT_WIDTH timeCorrection; -! -! // change state -! changeState(S_TXACKPREPARE); -! -! // get a buffer to put the ack to send in -! ieee154e_vars.ackToSend = openqueue_getFreePacketBuffer(COMPONENT_IEEE802154E); -! if (ieee154e_vars.ackToSend==NULL) { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! // indicate we received a packet anyway (we don't want to loose any) -! notif_receive(ieee154e_vars.dataReceived); -! // free local variable -! ieee154e_vars.dataReceived = NULL; -! // abort -! endSlot(); -! return; -! } -! -! // declare ownership over that packet -! ieee154e_vars.ackToSend->creator = COMPONENT_IEEE802154E; -! ieee154e_vars.ackToSend->owner = COMPONENT_IEEE802154E; -! -! // calculate the time timeCorrection (this is the time when the packet arrive w.r.t the time it should be. -! timeCorrection = (PORT_SIGNED_INT_WIDTH)((PORT_SIGNED_INT_WIDTH)ieee154e_vars.syncCapturedTime-(PORT_SIGNED_INT_WIDTH)TsTxOffset); -! -! // add the payload to the ACK (i.e. the timeCorrection) -! packetfunctions_reserveHeaderSize(ieee154e_vars.ackToSend,sizeof(IEEE802154E_ACK_ht)); -! timeCorrection = -timeCorrection; -! timeCorrection *= US_PER_TICK; -! ieee154e_vars.ackToSend->payload[0] = (uint8_t)((((PORT_TIMER_WIDTH)timeCorrection) ) & 0xff); -! ieee154e_vars.ackToSend->payload[1] = (uint8_t)((((PORT_TIMER_WIDTH)timeCorrection)>>8) & 0xff); -! -! // prepend the IEEE802.15.4 header to the ACK -! ieee154e_vars.ackToSend->l2_frameType = IEEE154_TYPE_ACK; -! ieee154e_vars.ackToSend->l2_dsn = ieee154e_vars.dataReceived->l2_dsn; -! ieee802154_prependHeader(ieee154e_vars.ackToSend, -! ieee154e_vars.ackToSend->l2_frameType, -! IEEE154_SEC_NO_SECURITY, -! ieee154e_vars.dataReceived->l2_dsn, -! &(ieee154e_vars.dataReceived->l2_nextORpreviousHop) -! ); -! -! // space for 2-byte CRC -! packetfunctions_reserveFooterSize(ieee154e_vars.ackToSend,2); -! -! // calculate the frequency to transmit on -! ieee154e_vars.freq = calculateFrequency(schedule_getChannelOffset()); -! -! // configure the radio for that frequency -! //radio_setFrequency(frequency); -! radio_setFrequency(ieee154e_vars.freq); -! -! // load the packet in the radio's Tx buffer -! radio_loadPacket(ieee154e_vars.ackToSend->payload, -! ieee154e_vars.ackToSend->length); -! -! // enable the radio in Tx mode. This does not send that packet. -! radio_txEnable(); -! -! // arm rt6 -! radiotimer_schedule(DURATION_rt6); -! -! // change state -! changeState(S_TXACKREADY); -! } -! -! port_INLINE void activity_rie4() { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_MAXTXACKPREPARE_OVERFLOWS, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ri7() { -! // change state -! changeState(S_TXACKDELAY); -! -! // arm rt7 -! radiotimer_schedule(DURATION_rt7); -! -! // give the 'go' to transmit -! radio_txNow(); -! } -! -! port_INLINE void activity_rie5() { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_WDRADIOTX_OVERFLOWS, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ri8(PORT_TIMER_WIDTH capturedTime) { -! // change state -! changeState(S_TXACK); -! -! // cancel rt7 -! radiotimer_cancel(); -! -! // record the captured time -! ieee154e_vars.lastCapturedTime = capturedTime; -! -! // arm rt8 -! radiotimer_schedule(DURATION_rt8); -! } -! -! port_INLINE void activity_rie6() { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_WDACKDURATION_OVERFLOWS, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ri9(PORT_TIMER_WIDTH capturedTime) { -! // change state -! changeState(S_RXPROC); -! -! // cancel rt8 -! radiotimer_cancel(); -! -! // record the captured time -! ieee154e_vars.lastCapturedTime = capturedTime; -! -! // free the ack we just sent so corresponding RAM memory can be recycled -! openqueue_freePacketBuffer(ieee154e_vars.ackToSend); -! -! // clear local variable -! ieee154e_vars.ackToSend = NULL; -! -! // synchronize to the received packet -! if (idmanager_getIsDAGroot()==FALSE && neighbors_isPreferredParent(&(ieee154e_vars.dataReceived->l2_nextORpreviousHop))) { -! synchronizePacket(ieee154e_vars.syncCapturedTime); -! } -! -! // inform upper layer of reception (after ACK sent) -! notif_receive(ieee154e_vars.dataReceived); -! -! // clear local variable -! ieee154e_vars.dataReceived = NULL; -! -! // official end of Rx slot -! endSlot(); -! } -! -! //======= frame validity check -! -! /** -! \brief Decides whether the packet I just received is a valid ADV -! -! \param [in] ieee802514_header IEEE802.15.4 header of the packet I just -! received. -! -! A valid ADV frame satisfies the following conditions: -! - its IEEE802.15.4 header is well formatted -! - it's a BEACON frame -! - it's sent to the my PANid -! - its payload length is the expected ADV payload length -! -! \returns TRUE if packet is a valid ADV, FALSE otherwise -! */ -! port_INLINE bool isValidAdv(ieee802154_header_iht* ieee802514_header) { -! return ieee802514_header->valid==TRUE && \ -! ieee802514_header->frameType==IEEE154_TYPE_BEACON && \ -! packetfunctions_sameAddress(&ieee802514_header->panid,idmanager_getMyID(ADDR_PANID)) && \ -! ieee154e_vars.dataReceived->length==ADV_PAYLOAD_LENGTH; -! } -! -! /** -! \brief Decides whether the packet I just received is valid received frame. -! -! A valid Rx frame satisfies the following constraints: -! - its IEEE802.15.4 header is well formatted -! - it's a DATA of BEACON frame (i.e. not ACK and not COMMAND) -! - it's sent on the same PANid as mine -! - it's for me (unicast or broadcast) -! -! \param [in] ieee802514_header IEEE802.15.4 header of the packet I just received -! -! \returns TRUE if packet is valid received frame, FALSE otherwise -! */ -! port_INLINE bool isValidRxFrame(ieee802154_header_iht* ieee802514_header) { -! return ieee802514_header->valid==TRUE && \ -! ( -! ieee802514_header->frameType==IEEE154_TYPE_DATA || -! ieee802514_header->frameType==IEEE154_TYPE_BEACON -! ) && \ -! packetfunctions_sameAddress(&ieee802514_header->panid,idmanager_getMyID(ADDR_PANID)) && \ -! ( -! idmanager_isMyAddress(&ieee802514_header->dest) || -! packetfunctions_isBroadcastMulticast(&ieee802514_header->dest) -! ); -! } -! -! /** -! \brief Decides whether the packet I just received is a valid ACK. -! -! A packet is a valid ACK if it satisfies the following conditions: -! - the IEEE802.15.4 header is valid -! - the frame type is 'ACK' -! - the sequence number in the ACK matches the sequence number of the packet sent -! - the ACK contains my PANid -! - the packet is unicast to me -! - the packet comes from the neighbor I sent the data to -! -! \param [in] ieee802514_header IEEE802.15.4 header of the packet I just received -! \param [in] packetSent points to the packet I just sent -! -! \returns TRUE if packet is a valid ACK, FALSE otherwise. -! */ -! port_INLINE bool isValidAck(ieee802154_header_iht* ieee802514_header, OpenQueueEntry_t* packetSent) { -! /* -! return ieee802514_header->valid==TRUE && \ -! ieee802514_header->frameType==IEEE154_TYPE_ACK && \ -! ieee802514_header->dsn==packetSent->l2_dsn && \ -! packetfunctions_sameAddress(&ieee802514_header->panid,idmanager_getMyID(ADDR_PANID)) && \ -! idmanager_isMyAddress(&ieee802514_header->dest) && \ -! packetfunctions_sameAddress(&ieee802514_header->src,&packetSent->l2_nextORpreviousHop); -! */ -! // poipoi don't check for seq num -! return ieee802514_header->valid==TRUE && \ -! ieee802514_header->frameType==IEEE154_TYPE_ACK && \ -! packetfunctions_sameAddress(&ieee802514_header->panid,idmanager_getMyID(ADDR_PANID)) && \ -! idmanager_isMyAddress(&ieee802514_header->dest) && \ -! packetfunctions_sameAddress(&ieee802514_header->src,&packetSent->l2_nextORpreviousHop); -! } -! -! //======= ASN handling -! -! port_INLINE void incrementAsnOffset() { -! // increment the asn -! ieee154e_vars.asn.bytes0and1++; -! if (ieee154e_vars.asn.bytes0and1==0) { -! ieee154e_vars.asn.bytes2and3++; -! if (ieee154e_vars.asn.bytes2and3==0) { -! ieee154e_vars.asn.byte4++; -! } -! } -! // increment the offsets -! ieee154e_vars.slotOffset = (ieee154e_vars.slotOffset+1)%schedule_getFrameLength(); -! ieee154e_vars.asnOffset = (ieee154e_vars.asnOffset+1)%16; -! } -! -! port_INLINE void asnWriteToAdv(OpenQueueEntry_t* advFrame) { -! advFrame->l2_payload[0] = (ieee154e_vars.asn.bytes0and1 & 0xff); -! advFrame->l2_payload[1] = (ieee154e_vars.asn.bytes0and1/256 & 0xff); -! advFrame->l2_payload[2] = (ieee154e_vars.asn.bytes2and3 & 0xff); -! advFrame->l2_payload[3] = (ieee154e_vars.asn.bytes2and3/256 & 0xff); -! advFrame->l2_payload[4] = ieee154e_vars.asn.byte4; -! } -! -! //from upper layer that want to send the ASN to compute timming or latency -! void asnWriteToPkt(OpenQueueEntry_t* frame) { -! frame->payload[0] = (ieee154e_vars.asn.bytes0and1 & 0xff); -! frame->payload[1] = (ieee154e_vars.asn.bytes0and1/256 & 0xff); -! frame->payload[2] = (ieee154e_vars.asn.bytes2and3 & 0xff); -! frame->payload[3] = (ieee154e_vars.asn.bytes2and3/256 & 0xff); -! frame->payload[4] = ieee154e_vars.asn.byte4; -! } -! -! void asnWriteToSerial(uint8_t* array) { -! array[0] = (ieee154e_vars.asn.bytes0and1 & 0xff); -! array[1] = (ieee154e_vars.asn.bytes0and1/256 & 0xff); -! array[2] = (ieee154e_vars.asn.bytes2and3 & 0xff); -! array[3] = (ieee154e_vars.asn.bytes2and3/256 & 0xff); -! array[4] = ieee154e_vars.asn.byte4; -! } -! -! -! port_INLINE void asnStoreFromAdv(OpenQueueEntry_t* advFrame) { -! -! // store the ASN -! ieee154e_vars.asn.bytes0and1 = ieee154e_vars.dataReceived->payload[0]+ -! 256*ieee154e_vars.dataReceived->payload[1]; -! ieee154e_vars.asn.bytes2and3 = ieee154e_vars.dataReceived->payload[2]+ -! 256*ieee154e_vars.dataReceived->payload[3]; -! ieee154e_vars.asn.byte4 = ieee154e_vars.dataReceived->payload[4]; -! -! // determine the current slotOffset -! /* -! Note: this is a bit of a hack. Normally, slotOffset=ASN%slotlength. But since -! the ADV is exchanged in slot 0, we know that we're currently at slotOffset==0 -! */ -! ieee154e_vars.slotOffset = 0; -! schedule_syncSlotOffset(ieee154e_vars.slotOffset); -! ieee154e_vars.nextActiveSlotOffset = schedule_getNextActiveSlotOffset(); -! -! /* -! infer the asnOffset based on the fact that -! ieee154e_vars.freq = 11 + (asnOffset + channelOffset)%16 -! */ -! ieee154e_vars.asnOffset = ieee154e_vars.freq - 11 - schedule_getChannelOffset(); -! } -! -! //======= synchronization -! -! void synchronizePacket(PORT_TIMER_WIDTH timeReceived) { -! PORT_SIGNED_INT_WIDTH timeCorrection; -! PORT_TIMER_WIDTH newPeriod; -! PORT_TIMER_WIDTH currentValue; -! PORT_TIMER_WIDTH currentPeriod; -! // record the current timer value and period -! currentValue = radio_getTimerValue(); -! currentPeriod = radio_getTimerPeriod(); -! // calculate new period -! timeCorrection = (PORT_SIGNED_INT_WIDTH)((PORT_SIGNED_INT_WIDTH)timeReceived-(PORT_SIGNED_INT_WIDTH)TsTxOffset); -! newPeriod = TsSlotDuration; -! // detect whether I'm too close to the edge of the slot, in that case, -! // skip a slot and increase the temporary slot length to be 2 slots long -! if (currentValue<timeReceived || currentPeriod-currentValue<RESYNCHRONIZATIONGUARD) { -! newPeriod += TsSlotDuration; -! incrementAsnOffset(); -! } -! newPeriod = (PORT_TIMER_WIDTH)((PORT_SIGNED_INT_WIDTH)newPeriod+timeCorrection); -! // resynchronize by applying the new period -! radio_setTimerPeriod(newPeriod); -! // reset the de-synchronization timeout -! ieee154e_vars.deSyncTimeout = DESYNCTIMEOUT; -! // log a large timeCorrection -! if ( -! ieee154e_vars.isSync==TRUE && -! ( -! timeCorrection<-LIMITLARGETIMECORRECTION || -! timeCorrection> LIMITLARGETIMECORRECTION -! ) -! ) { -! openserial_printError(COMPONENT_IEEE802154E,ERR_LARGE_TIMECORRECTION, -! (errorparameter_t)timeCorrection, -! (errorparameter_t)0); -! } -! // update the stats -! ieee154e_stats.numSyncPkt++; -! updateStats(timeCorrection); -! } -! -! void synchronizeAck(PORT_SIGNED_INT_WIDTH timeCorrection) { -! PORT_TIMER_WIDTH newPeriod; -! PORT_TIMER_WIDTH currentPeriod; -! // calculate new period -! currentPeriod = radio_getTimerPeriod(); -! newPeriod = (PORT_TIMER_WIDTH)((PORT_SIGNED_INT_WIDTH)currentPeriod-timeCorrection); -! // resynchronize by applying the new period -! radio_setTimerPeriod(newPeriod); -! // reset the de-synchronization timeout -! ieee154e_vars.deSyncTimeout = DESYNCTIMEOUT; -! // log a large timeCorrection -! if ( -! ieee154e_vars.isSync==TRUE && -! ( -! timeCorrection<-LIMITLARGETIMECORRECTION || -! timeCorrection> LIMITLARGETIMECORRECTION -! ) -! ) { -! openserial_printError(COMPONENT_IEEE802154E,ERR_LARGE_TIMECORRECTION, -! (errorparameter_t)timeCorrection, -! (errorparameter_t)1); -! } -! // update the stats -! ieee154e_stats.numSyncAck++; -! updateStats(timeCorrection); -! } -! -! void changeIsSync(bool newIsSync) { -! ieee154e_vars.isSync = newIsSync; -! -! if (ieee154e_vars.isSync==TRUE) { -! leds_sync_on(); -! resetStats(); -! } else { -! leds_sync_off(); -! schedule_resetBackoff(); -! } -! } -! -! //======= notifying upper layer -! -! void notif_sendDone(OpenQueueEntry_t* packetSent, error_t error) { -! // record the outcome of the trasmission attempt -! packetSent->l2_sendDoneError = error; -! // record the current ASN -! memcpy(&packetSent->l2_asn,&ieee154e_vars.asn,sizeof(asn_t)); -! // associate this packet with the virtual component -! // COMPONENT_IEEE802154E_TO_RES so RES can knows it's for it -! packetSent->owner = COMPONENT_IEEE802154E_TO_RES; -! // post RES's sendDone task -! scheduler_push_task(task_resNotifSendDone,TASKPRIO_RESNOTIF_TXDONE); -! // wake up the scheduler -! SCHEDULER_WAKEUP(); -! } -! -! void notif_receive(OpenQueueEntry_t* packetReceived) { -! // record the current ASN -! memcpy(&packetReceived->l2_asn, &ieee154e_vars.asn, sizeof(asn_t)); -! // indicate reception to the schedule, to keep statistics -! schedule_indicateRx(&packetReceived->l2_asn); -! // associate this packet with the virtual component -! // COMPONENT_IEEE802154E_TO_RES so RES can knows it's for it -! packetReceived->owner = COMPONENT_IEEE802154E_TO_RES; -! // post RES's Receive task -! scheduler_push_task(task_resNotifReceive,TASKPRIO_RESNOTIF_RX); -! // wake up the scheduler -! SCHEDULER_WAKEUP(); -! } -! -! //======= stats -! -! port_INLINE void resetStats() { -! ieee154e_stats.numSyncPkt = 0; -! ieee154e_stats.numSyncAck = 0; -! ieee154e_stats.minCorrection = 127; -! ieee154e_stats.maxCorrection = -127; -! // do not reset the number of de-synchronizations -! } -! -! void updateStats(PORT_SIGNED_INT_WIDTH timeCorrection) { -! // update minCorrection -! if (timeCorrection<ieee154e_stats.minCorrection) { -! ieee154e_stats.minCorrection = timeCorrection; -! } -! // update maxConnection -! if(timeCorrection>ieee154e_stats.maxCorrection) { -! ieee154e_stats.maxCorrection = timeCorrection; -! } -! } -! -! //======= misc -! -! /** -! \brief Calculates the frequency channel to transmit on, based on the -! absolute slot number and the channel offset of the requested slot. -! -! During normal operation, the frequency used is a function of the -! channelOffset indicating in the schedule, and of the ASN of the -! slot. This ensures channel hopping, consecutive packets sent in the same slot -! in the schedule are done on a difference frequency channel. -! -! During development, you can force single channel operation by having this -! function return a constant channel number (between 11 and 26). This allows you -! to use a single-channel sniffer; but you can not schedule two links on two -! different channel offsets in the same slot. -! -! \param [in] channelOffset channel offset for the current slot -! -! \returns The calculated frequency channel, an integer between 11 and 26. -! */ -! port_INLINE uint8_t calculateFrequency(uint8_t channelOffset) { -! // comment the following line out to disable channel hopping -! return SYNCHRONIZING_CHANNEL; // single channel -! //return 11+(ieee154e_vars.asnOffset+channelOffset)%16; //channel hopping -! } -! -! /** -! \brief Changes the state of the IEEE802.15.4e FSM. -! -! Besides simply updating the state global variable, -! this function toggles the FSM debug pin. -! -! \param [in] newstate The state the IEEE802.15.4e FSM is now in. -! */ -! void changeState(ieee154e_state_t newstate) { -! // update the state -! ieee154e_vars.state = newstate; -! // wiggle the FSM debug pin -! switch (ieee154e_vars.state) { -! case S_SYNCLISTEN: -! case S_TXDATAOFFSET: -! debugpins_fsm_set(); -! break; -! case S_SLEEP: -! case S_RXDATAOFFSET: -! debugpins_fsm_clr(); -! break; -! case S_SYNCRX: -! case S_SYNCPROC: -! case S_TXDATAPREPARE: -! case S_TXDATAREADY: -! case S_TXDATADELAY: -! case S_TXDATA: -! case S_RXACKOFFSET: -! case S_RXACKPREPARE: -! case S_RXACKREADY: -! case S_RXACKLISTEN: -! case S_RXACK: -! case S_TXPROC: -! case S_RXDATAPREPARE: -! case S_RXDATAREADY: -! case S_RXDATALISTEN: -! case S_RXDATA: -! case S_TXACKOFFSET: -! case S_TXACKPREPARE: -! case S_TXACKREADY: -! case S_TXACKDELAY: -! case S_TXACK: -! case S_RXPROC: -! debugpins_fsm_toggle(); -! break; -! } -! } -! -! /** -! \brief Housekeeping tasks to do at the end of each slot. -! -! This functions is called once in each slot, when there is nothing more -! to do. This might be when an error occured, or when everything went well. -! This function resets the state of the FSM so it is ready for the next slot. -! -! Note that by the time this function is called, any received packet should already -! have been sent to the upper layer. Similarly, in a Tx slot, the sendDone -! function should already have been done. If this is not the case, this function -! will do that for you, but assume that something went wrong. -! */ -! void endSlot() { -! // turn off the radio -! radio_rfOff(); -! -! // clear any pending timer -! radiotimer_cancel(); -! -! // reset capturedTimes -! ieee154e_vars.lastCapturedTime = 0; -! ieee154e_vars.syncCapturedTime = 0; -! -! // clean up dataToSend -! if (ieee154e_vars.dataToSend!=NULL) { -! // if everything went well, dataToSend was set to NULL in ti9 -! // getting here means transmit failed -! -! // indicate Tx fail to schedule to update stats -! schedule_indicateTx(&ieee154e_vars.asn,FALSE); -! -! //decrement transmits left counter -! ieee154e_vars.dataToSend->l2_retriesLeft--; -! -! if (ieee154e_vars.dataToSend->l2_retriesLeft==0) { -! // indicate tx fail if no more retries left -! notif_sendDone(ieee154e_vars.dataToSend,E_FAIL); -! } else { -! // return packet to the virtual COMPONENT_RES_TO_IEEE802154E component -! ieee154e_vars.dataToSend->owner = COMPONENT_RES_TO_IEEE802154E; -! } -! -! // reset local variable -! ieee154e_vars.dataToSend = NULL; -! } -! -! // clean up dataReceived -! if (ieee154e_vars.dataReceived!=NULL) { -! // assume something went wrong. If everything went well, dataReceived -! // would have been set to NULL in ri9. -! // indicate "received packet" to upper layer since we don't want to loose packets -! notif_receive(ieee154e_vars.dataReceived); -! // reset local variable -! ieee154e_vars.dataReceived = NULL; -! } -! -! // clean up ackToSend -! if (ieee154e_vars.ackToSend!=NULL) { -! // free ackToSend so corresponding RAM memory can be recycled -! openqueue_freePacketBuffer(ieee154e_vars.ackToSend); -! // reset local variable -! ieee154e_vars.ackToSend = NULL; -! } -! -! // clean up ackReceived -! if (ieee154e_vars.ackReceived!=NULL) { -! // free ackReceived so corresponding RAM memory can be recycled -! openqueue_freePacketBuffer(ieee154e_vars.ackReceived); -! // reset local variable -! ieee154e_vars.ackReceived = NULL; -! } -! -! // change state -! changeState(S_SLEEP); -! } -! -! bool ieee154e_isSynch(){ -! return ieee154e_vars.isSync; -! } -\ No newline at end of file ---- 1,2061 ---- -! #include "openwsn.h" -! #include "IEEE802154E.h" -! #include "radio.h" -! #include "radiotimer.h" -! #include "IEEE802154.h" -! #include "openqueue.h" -! #include "idmanager.h" -! #include "openserial.h" -! #include "schedule.h" -! #include "packetfunctions.h" -! #include "scheduler.h" -! #include "leds.h" -! #include "neighbors.h" -! #include "debugpins.h" -! #include "res.h" -! -! #include "thread.h" -! -! //=========================== variables ======================================= -! -! ieee154e_vars_t ieee154e_vars; -! ieee154e_stats_t ieee154e_stats; -! ieee154e_dbg_t ieee154e_dbg; -! -! //static char openwsn_ieee802154e_rec_stack[KERNEL_CONF_STACKSIZE_MAIN]; -! //static char openwsn_ieee802154e_send_stack[KERNEL_CONF_STACKSIZE_MAIN]; -! -! //=========================== prototypes ====================================== -! void isr_ieee154e_newSlot(void); -! void isr_ieee154e_timer(void); -! // SYNCHRONIZING -! void activity_synchronize_newSlot(void); -! void activity_synchronize_startOfFrame(PORT_RADIOTIMER_WIDTH capturedTime); -! void activity_synchronize_endOfFrame(PORT_RADIOTIMER_WIDTH capturedTime); -! // TX -! void activity_ti1ORri1(void); -! void activity_ti2(void); -! void activity_tie1(void); -! void activity_ti3(void); -! void activity_tie2(void); -! void activity_ti4(PORT_RADIOTIMER_WIDTH capturedTime); -! void activity_tie3(void); -! void activity_ti5(PORT_RADIOTIMER_WIDTH capturedTime); -! void activity_ti6(void); -! void activity_tie4(void); -! void activity_ti7(void); -! void activity_tie5(void); -! void activity_ti8(PORT_RADIOTIMER_WIDTH capturedTime); -! void activity_tie6(void); -! void activity_ti9(PORT_RADIOTIMER_WIDTH capturedTime); -! // RX -! void activity_ri2(void); -! void activity_rie1(void); -! void activity_ri3(void); -! void activity_rie2(void); -! void activity_ri4(PORT_RADIOTIMER_WIDTH capturedTime); -! void activity_rie3(void); -! void activity_ri5(PORT_RADIOTIMER_WIDTH capturedTime); -! void activity_ri6(void); -! void activity_rie4(void); -! void activity_ri7(void); -! void activity_rie5(void); -! void activity_ri8(PORT_RADIOTIMER_WIDTH capturedTime); -! void activity_rie6(void); -! void activity_ri9(PORT_RADIOTIMER_WIDTH capturedTime); -! // frame validity check -! -! bool isValidRxFrame(ieee802154_header_iht* ieee802514_header); -! bool isValidAck(ieee802154_header_iht* ieee802514_header, -! OpenQueueEntry_t* packetSent); -! // IEs Handling -! bool ieee154e_processIEs(OpenQueueEntry_t* pkt, uint16_t * lenIE);//xv poipoi -! void ieee154e_processSlotframeLinkIE(OpenQueueEntry_t* pkt,uint8_t * ptr);//xv poipoi -! // ASN handling -! void incrementAsnOffset(void); -! void asnStoreFromAdv(uint8_t* asn); -! void joinPriorityStoreFromAdv(uint8_t jp); -! // synchronization -! void synchronizePacket(PORT_RADIOTIMER_WIDTH timeReceived); -! void synchronizeAck(PORT_SIGNED_INT_WIDTH timeCorrection); -! void changeIsSync(bool newIsSync); -! // notifying upper layer -! void notif_sendDone(OpenQueueEntry_t* packetSent, owerror_t error); -! void notif_receive(OpenQueueEntry_t* packetReceived); -! // statistics -! void resetStats(void); -! void updateStats(PORT_SIGNED_INT_WIDTH timeCorrection); -! // misc -! uint8_t calculateFrequency(uint8_t channelOffset); -! void changeState(ieee154e_state_t newstate); -! void endSlot(void); -! bool debugPrint_asn(void); -! bool debugPrint_isSync(void); -! -! //=========================== admin =========================================== -! -! /** -! \brief This function initializes this module. -! -! Call this function once before any other function in this module, possibly -! during boot-up. -! */ -! void ieee154e_init(void) { -! puts(__PRETTY_FUNCTION__); -! // initialize variables -! memset(&ieee154e_vars,0,sizeof(ieee154e_vars_t)); -! memset(&ieee154e_dbg,0,sizeof(ieee154e_dbg_t)); -! -! if (idmanager_getIsDAGroot()==TRUE) { -! changeIsSync(TRUE); -! } else { -! changeIsSync(FALSE); -! } -! -! resetStats(); -! ieee154e_stats.numDeSync = 0; -! -! // switch radio on -! radio_rfOn(); -! -! // set callback functions for the radio -! radio_setOverflowCb(isr_ieee154e_newSlot); -! radio_setCompareCb(isr_ieee154e_timer); -! radio_setStartFrameCb(ieee154e_startOfFrame); -! radio_setEndFrameCb(ieee154e_endOfFrame); -! // have the radio start its timer -! radio_startTimer(TsSlotDuration); -! } -! -! //=========================== public ========================================== -! -! /** -! /brief Difference between some older ASN and the current ASN. -! -! \param[in] someASN some ASN to compare to the current -! -! \returns The ASN difference, or 0xffff if more than 65535 different -! */ -! PORT_RADIOTIMER_WIDTH ieee154e_asnDiff(asn_t* someASN) { -! PORT_RADIOTIMER_WIDTH diff; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! if (ieee154e_vars.asn.byte4 != someASN->byte4) { -! ENABLE_INTERRUPTS(); -! return (PORT_RADIOTIMER_WIDTH)0xFFFFFFFF;; -! } -! -! diff = 0; -! if (ieee154e_vars.asn.bytes2and3 == someASN->bytes2and3) { -! ENABLE_INTERRUPTS(); -! return ieee154e_vars.asn.bytes0and1-someASN->bytes0and1; -! } else if (ieee154e_vars.asn.bytes2and3-someASN->bytes2and3==1) { -! diff = ieee154e_vars.asn.bytes0and1; -! diff += 0xffff-someASN->bytes0and1; -! diff += 1; -! } else { -! diff = (PORT_RADIOTIMER_WIDTH)0xFFFFFFFF;; -! } -! ENABLE_INTERRUPTS(); -! return diff; -! } -! -! //======= events -! -! /** -! \brief Indicates a new slot has just started. -! -! This function executes in ISR mode, when the new slot timer fires. -! */ -! void isr_ieee154e_newSlot(void) { -! radio_setTimerPeriod(TsSlotDuration); -! if (ieee154e_vars.isSync==FALSE) { -! if (idmanager_getIsDAGroot()==TRUE) { -! changeIsSync(TRUE); -! } else { -! activity_synchronize_newSlot(); -! } -! } else { -! activity_ti1ORri1(); -! } -! ieee154e_dbg.num_newSlot++; -! } -! -! /** -! \brief Indicates the FSM timer has fired. -! -! This function executes in ISR mode, when the FSM timer fires. -! */ -! void isr_ieee154e_timer(void) { -! switch (ieee154e_vars.state) { -! case S_TXDATAOFFSET: -! activity_ti2(); -! break; -! case S_TXDATAPREPARE: -! activity_tie1(); -! break; -! case S_TXDATAREADY: -! activity_ti3(); -! break; -! case S_TXDATADELAY: -! activity_tie2(); -! break; -! case S_TXDATA: -! activity_tie3(); -! break; -! case S_RXACKOFFSET: -! activity_ti6(); -! break; -! case S_RXACKPREPARE: -! activity_tie4(); -! break; -! case S_RXACKREADY: -! activity_ti7(); -! break; -! case S_RXACKLISTEN: -! activity_tie5(); -! break; -! case S_RXACK: -! activity_tie6(); -! break; -! case S_RXDATAOFFSET: -! activity_ri2(); -! break; -! case S_RXDATAPREPARE: -! activity_rie1(); -! break; -! case S_RXDATAREADY: -! activity_ri3(); -! break; -! case S_RXDATALISTEN: -! activity_rie2(); -! break; -! case S_RXDATA: -! activity_rie3(); -! break; -! case S_TXACKOFFSET: -! activity_ri6(); -! break; -! case S_TXACKPREPARE: -! activity_rie4(); -! break; -! case S_TXACKREADY: -! activity_ri7(); -! break; -! case S_TXACKDELAY: -! activity_rie5(); -! break; -! case S_TXACK: -! activity_rie6(); -! break; -! default: -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_WRONG_STATE_IN_TIMERFIRES, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! // abort -! endSlot(); -! break; -! } -! ieee154e_dbg.num_timer++; -! } -! -! /** -! \brief Indicates the radio just received the first byte of a packet. -! -! This function executes in ISR mode. -! */ -! void ieee154e_startOfFrame(PORT_RADIOTIMER_WIDTH capturedTime) { -! if (ieee154e_vars.isSync==FALSE) { -! activity_synchronize_startOfFrame(capturedTime); -! } else { -! switch (ieee154e_vars.state) { -! case S_TXDATADELAY: -! activity_ti4(capturedTime); -! break; -! case S_RXACKREADY: -! /* -! It is possible to receive in this state for radio where there is no -! way of differentiated between "ready to listen" and "listening" -! (e.g. CC2420). We must therefore expect to the start of a packet in -! this "ready" state. -! */ -! // no break! -! case S_RXACKLISTEN: -! activity_ti8(capturedTime); -! break; -! case S_RXDATAREADY: -! /* -! Similarly as above. -! */ -! // no break! -! case S_RXDATALISTEN: -! activity_ri4(capturedTime); -! break; -! case S_TXACKDELAY: -! activity_ri8(capturedTime); -! break; -! default: -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_WRONG_STATE_IN_NEWSLOT, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! // abort -! endSlot(); -! break; -! } -! } -! ieee154e_dbg.num_startOfFrame++; -! } -! -! /** -! \brief Indicates the radio just received the last byte of a packet. -! -! This function executes in ISR mode. -! */ -! void ieee154e_endOfFrame(PORT_RADIOTIMER_WIDTH capturedTime) { -! if (ieee154e_vars.isSync==FALSE) { -! activity_synchronize_endOfFrame(capturedTime); -! } else { -! switch (ieee154e_vars.state) { -! case S_TXDATA: -! activity_ti5(capturedTime); -! break; -! case S_RXACK: -! activity_ti9(capturedTime); -! break; -! case S_RXDATA: -! activity_ri5(capturedTime); -! break; -! case S_TXACK: -! activity_ri9(capturedTime); -! break; -! default: -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_WRONG_STATE_IN_ENDOFFRAME, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! // abort -! endSlot(); -! break; -! } -! } -! ieee154e_dbg.num_endOfFrame++; -! } -! -! //======= misc -! -! /** -! \brief Trigger this module to print status information, over serial. -! -! debugPrint_* functions are used by the openserial module to continuously print -! status information about several modules in the OpenWSN stack. -! -! \returns TRUE if this function printed something, FALSE otherwise. -! */ -! bool debugPrint_asn(void) { -! asn_t output; -! output.byte4 = ieee154e_vars.asn.byte4; -! output.bytes2and3 = ieee154e_vars.asn.bytes2and3; -! output.bytes0and1 = ieee154e_vars.asn.bytes0and1; -! openserial_printStatus(STATUS_ASN,(uint8_t*)&output,sizeof(output)); -! return TRUE; -! } -! -! /** -! \brief Trigger this module to print status information, over serial. -! -! debugPrint_* functions are used by the openserial module to continuously print -! status information about several modules in the OpenWSN stack. -! -! \returns TRUE if this function printed something, FALSE otherwise. -! */ -! bool debugPrint_isSync(void) { -! uint8_t output=0; -! output = ieee154e_vars.isSync; -! openserial_printStatus(STATUS_ISSYNC,(uint8_t*)&output,sizeof(uint8_t)); -! return TRUE; -! } -! -! /** -! \brief Trigger this module to print status information, over serial. -! -! debugPrint_* functions are used by the openserial module to continuously print -! status information about several modules in the OpenWSN stack. -! -! \returns TRUE if this function printed something, FALSE otherwise. -! */ -! bool debugPrint_macStats(void) { -! // send current stats over serial -! ieee154e_stats.dutyCycle/=(float)SUPERFRAME_LENGTH; //avg on the all slots of a frame -! ieee154e_stats.dutyCycle/=STATUS_MAX;//because this is executed once every 10 times of debugprint -! ieee154e_stats.dutyCycle*=100.0;//as is a percentage -! openserial_printStatus(STATUS_MACSTATS,(uint8_t*)&ieee154e_stats,sizeof(ieee154e_stats_t)); -! ieee154e_stats.dutyCycle=0; //reset for the next superframe. -! -! return TRUE; -! } -! -! //=========================== private ========================================= -! -! //======= SYNCHRONIZING -! -! port_INLINE void activity_synchronize_newSlot(void) { -! // I'm in the middle of receiving a packet -! if (ieee154e_vars.state==S_SYNCRX) { -! return; -! } -! -! // if this is the first time I call this function while not synchronized, -! // switch on the radio in Rx mode -! if (ieee154e_vars.state!=S_SYNCLISTEN) { -! // change state -! changeState(S_SYNCLISTEN); -! -! // turn off the radio (in case it wasn't yet) -! radio_rfOff(); -! -! // configure the radio to listen to the default synchronizing channel -! radio_setFrequency(SYNCHRONIZING_CHANNEL); -! -! // update record of current channel -! ieee154e_vars.freq = SYNCHRONIZING_CHANNEL; -! -! // switch on the radio in Rx mode. -! radio_rxEnable(); -! ieee154e_vars.radioOnInit=radio_getTimerValue(); -! ieee154e_vars.radioOnThisSlot=TRUE; -! radio_rxNow(); -! } -! -! // increment ASN (used only to schedule serial activity) -! incrementAsnOffset(); -! -! // to be able to receive and transmist serial even when not synchronized -! // take turns every 8 slots sending and receiving -! if ((ieee154e_vars.asn.bytes0and1&0x000f)==0x0000) { -! openserial_stop(); -! openserial_startOutput(); -! } else if ((ieee154e_vars.asn.bytes0and1&0x000f)==0x0008) { -! openserial_stop(); -! openserial_startInput(); -! } -! } -! -! port_INLINE void activity_synchronize_startOfFrame(PORT_RADIOTIMER_WIDTH capturedTime) { -! -! // don't care about packet if I'm not listening -! if (ieee154e_vars.state!=S_SYNCLISTEN) { -! return; -! } -! -! // change state -! changeState(S_SYNCRX); -! -! // stop the serial -! openserial_stop(); -! -! // record the captured time -! ieee154e_vars.lastCapturedTime = capturedTime; -! -! // record the captured time (for sync) -! ieee154e_vars.syncCapturedTime = capturedTime; -! } -! -! port_INLINE void activity_synchronize_endOfFrame(PORT_RADIOTIMER_WIDTH capturedTime) { -! ieee802154_header_iht ieee802514_header; -! uint16_t lenIE=0;//len of IEs being received if any. -! -! // check state -! if (ieee154e_vars.state!=S_SYNCRX) { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_WRONG_STATE_IN_ENDFRAME_SYNC, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)0); -! // abort -! endSlot(); -! } -! -! // change state -! changeState(S_SYNCPROC); -! -! // get a buffer to put the (received) frame in -! ieee154e_vars.dataReceived = openqueue_getFreePacketBuffer(COMPONENT_IEEE802154E); -! if (ieee154e_vars.dataReceived==NULL) { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! // abort -! endSlot(); -! return; -! } -! -! // declare ownership over that packet -! ieee154e_vars.dataReceived->creator = COMPONENT_IEEE802154E; -! ieee154e_vars.dataReceived->owner = COMPONENT_IEEE802154E; -! -! /* -! The do-while loop that follows is a little parsing trick. -! Because it contains a while(0) condition, it gets executed only once. -! The behavior is: -! - if a break occurs inside the do{} body, the error code below the loop -! gets executed. This indicates something is wrong with the packet being -! parsed. -! - if a return occurs inside the do{} body, the error code below the loop -! does not get executed. This indicates the received packet is correct. -! */ -! do { // this "loop" is only executed once -! -! // retrieve the received data frame from the radio's Rx buffer -! ieee154e_vars.dataReceived->payload = &(ieee154e_vars.dataReceived->packet[FIRST_FRAME_BYTE]); -! radio_getReceivedFrame( ieee154e_vars.dataReceived->payload, -! &ieee154e_vars.dataReceived->length, -! sizeof(ieee154e_vars.dataReceived->packet), -! &ieee154e_vars.dataReceived->l1_rssi, -! &ieee154e_vars.dataReceived->l1_lqi, -! &ieee154e_vars.dataReceived->l1_crc); -! -! // break if packet too short -! if (ieee154e_vars.dataReceived->length<LENGTH_CRC || ieee154e_vars.dataReceived->length>LENGTH_IEEE154_MAX) { -! // break from the do-while loop and execute abort code below -! openserial_printError(COMPONENT_IEEE802154E,ERR_INVALIDPACKETFROMRADIO, -! (errorparameter_t)0, -! ieee154e_vars.dataReceived->length); -! break; -! } -! -! // toss CRC (2 last bytes) -! packetfunctions_tossFooter( ieee154e_vars.dataReceived, LENGTH_CRC); -! -! // break if invalid CRC -! if (ieee154e_vars.dataReceived->l1_crc==FALSE) { -! // break from the do-while loop and execute abort code below -! break; -! } -! -! // parse the IEEE802.15.4 header (synchronize, end of frame) -! ieee802154_retrieveHeader(ieee154e_vars.dataReceived,&ieee802514_header); -! -! // break if invalid IEEE802.15.4 header -! if (ieee802514_header.valid==FALSE) { -! // break from the do-while loop and execute the clean-up code below -! break; -! } -! -! // store header details in packet buffer -! ieee154e_vars.dataReceived->l2_frameType = ieee802514_header.frameType; -! ieee154e_vars.dataReceived->l2_dsn = ieee802514_header.dsn; -! memcpy(&(ieee154e_vars.dataReceived->l2_nextORpreviousHop),&(ieee802514_header.src),sizeof(open_addr_t)); -! -! // toss the IEEE802.15.4 header -- this does not include IEs as they are processed -! // next. -! packetfunctions_tossHeader(ieee154e_vars.dataReceived,ieee802514_header.headerLength); -! -! // handle IEs -- xv poipoi -! // break if invalid ADV -! if ((ieee802514_header.valid==TRUE && -! ieee802514_header.ieListPresent==TRUE && -! ieee802514_header.frameType==IEEE154_TYPE_BEACON && -! packetfunctions_sameAddress(&ieee802514_header.panid,idmanager_getMyID(ADDR_PANID)) && -! ieee154e_processIEs(ieee154e_vars.dataReceived,&lenIE))==FALSE) { -! // break from the do-while loop and execute the clean-up code below -! break; -! } -! -! // turn off the radio -! radio_rfOff(); -! //compute radio duty cycle -! ieee154e_vars.radioOnTics+=(radio_getTimerValue()-ieee154e_vars.radioOnInit); -! -! // toss the IEs including Synch -! packetfunctions_tossHeader(ieee154e_vars.dataReceived,lenIE); -! -! // synchronize (for the first time) to the sender's ADV -! synchronizePacket(ieee154e_vars.syncCapturedTime); -! -! // declare synchronized -! changeIsSync(TRUE); -! -! // log the info -! openserial_printInfo(COMPONENT_IEEE802154E,ERR_SYNCHRONIZED, -! (errorparameter_t)ieee154e_vars.slotOffset, -! (errorparameter_t)0); -! -! // send received ADV up the stack so RES can update statistics (synchronizing) -! notif_receive(ieee154e_vars.dataReceived); -! -! // clear local variable -! ieee154e_vars.dataReceived = NULL; -! -! // official end of synchronization -! endSlot(); -! -! // everything went well, return here not to execute the error code below -! return; -! -! } while (0); -! -! // free the (invalid) received data buffer so RAM memory can be recycled -! openqueue_freePacketBuffer(ieee154e_vars.dataReceived); -! -! // clear local variable -! ieee154e_vars.dataReceived = NULL; -! -! // return to listening state -! changeState(S_SYNCLISTEN); -! } -! -! //xv poipoi - IE Handling -! port_INLINE bool ieee154e_processIEs(OpenQueueEntry_t* pkt, uint16_t * lenIE) -! { -! uint8_t ptr,byte0,byte1; -! uint8_t temp_8b,gr_elem_id,subid; -! uint16_t temp_16b,len,sublen; -! volatile PORT_SIGNED_INT_WIDTH timeCorrection; -! -! ptr=0; -! //candidate IE header if type ==0 header IE if type==1 payload IE -! temp_8b = *((uint8_t*)(pkt->payload)+ptr); -! ptr++; -! temp_16b = temp_8b + ((*((uint8_t*)(pkt->payload)+ptr))<< 8); -! ptr++; -! *lenIE = ptr; -! if ((temp_16b & IEEE802154E_DESC_TYPE_PAYLOAD_IE) == IEEE802154E_DESC_TYPE_PAYLOAD_IE){ -! //payload IE - last bit is 1 -! len=(temp_16b & IEEE802154E_DESC_LEN_PAYLOAD_IE_MASK)>>IEEE802154E_DESC_LEN_PAYLOAD_IE_SHIFT; -! gr_elem_id= (temp_16b & IEEE802154E_DESC_GROUPID_PAYLOAD_IE_MASK)>>IEEE802154E_DESC_GROUPID_PAYLOAD_IE_SHIFT; -! }else { -! //header IE - last bit is 0 -! len=(temp_16b & IEEE802154E_DESC_LEN_HEADER_IE_MASK)>>IEEE802154E_DESC_LEN_HEADER_IE_SHIFT; -! gr_elem_id = (temp_16b & IEEE802154E_DESC_ELEMENTID_HEADER_IE_MASK)>>IEEE802154E_DESC_ELEMENTID_HEADER_IE_SHIFT; -! } -! -! *lenIE += len; -! //now determine sub elements if any -! switch(gr_elem_id){ -! //this is the only groupID that we parse. See page 82. -! case IEEE802154E_MLME_IE_GROUPID: -! //IE content can be any of the sub-IEs. Parse and see which -! do{ -! //read sub IE header -! temp_8b = *((uint8_t*)(pkt->payload)+ptr); -! ptr = ptr + 1; -! temp_16b = temp_8b +(*((uint8_t*)(pkt->payload)+ptr) << 8); -! ptr = ptr + 1; -! len = len - 2; //remove header fields len -! if ((temp_16b & IEEE802154E_DESC_TYPE_LONG) == IEEE802154E_DESC_TYPE_LONG){ -! //long sub-IE - last bit is 1 -! sublen=(temp_16b & IEEE802154E_DESC_LEN_LONG_MLME_IE_MASK)>>IEEE802154E_DESC_LEN_LONG_MLME_IE_SHIFT; -! subid= (temp_16b & IEEE802154E_DESC_SUBID_LONG_MLME_IE_MASK)>>IEEE802154E_DESC_SUBID_LONG_MLME_IE_SHIFT; -! }else { -! //short IE - last bit is 0 -! sublen =(temp_16b & IEEE802154E_DESC_LEN_SHORT_MLME_IE_MASK)>>IEEE802154E_DESC_LEN_SHORT_MLME_IE_SHIFT; -! subid = (temp_16b & IEEE802154E_DESC_SUBID_SHORT_MLME_IE_MASK)>>IEEE802154E_DESC_SUBID_SHORT_MLME_IE_SHIFT; -! } -! switch(subid){ -! case IEEE802154E_MLME_SYNC_IE_SUBID: -! //content is ASN and Join Priority -! if (idmanager_getIsDAGroot()==FALSE) { -! asnStoreFromAdv((uint8_t*)(pkt->payload)+ptr); -! ptr = ptr + 5; //add ASN len -! joinPriorityStoreFromAdv(*((uint8_t*)(pkt->payload)+ptr)); -! ptr = ptr + 1; -! } -! break; -! case IEEE802154E_MLME_SLOTFRAME_LINK_IE_SUBID: -! ieee154e_processSlotframeLinkIE(pkt,&ptr); -! break; -! case IEEE802154E_MLME_TIMESLOT_IE_SUBID: -! //TODO -! break; -! default: -! return FALSE; -! break; -! } -! len = len - sublen; -! } while(len>0); -! -! break; -! //the rest are elementID -! case IEEE802154E_ACK_NACK_TIMECORRECTION_ELEMENTID: -! //IE content is time correction -- apply the time correction on ack received. -! if (idmanager_getIsDAGroot()==FALSE && -! neighbors_isPreferredParent(&(pkt->l2_nextORpreviousHop)) ) { -! byte0 = *((uint8_t*)(pkt->payload)+ptr); -! ptr++; -! byte1 = *((uint8_t*)(pkt->payload)+ptr); -! ptr++; -! -! timeCorrection = (PORT_SIGNED_INT_WIDTH)((PORT_RADIOTIMER_WIDTH)byte1<<8 | (PORT_RADIOTIMER_WIDTH)byte0); -! timeCorrection /= US_PER_TICK; -! timeCorrection = -timeCorrection; -! synchronizeAck(timeCorrection); -! } -! break; -! default: -! *lenIE = 0;//no header or not recognized. -! return FALSE; -! } -! if (*lenIE>127) { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_HEADER_TOO_LONG, -! (errorparameter_t)*lenIE, -! (errorparameter_t)1); -! } -! return TRUE; -! } -! -! port_INLINE void ieee154e_processSlotframeLinkIE(OpenQueueEntry_t* pkt,uint8_t * ptr){ -! uint8_t numSlotFrames,i,j,localptr; -! slotframelink_IE_t sfInfo; -! linkInfo_subIE_t linkInfo; -! localptr=*ptr; -! // number of slot frames 1B -! numSlotFrames = *((uint8_t*)(pkt->payload)+localptr); -! localptr++; -! // for each slotframe -! i=0; -! while(i < numSlotFrames){ -! //1-slotftramehandle 1B -! sfInfo.slotframehandle=*((uint8_t*)(pkt->payload)+localptr); -! localptr++; -! //2-slotframe size 2B -! sfInfo.slotframesize = *((uint8_t*)(pkt->payload)+localptr); -! localptr++; -! sfInfo.slotframesize |= (*((uint8_t*)(pkt->payload)+localptr))<<8; -! localptr++;; -! //3-number of links 1B -! sfInfo.numlinks= *((uint8_t*)(pkt->payload)+localptr); -! localptr++; -! -! for (j=0;j<sfInfo.numlinks;j++){ -! //for each link 5Bytes -! //TimeSlot 2B -! linkInfo.tsNum = *((uint8_t*)(pkt->payload)+localptr); -! localptr++; -! linkInfo.tsNum |= (*((uint8_t*)(pkt->payload)+localptr))<<8; -! localptr++; -! //Ch.Offset 2B -! linkInfo.choffset = *((uint8_t*)(pkt->payload)+localptr); -! localptr++; -! linkInfo.choffset |= (*((uint8_t*)(pkt->payload)+localptr))<<8; -! localptr++; -! //LinkOption bitmap 1B -! linkInfo.linkoptions = *((uint8_t*)(pkt->payload)+localptr); -! localptr++; -! //xv poipoi -! //TODO - inform schedule of that link so it can update if needed. -! } -! i++; -! } -! *ptr=localptr; -! } -! -! //======= TX -! -! port_INLINE void activity_ti1ORri1(void) { -! cellType_t cellType; -! open_addr_t neighbor; -! uint8_t i; -! synch_IE_t syn_IE; -! -! // increment ASN (do this first so debug pins are in sync) -! incrementAsnOffset(); -! -! // wiggle debug pins -! debugpins_slot_toggle(); -! if (ieee154e_vars.slotOffset==0) { -! debugpins_frame_toggle(); -! } -! -! // desynchronize if needed -! if (idmanager_getIsDAGroot()==FALSE) { -! ieee154e_vars.deSyncTimeout--; -! if (ieee154e_vars.deSyncTimeout==0) { -! // declare myself desynchronized -! changeIsSync(FALSE); -! -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_DESYNCHRONIZED, -! (errorparameter_t)ieee154e_vars.slotOffset, -! (errorparameter_t)0); -! -! // update the statistics -! ieee154e_stats.numDeSync++; -! -! // abort -! endSlot(); -! return; -! } -! } -! -! // if the previous slot took too long, we will not be in the right state -! if (ieee154e_vars.state!=S_SLEEP) { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_WRONG_STATE_IN_STARTSLOT, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! // abort -! endSlot(); -! return; -! } -! -! if (ieee154e_vars.slotOffset==ieee154e_vars.nextActiveSlotOffset) { -! // this is the next active slot -! -! // advance the schedule -! schedule_advanceSlot(); -! -! // find the next one -! ieee154e_vars.nextActiveSlotOffset = schedule_getNextActiveSlotOffset(); -! } else { -! // this is NOT the next active slot, abort -! // stop using serial -! openserial_stop(); -! // abort the slot -! endSlot(); -! //start outputing serial -! openserial_startOutput(); -! return; -! } -! -! // check the schedule to see what type of slot this is -! cellType = schedule_getType(); -! switch (cellType) { -! case CELLTYPE_ADV: -! // stop using serial -! openserial_stop(); -! // look for an ADV packet in the queue -! ieee154e_vars.dataToSend = openqueue_macGetAdvPacket(); -! if (ieee154e_vars.dataToSend==NULL) { // I will be listening for an ADV -! // change state -! changeState(S_RXDATAOFFSET); -! // arm rt1 -! radiotimer_schedule(DURATION_rt1); -! } else { // I will be sending an ADV -! // change state -! changeState(S_TXDATAOFFSET); -! // change owner -! ieee154e_vars.dataToSend->owner = COMPONENT_IEEE802154E; -! //copy synch IE -- should be Little endian??? -! // fill in the ASN field of the ADV -! ieee154e_getAsn(syn_IE.asn); -! syn_IE.join_priority = neighbors_getMyDAGrank()/(2*MINHOPRANKINCREASE); //poipoi -- use dagrank(rank) -! -! memcpy(ieee154e_vars.dataToSend->l2_ASNpayload,&syn_IE,sizeof(synch_IE_t)); -! -! // record that I attempt to transmit this packet -! ieee154e_vars.dataToSend->l2_numTxAttempts++; -! // arm tt1 -! radiotimer_schedule(DURATION_tt1); -! } -! break; -! case CELLTYPE_TXRX: -! case CELLTYPE_TX: -! // stop using serial -! openserial_stop(); -! // check whether we can send -! if (schedule_getOkToSend()) { -! schedule_getNeighbor(&neighbor); -! ieee154e_vars.dataToSend = openqueue_macGetDataPacket(&neighbor); -! } else { -! ieee154e_vars.dataToSend = NULL; -! } -! if (ieee154e_vars.dataToSend!=NULL) { // I have a packet to send -! // change state -! changeState(S_TXDATAOFFSET); -! // change owner -! ieee154e_vars.dataToSend->owner = COMPONENT_IEEE802154E; -! // record that I attempt to transmit this packet -! ieee154e_vars.dataToSend->l2_numTxAttempts++; -! // arm tt1 -! radiotimer_schedule(DURATION_tt1); -! } else if (cellType==CELLTYPE_TX){ -! // abort -! endSlot(); -! } -! if (cellType==CELLTYPE_TX || -! (cellType==CELLTYPE_TXRX && ieee154e_vars.dataToSend!=NULL)) { -! break; -! } -! case CELLTYPE_RX: -! // stop using serial -! openserial_stop(); -! // change state -! changeState(S_RXDATAOFFSET); -! // arm rt1 -! radiotimer_schedule(DURATION_rt1); -! break; -! case CELLTYPE_SERIALRX: -! // stop using serial -! openserial_stop(); -! // abort the slot -! endSlot(); -! //start inputting serial data -! openserial_startInput(); -! //this is to emulate a set of serial input slots without having the slotted structure. -! -! radio_setTimerPeriod(TsSlotDuration*(NUMSERIALRX)); -! -! //increase ASN by NUMSERIALRX-1 slots as at this slot is already incremented by 1 -! for (i=0;i<NUMSERIALRX-1;i++){ -! incrementAsnOffset(); -! } -! break; -! case CELLTYPE_MORESERIALRX: -! // do nothing (not even endSlot()) -! break; -! default: -! // stop using serial -! openserial_stop(); -! // log the error -! openserial_printCritical(COMPONENT_IEEE802154E,ERR_WRONG_CELLTYPE, -! (errorparameter_t)cellType, -! (errorparameter_t)ieee154e_vars.slotOffset); -! // abort -! endSlot(); -! break; -! } -! } -! -! port_INLINE void activity_ti2(void) { -! // change state -! changeState(S_TXDATAPREPARE); -! -! // calculate the frequency to transmit on -! ieee154e_vars.freq = calculateFrequency(schedule_getChannelOffset()); -! -! // configure the radio for that frequency -! radio_setFrequency(ieee154e_vars.freq); -! -! // load the packet in the radio's Tx buffer -! radio_loadPacket(ieee154e_vars.dataToSend->payload, -! ieee154e_vars.dataToSend->length); -! -! // enable the radio in Tx mode. This does not send the packet. -! radio_txEnable(); -! ieee154e_vars.radioOnInit=radio_getTimerValue(); -! ieee154e_vars.radioOnThisSlot=TRUE; -! // arm tt2 -! radiotimer_schedule(DURATION_tt2); -! -! // change state -! changeState(S_TXDATAREADY); -! } -! -! port_INLINE void activity_tie1(void) { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_MAXTXDATAPREPARE_OVERFLOW, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ti3(void) { -! // change state -! changeState(S_TXDATADELAY); -! -! // arm tt3 -! radiotimer_schedule(DURATION_tt3); -! -! // give the 'go' to transmit -! radio_txNow(); -! } -! -! port_INLINE void activity_tie2(void) { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_WDRADIO_OVERFLOWS, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! -! // abort -! endSlot(); -! } -! -! //start of frame interrupt -! port_INLINE void activity_ti4(PORT_RADIOTIMER_WIDTH capturedTime) { -! // change state -! changeState(S_TXDATA); -! -! // cancel tt3 -! radiotimer_cancel(); -! -! // record the captured time -! ieee154e_vars.lastCapturedTime = capturedTime; -! -! // arm tt4 -! radiotimer_schedule(DURATION_tt4); -! } -! -! port_INLINE void activity_tie3(void) { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_WDDATADURATION_OVERFLOWS, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ti5(PORT_RADIOTIMER_WIDTH capturedTime) { -! bool listenForAck; -! -! // change state -! changeState(S_RXACKOFFSET); -! -! // cancel tt4 -! radiotimer_cancel(); -! -! // turn off the radio -! radio_rfOff(); -! ieee154e_vars.radioOnTics+=(radio_getTimerValue()-ieee154e_vars.radioOnInit); -! -! // record the captured time -! ieee154e_vars.lastCapturedTime = capturedTime; -! -! // decides whether to listen for an ACK -! if (packetfunctions_isBroadcastMulticast(&ieee154e_vars.dataToSend->l2_nextORpreviousHop)==TRUE) { -! listenForAck = FALSE; -! } else { -! listenForAck = TRUE; -! } -! -! if (listenForAck==TRUE) { -! // arm tt5 -! radiotimer_schedule(DURATION_tt5); -! } else { -! // indicate succesful Tx to schedule to keep statistics -! schedule_indicateTx(&ieee154e_vars.asn,TRUE); -! // indicate to upper later the packet was sent successfully -! notif_sendDone(ieee154e_vars.dataToSend,E_SUCCESS); -! // reset local variable -! ieee154e_vars.dataToSend = NULL; -! // abort -! endSlot(); -! } -! } -! -! port_INLINE void activity_ti6(void) { -! // change state -! changeState(S_RXACKPREPARE); -! -! // calculate the frequency to transmit on -! ieee154e_vars.freq = calculateFrequency(schedule_getChannelOffset()); -! -! // configure the radio for that frequency -! radio_setFrequency(ieee154e_vars.freq); -! -! // enable the radio in Rx mode. The radio is not actively listening yet. -! radio_rxEnable(); -! //caputre init of radio for duty cycle calculation -! ieee154e_vars.radioOnInit=radio_getTimerValue(); -! ieee154e_vars.radioOnThisSlot=TRUE; -! // arm tt6 -! radiotimer_schedule(DURATION_tt6); -! -! // change state -! changeState(S_RXACKREADY); -! } -! -! port_INLINE void activity_tie4(void) { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_MAXRXACKPREPARE_OVERFLOWS, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ti7(void) { -! // change state -! changeState(S_RXACKLISTEN); -! -! // start listening -! radio_rxNow(); -! -! // arm tt7 -! radiotimer_schedule(DURATION_tt7); -! } -! -! port_INLINE void activity_tie5(void) { -! // indicate transmit failed to schedule to keep stats -! schedule_indicateTx(&ieee154e_vars.asn,FALSE); -! -! // decrement transmits left counter -! ieee154e_vars.dataToSend->l2_retriesLeft--; -! -! if (ieee154e_vars.dataToSend->l2_retriesLeft==0) { -! // indicate tx fail if no more retries left -! notif_sendDone(ieee154e_vars.dataToSend,E_FAIL); -! } else { -! // return packet to the virtual COMPONENT_RES_TO_IEEE802154E component -! ieee154e_vars.dataToSend->owner = COMPONENT_RES_TO_IEEE802154E; -! } -! -! // reset local variable -! ieee154e_vars.dataToSend = NULL; -! -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ti8(PORT_RADIOTIMER_WIDTH capturedTime) { -! // change state -! changeState(S_RXACK); -! -! // cancel tt7 -! radiotimer_cancel(); -! -! // record the captured time -! ieee154e_vars.lastCapturedTime = capturedTime; -! -! // arm tt8 -! radiotimer_schedule(DURATION_tt8); -! } -! -! port_INLINE void activity_tie6(void) { -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ti9(PORT_RADIOTIMER_WIDTH capturedTime) { -! ieee802154_header_iht ieee802514_header; -! volatile PORT_SIGNED_INT_WIDTH timeCorrection; -! uint16_t lenIE; -! -! // change state -! changeState(S_TXPROC); -! -! // cancel tt8 -! radiotimer_cancel(); -! -! // turn off the radio -! radio_rfOff(); -! //compute tics radio on. -! ieee154e_vars.radioOnTics+=(radio_getTimerValue()-ieee154e_vars.radioOnInit); -! -! // record the captured time -! ieee154e_vars.lastCapturedTime = capturedTime; -! -! // get a buffer to put the (received) ACK in -! ieee154e_vars.ackReceived = openqueue_getFreePacketBuffer(COMPONENT_IEEE802154E); -! if (ieee154e_vars.ackReceived==NULL) { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! // abort -! endSlot(); -! return; -! } -! -! // declare ownership over that packet -! ieee154e_vars.ackReceived->creator = COMPONENT_IEEE802154E; -! ieee154e_vars.ackReceived->owner = COMPONENT_IEEE802154E; -! -! /* -! The do-while loop that follows is a little parsing trick. -! Because it contains a while(0) condition, it gets executed only once. -! Below the do-while loop is some code to cleans up the ack variable. -! Anywhere in the do-while loop, a break statement can be called to jump to -! the clean up code early. If the loop ends without a break, the received -! packet was correct. If it got aborted early (through a break), the packet -! was faulty. -! */ -! do { // this "loop" is only executed once -! -! // retrieve the received ack frame from the radio's Rx buffer -! ieee154e_vars.ackReceived->payload = &(ieee154e_vars.ackReceived->packet[FIRST_FRAME_BYTE]); -! radio_getReceivedFrame( ieee154e_vars.ackReceived->payload, -! &ieee154e_vars.ackReceived->length, -! sizeof(ieee154e_vars.ackReceived->packet), -! &ieee154e_vars.ackReceived->l1_rssi, -! &ieee154e_vars.ackReceived->l1_lqi, -! &ieee154e_vars.ackReceived->l1_crc); -! -! // break if wrong length -! if (ieee154e_vars.ackReceived->length<LENGTH_CRC || ieee154e_vars.ackReceived->length>LENGTH_IEEE154_MAX) { -! // break from the do-while loop and execute the clean-up code below -! openserial_printError(COMPONENT_IEEE802154E,ERR_INVALIDPACKETFROMRADIO, -! (errorparameter_t)1, -! ieee154e_vars.ackReceived->length); -! -! break; -! } -! -! // toss CRC (2 last bytes) -! packetfunctions_tossFooter( ieee154e_vars.ackReceived, LENGTH_CRC); -! -! // break if invalid CRC -! if (ieee154e_vars.ackReceived->l1_crc==FALSE) { -! // break from the do-while loop and execute the clean-up code below -! break; -! } -! -! // parse the IEEE802.15.4 header (RX ACK) -! ieee802154_retrieveHeader(ieee154e_vars.ackReceived,&ieee802514_header); -! -! // break if invalid IEEE802.15.4 header -! if (ieee802514_header.valid==FALSE) { -! // break from the do-while loop and execute the clean-up code below -! break; -! } -! -! // store header details in packet buffer -! ieee154e_vars.ackReceived->l2_frameType = ieee802514_header.frameType; -! ieee154e_vars.ackReceived->l2_dsn = ieee802514_header.dsn; -! memcpy(&(ieee154e_vars.ackReceived->l2_nextORpreviousHop),&(ieee802514_header.src),sizeof(open_addr_t)); -! -! // toss the IEEE802.15.4 header -! packetfunctions_tossHeader(ieee154e_vars.ackReceived,ieee802514_header.headerLength); -! -! // break if invalid ACK -! if (isValidAck(&ieee802514_header,ieee154e_vars.dataToSend)==FALSE) { -! // break from the do-while loop and execute the clean-up code below -! break; -! } -! //hanlde IEs --xv poipoi -! if (ieee802514_header.ieListPresent==FALSE){ -! break; //ack should contain IEs. -! } -! -! if (ieee154e_processIEs(ieee154e_vars.ackReceived,&lenIE)==FALSE){ -! //invalid IEs on ACK. -! break; -! } -! -! // toss the IEs including ACK -- xv poipoi -! packetfunctions_tossHeader(ieee154e_vars.ackReceived,lenIE); -! -! // inform schedule of successful transmission -! schedule_indicateTx(&ieee154e_vars.asn,TRUE); -! -! // inform upper layer -! notif_sendDone(ieee154e_vars.dataToSend,E_SUCCESS); -! ieee154e_vars.dataToSend = NULL; -! -! // in any case, execute the clean-up code below (processing of ACK done) -! } while (0); -! -! // free the received ack so corresponding RAM memory can be recycled -! openqueue_freePacketBuffer(ieee154e_vars.ackReceived); -! -! // clear local variable -! ieee154e_vars.ackReceived = NULL; -! -! // official end of Tx slot -! endSlot(); -! } -! -! //======= RX -! -! port_INLINE void activity_ri2(void) { -! // change state -! changeState(S_RXDATAPREPARE); -! -! // calculate the frequency to transmit on -! ieee154e_vars.freq = calculateFrequency(schedule_getChannelOffset()); -! -! // configure the radio for that frequency -! radio_setFrequency(ieee154e_vars.freq); -! -! // enable the radio in Rx mode. The radio does not actively listen yet. -! radio_rxEnable(); -! ieee154e_vars.radioOnInit=radio_getTimerValue(); -! ieee154e_vars.radioOnThisSlot=TRUE; -! -! // arm rt2 -! radiotimer_schedule(DURATION_rt2); -! -! // change state -! changeState(S_RXDATAREADY); -! } -! -! port_INLINE void activity_rie1(void) { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_MAXRXDATAPREPARE_OVERFLOWS, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ri3(void) { -! // change state -! changeState(S_RXDATALISTEN); -! -! // give the 'go' to receive -! radio_rxNow(); -! -! // arm rt3 -! radiotimer_schedule(DURATION_rt3); -! } -! -! port_INLINE void activity_rie2(void) { -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ri4(PORT_RADIOTIMER_WIDTH capturedTime) { -! -! // change state -! changeState(S_RXDATA); -! -! // cancel rt3 -! radiotimer_cancel(); -! -! // record the captured time -! ieee154e_vars.lastCapturedTime = capturedTime; -! -! // record the captured time to sync -! ieee154e_vars.syncCapturedTime = capturedTime; -! -! radiotimer_schedule(DURATION_rt4); -! } -! -! port_INLINE void activity_rie3(void) { -! -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_WDDATADURATION_OVERFLOWS, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ri5(PORT_RADIOTIMER_WIDTH capturedTime) { -! ieee802154_header_iht ieee802514_header; -! uint16_t lenIE=0; -! -! // change state -! changeState(S_TXACKOFFSET); -! -! // cancel rt4 -! radiotimer_cancel(); -! -! // turn off the radio -! //radio_rfOff(); -! ieee154e_vars.radioOnTics+=radio_getTimerValue()-ieee154e_vars.radioOnInit; -! // get a buffer to put the (received) data in -! ieee154e_vars.dataReceived = openqueue_getFreePacketBuffer(COMPONENT_IEEE802154E); -! if (ieee154e_vars.dataReceived==NULL) { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! // abort -! endSlot(); -! return; -! } -! -! // declare ownership over that packet -! ieee154e_vars.dataReceived->creator = COMPONENT_IEEE802154E; -! ieee154e_vars.dataReceived->owner = COMPONENT_IEEE802154E; -! -! /* -! The do-while loop that follows is a little parsing trick. -! Because it contains a while(0) condition, it gets executed only once. -! The behavior is: -! - if a break occurs inside the do{} body, the error code below the loop -! gets executed. This indicates something is wrong with the packet being -! parsed. -! - if a return occurs inside the do{} body, the error code below the loop -! does not get executed. This indicates the received packet is correct. -! */ -! do { // this "loop" is only executed once -! -! // retrieve the received data frame from the radio's Rx buffer -! ieee154e_vars.dataReceived->payload = &(ieee154e_vars.dataReceived->packet[FIRST_FRAME_BYTE]); -! radio_getReceivedFrame( ieee154e_vars.dataReceived->payload, -! &ieee154e_vars.dataReceived->length, -! sizeof(ieee154e_vars.dataReceived->packet), -! &ieee154e_vars.dataReceived->l1_rssi, -! &ieee154e_vars.dataReceived->l1_lqi, -! &ieee154e_vars.dataReceived->l1_crc); -! -! // break if wrong length -! if (ieee154e_vars.dataReceived->length<LENGTH_CRC || ieee154e_vars.dataReceived->length>LENGTH_IEEE154_MAX ) { -! // jump to the error code below this do-while loop -! openserial_printError(COMPONENT_IEEE802154E,ERR_INVALIDPACKETFROMRADIO, -! (errorparameter_t)2, -! ieee154e_vars.dataReceived->length); -! break; -! } -! -! // toss CRC (2 last bytes) -! packetfunctions_tossFooter( ieee154e_vars.dataReceived, LENGTH_CRC); -! -! // if CRC doesn't check, stop -! if (ieee154e_vars.dataReceived->l1_crc==FALSE) { -! // jump to the error code below this do-while loop -! break; -! } -! -! // parse the IEEE802.15.4 header (RX DATA) -! ieee802154_retrieveHeader(ieee154e_vars.dataReceived,&ieee802514_header); -! -! // break if invalid IEEE802.15.4 header -! if (ieee802514_header.valid==FALSE) { -! // break from the do-while loop and execute the clean-up code below -! break; -! } -! -! // store header details in packet buffer -! ieee154e_vars.dataReceived->l2_frameType = ieee802514_header.frameType; -! ieee154e_vars.dataReceived->l2_dsn = ieee802514_header.dsn; -! memcpy(&(ieee154e_vars.dataReceived->l2_nextORpreviousHop),&(ieee802514_header.src),sizeof(open_addr_t)); -! -! // toss the IEEE802.15.4 header -! packetfunctions_tossHeader(ieee154e_vars.dataReceived,ieee802514_header.headerLength); -! -! // handle IEs xv poipoi -! //reset join priority -! -! if ((ieee802514_header.valid==TRUE && -! ieee802514_header.ieListPresent==TRUE && -! packetfunctions_sameAddress(&ieee802514_header.panid,idmanager_getMyID(ADDR_PANID)) && -! ieee154e_processIEs(ieee154e_vars.dataReceived,&lenIE))==FALSE) { -! //log that the packet is not carrying IEs -! } -! -! // toss the IEs including Synch -! packetfunctions_tossHeader(ieee154e_vars.dataReceived,lenIE); -! -! // record the captured time -! ieee154e_vars.lastCapturedTime = capturedTime; -! -! // if I just received an invalid frame, stop -! if (isValidRxFrame(&ieee802514_header)==FALSE) { -! // jump to the error code below this do-while loop -! break; -! } -! -! // check if ack requested -! if (ieee802514_header.ackRequested==1) { -! // arm rt5 -! radiotimer_schedule(DURATION_rt5); -! } else { -! // synchronize to the received packet iif I'm not a DAGroot and this is my preferred parent -! if (idmanager_getIsDAGroot()==FALSE && neighbors_isPreferredParent(&(ieee154e_vars.dataReceived->l2_nextORpreviousHop))) { -! synchronizePacket(ieee154e_vars.syncCapturedTime); -! } -! // indicate reception to upper layer (no ACK asked) -! notif_receive(ieee154e_vars.dataReceived); -! // reset local variable -! ieee154e_vars.dataReceived = NULL; -! // abort -! endSlot(); -! } -! -! // everything went well, return here not to execute the error code below -! return; -! -! } while(0); -! -! // free the (invalid) received data so RAM memory can be recycled -! openqueue_freePacketBuffer(ieee154e_vars.dataReceived); -! -! // clear local variable -! ieee154e_vars.dataReceived = NULL; -! -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ri6(void) { -! PORT_SIGNED_INT_WIDTH timeCorrection; -! header_IE_descriptor_t header_desc; -! -! // change state -! changeState(S_TXACKPREPARE); -! -! // get a buffer to put the ack to send in -! ieee154e_vars.ackToSend = openqueue_getFreePacketBuffer(COMPONENT_IEEE802154E); -! if (ieee154e_vars.ackToSend==NULL) { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! // indicate we received a packet anyway (we don't want to loose any) -! notif_receive(ieee154e_vars.dataReceived); -! // free local variable -! ieee154e_vars.dataReceived = NULL; -! // abort -! endSlot(); -! return; -! } -! -! // declare ownership over that packet -! ieee154e_vars.ackToSend->creator = COMPONENT_IEEE802154E; -! ieee154e_vars.ackToSend->owner = COMPONENT_IEEE802154E; -! -! // calculate the time timeCorrection (this is the time when the packet arrive w.r.t the time it should be. -! timeCorrection = (PORT_SIGNED_INT_WIDTH)((PORT_SIGNED_INT_WIDTH)ieee154e_vars.syncCapturedTime-(PORT_SIGNED_INT_WIDTH)TsTxOffset); -! -! // add the payload to the ACK (i.e. the timeCorrection) -! packetfunctions_reserveHeaderSize(ieee154e_vars.ackToSend,sizeof(ack_timecorrection_IE_t)); -! timeCorrection = -timeCorrection; -! timeCorrection *= US_PER_TICK; -! ieee154e_vars.ackToSend->payload[0] = (uint8_t)((((PORT_RADIOTIMER_WIDTH)timeCorrection) ) & 0xff); -! ieee154e_vars.ackToSend->payload[1] = (uint8_t)((((PORT_RADIOTIMER_WIDTH)timeCorrection)>>8) & 0xff); -! -! // add header IE header -- xv poipoi -- pkt is filled in reverse order.. -! packetfunctions_reserveHeaderSize(ieee154e_vars.ackToSend,sizeof(header_IE_descriptor_t)); -! //create the header for ack IE -! header_desc.length_elementid_type=(sizeof(ack_timecorrection_IE_t)<< IEEE802154E_DESC_LEN_HEADER_IE_SHIFT)| -! (IEEE802154E_ACK_NACK_TIMECORRECTION_ELEMENTID << IEEE802154E_DESC_ELEMENTID_HEADER_IE_SHIFT)| -! IEEE802154E_DESC_TYPE_SHORT; -! memcpy(ieee154e_vars.ackToSend->payload,&header_desc,sizeof(header_IE_descriptor_t)); -! -! // prepend the IEEE802.15.4 header to the ACK -! ieee154e_vars.ackToSend->l2_frameType = IEEE154_TYPE_ACK; -! ieee154e_vars.ackToSend->l2_dsn = ieee154e_vars.dataReceived->l2_dsn; -! ieee802154_prependHeader(ieee154e_vars.ackToSend, -! ieee154e_vars.ackToSend->l2_frameType, -! IEEE154_IELIST_YES,//ie in ack -! IEEE154_FRAMEVERSION,//enhanced ack -! IEEE154_SEC_NO_SECURITY, -! ieee154e_vars.dataReceived->l2_dsn, -! &(ieee154e_vars.dataReceived->l2_nextORpreviousHop) -! ); -! -! // space for 2-byte CRC -! packetfunctions_reserveFooterSize(ieee154e_vars.ackToSend,2); -! -! // calculate the frequency to transmit on -! ieee154e_vars.freq = calculateFrequency(schedule_getChannelOffset()); -! -! // configure the radio for that frequency -! radio_setFrequency(ieee154e_vars.freq); -! -! // load the packet in the radio's Tx buffer -! radio_loadPacket(ieee154e_vars.ackToSend->payload, -! ieee154e_vars.ackToSend->length); -! -! // enable the radio in Tx mode. This does not send that packet. -! radio_txEnable(); -! ieee154e_vars.radioOnInit=radio_getTimerValue(); -! ieee154e_vars.radioOnThisSlot=TRUE; -! // arm rt6 -! radiotimer_schedule(DURATION_rt6); -! -! // change state -! changeState(S_TXACKREADY); -! } -! -! port_INLINE void activity_rie4(void) { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_MAXTXACKPREPARE_OVERFLOWS, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ri7(void) { -! // change state -! changeState(S_TXACKDELAY); -! -! // arm rt7 -! radiotimer_schedule(DURATION_rt7); -! -! // give the 'go' to transmit -! radio_txNow(); -! } -! -! port_INLINE void activity_rie5(void) { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_WDRADIOTX_OVERFLOWS, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ri8(PORT_RADIOTIMER_WIDTH capturedTime) { -! // change state -! changeState(S_TXACK); -! -! // cancel rt7 -! radiotimer_cancel(); -! -! // record the captured time -! ieee154e_vars.lastCapturedTime = capturedTime; -! -! // arm rt8 -! radiotimer_schedule(DURATION_rt8); -! } -! -! port_INLINE void activity_rie6(void) { -! // log the error -! openserial_printError(COMPONENT_IEEE802154E,ERR_WDACKDURATION_OVERFLOWS, -! (errorparameter_t)ieee154e_vars.state, -! (errorparameter_t)ieee154e_vars.slotOffset); -! -! // abort -! endSlot(); -! } -! -! port_INLINE void activity_ri9(PORT_RADIOTIMER_WIDTH capturedTime) { -! // change state -! changeState(S_RXPROC); -! -! // cancel rt8 -! radiotimer_cancel(); -! -! // record the captured time -! ieee154e_vars.lastCapturedTime = capturedTime; -! -! // free the ack we just sent so corresponding RAM memory can be recycled -! openqueue_freePacketBuffer(ieee154e_vars.ackToSend); -! -! // clear local variable -! ieee154e_vars.ackToSend = NULL; -! -! // synchronize to the received packet -! if (idmanager_getIsDAGroot()==FALSE && neighbors_isPreferredParent(&(ieee154e_vars.dataReceived->l2_nextORpreviousHop))) { -! synchronizePacket(ieee154e_vars.syncCapturedTime); -! } -! -! // inform upper layer of reception (after ACK sent) -! notif_receive(ieee154e_vars.dataReceived); -! -! // clear local variable -! ieee154e_vars.dataReceived = NULL; -! -! // official end of Rx slot -! endSlot(); -! } -! -! //======= frame validity check -! -! /** -! \brief Decides whether the packet I just received is valid received frame. -! -! A valid Rx frame satisfies the following constraints: -! - its IEEE802.15.4 header is well formatted -! - it's a DATA of BEACON frame (i.e. not ACK and not COMMAND) -! - it's sent on the same PANid as mine -! - it's for me (unicast or broadcast) -! -! \param[in] ieee802514_header IEEE802.15.4 header of the packet I just received -! -! \returns TRUE if packet is valid received frame, FALSE otherwise -! */ -! port_INLINE bool isValidRxFrame(ieee802154_header_iht* ieee802514_header) { -! return ieee802514_header->valid==TRUE && \ -! ( -! ieee802514_header->frameType==IEEE154_TYPE_DATA || -! ieee802514_header->frameType==IEEE154_TYPE_BEACON -! ) && \ -! packetfunctions_sameAddress(&ieee802514_header->panid,idmanager_getMyID(ADDR_PANID)) && \ -! ( -! idmanager_isMyAddress(&ieee802514_header->dest) || -! packetfunctions_isBroadcastMulticast(&ieee802514_header->dest) -! ); -! } -! -! /** -! \brief Decides whether the packet I just received is a valid ACK. -! -! A packet is a valid ACK if it satisfies the following conditions: -! - the IEEE802.15.4 header is valid -! - the frame type is 'ACK' -! - the sequence number in the ACK matches the sequence number of the packet sent -! - the ACK contains my PANid -! - the packet is unicast to me -! - the packet comes from the neighbor I sent the data to -! -! \param[in] ieee802514_header IEEE802.15.4 header of the packet I just received -! \param[in] packetSent points to the packet I just sent -! -! \returns TRUE if packet is a valid ACK, FALSE otherwise. -! */ -! port_INLINE bool isValidAck(ieee802154_header_iht* ieee802514_header, OpenQueueEntry_t* packetSent) { -! /* -! return ieee802514_header->valid==TRUE && \ -! ieee802514_header->frameType==IEEE154_TYPE_ACK && \ -! ieee802514_header->dsn==packetSent->l2_dsn && \ -! packetfunctions_sameAddress(&ieee802514_header->panid,idmanager_getMyID(ADDR_PANID)) && \ -! idmanager_isMyAddress(&ieee802514_header->dest) && \ -! packetfunctions_sameAddress(&ieee802514_header->src,&packetSent->l2_nextORpreviousHop); -! */ -! // poipoi don't check for seq num -! return ieee802514_header->valid==TRUE && \ -! ieee802514_header->frameType==IEEE154_TYPE_ACK && \ -! packetfunctions_sameAddress(&ieee802514_header->panid,idmanager_getMyID(ADDR_PANID)) && \ -! idmanager_isMyAddress(&ieee802514_header->dest) && \ -! packetfunctions_sameAddress(&ieee802514_header->src,&packetSent->l2_nextORpreviousHop); -! } -! -! //======= ASN handling -! -! port_INLINE void incrementAsnOffset(void) { -! // increment the asn -! ieee154e_vars.asn.bytes0and1++; -! if (ieee154e_vars.asn.bytes0and1==0) { -! ieee154e_vars.asn.bytes2and3++; -! if (ieee154e_vars.asn.bytes2and3==0) { -! ieee154e_vars.asn.byte4++; -! } -! } -! // increment the offsets -! ieee154e_vars.slotOffset = (ieee154e_vars.slotOffset+1)%schedule_getFrameLength(); -! ieee154e_vars.asnOffset = (ieee154e_vars.asnOffset+1)%16; -! } -! -! //from upper layer that want to send the ASN to compute timing or latency -! port_INLINE void ieee154e_getAsn(uint8_t* array) { -! array[0] = (ieee154e_vars.asn.bytes0and1 & 0xff); -! array[1] = (ieee154e_vars.asn.bytes0and1/256 & 0xff); -! array[2] = (ieee154e_vars.asn.bytes2and3 & 0xff); -! array[3] = (ieee154e_vars.asn.bytes2and3/256 & 0xff); -! array[4] = ieee154e_vars.asn.byte4; -! } -! -! port_INLINE void joinPriorityStoreFromAdv(uint8_t jp){ -! ieee154e_vars.dataReceived->l2_joinPriority = jp; -! ieee154e_vars.dataReceived->l2_joinPriorityPresent = TRUE; -! } -! -! -! port_INLINE void asnStoreFromAdv(uint8_t* asn) { -! -! // store the ASN -! ieee154e_vars.asn.bytes0and1 = asn[0]+ -! 256*asn[1]; -! ieee154e_vars.asn.bytes2and3 = asn[2]+ -! 256*asn[3]; -! ieee154e_vars.asn.byte4 = asn[4]; -! -! // determine the current slotOffset -! /* -! Note: this is a bit of a hack. Normally, slotOffset=ASN%slotlength. But since -! the ADV is exchanged in slot 0, we know that we're currently at slotOffset==0 -! */ -! ieee154e_vars.slotOffset = 0; -! schedule_syncSlotOffset(ieee154e_vars.slotOffset); -! ieee154e_vars.nextActiveSlotOffset = schedule_getNextActiveSlotOffset(); -! -! /* -! infer the asnOffset based on the fact that -! ieee154e_vars.freq = 11 + (asnOffset + channelOffset)%16 -! */ -! ieee154e_vars.asnOffset = ieee154e_vars.freq - 11 - schedule_getChannelOffset(); -! } -! -! //======= synchronization -! -! void synchronizePacket(PORT_RADIOTIMER_WIDTH timeReceived) { -! PORT_SIGNED_INT_WIDTH timeCorrection; -! PORT_RADIOTIMER_WIDTH newPeriod; -! PORT_RADIOTIMER_WIDTH currentValue; -! PORT_RADIOTIMER_WIDTH currentPeriod; -! // record the current timer value and period -! currentValue = radio_getTimerValue(); -! currentPeriod = radio_getTimerPeriod(); -! // calculate new period -! timeCorrection = (PORT_SIGNED_INT_WIDTH)((PORT_SIGNED_INT_WIDTH)timeReceived-(PORT_SIGNED_INT_WIDTH)TsTxOffset); -! -! newPeriod = TsSlotDuration; -! // detect whether I'm too close to the edge of the slot, in that case, -! // skip a slot and increase the temporary slot length to be 2 slots long -! if (currentValue<timeReceived || currentPeriod-currentValue<RESYNCHRONIZATIONGUARD) { -! newPeriod += TsSlotDuration; -! incrementAsnOffset(); -! } -! newPeriod = (PORT_RADIOTIMER_WIDTH)((PORT_SIGNED_INT_WIDTH)newPeriod+timeCorrection); -! // resynchronize by applying the new period -! radio_setTimerPeriod(newPeriod); -! // reset the de-synchronization timeout -! ieee154e_vars.deSyncTimeout = DESYNCTIMEOUT; -! // log a large timeCorrection -! if ( -! ieee154e_vars.isSync==TRUE && -! ( -! timeCorrection<-LIMITLARGETIMECORRECTION || -! timeCorrection> LIMITLARGETIMECORRECTION -! ) -! ) { -! openserial_printError(COMPONENT_IEEE802154E,ERR_LARGE_TIMECORRECTION, -! (errorparameter_t)timeCorrection, -! (errorparameter_t)0); -! } -! // update the stats -! ieee154e_stats.numSyncPkt++; -! updateStats(timeCorrection); -! } -! -! void synchronizeAck(PORT_SIGNED_INT_WIDTH timeCorrection) { -! PORT_RADIOTIMER_WIDTH newPeriod; -! PORT_RADIOTIMER_WIDTH currentPeriod; -! // calculate new period -! currentPeriod = radio_getTimerPeriod(); -! newPeriod = (PORT_RADIOTIMER_WIDTH)((PORT_SIGNED_INT_WIDTH)currentPeriod-timeCorrection); -! -! // resynchronize by applying the new period -! radio_setTimerPeriod(newPeriod); -! // reset the de-synchronization timeout -! ieee154e_vars.deSyncTimeout = DESYNCTIMEOUT; -! // log a large timeCorrection -! if ( -! ieee154e_vars.isSync==TRUE && -! ( -! timeCorrection<-LIMITLARGETIMECORRECTION || -! timeCorrection> LIMITLARGETIMECORRECTION -! ) -! ) { -! openserial_printError(COMPONENT_IEEE802154E,ERR_LARGE_TIMECORRECTION, -! (errorparameter_t)timeCorrection, -! (errorparameter_t)1); -! } -! // update the stats -! ieee154e_stats.numSyncAck++; -! updateStats(timeCorrection); -! } -! -! void changeIsSync(bool newIsSync) { -! ieee154e_vars.isSync = newIsSync; -! -! if (ieee154e_vars.isSync==TRUE) { -! leds_sync_on(); -! resetStats(); -! } else { -! leds_sync_off(); -! schedule_resetBackoff(); -! } -! } -! -! //======= notifying upper layer -! -! void notif_sendDone(OpenQueueEntry_t* packetSent, owerror_t error) { -! // record the outcome of the trasmission attempt -! packetSent->l2_sendDoneError = error; -! // record the current ASN -! memcpy(&packetSent->l2_asn,&ieee154e_vars.asn,sizeof(asn_t)); -! // associate this packet with the virtual component -! // COMPONENT_IEEE802154E_TO_RES so RES can knows it's for it -! packetSent->owner = COMPONENT_IEEE802154E_TO_RES; -! // post RES's sendDone task -! scheduler_push_task(task_resNotifSendDone,TASKPRIO_RESNOTIF_TXDONE); -! /*thread_create(openwsn_ieee802154e_send_stack, KERNEL_CONF_STACKSIZE_MAIN, -! PRIORITY_OPENWSN_IEEE802154E, CREATE_STACKTEST, -! task_resNotifSendDone, "task resNotifSendDone");*/ -! // wake up the scheduler -! SCHEDULER_WAKEUP(); -! } -! -! void notif_receive(OpenQueueEntry_t* packetReceived) { -! // record the current ASN -! memcpy(&packetReceived->l2_asn, &ieee154e_vars.asn, sizeof(asn_t)); -! // indicate reception to the schedule, to keep statistics -! schedule_indicateRx(&packetReceived->l2_asn); -! // associate this packet with the virtual component -! // COMPONENT_IEEE802154E_TO_RES so RES can knows it's for it -! packetReceived->owner = COMPONENT_IEEE802154E_TO_RES; -! -! // post RES's Receive task -! scheduler_push_task(task_resNotifReceive,TASKPRIO_RESNOTIF_RX); -! /*thread_create(openwsn_ieee802154e_rec_stack, KERNEL_CONF_STACKSIZE_MAIN, -! PRIORITY_OPENWSN_IEEE802154E, CREATE_STACKTEST, -! task_resNotifSendDone, "task resNotifSendDone");*/ -! // wake up the scheduler -! SCHEDULER_WAKEUP(); -! } -! -! //======= stats -! -! port_INLINE void resetStats(void) { -! ieee154e_stats.numSyncPkt = 0; -! ieee154e_stats.numSyncAck = 0; -! ieee154e_stats.minCorrection = 127; -! ieee154e_stats.maxCorrection = -127; -! ieee154e_stats.dutyCycle = 0; -! // do not reset the number of de-synchronizations -! } -! -! void updateStats(PORT_SIGNED_INT_WIDTH timeCorrection) { -! // update minCorrection -! if (timeCorrection<ieee154e_stats.minCorrection) { -! ieee154e_stats.minCorrection = timeCorrection; -! } -! // update maxConnection -! if(timeCorrection>ieee154e_stats.maxCorrection) { -! ieee154e_stats.maxCorrection = timeCorrection; -! } -! } -! -! //======= misc -! -! /** -! \brief Calculates the frequency channel to transmit on, based on the -! absolute slot number and the channel offset of the requested slot. -! -! During normal operation, the frequency used is a function of the -! channelOffset indicating in the schedule, and of the ASN of the -! slot. This ensures channel hopping, consecutive packets sent in the same slot -! in the schedule are done on a difference frequency channel. -! -! During development, you can force single channel operation by having this -! function return a constant channel number (between 11 and 26). This allows you -! to use a single-channel sniffer; but you can not schedule two links on two -! different channel offsets in the same slot. -! -! \param[in] channelOffset channel offset for the current slot -! -! \returns The calculated frequency channel, an integer between 11 and 26. -! */ -! port_INLINE uint8_t calculateFrequency(uint8_t channelOffset) { -! // comment the following line out to disable channel hopping -! return SYNCHRONIZING_CHANNEL; // single channel -! //return 11+(ieee154e_vars.asnOffset+channelOffset)%16; //channel hopping -! } -! -! /** -! \brief Changes the state of the IEEE802.15.4e FSM. -! -! Besides simply updating the state global variable, -! this function toggles the FSM debug pin. -! -! \param[in] newstate The state the IEEE802.15.4e FSM is now in. -! */ -! void changeState(ieee154e_state_t newstate) { -! // update the state -! ieee154e_vars.state = newstate; -! // wiggle the FSM debug pin -! switch (ieee154e_vars.state) { -! case S_SYNCLISTEN: -! case S_TXDATAOFFSET: -! debugpins_fsm_set(); -! break; -! case S_SLEEP: -! case S_RXDATAOFFSET: -! debugpins_fsm_clr(); -! break; -! case S_SYNCRX: -! case S_SYNCPROC: -! case S_TXDATAPREPARE: -! case S_TXDATAREADY: -! case S_TXDATADELAY: -! case S_TXDATA: -! case S_RXACKOFFSET: -! case S_RXACKPREPARE: -! case S_RXACKREADY: -! case S_RXACKLISTEN: -! case S_RXACK: -! case S_TXPROC: -! case S_RXDATAPREPARE: -! case S_RXDATAREADY: -! case S_RXDATALISTEN: -! case S_RXDATA: -! case S_TXACKOFFSET: -! case S_TXACKPREPARE: -! case S_TXACKREADY: -! case S_TXACKDELAY: -! case S_TXACK: -! case S_RXPROC: -! debugpins_fsm_toggle(); -! break; -! } -! } -! -! /** -! \brief Housekeeping tasks to do at the end of each slot. -! -! This functions is called once in each slot, when there is nothing more -! to do. This might be when an error occured, or when everything went well. -! This function resets the state of the FSM so it is ready for the next slot. -! -! Note that by the time this function is called, any received packet should already -! have been sent to the upper layer. Similarly, in a Tx slot, the sendDone -! function should already have been done. If this is not the case, this function -! will do that for you, but assume that something went wrong. -! */ -! void endSlot(void) { -! -! float aux; //duty cycle helper. -! // turn off the radio -! radio_rfOff(); -! // compute the duty cycle if radio has been turned on -! if (ieee154e_vars.radioOnThisSlot==TRUE){ -! ieee154e_vars.radioOnTics+=(radio_getTimerValue()-ieee154e_vars.radioOnInit); -! } -! // clear any pending timer -! radiotimer_cancel(); -! -! // reset capturedTimes -! ieee154e_vars.lastCapturedTime = 0; -! ieee154e_vars.syncCapturedTime = 0; -! -! //instant duty cycle.. average is computed at debugprint_macstats. -! aux=(float)ieee154e_vars.radioOnTics/(float)radio_getTimerPeriod(); -! ieee154e_stats.dutyCycle+=aux;//accumulate and avg will be done on serial print -! //clear vars for duty cycle on this slot -! ieee154e_vars.radioOnTics=0; -! ieee154e_vars.radioOnThisSlot=FALSE; -! -! // clean up dataToSend -! if (ieee154e_vars.dataToSend!=NULL) { -! // if everything went well, dataToSend was set to NULL in ti9 -! // getting here means transmit failed -! -! // indicate Tx fail to schedule to update stats -! schedule_indicateTx(&ieee154e_vars.asn,FALSE); -! -! //decrement transmits left counter -! ieee154e_vars.dataToSend->l2_retriesLeft--; -! -! if (ieee154e_vars.dataToSend->l2_retriesLeft==0) { -! // indicate tx fail if no more retries left -! notif_sendDone(ieee154e_vars.dataToSend,E_FAIL); -! } else { -! // return packet to the virtual COMPONENT_RES_TO_IEEE802154E component -! ieee154e_vars.dataToSend->owner = COMPONENT_RES_TO_IEEE802154E; -! } -! -! // reset local variable -! ieee154e_vars.dataToSend = NULL; -! } -! -! // clean up dataReceived -! if (ieee154e_vars.dataReceived!=NULL) { -! // assume something went wrong. If everything went well, dataReceived -! // would have been set to NULL in ri9. -! // indicate "received packet" to upper layer since we don't want to loose packets -! notif_receive(ieee154e_vars.dataReceived); -! // reset local variable -! ieee154e_vars.dataReceived = NULL; -! } -! -! // clean up ackToSend -! if (ieee154e_vars.ackToSend!=NULL) { -! // free ackToSend so corresponding RAM memory can be recycled -! openqueue_freePacketBuffer(ieee154e_vars.ackToSend); -! // reset local variable -! ieee154e_vars.ackToSend = NULL; -! } -! -! // clean up ackReceived -! if (ieee154e_vars.ackReceived!=NULL) { -! // free ackReceived so corresponding RAM memory can be recycled -! openqueue_freePacketBuffer(ieee154e_vars.ackReceived); -! // reset local variable -! ieee154e_vars.ackReceived = NULL; -! } -! -! -! // change state -! changeState(S_SLEEP); -! } -! -! bool ieee154e_isSynch(void){ -! return ieee154e_vars.isSync; -! } -diff -crB openwsn/02a-MAClow/IEEE802154E.h ../../../sys/net/openwsn/02a-MAClow/IEEE802154E.h -*** openwsn/02a-MAClow/IEEE802154E.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/02a-MAClow/IEEE802154E.h Wed Jan 15 13:48:26 2014 -*************** -*** 1,154 **** -! #ifndef __IEEE802154E_H -! #define __IEEE802154E_H -! -! /** -! \addtogroup MAClow -! \{ -! \addtogroup IEEE802154E -! \{ -! */ -! -! #include "openwsn.h" -! #include "board_info.h" -! -! //=========================== debug define ==================================== -! -! //=========================== define ========================================== -! -! #define SYNCHRONIZING_CHANNEL 20 // channel the mote listens on to synchronize -! #define TXRETRIES 3 // number of MAC retries before declaring failed -! #define TX_POWER 31 // 1=-25dBm, 31=0dBm (max value) -! #define RESYNCHRONIZATIONGUARD 5 // in 32kHz ticks. min distance to the end of the slot to succesfully synchronize -! #define US_PER_TICK 30 // number of us per 32kHz clock tick -! #define KATIMEOUT 66 // in slots: @15ms per slot -> ~1 seconds -! #define DESYNCTIMEOUT 333 // in slots: @15ms per slot -> ~5 seconds -! #define LIMITLARGETIMECORRECTION 5 // threshold number of ticks to declare a timeCorrection "large" -! #define LENGTH_IEEE154_MAX 128 // max length of a valid radio packet -! -! /** -! When a packet is received, it is written inside the OpenQueueEntry_t->packet -! buffer, starting at the byte defined below. When a packet is relayed, it -! traverses the stack in which the MAC and IPHC headers are parsed and stripped -! off, then put on again. During that process, the IPv6 hop limit field is -! decremented. Depending on the new value of the hop limit, the IPHC header -! compression algorithm might not be able to compress it, and hence has to carry -! it inline, adding a byte to the header. To avoid having to move bytes around -! inside OpenQueueEntry_t->packet buffer, we start writing the received packet a -! bit after the start of the packet. -! */ -! #define FIRST_FRAME_BYTE 1 -! -! // the different states of the IEEE802.15.4e state machine -! typedef enum { -! S_SLEEP = 0x00, // ready for next slot -! // synchronizing -! S_SYNCLISTEN = 0x01, // listened for packet to synchronize to network -! S_SYNCRX = 0x02, // receiving packet to synchronize to network -! S_SYNCPROC = 0x03, // processing packet just received -! // TX -! S_TXDATAOFFSET = 0x04, // waiting to prepare for Tx data -! S_TXDATAPREPARE = 0x05, // preparing for Tx data -! S_TXDATAREADY = 0x06, // ready to Tx data, waiting for 'go' -! S_TXDATADELAY = 0x07, // 'go' signal given, waiting for SFD Tx data -! S_TXDATA = 0x08, // Tx data SFD received, sending bytes -! S_RXACKOFFSET = 0x09, // Tx data done, waiting to prepare for Rx ACK -! S_RXACKPREPARE = 0x0a, // preparing for Rx ACK -! S_RXACKREADY = 0x0b, // ready to Rx ACK, waiting for 'go' -! S_RXACKLISTEN = 0x0c, // idle listening for ACK -! S_RXACK = 0x0d, // Rx ACK SFD received, receiving bytes -! S_TXPROC = 0x0e, // processing sent data -! // RX -! S_RXDATAOFFSET = 0x0f, // waiting to prepare for Rx data -! S_RXDATAPREPARE = 0x10, // preparing for Rx data -! S_RXDATAREADY = 0x11, // ready to Rx data, waiting for 'go' -! S_RXDATALISTEN = 0x12, // idle listening for data -! S_RXDATA = 0x13, // data SFD received, receiving more bytes -! S_TXACKOFFSET = 0x14, // waiting to prepare for Tx ACK -! S_TXACKPREPARE = 0x15, // preparing for Tx ACK -! S_TXACKREADY = 0x16, // Tx ACK ready, waiting for 'go' -! S_TXACKDELAY = 0x17, // 'go' signal given, waiting for SFD Tx ACK -! S_TXACK = 0x18, // Tx ACK SFD received, sending bytes -! S_RXPROC = 0x19, // processing received data -! } ieee154e_state_t; -! -! // Atomic durations -! // expressed in 32kHz ticks: -! // - ticks = duration_in_seconds * 32768 -! // - duration_in_seconds = ticks / 32768 -! enum ieee154e_atomicdurations_enum { -! // time-slot related -! TsTxOffset = 131, // 4000us -! TsLongGT = 43, // 1300us -! TsTxAckDelay = 151, // 4606us -! TsShortGT = 16, // 500us -! TsSlotDuration = PORT_TsSlotDuration, // 15000us -! // execution speed related -! maxTxDataPrepare = PORT_maxTxDataPrepare, -! maxRxAckPrepare = PORT_maxRxAckPrepare, -! maxRxDataPrepare = PORT_maxRxDataPrepare, -! maxTxAckPrepare = PORT_maxTxAckPrepare, -! // radio speed related -! delayTx = PORT_delayTx, // between GO signal and SFD -! delayRx = PORT_delayRx, // between GO signal and start listening -! // radio watchdog -! wdRadioTx = 33, // 1000us (needs to be >delayTx) -! wdDataDuration = 164, // 5000us (measured 4280us with max payload) -! wdAckDuration = 98, // 3000us (measured 1000us) -! }; -! -! -! -! // FSM timer durations (combinations of atomic durations) -! // TX -! #define DURATION_tt1 ieee154e_vars.lastCapturedTime+TsTxOffset-delayTx-maxTxDataPrepare -! #define DURATION_tt2 ieee154e_vars.lastCapturedTime+TsTxOffset-delayTx -! #define DURATION_tt3 ieee154e_vars.lastCapturedTime+TsTxOffset-delayTx+wdRadioTx -! #define DURATION_tt4 ieee154e_vars.lastCapturedTime+wdDataDuration -! #define DURATION_tt5 ieee154e_vars.lastCapturedTime+TsTxAckDelay-TsShortGT-delayRx-maxRxAckPrepare -! #define DURATION_tt6 ieee154e_vars.lastCapturedTime+TsTxAckDelay-TsShortGT-delayRx -! #define DURATION_tt7 ieee154e_vars.lastCapturedTime+TsTxAckDelay+TsShortGT -! #define DURATION_tt8 ieee154e_vars.lastCapturedTime+wdAckDuration -! // RX -! #define DURATION_rt1 ieee154e_vars.lastCapturedTime+TsTxOffset-TsLongGT-delayRx-maxRxDataPrepare -! #define DURATION_rt2 ieee154e_vars.lastCapturedTime+TsTxOffset-TsLongGT-delayRx -! #define DURATION_rt3 ieee154e_vars.lastCapturedTime+TsTxOffset+TsLongGT -! #define DURATION_rt4 ieee154e_vars.lastCapturedTime+wdDataDuration -! #define DURATION_rt5 ieee154e_vars.lastCapturedTime+TsTxAckDelay-delayTx-maxTxAckPrepare -! #define DURATION_rt6 ieee154e_vars.lastCapturedTime+TsTxAckDelay-delayTx -! #define DURATION_rt7 ieee154e_vars.lastCapturedTime+TsTxAckDelay-delayTx+wdRadioTx -! #define DURATION_rt8 ieee154e_vars.lastCapturedTime+wdAckDuration -! -! //=========================== typedef ========================================= -! -! //IEEE802.15.4E acknowledgement (ACK) -! typedef struct { -! PORT_SIGNED_INT_WIDTH timeCorrection; -! } IEEE802154E_ACK_ht; -! -! #define ADV_PAYLOAD_LENGTH 5 -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! // admin -! void ieee154e_init(); -! // public -! PORT_TIMER_WIDTH ieee154e_asnDiff(asn_t* someASN); -! bool ieee154e_isSynch(); -! void asnWriteToPkt(OpenQueueEntry_t* frame); -! void asnWriteToSerial(uint8_t* array); -! // events -! void ieee154e_startOfFrame(PORT_TIMER_WIDTH capturedTime); -! void ieee154e_endOfFrame(PORT_TIMER_WIDTH capturedTime); -! // misc -! bool debugPrint_asn(); -! bool debugPrint_isSync(); -! bool debugPrint_macStats(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,308 ---- -! #ifndef __IEEE802154E_H -! #define __IEEE802154E_H -! -! /** -! \addtogroup MAClow -! \{ -! \addtogroup IEEE802154E -! \{ -! */ -! -! #include "openwsn.h" -! #include "board_info.h" -! #include "schedule.h" -! -! //=========================== debug define ==================================== -! -! //=========================== define ========================================== -! -! #define SYNCHRONIZING_CHANNEL 20 // channel the mote listens on to synchronize -! #define TXRETRIES 3 // number of MAC retries before declaring failed -! #define TX_POWER 31 // 1=-25dBm, 31=0dBm (max value) -! #define RESYNCHRONIZATIONGUARD 5 // in 32kHz ticks. min distance to the end of the slot to succesfully synchronize -! #define US_PER_TICK 30 // number of us per 32kHz clock tick -! #define KATIMEOUT 66 // in slots: @15ms per slot -> ~1 seconds -! #define DESYNCTIMEOUT 333 // in slots: @15ms per slot -> ~5 seconds -! #define LIMITLARGETIMECORRECTION 5 // threshold number of ticks to declare a timeCorrection "large" -! #define LENGTH_IEEE154_MAX 128 // max length of a valid radio packet -! -! //15.4e information elements related -! #define IEEE802154E_PAYLOAD_DESC_LEN_SHIFT 0x04 -! #define IEEE802154E_PAYLOAD_DESC_GROUP_ID_MLME (0x01 << 1) //includes shift 1 -! #define IEEE802154E_DESC_TYPE_LONG 0x01 -! #define IEEE802154E_DESC_TYPE_SHORT 0x00 -! -! #define IEEE802154E_DESC_TYPE_HEADER_IE 0x00 -! #define IEEE802154E_DESC_TYPE_PAYLOAD_IE 0x01 -! //len field on PAYLOAD/HEADER DESC -! #define IEEE802154E_DESC_LEN_HEADER_IE_MASK 0xFE00 -! #define IEEE802154E_DESC_LEN_PAYLOAD_IE_MASK 0xFFE0 -! -! #define IEEE802154E_DESC_LEN_HEADER_IE_SHIFT 9 -! #define IEEE802154E_DESC_LEN_PAYLOAD_IE_SHIFT 5 -! -! //groupID/elementID field on PAYLOAD/HEADER DESC -! #define IEEE802154E_DESC_ELEMENTID_HEADER_IE_MASK 0x01FE -! #define IEEE802154E_DESC_GROUPID_PAYLOAD_IE_MASK 0x001E -! -! #define IEEE802154E_DESC_ELEMENTID_HEADER_IE_SHIFT 1 -! #define IEEE802154E_DESC_GROUPID_PAYLOAD_IE_SHIFT 1 -! -! //MLME Sub IE LONG page 83 -! #define IEEE802154E_DESC_LEN_LONG_MLME_IE_MASK 0xFFE0 -! #define IEEE802154E_DESC_SUBID_LONG_MLME_IE_MASK 0x001E -! -! #define IEEE802154E_DESC_LEN_LONG_MLME_IE_SHIFT 5 -! #define IEEE802154E_DESC_SUBID_LONG_MLME_IE_SHIFT 1 -! -! //MLME Sub IE SHORT page 82 -! #define IEEE802154E_DESC_LEN_SHORT_MLME_IE_MASK 0xFF00 -! #define IEEE802154E_DESC_SUBID_SHORT_MLME_IE_MASK 0x00FE -! -! #define IEEE802154E_DESC_LEN_SHORT_MLME_IE_SHIFT 8 -! #define IEEE802154E_DESC_SUBID_SHORT_MLME_IE_SHIFT 1 -! -! -! #define IEEE802154E_MLME_SYNC_IE_SUBID 0x1A -! #define IEEE802154E_MLME_SYNC_IE_SUBID_SHIFT 1 -! #define IEEE802154E_MLME_SLOTFRAME_LINK_IE_SUBID 0x1B -! #define IEEE802154E_MLME_SLOTFRAME_LINK_IE_SUBID_SHIFT 1 -! #define IEEE802154E_MLME_TIMESLOT_IE_SUBID 0x1c -! #define IEEE802154E_MLME_TIMESLOT_IE_SUBID_SHIFT 1 -! -! #define IEEE802154E_MLME_IE_GROUPID 0x01 -! #define IEEE802154E_ACK_NACK_TIMECORRECTION_ELEMENTID 0x1E -! -! #define IEEE802154E_ -! /** -! When a packet is received, it is written inside the OpenQueueEntry_t->packet -! buffer, starting at the byte defined below. When a packet is relayed, it -! traverses the stack in which the MAC and IPHC headers are parsed and stripped -! off, then put on again. During that process, the IPv6 hop limit field is -! decremented. Depending on the new value of the hop limit, the IPHC header -! compression algorithm might not be able to compress it, and hence has to carry -! it inline, adding a byte to the header. To avoid having to move bytes around -! inside OpenQueueEntry_t->packet buffer, we start writing the received packet a -! bit after the start of the packet. -! */ -! #define FIRST_FRAME_BYTE 1 -! -! // the different states of the IEEE802.15.4e state machine -! typedef enum { -! S_SLEEP = 0x00, // ready for next slot -! // synchronizing -! S_SYNCLISTEN = 0x01, // listened for packet to synchronize to network -! S_SYNCRX = 0x02, // receiving packet to synchronize to network -! S_SYNCPROC = 0x03, // processing packet just received -! // TX -! S_TXDATAOFFSET = 0x04, // waiting to prepare for Tx data -! S_TXDATAPREPARE = 0x05, // preparing for Tx data -! S_TXDATAREADY = 0x06, // ready to Tx data, waiting for 'go' -! S_TXDATADELAY = 0x07, // 'go' signal given, waiting for SFD Tx data -! S_TXDATA = 0x08, // Tx data SFD received, sending bytes -! S_RXACKOFFSET = 0x09, // Tx data done, waiting to prepare for Rx ACK -! S_RXACKPREPARE = 0x0a, // preparing for Rx ACK -! S_RXACKREADY = 0x0b, // ready to Rx ACK, waiting for 'go' -! S_RXACKLISTEN = 0x0c, // idle listening for ACK -! S_RXACK = 0x0d, // Rx ACK SFD received, receiving bytes -! S_TXPROC = 0x0e, // processing sent data -! // RX -! S_RXDATAOFFSET = 0x0f, // waiting to prepare for Rx data -! S_RXDATAPREPARE = 0x10, // preparing for Rx data -! S_RXDATAREADY = 0x11, // ready to Rx data, waiting for 'go' -! S_RXDATALISTEN = 0x12, // idle listening for data -! S_RXDATA = 0x13, // data SFD received, receiving more bytes -! S_TXACKOFFSET = 0x14, // waiting to prepare for Tx ACK -! S_TXACKPREPARE = 0x15, // preparing for Tx ACK -! S_TXACKREADY = 0x16, // Tx ACK ready, waiting for 'go' -! S_TXACKDELAY = 0x17, // 'go' signal given, waiting for SFD Tx ACK -! S_TXACK = 0x18, // Tx ACK SFD received, sending bytes -! S_RXPROC = 0x19, // processing received data -! } ieee154e_state_t; -! -! // Atomic durations -! // expressed in 32kHz ticks: -! // - ticks = duration_in_seconds * 32768 -! // - duration_in_seconds = ticks / 32768 -! enum ieee154e_atomicdurations_enum { -! // time-slot related -! TsTxOffset = 131, // 4000us -! TsLongGT = 43, // 1300us -! TsTxAckDelay = 151, // 4606us -! TsShortGT = 16, // 500us -! // TsShortGT = 30, // 900us, stm32 can work well with this value -! TsSlotDuration = PORT_TsSlotDuration, // 15000us -! // execution speed related -! maxTxDataPrepare = PORT_maxTxDataPrepare, -! maxRxAckPrepare = PORT_maxRxAckPrepare, -! maxRxDataPrepare = PORT_maxRxDataPrepare, -! maxTxAckPrepare = PORT_maxTxAckPrepare, -! // radio speed related -! delayTx = PORT_delayTx, // between GO signal and SFD -! delayRx = PORT_delayRx, // between GO signal and start listening -! // radio watchdog -! wdRadioTx = 33, // 1000us (needs to be >delayTx) -! wdDataDuration = 164, // 5000us (measured 4280us with max payload) -! wdAckDuration = 98, // 3000us (measured 1000us) -! }; -! -! -! //shift of bytes in the linkOption bitmap -! enum ieee154e_linkOption_enum { -! FLAG_TX_S = 7, -! FLAG_RX_S = 6, -! FLAG_SHARED_S = 5, -! FLAG_TIMEKEEPING_S = 4, -! }; -! -! // FSM timer durations (combinations of atomic durations) -! // TX -! #define DURATION_tt1 ieee154e_vars.lastCapturedTime+TsTxOffset-delayTx-maxTxDataPrepare -! #define DURATION_tt2 ieee154e_vars.lastCapturedTime+TsTxOffset-delayTx -! #define DURATION_tt3 ieee154e_vars.lastCapturedTime+TsTxOffset-delayTx+wdRadioTx -! #define DURATION_tt4 ieee154e_vars.lastCapturedTime+wdDataDuration -! #define DURATION_tt5 ieee154e_vars.lastCapturedTime+TsTxAckDelay-TsShortGT-delayRx-maxRxAckPrepare -! #define DURATION_tt6 ieee154e_vars.lastCapturedTime+TsTxAckDelay-TsShortGT-delayRx -! #define DURATION_tt7 ieee154e_vars.lastCapturedTime+TsTxAckDelay+TsShortGT -! #define DURATION_tt8 ieee154e_vars.lastCapturedTime+wdAckDuration -! // RX -! #define DURATION_rt1 ieee154e_vars.lastCapturedTime+TsTxOffset-TsLongGT-delayRx-maxRxDataPrepare -! #define DURATION_rt2 ieee154e_vars.lastCapturedTime+TsTxOffset-TsLongGT-delayRx -! #define DURATION_rt3 ieee154e_vars.lastCapturedTime+TsTxOffset+TsLongGT -! #define DURATION_rt4 ieee154e_vars.lastCapturedTime+wdDataDuration -! #define DURATION_rt5 ieee154e_vars.lastCapturedTime+TsTxAckDelay-delayTx-maxTxAckPrepare -! #define DURATION_rt6 ieee154e_vars.lastCapturedTime+TsTxAckDelay-delayTx -! #define DURATION_rt7 ieee154e_vars.lastCapturedTime+TsTxAckDelay-delayTx+wdRadioTx -! #define DURATION_rt8 ieee154e_vars.lastCapturedTime+wdAckDuration -! -! //=========================== typedef ========================================= -! -! //IEEE802.15.4E acknowledgement (ACK) -! typedef struct { -! PORT_SIGNED_INT_WIDTH timeCorrection; -! } IEEE802154E_ACK_ht; -! -! //includes payload header IE short + MLME short Header + Sync IE -! #define ADV_PAYLOAD_LENGTH sizeof(payload_IE_descriptor_t) + \ -! sizeof(MLME_IE_subHeader_t) + \ -! sizeof(synch_IE_t) -! -! -! -! -! //=========================== module variables ================================ -! -! typedef struct { -! // misc -! asn_t asn; // current absolute slot number -! slotOffset_t slotOffset; // current slot offset -! slotOffset_t nextActiveSlotOffset; // next active slot offset -! PORT_RADIOTIMER_WIDTH deSyncTimeout; // how many slots left before looses sync -! bool isSync; // TRUE iff mote is synchronized to network -! // as shown on the chronogram -! ieee154e_state_t state; // state of the FSM -! OpenQueueEntry_t* dataToSend; // pointer to the data to send -! OpenQueueEntry_t* dataReceived; // pointer to the data received -! OpenQueueEntry_t* ackToSend; // pointer to the ack to send -! OpenQueueEntry_t* ackReceived; // pointer to the ack received -! PORT_RADIOTIMER_WIDTH lastCapturedTime; // last captured time -! PORT_RADIOTIMER_WIDTH syncCapturedTime; // captured time used to sync -! //channel hopping -! uint8_t freq; // frequency of the current slot -! uint8_t asnOffset; // offset inside the frame -! -! PORT_RADIOTIMER_WIDTH radioOnInit; //when within the slot the radio turns on -! PORT_RADIOTIMER_WIDTH radioOnTics;//how many tics within the slot the radio is on -! bool radioOnThisSlot; //to control if the radio has been turned on in a slot. -! } ieee154e_vars_t; -! -! //PRAGMA(pack(1)); -! typedef struct { -! uint8_t numSyncPkt; // how many times synchronized on a non-ACK packet -! uint8_t numSyncAck; // how many times synchronized on an ACK -! PORT_SIGNED_INT_WIDTH minCorrection; // minimum time correction -! PORT_SIGNED_INT_WIDTH maxCorrection; // maximum time correction -! uint8_t numDeSync; // number of times a desync happened -! float dutyCycle; // mac dutyCycle at each superframe -! } ieee154e_stats_t; -! //PRAGMA(pack()); -! -! typedef struct { -! PORT_RADIOTIMER_WIDTH num_newSlot; -! PORT_RADIOTIMER_WIDTH num_timer; -! PORT_RADIOTIMER_WIDTH num_startOfFrame; -! PORT_RADIOTIMER_WIDTH num_endOfFrame; -! } ieee154e_dbg_t; -! -! -! //=========================== IEs ============================================= -! //the header for all header IEs -! typedef struct{ -! uint16_t length_elementid_type; -! }header_IE_descriptor_t; -! //header descriptor. elementid will be 0 as described in 15.4e pag. 81 -! //type is 0 as described on p. 80 -! -! -! //the content for ack ie -- it is a header IE with values - element id =0x1e len=2 type=0 -! //PRAGMA(pack(1)); -! typedef struct { -! int16_t timesync_info; -! }ack_timecorrection_IE_t; -! //PRAGMA(pack()); -! //the header for all payload IEs -! -! -! typedef struct{//11b len 4b gid 1b type -! uint16_t length_groupid_type; //bytes on the IE content- that is the embedded MLME or Header IE. -! //groupid == 0x01 MLME | type long = 1 -! }payload_IE_descriptor_t; // payload descriptor. groupid will be 1 as described in 15.4e pag. 81 -! -! //MLME sub id header appended to payload descriptor. we use group id=1 type=1 -! typedef struct{ -! uint16_t length_subID_type; -! }MLME_IE_subHeader_t; -! -! //the Synchronization IE. it is a payload IE with values - subid=0x1a type=0 (short) len=6 -! //PRAGMA(pack(1)); -! typedef struct { -! uint8_t asn[5]; -! uint8_t join_priority; -! }synch_IE_t; -! //PRAGMA(pack()); -! -! //the Slotframe and Link IE -! typedef struct { -! uint8_t slotframehandle; -! uint16_t slotframesize; -! uint8_t numlinks; -! }slotframelink_IE_t; -! -! typedef struct { -! uint16_t tsNum; -! uint16_t choffset; -! uint8_t linkoptions; -! }linkInfo_subIE_t; -! -! //=========================== prototypes ====================================== -! -! // admin -! void ieee154e_init(void); -! // public -! PORT_RADIOTIMER_WIDTH ieee154e_asnDiff(asn_t* someASN); -! bool ieee154e_isSynch(void); -! void ieee154e_getAsn(uint8_t* array); -! // events -! void ieee154e_startOfFrame(PORT_RADIOTIMER_WIDTH capturedTime); -! void ieee154e_endOfFrame(PORT_RADIOTIMER_WIDTH capturedTime); -! // misc -! bool debugPrint_asn(void); -! bool debugPrint_isSync(void); -! bool debugPrint_macStats(void); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/02a-MAClow/Makefile ../../../sys/net/openwsn/02a-MAClow/Makefile -*** openwsn/02a-MAClow/Makefile Wed Jan 15 13:55:34 2014 ---- ../../../sys/net/openwsn/02a-MAClow/Makefile Wed Jan 15 13:48:26 2014 -*************** -*** 0 **** ---- 1,32 ---- -+ SUBMOD:=$(shell basename $(CURDIR)).a -+ #BINDIR = $(RIOTBASE)/bin/ -+ SRC = $(wildcard *.c) -+ OBJ = $(SRC:%.c=$(BINDIR)%.o) -+ DEP = $(SRC:%.c=$(BINDIR)%.d) -+ -+ INCLUDES += -I$(RIOTBASE) -I$(RIOTBASE)/sys/include -I$(RIOTBASE)/core/include -I$(RIOTBASE)/drivers/include -I$(RIOTBASE)/drivers/cc110x_ng/include -I$(RIOTBASE)/cpu/arm_common/include -I$(RIOTBASE)/sys/net/include/ -+ INCLUDES += -I$(CURDIR)/02a-MAClow -+ INCLUDES += -I$(CURDIR)/02b-MAChigh -+ INCLUDES += -I$(CURDIR)/03a-IPHC -+ INCLUDES += -I$(CURDIR)/03b-IPv6 -+ INCLUDES += -I$(CURDIR)/04-TRAN -+ INCLUDES += -I$(CURDIR)/cross-layers -+ -+ .PHONY: $(BINDIR)$(SUBMOD) -+ -+ $(BINDIR)$(SUBMOD): $(OBJ) -+ $(AD)$(AR) rcs $(BINDIR)$(MODULE) $(OBJ) -+ -+ # pull in dependency info for *existing* .o files -+ -include $(OBJ:.o=.d) -+ -+ # compile and generate dependency info -+ $(BINDIR)%.o: %.c -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d -+ @printf "$(BINDIR)" | cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d -+ -+ # remove compilation products -+ -+ clean: -+ rm -f $(OBJ) $(DEP) -diff -crB openwsn/02a-MAClow/stupidmac/Makefile ../../../sys/net/openwsn/02a-MAClow/stupidmac/Makefile -*** openwsn/02a-MAClow/stupidmac/Makefile Wed Jan 15 13:55:34 2014 ---- ../../../sys/net/openwsn/02a-MAClow/stupidmac/Makefile Wed Jan 15 13:48:26 2014 -*************** -*** 0 **** ---- 1,4 ---- -+ MODULE:=$(shell basename $(CURDIR)) -+ INCLUDES += -I$(RIOTBASE) -I$(RIOTBASE)/sys/include -I$(RIOTBASE)/core/include -I$(RIOTBASE)/drivers/include -I$(RIOTBASE)/drivers/cc110x_ng/include -I$(RIOTBASE)/cpu/arm_common/include -I$(RIOTBASE)/sys/net/include/ -+ -+ include $(RIOTBASE)/Makefile.base -\ No newline at end of file -diff -crB openwsn/02a-MAClow/stupidmac/stupidmac.c ../../../sys/net/openwsn/02a-MAClow/stupidmac/stupidmac.c -*** openwsn/02a-MAClow/stupidmac/stupidmac.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/02a-MAClow/stupidmac/stupidmac.c Wed Jan 15 13:48:26 2014 -*************** -*** 1,354 **** -! /** -! \brief Implementation of stupidMAC -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, August 2010 -! */ -! -! #include "openwsn.h" -! #include "stupidmac.h" -! #include "IEEE802154.h" -! #include "radio.h" -! #include "packetfunctions.h" -! #include "idmanager.h" -! #include "openserial.h" -! #include "openqueue.h" -! #include "timers.h" -! #include "packetfunctions.h" -! #include "neighbors.h" -! #include "nores.h" -! -! //=========================== variables ======================================= -! -! OpenQueueEntry_t* stupidmac_dataFrameToSend; // NULL at beginning and end of slot -! OpenQueueEntry_t* stupidmac_packetACK; // NULL at beginning and end, free at end of slot -! OpenQueueEntry_t* stupidmac_dataFrameReceived; // !NULL between data received, and sent to upper layer -! uint8_t stupidmac_dsn; -! uint8_t stupidmac_state; -! #ifndef SERIALINSCHEDULER -! bool stupidmac_serialInOutputMode; -! #endif -! -! //=========================== prototypes ====================================== -! -! #include "IEEE802154_common.c" -! void packetReceived(); -! void armRandomBackoffTimer(); -! void change_state(uint8_t newstate); -! -! //======= from upper layer -! -! //in stupidMAC, the radio is always on, listening -! void stupidmac_init() { -! radio_rxOn(openwsn_frequency_channel); -! change_state(S_IDLE_LISTENING); -! stupidmac_dataFrameToSend = NULL; -! timer_startPeriodic(TIMER_MAC_PERIODIC,PERIODICTIMERPERIOD); -! } -! -! //a packet sent from the upper layer is simply stored into the OpenQueue buffer. -! //The timerBackoff is armed to service the packet later on. -! error_t stupidmac_send(OpenQueueEntry_t* msg) { -! //metadata -! msg->owner = COMPONENT_MAC; -! if (packetfunctions_isBroadcastMulticast(&(msg->l2_nextORpreviousHop))==TRUE) { -! msg->l2_retriesLeft = 1; -! } else { -! msg->l2_retriesLeft = TXRETRIES; -! } -! msg->l1_txPower = TX_POWER; -! msg->l1_channel = openwsn_frequency_channel; -! //IEEE802.15.4 header -! prependIEEE802154header(msg, -! msg->l2_frameType, -! IEEE154_SEC_NO_SECURITY, -! stupidmac_dsn++, -! &(msg->l2_nextORpreviousHop) -! ); -! // space for 2-byte CRC -! packetfunctions_reserveFooterSize(msg,2); -! //simulate timer backoff fires so that packet gets sent immediately -! timer_mac_backoff_fired(); -! return E_SUCCESS; -! } -! -! //======= from lower layer -! -! void stupidmac_sendDone(OpenQueueEntry_t* pkt, error_t error) { -! switch (stupidmac_state) { -! case S_TX_TXDATA: //[sendNowDone] transmitter -! if (error!=E_SUCCESS) { -! nores_sendDone(pkt,E_FAIL); -! stupidmac_dataFrameToSend = NULL; -! armRandomBackoffTimer();//arm timer to retransmission (?) -! change_state(S_IDLE_LISTENING); -! openserial_printError(COMPONENT_MAC,ERR_SENDNOWDONE_FAILED, -! (errorparameter_t)stupidmac_state, -! (errorparameter_t)0); -! return; -! } else { -! timer_startOneShot(TIMER_MAC_WATCHDOG,ACK_WAIT_TIME); -! change_state(S_TX_RXACK); -! } -! break; -! case S_RX_TXACK: //[sendNowDone] receiver -! //I'm a receiver, finished sending ACK (end of RX sequence) -! openqueue_freePacketBuffer(stupidmac_packetACK); -! packetReceived(); -! change_state(S_IDLE_LISTENING); -! break; -! default: -! openserial_printError(COMPONENT_MAC,ERR_WRONG_STATE_IN_SUBSEND_SENDDONE, -! (errorparameter_t)stupidmac_state, -! (errorparameter_t)0); -! change_state(S_IDLE_LISTENING); -! break; -! } -! } -! -! void radio_packet_received(OpenQueueEntry_t* msg) { -! ieee802154_header_iht received_ieee154_header; -! ieee802154_header_iht transmitted_ieee154_header; -! -! openserial_stop(); -! //ensure debug fires only after packet fully received -! timer_startPeriodic(TIMER_MAC_PERIODIC,PERIODICTIMERPERIOD); -! -! msg->owner = COMPONENT_MAC; -! -! if (stupidmac_state!=S_TX_RXACK && stupidmac_state!=S_IDLE_LISTENING) { -! //not expecting this packet, throw away -! //do not go back to S_IDLE_LISTENING, just don't receive the packet and let the stupidmac_state machine be where it was -! openqueue_freePacketBuffer(msg); -! return; -! } -! -! received_ieee154_header = retrieveIEEE802154header(msg); -! packetfunctions_tossHeader(msg,received_ieee154_header.headerLength); -! packetfunctions_tossFooter(msg,2); -! -! msg->l2_frameType = received_ieee154_header.frameType; -! memcpy(&(msg->l2_nextORpreviousHop),&(received_ieee154_header.src),sizeof(open_addr_t)); -! if ( received_ieee154_header.frameType==IEEE154_TYPE_DATA && -! !(idmanager_isMyAddress(&received_ieee154_header.panid))) { -! openserial_printError(COMPONENT_MAC,ERR_WRONG_PANID, -! (errorparameter_t)received_ieee154_header.panid.panid[0]*256+received_ieee154_header.panid.panid[1], -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! -! switch (stupidmac_state) { -! -! /*------------------- TX sequence ------------------------*/ -! case S_TX_RXACK: //[receive] transmitter -! transmitted_ieee154_header = retrieveIEEE802154header(stupidmac_dataFrameToSend); -! if (received_ieee154_header.dsn == transmitted_ieee154_header.dsn) { -! //I'm a transmitter, just received ACK (end of TX sequence) -! timer_stop(TIMER_MAC_WATCHDOG); -! neighbors_indicateTx(&(stupidmac_dataFrameToSend->l2_nextORpreviousHop),WAS_ACKED); -! nores_sendDone(stupidmac_dataFrameToSend,E_SUCCESS); -! stupidmac_dataFrameToSend = NULL; -! armRandomBackoffTimer();//arm timer for next transmission -! change_state(S_IDLE_LISTENING); -! } -! openqueue_freePacketBuffer(msg);//free packet I received -! break; -! -! /*------------------- RX sequence ------------------------*/ -! case S_IDLE_LISTENING: //[receive] receiver -! //I'm a receiver, just received a packet -! if (received_ieee154_header.frameType==IEEE154_TYPE_DATA || received_ieee154_header.frameType==IEEE154_TYPE_CMD) { -! neighbors_indicateRx(&(msg->l2_nextORpreviousHop),msg->l1_rssi); -! if (idmanager_isMyAddress(&received_ieee154_header.dest)) { -! //this packet is unicast to me -! if (stupidmac_dataFrameReceived==NULL) { -! stupidmac_dataFrameReceived = msg; -! } else { -! openserial_printError(COMPONENT_MAC,ERR_BUSY_RECEIVING, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! } -! //the sender requests an ACK -! if (received_ieee154_header.ackRequested) { -! change_state(S_RX_TXACKPREPARE); -! stupidmac_packetACK = openqueue_getFreePacketBuffer(); -! if (stupidmac_packetACK!=NULL) { -! //send ACK -! stupidmac_packetACK->creator = COMPONENT_MAC; -! stupidmac_packetACK->owner = COMPONENT_MAC; -! stupidmac_packetACK->l1_txPower = TX_POWER; -! stupidmac_packetACK->l1_channel = openwsn_frequency_channel; -! stupidmac_packetACK->l2_retriesLeft = 1; -! prependIEEE802154header(stupidmac_packetACK, -! IEEE154_TYPE_ACK, -! IEEE154_SEC_NO_SECURITY, -! received_ieee154_header.dsn, -! NULL); -! packetfunctions_reserveFooterSize(stupidmac_packetACK,2); -! change_state(S_RX_TXACKREADY); -! change_state(S_RX_TXACK); -! if (radio_send(stupidmac_packetACK)!=E_SUCCESS) { -! //abort -! openserial_printError(COMPONENT_MAC,ERR_PREPARESEND_FAILED, -! (errorparameter_t)0,(errorparameter_t)2); -! openqueue_freePacketBuffer(stupidmac_packetACK); -! change_state(S_IDLE_LISTENING); -! } -! } else { -! openserial_printError(COMPONENT_MAC,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0,(errorparameter_t)0); -! change_state(S_IDLE_LISTENING); -! void packetReceived(); -! return; -! } -! } else { -! packetReceived(); -! } -! } else if (packetfunctions_isBroadcastMulticast(&received_ieee154_header.dest)==TRUE) { -! //this packet is broadcast -! if (stupidmac_dataFrameReceived==NULL) { -! stupidmac_dataFrameReceived = msg; -! } else { -! openserial_printError(COMPONENT_MAC,ERR_BUSY_RECEIVING, -! (errorparameter_t)1, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! } -! packetReceived(); -! } else { -! openqueue_freePacketBuffer(msg); -! } -! } else { -! //not data. I could be an ACK but I'm not in S_TX_RXACK stupidmac_state, so I discard -! openqueue_freePacketBuffer(msg); -! } -! break; -! -! default: -! //this should never happen as error was caught above -! //do not go back to S_IDLE_LISTENING, just don't receive the packet and let the stupidmac_state machine be where it was -! openqueue_freePacketBuffer(msg); -! openserial_printError(COMPONENT_MAC,ERR_WRONG_STATE_IN_RECEIVE, -! (errorparameter_t)stupidmac_state, -! (errorparameter_t)0); -! break; -! } -! } -! -! //=========================== private ========================================= -! -! void packetReceived() { -! if (stupidmac_dataFrameReceived->length>0) { -! //packet contains payload destined to an upper layer -! nores_receive(stupidmac_dataFrameReceived); -! } else { -! //packet contains no payload (KA) -! openqueue_freePacketBuffer(stupidmac_dataFrameReceived); -! } -! stupidmac_dataFrameReceived = NULL; -! } -! -! void armRandomBackoffTimer() { -! timer_startOneShot(TIMER_MAC_BACKOFF,MINBACKOFF); //TODO randomize -! } -! -! void change_state(uint8_t newstate) { -! stupidmac_state = newstate; -! switch (newstate) { -! case S_TX_TXDATAPREPARE: -! case S_TX_TXDATA: -! case S_RX_TXACKPREPARE: -! case S_RX_TXACK: -! //atomic P3OUT |= 0x20; -! break; -! case S_TX_TXDATAREADY: -! case S_TX_RXACK: -! case S_RX_TXACKREADY: -! case S_IDLE_LISTENING: -! //atomic P3OUT &= ~0x20; -! break; -! } -! } -! -! bool stupidmac_debugPrint() { -! return FALSE; -! } -! -! //======= timers firing -! -! //periodic timer used to transmit, and to trigger serial input/output -! void timer_mac_periodic_fired() { -! #ifndef SERIALINSCHEDULER -! openserial_stop(); -! #endif -! //trigger transmit -! armRandomBackoffTimer(); -! #ifndef SERIALINSCHEDULER -! //trigger serial input/output -! stupidmac_serialInOutputMode = !stupidmac_serialInOutputMode; -! if (stupidmac_serialInOutputMode) { -! openserial_startOutput(); -! } else { -! openserial_startInput(); -! } -! #endif -! } -! -! //this function is the one which really initiates the transmission of a packet. -! //It only does so if the MAC layer is in S_IDLE_LISTENING stupidmac_state, otherwise it defers -! void timer_mac_backoff_fired() { -! if (stupidmac_state==S_IDLE_LISTENING) { -! if (stupidmac_dataFrameToSend!=NULL) { -! openserial_printError(COMPONENT_MAC,ERR_DATAFRAMETOSEND_ERROR, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! stupidmac_dataFrameToSend = openqueue_inQueue(IS_NOT_ADV); -! if (stupidmac_dataFrameToSend==NULL) { -! stupidmac_dataFrameToSend = openqueue_inQueue(IS_ADV); -! } -! if (stupidmac_dataFrameToSend!=NULL) { -! change_state(S_TX_TXDATA); -! if (radio_send(stupidmac_dataFrameToSend)!=E_SUCCESS) { -! nores_sendDone(stupidmac_dataFrameToSend,E_FAIL); -! stupidmac_dataFrameToSend = NULL; -! armRandomBackoffTimer();//arm to retry later -! change_state(S_IDLE_LISTENING); -! openserial_printError(COMPONENT_MAC,ERR_PREPARESEND_FAILED, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! } -! } else { -! //retry later on -! armRandomBackoffTimer(); -! } -! } -! -! void timer_mac_watchdog_fired() { -! switch (stupidmac_state) { -! case S_TX_RXACK: -! //I'm a transmitter, didn't receive ACK (end of TX sequence). -! neighbors_indicateTx(&(stupidmac_dataFrameToSend->l2_nextORpreviousHop),WAS_NOT_ACKED); -! stupidmac_dataFrameToSend->l2_retriesLeft--; -! if (stupidmac_dataFrameToSend->l2_retriesLeft==0) { -! nores_sendDone(stupidmac_dataFrameToSend,E_FAIL); -! stupidmac_dataFrameToSend = NULL; -! armRandomBackoffTimer(); -! change_state(S_IDLE_LISTENING); -! break; -! } -! //retransmit later on -! armRandomBackoffTimer(); -! stupidmac_dataFrameToSend = NULL; -! change_state(S_IDLE_LISTENING); -! break; -! default: -! openserial_printError(COMPONENT_MAC,ERR_WRONG_STATE_IN_FASTTIMER_FIRED, -! (errorparameter_t)stupidmac_state, -! (errorparameter_t)0); -! change_state(S_IDLE_LISTENING); -! break; -! } - } -\ No newline at end of file ---- 1,354 ---- -! /** -! \brief Implementation of stupidMAC -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, August 2010 -! */ -! -! #include "openwsn.h" -! #include "stupidmac.h" -! #include "IEEE802154.h" -! #include "radio.h" -! #include "packetfunctions.h" -! #include "idmanager.h" -! #include "openserial.h" -! #include "openqueue.h" -! #include "timers.h" -! #include "packetfunctions.h" -! #include "neighbors.h" -! #include "nores.h" -! -! //=========================== variables ======================================= -! -! OpenQueueEntry_t* stupidmac_dataFrameToSend; // NULL at beginning and end of slot -! OpenQueueEntry_t* stupidmac_packetACK; // NULL at beginning and end, free at end of slot -! OpenQueueEntry_t* stupidmac_dataFrameReceived; // !NULL between data received, and sent to upper layer -! uint8_t stupidmac_dsn; -! uint8_t stupidmac_state; -! #ifndef SERIALINSCHEDULER -! bool stupidmac_serialInOutputMode; -! #endif -! -! //=========================== prototypes ====================================== -! -! #include "IEEE802154_common.c" -! void packetReceived(void); -! void armRandomBackoffTimer(void); -! void change_state(uint8_t newstate); -! -! //======= from upper layer -! -! //in stupidMAC, the radio is always on, listening -! void stupidmac_init(void) { -! radio_rxOn(openwsn_frequency_channel); -! change_state(S_IDLE_LISTENING); -! stupidmac_dataFrameToSend = NULL; -! timer_startPeriodic(TIMER_MAC_PERIODIC,PERIODICTIMERPERIOD); -! } -! -! //a packet sent from the upper layer is simply stored into the OpenQueue buffer. -! //The timerBackoff is armed to service the packet later on. -! error_t stupidmac_send(OpenQueueEntry_t* msg) { -! //metadata -! msg->owner = COMPONENT_MAC; -! if (packetfunctions_isBroadcastMulticast(&(msg->l2_nextORpreviousHop))==TRUE) { -! msg->l2_retriesLeft = 1; -! } else { -! msg->l2_retriesLeft = TXRETRIES; -! } -! msg->l1_txPower = TX_POWER; -! msg->l1_channel = openwsn_frequency_channel; -! //IEEE802.15.4 header -! prependIEEE802154header(msg, -! msg->l2_frameType, -! IEEE154_SEC_NO_SECURITY, -! stupidmac_dsn++, -! &(msg->l2_nextORpreviousHop) -! ); -! // space for 2-byte CRC -! packetfunctions_reserveFooterSize(msg,2); -! //simulate timer backoff fires so that packet gets sent immediately -! timer_mac_backoff_fired(); -! return E_SUCCESS; -! } -! -! //======= from lower layer -! -! void stupidmac_sendDone(OpenQueueEntry_t* pkt, error_t error) { -! switch (stupidmac_state) { -! case S_TX_TXDATA: //[sendNowDone] transmitter -! if (error!=E_SUCCESS) { -! nores_sendDone(pkt,E_FAIL); -! stupidmac_dataFrameToSend = NULL; -! armRandomBackoffTimer();//arm timer to retransmission (?) -! change_state(S_IDLE_LISTENING); -! openserial_printError(COMPONENT_MAC,ERR_SENDNOWDONE_FAILED, -! (errorparameter_t)stupidmac_state, -! (errorparameter_t)0); -! return; -! } else { -! timer_startOneShot(TIMER_MAC_WATCHDOG,ACK_WAIT_TIME); -! change_state(S_TX_RXACK); -! } -! break; -! case S_RX_TXACK: //[sendNowDone] receiver -! //I'm a receiver, finished sending ACK (end of RX sequence) -! openqueue_freePacketBuffer(stupidmac_packetACK); -! packetReceived(); -! change_state(S_IDLE_LISTENING); -! break; -! default: -! openserial_printError(COMPONENT_MAC,ERR_WRONG_STATE_IN_SUBSEND_SENDDONE, -! (errorparameter_t)stupidmac_state, -! (errorparameter_t)0); -! change_state(S_IDLE_LISTENING); -! break; -! } -! } -! -! void radio_packet_received(OpenQueueEntry_t* msg) { -! ieee802154_header_iht received_ieee154_header; -! ieee802154_header_iht transmitted_ieee154_header; -! -! openserial_stop(); -! //ensure debug fires only after packet fully received -! timer_startPeriodic(TIMER_MAC_PERIODIC,PERIODICTIMERPERIOD); -! -! msg->owner = COMPONENT_MAC; -! -! if (stupidmac_state!=S_TX_RXACK && stupidmac_state!=S_IDLE_LISTENING) { -! //not expecting this packet, throw away -! //do not go back to S_IDLE_LISTENING, just don't receive the packet and let the stupidmac_state machine be where it was -! openqueue_freePacketBuffer(msg); -! return; -! } -! -! received_ieee154_header = retrieveIEEE802154header(msg); -! packetfunctions_tossHeader(msg,received_ieee154_header.headerLength); -! packetfunctions_tossFooter(msg,2); -! -! msg->l2_frameType = received_ieee154_header.frameType; -! memcpy(&(msg->l2_nextORpreviousHop),&(received_ieee154_header.src),sizeof(open_addr_t)); -! if ( received_ieee154_header.frameType==IEEE154_TYPE_DATA && -! !(idmanager_isMyAddress(&received_ieee154_header.panid))) { -! openserial_printError(COMPONENT_MAC,ERR_WRONG_PANID, -! (errorparameter_t)received_ieee154_header.panid.panid[0]*256+received_ieee154_header.panid.panid[1], -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! -! switch (stupidmac_state) { -! -! /*------------------- TX sequence ------------------------*/ -! case S_TX_RXACK: //[receive] transmitter -! transmitted_ieee154_header = retrieveIEEE802154header(stupidmac_dataFrameToSend); -! if (received_ieee154_header.dsn == transmitted_ieee154_header.dsn) { -! //I'm a transmitter, just received ACK (end of TX sequence) -! timer_stop(TIMER_MAC_WATCHDOG); -! neighbors_indicateTx(&(stupidmac_dataFrameToSend->l2_nextORpreviousHop),WAS_ACKED); -! nores_sendDone(stupidmac_dataFrameToSend,E_SUCCESS); -! stupidmac_dataFrameToSend = NULL; -! armRandomBackoffTimer();//arm timer for next transmission -! change_state(S_IDLE_LISTENING); -! } -! openqueue_freePacketBuffer(msg);//free packet I received -! break; -! -! /*------------------- RX sequence ------------------------*/ -! case S_IDLE_LISTENING: //[receive] receiver -! //I'm a receiver, just received a packet -! if (received_ieee154_header.frameType==IEEE154_TYPE_DATA || received_ieee154_header.frameType==IEEE154_TYPE_CMD) { -! neighbors_indicateRx(&(msg->l2_nextORpreviousHop),msg->l1_rssi); -! if (idmanager_isMyAddress(&received_ieee154_header.dest)) { -! //this packet is unicast to me -! if (stupidmac_dataFrameReceived==NULL) { -! stupidmac_dataFrameReceived = msg; -! } else { -! openserial_printError(COMPONENT_MAC,ERR_BUSY_RECEIVING, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! } -! //the sender requests an ACK -! if (received_ieee154_header.ackRequested) { -! change_state(S_RX_TXACKPREPARE); -! stupidmac_packetACK = openqueue_getFreePacketBuffer(); -! if (stupidmac_packetACK!=NULL) { -! //send ACK -! stupidmac_packetACK->creator = COMPONENT_MAC; -! stupidmac_packetACK->owner = COMPONENT_MAC; -! stupidmac_packetACK->l1_txPower = TX_POWER; -! stupidmac_packetACK->l1_channel = openwsn_frequency_channel; -! stupidmac_packetACK->l2_retriesLeft = 1; -! prependIEEE802154header(stupidmac_packetACK, -! IEEE154_TYPE_ACK, -! IEEE154_SEC_NO_SECURITY, -! received_ieee154_header.dsn, -! NULL); -! packetfunctions_reserveFooterSize(stupidmac_packetACK,2); -! change_state(S_RX_TXACKREADY); -! change_state(S_RX_TXACK); -! if (radio_send(stupidmac_packetACK)!=E_SUCCESS) { -! //abort -! openserial_printError(COMPONENT_MAC,ERR_PREPARESEND_FAILED, -! (errorparameter_t)0,(errorparameter_t)2); -! openqueue_freePacketBuffer(stupidmac_packetACK); -! change_state(S_IDLE_LISTENING); -! } -! } else { -! openserial_printError(COMPONENT_MAC,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0,(errorparameter_t)0); -! change_state(S_IDLE_LISTENING); -! void packetReceived(); -! return; -! } -! } else { -! packetReceived(); -! } -! } else if (packetfunctions_isBroadcastMulticast(&received_ieee154_header.dest)==TRUE) { -! //this packet is broadcast -! if (stupidmac_dataFrameReceived==NULL) { -! stupidmac_dataFrameReceived = msg; -! } else { -! openserial_printError(COMPONENT_MAC,ERR_BUSY_RECEIVING, -! (errorparameter_t)1, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! } -! packetReceived(); -! } else { -! openqueue_freePacketBuffer(msg); -! } -! } else { -! //not data. I could be an ACK but I'm not in S_TX_RXACK stupidmac_state, so I discard -! openqueue_freePacketBuffer(msg); -! } -! break; -! -! default: -! //this should never happen as error was caught above -! //do not go back to S_IDLE_LISTENING, just don't receive the packet and let the stupidmac_state machine be where it was -! openqueue_freePacketBuffer(msg); -! openserial_printError(COMPONENT_MAC,ERR_WRONG_STATE_IN_RECEIVE, -! (errorparameter_t)stupidmac_state, -! (errorparameter_t)0); -! break; -! } -! } -! -! //=========================== private ========================================= -! -! void packetReceived(void) { -! if (stupidmac_dataFrameReceived->length>0) { -! //packet contains payload destined to an upper layer -! nores_receive(stupidmac_dataFrameReceived); -! } else { -! //packet contains no payload (KA) -! openqueue_freePacketBuffer(stupidmac_dataFrameReceived); -! } -! stupidmac_dataFrameReceived = NULL; -! } -! -! void armRandomBackoffTimer(void) { -! timer_startOneShot(TIMER_MAC_BACKOFF,MINBACKOFF); //TODO randomize -! } -! -! void change_state(uint8_t newstate) { -! stupidmac_state = newstate; -! switch (newstate) { -! case S_TX_TXDATAPREPARE: -! case S_TX_TXDATA: -! case S_RX_TXACKPREPARE: -! case S_RX_TXACK: -! //atomic P3OUT |= 0x20; -! break; -! case S_TX_TXDATAREADY: -! case S_TX_RXACK: -! case S_RX_TXACKREADY: -! case S_IDLE_LISTENING: -! //atomic P3OUT &= ~0x20; -! break; -! } -! } -! -! bool stupidmac_debugPrint(void) { -! return FALSE; -! } -! -! //======= timers firing -! -! //periodic timer used to transmit, and to trigger serial input/output -! void timer_mac_periodic_fired(void) { -! #ifndef SERIALINSCHEDULER -! openserial_stop(); -! #endif -! //trigger transmit -! armRandomBackoffTimer(); -! #ifndef SERIALINSCHEDULER -! //trigger serial input/output -! stupidmac_serialInOutputMode = !stupidmac_serialInOutputMode; -! if (stupidmac_serialInOutputMode) { -! openserial_startOutput(); -! } else { -! openserial_startInput(); -! } -! #endif -! } -! -! //this function is the one which really initiates the transmission of a packet. -! //It only does so if the MAC layer is in S_IDLE_LISTENING stupidmac_state, otherwise it defers -! void timer_mac_backoff_fired(void) { -! if (stupidmac_state==S_IDLE_LISTENING) { -! if (stupidmac_dataFrameToSend!=NULL) { -! openserial_printError(COMPONENT_MAC,ERR_DATAFRAMETOSEND_ERROR, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! stupidmac_dataFrameToSend = openqueue_inQueue(IS_NOT_ADV); -! if (stupidmac_dataFrameToSend==NULL) { -! stupidmac_dataFrameToSend = openqueue_inQueue(IS_ADV); -! } -! if (stupidmac_dataFrameToSend!=NULL) { -! change_state(S_TX_TXDATA); -! if (radio_send(stupidmac_dataFrameToSend)!=E_SUCCESS) { -! nores_sendDone(stupidmac_dataFrameToSend,E_FAIL); -! stupidmac_dataFrameToSend = NULL; -! armRandomBackoffTimer();//arm to retry later -! change_state(S_IDLE_LISTENING); -! openserial_printError(COMPONENT_MAC,ERR_PREPARESEND_FAILED, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! } -! } else { -! //retry later on -! armRandomBackoffTimer(); -! } -! } -! -! void timer_mac_watchdog_fired(void) { -! switch (stupidmac_state) { -! case S_TX_RXACK: -! //I'm a transmitter, didn't receive ACK (end of TX sequence). -! neighbors_indicateTx(&(stupidmac_dataFrameToSend->l2_nextORpreviousHop),WAS_NOT_ACKED); -! stupidmac_dataFrameToSend->l2_retriesLeft--; -! if (stupidmac_dataFrameToSend->l2_retriesLeft==0) { -! nores_sendDone(stupidmac_dataFrameToSend,E_FAIL); -! stupidmac_dataFrameToSend = NULL; -! armRandomBackoffTimer(); -! change_state(S_IDLE_LISTENING); -! break; -! } -! //retransmit later on -! armRandomBackoffTimer(); -! stupidmac_dataFrameToSend = NULL; -! change_state(S_IDLE_LISTENING); -! break; -! default: -! openserial_printError(COMPONENT_MAC,ERR_WRONG_STATE_IN_FASTTIMER_FIRED, -! (errorparameter_t)stupidmac_state, -! (errorparameter_t)0); -! change_state(S_IDLE_LISTENING); -! break; -! } - } -\ No newline at end of file -diff -crB openwsn/02a-MAClow/stupidmac/stupidmac.h ../../../sys/net/openwsn/02a-MAClow/stupidmac/stupidmac.h -*** openwsn/02a-MAClow/stupidmac/stupidmac.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/02a-MAClow/stupidmac/stupidmac.h Wed Jan 15 13:48:26 2014 -*************** -*** 1,60 **** -! /** -! \brief Implementation of stupidMAC -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, August 2010 -! */ -! -! #ifndef __STUPIDMAC_H -! #define __STUPIDMAC_H -! -! #include "openwsn.h" -! -! enum { -! //default -! S_IDLE_LISTENING = 0, -! //transmitter -! S_TX_TXDATAPREPARE = 1, -! S_TX_TXDATAREADY = 2, -! S_TX_TXDATA = 3, -! S_TX_RXACK = 4, -! //receiver -! S_RX_TXACKPREPARE = 5, -! S_RX_TXACKREADY = 6, -! S_RX_TXACK = 7, -! }; -! -! enum { -! IMMEDIATELY = 1, //used as timer value which is very small -! WATCHDOG_PREPARESEND = 16000, //500ms -! }; -! -! enum { -! WAS_ACKED = TRUE, -! WAS_NOT_ACKED = FALSE, -! }; -! -! //timer wait times (in 1/32768 seconds), slow version -! /*enum { -! PERIODICTIMERPERIOD = 9828, // 300ms -! MINBACKOFF = 6552, // 200ms -! ACK_WAIT_TIME = 3276, // 100ms -! };*/ -! -! //timer wait times (in 1/32768 seconds), fast version -! enum { -! PERIODICTIMERPERIOD = 982, // 30ms -! MINBACKOFF = 655, // 20ms -! ACK_WAIT_TIME = 327, // 10ms -! }; -! -! void stupidmac_init(); -! error_t stupidmac_send(OpenQueueEntry_t* msg); -! void stupidmac_sendDone(OpenQueueEntry_t* msg, error_t error); -! void stupidmac_packet_received(OpenQueueEntry_t* pkt); -! void stupidmac_sendDone(OpenQueueEntry_t* packetReceived, error_t error); -! void timer_mac_backoff_fired(); -! void timer_mac_watchdog_fired(); -! void timer_mac_periodic_fired(); -! bool stupidmac_debugPrint(); -! -! #endif ---- 1,60 ---- -! /** -! \brief Implementation of stupidMAC -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, August 2010 -! */ -! -! #ifndef __STUPIDMAC_H -! #define __STUPIDMAC_H -! -! #include "openwsn.h" -! -! enum { -! //default -! S_IDLE_LISTENING = 0, -! //transmitter -! S_TX_TXDATAPREPARE = 1, -! S_TX_TXDATAREADY = 2, -! S_TX_TXDATA = 3, -! S_TX_RXACK = 4, -! //receiver -! S_RX_TXACKPREPARE = 5, -! S_RX_TXACKREADY = 6, -! S_RX_TXACK = 7, -! }; -! -! enum { -! IMMEDIATELY = 1, //used as timer value which is very small -! WATCHDOG_PREPARESEND = 16000, //500ms -! }; -! -! enum { -! WAS_ACKED = TRUE, -! WAS_NOT_ACKED = FALSE, -! }; -! -! //timer wait times (in 1/32768 seconds), slow version -! /*enum { -! PERIODICTIMERPERIOD = 9828, // 300ms -! MINBACKOFF = 6552, // 200ms -! ACK_WAIT_TIME = 3276, // 100ms -! };*/ -! -! //timer wait times (in 1/32768 seconds), fast version -! enum { -! PERIODICTIMERPERIOD = 982, // 30ms -! MINBACKOFF = 655, // 20ms -! ACK_WAIT_TIME = 327, // 10ms -! }; -! -! void stupidmac_init(void); -! owerror_t stupidmac_send(OpenQueueEntry_t* msg); -! void stupidmac_sendDone(OpenQueueEntry_t* msg, owerror_t error); -! void stupidmac_packet_received(OpenQueueEntry_t* pkt); -! void stupidmac_sendDone(OpenQueueEntry_t* packetReceived, owerror_t error); -! void timer_mac_backoff_fired(void); -! void timer_mac_watchdog_fired(void); -! void timer_mac_periodic_fired(void); -! bool stupidmac_debugPrint(void); -! -! #endif -diff -crB openwsn/02a-MAClow/topology.c ../../../sys/net/openwsn/02a-MAClow/topology.c -*** openwsn/02a-MAClow/topology.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/02a-MAClow/topology.c Wed Jan 15 13:48:26 2014 -*************** -*** 1,48 **** -! #include "openwsn.h" -! #include "topology.h" -! #include "idmanager.h" -! -! //=========================== defines ========================================= -! -! #define TOPOLOGY_MOTE1 0x6f -! #define TOPOLOGY_MOTE2 0xb9 -! #define TOPOLOGY_MOTE3 0x3b -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! bool topology_isAcceptablePacket(ieee802154_header_iht* ieee802514_header) { -! bool returnVal; -! switch (idmanager_getMyID(ADDR_64B)->addr_64b[7]) { -! case TOPOLOGY_MOTE1: -! if (ieee802514_header->src.addr_64b[7]==TOPOLOGY_MOTE2) { -! returnVal=TRUE; -! } else { -! returnVal=FALSE; -! } -! break; -! case TOPOLOGY_MOTE2: -! if (ieee802514_header->src.addr_64b[7]==TOPOLOGY_MOTE1 || -! ieee802514_header->src.addr_64b[7]==TOPOLOGY_MOTE3) { -! returnVal=TRUE; -! } else { -! returnVal=FALSE; -! } -! break; -! case TOPOLOGY_MOTE3: -! if (ieee802514_header->src.addr_64b[7]==TOPOLOGY_MOTE2) { -! returnVal=TRUE; -! } else { -! returnVal=FALSE; -! } -! break; -! default: -! returnVal=TRUE; -! } -! return returnVal; -! } -! - //=========================== private ========================================= -\ No newline at end of file ---- 1,56 ---- -! #include "openwsn.h" -! #include "topology.h" -! #include "idmanager.h" -! -! //=========================== defines ========================================= -! -! #define TOPOLOGY_MOTE1 0x01 -! #define TOPOLOGY_MOTE2 0x02 -! #define TOPOLOGY_MOTE3 0x03 -! #define TOPOLOGY_MOTE4 0x04 -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! bool topology_isAcceptablePacket(ieee802154_header_iht* ieee802514_header) { -! bool returnVal; -! switch (idmanager_getMyID(ADDR_64B)->addr_64b[7]) { -! case TOPOLOGY_MOTE1: -! if (ieee802514_header->src.addr_64b[7]==TOPOLOGY_MOTE2) { -! returnVal=TRUE; -! } else { -! returnVal=FALSE; -! } -! break; -! case TOPOLOGY_MOTE2: -! if (ieee802514_header->src.addr_64b[7]==TOPOLOGY_MOTE1 || -! ieee802514_header->src.addr_64b[7]==TOPOLOGY_MOTE3) { -! returnVal=TRUE; -! } else { -! returnVal=FALSE; -! } -! break; -! case TOPOLOGY_MOTE3: -! if (ieee802514_header->src.addr_64b[7]==TOPOLOGY_MOTE2 || -! ieee802514_header->src.addr_64b[7]==TOPOLOGY_MOTE4) { -! returnVal=TRUE; -! } else { -! returnVal=FALSE; -! } -! break; -! case TOPOLOGY_MOTE4: -! if (ieee802514_header->src.addr_64b[7]==TOPOLOGY_MOTE3) { -! returnVal=TRUE; -! } else { -! returnVal=FALSE; -! } -! break; -! default: -! returnVal=TRUE; -! } -! return returnVal; -! } -! - //=========================== private ========================================= -\ No newline at end of file -diff -crB openwsn/02a-MAClow/topology.h ../../../sys/net/openwsn/02a-MAClow/topology.h -*** openwsn/02a-MAClow/topology.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/02a-MAClow/topology.h Wed Jan 15 13:48:26 2014 -*************** -*** 1,31 **** -! #ifndef __TOPOLOGY_H -! #define __TOPOLOGY_H -! -! /** -! \addtogroup MAClow -! \{ -! \addtogroup topology -! \{ -! */ -! -! #include "openwsn.h" -! #include "IEEE802154.h" -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== prototypes ====================================== -! -! bool topology_isAcceptablePacket(ieee802154_header_iht* ieee802514_header); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,31 ---- -! #ifndef __TOPOLOGY_H -! #define __TOPOLOGY_H -! -! /** -! \addtogroup MAClow -! \{ -! \addtogroup topology -! \{ -! */ -! -! #include "openwsn.h" -! #include "IEEE802154.h" -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== prototypes ====================================== -! -! bool topology_isAcceptablePacket(ieee802154_header_iht* ieee802514_header); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/02b-MAChigh/Makefile ../../../sys/net/openwsn/02b-MAChigh/Makefile -*** openwsn/02b-MAChigh/Makefile Wed Jan 15 13:55:34 2014 ---- ../../../sys/net/openwsn/02b-MAChigh/Makefile Wed Jan 15 13:48:26 2014 -*************** -*** 0 **** ---- 1,32 ---- -+ SUBMOD:=$(shell basename $(CURDIR)).a -+ #BINDIR = $(RIOTBASE)/bin/ -+ SRC = $(wildcard *.c) -+ OBJ = $(SRC:%.c=$(BINDIR)%.o) -+ DEP = $(SRC:%.c=$(BINDIR)%.d) -+ -+ INCLUDES += -I$(RIOTBASE) -I$(RIOTBASE)/sys/include -I$(RIOTBASE)/core/include -I$(RIOTBASE)/drivers/include -I$(RIOTBASE)/drivers/cc110x_ng/include -I$(RIOTBASE)/cpu/arm_common/include -I$(RIOTBASE)/sys/net/include/ -+ INCLUDES += -I$(CURDIR)/02a-MAClow -+ INCLUDES += -I$(CURDIR)/02b-MAChigh -+ INCLUDES += -I$(CURDIR)/03a-IPHC -+ INCLUDES += -I$(CURDIR)/03b-IPv6 -+ INCLUDES += -I$(CURDIR)/04-TRAN -+ INCLUDES += -I$(CURDIR)/cross-layers -+ -+ .PHONY: $(BINDIR)$(SUBMOD) -+ -+ $(BINDIR)$(SUBMOD): $(OBJ) -+ $(AD)$(AR) rcs $(BINDIR)$(MODULE) $(OBJ) -+ -+ # pull in dependency info for *existing* .o files -+ -include $(OBJ:.o=.d) -+ -+ # compile and generate dependency info -+ $(BINDIR)%.o: %.c -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d -+ @printf "$(BINDIR)" | cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d -+ -+ # remove compilation products -+ -+ clean: -+ rm -f $(OBJ) $(DEP) -diff -crB openwsn/02b-MAChigh/neighbors.c ../../../sys/net/openwsn/02b-MAChigh/neighbors.c -*** openwsn/02b-MAChigh/neighbors.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/02b-MAChigh/neighbors.c Wed Jan 15 13:48:26 2014 -*************** -*** 1,682 **** -! #include "openwsn.h" -! #include "neighbors.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! #include "idmanager.h" -! #include "openserial.h" -! #include "IEEE802154E.h" -! -! //=========================== variables ======================================= -! -! typedef struct { -! neighborRow_t neighbors[MAXNUMNEIGHBORS]; -! dagrank_t myDAGrank; -! uint8_t debugRow; -! icmpv6rpl_dio_ht* dio; //keep it global to be able to debug correctly. -! } neighbors_vars_t; -! -! neighbors_vars_t neighbors_vars; -! -! //=========================== prototypes ====================================== -! -! void registerNewNeighbor( -! open_addr_t* neighborID, -! int8_t rssi, -! asn_t* asnTimestamp -! ); -! bool isNeighbor(open_addr_t* neighbor); -! void removeNeighbor(uint8_t neighborIndex); -! bool isThisRowMatching( -! open_addr_t* address, -! uint8_t rowNumber -! ); -! -! //=========================== public ========================================== -! -! /** -! \brief Initializes this module. -! */ -! void neighbors_init() { -! -! // clear module variables -! memset(&neighbors_vars,0,sizeof(neighbors_vars_t)); -! -! // set myDAGrank -! if (idmanager_getIsDAGroot()==TRUE) { -! neighbors_vars.myDAGrank=0; -! } else { -! neighbors_vars.myDAGrank=DEFAULTDAGRANK; -! } -! } -! -! //===== getters -! -! /** -! \brief Retrieve this mote's current DAG rank. -! -! \returns This mote's current DAG rank. -! */ -! dagrank_t neighbors_getMyDAGrank() { -! return neighbors_vars.myDAGrank; -! } -! -! /** -! \brief Retrieve the number of neighbors this mote's currently knows of. -! -! \returns The number of neighbors this mote's currently knows of. -! */ -! uint8_t neighbors_getNumNeighbors() { -! uint8_t i; -! uint8_t returnVal; -! -! returnVal=0; -! for (i=0;i<MAXNUMNEIGHBORS;i++) { -! if (neighbors_vars.neighbors[i].used==TRUE) { -! returnVal++; -! } -! } -! return returnVal; -! } -! -! /** -! \brief Retrieve my preferred parent's EUI64 address. -! -! \param [out] addressToWrite Where to write the preferred parent's address to. -! */ -! bool neighbors_getPreferredParentEui64(open_addr_t* addressToWrite) { -! uint8_t i; -! bool foundPreferred; -! uint8_t numNeighbors; -! dagrank_t minRankVal; -! uint8_t minRankIdx; -! -! addressToWrite->type = ADDR_NONE; -! -! foundPreferred = FALSE; -! numNeighbors = 0; -! minRankVal = MAXDAGRANK; -! minRankIdx = MAXNUMNEIGHBORS+1; -! -! //===== step 1. Try to find preferred parent -! for (i=0; i<MAXNUMNEIGHBORS; i++) { -! if (neighbors_vars.neighbors[i].used==TRUE){ -! if (neighbors_vars.neighbors[i].parentPreference==MAXPREFERENCE) { -! memcpy(addressToWrite,&(neighbors_vars.neighbors[i].addr_64b),sizeof(open_addr_t)); -! addressToWrite->type=ADDR_64B; -! foundPreferred=TRUE; -! } -! // identify neighbor with lowest rank -! if (neighbors_vars.neighbors[i].DAGrank < minRankVal) { -! minRankVal=neighbors_vars.neighbors[i].DAGrank; -! minRankIdx=i; -! } -! numNeighbors++; -! } -! } -! -! //===== step 2. (backup) Promote neighbor with min rank to preferred parent -! if (foundPreferred==FALSE && numNeighbors > 0){ -! // promote neighbor -! neighbors_vars.neighbors[minRankIdx].parentPreference = MAXPREFERENCE; -! neighbors_vars.neighbors[minRankIdx].stableNeighbor = TRUE; -! neighbors_vars.neighbors[minRankIdx].switchStabilityCounter = 0; -! // return its address -! memcpy(addressToWrite,&(neighbors_vars.neighbors[minRankIdx].addr_64b),sizeof(open_addr_t)); -! addressToWrite->type=ADDR_64B; -! foundPreferred=TRUE; -! } -! -! return foundPreferred; -! } -! -! /** -! \brief Find neighbor to which to send KA. -! -! This function iterates through the neighbor table and identifies the neighbor -! we need to send a KA to, if any. This neighbor satisfies the following -! conditions: -! - it is one of our preferred parents -! - we haven't heard it for over KATIMEOUT -! -! \returns A pointer to the neighbor's address, or NULL if no KA is needed. -! */ -! open_addr_t* neighbors_getKANeighbor() { -! uint8_t i; -! uint16_t timeSinceHeard; -! open_addr_t* addrPreferred; -! open_addr_t* addrOther; -! -! // initialize -! addrPreferred = NULL; -! addrOther = NULL; -! -! // scan through the neighbor table, and populate addrPreferred and addrOther -! for (i=0;i<MAXNUMNEIGHBORS;i++) { -! if (neighbors_vars.neighbors[i].used==1) { -! timeSinceHeard = ieee154e_asnDiff(&neighbors_vars.neighbors[i].asn); -! if (timeSinceHeard>KATIMEOUT) { -! // this neighbor needs to be KA'ed to -! if (neighbors_vars.neighbors[i].parentPreference==MAXPREFERENCE) { -! // its a preferred parent -! addrPreferred = &(neighbors_vars.neighbors[i].addr_64b); -! } else { -! // its not a preferred parent -! // Note: commented out since policy is not to KA to non-preferred parents -! // addrOther = &(neighbors_vars.neighbors[i].addr_64b); -! } -! } -! } -! } -! -! // return the addr of the most urgent KA to send: -! // - if available, preferred parent -! // - if not, non preferred parent -! if (addrPreferred!=NULL) { -! return addrPreferred; -! } else if (addrOther!=NULL) { -! return addrOther; -! } else { -! return NULL; -! } -! } -! -! //===== interrogators -! -! /** -! \brief Indicate whether some neighbor is a stable neighbor -! -! \param address [in] The address of the neighbor, a full 128-bit IPv6 addres. -! -! \returns TRUE if that neighbor is stable, FALSE otherwise. -! */ -! bool neighbors_isStableNeighbor(open_addr_t* address) { -! uint8_t i; -! open_addr_t temp_addr_64b; -! open_addr_t temp_prefix; -! bool returnVal; -! -! // by default, not stable -! returnVal = FALSE; -! -! // but neighbor's IPv6 address in prefix and EUI64 -! switch (address->type) { -! case ADDR_128B: -! packetfunctions_ip128bToMac64b(address,&temp_prefix,&temp_addr_64b); -! break; -! default: -! openserial_printCritical(COMPONENT_NEIGHBORS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)address->type, -! (errorparameter_t)0); -! return returnVal; -! } -! -! // iterate through neighbor table -! for (i=0;i<MAXNUMNEIGHBORS;i++) { -! if (isThisRowMatching(&temp_addr_64b,i) && neighbors_vars.neighbors[i].stableNeighbor==TRUE) { -! returnVal = TRUE; -! break; -! } -! } -! -! return returnVal; -! } -! -! /** -! \brief Indicate whether some neighbor is a preferred neighbor. -! -! \param address [in] The EUI64 address of the neighbor. -! -! \returns TRUE if that neighbor is preferred, FALSE otherwise. -! */ -! bool neighbors_isPreferredParent(open_addr_t* address) { -! uint8_t i; -! bool returnVal; -! -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! -! // by default, not preferred -! returnVal = FALSE; -! -! // iterate through neighbor table -! for (i=0;i<MAXNUMNEIGHBORS;i++) { -! if (isThisRowMatching(address,i) && neighbors_vars.neighbors[i].parentPreference==MAXPREFERENCE) { -! returnVal = TRUE; -! break; -! } -! } -! -! ENABLE_INTERRUPTS(); -! return returnVal; -! } -! -! /** -! \brief Indicate whether some neighbor has a lower DAG rank that me. -! -! \param index [in] The index of that neighbor in the neighbor table. -! -! \returns TRUE if that neighbor has a lower DAG rank than me, FALSE otherwise. -! */ -! bool neighbors_isNeighborWithLowerDAGrank(uint8_t index) { -! bool returnVal; -! -! if (neighbors_vars.neighbors[index].used==TRUE && -! neighbors_vars.neighbors[index].DAGrank < neighbors_getMyDAGrank()) { -! returnVal = TRUE; -! } else { -! returnVal = FALSE; -! } -! -! return returnVal; -! } -! -! -! /** -! \brief Indicate whether some neighbor has a lower DAG rank that me. -! -! \param index [in] The index of that neighbor in the neighbor table. -! -! \returns TRUE if that neighbor has a lower DAG rank than me, FALSE otherwise. -! */ -! bool neighbors_isNeighborWithHigherDAGrank(uint8_t index) { -! bool returnVal; -! -! if (neighbors_vars.neighbors[index].used==TRUE && -! neighbors_vars.neighbors[index].DAGrank >= neighbors_getMyDAGrank()) { -! returnVal = TRUE; -! } else { -! returnVal = FALSE; -! } -! -! return returnVal; -! } -! -! //===== updating neighbor information -! -! /** -! \brief Indicate some (non-ACK) packet was received from a neighbor. -! -! This function should be called for each received (non-ACK) packet so neighbor -! statistics in the neighbor table can be updated. -! -! The fields which are updated are: -! - numRx -! - rssi -! - asn -! - stableNeighbor -! - switchStabilityCounter -! -! \param l2_src [in] MAC source address of the packet, i.e. the neighbor who sent -! the packet just received. -! \param rssi [in] RSSI with which this packet was received. -! \param asnTs [in] ASN at which this packet was received. -! */ -! void neighbors_indicateRx(open_addr_t* l2_src, -! int8_t rssi, -! asn_t* asnTs) { -! uint8_t i; -! bool newNeighbor; -! -! // update existing neighbor -! newNeighbor = TRUE; -! for (i=0;i<MAXNUMNEIGHBORS;i++) { -! if (isThisRowMatching(l2_src,i)) { -! -! // this is not a new neighbor -! newNeighbor = FALSE; -! -! // update numRx, rssi, asn -! neighbors_vars.neighbors[i].numRx++; -! neighbors_vars.neighbors[i].rssi=rssi; -! memcpy(&neighbors_vars.neighbors[i].asn,asnTs,sizeof(asn_t)); -! -! // update stableNeighbor, switchStabilityCounter -! if (neighbors_vars.neighbors[i].stableNeighbor==FALSE) { -! if (neighbors_vars.neighbors[i].rssi>BADNEIGHBORMAXRSSI) { -! neighbors_vars.neighbors[i].switchStabilityCounter++; -! if (neighbors_vars.neighbors[i].switchStabilityCounter>=SWITCHSTABILITYTHRESHOLD) { -! neighbors_vars.neighbors[i].switchStabilityCounter=0; -! neighbors_vars.neighbors[i].stableNeighbor=TRUE; -! } -! } else { -! neighbors_vars.neighbors[i].switchStabilityCounter=0; -! } -! } else if (neighbors_vars.neighbors[i].stableNeighbor==TRUE) { -! if (neighbors_vars.neighbors[i].rssi<GOODNEIGHBORMINRSSI) { -! neighbors_vars.neighbors[i].switchStabilityCounter++; -! if (neighbors_vars.neighbors[i].switchStabilityCounter>=SWITCHSTABILITYTHRESHOLD) { -! neighbors_vars.neighbors[i].switchStabilityCounter=0; -! neighbors_vars.neighbors[i].stableNeighbor=FALSE; -! } -! } else { -! neighbors_vars.neighbors[i].switchStabilityCounter=0; -! } -! } -! -! // stop looping -! break; -! } -! } -! -! // register new neighbor -! if (newNeighbor==TRUE) { -! registerNewNeighbor(l2_src, rssi, asnTs); -! } -! } -! -! /** -! \brief Indicate some packet was sent to some neighbor. -! -! This function should be called for each transmitted (non-ACK) packet so -! neighbor statistics in the neighbor table can be updated. -! -! The fields which are updated are: -! - numTx -! - numTxACK -! - asn -! -! \param l2_dest [in] MAC destination address of the packet, i.e. the neighbor -! who I just sent the packet to. -! \param numTxAttempts [in] Number of transmission attempts to this neighbor. -! \param was_finally_acked [in] TRUE iff the packet was ACK'ed by the neighbor -! on final transmission attempt. -! \param asnTs [in] ASN of the last transmission attempt. -! */ -! void neighbors_indicateTx(open_addr_t* l2_dest, -! uint8_t numTxAttempts, -! bool was_finally_acked, -! asn_t* asnTs) { -! uint8_t i; -! // don't run through this function if packet was sent to broadcast address -! if (packetfunctions_isBroadcastMulticast(l2_dest)==TRUE) { -! return; -! } -! -! // loop through neighbor table -! for (i=0;i<MAXNUMNEIGHBORS;i++) { -! if (isThisRowMatching(l2_dest,i)) { -! // handle roll-over case -! -! if (neighbors_vars.neighbors[i].numTx>(0xff-numTxAttempts)) { -! neighbors_vars.neighbors[i].numWraps++; //counting the number of times that tx wraps. -! neighbors_vars.neighbors[i].numTx/=2; -! neighbors_vars.neighbors[i].numTxACK/=2; -! } -! // update statistics -! neighbors_vars.neighbors[i].numTx += numTxAttempts; -! -! if (was_finally_acked==TRUE) { -! neighbors_vars.neighbors[i].numTxACK++; -! memcpy(&neighbors_vars.neighbors[i].asn,asnTs,sizeof(asn_t)); -! } -! break; -! } -! } -! } -! -! /** -! \brief Indicate I just received a RPL DIO from a neighbor. -! -! This function should be called for each received a DIO is received so neighbor -! routing information in the neighbor table can be updated. -! -! The fields which are updated are: -! - DAGrank -! -! \param msg [in] The received message with msg->payload pointing to the DIO -! header. -! */ -! void neighbors_indicateRxDIO(OpenQueueEntry_t* msg) { -! uint8_t i; -! -! // take ownership over the packet -! msg->owner = COMPONENT_NEIGHBORS; -! -! // update rank of that neighbor in table -! neighbors_vars.dio = (icmpv6rpl_dio_ht*)(msg->payload); -! if (isNeighbor(&(msg->l2_nextORpreviousHop))==TRUE) { -! for (i=0;i<MAXNUMNEIGHBORS;i++) { -! if (isThisRowMatching(&(msg->l2_nextORpreviousHop),i)) { -! if ( -! neighbors_vars.dio->rank>neighbors_vars.neighbors[i].DAGrank && -! neighbors_vars.dio->rank - neighbors_vars.neighbors[i].DAGrank>DEFAULTLINKCOST -! ) { -! // the new DAGrank looks suspiciously high, only increment a bit -! neighbors_vars.neighbors[i].DAGrank += DEFAULTLINKCOST; -! openserial_printError(COMPONENT_NEIGHBORS,ERR_LARGE_DAGRANK, -! (errorparameter_t)neighbors_vars.dio->rank, -! (errorparameter_t)neighbors_vars.neighbors[i].DAGrank); -! } else { -! neighbors_vars.neighbors[i].DAGrank = neighbors_vars.dio->rank; -! } -! break; -! } -! } -! } -! // update my routing information -! neighbors_updateMyDAGrankAndNeighborPreference(); -! } -! -! //===== write addresses -! -! /** -! \brief Write the 64-bit address of some neighbor to some location. -! -! */ -! -! void neighbors_getNeighbor(open_addr_t* address,uint8_t addr_type,uint8_t index){ -! switch(addr_type) { -! case ADDR_64B: -! memcpy(&(address->addr_64b),&(neighbors_vars.neighbors[index].addr_64b.addr_64b),LENGTH_ADDR64b); -! address->type=ADDR_64B; -! break; -! default: -! openserial_printCritical(COMPONENT_NEIGHBORS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)addr_type, -! (errorparameter_t)1); -! break; -! } -! } -! -! -! //===== managing routing info -! -! /** -! \brief Update my DAG rank and neighbor preference. -! -! Call this function whenever some data is changed that could cause this mote's -! routing decisions to change. Examples are: -! - I received a DIO which updated by neighbor table. If this DIO indicated a -! very low DAGrank, I may want to change by routing parent. -! - I became a DAGroot, so my DAGrank should be 0. -! */ -! void neighbors_updateMyDAGrankAndNeighborPreference() { -! uint8_t i; -! uint8_t linkCost; -! uint32_t tentativeDAGrank; // 32-bit since is used to sum -! uint8_t prefParentIdx; -! bool prefParentFound; -! -! // if I'm a DAGroot, my DAGrank is always 0 -! if ((idmanager_getIsDAGroot())==TRUE) { -! neighbors_vars.myDAGrank=0; -! return; -! } -! -! // reset my DAG rank to max value. May be lowered below. -! neighbors_vars.myDAGrank = MAXDAGRANK; -! -! // by default, I haven't found a preferred parent -! prefParentFound = FALSE; -! prefParentIdx = 0; -! -! // loop through neighbor table, update myDAGrank -! for (i=0;i<MAXNUMNEIGHBORS;i++) { -! if (neighbors_vars.neighbors[i].used==TRUE) { -! // reset parent preference -! neighbors_vars.neighbors[i].parentPreference=0; -! // calculate link cost to this neighbor -! if (neighbors_vars.neighbors[i].numTxACK==0) { -! linkCost = DEFAULTLINKCOST; -! } else { -! linkCost = (uint8_t)((((float)neighbors_vars.neighbors[i].numTx)/((float)neighbors_vars.neighbors[i].numTxACK))*10.0); -! } -! tentativeDAGrank = neighbors_vars.neighbors[i].DAGrank+linkCost; -! if ( tentativeDAGrank<neighbors_vars.myDAGrank && -! tentativeDAGrank<MAXDAGRANK) { -! // found better parent, lower my DAGrank -! neighbors_vars.myDAGrank = tentativeDAGrank; -! prefParentFound = TRUE; -! prefParentIdx = i; -! } -! } -! } -! -! // update preferred parent -! if (prefParentFound) { -! neighbors_vars.neighbors[prefParentIdx].parentPreference = MAXPREFERENCE; -! neighbors_vars.neighbors[prefParentIdx].stableNeighbor = TRUE; -! neighbors_vars.neighbors[prefParentIdx].switchStabilityCounter = 0; -! } -! } -! -! //===== debug -! -! /** -! \brief Triggers this module to print status information, over serial. -! -! debugPrint_* functions are used by the openserial module to continuously print -! status information about several modules in the OpenWSN stack. -! -! \returns TRUE if this function printed something, FALSE otherwise. -! */ -! bool debugPrint_neighbors() { -! debugNeighborEntry_t temp; -! neighbors_vars.debugRow=(neighbors_vars.debugRow+1)%MAXNUMNEIGHBORS; -! temp.row=neighbors_vars.debugRow; -! temp.neighborEntry=neighbors_vars.neighbors[neighbors_vars.debugRow]; -! openserial_printStatus(STATUS_NEIGHBORS,(uint8_t*)&temp,sizeof(debugNeighborEntry_t)); -! return TRUE; -! } -! -! void debugNetPrint_neighbors(netDebugNeigborEntry_t* out){ -! uint8_t idxIn; -! uint8_t idxOut; -! -! idxOut=0; -! for (idxIn=0;idxIn<MAXNUMNEIGHBORS;idxIn++) { -! if(neighbors_vars.neighbors[idxIn].used) { -! out[idxOut].last_addr_byte = neighbors_vars.neighbors[idxIn].addr_64b.addr_64b[7];//last byte of the address; poipoi could be [0]; endianness -! out[idxOut].rssi = neighbors_vars.neighbors[idxIn].rssi; -! out[idxOut].parentPreference = neighbors_vars.neighbors[idxIn].parentPreference; -! out[idxOut].DAGrank = neighbors_vars.neighbors[idxIn].DAGrank; -! memcpy( -! &out[idxOut].asn, -! &neighbors_vars.neighbors[idxIn].asn.bytes0and1, -! sizeof(neighbors_vars.neighbors[idxIn].asn.bytes0and1) -! ); -! idxOut++; -! } -! } -! } -! -! //=========================== private ========================================= -! -! void registerNewNeighbor(open_addr_t* address, -! int8_t rssi, -! asn_t* asnTimestamp) { -! uint8_t i,j; -! bool iHaveAPreferedParent; -! // filter errors -! if (address->type!=ADDR_64B) { -! openserial_printCritical(COMPONENT_NEIGHBORS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)address->type, -! (errorparameter_t)2); -! return; -! } -! // add this neighbor -! if (isNeighbor(address)==FALSE) { -! i=0; -! while(i<MAXNUMNEIGHBORS) { -! if (neighbors_vars.neighbors[i].used==FALSE) { -! // add this neighbor -! neighbors_vars.neighbors[i].used = TRUE; -! neighbors_vars.neighbors[i].parentPreference = 0; -! // neighbors_vars.neighbors[i].stableNeighbor = FALSE; -! // Note: all new neighbors are consider stable -! neighbors_vars.neighbors[i].stableNeighbor = TRUE; -! neighbors_vars.neighbors[i].switchStabilityCounter = 0; -! memcpy(&neighbors_vars.neighbors[i].addr_64b,address,sizeof(open_addr_t)); -! neighbors_vars.neighbors[i].DAGrank = DEFAULTDAGRANK; -! neighbors_vars.neighbors[i].rssi = rssi; -! neighbors_vars.neighbors[i].numRx = 1; -! neighbors_vars.neighbors[i].numTx = 0; -! neighbors_vars.neighbors[i].numTxACK = 0; -! memcpy(&neighbors_vars.neighbors[i].asn,asnTimestamp,sizeof(asn_t)); -! // do I already have a preferred parent ? -! iHaveAPreferedParent = FALSE; -! for (j=0;j<MAXNUMNEIGHBORS;j++) { -! if (neighbors_vars.neighbors[j].parentPreference==MAXPREFERENCE) { -! iHaveAPreferedParent = TRUE; -! } -! } -! // if I have none, and I'm not DAGroot, the new neighbor is my preferred -! if (iHaveAPreferedParent==FALSE && idmanager_getIsDAGroot()==FALSE) { -! neighbors_vars.neighbors[i].parentPreference = MAXPREFERENCE; -! } -! break; -! } -! i++; -! } -! if (i==MAXNUMNEIGHBORS) { -! openserial_printError(COMPONENT_NEIGHBORS,ERR_NEIGHBORS_FULL, -! (errorparameter_t)MAXNUMNEIGHBORS, -! (errorparameter_t)0); -! return; -! } -! } -! -! } -! -! bool isNeighbor(open_addr_t* neighbor) { -! uint8_t i=0; -! for (i=0;i<MAXNUMNEIGHBORS;i++) { -! if (isThisRowMatching(neighbor,i)) { -! return TRUE; -! } -! } -! return FALSE; -! } -! -! void removeNeighbor(uint8_t neighborIndex) { -! neighbors_vars.neighbors[neighborIndex].used = FALSE; -! neighbors_vars.neighbors[neighborIndex].parentPreference = 0; -! neighbors_vars.neighbors[neighborIndex].stableNeighbor = FALSE; -! neighbors_vars.neighbors[neighborIndex].switchStabilityCounter = 0; -! //neighbors_vars.neighbors[neighborIndex].addr_16b.type = ADDR_NONE; // to save RAM -! neighbors_vars.neighbors[neighborIndex].addr_64b.type = ADDR_NONE; -! //neighbors_vars.neighbors[neighborIndex].addr_128b.type = ADDR_NONE; // to save RAM -! neighbors_vars.neighbors[neighborIndex].DAGrank = DEFAULTDAGRANK; -! neighbors_vars.neighbors[neighborIndex].rssi = 0; -! neighbors_vars.neighbors[neighborIndex].numRx = 0; -! neighbors_vars.neighbors[neighborIndex].numTx = 0; -! neighbors_vars.neighbors[neighborIndex].numTxACK = 0; -! neighbors_vars.neighbors[neighborIndex].asn.bytes0and1 = 0; -! neighbors_vars.neighbors[neighborIndex].asn.bytes2and3 = 0; -! neighbors_vars.neighbors[neighborIndex].asn.byte4 = 0; -! } -! -! //=========================== helpers ========================================= -! -! bool isThisRowMatching(open_addr_t* address, uint8_t rowNumber) { -! switch (address->type) { -! case ADDR_64B: -! return neighbors_vars.neighbors[rowNumber].used && -! packetfunctions_sameAddress(address,&neighbors_vars.neighbors[rowNumber].addr_64b); -! default: -! openserial_printCritical(COMPONENT_NEIGHBORS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)address->type, -! (errorparameter_t)3); -! return FALSE; -! } -! } ---- 1,693 ---- -! #include "openwsn.h" -! #include "neighbors.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! #include "idmanager.h" -! #include "openserial.h" -! #include "IEEE802154E.h" -! -! //=========================== variables ======================================= -! -! neighbors_vars_t neighbors_vars; -! -! //=========================== prototypes ====================================== -! -! void registerNewNeighbor( -! open_addr_t* neighborID, -! int8_t rssi, -! asn_t* asnTimestamp, -! bool joinPrioPresent, -! uint8_t joinPrio -! ); -! bool isNeighbor(open_addr_t* neighbor); -! void removeNeighbor(uint8_t neighborIndex); -! bool isThisRowMatching( -! open_addr_t* address, -! uint8_t rowNumber -! ); -! -! //=========================== public ========================================== -! -! /** -! \brief Initializes this module. -! */ -! void neighbors_init(void) { -! -! // clear module variables -! memset(&neighbors_vars,0,sizeof(neighbors_vars_t)); -! -! // set myDAGrank -! if (idmanager_getIsDAGroot()==TRUE) { -! neighbors_vars.myDAGrank=0; -! } else { -! neighbors_vars.myDAGrank=DEFAULTDAGRANK; -! } -! } -! -! //===== getters -! -! /** -! \brief Retrieve this mote's current DAG rank. -! -! \returns This mote's current DAG rank. -! */ -! dagrank_t neighbors_getMyDAGrank(void) { -! return neighbors_vars.myDAGrank; -! } -! -! /** -! \brief Retrieve the number of neighbors this mote's currently knows of. -! -! \returns The number of neighbors this mote's currently knows of. -! */ -! uint8_t neighbors_getNumNeighbors(void) { -! uint8_t i; -! uint8_t returnVal; -! -! returnVal=0; -! for (i=0;i<MAXNUMNEIGHBORS;i++) { -! if (neighbors_vars.neighbors[i].used==TRUE) { -! returnVal++; -! } -! } -! return returnVal; -! } -! -! /** -! \brief Retrieve my preferred parent's EUI64 address. -! -! \param[out] addressToWrite Where to write the preferred parent's address to. -! */ -! bool neighbors_getPreferredParentEui64(open_addr_t* addressToWrite) { -! uint8_t i; -! bool foundPreferred; -! uint8_t numNeighbors; -! dagrank_t minRankVal; -! uint8_t minRankIdx; -! -! addressToWrite->type = ADDR_NONE; -! -! foundPreferred = FALSE; -! numNeighbors = 0; -! minRankVal = MAXDAGRANK; -! minRankIdx = MAXNUMNEIGHBORS+1; -! -! //===== step 1. Try to find preferred parent -! for (i=0; i<MAXNUMNEIGHBORS; i++) { -! if (neighbors_vars.neighbors[i].used==TRUE){ -! if (neighbors_vars.neighbors[i].parentPreference==MAXPREFERENCE) { -! memcpy(addressToWrite,&(neighbors_vars.neighbors[i].addr_64b),sizeof(open_addr_t)); -! addressToWrite->type=ADDR_64B; -! foundPreferred=TRUE; -! } -! // identify neighbor with lowest rank -! if (neighbors_vars.neighbors[i].DAGrank < minRankVal) { -! minRankVal=neighbors_vars.neighbors[i].DAGrank; -! minRankIdx=i; -! } -! numNeighbors++; -! } -! } -! -! //===== step 2. (backup) Promote neighbor with min rank to preferred parent -! if (foundPreferred==FALSE && numNeighbors > 0){ -! // promote neighbor -! neighbors_vars.neighbors[minRankIdx].parentPreference = MAXPREFERENCE; -! neighbors_vars.neighbors[minRankIdx].stableNeighbor = TRUE; -! neighbors_vars.neighbors[minRankIdx].switchStabilityCounter = 0; -! // return its address -! memcpy(addressToWrite,&(neighbors_vars.neighbors[minRankIdx].addr_64b),sizeof(open_addr_t)); -! addressToWrite->type=ADDR_64B; -! foundPreferred=TRUE; -! } -! -! return foundPreferred; -! } -! -! /** -! \brief Find neighbor to which to send KA. -! -! This function iterates through the neighbor table and identifies the neighbor -! we need to send a KA to, if any. This neighbor satisfies the following -! conditions: -! - it is one of our preferred parents -! - we haven't heard it for over KATIMEOUT -! -! \returns A pointer to the neighbor's address, or NULL if no KA is needed. -! */ -! open_addr_t* neighbors_getKANeighbor(void) { -! uint8_t i; -! uint16_t timeSinceHeard; -! open_addr_t* addrPreferred; -! open_addr_t* addrOther; -! -! // initialize -! addrPreferred = NULL; -! addrOther = NULL; -! -! // scan through the neighbor table, and populate addrPreferred and addrOther -! for (i=0;i<MAXNUMNEIGHBORS;i++) { -! if (neighbors_vars.neighbors[i].used==1) { -! timeSinceHeard = ieee154e_asnDiff(&neighbors_vars.neighbors[i].asn); -! if (timeSinceHeard>KATIMEOUT) { -! // this neighbor needs to be KA'ed to -! if (neighbors_vars.neighbors[i].parentPreference==MAXPREFERENCE) { -! // its a preferred parent -! addrPreferred = &(neighbors_vars.neighbors[i].addr_64b); -! } else { -! // its not a preferred parent -! // Note: commented out since policy is not to KA to non-preferred parents -! // addrOther = &(neighbors_vars.neighbors[i].addr_64b); -! } -! } -! } -! } -! -! // return the addr of the most urgent KA to send: -! // - if available, preferred parent -! // - if not, non preferred parent -! if (addrPreferred!=NULL) { -! return addrPreferred; -! } else if (addrOther!=NULL) { -! return addrOther; -! } else { -! return NULL; -! } -! } -! -! -! //===== interrogators -! -! /** -! \brief Indicate whether some neighbor is a stable neighbor -! -! \param[in] address The address of the neighbor, a full 128-bit IPv6 addres. -! -! \returns TRUE if that neighbor is stable, FALSE otherwise. -! */ -! bool neighbors_isStableNeighbor(open_addr_t* address) { -! uint8_t i; -! open_addr_t temp_addr_64b; -! open_addr_t temp_prefix; -! bool returnVal; -! -! // by default, not stable -! returnVal = FALSE; -! -! // but neighbor's IPv6 address in prefix and EUI64 -! switch (address->type) { -! case ADDR_128B: -! packetfunctions_ip128bToMac64b(address,&temp_prefix,&temp_addr_64b); -! break; -! default: -! openserial_printCritical(COMPONENT_NEIGHBORS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)address->type, -! (errorparameter_t)0); -! return returnVal; -! } -! -! // iterate through neighbor table -! for (i=0;i<MAXNUMNEIGHBORS;i++) { -! if (isThisRowMatching(&temp_addr_64b,i) && neighbors_vars.neighbors[i].stableNeighbor==TRUE) { -! returnVal = TRUE; -! break; -! } -! } -! -! return returnVal; -! } -! -! /** -! \brief Indicate whether some neighbor is a preferred neighbor. -! -! \param[in] address The EUI64 address of the neighbor. -! -! \returns TRUE if that neighbor is preferred, FALSE otherwise. -! */ -! bool neighbors_isPreferredParent(open_addr_t* address) { -! uint8_t i; -! bool returnVal; -! -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! -! // by default, not preferred -! returnVal = FALSE; -! -! // iterate through neighbor table -! for (i=0;i<MAXNUMNEIGHBORS;i++) { -! if (isThisRowMatching(address,i) && neighbors_vars.neighbors[i].parentPreference==MAXPREFERENCE) { -! returnVal = TRUE; -! break; -! } -! } -! -! ENABLE_INTERRUPTS(); -! return returnVal; -! } -! -! /** -! \brief Indicate whether some neighbor has a lower DAG rank that me. -! -! \param[in] index The index of that neighbor in the neighbor table. -! -! \returns TRUE if that neighbor has a lower DAG rank than me, FALSE otherwise. -! */ -! bool neighbors_isNeighborWithLowerDAGrank(uint8_t index) { -! bool returnVal; -! -! if (neighbors_vars.neighbors[index].used==TRUE && -! neighbors_vars.neighbors[index].DAGrank < neighbors_getMyDAGrank()) { -! returnVal = TRUE; -! } else { -! returnVal = FALSE; -! } -! -! return returnVal; -! } -! -! -! /** -! \brief Indicate whether some neighbor has a lower DAG rank that me. -! -! \param[in] index The index of that neighbor in the neighbor table. -! -! \returns TRUE if that neighbor has a lower DAG rank than me, FALSE otherwise. -! */ -! bool neighbors_isNeighborWithHigherDAGrank(uint8_t index) { -! bool returnVal; -! -! if (neighbors_vars.neighbors[index].used==TRUE && -! neighbors_vars.neighbors[index].DAGrank >= neighbors_getMyDAGrank()) { -! returnVal = TRUE; -! } else { -! returnVal = FALSE; -! } -! -! return returnVal; -! } -! -! //===== updating neighbor information -! -! /** -! \brief Indicate some (non-ACK) packet was received from a neighbor. -! -! This function should be called for each received (non-ACK) packet so neighbor -! statistics in the neighbor table can be updated. -! -! The fields which are updated are: -! - numRx -! - rssi -! - asn -! - stableNeighbor -! - switchStabilityCounter -! -! \param[in] l2_src MAC source address of the packet, i.e. the neighbor who sent -! the packet just received. -! \param[in] rssi RSSI with which this packet was received. -! \param[in] asnTs ASN at which this packet was received. -! */ -! void neighbors_indicateRx(open_addr_t* l2_src, -! int8_t rssi, -! asn_t* asnTs, -! bool joinPrioPresent, -! uint8_t joinPrio) { -! uint8_t i; -! bool newNeighbor; -! -! // update existing neighbor -! newNeighbor = TRUE; -! for (i=0;i<MAXNUMNEIGHBORS;i++) { -! if (isThisRowMatching(l2_src,i)) { -! -! // this is not a new neighbor -! newNeighbor = FALSE; -! -! // update numRx, rssi, asn -! neighbors_vars.neighbors[i].numRx++; -! neighbors_vars.neighbors[i].rssi=rssi; -! memcpy(&neighbors_vars.neighbors[i].asn,asnTs,sizeof(asn_t)); -! //update jp -! if (joinPrioPresent==TRUE){ -! neighbors_vars.neighbors[i].joinPrio=joinPrio; -! } -! -! // update stableNeighbor, switchStabilityCounter -! if (neighbors_vars.neighbors[i].stableNeighbor==FALSE) { -! if (neighbors_vars.neighbors[i].rssi>BADNEIGHBORMAXRSSI) { -! neighbors_vars.neighbors[i].switchStabilityCounter++; -! if (neighbors_vars.neighbors[i].switchStabilityCounter>=SWITCHSTABILITYTHRESHOLD) { -! neighbors_vars.neighbors[i].switchStabilityCounter=0; -! neighbors_vars.neighbors[i].stableNeighbor=TRUE; -! } -! } else { -! neighbors_vars.neighbors[i].switchStabilityCounter=0; -! } -! } else if (neighbors_vars.neighbors[i].stableNeighbor==TRUE) { -! if (neighbors_vars.neighbors[i].rssi<GOODNEIGHBORMINRSSI) { -! neighbors_vars.neighbors[i].switchStabilityCounter++; -! if (neighbors_vars.neighbors[i].switchStabilityCounter>=SWITCHSTABILITYTHRESHOLD) { -! neighbors_vars.neighbors[i].switchStabilityCounter=0; -! neighbors_vars.neighbors[i].stableNeighbor=FALSE; -! } -! } else { -! neighbors_vars.neighbors[i].switchStabilityCounter=0; -! } -! } -! -! // stop looping -! break; -! } -! } -! -! // register new neighbor -! if (newNeighbor==TRUE) { -! registerNewNeighbor(l2_src, rssi, asnTs, joinPrioPresent,joinPrio); -! } -! } -! -! /** -! \brief Indicate some packet was sent to some neighbor. -! -! This function should be called for each transmitted (non-ACK) packet so -! neighbor statistics in the neighbor table can be updated. -! -! The fields which are updated are: -! - numTx -! - numTxACK -! - asn -! -! \param[in] l2_dest MAC destination address of the packet, i.e. the neighbor -! who I just sent the packet to. -! \param[in] numTxAttempts Number of transmission attempts to this neighbor. -! \param[in] was_finally_acked TRUE iff the packet was ACK'ed by the neighbor -! on final transmission attempt. -! \param[in] asnTs ASN of the last transmission attempt. -! */ -! void neighbors_indicateTx(open_addr_t* l2_dest, -! uint8_t numTxAttempts, -! bool was_finally_acked, -! asn_t* asnTs) { -! uint8_t i; -! // don't run through this function if packet was sent to broadcast address -! if (packetfunctions_isBroadcastMulticast(l2_dest)==TRUE) { -! return; -! } -! -! // loop through neighbor table -! for (i=0;i<MAXNUMNEIGHBORS;i++) { -! if (isThisRowMatching(l2_dest,i)) { -! // handle roll-over case -! -! if (neighbors_vars.neighbors[i].numTx>(0xff-numTxAttempts)) { -! neighbors_vars.neighbors[i].numWraps++; //counting the number of times that tx wraps. -! neighbors_vars.neighbors[i].numTx/=2; -! neighbors_vars.neighbors[i].numTxACK/=2; -! } -! // update statistics -! neighbors_vars.neighbors[i].numTx += numTxAttempts; -! -! if (was_finally_acked==TRUE) { -! neighbors_vars.neighbors[i].numTxACK++; -! memcpy(&neighbors_vars.neighbors[i].asn,asnTs,sizeof(asn_t)); -! } -! break; -! } -! } -! } -! -! /** -! \brief Indicate I just received a RPL DIO from a neighbor. -! -! This function should be called for each received a DIO is received so neighbor -! routing information in the neighbor table can be updated. -! -! The fields which are updated are: -! - DAGrank -! -! \param[in] msg The received message with msg->payload pointing to the DIO -! header. -! */ -! void neighbors_indicateRxDIO(OpenQueueEntry_t* msg) { -! uint8_t i; -! -! // take ownership over the packet -! msg->owner = COMPONENT_NEIGHBORS; -! -! // update rank of that neighbor in table -! neighbors_vars.dio = (icmpv6rpl_dio_ht*)(msg->payload); -! if (isNeighbor(&(msg->l2_nextORpreviousHop))==TRUE) { -! for (i=0;i<MAXNUMNEIGHBORS;i++) { -! if (isThisRowMatching(&(msg->l2_nextORpreviousHop),i)) { -! if ( -! neighbors_vars.dio->rank > neighbors_vars.neighbors[i].DAGrank && -! neighbors_vars.dio->rank - neighbors_vars.neighbors[i].DAGrank >(DEFAULTLINKCOST*2*MINHOPRANKINCREASE) -! ) { -! // the new DAGrank looks suspiciously high, only increment a bit -! neighbors_vars.neighbors[i].DAGrank += (DEFAULTLINKCOST*2*MINHOPRANKINCREASE); -! openserial_printError(COMPONENT_NEIGHBORS,ERR_LARGE_DAGRANK, -! (errorparameter_t)neighbors_vars.dio->rank, -! (errorparameter_t)neighbors_vars.neighbors[i].DAGrank); -! } else { -! neighbors_vars.neighbors[i].DAGrank = neighbors_vars.dio->rank; -! } -! break; -! } -! } -! } -! // update my routing information -! neighbors_updateMyDAGrankAndNeighborPreference(); -! } -! -! //===== write addresses -! -! /** -! \brief Write the 64-bit address of some neighbor to some location. -! -! */ -! -! void neighbors_getNeighbor(open_addr_t* address,uint8_t addr_type,uint8_t index){ -! switch(addr_type) { -! case ADDR_64B: -! memcpy(&(address->addr_64b),&(neighbors_vars.neighbors[index].addr_64b.addr_64b),LENGTH_ADDR64b); -! address->type=ADDR_64B; -! break; -! default: -! openserial_printCritical(COMPONENT_NEIGHBORS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)addr_type, -! (errorparameter_t)1); -! break; -! } -! } -! -! -! //===== managing routing info -! -! /** -! \brief Update my DAG rank and neighbor preference. -! -! Call this function whenever some data is changed that could cause this mote's -! routing decisions to change. Examples are: -! - I received a DIO which updated by neighbor table. If this DIO indicated a -! very low DAGrank, I may want to change by routing parent. -! - I became a DAGroot, so my DAGrank should be 0. -! */ -! void neighbors_updateMyDAGrankAndNeighborPreference(void) { -! uint8_t i; -! uint16_t rankIncrease; -! uint32_t tentativeDAGrank; // 32-bit since is used to sum -! uint8_t prefParentIdx; -! bool prefParentFound; -! -! // if I'm a DAGroot, my DAGrank is always 0 -! if ((idmanager_getIsDAGroot())==TRUE) { -! neighbors_vars.myDAGrank=0; -! return; -! } -! -! // reset my DAG rank to max value. May be lowered below. -! neighbors_vars.myDAGrank = MAXDAGRANK; -! -! // by default, I haven't found a preferred parent -! prefParentFound = FALSE; -! prefParentIdx = 0; -! -! // loop through neighbor table, update myDAGrank -! for (i=0;i<MAXNUMNEIGHBORS;i++) { -! if (neighbors_vars.neighbors[i].used==TRUE) { -! // reset parent preference -! neighbors_vars.neighbors[i].parentPreference=0; -! // calculate link cost to this neighbor -! if (neighbors_vars.neighbors[i].numTxACK==0) { -! rankIncrease = DEFAULTLINKCOST*2*MINHOPRANKINCREASE; -! } else { -! //6TiSCH minimal draft using OF0 for rank computation -! rankIncrease = (uint16_t)((((float)neighbors_vars.neighbors[i].numTx)/((float)neighbors_vars.neighbors[i].numTxACK))*2*MINHOPRANKINCREASE); -! } -! tentativeDAGrank = neighbors_vars.neighbors[i].DAGrank+rankIncrease; -! if ( tentativeDAGrank<neighbors_vars.myDAGrank && -! tentativeDAGrank<MAXDAGRANK) { -! // found better parent, lower my DAGrank -! neighbors_vars.myDAGrank = tentativeDAGrank; -! prefParentFound = TRUE; -! prefParentIdx = i; -! } -! } -! } -! -! // update preferred parent -! if (prefParentFound) { -! neighbors_vars.neighbors[prefParentIdx].parentPreference = MAXPREFERENCE; -! neighbors_vars.neighbors[prefParentIdx].stableNeighbor = TRUE; -! neighbors_vars.neighbors[prefParentIdx].switchStabilityCounter = 0; -! } -! } -! -! //===== debug -! -! /** -! \brief Triggers this module to print status information, over serial. -! -! debugPrint_* functions are used by the openserial module to continuously print -! status information about several modules in the OpenWSN stack. -! -! \returns TRUE if this function printed something, FALSE otherwise. -! */ -! bool debugPrint_neighbors(void) { -! debugNeighborEntry_t temp; -! neighbors_vars.debugRow=(neighbors_vars.debugRow+1)%MAXNUMNEIGHBORS; -! temp.row=neighbors_vars.debugRow; -! temp.neighborEntry=neighbors_vars.neighbors[neighbors_vars.debugRow]; -! openserial_printStatus(STATUS_NEIGHBORS,(uint8_t*)&temp,sizeof(debugNeighborEntry_t)); -! return TRUE; -! } -! -! void debugNetPrint_neighbors(netDebugNeigborEntry_t* out){ -! uint8_t idxIn; -! uint8_t idxOut; -! -! idxOut=0; -! for (idxIn=0;idxIn<MAXNUMNEIGHBORS;idxIn++) { -! if(neighbors_vars.neighbors[idxIn].used) { -! out[idxOut].last_addr_byte = neighbors_vars.neighbors[idxIn].addr_64b.addr_64b[7];//last byte of the address; poipoi could be [0]; endianness -! out[idxOut].rssi = neighbors_vars.neighbors[idxIn].rssi; -! out[idxOut].parentPreference = neighbors_vars.neighbors[idxIn].parentPreference; -! out[idxOut].DAGrank = neighbors_vars.neighbors[idxIn].DAGrank; -! memcpy( -! &out[idxOut].asn, -! &neighbors_vars.neighbors[idxIn].asn.bytes0and1, -! sizeof(neighbors_vars.neighbors[idxIn].asn.bytes0and1) -! ); -! idxOut++; -! } -! } -! } -! -! //=========================== private ========================================= -! -! void registerNewNeighbor(open_addr_t* address, -! int8_t rssi, -! asn_t* asnTimestamp, -! bool joinPrioPresent, -! uint8_t joinPrio) { -! uint8_t i,j; -! bool iHaveAPreferedParent; -! // filter errors -! if (address->type!=ADDR_64B) { -! openserial_printCritical(COMPONENT_NEIGHBORS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)address->type, -! (errorparameter_t)2); -! return; -! } -! // add this neighbor -! if (isNeighbor(address)==FALSE) { -! i=0; -! while(i<MAXNUMNEIGHBORS) { -! if (neighbors_vars.neighbors[i].used==FALSE) { -! // add this neighbor -! neighbors_vars.neighbors[i].used = TRUE; -! neighbors_vars.neighbors[i].parentPreference = 0; -! // neighbors_vars.neighbors[i].stableNeighbor = FALSE; -! // Note: all new neighbors are consider stable -! neighbors_vars.neighbors[i].stableNeighbor = TRUE; -! neighbors_vars.neighbors[i].switchStabilityCounter = 0; -! memcpy(&neighbors_vars.neighbors[i].addr_64b,address,sizeof(open_addr_t)); -! neighbors_vars.neighbors[i].DAGrank = DEFAULTDAGRANK; -! neighbors_vars.neighbors[i].rssi = rssi; -! neighbors_vars.neighbors[i].numRx = 1; -! neighbors_vars.neighbors[i].numTx = 0; -! neighbors_vars.neighbors[i].numTxACK = 0; -! memcpy(&neighbors_vars.neighbors[i].asn,asnTimestamp,sizeof(asn_t)); -! //update jp -! if (joinPrioPresent==TRUE){ -! neighbors_vars.neighbors[i].joinPrio=joinPrio; -! } -! -! -! // do I already have a preferred parent ? -- TODO change to use JP -! iHaveAPreferedParent = FALSE; -! for (j=0;j<MAXNUMNEIGHBORS;j++) { -! if (neighbors_vars.neighbors[j].parentPreference==MAXPREFERENCE) { -! iHaveAPreferedParent = TRUE; -! } -! } -! // if I have none, and I'm not DAGroot, the new neighbor is my preferred -! if (iHaveAPreferedParent==FALSE && idmanager_getIsDAGroot()==FALSE) { -! neighbors_vars.neighbors[i].parentPreference = MAXPREFERENCE; -! } -! break; -! } -! i++; -! } -! if (i==MAXNUMNEIGHBORS) { -! openserial_printError(COMPONENT_NEIGHBORS,ERR_NEIGHBORS_FULL, -! (errorparameter_t)MAXNUMNEIGHBORS, -! (errorparameter_t)0); -! return; -! } -! } -! -! } -! -! bool isNeighbor(open_addr_t* neighbor) { -! uint8_t i=0; -! for (i=0;i<MAXNUMNEIGHBORS;i++) { -! if (isThisRowMatching(neighbor,i)) { -! return TRUE; -! } -! } -! return FALSE; -! } -! -! void removeNeighbor(uint8_t neighborIndex) { -! neighbors_vars.neighbors[neighborIndex].used = FALSE; -! neighbors_vars.neighbors[neighborIndex].parentPreference = 0; -! neighbors_vars.neighbors[neighborIndex].stableNeighbor = FALSE; -! neighbors_vars.neighbors[neighborIndex].switchStabilityCounter = 0; -! //neighbors_vars.neighbors[neighborIndex].addr_16b.type = ADDR_NONE; // to save RAM -! neighbors_vars.neighbors[neighborIndex].addr_64b.type = ADDR_NONE; -! //neighbors_vars.neighbors[neighborIndex].addr_128b.type = ADDR_NONE; // to save RAM -! neighbors_vars.neighbors[neighborIndex].DAGrank = DEFAULTDAGRANK; -! neighbors_vars.neighbors[neighborIndex].rssi = 0; -! neighbors_vars.neighbors[neighborIndex].numRx = 0; -! neighbors_vars.neighbors[neighborIndex].numTx = 0; -! neighbors_vars.neighbors[neighborIndex].numTxACK = 0; -! neighbors_vars.neighbors[neighborIndex].asn.bytes0and1 = 0; -! neighbors_vars.neighbors[neighborIndex].asn.bytes2and3 = 0; -! neighbors_vars.neighbors[neighborIndex].asn.byte4 = 0; -! } -! -! //=========================== helpers ========================================= -! -! bool isThisRowMatching(open_addr_t* address, uint8_t rowNumber) { -! switch (address->type) { -! case ADDR_64B: -! return neighbors_vars.neighbors[rowNumber].used && -! packetfunctions_sameAddress(address,&neighbors_vars.neighbors[rowNumber].addr_64b); -! default: -! openserial_printCritical(COMPONENT_NEIGHBORS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)address->type, -! (errorparameter_t)3); -! return FALSE; -! } -! } -diff -crB openwsn/02b-MAChigh/neighbors.h ../../../sys/net/openwsn/02b-MAChigh/neighbors.h -*** openwsn/02b-MAChigh/neighbors.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/02b-MAChigh/neighbors.h Wed Jan 15 13:48:26 2014 -*************** -*** 1,103 **** -! #ifndef __NEIGHBORS_H -! #define __NEIGHBORS_H -! -! /** -! \addtogroup MAChigh -! \{ -! \addtogroup Neighbors -! \{ -! */ -! #include "openwsn.h" -! #include "icmpv6rpl.h" -! -! //=========================== define ========================================== -! -! #define MAXNUMNEIGHBORS 10 -! #define MAXPREFERENCE 2 -! #define BADNEIGHBORMAXRSSI -80 //dBm -! #define GOODNEIGHBORMINRSSI -90 //dBm -! #define SWITCHSTABILITYTHRESHOLD 3 -! #define DEFAULTLINKCOST 15 -! -! #define MAXDAGRANK 0xffff -! #define DEFAULTDAGRANK MAXDAGRANK -! -! //=========================== typedef ========================================= -! -! PRAGMA(pack(1)); -! typedef struct { -! bool used; -! uint8_t parentPreference; -! bool stableNeighbor; -! uint8_t switchStabilityCounter; -! open_addr_t addr_64b; -! dagrank_t DAGrank; -! int8_t rssi; -! uint8_t numRx; -! uint8_t numTx; -! uint8_t numTxACK; -! uint8_t numWraps;//number of times the tx counter wraps. can be removed if memory is a restriction. also check openvisualizer then. -! asn_t asn; -! } neighborRow_t; -! PRAGMA(pack()); -! -! PRAGMA(pack(1)); -! typedef struct { -! uint8_t row; -! neighborRow_t neighborEntry; -! } debugNeighborEntry_t; -! PRAGMA(pack()); -! -! PRAGMA(pack(1)); -! typedef struct { -! uint8_t last_addr_byte; // last byte of the neighbor's address -! int8_t rssi; -! uint8_t parentPreference; -! dagrank_t DAGrank; -! uint16_t asn; -! } netDebugNeigborEntry_t; -! PRAGMA(pack()); -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void neighbors_init(); -! // getters -! dagrank_t neighbors_getMyDAGrank(); -! uint8_t neighbors_getNumNeighbors(); -! bool neighbors_getPreferredParentEui64(open_addr_t* addressToWrite); -! open_addr_t* neighbors_getKANeighbor(); -! // interrogators -! bool neighbors_isStableNeighbor(open_addr_t* address); -! bool neighbors_isPreferredParent(open_addr_t* address); -! bool neighbors_isNeighborWithLowerDAGrank(uint8_t index); -! bool neighbors_isNeighborWithHigherDAGrank(uint8_t index); -! -! // updating neighbor information -! void neighbors_indicateRx( -! open_addr_t* l2_src, -! int8_t rssi, -! asn_t* asnTimestamp -! ); -! void neighbors_indicateTx( -! open_addr_t* dest, -! uint8_t numTxAttempts, -! bool was_finally_acked, -! asn_t* asnTimestamp -! ); -! void neighbors_indicateRxDIO(OpenQueueEntry_t* msg); -! // get addresses -! void neighbors_getNeighbor(open_addr_t* address,uint8_t addr_type,uint8_t index); -! // managing routing info -! void neighbors_updateMyDAGrankAndNeighborPreference(); -! // debug -! bool debugPrint_neighbors(); -! void debugNetPrint_neighbors(netDebugNeigborEntry_t* schlist); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,116 ---- -! #ifndef __NEIGHBORS_H -! #define __NEIGHBORS_H -! -! /** -! \addtogroup MAChigh -! \{ -! \addtogroup Neighbors -! \{ -! */ -! #include "openwsn.h" -! #include "icmpv6rpl.h" -! -! //=========================== define ========================================== -! -! #define MAXNUMNEIGHBORS 10 -! #define MAXPREFERENCE 2 -! #define BADNEIGHBORMAXRSSI -80 //dBm -! #define GOODNEIGHBORMINRSSI -90 //dBm -! #define SWITCHSTABILITYTHRESHOLD 3 -! #define DEFAULTLINKCOST 15 -! -! #define MAXDAGRANK 0xffff -! #define DEFAULTDAGRANK MAXDAGRANK -! #define MINHOPRANKINCREASE 256 //default value in RPL and Minimal 6TiSCH draft -! -! //=========================== typedef ========================================= -! -! //PRAGMA(pack(1)); -! typedef struct { -! bool used; -! uint8_t parentPreference; -! bool stableNeighbor; -! uint8_t switchStabilityCounter; -! open_addr_t addr_64b; -! dagrank_t DAGrank; -! int8_t rssi; -! uint8_t numRx; -! uint8_t numTx; -! uint8_t numTxACK; -! uint8_t numWraps;//number of times the tx counter wraps. can be removed if memory is a restriction. also check openvisualizer then. -! asn_t asn; -! uint8_t joinPrio; -! } neighborRow_t; -! //PRAGMA(pack()); -! -! //PRAGMA(pack(1)); -! typedef struct { -! uint8_t row; -! neighborRow_t neighborEntry; -! } debugNeighborEntry_t; -! //PRAGMA(pack()); -! -! //PRAGMA(pack(1)); -! typedef struct { -! uint8_t last_addr_byte; // last byte of the neighbor's address -! int8_t rssi; -! uint8_t parentPreference; -! dagrank_t DAGrank; -! uint16_t asn; -! } netDebugNeigborEntry_t; -! //PRAGMA(pack()); -! -! //=========================== module variables ================================ -! -! typedef struct { -! neighborRow_t neighbors[MAXNUMNEIGHBORS]; -! dagrank_t myDAGrank; -! uint8_t debugRow; -! icmpv6rpl_dio_ht* dio; //keep it global to be able to debug correctly. -! } neighbors_vars_t; -! -! //=========================== prototypes ====================================== -! -! void neighbors_init(void); -! // getters -! dagrank_t neighbors_getMyDAGrank(void); -! uint8_t neighbors_getNumNeighbors(void); -! bool neighbors_getPreferredParentEui64(open_addr_t* addressToWrite); -! open_addr_t* neighbors_getKANeighbor(void); -! -! // interrogators -! bool neighbors_isStableNeighbor(open_addr_t* address); -! bool neighbors_isPreferredParent(open_addr_t* address); -! bool neighbors_isNeighborWithLowerDAGrank(uint8_t index); -! bool neighbors_isNeighborWithHigherDAGrank(uint8_t index); -! -! // updating neighbor information -! void neighbors_indicateRx( -! open_addr_t* l2_src, -! int8_t rssi, -! asn_t* asnTimestamp, -! bool joinPrioPresent, -! uint8_t joinPrio -! ); -! -! void neighbors_indicateTx( -! open_addr_t* dest, -! uint8_t numTxAttempts, -! bool was_finally_acked, -! asn_t* asnTimestamp -! ); -! void neighbors_indicateRxDIO(OpenQueueEntry_t* msg); -! // get addresses -! void neighbors_getNeighbor(open_addr_t* address,uint8_t addr_type,uint8_t index); -! // managing routing info -! void neighbors_updateMyDAGrankAndNeighborPreference(void); -! // debug -! bool debugPrint_neighbors(void); -! void debugNetPrint_neighbors(netDebugNeigborEntry_t* schlist); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/02b-MAChigh/res.c ../../../sys/net/openwsn/02b-MAChigh/res.c -*** openwsn/02b-MAChigh/res.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/02b-MAChigh/res.c Wed Jan 15 13:48:26 2014 -*************** -*** 1,355 **** -! #include "openwsn.h" -! #include "res.h" -! #include "openserial.h" -! #include "openqueue.h" -! #include "neighbors.h" -! #include "IEEE802154E.h" -! #include "iphc.h" -! #include "packetfunctions.h" -! #include "openrandom.h" -! #include "scheduler.h" -! #include "opentimers.h" -! #include "debugpins.h" -! //=========================== variables ======================================= -! -! typedef struct { -! uint16_t periodMaintenance; -! bool busySendingKa; // TRUE when busy sending a keep-alive -! bool busySendingAdv; // TRUE when busy sending an advertisement -! uint8_t dsn; // current data sequence number -! uint8_t MacMgtTaskCounter; // counter to determine what management task to do -! opentimer_id_t timerId; -! } res_vars_t; -! -! res_vars_t res_vars; -! -! //=========================== prototypes ====================================== -! -! error_t res_send_internal(OpenQueueEntry_t* msg); -! void sendAdv(); -! void sendKa(); -! void res_timer_cb(); -! -! //=========================== public ========================================== -! -! void res_init() { -! res_vars.periodMaintenance = 872+(openrandom_get16b()&0xff); // fires every 1 sec on average -! res_vars.busySendingKa = FALSE; -! res_vars.busySendingAdv = FALSE; -! res_vars.dsn = 0; -! res_vars.MacMgtTaskCounter = 0; -! res_vars.timerId = opentimers_start(res_vars.periodMaintenance, -! TIMER_PERIODIC,TIME_MS, -! res_timer_cb); -! } -! -! /** -! \brief Trigger this module to print status information, over serial. -! -! debugPrint_* functions are used by the openserial module to continuously print -! status information about several modules in the OpenWSN stack. -! -! \returns TRUE if this function printed something, FALSE otherwise. -! */ -! bool debugPrint_myDAGrank() { -! uint8_t output=0; -! output = neighbors_getMyDAGrank(); -! openserial_printStatus(STATUS_DAGRANK,(uint8_t*)&output,sizeof(uint8_t)); -! return TRUE; -! } -! -! //======= from upper layer -! -! error_t res_send(OpenQueueEntry_t *msg) { -! msg->owner = COMPONENT_RES; -! msg->l2_frameType = IEEE154_TYPE_DATA; -! return res_send_internal(msg); -! } -! -! //======= from lower layer -! -! void task_resNotifSendDone() { -! OpenQueueEntry_t* msg; -! // get recently-sent packet from openqueue -! msg = openqueue_resGetSentPacket(); -! if (msg==NULL) { -! // log the error -! openserial_printCritical(COMPONENT_RES,ERR_NO_SENT_PACKET, -! (errorparameter_t)0, -! (errorparameter_t)0); -! // abort -! return; -! } -! // declare it as mine -! msg->owner = COMPONENT_RES; -! // indicate transmission (to update statistics) -! if (msg->l2_sendDoneError==E_SUCCESS) { -! neighbors_indicateTx(&(msg->l2_nextORpreviousHop), -! msg->l2_numTxAttempts, -! TRUE, -! &msg->l2_asn); -! } else { -! neighbors_indicateTx(&(msg->l2_nextORpreviousHop), -! msg->l2_numTxAttempts, -! FALSE, -! &msg->l2_asn); -! } -! // send the packet to where it belongs -! if (msg->creator == COMPONENT_RES) { -! if (msg->l2_frameType==IEEE154_TYPE_BEACON) { -! // this is a ADV -! -! // not busy sending ADV anymore -! res_vars.busySendingAdv = FALSE; -! } else { -! // this is a KA -! -! // not busy sending KA anymore -! res_vars.busySendingKa = FALSE; -! } -! // discard packets -! openqueue_freePacketBuffer(msg); -! // restart a random timer -! res_vars.periodMaintenance = 872+(openrandom_get16b()&0xff); -! opentimers_setPeriod(res_vars.timerId, -! TIME_MS, -! res_vars.periodMaintenance); -! } else { -! // send the rest up the stack -! iphc_sendDone(msg,msg->l2_sendDoneError); -! } -! } -! -! void task_resNotifReceive() { -! OpenQueueEntry_t* msg; -! -! // get received packet from openqueue -! msg = openqueue_resGetReceivedPacket(); -! if (msg==NULL) { -! // log the error -! openserial_printCritical(COMPONENT_RES,ERR_NO_RECEIVED_PACKET, -! (errorparameter_t)0, -! (errorparameter_t)0); -! // abort -! return; -! } -! -! // declare it as mine -! msg->owner = COMPONENT_RES; -! -! // indicate reception (to update statistics) -! neighbors_indicateRx(&(msg->l2_nextORpreviousHop), -! msg->l1_rssi, -! &msg->l2_asn); -! -! // send the packet up the stack, if it qualifies -! switch (msg->l2_frameType) { -! case IEEE154_TYPE_BEACON: -! case IEEE154_TYPE_DATA: -! case IEEE154_TYPE_CMD: -! if (msg->length>0) { -! // send to upper layer -! iphc_receive(msg); -! } else { -! // free up the RAM -! openqueue_freePacketBuffer(msg); -! } -! break; -! case IEEE154_TYPE_ACK: -! default: -! // free the packet's RAM memory -! openqueue_freePacketBuffer(msg); -! // log the error -! openserial_printError(COMPONENT_RES,ERR_MSG_UNKNOWN_TYPE, -! (errorparameter_t)msg->l2_frameType, -! (errorparameter_t)0); -! break; -! } -! } -! -! //======= timer -! -! /** -! \brief Timer handlers which triggers MAC management task. -! -! This function is called in task context by the scheduler after the RES timer -! has fired. This timer is set to fire every second, on average. -! -! The body of this function executes one of the MAC management task. -! */ -! void timers_res_fired() { -! res_vars.MacMgtTaskCounter = (res_vars.MacMgtTaskCounter+1)%10; -! if (res_vars.MacMgtTaskCounter==0) { -! sendAdv(); // called every 10s -! } else { -! sendKa(); // called every second, except once every 10s -! } -! } -! -! //=========================== private ========================================= -! -! /** -! \brief Transfer packet to MAC. -! -! This function adds a IEEE802.15.4 header to the packet and leaves it the -! OpenQueue buffer. The very last thing it does is assigning this packet to the -! virtual component COMPONENT_RES_TO_IEEE802154E. Whenever it gets a change, -! IEEE802154E will handle the packet. -! -! \param [in] msg The packet to the transmitted -! -! \returns E_SUCCESS iff successful. -! */ -! error_t res_send_internal(OpenQueueEntry_t* msg) { -! // assign a number of retries -! if (packetfunctions_isBroadcastMulticast(&(msg->l2_nextORpreviousHop))==TRUE) { -! msg->l2_retriesLeft = 1; -! } else { -! msg->l2_retriesLeft = TXRETRIES; -! } -! // record this packet's dsn (for matching the ACK) -! msg->l2_dsn = res_vars.dsn++; -! // this is a new packet which I never attempted to send -! msg->l2_numTxAttempts = 0; -! // transmit with the default TX power -! msg->l1_txPower = TX_POWER; -! // record the location, in the packet, where the l2 payload starts -! msg->l2_payload = msg->payload; -! // add a IEEE802.15.4 header -! ieee802154_prependHeader(msg, -! msg->l2_frameType, -! IEEE154_SEC_NO_SECURITY, -! msg->l2_dsn, -! &(msg->l2_nextORpreviousHop) -! ); -! // reserve space for 2-byte CRC -! packetfunctions_reserveFooterSize(msg,2); -! // change owner to IEEE802154E fetches it from queue -! msg->owner = COMPONENT_RES_TO_IEEE802154E; -! return E_SUCCESS; -! } -! -! /** -! \brief Send an advertisement. -! -! This is one of the MAC managament tasks. This function inlines in the -! timers_res_fired() function, but is declared as a separate function for better -! readability of the code. -! */ -! port_INLINE void sendAdv() { -! OpenQueueEntry_t* adv; -! -! if (ieee154e_isSynch()==FALSE) { -! // I'm not sync'ed -! -! // delete packets genereted by this module (ADV and KA) from openqueue -! openqueue_removeAllCreatedBy(COMPONENT_RES); -! -! // I'm now busy sending an ADV -! res_vars.busySendingAdv = FALSE; -! -! // stop here -! return; -! } -! -! if (res_vars.busySendingAdv==TRUE) { -! // don't continue if I'm still sending a previous ADV -! } -! -! // if I get here, I will send an ADV -! -! // get a free packet buffer -! adv = openqueue_getFreePacketBuffer(COMPONENT_RES); -! if (adv==NULL) { -! openserial_printError(COMPONENT_RES,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return; -! } -! -! // declare ownership over that packet -! adv->creator = COMPONENT_RES; -! adv->owner = COMPONENT_RES; -! -! // reserve space for ADV-specific header -! packetfunctions_reserveHeaderSize(adv, ADV_PAYLOAD_LENGTH); -! // the actual value of the current ASN will be written by the -! // IEEE802.15.4e when transmitting -! -! // some l2 information about this packet -! adv->l2_frameType = IEEE154_TYPE_BEACON; -! adv->l2_nextORpreviousHop.type = ADDR_16B; -! adv->l2_nextORpreviousHop.addr_16b[0] = 0xff; -! adv->l2_nextORpreviousHop.addr_16b[1] = 0xff; -! -! // put in queue for MAC to handle -! res_send_internal(adv); -! -! // I'm now busy sending an ADV -! res_vars.busySendingAdv = TRUE; -! } -! -! /** -! \brief Send an keep-alive message, if nessary. -! -! This is one of the MAC managament tasks. This function inlines in the -! timers_res_fired() function, but is declared as a separate function for better -! readability of the code. -! */ -! port_INLINE void sendKa() { -! OpenQueueEntry_t* kaPkt; -! open_addr_t* kaNeighAddr; -! -! if (ieee154e_isSynch()==FALSE) { -! // I'm not sync'ed -! -! // delete packets genereted by this module (ADV and KA) from openqueue -! openqueue_removeAllCreatedBy(COMPONENT_RES); -! -! // I'm now busy sending a KA -! res_vars.busySendingKa = FALSE; -! -! // stop here -! return; -! } -! -! if (res_vars.busySendingKa==TRUE) { -! // don't proceed if I'm still sending a KA -! return; -! } -! -! kaNeighAddr = neighbors_getKANeighbor(); -! if (kaNeighAddr==NULL) { -! // don't proceed if I have no neighbor I need to send a KA to -! return; -! } -! -! // if I get here, I will send a KA -! -! // get a free packet buffer -! kaPkt = openqueue_getFreePacketBuffer(COMPONENT_RES); -! if (kaPkt==NULL) { -! openserial_printError(COMPONENT_RES,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)1, -! (errorparameter_t)0); -! return; -! } -! -! // declare ownership over that packet -! kaPkt->creator = COMPONENT_RES; -! kaPkt->owner = COMPONENT_RES; -! -! // some l2 information about this packet -! kaPkt->l2_frameType = IEEE154_TYPE_DATA; -! memcpy(&(kaPkt->l2_nextORpreviousHop),kaNeighAddr,sizeof(open_addr_t)); -! -! // put in queue for MAC to handle -! res_send_internal(kaPkt); -! -! // I'm now busy sending a KA -! res_vars.busySendingKa = TRUE; -! } -! -! void res_timer_cb() { -! scheduler_push_task(timers_res_fired,TASKPRIO_RES); - } -\ No newline at end of file ---- 1,463 ---- -! #include "openwsn.h" -! #include "res.h" -! #include "openserial.h" -! #include "openqueue.h" -! #include "neighbors.h" -! #include "IEEE802154E.h" -! #include "iphc.h" -! #include "packetfunctions.h" -! #include "openrandom.h" -! #include "scheduler.h" -! #include "opentimers.h" -! //#include "debugpins.h" -! -! #include "thread.h" -! -! -! //=========================== variables ======================================= -! -! res_vars_t res_vars; -! //static char openwsn_res_stack[KERNEL_CONF_STACKSIZE_MAIN]; -! -! //=========================== prototypes ====================================== -! -! owerror_t res_send_internal(OpenQueueEntry_t* msg, uint8_t iePresent,uint8_t frameVersion); -! void sendAdv(void); -! void sendKa(void); -! void res_timer_cb(void); -! uint8_t res_copySlotFrameAndLinkIE(OpenQueueEntry_t* adv);//returns reserved size -! -! //=========================== public ========================================== -! -! void res_init(void) { -! res_vars.periodMaintenance = 872+(openrandom_get16b()&0xff); // fires every 1 sec on average -! res_vars.busySendingKa = FALSE; -! res_vars.busySendingAdv = FALSE; -! res_vars.dsn = 0; -! res_vars.MacMgtTaskCounter = 0; -! res_vars.timerId = opentimers_start(res_vars.periodMaintenance, -! TIMER_PERIODIC,TIME_MS, -! res_timer_cb); -! } -! -! /** -! \brief Trigger this module to print status information, over serial. -! -! debugPrint_* functions are used by the openserial module to continuously print -! status information about several modules in the OpenWSN stack. -! -! \returns TRUE if this function printed something, FALSE otherwise. -! */ -! // TODO: was bool but complained "conflicting types" -! uint8_t debugPrint_myDAGrank(void) { -! uint16_t output=0; -! output = neighbors_getMyDAGrank(); -! openserial_printStatus(STATUS_DAGRANK,(uint8_t*)&output,sizeof(uint16_t)); -! return TRUE; -! } -! -! //======= from upper layer -! -! owerror_t res_send(OpenQueueEntry_t *msg) { -! msg->owner = COMPONENT_RES; -! msg->l2_frameType = IEEE154_TYPE_DATA; -! return res_send_internal(msg,IEEE154_IELIST_NO,IEEE154_FRAMEVERSION_2006); -! } -! -! //======= from lower layer -! -! void task_resNotifSendDone(void) { -! OpenQueueEntry_t* msg; -! // get recently-sent packet from openqueue -! msg = openqueue_resGetSentPacket(); -! if (msg==NULL) { -! // log the error -! openserial_printCritical(COMPONENT_RES,ERR_NO_SENT_PACKET, -! (errorparameter_t)0, -! (errorparameter_t)0); -! // abort -! return; -! } -! // declare it as mine -! msg->owner = COMPONENT_RES; -! // indicate transmission (to update statistics) -! if (msg->l2_sendDoneError==E_SUCCESS) { -! neighbors_indicateTx(&(msg->l2_nextORpreviousHop), -! msg->l2_numTxAttempts, -! TRUE, -! &msg->l2_asn); -! } else { -! neighbors_indicateTx(&(msg->l2_nextORpreviousHop), -! msg->l2_numTxAttempts, -! FALSE, -! &msg->l2_asn); -! } -! // send the packet to where it belongs -! if (msg->creator == COMPONENT_RES) { -! if (msg->l2_frameType==IEEE154_TYPE_BEACON) { -! // this is a ADV -! -! // not busy sending ADV anymore -! res_vars.busySendingAdv = FALSE; -! } else { -! // this is a KA -! -! // not busy sending KA anymore -! res_vars.busySendingKa = FALSE; -! } -! // discard packets -! openqueue_freePacketBuffer(msg); -! // restart a random timer -! res_vars.periodMaintenance = 872+(openrandom_get16b()&0xff); -! opentimers_setPeriod(res_vars.timerId, -! TIME_MS, -! res_vars.periodMaintenance); -! } else { -! // send the rest up the stack -! iphc_sendDone(msg,msg->l2_sendDoneError); -! } -! } -! -! void task_resNotifReceive(void) { -! OpenQueueEntry_t* msg; -! -! // get received packet from openqueue -! msg = openqueue_resGetReceivedPacket(); -! if (msg==NULL) { -! // log the error -! openserial_printCritical(COMPONENT_RES,ERR_NO_RECEIVED_PACKET, -! (errorparameter_t)0, -! (errorparameter_t)0); -! // abort -! return; -! } -! -! // declare it as mine -! msg->owner = COMPONENT_RES; -! -! // indicate reception (to update statistics) -! neighbors_indicateRx(&(msg->l2_nextORpreviousHop), -! msg->l1_rssi, -! &msg->l2_asn, -! msg->l2_joinPriorityPresent, -! msg->l2_joinPriority); -! -! msg->l2_joinPriorityPresent=FALSE; //reset it to avoid race conditions with this var. -! -! // send the packet up the stack, if it qualifies -! switch (msg->l2_frameType) { -! case IEEE154_TYPE_BEACON: -! case IEEE154_TYPE_DATA: -! case IEEE154_TYPE_CMD: -! if (msg->length>0) { -! // send to upper layer -! iphc_receive(msg); -! } else { -! // free up the RAM -! openqueue_freePacketBuffer(msg); -! } -! break; -! case IEEE154_TYPE_ACK: -! default: -! // free the packet's RAM memory -! openqueue_freePacketBuffer(msg); -! // log the error -! openserial_printError(COMPONENT_RES,ERR_MSG_UNKNOWN_TYPE, -! (errorparameter_t)msg->l2_frameType, -! (errorparameter_t)0); -! break; -! } -! } -! -! //======= timer -! -! /** -! \brief Timer handlers which triggers MAC management task. -! -! This function is called in task context by the scheduler after the RES timer -! has fired. This timer is set to fire every second, on average. -! -! The body of this function executes one of the MAC management task. -! */ -! void timers_res_fired(void) { -! res_vars.MacMgtTaskCounter = (res_vars.MacMgtTaskCounter+1)%10; -! if (res_vars.MacMgtTaskCounter==0) { -! sendAdv(); // called every 10s -! } else { -! sendKa(); // called every second, except once every 10s -! //leds_debug_toggle(); -! } -! } -! -! //=========================== private ========================================= -! -! /** -! \brief Transfer packet to MAC. -! -! This function adds a IEEE802.15.4 header to the packet and leaves it the -! OpenQueue buffer. The very last thing it does is assigning this packet to the -! virtual component COMPONENT_RES_TO_IEEE802154E. Whenever it gets a change, -! IEEE802154E will handle the packet. -! -! \param[in] msg The packet to the transmitted -! -! \returns E_SUCCESS iff successful. -! */ -! owerror_t res_send_internal(OpenQueueEntry_t* msg, uint8_t iePresent, uint8_t frameVersion) { -! // assign a number of retries -! if (packetfunctions_isBroadcastMulticast(&(msg->l2_nextORpreviousHop))==TRUE) { -! msg->l2_retriesLeft = 1; -! } else { -! msg->l2_retriesLeft = TXRETRIES; -! } -! // record this packet's dsn (for matching the ACK) -! msg->l2_dsn = res_vars.dsn++; -! // this is a new packet which I never attempted to send -! msg->l2_numTxAttempts = 0; -! // transmit with the default TX power -! msg->l1_txPower = TX_POWER; -! // record the location, in the packet, where the l2 payload starts -! msg->l2_payload = msg->payload; -! // add a IEEE802.15.4 header -! ieee802154_prependHeader(msg, -! msg->l2_frameType, -! iePresent, -! frameVersion, -! IEEE154_SEC_NO_SECURITY, -! msg->l2_dsn, -! &(msg->l2_nextORpreviousHop) -! ); -! // reserve space for 2-byte CRC -! packetfunctions_reserveFooterSize(msg,2); -! // change owner to IEEE802154E fetches it from queue -! msg->owner = COMPONENT_RES_TO_IEEE802154E; -! return E_SUCCESS; -! } -! -! /** -! \brief Send an advertisement. -! -! This is one of the MAC managament tasks. This function inlines in the -! timers_res_fired() function, but is declared as a separate function for better -! readability of the code. -! */ -! port_INLINE void sendAdv(void) { -! OpenQueueEntry_t* adv; -! payload_IE_descriptor_t payload_IE_desc; -! MLME_IE_subHeader_t mlme_subHeader; -! uint8_t slotframeIElen=0; -! -! if (ieee154e_isSynch()==FALSE) { -! // I'm not sync'ed -! -! // delete packets genereted by this module (ADV and KA) from openqueue -! openqueue_removeAllCreatedBy(COMPONENT_RES); -! -! // I'm now busy sending an ADV -! res_vars.busySendingAdv = FALSE; -! -! // stop here -! return; -! } -! -! if (res_vars.busySendingAdv==TRUE) { -! // don't continue if I'm still sending a previous ADV -! } -! -! // if I get here, I will send an ADV -! -! // get a free packet buffer -! adv = openqueue_getFreePacketBuffer(COMPONENT_RES); -! if (adv==NULL) { -! openserial_printError(COMPONENT_RES,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return; -! } -! -! // declare ownership over that packet -! adv->creator = COMPONENT_RES; -! adv->owner = COMPONENT_RES; -! -! // reserve space for ADV-specific header -! // xv poipoi -- reserving for IEs -- reverse order. -! //TODO reserve here for slotframe and link IE with minimal schedule information -! slotframeIElen = res_copySlotFrameAndLinkIE(adv); -! //create Sync IE with JP and ASN -! packetfunctions_reserveHeaderSize(adv, sizeof(synch_IE_t));//the asn + jp -! adv->l2_ASNpayload = adv->payload; //keep a pointer to where the ASN should be. -! // the actual value of the current ASN and JP will be written by the -! // IEEE802.15.4e when transmitting -! packetfunctions_reserveHeaderSize(adv, sizeof(MLME_IE_subHeader_t));//the MLME header -! //copy mlme sub-header -! mlme_subHeader.length_subID_type=sizeof(synch_IE_t) << IEEE802154E_DESC_LEN_SHORT_MLME_IE_SHIFT; -! mlme_subHeader.length_subID_type |= (IEEE802154E_MLME_SYNC_IE_SUBID << IEEE802154E_MLME_SYNC_IE_SUBID_SHIFT) | IEEE802154E_DESC_TYPE_SHORT; -! //little endian -! adv->payload[0]= mlme_subHeader.length_subID_type & 0xFF; -! adv->payload[1]= (mlme_subHeader.length_subID_type >> 8) & 0xFF; -! -! packetfunctions_reserveHeaderSize(adv, sizeof(payload_IE_descriptor_t));//the payload IE header -! //prepare IE headers and copy them to the ADV -! -! payload_IE_desc.length_groupid_type = (sizeof(MLME_IE_subHeader_t)+sizeof(synch_IE_t)+slotframeIElen)<<IEEE802154E_DESC_LEN_PAYLOAD_IE_SHIFT; -! payload_IE_desc.length_groupid_type |= (IEEE802154E_PAYLOAD_DESC_GROUP_ID_MLME | IEEE802154E_DESC_TYPE_LONG); // -! -! //copy header into the packet -! //little endian -! adv->payload[0]= payload_IE_desc.length_groupid_type & 0xFF; -! adv->payload[1]= (payload_IE_desc.length_groupid_type >> 8) & 0xFF; -! -! // some l2 information about this packet -! adv->l2_frameType = IEEE154_TYPE_BEACON; -! adv->l2_nextORpreviousHop.type = ADDR_16B; -! adv->l2_nextORpreviousHop.addr_16b[0] = 0xff; -! adv->l2_nextORpreviousHop.addr_16b[1] = 0xff; -! -! // put in queue for MAC to handle -! res_send_internal(adv,IEEE154_IELIST_YES,IEEE154_FRAMEVERSION); -! -! // I'm now busy sending an ADV -! res_vars.busySendingAdv = TRUE; -! } -! -! port_INLINE uint8_t res_copySlotFrameAndLinkIE(OpenQueueEntry_t* adv){ -! MLME_IE_subHeader_t mlme_subHeader; -! uint8_t len=0; -! uint8_t linkOption=0; -! uint16_t slot=SCHEDULE_MINIMAL_6TISCH_ACTIVE_CELLS+SCHEDULE_MINIMAL_6TISCH_EB_CELLS; -! -! //reverse order and little endian. -- -! -! //for each link in the schedule (in basic configuration) -! //copy to adv 1B linkOption bitmap -! //copy to adv 2B ch.offset -! //copy to adv 2B timeslot -! -! //shared cells -! linkOption = (1<<FLAG_TX_S)|(1<<FLAG_RX_S)|(1<<FLAG_SHARED_S); -! while(slot>SCHEDULE_MINIMAL_6TISCH_EB_CELLS){ -! packetfunctions_reserveHeaderSize(adv,5); -! //ts -! adv->payload[0]= slot & 0xFF; -! adv->payload[1]= (slot >> 8) & 0xFF; -! //ch.offset as minimal draft -! adv->payload[2]= 0x00; -! adv->payload[3]= 0x00; -! //linkOption -! adv->payload[4]= linkOption; -! len+=5; -! slot--; -! } -! -! //eb slot -! linkOption = (1<<FLAG_TX_S)|(1<<FLAG_RX_S)|(1<<FLAG_SHARED_S)|(1<<FLAG_TIMEKEEPING_S); -! packetfunctions_reserveHeaderSize(adv,5); -! len+=5; -! //ts -! adv->payload[0]= SCHEDULE_MINIMAL_6TISCH_EB_CELLS & 0xFF; -! adv->payload[1]= (SCHEDULE_MINIMAL_6TISCH_EB_CELLS >> 8) & 0xFF; -! //ch.offset as minimal draft -! adv->payload[2]= 0x00; -! adv->payload[3]= 0x00; -! -! adv->payload[4]= linkOption; -! //now slotframe ie general fields -! //1B number of links == 6 -! //Slotframe Size 2B = 101 timeslots -! //1B slotframe handle (id) -! packetfunctions_reserveHeaderSize(adv,5);// -! len+=5; -! -! adv->payload[0]= SCHEDULE_MINIMAL_6TISCH_DEFAULT_SLOTFRAME_NUMBER; -! adv->payload[1]= SCHEDULE_MINIMAL_6TISCH_DEFAULT_SLOTFRAME_HANDLE; -! adv->payload[2]= SCHEDULE_MINIMAL_6TISCH_SLOTFRAME_SIZE & 0xFF; -! adv->payload[3]= (SCHEDULE_MINIMAL_6TISCH_SLOTFRAME_SIZE >> 8) & 0xFF; -! adv->payload[4]= 0x06; //number of links -! -! //MLME sub IE header -! //1b -15 short ==0x00 -! //7b -8-14 Sub-ID=0x1b -! //8b - Length = 2 mlme-header + 5 slotframe general header +(6links*5bytes each) -! packetfunctions_reserveHeaderSize(adv, sizeof(MLME_IE_subHeader_t));//the MLME header -! -! -! //copy mlme sub-header -! mlme_subHeader.length_subID_type = len << IEEE802154E_DESC_LEN_SHORT_MLME_IE_SHIFT; -! mlme_subHeader.length_subID_type |= (IEEE802154E_MLME_SLOTFRAME_LINK_IE_SUBID << IEEE802154E_MLME_SYNC_IE_SUBID_SHIFT) | IEEE802154E_DESC_TYPE_SHORT; -! -! //little endian -! adv->payload[0]= mlme_subHeader.length_subID_type & 0xFF; -! adv->payload[1]= (mlme_subHeader.length_subID_type >> 8) & 0xFF; -! len+=2;//count len of mlme header -! -! return len; -! } -! -! /** -! \brief Send an keep-alive message, if nessary. -! -! This is one of the MAC managament tasks. This function inlines in the -! timers_res_fired() function, but is declared as a separate function for better -! readability of the code. -! */ -! port_INLINE void sendKa(void) { -! OpenQueueEntry_t* kaPkt; -! open_addr_t* kaNeighAddr; -! -! if (ieee154e_isSynch()==FALSE) { -! // I'm not sync'ed -! -! // delete packets genereted by this module (ADV and KA) from openqueue -! openqueue_removeAllCreatedBy(COMPONENT_RES); -! -! // I'm now busy sending a KA -! res_vars.busySendingKa = FALSE; -! -! // stop here -! return; -! } -! -! if (res_vars.busySendingKa==TRUE) { -! // don't proceed if I'm still sending a KA -! return; -! } -! -! kaNeighAddr = neighbors_getKANeighbor(); -! if (kaNeighAddr==NULL) { -! // don't proceed if I have no neighbor I need to send a KA to -! return; -! } -! -! // if I get here, I will send a KA -! -! // get a free packet buffer -! kaPkt = openqueue_getFreePacketBuffer(COMPONENT_RES); -! if (kaPkt==NULL) { -! openserial_printError(COMPONENT_RES,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)1, -! (errorparameter_t)0); -! return; -! } -! -! // declare ownership over that packet -! kaPkt->creator = COMPONENT_RES; -! kaPkt->owner = COMPONENT_RES; -! -! // some l2 information about this packet -! kaPkt->l2_frameType = IEEE154_TYPE_DATA; -! memcpy(&(kaPkt->l2_nextORpreviousHop),kaNeighAddr,sizeof(open_addr_t)); -! -! // put in queue for MAC to handle -! res_send_internal(kaPkt,IEEE154_IELIST_NO,IEEE154_FRAMEVERSION_2006); -! -! // I'm now busy sending a KA -! res_vars.busySendingKa = TRUE; -! } -! -! void res_timer_cb(void) { -! puts(__PRETTY_FUNCTION__); -! scheduler_push_task(timers_res_fired,TASKPRIO_RES); -! /*thread_create(openwsn_res_stack, KERNEL_CONF_STACKSIZE_MAIN, -! PRIORITY_OPENWSN_RES, CREATE_STACKTEST, -! timers_res_fired, "timers res fired");*/ - } -\ No newline at end of file -diff -crB openwsn/02b-MAChigh/res.h ../../../sys/net/openwsn/02b-MAChigh/res.h -*** openwsn/02b-MAChigh/res.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/02b-MAChigh/res.h Wed Jan 15 13:48:26 2014 -*************** -*** 1,32 **** -! #ifndef __RES_H -! #define __RES_H -! -! /** -! \addtogroup MAChigh -! \{ -! \addtogroup RES -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void res_init(); -! bool debugPrint_myDAGrank(); -! // from upper layer -! error_t res_send(OpenQueueEntry_t *msg); -! // from lower layer -! void task_resNotifSendDone(); -! void task_resNotifReceive(); -! -! /** -! \} -! \} -! */ -! - #endif -\ No newline at end of file ---- 1,42 ---- -! #ifndef __RES_H -! #define __RES_H -! -! /** -! \addtogroup MAChigh -! \{ -! \addtogroup RES -! \{ -! */ -! #include "opentimers.h" -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== module variables ================================ -! -! typedef struct { -! uint16_t periodMaintenance; -! bool busySendingKa; // TRUE when busy sending a keep-alive -! bool busySendingAdv; // TRUE when busy sending an advertisement -! uint8_t dsn; // current data sequence number -! uint8_t MacMgtTaskCounter; // counter to determine what management task to do -! opentimer_id_t timerId; -! } res_vars_t; -! -! //=========================== prototypes ====================================== -! -! void res_init(void); -! uint8_t debugPrint_myDAGrank(void); // TODO: was bool but complained "conflicting types" -! // from upper layer -! owerror_t res_send(OpenQueueEntry_t *msg); -! // from lower layer -! void task_resNotifSendDone(void); -! void task_resNotifReceive(void); -! -! /** -! \} -! \} -! */ -! - #endif -\ No newline at end of file -diff -crB openwsn/02b-MAChigh/schedule.c ../../../sys/net/openwsn/02b-MAChigh/schedule.c -*** openwsn/02b-MAChigh/schedule.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/02b-MAChigh/schedule.c Wed Jan 15 13:48:26 2014 -*************** -*** 1,476 **** -! #include "openwsn.h" -! #include "schedule.h" -! #include "openserial.h" -! #include "openrandom.h" -! -! //=========================== variables ======================================= -! -! typedef struct { -! scheduleEntry_t scheduleBuf[MAXACTIVESLOTS]; -! scheduleEntry_t* currentScheduleEntry; -! uint16_t frameLength; -! uint8_t backoffExponent; -! uint8_t backoff; -! slotOffset_t debugPrintRow; -! } schedule_vars_t; -! -! schedule_vars_t schedule_vars; -! -! typedef struct { -! uint8_t numActiveSlotsCur; -! uint8_t numActiveSlotsMax; -! } schedule_dbg_t; -! -! schedule_dbg_t schedule_dbg; -! -! //=========================== prototypes ====================================== -! -! void schedule_resetEntry(scheduleEntry_t* pScheduleEntry); -! -! //=========================== public ========================================== -! -! //=== admin -! -! void schedule_init() { -! uint8_t i; -! slotOffset_t running_slotOffset; -! open_addr_t temp_neighbor; -! -! // reset local variables -! memset(&schedule_vars,0,sizeof(schedule_vars_t)); -! for (i=0;i<MAXACTIVESLOTS;i++){ -! schedule_resetEntry(&schedule_vars.scheduleBuf[i]); -! } -! schedule_vars.backoffExponent = MINBE-1; -! memset(&schedule_dbg, 0,sizeof(schedule_dbg_t)); -! -! // set frame length -! schedule_setFrameLength(SUPERFRAME_LENGTH); -! -! // start at slot 0 -! running_slotOffset = 0; -! -! // advertisement slot(s) -! memset(&temp_neighbor,0,sizeof(temp_neighbor)); -! for (i=0;i<NUMADVSLOTS;i++) { -! schedule_addActiveSlot( -! running_slotOffset, // slot offset -! CELLTYPE_ADV, // type of slot -! FALSE, // shared? -! 0, // channel offset -! &temp_neighbor // neighbor -! ); -! running_slotOffset++; -! } -! -! // shared TXRX anycast slot(s) -! memset(&temp_neighbor,0,sizeof(temp_neighbor)); -! temp_neighbor.type = ADDR_ANYCAST; -! for (i=0;i<NUMSHAREDTXRX;i++) { -! schedule_addActiveSlot( -! running_slotOffset, // slot offset -! CELLTYPE_TXRX, // type of slot -! TRUE, // shared? -! 0, // channel offset -! &temp_neighbor // neighbor -! ); -! running_slotOffset++; -! } -! -! // serial RX slot(s) -! memset(&temp_neighbor,0,sizeof(temp_neighbor)); -! schedule_addActiveSlot( -! running_slotOffset, // slot offset -! CELLTYPE_SERIALRX, // type of slot -! FALSE, // shared? -! 0, // channel offset -! &temp_neighbor // neighbor -! ); -! running_slotOffset++; -! /* -! for (i=0;i<NUMSERIALRX-1;i++) { -! schedule_addActiveSlot( -! running_slotOffset, // slot offset -! CELLTYPE_MORESERIALRX, // type of slot -! FALSE, // shared? -! 0, // channel offset -! &temp_neighbor // neighbor -! ); -! running_slotOffset++; -! } -! */ -! } -! -! /** -! \brief Trigger this module to print status information, over serial. -! -! debugPrint_* functions are used by the openserial module to continuously print -! status information about several modules in the OpenWSN stack. -! -! \returns TRUE if this function printed something, FALSE otherwise. -! */ -! bool debugPrint_schedule() { -! debugScheduleEntry_t temp; -! schedule_vars.debugPrintRow = (schedule_vars.debugPrintRow+1)%MAXACTIVESLOTS; -! temp.row = schedule_vars.debugPrintRow; -! //copy element by element to the struct that will be serialized. we don't want to sent the pointer through the serial port. -! temp.scheduleEntry.channelOffset = schedule_vars.scheduleBuf[schedule_vars.debugPrintRow].channelOffset; -! temp.scheduleEntry.numRx = schedule_vars.scheduleBuf[schedule_vars.debugPrintRow].numRx; -! temp.scheduleEntry.numTx=schedule_vars.scheduleBuf[schedule_vars.debugPrintRow].numTx; -! temp.scheduleEntry.numTxACK=schedule_vars.scheduleBuf[schedule_vars.debugPrintRow].numTxACK; -! temp.scheduleEntry.lastUsedAsn=schedule_vars.scheduleBuf[schedule_vars.debugPrintRow].lastUsedAsn; -! temp.scheduleEntry.neighbor=schedule_vars.scheduleBuf[schedule_vars.debugPrintRow].neighbor; -! temp.scheduleEntry.shared=schedule_vars.scheduleBuf[schedule_vars.debugPrintRow].shared; -! temp.scheduleEntry.slotOffset=schedule_vars.scheduleBuf[schedule_vars.debugPrintRow].slotOffset; -! temp.scheduleEntry.type=schedule_vars.scheduleBuf[schedule_vars.debugPrintRow].type; -! -! openserial_printStatus(STATUS_SCHEDULE, -! (uint8_t*)&temp, -! sizeof(debugScheduleEntry_t)); -! return TRUE; -! } -! -! /** -! \brief Trigger this module to print status information, over serial. -! -! debugPrint_* functions are used by the openserial module to continuously print -! status information about several modules in the OpenWSN stack. -! -! \returns TRUE if this function printed something, FALSE otherwise. -! */ -! bool debugPrint_backoff() { -! uint8_t temp[2]; -! temp[0] = schedule_vars.backoffExponent; -! temp[1] = schedule_vars.backoff; -! openserial_printStatus(STATUS_BACKOFF, -! (uint8_t*)&temp, -! sizeof(temp)); -! return TRUE; -! } -! -! //=== from uRES (writing the schedule) -! -! /** -! \brief Set frame length. -! -! \param newFrameLength The new frame length. -! */ -! void schedule_setFrameLength(frameLength_t newFrameLength) { -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! schedule_vars.frameLength = newFrameLength; -! ENABLE_INTERRUPTS(); -! } -! -! /** -! \brief Add a new active slot into the schedule. -! -! \param newFrameLength The new frame length. -! */ -! void schedule_addActiveSlot(slotOffset_t slotOffset, -! cellType_t type, -! bool shared, -! uint8_t channelOffset, -! open_addr_t* neighbor) { -! scheduleEntry_t* slotContainer; -! scheduleEntry_t* previousSlotWalker; -! scheduleEntry_t* nextSlotWalker; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! -! // find an empty schedule entry container -! slotContainer = &schedule_vars.scheduleBuf[0]; -! while (slotContainer->type!=CELLTYPE_OFF && -! slotContainer<=&schedule_vars.scheduleBuf[MAXACTIVESLOTS-1]) { -! slotContainer++; -! } -! if (slotContainer>&schedule_vars.scheduleBuf[MAXACTIVESLOTS-1]) { -! // schedule has overflown -! openserial_printCritical(COMPONENT_SCHEDULE,ERR_SCHEDULE_OVERFLOWN, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! // fill that schedule entry with parameters passed -! slotContainer->slotOffset = slotOffset; -! slotContainer->type = type; -! slotContainer->shared = shared; -! slotContainer->channelOffset = channelOffset; -! memcpy(&slotContainer->neighbor,neighbor,sizeof(open_addr_t)); -! -! if (schedule_vars.currentScheduleEntry==NULL) { -! // this is the first active slot added -! -! // the next slot of this slot is this slot -! slotContainer->next = slotContainer; -! -! // current slot points to this slot -! schedule_vars.currentScheduleEntry = slotContainer; -! } else { -! // this is NOT the first active slot added -! -! // find position in schedule -! previousSlotWalker = schedule_vars.currentScheduleEntry; -! while (1) { -! nextSlotWalker = previousSlotWalker->next; -! if ( -! ( -! (previousSlotWalker->slotOffset < slotContainer->slotOffset) && -! (slotContainer->slotOffset < nextSlotWalker->slotOffset) -! ) -! || -! ( -! (previousSlotWalker->slotOffset < slotContainer->slotOffset) && -! (nextSlotWalker->slotOffset <= previousSlotWalker->slotOffset) -! ) -! || -! ( -! (slotContainer->slotOffset < nextSlotWalker->slotOffset) && -! (nextSlotWalker->slotOffset <= previousSlotWalker->slotOffset) -! ) -! ) { -! break; -! } -! previousSlotWalker = nextSlotWalker; -! } -! // insert between previousSlotWalker and nextSlotWalker -! previousSlotWalker->next = slotContainer; -! slotContainer->next = nextSlotWalker; -! } -! -! // maintain debug stats -! schedule_dbg.numActiveSlotsCur++; -! if (schedule_dbg.numActiveSlotsCur>schedule_dbg.numActiveSlotsMax) { -! schedule_dbg.numActiveSlotsMax = schedule_dbg.numActiveSlotsCur; -! } -! ENABLE_INTERRUPTS(); -! } -! -! //=== from IEEE802154E: reading the schedule and updating statistics -! -! void schedule_syncSlotOffset(slotOffset_t targetSlotOffset) { -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! while (schedule_vars.currentScheduleEntry->slotOffset!=targetSlotOffset) { -! schedule_advanceSlot(); -! } -! ENABLE_INTERRUPTS(); -! } -! -! void schedule_advanceSlot() { -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! // advance to next active slot -! schedule_vars.currentScheduleEntry = schedule_vars.currentScheduleEntry->next; -! ENABLE_INTERRUPTS(); -! } -! -! slotOffset_t schedule_getNextActiveSlotOffset() { -! slotOffset_t res; -! INTERRUPT_DECLARATION(); -! -! // return next active slot's slotOffset -! DISABLE_INTERRUPTS(); -! res = ((scheduleEntry_t*)(schedule_vars.currentScheduleEntry->next))->slotOffset; -! ENABLE_INTERRUPTS(); -! -! return res; -! } -! -! /** -! \brief Get the frame length. -! -! \returns The frame length. -! */ -! frameLength_t schedule_getFrameLength() { -! frameLength_t res; -! INTERRUPT_DECLARATION(); -! -! DISABLE_INTERRUPTS(); -! res= schedule_vars.frameLength; -! ENABLE_INTERRUPTS(); -! -! return res; -! } -! -! /** -! \brief Get the type of the current schedule entry. -! -! \returns The type of the current schedule entry. -! */ -! cellType_t schedule_getType() { -! cellType_t res; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! res= schedule_vars.currentScheduleEntry->type; -! ENABLE_INTERRUPTS(); -! return res; -! } -! -! /** -! \brief Get the neighbor associated wit the current schedule entry. -! -! \returns The neighbor associated wit the current schedule entry. -! */ -! void schedule_getNeighbor(open_addr_t* addrToWrite) { -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! memcpy(addrToWrite,&(schedule_vars.currentScheduleEntry->neighbor),sizeof(open_addr_t)); -! ENABLE_INTERRUPTS(); -! } -! -! /** -! \brief Get the channel offset of the current schedule entry. -! -! \returns The channel offset of the current schedule entry. -! */ -! channelOffset_t schedule_getChannelOffset() { -! channelOffset_t res; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! res= schedule_vars.currentScheduleEntry->channelOffset; -! ENABLE_INTERRUPTS(); -! return res; -! } -! -! /** -! \brief Check whether I can send on this slot. -! -! This function is called at the beginning of every TX slot. -! If the slot is *not* a shared slot, it always return TRUE. -! If the slot is a shared slot, it decrements the backoff counter and returns -! TRUE only if it hits 0. -! -! Note that the backoff counter is global, not per slot. -! -! \returns TRUE if it is OK to send on this slot, FALSE otherwise. -! */ -! bool schedule_getOkToSend() { -! bool returnVal; -! -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! -! if (schedule_vars.currentScheduleEntry->shared==FALSE) { -! // non-shared slot: backoff does not apply -! -! returnVal = TRUE; -! } else { -! // non-shared slot: check backoff before answering -! -! // decrement backoff -! if (schedule_vars.backoff>0) { -! schedule_vars.backoff--; -! } -! -! // only return TRUE if backoff hit 0 -! if (schedule_vars.backoff==0) { -! returnVal = TRUE; -! } else { -! returnVal = FALSE; -! } -! } -! -! ENABLE_INTERRUPTS(); -! return returnVal; -! } -! -! /** -! \brief Reset the backoff and backoffExponent. -! */ -! void schedule_resetBackoff() { -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! -! // reset backoffExponent -! schedule_vars.backoffExponent = MINBE-1; -! // reset backoff -! schedule_vars.backoff = 0; -! -! ENABLE_INTERRUPTS(); -! } -! -! /** -! \brief Indicate the reception of a packet. -! */ -! void schedule_indicateRx(asn_t* asnTimestamp) { -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! // increment usage statistics -! schedule_vars.currentScheduleEntry->numRx++; -! -! // update last used timestamp -! memcpy(&(schedule_vars.currentScheduleEntry->lastUsedAsn), asnTimestamp, sizeof(asn_t)); -! ENABLE_INTERRUPTS(); -! } -! -! /** -! \brief Indicate the transmission of a packet. -! */ -! void schedule_indicateTx(asn_t* asnTimestamp, -! bool succesfullTx) { -! -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! // increment usage statistics -! if (schedule_vars.currentScheduleEntry->numTx==0xFF) { -! schedule_vars.currentScheduleEntry->numTx/=2; -! schedule_vars.currentScheduleEntry->numTxACK/=2; -! } -! schedule_vars.currentScheduleEntry->numTx++; -! if (succesfullTx==TRUE) { -! schedule_vars.currentScheduleEntry->numTxACK++; -! } -! -! // update last used timestamp -! memcpy(&schedule_vars.currentScheduleEntry->lastUsedAsn, asnTimestamp, sizeof(asn_t)); -! -! // update this backoff parameters for shared slots -! if (schedule_vars.currentScheduleEntry->shared==TRUE) { -! if (succesfullTx==TRUE) { -! // reset backoffExponent -! schedule_vars.backoffExponent = MINBE-1; -! // reset backoff -! schedule_vars.backoff = 0; -! } else { -! // increase the backoffExponent -! if (schedule_vars.backoffExponent<MAXBE) { -! schedule_vars.backoffExponent++; -! } -! // set the backoff to a random value in [0..2^BE] -! schedule_vars.backoff = openrandom_get16b()%(1<<schedule_vars.backoffExponent); -! } -! } -! -! ENABLE_INTERRUPTS(); -! } -! -! void schedule_getNetDebugInfo(netDebugScheduleEntry_t* schlist){ -! uint8_t i; -! -! for (i=0;i<MAXACTIVESLOTS;i++){ -! schlist[i].last_addr_byte=schedule_vars.scheduleBuf[i].neighbor.addr_64b[7]; -! schlist[i].slotOffset=(uint8_t)schedule_vars.scheduleBuf[i].slotOffset&0xFF; -! schlist[i].channelOffset=schedule_vars.scheduleBuf[i].channelOffset; -! } -! } -! //=========================== private ========================================= -! -! void schedule_resetEntry(scheduleEntry_t* pScheduleEntry) { -! pScheduleEntry->type = CELLTYPE_OFF; -! pScheduleEntry->shared = FALSE; -! pScheduleEntry->channelOffset = 0; -! pScheduleEntry->neighbor.type = ADDR_NONE; -! pScheduleEntry->neighbor.addr_64b[0] = 0x14; -! pScheduleEntry->neighbor.addr_64b[1] = 0x15; -! pScheduleEntry->neighbor.addr_64b[2] = 0x92; -! pScheduleEntry->neighbor.addr_64b[3] = 0x09; -! pScheduleEntry->neighbor.addr_64b[4] = 0x02; -! pScheduleEntry->neighbor.addr_64b[5] = 0x2c; -! pScheduleEntry->neighbor.addr_64b[6] = 0x00; -! pScheduleEntry->numRx = 0; -! pScheduleEntry->numTx = 0; -! pScheduleEntry->numTxACK = 0; -! pScheduleEntry->lastUsedAsn.bytes0and1 = 0; -! pScheduleEntry->lastUsedAsn.bytes2and3 = 0; -! pScheduleEntry->lastUsedAsn.byte4 = 0; -! } ---- 1,621 ---- -! #include "openwsn.h" -! #include "schedule.h" -! #include "openserial.h" -! #include "openrandom.h" -! #include "packetfunctions.h" -! -! //=========================== variables ======================================= -! -! schedule_vars_t schedule_vars; -! schedule_dbg_t schedule_dbg; -! -! //=========================== prototypes ====================================== -! -! void schedule_resetEntry(scheduleEntry_t* pScheduleEntry); -! -! //=========================== public ========================================== -! -! //=== admin -! -! void schedule_init(void) { -! uint8_t i; -! slotOffset_t running_slotOffset; -! open_addr_t temp_neighbor; -! -! // reset local variables -! memset(&schedule_vars,0,sizeof(schedule_vars_t)); -! for (i=0;i<MAXACTIVESLOTS;i++) { -! schedule_resetEntry(&schedule_vars.scheduleBuf[i]); -! } -! schedule_vars.backoffExponent = MINBE-1; -! memset(&schedule_dbg, 0,sizeof(schedule_dbg_t)); -! -! // set frame length -! schedule_setFrameLength(SUPERFRAME_LENGTH); -! -! // start at slot 0 -! running_slotOffset = 0; -! -! // advertisement slot(s) -! memset(&temp_neighbor,0,sizeof(temp_neighbor)); -! for (i=0;i<NUMADVSLOTS;i++) { -! schedule_addActiveSlot( -! running_slotOffset, // slot offset -! CELLTYPE_ADV, // type of slot -! FALSE, // shared? -! 0, // channel offset -! &temp_neighbor, // neighbor -! FALSE //no update but insert -! ); -! running_slotOffset++; -! } -! -! // shared TXRX anycast slot(s) -! memset(&temp_neighbor,0,sizeof(temp_neighbor)); -! temp_neighbor.type = ADDR_ANYCAST; -! for (i=0;i<NUMSHAREDTXRX;i++) { -! schedule_addActiveSlot( -! running_slotOffset, // slot offset -! CELLTYPE_TXRX, // type of slot -! TRUE, // shared? -! 0, // channel offset -! &temp_neighbor, // neighbor -! FALSE //no update but insert -! ); -! running_slotOffset++; -! } -! -! // serial RX slot(s) -! memset(&temp_neighbor,0,sizeof(temp_neighbor)); -! schedule_addActiveSlot( -! running_slotOffset, // slot offset -! CELLTYPE_SERIALRX, // type of slot -! FALSE, // shared? -! 0, // channel offset -! &temp_neighbor, // neighbor -! FALSE //no update but insert -! ); -! running_slotOffset++; -! /* -! for (i=0;i<NUMSERIALRX-1;i++) { -! schedule_addActiveSlot( -! running_slotOffset, // slot offset -! CELLTYPE_MORESERIALRX, // type of slot -! FALSE, // shared? -! 0, // channel offset -! &temp_neighbor // neighbor -! ); -! running_slotOffset++; -! } -! */ -! } -! -! /** -! \brief Trigger this module to print status information, over serial. -! -! debugPrint_* functions are used by the openserial module to continuously print -! status information about several modules in the OpenWSN stack. -! -! \returns TRUE if this function printed something, FALSE otherwise. -! */ -! bool debugPrint_schedule(void) { -! debugScheduleEntry_t temp; -! -! schedule_vars.debugPrintRow = (schedule_vars.debugPrintRow+1)%MAXACTIVESLOTS; -! -! temp.row = schedule_vars.debugPrintRow; -! temp.slotOffset = \ -! schedule_vars.scheduleBuf[schedule_vars.debugPrintRow].slotOffset; -! temp.type = \ -! schedule_vars.scheduleBuf[schedule_vars.debugPrintRow].type; -! temp.shared = \ -! schedule_vars.scheduleBuf[schedule_vars.debugPrintRow].shared; -! temp.channelOffset = \ -! schedule_vars.scheduleBuf[schedule_vars.debugPrintRow].channelOffset; -! memcpy( -! &temp.neighbor, -! &schedule_vars.scheduleBuf[schedule_vars.debugPrintRow].neighbor, -! sizeof(open_addr_t) -! ); -! temp.numRx = \ -! schedule_vars.scheduleBuf[schedule_vars.debugPrintRow].numRx; -! temp.numTx = \ -! schedule_vars.scheduleBuf[schedule_vars.debugPrintRow].numTx; -! temp.numTxACK = \ -! schedule_vars.scheduleBuf[schedule_vars.debugPrintRow].numTxACK; -! memcpy( -! &temp.lastUsedAsn, -! &schedule_vars.scheduleBuf[schedule_vars.debugPrintRow].lastUsedAsn, -! sizeof(asn_t) -! ); -! -! openserial_printStatus(STATUS_SCHEDULE, -! (uint8_t*)&temp, -! sizeof(debugScheduleEntry_t) -! ); -! -! return TRUE; -! } -! -! /** -! \brief Trigger this module to print status information, over serial. -! -! debugPrint_* functions are used by the openserial module to continuously print -! status information about several modules in the OpenWSN stack. -! -! \returns TRUE if this function printed something, FALSE otherwise. -! */ -! bool debugPrint_backoff(void) { -! uint8_t temp[2]; -! temp[0] = schedule_vars.backoffExponent; -! temp[1] = schedule_vars.backoff; -! openserial_printStatus(STATUS_BACKOFF, -! (uint8_t*)&temp, -! sizeof(temp)); -! return TRUE; -! } -! -! //=== from uRES (writing the schedule) -! -! /** -! \brief Set frame length. -! -! \param newFrameLength The new frame length. -! */ -! void schedule_setFrameLength(frameLength_t newFrameLength) { -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! schedule_vars.frameLength = newFrameLength; -! ENABLE_INTERRUPTS(); -! } -! -! /** -! \brief get the information of a spcific slot. -! -! \param slotOffset -! \param neighbor -! \param info -! */ -! void schedule_getSlotInfo( -! slotOffset_t slotOffset, -! open_addr_t* neighbor, -! slotinfo_element_t* info -! ){ -! -! scheduleEntry_t* slotContainer; -! -! // find an empty schedule entry container -! slotContainer = &schedule_vars.scheduleBuf[0]; -! while (slotContainer->type!=CELLTYPE_OFF && slotContainer<=&schedule_vars.scheduleBuf[MAXACTIVESLOTS-1]) { -! //check that this entry for that neighbour and timeslot is not already scheduled. -! if (packetfunctions_sameAddress(neighbor,&(slotContainer->neighbor))&& (slotContainer->slotOffset==slotOffset)){ -! //it exists so this is an update. -! info->link_type = slotContainer->type; -! info->shared =slotContainer->shared; -! info->channelOffset = slotContainer->channelOffset; -! return; //as this is an update. No need to re-insert as it is in the same position on the list. -! } -! slotContainer++; -! } -! //return cell type off. -! info->link_type = CELLTYPE_OFF; -! info->shared = FALSE; -! info->channelOffset = 0;//set to zero if not set. -! } -! -! /** -! \brief Add a new active slot into the schedule. -! -! If udpate param is set then update it in case it exists. -! -! \param slotOffset -! \param type -! \param shared -! \param channelOffset -! \param neighbor -! \param isUpdate -! */ -! owerror_t schedule_addActiveSlot( -! slotOffset_t slotOffset, -! cellType_t type, -! bool shared, -! channelOffset_t channelOffset, -! open_addr_t* neighbor, -! bool isUpdate -! ) { -! -! owerror_t outcome; -! -! scheduleEntry_t* slotContainer; -! scheduleEntry_t* previousSlotWalker; -! scheduleEntry_t* nextSlotWalker; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! -! -! // find an empty schedule entry container -! slotContainer = &schedule_vars.scheduleBuf[0]; -! while (slotContainer->type!=CELLTYPE_OFF && -! slotContainer<=&schedule_vars.scheduleBuf[MAXACTIVESLOTS-1]) { -! -! //check that this entry for that neighbour and timeslot is not already scheduled. -! if (type!=CELLTYPE_SERIALRX && type!=CELLTYPE_MORESERIALRX && -! (packetfunctions_sameAddress(neighbor,&(slotContainer->neighbor))|| -! (slotContainer->neighbor.type==ADDR_ANYCAST && isUpdate==TRUE)) -! &&(slotContainer->slotOffset==slotOffset)){ -! //it exists so this is an update. -! slotContainer->type = type; -! slotContainer->shared = shared; -! slotContainer->channelOffset = channelOffset; -! memcpy(&slotContainer->neighbor,neighbor,sizeof(open_addr_t));//update the address too! -! schedule_dbg.numUpdatedSlotsCur++; -! ENABLE_INTERRUPTS(); -! return E_SUCCESS; //as this is an update. No need to re-insert as it is in the same position on the list. -! } -! -! slotContainer++; -! } -! -! if (isUpdate==TRUE) { -! //we are trying to update an item that is not in the schedule list. -! ENABLE_INTERRUPTS(); -! return E_FAIL; -! } -! if (slotContainer>&schedule_vars.scheduleBuf[MAXACTIVESLOTS-1]) { -! // schedule has overflown -! outcome=E_FAIL; -! openserial_printCritical(COMPONENT_SCHEDULE,ERR_SCHEDULE_OVERFLOWN, -! (errorparameter_t)0, -! (errorparameter_t)0); -! -! -! } -! // fill that schedule entry with parameters passed -! slotContainer->slotOffset = slotOffset; -! slotContainer->type = type; -! slotContainer->shared = shared; -! slotContainer->channelOffset = channelOffset; -! memcpy(&slotContainer->neighbor,neighbor,sizeof(open_addr_t)); -! -! if (schedule_vars.currentScheduleEntry==NULL) { -! // this is the first active slot added -! -! // the next slot of this slot is this slot -! slotContainer->next = slotContainer; -! -! // current slot points to this slot -! schedule_vars.currentScheduleEntry = slotContainer; -! } else { -! // this is NOT the first active slot added -! -! // find position in schedule -! previousSlotWalker = schedule_vars.currentScheduleEntry; -! while (1) { -! nextSlotWalker = previousSlotWalker->next; -! if ( -! ( -! (previousSlotWalker->slotOffset < slotContainer->slotOffset) && -! (slotContainer->slotOffset < nextSlotWalker->slotOffset) -! ) -! || -! ( -! (previousSlotWalker->slotOffset < slotContainer->slotOffset) && -! (nextSlotWalker->slotOffset <= previousSlotWalker->slotOffset) -! ) -! || -! ( -! (slotContainer->slotOffset < nextSlotWalker->slotOffset) && -! (nextSlotWalker->slotOffset <= previousSlotWalker->slotOffset) -! ) -! ) { -! break; -! } -! previousSlotWalker = nextSlotWalker; -! } -! // insert between previousSlotWalker and nextSlotWalker -! previousSlotWalker->next = slotContainer; -! slotContainer->next = nextSlotWalker; -! } -! -! // maintain debug stats -! schedule_dbg.numActiveSlotsCur++; -! if (schedule_dbg.numActiveSlotsCur>schedule_dbg.numActiveSlotsMax) { -! schedule_dbg.numActiveSlotsMax = schedule_dbg.numActiveSlotsCur; -! } -! outcome=E_SUCCESS; -! ENABLE_INTERRUPTS(); -! return outcome; -! } -! -! -! -! owerror_t schedule_removeActiveSlot(slotOffset_t slotOffset, open_addr_t* neighbor){ -! -! owerror_t outcome; -! -! scheduleEntry_t* slotContainer; -! scheduleEntry_t* previousSlotWalker; -! -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! -! -! // find the schedule entry -! slotContainer = &schedule_vars.scheduleBuf[0]; -! while (slotContainer->type!=CELLTYPE_OFF && slotContainer<=&schedule_vars.scheduleBuf[MAXACTIVESLOTS-1]) { -! //check that this entry for that neighbour and timeslot is not already scheduled. -! if (packetfunctions_sameAddress(neighbor,&(slotContainer->neighbor))&& (slotContainer->slotOffset==slotOffset)){ -! break; -! } -! slotContainer++; -! } -! -! if (slotContainer->next==slotContainer) { -! // this is the last active slot -! -! // the next slot of this slot is NULL -! slotContainer->next = NULL; -! -! // current slot points to this slot -! schedule_vars.currentScheduleEntry = NULL; -! } else { -! // this is NOT the last active slot -! -! // find the previous in the schedule -! previousSlotWalker = schedule_vars.currentScheduleEntry; -! -! while (1) { -! if ((previousSlotWalker->next=slotContainer)){ -! break; -! } -! previousSlotWalker = previousSlotWalker->next; -! } -! // remove this element from the linked list -! previousSlotWalker->next = slotContainer->next;//my next; -! slotContainer->next = NULL; -! } -! -! // clear that schedule entry -! slotContainer->slotOffset = 0; -! slotContainer->type = CELLTYPE_OFF; -! slotContainer->shared = FALSE; -! slotContainer->channelOffset = 0; -! memset(&slotContainer->neighbor,0,sizeof(open_addr_t)); -! -! // maintain debug stats -! schedule_dbg.numActiveSlotsCur--; -! -! outcome=E_SUCCESS; -! ENABLE_INTERRUPTS(); -! -! return outcome; -! } -! -! -! -! -! //=== from IEEE802154E: reading the schedule and updating statistics -! -! void schedule_syncSlotOffset(slotOffset_t targetSlotOffset) { -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! while (schedule_vars.currentScheduleEntry->slotOffset!=targetSlotOffset) { -! schedule_advanceSlot(); -! } -! ENABLE_INTERRUPTS(); -! } -! -! void schedule_advanceSlot(void) { -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! // advance to next active slot -! schedule_vars.currentScheduleEntry = schedule_vars.currentScheduleEntry->next; -! ENABLE_INTERRUPTS(); -! } -! -! slotOffset_t schedule_getNextActiveSlotOffset(void) { -! slotOffset_t res; -! INTERRUPT_DECLARATION(); -! -! // return next active slot's slotOffset -! DISABLE_INTERRUPTS(); -! res = ((scheduleEntry_t*)(schedule_vars.currentScheduleEntry->next))->slotOffset; -! ENABLE_INTERRUPTS(); -! -! return res; -! } -! -! /** -! \brief Get the frame length. -! -! \returns The frame length. -! */ -! frameLength_t schedule_getFrameLength(void) { -! frameLength_t res; -! INTERRUPT_DECLARATION(); -! -! DISABLE_INTERRUPTS(); -! res= schedule_vars.frameLength; -! ENABLE_INTERRUPTS(); -! -! return res; -! } -! -! /** -! \brief Get the type of the current schedule entry. -! -! \returns The type of the current schedule entry. -! */ -! cellType_t schedule_getType(void) { -! cellType_t res; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! res= schedule_vars.currentScheduleEntry->type; -! ENABLE_INTERRUPTS(); -! return res; -! } -! -! /** -! \brief Get the neighbor associated wit the current schedule entry. -! -! \returns The neighbor associated wit the current schedule entry. -! */ -! void schedule_getNeighbor(open_addr_t* addrToWrite) { -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! memcpy(addrToWrite,&(schedule_vars.currentScheduleEntry->neighbor),sizeof(open_addr_t)); -! ENABLE_INTERRUPTS(); -! } -! -! /** -! \brief Get the channel offset of the current schedule entry. -! -! \returns The channel offset of the current schedule entry. -! */ -! channelOffset_t schedule_getChannelOffset(void) { -! channelOffset_t res; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! res= schedule_vars.currentScheduleEntry->channelOffset; -! ENABLE_INTERRUPTS(); -! return res; -! } -! -! /** -! \brief Check whether I can send on this slot. -! -! This function is called at the beginning of every TX slot. -! If the slot is *not* a shared slot, it always return TRUE. -! If the slot is a shared slot, it decrements the backoff counter and returns -! TRUE only if it hits 0. -! -! Note that the backoff counter is global, not per slot. -! -! \returns TRUE if it is OK to send on this slot, FALSE otherwise. -! */ -! bool schedule_getOkToSend(void) { -! bool returnVal; -! -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! -! if (schedule_vars.currentScheduleEntry->shared==FALSE) { -! // non-shared slot: backoff does not apply -! -! returnVal = TRUE; -! } else { -! // non-shared slot: check backoff before answering -! -! // decrement backoff -! if (schedule_vars.backoff>0) { -! schedule_vars.backoff--; -! } -! -! // only return TRUE if backoff hit 0 -! if (schedule_vars.backoff==0) { -! returnVal = TRUE; -! } else { -! returnVal = FALSE; -! } -! } -! -! ENABLE_INTERRUPTS(); -! return returnVal; -! } -! -! /** -! \brief Reset the backoff and backoffExponent. -! */ -! void schedule_resetBackoff(void) { -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! -! // reset backoffExponent -! schedule_vars.backoffExponent = MINBE-1; -! // reset backoff -! schedule_vars.backoff = 0; -! -! ENABLE_INTERRUPTS(); -! } -! -! /** -! \brief Indicate the reception of a packet. -! */ -! void schedule_indicateRx(asn_t* asnTimestamp) { -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! // increment usage statistics -! schedule_vars.currentScheduleEntry->numRx++; -! -! // update last used timestamp -! memcpy(&(schedule_vars.currentScheduleEntry->lastUsedAsn), asnTimestamp, sizeof(asn_t)); -! ENABLE_INTERRUPTS(); -! } -! -! /** -! \brief Indicate the transmission of a packet. -! */ -! void schedule_indicateTx(asn_t* asnTimestamp, -! bool succesfullTx) { -! -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! // increment usage statistics -! if (schedule_vars.currentScheduleEntry->numTx==0xFF) { -! schedule_vars.currentScheduleEntry->numTx/=2; -! schedule_vars.currentScheduleEntry->numTxACK/=2; -! } -! schedule_vars.currentScheduleEntry->numTx++; -! if (succesfullTx==TRUE) { -! schedule_vars.currentScheduleEntry->numTxACK++; -! } -! -! // update last used timestamp -! memcpy(&schedule_vars.currentScheduleEntry->lastUsedAsn, asnTimestamp, sizeof(asn_t)); -! -! // update this backoff parameters for shared slots -! if (schedule_vars.currentScheduleEntry->shared==TRUE) { -! if (succesfullTx==TRUE) { -! // reset backoffExponent -! schedule_vars.backoffExponent = MINBE-1; -! // reset backoff -! schedule_vars.backoff = 0; -! } else { -! // increase the backoffExponent -! if (schedule_vars.backoffExponent<MAXBE) { -! schedule_vars.backoffExponent++; -! } -! // set the backoff to a random value in [0..2^BE] -! schedule_vars.backoff = openrandom_get16b()%(1<<schedule_vars.backoffExponent); -! } -! } -! -! ENABLE_INTERRUPTS(); -! } -! -! void schedule_getNetDebugInfo(netDebugScheduleEntry_t* schlist){ -! uint8_t i; -! -! for (i=0;i<MAXACTIVESLOTS;i++){ -! schlist[i].last_addr_byte=schedule_vars.scheduleBuf[i].neighbor.addr_64b[7]; -! schlist[i].slotOffset=(uint8_t)schedule_vars.scheduleBuf[i].slotOffset&0xFF; -! schlist[i].channelOffset=schedule_vars.scheduleBuf[i].channelOffset; -! } -! } -! //=========================== private ========================================= -! -! void schedule_resetEntry(scheduleEntry_t* pScheduleEntry) { -! pScheduleEntry->type = CELLTYPE_OFF; -! pScheduleEntry->shared = FALSE; -! pScheduleEntry->channelOffset = 0; -! -! pScheduleEntry->neighbor.type = ADDR_NONE; -! memset(&pScheduleEntry->neighbor.addr_64b[0], 0x00, sizeof(pScheduleEntry->neighbor.addr_64b)); -! -! pScheduleEntry->numRx = 0; -! pScheduleEntry->numTx = 0; -! pScheduleEntry->numTxACK = 0; -! pScheduleEntry->lastUsedAsn.bytes0and1 = 0; -! pScheduleEntry->lastUsedAsn.bytes2and3 = 0; -! pScheduleEntry->lastUsedAsn.byte4 = 0; -! } -diff -crB openwsn/02b-MAChigh/schedule.h ../../../sys/net/openwsn/02b-MAChigh/schedule.h -*** openwsn/02b-MAChigh/schedule.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/02b-MAChigh/schedule.h Wed Jan 15 13:48:26 2014 -*************** -*** 1,158 **** -! #ifndef __SCHEDULE_H -! #define __SCHEDULE_H -! -! /** -! \addtogroup MAChigh -! \{ -! \addtogroup Schedule -! \{ -! */ -! -! #include "openwsn.h" -! -! //=========================== define ========================================== -! -! /** -! \brief The length of the superframe, in slots. -! -! The superframe repears over time and can be arbitrarly long. -! */ -! #define SUPERFRAME_LENGTH 9 -! -! #define NUMADVSLOTS 1 -! #define NUMSHAREDTXRX 4 -! #define NUMSERIALRX 3 -! -! /** -! \brief Maximum number of active slots in a superframe. -! -! Note that this is merely used to allocate RAM memory for the schedule. The -! schedule is represented, in RAM, by a table. There is one row per active slot -! in that table; a slot is "active" when it is not of type CELLTYPE_OFF. -! -! Set this number to the exact number of active slots you are planning on having -! in your schedule, so not to waste RAM. -! */ -! #define MAXACTIVESLOTS (NUMADVSLOTS+NUMSHAREDTXRX+NUMSERIALRX) -! -! /** -! \brief Minimum backoff exponent. -! -! Backoff is used only in slots that are marked as shared in the schedule. When -! not shared, the mote assumes that schedule is collision-free, and therefore -! does not use any backoff mechanism when a transmission fails. -! */ -! #define MINBE 2 -! -! /** -! \brief Maximum backoff exponent. -! -! See MINBE for an explanation of backoff. -! */ -! #define MAXBE 4 -! -! -! //=========================== typedef ========================================= -! -! typedef uint8_t channelOffset_t; -! typedef uint16_t slotOffset_t; -! typedef uint16_t frameLength_t; -! -! typedef enum { -! CELLTYPE_OFF = 0, -! CELLTYPE_ADV = 1, -! CELLTYPE_TX = 2, -! CELLTYPE_RX = 3, -! CELLTYPE_TXRX = 4, -! CELLTYPE_SERIALRX = 5, -! CELLTYPE_MORESERIALRX = 6 -! } cellType_t; -! -! //not packed as does not fly on the network -! //PRAGMA(pack(1)); -! typedef struct { -! slotOffset_t slotOffset; -! cellType_t type; -! bool shared; -! uint8_t channelOffset; -! open_addr_t neighbor; -! uint8_t numRx; -! uint8_t numTx; -! uint8_t numTxACK; -! asn_t lastUsedAsn; -! void* next; -! } scheduleEntry_t; -! //PRAGMA(pack()); -! -! //copy of the previous one but without the pointer and packed -! PRAGMA(pack(1)); -! typedef struct { -! slotOffset_t slotOffset; -! cellType_t type; -! bool shared; -! uint8_t channelOffset; -! open_addr_t neighbor; -! uint8_t numRx; -! uint8_t numTx; -! uint8_t numTxACK; -! asn_t lastUsedAsn; -! } scheduleEntryDebug_t; -! PRAGMA(pack()); -! -! //used to debug through ipv6 pkt. -! -! PRAGMA(pack(1)); -! typedef struct { -! uint8_t last_addr_byte;//last byte of the address; poipoi could be [0]; endianness -! uint8_t slotOffset; -! uint8_t channelOffset; -! }netDebugScheduleEntry_t; -! PRAGMA(pack()); -! -! PRAGMA(pack(1)); -! typedef struct { -! uint8_t row; -! scheduleEntryDebug_t scheduleEntry; -! } debugScheduleEntry_t; -! PRAGMA(pack()); -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! // admin -! void schedule_init(); -! bool debugPrint_schedule(); -! bool debugPrint_backoff(); -! // from uRES -! void schedule_setFrameLength(frameLength_t newFrameLength); -! void schedule_addActiveSlot( -! slotOffset_t slotOffset, -! cellType_t type, -! bool shared, -! uint8_t channelOffset, -! open_addr_t* neighbor -! ); -! // from IEEE802154E -! void schedule_syncSlotOffset(slotOffset_t targetSlotOffset); -! void schedule_advanceSlot(); -! slotOffset_t schedule_getNextActiveSlotOffset(); -! frameLength_t schedule_getFrameLength(); -! cellType_t schedule_getType(); -! void schedule_getNeighbor(open_addr_t* addrToWrite); -! channelOffset_t schedule_getChannelOffset(); -! bool schedule_getOkToSend(); -! void schedule_resetBackoff(); -! void schedule_indicateRx(asn_t* asnTimestamp); -! void schedule_indicateTx( -! asn_t* asnTimestamp, -! bool succesfullTx -! ); -! void schedule_getNetDebugInfo(netDebugScheduleEntry_t* schlist); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,189 ---- -! #ifndef __SCHEDULE_H -! #define __SCHEDULE_H -! -! /** -! \addtogroup MAChigh -! \{ -! \addtogroup Schedule -! \{ -! */ -! -! #include "openwsn.h" -! -! //=========================== define ========================================== -! -! /** -! \brief The length of the superframe, in slots. -! -! The superframe repears over time and can be arbitrarly long. -! */ -! #define SUPERFRAME_LENGTH 11 //should be 101 -! -! #define NUMADVSLOTS 1 -! #define NUMSHAREDTXRX 5 -! #define NUMSERIALRX 3 -! -! /** -! \brief Maximum number of active slots in a superframe. -! -! Note that this is merely used to allocate RAM memory for the schedule. The -! schedule is represented, in RAM, by a table. There is one row per active slot -! in that table; a slot is "active" when it is not of type CELLTYPE_OFF. -! -! Set this number to the exact number of active slots you are planning on having -! in your schedule, so not to waste RAM. -! */ -! #define MAXACTIVESLOTS (NUMADVSLOTS+NUMSHAREDTXRX+NUMSERIALRX) -! -! /** -! \brief Minimum backoff exponent. -! -! Backoff is used only in slots that are marked as shared in the schedule. When -! not shared, the mote assumes that schedule is collision-free, and therefore -! does not use any backoff mechanism when a transmission fails. -! */ -! #define MINBE 2 -! -! /** -! \brief Maximum backoff exponent. -! -! See MINBE for an explanation of backoff. -! */ -! #define MAXBE 4 -! //6tisch minimal draft -! #define SCHEDULE_MINIMAL_6TISCH_ACTIVE_CELLS 5 -! #define SCHEDULE_MINIMAL_6TISCH_EB_CELLS 1 -! #define SCHEDULE_MINIMAL_6TISCH_SLOTFRAME_SIZE 101 -! #define SCHEDULE_MINIMAL_6TISCH_DEFAULT_SLOTFRAME_HANDLE 1 //id of slotframe -! #define SCHEDULE_MINIMAL_6TISCH_DEFAULT_SLOTFRAME_NUMBER 1 //1 slotframe by default. -! -! //=========================== typedef ========================================= -! -! typedef uint8_t channelOffset_t; -! typedef uint16_t slotOffset_t; -! typedef uint16_t frameLength_t; -! -! typedef enum { -! CELLTYPE_OFF = 0, -! CELLTYPE_ADV = 1, -! CELLTYPE_TX = 2, -! CELLTYPE_RX = 3, -! CELLTYPE_TXRX = 4, -! CELLTYPE_SERIALRX = 5, -! CELLTYPE_MORESERIALRX = 6 -! } cellType_t; -! -! -! //PRAGMA(pack(1)); -! typedef struct { -! slotOffset_t slotOffset; -! cellType_t type; -! bool shared; -! uint8_t channelOffset; -! open_addr_t neighbor; -! uint8_t numRx; -! uint8_t numTx; -! uint8_t numTxACK; -! asn_t lastUsedAsn; -! void* next; -! } scheduleEntry_t; -! //PRAGMA(pack()); -! -! //used to debug through ipv6 pkt. -! -! //PRAGMA(pack(1)); -! typedef struct { -! uint8_t last_addr_byte;//last byte of the address; poipoi could be [0]; endianness -! uint8_t slotOffset; -! channelOffset_t channelOffset; -! }netDebugScheduleEntry_t; -! //PRAGMA(pack()); -! -! //PRAGMA(pack(1)); -! typedef struct { -! uint8_t row; -! slotOffset_t slotOffset; -! uint8_t type; -! bool shared; -! uint8_t channelOffset; -! open_addr_t neighbor; -! uint8_t numRx; -! uint8_t numTx; -! uint8_t numTxACK; -! asn_t lastUsedAsn; -! } debugScheduleEntry_t; -! //PRAGMA(pack()); -! -! //PRAGMA(pack(1)); //elements for slot info -! typedef struct { -! uint8_t address[LENGTH_ADDR64b];// -! cellType_t link_type;// rx,tx etc... -! bool shared; -! slotOffset_t slotOffset; -! channelOffset_t channelOffset; -! }slotinfo_element_t; -! //PRAGMA(pack()); -! //=========================== variables ======================================= -! -! typedef struct { -! scheduleEntry_t scheduleBuf[MAXACTIVESLOTS]; -! scheduleEntry_t* currentScheduleEntry; -! uint16_t frameLength; -! uint8_t backoffExponent; -! uint8_t backoff; -! slotOffset_t debugPrintRow; -! } schedule_vars_t; -! -! typedef struct { -! uint8_t numActiveSlotsCur; -! uint8_t numActiveSlotsMax; -! uint8_t numUpdatedSlotsCur; -! } schedule_dbg_t; -! -! //=========================== prototypes ====================================== -! -! // admin -! void schedule_init(void); -! bool debugPrint_schedule(void); -! bool debugPrint_backoff(void); -! // from uRES -! void schedule_setFrameLength(frameLength_t newFrameLength); -! owerror_t schedule_addActiveSlot( -! slotOffset_t slotOffset, -! cellType_t type, -! bool shared, -! uint8_t channelOffset, -! open_addr_t* neighbor, -! bool isUpdate); -! -! void schedule_getSlotInfo(slotOffset_t slotOffset, -! open_addr_t* neighbor, -! slotinfo_element_t* info); -! -! owerror_t schedule_removeActiveSlot(slotOffset_t slotOffset, -! open_addr_t* neighbor); -! -! -! // from IEEE802154E -! void schedule_syncSlotOffset(slotOffset_t targetSlotOffset); -! void schedule_advanceSlot(void); -! slotOffset_t schedule_getNextActiveSlotOffset(void); -! frameLength_t schedule_getFrameLength(void); -! cellType_t schedule_getType(void); -! void schedule_getNeighbor(open_addr_t* addrToWrite); -! channelOffset_t schedule_getChannelOffset(void); -! bool schedule_getOkToSend(void); -! void schedule_resetBackoff(void); -! void schedule_indicateRx(asn_t* asnTimestamp); -! void schedule_indicateTx( -! asn_t* asnTimestamp, -! bool succesfullTx -! ); -! void schedule_getNetDebugInfo(netDebugScheduleEntry_t* schlist); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/03a-IPHC/Makefile ../../../sys/net/openwsn/03a-IPHC/Makefile -*** openwsn/03a-IPHC/Makefile Wed Jan 15 13:55:34 2014 ---- ../../../sys/net/openwsn/03a-IPHC/Makefile Wed Jan 15 13:48:27 2014 -*************** -*** 0 **** ---- 1,32 ---- -+ SUBMOD:=$(shell basename $(CURDIR)).a -+ #BINDIR = $(RIOTBASE)/bin/ -+ SRC = $(wildcard *.c) -+ OBJ = $(SRC:%.c=$(BINDIR)%.o) -+ DEP = $(SRC:%.c=$(BINDIR)%.d) -+ -+ INCLUDES += -I$(RIOTBASE) -I$(RIOTBASE)/sys/include -I$(RIOTBASE)/core/include -I$(RIOTBASE)/drivers/include -I$(RIOTBASE)/drivers/cc110x_ng/include -I$(RIOTBASE)/cpu/arm_common/include -I$(RIOTBASE)/sys/net/include/ -+ INCLUDES += -I$(CURDIR)/02a-MAClow -+ INCLUDES += -I$(CURDIR)/02b-MAChigh -+ INCLUDES += -I$(CURDIR)/03a-IPHC -+ INCLUDES += -I$(CURDIR)/03b-IPv6 -+ INCLUDES += -I$(CURDIR)/04-TRAN -+ INCLUDES += -I$(CURDIR)/cross-layers -+ -+ .PHONY: $(BINDIR)$(SUBMOD) -+ -+ $(BINDIR)$(SUBMOD): $(OBJ) -+ $(AD)$(AR) rcs $(BINDIR)$(MODULE) $(OBJ) -+ -+ # pull in dependency info for *existing* .o files -+ -include $(OBJ:.o=.d) -+ -+ # compile and generate dependency info -+ $(BINDIR)%.o: %.c -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d -+ @printf "$(BINDIR)" | cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d -+ -+ # remove compilation products -+ -+ clean: -+ rm -f $(OBJ) $(DEP) -diff -crB openwsn/03a-IPHC/iphc.c ../../../sys/net/openwsn/03a-IPHC/iphc.c -*** openwsn/03a-IPHC/iphc.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/03a-IPHC/iphc.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,560 **** -! #include "openwsn.h" -! #include "iphc.h" -! #include "packetfunctions.h" -! #include "idmanager.h" -! #include "openserial.h" -! #include "res.h" -! #include "forwarding.h" -! #include "neighbors.h" -! #include "openbridge.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! error_t prependIPv6Header( -! OpenQueueEntry_t* msg, -! uint8_t tf, -! uint32_t value_flowLabel, -! bool nh, -! uint8_t value_nextHeader, -! uint8_t hlim, -! uint8_t value_hopLimit, -! bool cid, -! bool sac, -! uint8_t sam, -! bool m, -! bool dac, -! uint8_t dam, -! open_addr_t* value_dest, -! open_addr_t* value_src, -! uint8_t fw_SendOrfw_Rcv -! ); -! ipv6_header_iht retrieveIPv6Header(OpenQueueEntry_t* msg); -! -! //=========================== public ========================================== -! -! void iphc_init() { -! } -! -! //send from upper layer: I need to add 6LoWPAN header -! error_t iphc_sendFromForwarding(OpenQueueEntry_t *msg, ipv6_header_iht ipv6_header, uint8_t fw_SendOrfw_Rcv) { -! open_addr_t temp_dest_prefix; -! open_addr_t temp_dest_mac64b; -! open_addr_t* p_dest; -! open_addr_t* p_src; -! open_addr_t temp_src_prefix; -! open_addr_t temp_src_mac64b; -! uint8_t sam; -! uint8_t dam; -! uint8_t nh; -! -! // take ownership over the packet -! msg->owner = COMPONENT_IPHC; -! -! // by default, the "next header" field is carried inline -! nh=IPHC_NH_INLINE; -! -! // error checking -! if (idmanager_getIsBridge()==TRUE && -! packetfunctions_isAllRoutersMulticast(&(msg->l3_destinationAdd))==FALSE) { -! openserial_printCritical(COMPONENT_IPHC,ERR_BRIDGE_MISMATCH, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return E_FAIL; -! } -! -! //discard the packet.. hop limit reached. -! if (ipv6_header.hop_limit==0) { -! openserial_printError(COMPONENT_IPHC,ERR_HOP_LIMIT_REACHED, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return E_FAIL; -! } -! -! packetfunctions_ip128bToMac64b(&(msg->l3_destinationAdd),&temp_dest_prefix,&temp_dest_mac64b); -! //xv poipoi -- get the src prefix as well -! packetfunctions_ip128bToMac64b(&(msg->l3_sourceAdd),&temp_src_prefix,&temp_src_mac64b); -! //XV -poipoi we want to check if the source address prefix is the same as destination prefix -! if (packetfunctions_sameAddress(&temp_dest_prefix,&temp_src_prefix)) { -! //dest and src on same prefix -! if (neighbors_isStableNeighbor(&(msg->l3_destinationAdd))) { -! //if direct neighbors, MAC nextHop and IP destination indicate same node -! //the source can be ME or another who I am relaying from. If its me then SAM is elided, -! //if not SAM is 64b address -! if (fw_SendOrfw_Rcv==PCKTFORWARD){ -! sam = IPHC_SAM_64B; //case forwarding a packet -! p_src = &temp_src_mac64b; -! } else if (fw_SendOrfw_Rcv==PCKTSEND){ -! sam = IPHC_SAM_ELIDED; -! p_src = NULL; -! } else { -! openserial_printCritical(COMPONENT_IPHC,ERR_INVALID_FWDMODE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! dam = IPHC_DAM_ELIDED; -! p_dest = NULL; -! } else { -! //else, not a direct neighbour use 64B address -! sam = IPHC_SAM_64B; -! dam = IPHC_DAM_64B; -! p_dest = &temp_dest_mac64b; -! p_src = &temp_src_mac64b; -! } -! } else { -! //not the same prefix. so the packet travels to another network -! //check if this is a source routing pkt. in case it is then the DAM is elided as it is in the SrcRouting header. -! if(ipv6_header.next_header!=IANA_IPv6ROUTE){ -! sam = IPHC_SAM_128B; -! dam = IPHC_DAM_128B; -! p_dest = &(msg->l3_destinationAdd); -! p_src = &(msg->l3_sourceAdd); -! }else{ -! //source routing -! sam = IPHC_SAM_128B; -! dam = IPHC_DAM_ELIDED; -! p_dest = NULL; -! p_src = &(msg->l3_sourceAdd); -! } -! } -! //check if we are forwarding a packet and it comes with the next header compressed. We want to preserve that state in the following hop. -! -! if ((fw_SendOrfw_Rcv==PCKTFORWARD) && ipv6_header.next_header_compressed) nh=IPHC_NH_COMPRESSED; -! -! // decrement the packet's hop limit -! ipv6_header.hop_limit--; -! -! if (prependIPv6Header(msg, -! IPHC_TF_ELIDED, -! 0, // value_flowlabel is not copied -! nh, -! msg->l4_protocol, -! IPHC_HLIM_INLINE, -! ipv6_header.hop_limit, -! IPHC_CID_NO, -! IPHC_SAC_STATELESS, -! sam, -! IPHC_M_NO, -! IPHC_DAC_STATELESS, -! dam, -! p_dest, -! p_src, -! fw_SendOrfw_Rcv -! )==E_FAIL) { -! return E_FAIL; -! } -! return res_send(msg); -! } -! -! //send from bridge: 6LoWPAN header already added by OpenLBR, send as is -! error_t iphc_sendFromBridge(OpenQueueEntry_t *msg) { -! msg->owner = COMPONENT_IPHC; -! // error checking -! if (idmanager_getIsBridge()==FALSE) { -! openserial_printCritical(COMPONENT_IPHC,ERR_BRIDGE_MISMATCH, -! (errorparameter_t)1, -! (errorparameter_t)0); -! return E_FAIL; -! } -! return res_send(msg); -! } -! -! void iphc_sendDone(OpenQueueEntry_t* msg, error_t error) { -! msg->owner = COMPONENT_IPHC; -! if (msg->creator==COMPONENT_OPENBRIDGE) { -! openbridge_sendDone(msg,error); -! } else { -! forwarding_sendDone(msg,error); -! } -! } -! -! void iphc_receive(OpenQueueEntry_t* msg) { -! ipv6_header_iht ipv6_header; -! msg->owner = COMPONENT_IPHC; -! ipv6_header = retrieveIPv6Header(msg); -! if (idmanager_getIsBridge()==FALSE || -! packetfunctions_isBroadcastMulticast(&(ipv6_header.dest))) { -! packetfunctions_tossHeader(msg,ipv6_header.header_length); -! forwarding_receive(msg,ipv6_header); //up the internal stack -! } else { -! openbridge_receive(msg); //out to the OpenVisualizer -! } -! } -! -! //=========================== private ========================================= -! -! error_t prependIPv6Header( -! OpenQueueEntry_t* msg, -! uint8_t tf, -! uint32_t value_flowLabel, -! bool nh, -! uint8_t value_nextHeader, -! uint8_t hlim, -! uint8_t value_hopLimit, -! bool cid, -! bool sac, -! uint8_t sam, -! bool m, -! bool dac, -! uint8_t dam, -! open_addr_t* value_dest, -! open_addr_t* value_src, -! uint8_t fw_SendOrfw_Rcv -! ) { -! -! uint8_t temp_8b; -! -! //destination address -! switch (dam) { -! case IPHC_DAM_ELIDED: -! break; -! case IPHC_DAM_16B: -! if (value_dest->type!=ADDR_16B) { -! openserial_printCritical(COMPONENT_IPHC,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)value_dest->type, -! (errorparameter_t)0); -! return E_FAIL; -! }; -! packetfunctions_writeAddress(msg,value_dest,BIG_ENDIAN); -! break; -! case IPHC_DAM_64B: -! if (value_dest->type!=ADDR_64B) { -! openserial_printCritical(COMPONENT_IPHC,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)value_dest->type, -! (errorparameter_t)1); -! return E_FAIL; -! }; -! packetfunctions_writeAddress(msg,value_dest,BIG_ENDIAN); -! break; -! case IPHC_DAM_128B: -! if (value_dest->type!=ADDR_128B) { -! openserial_printCritical(COMPONENT_IPHC,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)value_dest->type, -! (errorparameter_t)2); -! return E_FAIL; -! }; -! packetfunctions_writeAddress(msg,value_dest,BIG_ENDIAN); -! break; -! default: -! openserial_printCritical(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)0, -! (errorparameter_t)dam); -! return E_FAIL; -! } -! //source address -! switch (sam) { -! case IPHC_SAM_ELIDED: -! break; -! case IPHC_SAM_16B: -! if(fw_SendOrfw_Rcv==PCKTSEND) -! { -! packetfunctions_writeAddress(msg, (idmanager_getMyID(ADDR_16B)),BIG_ENDIAN); -! } -! if(fw_SendOrfw_Rcv==PCKTFORWARD) -! { -! if (value_src->type!=ADDR_16B) { -! openserial_printCritical(COMPONENT_IPHC,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)value_src->type, -! (errorparameter_t)0); -! return E_FAIL; -! } -! packetfunctions_writeAddress(msg,value_src,BIG_ENDIAN); -! } -! break; -! case IPHC_SAM_64B: -! if(fw_SendOrfw_Rcv==PCKTSEND) -! { -! packetfunctions_writeAddress(msg, (idmanager_getMyID(ADDR_64B)),BIG_ENDIAN); -! } -! if(fw_SendOrfw_Rcv==PCKTFORWARD) -! { -! if (value_src->type!=ADDR_64B) { -! openserial_printCritical(COMPONENT_IPHC,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)value_src->type, -! (errorparameter_t)1); -! return E_FAIL; -! } -! packetfunctions_writeAddress(msg, value_src,BIG_ENDIAN); -! } -! break; -! case IPHC_SAM_128B: -! if(fw_SendOrfw_Rcv==PCKTSEND) -! { -! packetfunctions_writeAddress(msg, (idmanager_getMyID(ADDR_64B)),BIG_ENDIAN); -! packetfunctions_writeAddress(msg, (idmanager_getMyID(ADDR_PREFIX)),BIG_ENDIAN); -! } -! if(fw_SendOrfw_Rcv==PCKTFORWARD) -! { -! if (value_src->type!=ADDR_128B) { -! openserial_printCritical(COMPONENT_IPHC,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)value_src->type, -! (errorparameter_t)2); -! return E_FAIL; -! } -! packetfunctions_writeAddress(msg,value_src,BIG_ENDIAN); -! } -! break; -! default: -! openserial_printCritical(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)1, -! (errorparameter_t)sam); -! return E_FAIL; -! } -! //hop limit -! switch (hlim) { -! case IPHC_HLIM_INLINE: -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = value_hopLimit; -! break; -! case IPHC_HLIM_1: -! case IPHC_HLIM_64: -! case IPHC_HLIM_255: -! break; -! default: -! openserial_printCritical(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)2, -! (errorparameter_t)hlim); -! return E_FAIL; -! } -! //next header -! switch (nh) { -! case IPHC_NH_INLINE: -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = value_nextHeader; -! break; -! case IPHC_NH_COMPRESSED: -! //do nothing, the next header will be there -! break; -! default: -! openserial_printCritical(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)3, -! (errorparameter_t)nh); -! return E_FAIL; -! } -! //flowlabel -! switch (tf) { -! case IPHC_TF_3B: -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = ((uint32_t)(value_flowLabel & 0x000000ff) >> 0); -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = ((uint32_t)(value_flowLabel & 0x0000ff00) >> 8); -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = ((uint32_t)(value_flowLabel & 0x00ff0000) >> 16); -! break; -! case IPHC_TF_ELIDED: -! break; -! case IPHC_TF_4B: -! //unsupported -! case IPHC_TF_1B: -! //unsupported -! default: -! openserial_printCritical(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)4, -! (errorparameter_t)tf); -! return E_FAIL; -! } -! //header -! temp_8b = 0; -! temp_8b |= cid << IPHC_CID; -! temp_8b |= sac << IPHC_SAC; -! temp_8b |= sam << IPHC_SAM; -! temp_8b |= m << IPHC_M; -! temp_8b |= dac << IPHC_DAC; -! temp_8b |= dam << IPHC_DAM; -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = temp_8b; -! temp_8b = 0; -! temp_8b |= IPHC_DISPATCH_IPHC << IPHC_DISPATCH; -! temp_8b |= tf << IPHC_TF; -! temp_8b |= nh << IPHC_NH; -! temp_8b |= hlim << IPHC_HLIM; -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = temp_8b; -! return E_SUCCESS; -! } -! -! ipv6_header_iht retrieveIPv6Header(OpenQueueEntry_t* msg) { -! uint8_t temp_8b; -! open_addr_t temp_addr_16b; -! open_addr_t temp_addr_64b; -! ipv6_header_iht ipv6_header; -! uint8_t dispatch; -! uint8_t tf; -! bool nh; -! uint8_t hlim; -! //bool cid; -! //bool sac; -! uint8_t sam; -! // bool m; -! //bool dac; -! uint8_t dam; -! -! ipv6_header.header_length = 0; -! //header -! temp_8b = *((uint8_t*)(msg->payload)+ipv6_header.header_length); -! dispatch = (temp_8b >> IPHC_DISPATCH) & 0x07;//3b -! tf = (temp_8b >> IPHC_TF) & 0x03;//2b -! nh = (temp_8b >> IPHC_NH) & 0x01;//1b -! hlim = (temp_8b >> IPHC_HLIM) & 0x03;//2b -! ipv6_header.header_length += sizeof(uint8_t); -! temp_8b = *((uint8_t*)(msg->payload)+ipv6_header.header_length); -! //cid = (temp_8b >> IPHC_CID) & 0x01;//1b unused -! //sac = (temp_8b >> IPHC_SAC) & 0x01;//1b unused -! sam = (temp_8b >> IPHC_SAM) & 0x03;//2b -! //m = (temp_8b >> IPHC_M) & 0x01;//1b unused -! //dac = (temp_8b >> IPHC_DAC) & 0x01;//1b unused -! dam = (temp_8b >> IPHC_DAM) & 0x03;//2b -! ipv6_header.header_length += sizeof(uint8_t); -! //dispatch -! switch (dispatch) { -! case IPHC_DISPATCH_IPHC: -! break; -! default: -! openserial_printError(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)5, -! (errorparameter_t)dispatch); -! break; -! } -! //flowlabel -! switch (tf) { -! case IPHC_TF_3B: -! ipv6_header.flow_label = ((uint32_t) *((uint8_t*)(msg->payload)+ipv6_header.header_length))<<0; -! ipv6_header.header_length += sizeof(uint8_t); -! ipv6_header.flow_label |= ((uint32_t) *((uint8_t*)(msg->payload)+ipv6_header.header_length))<<8; -! ipv6_header.header_length += sizeof(uint8_t); -! ipv6_header.flow_label |= ((uint32_t) *((uint8_t*)(msg->payload)+ipv6_header.header_length))<<16; -! ipv6_header.header_length += sizeof(uint8_t); -! break; -! case IPHC_TF_ELIDED: -! ipv6_header.flow_label = 0; -! break; -! case IPHC_TF_4B: -! //unsupported -! case IPHC_TF_1B: -! //unsupported -! default: -! openserial_printError(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)6, -! (errorparameter_t)tf); -! break; -! } -! //next header -! switch (nh) { -! case IPHC_NH_INLINE: -! // Full 8 bits for Next Header are carried in-line -! ipv6_header.next_header_compressed = FALSE; -! ipv6_header.next_header = *((uint8_t*)(msg->payload)+ipv6_header.header_length); -! ipv6_header.header_length += sizeof(uint8_t); -! break; -! case IPHC_NH_COMPRESSED: -! // the Next header field is compressed and the next header is encoded -! // using LOWPAN_NHC, which is discussed in Section 4.1 of RFC6282 -! // we don't parse anything here, but will look at the (compressed) -! // next header after having parsed all address fields. -! ipv6_header.next_header_compressed = TRUE; -! break; -! default: -! openserial_printError(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)7, -! (errorparameter_t)nh); -! break; -! } -! //hop limit -! switch (hlim) { -! case IPHC_HLIM_INLINE: -! ipv6_header.hop_limit = *((uint8_t*)(msg->payload+ipv6_header.header_length)); -! ipv6_header.header_length += sizeof(uint8_t); -! break; -! case IPHC_HLIM_1: -! ipv6_header.hop_limit = 1; -! break; -! case IPHC_HLIM_64: -! ipv6_header.hop_limit = 64; -! break; -! case IPHC_HLIM_255: -! ipv6_header.hop_limit = 255; -! break; -! default: -! openserial_printError(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)8, -! (errorparameter_t)hlim); -! break; -! } -! //source address -! switch (sam) { -! case IPHC_SAM_ELIDED: -! packetfunctions_mac64bToIp128b(idmanager_getMyID(ADDR_PREFIX),&(msg->l2_nextORpreviousHop),&ipv6_header.src); -! break; -! case IPHC_SAM_16B: -! packetfunctions_readAddress(((uint8_t*)(msg->payload+ipv6_header.header_length)),ADDR_16B,&temp_addr_16b,BIG_ENDIAN); -! ipv6_header.header_length += 2*sizeof(uint8_t); -! packetfunctions_mac16bToMac64b(&temp_addr_16b,&temp_addr_64b); -! packetfunctions_mac64bToIp128b(idmanager_getMyID(ADDR_PREFIX),&temp_addr_64b,&ipv6_header.src); -! break; -! case IPHC_SAM_64B: -! packetfunctions_readAddress(((uint8_t*)(msg->payload+ipv6_header.header_length)),ADDR_64B,&temp_addr_64b,BIG_ENDIAN); -! ipv6_header.header_length += 8*sizeof(uint8_t); -! packetfunctions_mac64bToIp128b(idmanager_getMyID(ADDR_PREFIX),&temp_addr_64b,&ipv6_header.src); -! break; -! case IPHC_SAM_128B: -! packetfunctions_readAddress(((uint8_t*)(msg->payload+ipv6_header.header_length)),ADDR_128B,&ipv6_header.src,BIG_ENDIAN); -! ipv6_header.header_length += 16*sizeof(uint8_t); -! break; -! default: -! openserial_printError(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)9, -! (errorparameter_t)sam); -! break; -! } -! //destination address -! switch (dam) { -! case IPHC_DAM_ELIDED: -! packetfunctions_mac64bToIp128b(idmanager_getMyID(ADDR_PREFIX),idmanager_getMyID(ADDR_64B),&(ipv6_header.dest)); -! break; -! case IPHC_DAM_16B: -! packetfunctions_readAddress(((uint8_t*)(msg->payload+ipv6_header.header_length)),ADDR_16B,&temp_addr_16b,BIG_ENDIAN); -! ipv6_header.header_length += 2*sizeof(uint8_t); -! packetfunctions_mac16bToMac64b(&temp_addr_16b,&temp_addr_64b); -! packetfunctions_mac64bToIp128b(idmanager_getMyID(ADDR_PREFIX),&temp_addr_64b,&ipv6_header.dest); -! break; -! case IPHC_DAM_64B: -! packetfunctions_readAddress(((uint8_t*)(msg->payload+ipv6_header.header_length)),ADDR_64B,&temp_addr_64b,BIG_ENDIAN); -! ipv6_header.header_length += 8*sizeof(uint8_t); -! packetfunctions_mac64bToIp128b(idmanager_getMyID(ADDR_PREFIX),&temp_addr_64b,&ipv6_header.dest); -! break; -! case IPHC_DAM_128B: -! packetfunctions_readAddress(((uint8_t*)(msg->payload+ipv6_header.header_length)),ADDR_128B,&ipv6_header.dest,BIG_ENDIAN); -! ipv6_header.header_length += 16*sizeof(uint8_t); -! break; -! default: -! openserial_printError(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)10, -! (errorparameter_t)dam); -! break; -! } -! /* -! During the parsing of the nh field, we found that the next header was -! compressed. We now identify which next (compressed) header this is, and -! populate the ipv6_header.next_header field accordingly. It's the role of the -! appropriate transport module to decompress the header. -! */ -! if (ipv6_header.next_header_compressed==TRUE) { -! temp_8b = *((uint8_t*)(msg->payload)+ipv6_header.header_length); -! if ( (temp_8b & NHC_UDP_MASK) == NHC_UDP_ID) { -! ipv6_header.next_header = IANA_UDP; -! } else { -! // the next header could be an IPv6 extension header, or misformed -! ipv6_header.next_header = IANA_UNDEFINED; -! openserial_printError(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)11, -! (errorparameter_t)ipv6_header.next_header); -! } -! } -! // this is a temporary workaround for allowing multicast RAs to go through -! //poipoi xv -- TODO -- check if this still needed. NO RAs anymore after RPL implementation. -! /*if (m==1 && dam==IPHC_DAM_ELIDED) { -! ipv6_header.header_length += sizeof(uint8_t); -! }*/ -! return ipv6_header; -! } ---- 1,695 ---- -! #include "openwsn.h" -! #include "iphc.h" -! #include "packetfunctions.h" -! #include "idmanager.h" -! #include "openserial.h" -! #include "res.h" -! #include "forwarding.h" -! #include "neighbors.h" -! #include "openbridge.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! owerror_t prependIPv6Header( -! OpenQueueEntry_t* msg, -! uint8_t tf, -! uint32_t value_flowLabel, -! bool nh, -! uint8_t value_nextHeader, -! uint8_t hlim, -! uint8_t value_hopLimit, -! bool cid, -! bool sac, -! uint8_t sam, -! bool m, -! bool dac, -! uint8_t dam, -! open_addr_t* value_dest, -! open_addr_t* value_src, -! uint8_t fw_SendOrfw_Rcv -! ); -! ipv6_header_iht retrieveIPv6Header(OpenQueueEntry_t* msg); -! //hop by hop header -! void prependIPv6HopByHopHeader(OpenQueueEntry_t* msg,uint8_t nextheader, bool nh, rpl_hopoption_ht *hopbyhop_option); -! void retrieveIPv6HopByHopHeader(OpenQueueEntry_t* msg, ipv6_hopbyhop_ht *hopbyhop_header, rpl_hopoption_ht *rpl_option); -! //=========================== public ========================================== -! -! void iphc_init(void) { -! } -! -! //send from upper layer: I need to add 6LoWPAN header -! owerror_t iphc_sendFromForwarding(OpenQueueEntry_t *msg, ipv6_header_iht ipv6_header, rpl_hopoption_ht *hopbyhop_option, uint8_t fw_SendOrfw_Rcv) { -! open_addr_t temp_dest_prefix; -! open_addr_t temp_dest_mac64b; -! open_addr_t* p_dest; -! open_addr_t* p_src; -! open_addr_t temp_src_prefix; -! open_addr_t temp_src_mac64b; -! uint8_t sam; -! uint8_t dam; -! uint8_t nh; -! uint8_t next_header; -! //option header -! -! // take ownership over the packet -! msg->owner = COMPONENT_IPHC; -! -! // by default, the "next header" field is carried inline -! nh=IPHC_NH_INLINE; -! -! // error checking -! if (idmanager_getIsBridge()==TRUE && -! packetfunctions_isAllRoutersMulticast(&(msg->l3_destinationAdd))==FALSE) { -! openserial_printCritical(COMPONENT_IPHC,ERR_BRIDGE_MISMATCH, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return E_FAIL; -! } -! -! //discard the packet.. hop limit reached. -! if (ipv6_header.hop_limit==0) { -! openserial_printError(COMPONENT_IPHC,ERR_HOP_LIMIT_REACHED, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return E_FAIL; -! } -! -! packetfunctions_ip128bToMac64b(&(msg->l3_destinationAdd),&temp_dest_prefix,&temp_dest_mac64b); -! //xv poipoi -- get the src prefix as well -! packetfunctions_ip128bToMac64b(&(msg->l3_sourceAdd),&temp_src_prefix,&temp_src_mac64b); -! //XV -poipoi we want to check if the source address prefix is the same as destination prefix -! if (packetfunctions_sameAddress(&temp_dest_prefix,&temp_src_prefix)) { -! //dest and src on same prefix -! if (neighbors_isStableNeighbor(&(msg->l3_destinationAdd))) { -! //if direct neighbors, MAC nextHop and IP destination indicate same node -! //the source can be ME or another who I am relaying from. If its me then SAM is elided, -! //if not SAM is 64b address -! if (fw_SendOrfw_Rcv==PCKTFORWARD){ -! sam = IPHC_SAM_64B; //case forwarding a packet -! p_src = &temp_src_mac64b; -! //poipoi xv forcing elided addresses on src routing, this needs to be fixed so any type of address should be supported supported. -! } else if (fw_SendOrfw_Rcv==PCKTSEND){ -! sam = IPHC_SAM_ELIDED; -! p_src = NULL; -! } else { -! openserial_printCritical(COMPONENT_IPHC,ERR_INVALID_FWDMODE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! dam = IPHC_DAM_ELIDED; -! p_dest = NULL; -! } else { -! //else, not a direct neighbour use 64B address -! sam = IPHC_SAM_64B; -! dam = IPHC_DAM_64B; -! p_dest = &temp_dest_mac64b; -! p_src = &temp_src_mac64b; -! } -! } else { -! //not the same prefix. so the packet travels to another network -! //check if this is a source routing pkt. in case it is then the DAM is elided as it is in the SrcRouting header. -! if(ipv6_header.next_header!=IANA_IPv6ROUTE){ -! sam = IPHC_SAM_128B; -! dam = IPHC_DAM_128B; -! p_dest = &(msg->l3_destinationAdd); -! p_src = &(msg->l3_sourceAdd); -! }else{ -! //source routing -! sam = IPHC_SAM_128B; -! dam = IPHC_DAM_ELIDED; //poipoi xv not true, should not be elided. -! p_dest = NULL; -! p_src = &(msg->l3_sourceAdd); -! } -! } -! //check if we are forwarding a packet and it comes with the next header compressed. We want to preserve that state in the following hop. -! -! if ((fw_SendOrfw_Rcv==PCKTFORWARD) && ipv6_header.next_header_compressed) nh=IPHC_NH_COMPRESSED; -! -! // decrement the packet's hop limit -! ipv6_header.hop_limit--; -! -! //prepend Option hop by hop header except when src routing and dst is not 0xffff -- this is a little trick as src routing is using an option header set to 0x00 -! next_header=msg->l4_protocol; -! if (hopbyhop_option->optionType==RPL_HOPBYHOP_HEADER_OPTION_TYPE -! && packetfunctions_isBroadcastMulticast(&(msg->l3_destinationAdd))==FALSE ){ -! prependIPv6HopByHopHeader(msg, msg->l4_protocol, nh, hopbyhop_option); -! //change nh to point to the newly added header -! next_header=IANA_IPv6HOPOPT;// use 0x00 as NH to indicate option header -- see rfc 2460 -! } -! //then regular header -! if (prependIPv6Header(msg, -! IPHC_TF_ELIDED, -! 0, // value_flowlabel is not copied -! nh, -! next_header, -! IPHC_HLIM_INLINE, -! ipv6_header.hop_limit, -! IPHC_CID_NO, -! IPHC_SAC_STATELESS, -! sam, -! IPHC_M_NO, -! IPHC_DAC_STATELESS, -! dam, -! p_dest, -! p_src, -! fw_SendOrfw_Rcv -! )==E_FAIL) { -! return E_FAIL; -! } -! -! return res_send(msg); -! } -! -! -! -! -! //send from bridge: 6LoWPAN header already added by OpenLBR, send as is -! owerror_t iphc_sendFromBridge(OpenQueueEntry_t *msg) { -! msg->owner = COMPONENT_IPHC; -! // error checking -! if (idmanager_getIsBridge()==FALSE) { -! openserial_printCritical(COMPONENT_IPHC,ERR_BRIDGE_MISMATCH, -! (errorparameter_t)1, -! (errorparameter_t)0); -! return E_FAIL; -! } -! return res_send(msg); -! } -! -! void iphc_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! msg->owner = COMPONENT_IPHC; -! if (msg->creator==COMPONENT_OPENBRIDGE) { -! openbridge_sendDone(msg,error); -! } else { -! forwarding_sendDone(msg,error); -! } -! } -! -! void iphc_receive(OpenQueueEntry_t* msg) { -! ipv6_header_iht ipv6_header; -! ipv6_hopbyhop_ht ipv6_hop_header; -! rpl_hopoption_ht hop_by_hop_option; -! -! msg->owner = COMPONENT_IPHC; -! -! //then regular header -! ipv6_header = retrieveIPv6Header(msg); -! -! -! if (idmanager_getIsBridge()==FALSE || -! packetfunctions_isBroadcastMulticast(&(ipv6_header.dest))) { -! packetfunctions_tossHeader(msg,ipv6_header.header_length); -! -! if (ipv6_header.next_header==IANA_IPv6HOPOPT){ -! //retrieve hop by hop header -! retrieveIPv6HopByHopHeader(msg,&ipv6_hop_header,&hop_by_hop_option); -! //toss the header + option +tlv on it if any -! packetfunctions_tossHeader(msg,IPv6HOP_HDR_LEN+ipv6_hop_header.HdrExtLen); -! } -! forwarding_receive(msg,ipv6_header,ipv6_hop_header,hop_by_hop_option); //up the internal stack -! } else { -! openbridge_receive(msg); //out to the OpenVisualizer -! } -! } -! -! //=========================== private ========================================= -! -! -! void prependIPv6HopByHopHeader(OpenQueueEntry_t *msg,uint8_t nextheader, bool nh, rpl_hopoption_ht *hopbyhop_option){ -! -! //copy them in reverse order, first option later header -! packetfunctions_reserveHeaderSize(msg,sizeof(rpl_hopoption_ht)); -! memcpy(msg->payload,hopbyhop_option,sizeof(rpl_hopoption_ht)); -! -! //hdr len as defined by rfc6282 sect 4.2 -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = sizeof(rpl_hopoption_ht); -! -! //next header -! switch (nh) { -! case IPHC_NH_INLINE: -! //add the next header inline -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = nextheader; -! -! //append NHC field on the extension header should be 1110 0000 -- see rfc 6282 sect 4.2 -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = NHC_IPv6EXT_ID; -! break; -! case IPHC_NH_COMPRESSED: -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = NHC_IPv6EXT_ID | 0x01; //mark last bit as 1 -- see rfc 6282 sect 4.2 -! break; -! default: -! openserial_printCritical(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)3, -! (errorparameter_t)nh); -! } -! -! } -! -! owerror_t prependIPv6Header( -! OpenQueueEntry_t* msg, -! uint8_t tf, -! uint32_t value_flowLabel, -! bool nh, -! uint8_t value_nextHeader, -! uint8_t hlim, -! uint8_t value_hopLimit, -! bool cid, -! bool sac, -! uint8_t sam, -! bool m, -! bool dac, -! uint8_t dam, -! open_addr_t* value_dest, -! open_addr_t* value_src, -! uint8_t fw_SendOrfw_Rcv -! ) { -! -! uint8_t temp_8b; -! -! //destination address -! switch (dam) { -! case IPHC_DAM_ELIDED: -! break; -! case IPHC_DAM_16B: -! if (value_dest->type!=ADDR_16B) { -! openserial_printCritical(COMPONENT_IPHC,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)value_dest->type, -! (errorparameter_t)0); -! return E_FAIL; -! }; -! packetfunctions_writeAddress(msg,value_dest,OW_BIG_ENDIAN); -! break; -! case IPHC_DAM_64B: -! if (value_dest->type!=ADDR_64B) { -! openserial_printCritical(COMPONENT_IPHC,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)value_dest->type, -! (errorparameter_t)1); -! return E_FAIL; -! }; -! packetfunctions_writeAddress(msg,value_dest,OW_BIG_ENDIAN); -! break; -! case IPHC_DAM_128B: -! if (value_dest->type!=ADDR_128B) { -! openserial_printCritical(COMPONENT_IPHC,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)value_dest->type, -! (errorparameter_t)2); -! return E_FAIL; -! }; -! packetfunctions_writeAddress(msg,value_dest,OW_BIG_ENDIAN); -! break; -! default: -! openserial_printCritical(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)0, -! (errorparameter_t)dam); -! return E_FAIL; -! } -! //source address -! switch (sam) { -! case IPHC_SAM_ELIDED: -! break; -! case IPHC_SAM_16B: -! if(fw_SendOrfw_Rcv==PCKTSEND) -! { -! packetfunctions_writeAddress(msg, (idmanager_getMyID(ADDR_16B)),OW_BIG_ENDIAN); -! } -! if(fw_SendOrfw_Rcv==PCKTFORWARD) -! { -! if (value_src->type!=ADDR_16B) { -! openserial_printCritical(COMPONENT_IPHC,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)value_src->type, -! (errorparameter_t)0); -! return E_FAIL; -! } -! packetfunctions_writeAddress(msg,value_src,OW_BIG_ENDIAN); -! } -! break; -! case IPHC_SAM_64B: -! if(fw_SendOrfw_Rcv==PCKTSEND) -! { -! packetfunctions_writeAddress(msg, (idmanager_getMyID(ADDR_64B)),OW_BIG_ENDIAN); -! } -! if(fw_SendOrfw_Rcv==PCKTFORWARD) -! { -! if (value_src->type!=ADDR_64B) { -! openserial_printCritical(COMPONENT_IPHC,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)value_src->type, -! (errorparameter_t)1); -! return E_FAIL; -! } -! packetfunctions_writeAddress(msg, value_src,OW_BIG_ENDIAN); -! } -! break; -! case IPHC_SAM_128B: -! if(fw_SendOrfw_Rcv==PCKTSEND) -! { -! packetfunctions_writeAddress(msg, (idmanager_getMyID(ADDR_64B)),OW_BIG_ENDIAN); -! packetfunctions_writeAddress(msg, (idmanager_getMyID(ADDR_PREFIX)),OW_BIG_ENDIAN); -! } -! if(fw_SendOrfw_Rcv==PCKTFORWARD) -! { -! if (value_src->type!=ADDR_128B) { -! openserial_printCritical(COMPONENT_IPHC,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)value_src->type, -! (errorparameter_t)2); -! return E_FAIL; -! } -! packetfunctions_writeAddress(msg,value_src,OW_BIG_ENDIAN); -! } -! break; -! default: -! openserial_printCritical(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)1, -! (errorparameter_t)sam); -! return E_FAIL; -! } -! //hop limit -! switch (hlim) { -! case IPHC_HLIM_INLINE: -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = value_hopLimit; -! break; -! case IPHC_HLIM_1: -! case IPHC_HLIM_64: -! case IPHC_HLIM_255: -! break; -! default: -! openserial_printCritical(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)2, -! (errorparameter_t)hlim); -! return E_FAIL; -! } -! //next header -! switch (nh) { -! case IPHC_NH_INLINE: -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = value_nextHeader; -! break; -! case IPHC_NH_COMPRESSED: -! //do nothing, the next header will be there -! break; -! default: -! openserial_printCritical(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)3, -! (errorparameter_t)nh); -! return E_FAIL; -! } -! //flowlabel -! switch (tf) { -! case IPHC_TF_3B: -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = ((uint32_t)(value_flowLabel & 0x000000ff) >> 0); -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = ((uint32_t)(value_flowLabel & 0x0000ff00) >> 8); -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = ((uint32_t)(value_flowLabel & 0x00ff0000) >> 16); -! break; -! case IPHC_TF_ELIDED: -! break; -! case IPHC_TF_4B: -! //unsupported -! case IPHC_TF_1B: -! //unsupported -! default: -! openserial_printCritical(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)4, -! (errorparameter_t)tf); -! return E_FAIL; -! } -! //header -! temp_8b = 0; -! temp_8b |= cid << IPHC_CID; -! temp_8b |= sac << IPHC_SAC; -! temp_8b |= sam << IPHC_SAM; -! temp_8b |= m << IPHC_M; -! temp_8b |= dac << IPHC_DAC; -! temp_8b |= dam << IPHC_DAM; -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = temp_8b; -! temp_8b = 0; -! temp_8b |= IPHC_DISPATCH_IPHC << IPHC_DISPATCH; -! temp_8b |= tf << IPHC_TF; -! temp_8b |= nh << IPHC_NH; -! temp_8b |= hlim << IPHC_HLIM; -! packetfunctions_reserveHeaderSize(msg,sizeof(uint8_t)); -! *((uint8_t*)(msg->payload)) = temp_8b; -! return E_SUCCESS; -! } -! -! -! -! void retrieveIPv6HopByHopHeader(OpenQueueEntry_t *msg,ipv6_hopbyhop_ht *hopbyhop_header, rpl_hopoption_ht *rpl_option){ -! uint8_t temp_8b; -! -! hopbyhop_header->headerlen=0; -! -! hopbyhop_header->lowpan_nhc = *((uint8_t*)(msg->payload)+ hopbyhop_header->headerlen); -! hopbyhop_header->headerlen += sizeof(uint8_t); -! -! //next header -! switch ( hopbyhop_header->lowpan_nhc & NHC_HOP_NH_MASK) { -! case IPHC_NH_INLINE: -! // Full 8 bits for Next Header are carried in-line -! hopbyhop_header->next_header_compressed = FALSE; -! hopbyhop_header->nextHeader = *((uint8_t*)(msg->payload)+hopbyhop_header->headerlen); -! hopbyhop_header->headerlen+= sizeof(uint8_t); -! break; -! case IPHC_NH_COMPRESSED: -! // the Next header field is compressed and the next header is encoded -! // using LOWPAN_NHC, which is discussed in Section 4.1 of RFC6282 -! // we don't parse anything here, but will look at the (compressed) -! // next header after having parsed all address fields. -! hopbyhop_header->next_header_compressed = TRUE; -! break; -! default: -! openserial_printError(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)7, -! (errorparameter_t)hopbyhop_header->lowpan_nhc); -! break; -! } -! -! //len of options -! hopbyhop_header->HdrExtLen =*((uint8_t*)(msg->payload)+hopbyhop_header->headerlen); -! hopbyhop_header->headerlen+= sizeof(uint8_t); -! //copy the options -! memcpy(rpl_option,((uint8_t*)(msg->payload)+hopbyhop_header->headerlen),sizeof(rpl_hopoption_ht)); -! hopbyhop_header->headerlen+= sizeof(rpl_hopoption_ht); -! -! //now in case nh compressed: -! /* -! During the parsing of the nh field, we found that the next header was -! compressed. We now identify which next (compressed) header this is, and -! populate the hopbyhop_header.nextHeader field accordingly. It's the role of the -! appropriate transport module to decompress the header. -! */ -! if (hopbyhop_header->next_header_compressed==TRUE) { -! temp_8b = *((uint8_t*)(msg->payload)+ hopbyhop_header->headerlen); -! if ( (temp_8b & NHC_UDP_MASK) == NHC_UDP_ID) { -! hopbyhop_header->nextHeader = IANA_UDP; -! }else { -! // the next header could be an IPv6 extension header, or misformed -! hopbyhop_header->nextHeader = IANA_UNDEFINED; -! openserial_printError(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)14, -! (errorparameter_t)hopbyhop_header->nextHeader); -! } -! } -! } -! -! -! ipv6_header_iht retrieveIPv6Header(OpenQueueEntry_t* msg) { -! uint8_t temp_8b; -! open_addr_t temp_addr_16b; -! open_addr_t temp_addr_64b; -! ipv6_header_iht ipv6_header; -! uint8_t dispatch; -! uint8_t tf; -! bool nh; -! uint8_t hlim; -! //bool cid; -! //bool sac; -! uint8_t sam; -! // bool m; -! //bool dac; -! uint8_t dam; -! -! ipv6_header.header_length = 0; -! //header -! temp_8b = *((uint8_t*)(msg->payload)+ipv6_header.header_length); -! dispatch = (temp_8b >> IPHC_DISPATCH) & 0x07;//3b -! tf = (temp_8b >> IPHC_TF) & 0x03;//2b -! nh = (temp_8b >> IPHC_NH) & 0x01;//1b -! hlim = (temp_8b >> IPHC_HLIM) & 0x03;//2b -! ipv6_header.header_length += sizeof(uint8_t); -! temp_8b = *((uint8_t*)(msg->payload)+ipv6_header.header_length); -! //cid = (temp_8b >> IPHC_CID) & 0x01;//1b unused -! //sac = (temp_8b >> IPHC_SAC) & 0x01;//1b unused -! sam = (temp_8b >> IPHC_SAM) & 0x03;//2b -! //m = (temp_8b >> IPHC_M) & 0x01;//1b unused -! //dac = (temp_8b >> IPHC_DAC) & 0x01;//1b unused -! dam = (temp_8b >> IPHC_DAM) & 0x03;//2b -! ipv6_header.header_length += sizeof(uint8_t); -! //dispatch -! switch (dispatch) { -! case IPHC_DISPATCH_IPHC: -! break; -! default: -! openserial_printError(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)5, -! (errorparameter_t)dispatch); -! break; -! } -! //flowlabel -! switch (tf) { -! case IPHC_TF_3B: -! ipv6_header.flow_label = ((uint32_t) *((uint8_t*)(msg->payload)+ipv6_header.header_length))<<0; -! ipv6_header.header_length += sizeof(uint8_t); -! ipv6_header.flow_label |= ((uint32_t) *((uint8_t*)(msg->payload)+ipv6_header.header_length))<<8; -! ipv6_header.header_length += sizeof(uint8_t); -! ipv6_header.flow_label |= ((uint32_t) *((uint8_t*)(msg->payload)+ipv6_header.header_length))<<16; -! ipv6_header.header_length += sizeof(uint8_t); -! break; -! case IPHC_TF_ELIDED: -! ipv6_header.flow_label = 0; -! break; -! case IPHC_TF_4B: -! //unsupported -! case IPHC_TF_1B: -! //unsupported -! default: -! openserial_printError(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)6, -! (errorparameter_t)tf); -! break; -! } -! //next header -! switch (nh) { -! case IPHC_NH_INLINE: -! // Full 8 bits for Next Header are carried in-line -! ipv6_header.next_header_compressed = FALSE; -! ipv6_header.next_header = *((uint8_t*)(msg->payload)+ipv6_header.header_length); -! ipv6_header.header_length += sizeof(uint8_t); -! -! break; -! case IPHC_NH_COMPRESSED: -! // the Next header field is compressed and the next header is encoded -! // using LOWPAN_NHC, which is discussed in Section 4.1 of RFC6282 -! // we don't parse anything here, but will look at the (compressed) -! // next header after having parsed all address fields. -! ipv6_header.next_header_compressed = TRUE; -! break; -! default: -! openserial_printError(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)7, -! (errorparameter_t)nh); -! break; -! } -! //hop limit -! switch (hlim) { -! case IPHC_HLIM_INLINE: -! ipv6_header.hop_limit = *((uint8_t*)(msg->payload+ipv6_header.header_length)); -! ipv6_header.header_length += sizeof(uint8_t); -! break; -! case IPHC_HLIM_1: -! ipv6_header.hop_limit = 1; -! break; -! case IPHC_HLIM_64: -! ipv6_header.hop_limit = 64; -! break; -! case IPHC_HLIM_255: -! ipv6_header.hop_limit = 255; -! break; -! default: -! openserial_printError(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)8, -! (errorparameter_t)hlim); -! break; -! } -! //source address -! switch (sam) { -! case IPHC_SAM_ELIDED: -! packetfunctions_mac64bToIp128b(idmanager_getMyID(ADDR_PREFIX),&(msg->l2_nextORpreviousHop),&ipv6_header.src); -! break; -! case IPHC_SAM_16B: -! packetfunctions_readAddress(((uint8_t*)(msg->payload+ipv6_header.header_length)),ADDR_16B,&temp_addr_16b,OW_BIG_ENDIAN); -! ipv6_header.header_length += 2*sizeof(uint8_t); -! packetfunctions_mac16bToMac64b(&temp_addr_16b,&temp_addr_64b); -! packetfunctions_mac64bToIp128b(idmanager_getMyID(ADDR_PREFIX),&temp_addr_64b,&ipv6_header.src); -! break; -! case IPHC_SAM_64B: -! packetfunctions_readAddress(((uint8_t*)(msg->payload+ipv6_header.header_length)),ADDR_64B,&temp_addr_64b,OW_BIG_ENDIAN); -! ipv6_header.header_length += 8*sizeof(uint8_t); -! packetfunctions_mac64bToIp128b(idmanager_getMyID(ADDR_PREFIX),&temp_addr_64b,&ipv6_header.src); -! break; -! case IPHC_SAM_128B: -! packetfunctions_readAddress(((uint8_t*)(msg->payload+ipv6_header.header_length)),ADDR_128B,&ipv6_header.src,OW_BIG_ENDIAN); -! ipv6_header.header_length += 16*sizeof(uint8_t); -! break; -! default: -! openserial_printError(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)9, -! (errorparameter_t)sam); -! break; -! } -! //destination address -! switch (dam) { -! case IPHC_DAM_ELIDED: -! packetfunctions_mac64bToIp128b(idmanager_getMyID(ADDR_PREFIX),idmanager_getMyID(ADDR_64B),&(ipv6_header.dest)); -! break; -! case IPHC_DAM_16B: -! packetfunctions_readAddress(((uint8_t*)(msg->payload+ipv6_header.header_length)),ADDR_16B,&temp_addr_16b,OW_BIG_ENDIAN); -! ipv6_header.header_length += 2*sizeof(uint8_t); -! packetfunctions_mac16bToMac64b(&temp_addr_16b,&temp_addr_64b); -! packetfunctions_mac64bToIp128b(idmanager_getMyID(ADDR_PREFIX),&temp_addr_64b,&ipv6_header.dest); -! break; -! case IPHC_DAM_64B: -! packetfunctions_readAddress(((uint8_t*)(msg->payload+ipv6_header.header_length)),ADDR_64B,&temp_addr_64b,OW_BIG_ENDIAN); -! ipv6_header.header_length += 8*sizeof(uint8_t); -! packetfunctions_mac64bToIp128b(idmanager_getMyID(ADDR_PREFIX),&temp_addr_64b,&ipv6_header.dest); -! break; -! case IPHC_DAM_128B: -! packetfunctions_readAddress(((uint8_t*)(msg->payload+ipv6_header.header_length)),ADDR_128B,&ipv6_header.dest,OW_BIG_ENDIAN); -! ipv6_header.header_length += 16*sizeof(uint8_t); -! break; -! default: -! openserial_printError(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)10, -! (errorparameter_t)dam); -! break; -! } -! /* -! During the parsing of the nh field, we found that the next header was -! compressed. We now identify which next (compressed) header this is, and -! populate the ipv6_header.next_header field accordingly. It's the role of the -! appropriate transport module to decompress the header. -! */ -! if (ipv6_header.next_header_compressed==TRUE) { -! temp_8b = *((uint8_t*)(msg->payload)+ipv6_header.header_length); -! if ( (temp_8b & NHC_UDP_MASK) == NHC_UDP_ID) { -! ipv6_header.next_header = IANA_UDP; -! }else if ( (temp_8b & NHC_IPv6EXT_MASK) == NHC_IPv6EXT_ID){ -! if( (temp_8b & NHC_IPv6HOP_MASK) == NHC_IPv6HOP_VAL){ -! //it is hop by hop header -! ipv6_header.next_header = IANA_IPv6HOPOPT; -! }else{ -! // the next header could be another IPv6 extension header -! ipv6_header.next_header = IANA_UNDEFINED; -! openserial_printError(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)11, -! (errorparameter_t)ipv6_header.next_header); -! } -! }else { -! // the next header could be an IPv6 extension header, or misformed -! ipv6_header.next_header = IANA_UNDEFINED; -! openserial_printError(COMPONENT_IPHC,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)12, -! (errorparameter_t)ipv6_header.next_header); -! } -! } -! -! return ipv6_header; -! } -diff -crB openwsn/03a-IPHC/iphc.h ../../../sys/net/openwsn/03a-IPHC/iphc.h -*** openwsn/03a-IPHC/iphc.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/03a-IPHC/iphc.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,134 **** -! #ifndef __IPHC_H -! #define __IPHC_H -! -! /** -! \addtogroup LoWPAN -! \{ -! \addtogroup IPHC -! \{ -! */ -! -! //=========================== define ========================================== -! -! #define IPHC_DEFAULT_HOP_LIMIT 65 -! -! enum IPHC_enums { -! IPHC_DISPATCH = 5, -! IPHC_TF = 3, -! IPHC_NH = 2, -! IPHC_HLIM = 0, -! IPHC_CID = 7, -! IPHC_SAC = 6, -! IPHC_SAM = 4, -! IPHC_M = 3, -! IPHC_DAC = 2, -! IPHC_DAM = 0, -! }; -! -! enum IPHC_DISPATCH_enums { -! IPHC_DISPATCH_IPHC = 3, -! }; -! -! enum IPHC_TF_enums { -! IPHC_TF_4B = 0, -! IPHC_TF_3B = 1, -! IPHC_TF_1B = 2, -! IPHC_TF_ELIDED = 3, -! }; -! -! enum IPHC_NH_enums { -! IPHC_NH_INLINE = 0, -! IPHC_NH_COMPRESSED = 1, -! }; -! -! enum NHC_enums { -! // IPv6 Extension Header Encoding starts with b1110 xxxx -! NHC_IPv6EXT_MASK = 0xf0, // b1111 0000 -! NHC_IPv6EXT_ID = 0xe0, // b1110 0000 -! // UDP Header Encoding starts with b1111 0xxx -! NHC_UDP_MASK = 0xf8, // b1111 1000 -! NHC_UDP_ID = 0xf0, // b1111 0000 -! }; -! -! enum NHC_UDP_enums { -! NHC_UDP_C_MASK = 0x40, -! NHC_UDP_PORTS_MASK = 0x03, -! }; -! -! enum NHC_UDP_PORTS_enums { -! NHC_UDP_PORTS_INLINE = 0, -! NHC_UDP_PORTS_16S_8D = 1, -! NHC_UDP_PORTS_8S_8D = 2, -! NHC_UDP_PORTS_4S_4D = 3, -! }; -! -! enum IPHC_HLIM_enums { -! IPHC_HLIM_INLINE = 0, -! IPHC_HLIM_1 = 1, -! IPHC_HLIM_64 = 2, -! IPHC_HLIM_255 = 3, -! }; -! -! enum IPHC_CID_enums { -! IPHC_CID_NO = 0, -! IPHC_CID_YES = 1, -! }; -! -! enum IPHC_SAC_enums { -! IPHC_SAC_STATELESS = 0, -! IPHC_SAC_STATEFUL = 1, -! }; -! -! enum IPHC_SAM_enums { -! IPHC_SAM_128B = 0, -! IPHC_SAM_64B = 1, -! IPHC_SAM_16B = 2, -! IPHC_SAM_ELIDED = 3, -! }; -! -! enum IPHC_M_enums { -! IPHC_M_NO = 0, -! IPHC_M_YES = 1, -! }; -! -! enum IPHC_DAC_enums { -! IPHC_DAC_STATELESS = 0, -! IPHC_DAC_STATEFUL = 1, -! }; -! -! enum IPHC_DAM_enums { -! IPHC_DAM_128B = 0, -! IPHC_DAM_64B = 1, -! IPHC_DAM_16B = 2, -! IPHC_DAM_ELIDED = 3, -! }; -! -! //=========================== typedef ========================================= -! -! typedef struct { -! uint8_t traffic_class; -! uint32_t flow_label; -! bool next_header_compressed; -! uint8_t next_header; -! uint8_t hop_limit; -! open_addr_t src; -! open_addr_t dest; -! uint8_t header_length; ///< needed to toss the header -! } ipv6_header_iht; //iht for "internal header type" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void iphc_init(); -! error_t iphc_sendFromForwarding(OpenQueueEntry_t *msg, ipv6_header_iht ipv6_header, uint8_t fw_SendOrfw_Rcv); -! error_t iphc_sendFromBridge(OpenQueueEntry_t *msg); -! void iphc_sendDone(OpenQueueEntry_t* msg, error_t error); -! void iphc_receive(OpenQueueEntry_t* msg); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,184 ---- -! #ifndef __IPHC_H -! #define __IPHC_H -! -! /** -! \addtogroup LoWPAN -! \{ -! \addtogroup IPHC -! \{ -! */ -! -! #include "openwsn.h" -! //=========================== define ========================================== -! -! #define IPHC_DEFAULT_HOP_LIMIT 65 -! #define IPv6HOP_HDR_LEN 3 -! -! enum IPHC_enums { -! IPHC_DISPATCH = 5, -! IPHC_TF = 3, -! IPHC_NH = 2, -! IPHC_HLIM = 0, -! IPHC_CID = 7, -! IPHC_SAC = 6, -! IPHC_SAM = 4, -! IPHC_M = 3, -! IPHC_DAC = 2, -! IPHC_DAM = 0, -! }; -! -! enum IPHC_DISPATCH_enums { -! IPHC_DISPATCH_IPHC = 3, -! }; -! -! enum IPHC_TF_enums { -! IPHC_TF_4B = 0, -! IPHC_TF_3B = 1, -! IPHC_TF_1B = 2, -! IPHC_TF_ELIDED = 3, -! }; -! -! enum IPHC_NH_enums { -! IPHC_NH_INLINE = 0, -! IPHC_NH_COMPRESSED = 1, -! }; -! -! enum NHC_enums { -! // IPv6 Extension Header Encoding starts with b1110 xxxx -! NHC_IPv6EXT_MASK = 0xf0, // b1111 0000 -! NHC_IPv6EXT_ID = 0xe0, // b1110 0000 -! // UDP Header Encoding starts with b1111 0xxx -! NHC_UDP_MASK = 0xf8, // b1111 1000 -! NHC_UDP_ID = 0xf0, // b1111 0000 -! }; -! -! enum NHC_IPv6HOP_enums { -! NHC_IPv6HOP_MASK = 0x0e, -! NHC_IPv6HOP_VAL = 0x0e, -! NHC_HOP_NH_MASK = 0x01, -! }; -! -! -! enum NHC_UDP_enums { -! NHC_UDP_C_MASK = 0x40, -! NHC_UDP_PORTS_MASK = 0x03, -! }; -! -! enum NHC_UDP_PORTS_enums { -! NHC_UDP_PORTS_INLINE = 0, -! NHC_UDP_PORTS_16S_8D = 1, -! NHC_UDP_PORTS_8S_8D = 2, -! NHC_UDP_PORTS_4S_4D = 3, -! }; -! -! enum IPHC_HLIM_enums { -! IPHC_HLIM_INLINE = 0, -! IPHC_HLIM_1 = 1, -! IPHC_HLIM_64 = 2, -! IPHC_HLIM_255 = 3, -! }; -! -! enum IPHC_CID_enums { -! IPHC_CID_NO = 0, -! IPHC_CID_YES = 1, -! }; -! -! enum IPHC_SAC_enums { -! IPHC_SAC_STATELESS = 0, -! IPHC_SAC_STATEFUL = 1, -! }; -! -! enum IPHC_SAM_enums { -! IPHC_SAM_128B = 0, -! IPHC_SAM_64B = 1, -! IPHC_SAM_16B = 2, -! IPHC_SAM_ELIDED = 3, -! }; -! -! enum IPHC_M_enums { -! IPHC_M_NO = 0, -! IPHC_M_YES = 1, -! }; -! -! enum IPHC_DAC_enums { -! IPHC_DAC_STATELESS = 0, -! IPHC_DAC_STATEFUL = 1, -! }; -! -! enum IPHC_DAM_enums { -! IPHC_DAM_128B = 0, -! IPHC_DAM_64B = 1, -! IPHC_DAM_16B = 2, -! IPHC_DAM_ELIDED = 3, -! }; -! -! //=========================== typedef ========================================= -! -! typedef struct { -! uint8_t traffic_class; -! uint32_t flow_label; -! bool next_header_compressed; -! uint8_t next_header; -! uint8_t hop_limit; -! open_addr_t src; -! open_addr_t dest; -! uint8_t header_length; ///< needed to toss the header -! } ipv6_header_iht; //iht for "internal header type" -! -! -! /* -! The Hop-by-Hop Options header is used to carry optional information -! that must be examined by every node along a packet's delivery path. -! The Hop-by-Hop Options header is identified by a Next Header value of -! 0 in the IPv6 header, and has the following format: -! */ -! typedef struct { -! /*see rfc 6282 section 4.2 The first 7 bits serve as an identifier for the IPv6 Extension Header immediately -! following the LOWPAN_NHC octet. The remaining bit indicates whether -! or not the following header utilizes LOWPAN_NHC encoding. */ -! uint8_t headerlen;// counter for internal use -! bool next_header_compressed; -! uint8_t lowpan_nhc; -! uint8_t nextHeader;//IPv6 hop by hop header field see rfc 2460 section 4.3 -! uint8_t HdrExtLen; //IPv6 hop by hop header field see rfc 6282 section 4.2 -! /* -! The Length field contained in a compressed IPv6 Extension Header -! indicates the number of octets that pertain to the (compressed) -! extension header following the Length field. Note that this changes -! the Length field definition in [RFC2460] from indicating the header -! size in 8-octet units, not including the first 8 octets. Changing -! the Length field to be in units of octets removes wasteful internal -! fragmentation.*/ -! -! } ipv6_hopbyhop_ht; -! -! //PRAGMA(pack(1)); -! typedef struct { -! //RPL hop by hop option header as described by RFC 6553 p.3 -! uint8_t optionType; ///0x63. -! uint8_t optionLen; /////8-bit field indicating the length of the option, in octets, excluding the Option Type and Opt Data Len fields. -! uint8_t flags; //ORF00000. -! uint8_t rplInstanceID; //instanceid -! uint16_t senderRank; //sender rank -! } rpl_hopoption_ht; -! //PRAGMA(pack()); -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void iphc_init(void); -! owerror_t iphc_sendFromForwarding(OpenQueueEntry_t *msg, -! ipv6_header_iht ipv6_header, -! rpl_hopoption_ht *hopbyhop_option, -! uint8_t fw_SendOrfw_Rcv); -! -! owerror_t iphc_sendFromBridge(OpenQueueEntry_t *msg); -! void iphc_sendDone(OpenQueueEntry_t *msg, owerror_t error); -! void iphc_receive(OpenQueueEntry_t *msg); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/03a-IPHC/openbridge.c ../../../sys/net/openwsn/03a-IPHC/openbridge.c -*** openwsn/03a-IPHC/openbridge.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/03a-IPHC/openbridge.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,93 **** -! #include "openwsn.h" -! #include "openbridge.h" -! #include "openserial.h" -! #include "packetfunctions.h" -! #include "iphc.h" -! #include "idmanager.h" -! #include "openqueue.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void openbridge_init() { -! } -! -! void openbridge_triggerData() { -! uint8_t input_buffer[136];//worst case: 8B of next hop + 128B of data -! OpenQueueEntry_t* pkt; -! uint8_t numDataBytes; -! -! numDataBytes = openserial_getNumDataBytes(); -! openserial_getInputBuffer(&(input_buffer[0]),numDataBytes); -! -! //poipoi xv -! //this is a temporal workaround as we are never supposed to get chunks of data -! //longer than input buffer size.. I assume that HDLC will solve that. -! -! if (numDataBytes>136){ -! openserial_printError(COMPONENT_OPENBRIDGE,ERR_INPUTBUFFER_LENGTH, -! (errorparameter_t)0, -! (errorparameter_t)numDataBytes); -! //return; -! //poipoi xv test that.. -! numDataBytes=sizeof(input_buffer); -! } -! -! if (idmanager_getIsBridge()==TRUE && numDataBytes>0) { -! pkt = openqueue_getFreePacketBuffer(COMPONENT_OPENBRIDGE); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_OPENBRIDGE,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return; -! } -! //admin -! pkt->creator = COMPONENT_OPENBRIDGE; -! pkt->owner = COMPONENT_OPENBRIDGE; -! //l2 -! pkt->l2_nextORpreviousHop.type = ADDR_64B; -! memcpy(&(pkt->l2_nextORpreviousHop.addr_64b[0]),&(input_buffer[0]),8); -! //payload -! packetfunctions_reserveHeaderSize(pkt,numDataBytes-8); -! memcpy(pkt->payload,&(input_buffer[8]),numDataBytes-8); -! //send -! if ((iphc_sendFromBridge(pkt))==E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! } -! } -! -! void openbridge_sendDone(OpenQueueEntry_t* msg, error_t error) { -! msg->owner = COMPONENT_OPENBRIDGE; -! if (msg->creator!=COMPONENT_OPENBRIDGE) { -! openserial_printError(COMPONENT_OPENBRIDGE,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! openqueue_freePacketBuffer(msg); -! } -! -! /** -! \brief Receive a frame at the openbridge, which sends it out over serial. -! */ -! void openbridge_receive(OpenQueueEntry_t* msg) { -! -! // prepend previous hop -! packetfunctions_reserveHeaderSize(msg,LENGTH_ADDR64b); -! memcpy(msg->payload,msg->l2_nextORpreviousHop.addr_64b,LENGTH_ADDR64b); -! -! // prepend next hop (me) -! packetfunctions_reserveHeaderSize(msg,LENGTH_ADDR64b); -! memcpy(msg->payload,idmanager_getMyID(ADDR_64B)->addr_64b,LENGTH_ADDR64b); -! -! // send packet over serial (will be memcopied into serial buffer) -! openserial_printData((uint8_t*)(msg->payload),msg->length); -! -! // free packet -! openqueue_freePacketBuffer(msg); -! } -! -! //=========================== private ========================================= ---- 1,100 ---- -! #include "openwsn.h" -! #include "openbridge.h" -! #include "openserial.h" -! #include "packetfunctions.h" -! #include "iphc.h" -! #include "idmanager.h" -! #include "openqueue.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! //=========================== public ========================================== -! -! void openbridge_init(void) { -! } -! -! void openbridge_triggerData(void) { -! uint8_t input_buffer[136];//worst case: 8B of next hop + 128B of data -! OpenQueueEntry_t* pkt; -! uint8_t numDataBytes; -! -! numDataBytes = openserial_getNumDataBytes(); -! -! //poipoi xv -! //this is a temporal workaround as we are never supposed to get chunks of data -! //longer than input buffer size.. I assume that HDLC will solve that. -! // MAC header is 13B + 8 next hop so we cannot accept packets that are longer than 118B -! if (numDataBytes>(136 - 21) || numDataBytes<8){ -! //to prevent too short or too long serial frames to kill the stack -! openserial_printError(COMPONENT_OPENBRIDGE,ERR_INPUTBUFFER_LENGTH, -! (errorparameter_t)numDataBytes, -! (errorparameter_t)0); -! return; -! } -! -! //copying the buffer once we know it is not too big -! openserial_getInputBuffer(&(input_buffer[0]),numDataBytes); -! -! if (idmanager_getIsBridge()==TRUE && numDataBytes>0) { -! pkt = openqueue_getFreePacketBuffer(COMPONENT_OPENBRIDGE); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_OPENBRIDGE,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return; -! } -! //admin -! pkt->creator = COMPONENT_OPENBRIDGE; -! pkt->owner = COMPONENT_OPENBRIDGE; -! //l2 -! pkt->l2_nextORpreviousHop.type = ADDR_64B; -! memcpy(&(pkt->l2_nextORpreviousHop.addr_64b[0]),&(input_buffer[0]),8); -! //payload -! packetfunctions_reserveHeaderSize(pkt,numDataBytes-8); -! memcpy(pkt->payload,&(input_buffer[8]),numDataBytes-8); -! -! //this is to catch the too short packet. remove it after fw-103 is solved. -! if (numDataBytes<16){ -! openserial_printError(COMPONENT_OPENBRIDGE,ERR_INVALIDSERIALFRAME, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! //send -! if ((iphc_sendFromBridge(pkt))==E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! } -! } -! -! void openbridge_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! msg->owner = COMPONENT_OPENBRIDGE; -! if (msg->creator!=COMPONENT_OPENBRIDGE) { -! openserial_printError(COMPONENT_OPENBRIDGE,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! openqueue_freePacketBuffer(msg); -! } -! -! /** -! \brief Receive a frame at the openbridge, which sends it out over serial. -! */ -! void openbridge_receive(OpenQueueEntry_t* msg) { -! -! // prepend previous hop -! packetfunctions_reserveHeaderSize(msg,LENGTH_ADDR64b); -! memcpy(msg->payload,msg->l2_nextORpreviousHop.addr_64b,LENGTH_ADDR64b); -! -! // prepend next hop (me) -! packetfunctions_reserveHeaderSize(msg,LENGTH_ADDR64b); -! memcpy(msg->payload,idmanager_getMyID(ADDR_64B)->addr_64b,LENGTH_ADDR64b); -! -! // send packet over serial (will be memcopied into serial buffer) -! openserial_printData((uint8_t*)(msg->payload),msg->length); -! -! // free packet -! openqueue_freePacketBuffer(msg); -! } -! -! //=========================== private ========================================= -diff -crB openwsn/03a-IPHC/openbridge.h ../../../sys/net/openwsn/03a-IPHC/openbridge.h -*** openwsn/03a-IPHC/openbridge.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/03a-IPHC/openbridge.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,29 **** -! #ifndef __OPENBRIDGE_H -! #define __OPENBRIDGE_H -! -! /** -! \addtogroup LoWPAN -! \{ -! \addtogroup OpenBridge -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void openbridge_init(); -! void openbridge_triggerData(); -! void openbridge_sendDone(OpenQueueEntry_t* msg, error_t error); -! void openbridge_receive(OpenQueueEntry_t* msg); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,29 ---- -! #ifndef __OPENBRIDGE_H -! #define __OPENBRIDGE_H -! -! /** -! \addtogroup LoWPAN -! \{ -! \addtogroup OpenBridge -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void openbridge_init(void); -! void openbridge_triggerData(void); -! void openbridge_sendDone(OpenQueueEntry_t* msg, owerror_t error); -! void openbridge_receive(OpenQueueEntry_t* msg); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/03b-IPv6/Makefile ../../../sys/net/openwsn/03b-IPv6/Makefile -*** openwsn/03b-IPv6/Makefile Wed Jan 15 13:55:34 2014 ---- ../../../sys/net/openwsn/03b-IPv6/Makefile Wed Jan 15 13:48:27 2014 -*************** -*** 0 **** ---- 1,32 ---- -+ SUBMOD:=$(shell basename $(CURDIR)).a -+ #BINDIR = $(RIOTBASE)/bin/ -+ SRC = $(wildcard *.c) -+ OBJ = $(SRC:%.c=$(BINDIR)%.o) -+ DEP = $(SRC:%.c=$(BINDIR)%.d) -+ -+ INCLUDES += -I$(RIOTBASE) -I$(RIOTBASE)/sys/include -I$(RIOTBASE)/core/include -I$(RIOTBASE)/drivers/include -I$(RIOTBASE)/drivers/cc110x_ng/include -I$(RIOTBASE)/cpu/arm_common/include -I$(RIOTBASE)/sys/net/include/ -+ INCLUDES += -I$(CURDIR)/02a-MAClow -+ INCLUDES += -I$(CURDIR)/02b-MAChigh -+ INCLUDES += -I$(CURDIR)/03a-IPHC -+ INCLUDES += -I$(CURDIR)/03b-IPv6 -+ INCLUDES += -I$(CURDIR)/04-TRAN -+ INCLUDES += -I$(CURDIR)/cross-layers -+ -+ .PHONY: $(BINDIR)$(SUBMOD) -+ -+ $(BINDIR)$(SUBMOD): $(OBJ) -+ $(AD)$(AR) rcs $(BINDIR)$(MODULE) $(OBJ) -+ -+ # pull in dependency info for *existing* .o files -+ -include $(OBJ:.o=.d) -+ -+ # compile and generate dependency info -+ $(BINDIR)%.o: %.c -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d -+ @printf "$(BINDIR)" | cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d -+ -+ # remove compilation products -+ -+ clean: -+ rm -f $(OBJ) $(DEP) -diff -crB openwsn/03b-IPv6/forwarding.c ../../../sys/net/openwsn/03b-IPv6/forwarding.c -*** openwsn/03b-IPv6/forwarding.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/03b-IPv6/forwarding.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,406 **** -! #include "openwsn.h" -! #include "forwarding.h" -! #include "iphc.h" -! #include "openqueue.h" -! #include "openserial.h" -! #include "idmanager.h" -! #include "packetfunctions.h" -! #include "neighbors.h" -! #include "icmpv6.h" -! #include "openudp.h" -! #include "opentcp.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! error_t fowarding_send_internal_RoutingTable(OpenQueueEntry_t *msg, ipv6_header_iht ipv6_header, uint8_t fw_SendOrfw_Rcv); -! void forwarding_getNextHop_RoutingTable(open_addr_t* destination, open_addr_t* addressToWrite); -! error_t fowarding_send_internal_SourceRouting(OpenQueueEntry_t *msg, ipv6_header_iht ipv6_header); -! -! //=========================== public ========================================== -! -! /** -! \brief Initialize this module. -! */ -! void forwarding_init() { -! } -! -! /** -! \brief Send a packet originating at this mote. -! -! This function is called by an upper layer, and only concerns packets originated -! at this mote. -! -! \param[in,out] msg Packet to send. -! */ -! error_t forwarding_send(OpenQueueEntry_t* msg) { -! ipv6_header_iht ipv6_header; -! open_addr_t* myprefix; -! open_addr_t* myadd64; -! -! // take ownership -! msg->owner = COMPONENT_FORWARDING; -! -! // retrieve my prefix and EUI64 -! myprefix = idmanager_getMyID(ADDR_PREFIX); -! myadd64 = idmanager_getMyID(ADDR_64B); -! -! // set source address (to me) -! msg->l3_sourceAdd.type=ADDR_128B; -! memcpy(&(msg->l3_sourceAdd.addr_128b[0]),myprefix->prefix,8); -! memcpy(&(msg->l3_sourceAdd.addr_128b[8]),myadd64->addr_64b,8); -! -! // initialize IPv6 header -! memset(&ipv6_header,0,sizeof(ipv6_header_iht)); -! -! //set hop limit to the default in-network value as this packet is being sent from upper layer. -! //this is done here as send_internal is used by forwarding of packets as well which -! //carry a hlim. This value is required to be set to a value as the following function can decrement it -! ipv6_header.hop_limit = IPHC_DEFAULT_HOP_LIMIT; -! -! return fowarding_send_internal_RoutingTable(msg,ipv6_header,PCKTSEND); -! } -! -! /** -! \brief Indicates a packet has been sent. -! -! \param[in,out] msg The packet just sent. -! \param[in] error The outcome of sending it. -! */ -! void forwarding_sendDone(OpenQueueEntry_t* msg, error_t error) { -! -! // take ownership -! msg->owner = COMPONENT_FORWARDING; -! -! if (msg->creator==COMPONENT_RADIO || msg->creator==COMPONENT_FORWARDING) { -! // that is a packet I relayed -! -! // free packet -! openqueue_freePacketBuffer(msg); -! } else { -! // that is a packet I created -! -! // indicate sendDone to upper layer -! switch(msg->l4_protocol) { -! case IANA_TCP: -! opentcp_sendDone(msg,error); -! break; -! case IANA_UDP: -! openudp_sendDone(msg,error); -! break; -! case IANA_ICMPv6: -! icmpv6_sendDone(msg,error); -! break; -! default: -! openserial_printCritical(COMPONENT_FORWARDING,ERR_WRONG_TRAN_PROTOCOL, -! (errorparameter_t)msg->l4_protocol, -! (errorparameter_t)0); -! // free packet -! openqueue_freePacketBuffer(msg); -! } -! } -! } -! -! /** -! \brief Indicates a packet was received. -! -! \param[in,out] msg The packet just sent. -! \param[in] ipv6_header The information contained in the 6LoWPAN header. -! */ -! void forwarding_receive(OpenQueueEntry_t* msg, ipv6_header_iht ipv6_header) { -! -! // take ownership -! msg->owner = COMPONENT_FORWARDING; -! -! // populate packets metadata with l4 information -! msg->l4_protocol = ipv6_header.next_header; -! msg->l4_protocol_compressed = ipv6_header.next_header_compressed; -! -! // populate packets metadata with l3 information -! memcpy(&(msg->l3_destinationAdd),&ipv6_header.dest,sizeof(open_addr_t)); -! memcpy(&(msg->l3_sourceAdd), &ipv6_header.src, sizeof(open_addr_t)); -! -! if ( -! ( -! idmanager_isMyAddress(&ipv6_header.dest) -! || -! packetfunctions_isBroadcastMulticast(&ipv6_header.dest) -! ) -! && -! ipv6_header.next_header!=IANA_IPv6ROUTE -! ) { -! // this packet is for me, but no routing header. -! -! // indicate received packet to upper layer -! switch(msg->l4_protocol) { -! case IANA_TCP: -! opentcp_receive(msg); -! break; -! case IANA_UDP: -! openudp_receive(msg); -! break; -! case IANA_ICMPv6: -! icmpv6_receive(msg); -! break; -! default: -! openserial_printError(COMPONENT_FORWARDING,ERR_WRONG_TRAN_PROTOCOL, -! (errorparameter_t)msg->l4_protocol, -! (errorparameter_t)1); -! openqueue_freePacketBuffer(msg); -! } -! } else { -! // this packet is not for me: relay -! -! // change the creator of the packet -! msg->creator = COMPONENT_FORWARDING; -! -! if (ipv6_header.next_header!=IANA_IPv6ROUTE) { -! // no source routing header present -! -! // resend as if from upper layer -! if (fowarding_send_internal_RoutingTable(msg, ipv6_header,PCKTFORWARD)==E_FAIL) { -! openqueue_freePacketBuffer(msg); -! } -! } else { -! // source routing header present -! -! if (fowarding_send_internal_SourceRouting(msg, ipv6_header)==E_FAIL) { -! openqueue_freePacketBuffer(msg); -! } -! } -! } -! } -! -! //=========================== private ========================================= -! -! /** -! \brief Send a packet using the routing table to find the next hop. -! -! \param[in,out] msg The packet to send. -! \param[in] ipv6_header The packet's IPv6 header. -! \param[in] fw_SendOrfw_Rcv The packet is originating from this mote -! (PCKTSEND), or forwarded (PCKTFORWARD). -! */ -! error_t fowarding_send_internal_RoutingTable(OpenQueueEntry_t* msg, ipv6_header_iht ipv6_header, uint8_t fw_SendOrfw_Rcv) { -! -! // retrieve the next hop from the routing table -! forwarding_getNextHop_RoutingTable(&(msg->l3_destinationAdd),&(msg->l2_nextORpreviousHop)); -! if (msg->l2_nextORpreviousHop.type==ADDR_NONE) { -! openserial_printError(COMPONENT_FORWARDING,ERR_NO_NEXTHOP, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return E_FAIL; -! } -! -! // send to next lower layer -! return iphc_sendFromForwarding(msg, ipv6_header, fw_SendOrfw_Rcv); -! } -! -! /** -! \brief Send a packet using the source rout to find the next hop. -! -! \note This is always called for packets being forwarded. -! -! How to process the routing header is detailed in -! http://tools.ietf.org/html/rfc6554#page-9. -! -! \param[in,out] msg The packet to send. -! \param[in] ipv6_header The packet's IPv6 header. -! */ -! error_t fowarding_send_internal_SourceRouting(OpenQueueEntry_t *msg, ipv6_header_iht ipv6_header) { -! uint8_t local_CmprE; -! uint8_t local_CmprI; -! uint8_t numAddr; -! uint8_t hlen; -! uint8_t addressposition; -! uint8_t* runningPointer; -! uint8_t octetsAddressSize; -! open_addr_t* prefix; -! rpl_routing_ht* rpl_routing_hdr; -! -! // get my prefix -! prefix = idmanager_getMyID(ADDR_PREFIX); -! -! // cast packet to RPL routing header -! rpl_routing_hdr = (rpl_routing_ht*)(msg->payload); -! -! // point behind the RPL routing header -! runningPointer = (msg->payload)+sizeof(rpl_routing_ht); -! -! // retrieve CmprE and CmprI -! -! /*CmprE 4-bit unsigned integer. Number of prefix octets -! from the last segment (i.e., segment n) that are -! elided. For example, an SRH carrying a full IPv6 -! address in Addressesn sets CmprE to 0.*/ -! -! local_CmprE = rpl_routing_hdr->CmprICmprE & 0x0f; -! local_CmprI = rpl_routing_hdr->CmprICmprE & 0xf0; -! local_CmprI = local_CmprI>>4; -! -! numAddr = (((rpl_routing_hdr->HdrExtLen*8)-rpl_routing_hdr->PadRes-(16-local_CmprE))/(16-local_CmprI))+1; -! -! if (rpl_routing_hdr->SegmentsLeft==0){ -! // no more segments left, this is the last hop -! -! // push packet up the stack -! msg->l4_protocol = rpl_routing_hdr->nextHeader; -! hlen = rpl_routing_hdr->HdrExtLen; //in 8-octet units -! -! // toss RPL routing header -! packetfunctions_tossHeader(msg,sizeof(rpl_routing_ht)); -! -! // toss source route addresses -! octetsAddressSize = LENGTH_ADDR128b - local_CmprE; //total length - number of octets that are elided -! packetfunctions_tossHeader(msg,octetsAddressSize*hlen); -! -! // indicate reception to upper layer -! switch(msg->l4_protocol) { -! case IANA_TCP: -! opentcp_receive(msg); -! break; -! case IANA_UDP: -! openudp_receive(msg); -! break; -! case IANA_ICMPv6: -! icmpv6_receive(msg); -! break; -! default: -! openserial_printError(COMPONENT_FORWARDING,ERR_WRONG_TRAN_PROTOCOL, -! (errorparameter_t)msg->l4_protocol, -! (errorparameter_t)1); -! openqueue_freePacketBuffer(msg); -! return E_FAIL; -! } -! -! // stop executing here (successful) -! return E_SUCCESS; -! -! } else { -! // this is not the last hop -! -! if (rpl_routing_hdr->SegmentsLeft>numAddr) { -! // error code: there are more segments left than space in source route -! -! // TODO: send ICMPv6 packet (code 0) to originator -! -! openserial_printError(COMPONENT_FORWARDING,ERR_NO_NEXTHOP, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return E_FAIL; -! -! } else { -! -! // decrement number of segments left -! rpl_routing_hdr->SegmentsLeft--; -! -! // find next hop address in source route -! addressposition = numAddr-(rpl_routing_hdr->SegmentsLeft); -! -! // how many octets have the address? -! if (rpl_routing_hdr->SegmentsLeft > 1){ -! octetsAddressSize = LENGTH_ADDR128b - local_CmprI; //max addr length - number of prefix octets that are elided in the internal route elements -! }else{ -! octetsAddressSize = LENGTH_ADDR128b - local_CmprE; //max addr length - number of prefix octets that are elided in the internal route elements -! } -! switch(octetsAddressSize) { -! case LENGTH_ADDR16b: -! // write previous hop -! msg->l2_nextORpreviousHop.type = ADDR_16B; -! memcpy( -! &(msg->l2_nextORpreviousHop.addr_16b), -! runningPointer+((addressposition-1)*octetsAddressSize), -! octetsAddressSize -! ); -! // write next hop -! msg->l3_destinationAdd.type = ADDR_16B; -! memcpy( -! &(msg->l3_destinationAdd.addr_16b), -! runningPointer+((addressposition-1)*octetsAddressSize), -! octetsAddressSize -! ); -! break; -! case LENGTH_ADDR64b: -! // write previous hop -! msg->l2_nextORpreviousHop.type = ADDR_64B; -! memcpy( -! &(msg->l2_nextORpreviousHop.addr_64b), -! runningPointer+((addressposition-1)*octetsAddressSize), -! octetsAddressSize -! ); -! -! //this is 128b address as send from forwarding function -! //takes care of reducing it if needed. -! -! //write next hop -! msg->l3_destinationAdd.type = ADDR_128B; -! memcpy( -! &(msg->l3_destinationAdd.addr_128b[0]), -! prefix->prefix, -! LENGTH_ADDR64b -! ); -! -! memcpy( -! &(msg->l3_destinationAdd.addr_128b[8]), -! runningPointer+((addressposition-1)*octetsAddressSize), -! octetsAddressSize -! ); -! -! break; -! case LENGTH_ADDR128b: -! // write previous hop -! msg->l2_nextORpreviousHop.type = ADDR_128B; -! memcpy( -! &(msg->l2_nextORpreviousHop.addr_128b), -! runningPointer+((addressposition-1)*octetsAddressSize), -! octetsAddressSize -! ); -! // write next hop -! msg->l3_destinationAdd.type = ADDR_128B; -! memcpy( -! &(msg->l3_destinationAdd.addr_128b), -! runningPointer+((addressposition-1)*octetsAddressSize), -! octetsAddressSize -! ); -! break; -! default: -! //poipoi xv -! //any other value is not supported by now. -! openserial_printError(COMPONENT_FORWARDING,ERR_INVALID_PARAM, -! (errorparameter_t)1, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return E_FAIL; -! } -! } -! } -! -! // send to next lower layer -! return iphc_sendFromForwarding(msg, ipv6_header, PCKTFORWARD); -! } -! -! /** -! \brief Retrieve the next hop's address from routing table. -! -! \param[in] destination128b Final IPv6 destination address. -! \param[out]addressToWrite64b Location to write the EUI64 of next hop to. -! */ -! void forwarding_getNextHop_RoutingTable(open_addr_t* destination128b, open_addr_t* addressToWrite64b) { -! uint8_t i; -! open_addr_t temp_prefix64btoWrite; -! if (packetfunctions_isBroadcastMulticast(destination128b)) { -! // IP destination is broadcast, send to 0xffffffffffffffff -! addressToWrite64b->type = ADDR_64B; -! for (i=0;i<8;i++) { -! addressToWrite64b->addr_64b[i] = 0xff; -! } -! } else if (neighbors_isStableNeighbor(destination128b)) { -! // IP destination is 1-hop neighbor, send directly -! packetfunctions_ip128bToMac64b(destination128b,&temp_prefix64btoWrite,addressToWrite64b); -! } else { -! // destination is remote, send to preferred parent -! neighbors_getPreferredParentEui64(addressToWrite64b); -! } -! } -\ No newline at end of file ---- 1,478 ---- -! #include "openwsn.h" -! #include "forwarding.h" -! #include "iphc.h" -! #include "openqueue.h" -! #include "openserial.h" -! #include "idmanager.h" -! #include "packetfunctions.h" -! #include "neighbors.h" -! #include "icmpv6.h" -! #include "icmpv6rpl.h" -! #include "openudp.h" -! #include "opentcp.h" -! //#include "debugpins.h" -! #include "scheduler.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! owerror_t forwarding_send_internal_RoutingTable(OpenQueueEntry_t *msg, ipv6_header_iht ipv6_header, rpl_hopoption_ht hopbyhop_header, uint8_t fw_SendOrfw_Rcv); -! void forwarding_getNextHop_RoutingTable(open_addr_t* destination, open_addr_t* addressToWrite); -! owerror_t forwarding_send_internal_SourceRouting(OpenQueueEntry_t *msg, ipv6_header_iht ipv6_header); -! void forwarding_createHopByHopOption(rpl_hopoption_ht *hopbyhop_opt, uint8_t flags); -! -! //=========================== public ========================================== -! -! /** -! \brief Initialize this module. -! */ -! void forwarding_init(void) { -! } -! -! -! /** -! \brief Send a packet originating at this mote. -! -! This function is called by an upper layer, and only concerns packets originated -! at this mote. -! -! \param[in,out] msg Packet to send. -! */ -! owerror_t forwarding_send(OpenQueueEntry_t* msg) { -! ipv6_header_iht ipv6_header; -! rpl_hopoption_ht hopbyhop_opt; -! -! open_addr_t* myprefix; -! open_addr_t* myadd64; -! -! // take ownership -! msg->owner = COMPONENT_FORWARDING; -! -! // retrieve my prefix and EUI64 -! myprefix = idmanager_getMyID(ADDR_PREFIX); -! myadd64 = idmanager_getMyID(ADDR_64B); -! -! // set source address (to me) -! msg->l3_sourceAdd.type=ADDR_128B; -! memcpy(&(msg->l3_sourceAdd.addr_128b[0]),myprefix->prefix,8); -! memcpy(&(msg->l3_sourceAdd.addr_128b[8]),myadd64->addr_64b,8); -! -! // initialize IPv6 header -! memset(&ipv6_header,0,sizeof(ipv6_header_iht)); -! -! //set hop limit to the default in-network value as this packet is being sent from upper layer. -! //this is done here as send_internal is used by forwarding of packets as well which -! //carry a hlim. This value is required to be set to a value as the following function can decrement it -! ipv6_header.hop_limit = IPHC_DEFAULT_HOP_LIMIT; -! //create hop by hop option -! forwarding_createHopByHopOption(&hopbyhop_opt, 0x00); //flags are 0x00 -- TODO check and define macro -! -! return forwarding_send_internal_RoutingTable(msg,ipv6_header,hopbyhop_opt,PCKTSEND); -! } -! -! /** -! \brief Indicates a packet has been sent. -! -! \param[in,out] msg The packet just sent. -! \param[in] error The outcome of sending it. -! */ -! void forwarding_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! -! // take ownership -! msg->owner = COMPONENT_FORWARDING; -! -! if (msg->creator==COMPONENT_RADIO || msg->creator==COMPONENT_FORWARDING) { -! // that is a packet I relayed -! -! // free packet -! openqueue_freePacketBuffer(msg); -! } else { -! // that is a packet I created -! -! // indicate sendDone to upper layer -! switch(msg->l4_protocol) { -! case IANA_TCP: -! opentcp_sendDone(msg,error); -! break; -! case IANA_UDP: -! openudp_sendDone(msg,error); -! break; -! case IANA_ICMPv6: -! icmpv6_sendDone(msg,error); -! break; -! default: -! openserial_printCritical(COMPONENT_FORWARDING,ERR_WRONG_TRAN_PROTOCOL, -! (errorparameter_t)msg->l4_protocol, -! (errorparameter_t)0); -! // free packet -! openqueue_freePacketBuffer(msg); -! } -! } -! } -! -! /** -! \brief Indicates a packet was received. -! -! \param[in,out] msg The packet just sent. -! \param[in] ipv6_header The information contained in the 6LoWPAN header. -! */ -! void forwarding_receive(OpenQueueEntry_t* msg, -! ipv6_header_iht ipv6_header, -! ipv6_hopbyhop_ht ipv6_hop_header, -! rpl_hopoption_ht hop_by_hop_option) { -! -! uint8_t temp_flags; -! -! // take ownership -! msg->owner = COMPONENT_FORWARDING; -! -! -! //contains a -! if (ipv6_header.next_header==IANA_IPv6HOPOPT){ -! // populate packets metadata with l4 information -! msg->l4_protocol = ipv6_hop_header.nextHeader; -! msg->l4_protocol_compressed = ipv6_hop_header.next_header_compressed; // rfc 6282 -! -! //process HOP BY HOP header -! -! -! }else{ -! msg->l4_protocol = ipv6_header.next_header; -! msg->l4_protocol_compressed = ipv6_header.next_header_compressed; // rfc 6282 -! } -! -! // populate packets metadata with l3 information -! memcpy(&(msg->l3_destinationAdd),&ipv6_header.dest,sizeof(open_addr_t)); -! memcpy(&(msg->l3_sourceAdd), &ipv6_header.src, sizeof(open_addr_t)); -! -! -! if ( -! ( -! idmanager_isMyAddress(&ipv6_header.dest) -! || -! packetfunctions_isBroadcastMulticast(&ipv6_header.dest) -! ) -! && -! //ipv6 header - next header will be IANA_IPv6HOPOPT or IANA_IPv6ROUTE -! ipv6_header.next_header!=IANA_IPv6ROUTE -! ) { -! // this packet is for me, but no src routing header. -! -! // indicate received packet to upper layer -! switch(msg->l4_protocol) { -! case IANA_TCP: -! opentcp_receive(msg); -! break; -! case IANA_UDP: -! openudp_receive(msg); -! break; -! case IANA_ICMPv6: -! icmpv6_receive(msg); -! break; -! default: -! openserial_printError(COMPONENT_FORWARDING,ERR_WRONG_TRAN_PROTOCOL, -! (errorparameter_t)msg->l4_protocol, -! (errorparameter_t)1); -! openqueue_freePacketBuffer(msg); -! } -! } else { -! // this packet is not for me: relay -! -! // change the creator of the packet -! msg->creator = COMPONENT_FORWARDING; -! -! if (ipv6_header.next_header!=IANA_IPv6ROUTE) { -! // no source routing header present -! -! //process HOP bY HOP header -! temp_flags = hop_by_hop_option.flags; -! if ((temp_flags & O_FLAG)!=0){ -! //error wrong direction -! //what todo? print the error -! openserial_printError(COMPONENT_FORWARDING,ERR_WRONG_DIRECTION, -! (errorparameter_t)1, -! (errorparameter_t)1); -! } -! if (hop_by_hop_option.senderRank < neighbors_getMyDAGrank()){ -! //wrong rank relation.. loop detected -! temp_flags |= R_FLAG; //set r flag. -! openserial_printError(COMPONENT_FORWARDING,ERR_LOOP_DETECTED, -! (errorparameter_t) hop_by_hop_option.senderRank, -! (errorparameter_t) neighbors_getMyDAGrank()); -! } -! -! //O flag should always be 0 as this is upstream route. -! -! forwarding_createHopByHopOption(&hop_by_hop_option, temp_flags); -! -! -! // resend as if from upper layer -! if (forwarding_send_internal_RoutingTable(msg, ipv6_header,hop_by_hop_option,PCKTFORWARD)==E_FAIL) { -! openqueue_freePacketBuffer(msg); -! } -! } else { -! // source routing header present -! if (forwarding_send_internal_SourceRouting(msg, ipv6_header)==E_FAIL) { -! //already freed by send_internal if it fails -! //todo change error type to another that says src_route failure. -! openserial_printError(COMPONENT_FORWARDING,ERR_INVALID_FWDMODE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! } -! } -! } -! -! -! -! /** -! \brief Send a packet using the routing table to find the next hop. -! -! \param[in,out] msg The packet to send. -! \param[in] ipv6_header The packet's IPv6 header. -! \param[in] fw_SendOrfw_Rcv The packet is originating from this mote -! (PCKTSEND), or forwarded (PCKTFORWARD). -! */ -! owerror_t forwarding_send_internal_RoutingTable(OpenQueueEntry_t* msg, ipv6_header_iht ipv6_header, rpl_hopoption_ht hopbyhop_opt, uint8_t fw_SendOrfw_Rcv) { -! -! // retrieve the next hop from the routing table -! forwarding_getNextHop_RoutingTable(&(msg->l3_destinationAdd),&(msg->l2_nextORpreviousHop)); -! if (msg->l2_nextORpreviousHop.type==ADDR_NONE) { -! openserial_printError(COMPONENT_FORWARDING,ERR_NO_NEXTHOP, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return E_FAIL; -! } -! -! // send to next lower layer -! return iphc_sendFromForwarding(msg, ipv6_header, &hopbyhop_opt,fw_SendOrfw_Rcv); -! } -! -! /** -! \brief Send a packet using the source rout to find the next hop. -! -! \note This is always called for packets being forwarded. -! -! How to process the routing header is detailed in -! http://tools.ietf.org/html/rfc6554#page-9. -! -! \param[in,out] msg The packet to send. -! \param[in] ipv6_header The packet's IPv6 header. -! */ -! owerror_t forwarding_send_internal_SourceRouting(OpenQueueEntry_t *msg, ipv6_header_iht ipv6_header) { -! uint8_t local_CmprE; -! uint8_t local_CmprI; -! uint8_t numAddr; -! uint8_t hlen; -! uint8_t addressposition; -! uint8_t* runningPointer; -! uint8_t octetsAddressSize; -! open_addr_t* prefix; -! rpl_routing_ht* rpl_routing_hdr; -! -! rpl_hopoption_ht hopbyhop_opt; -! -! memset(&hopbyhop_opt,0,sizeof(rpl_hopoption_ht));//reset everything -! -! // get my prefix -! prefix = idmanager_getMyID(ADDR_PREFIX); -! -! // cast packet to RPL routing header -! rpl_routing_hdr = (rpl_routing_ht*)(msg->payload); -! -! // point behind the RPL routing header -! runningPointer = (msg->payload)+sizeof(rpl_routing_ht); -! -! // retrieve CmprE and CmprI -! -! /*CmprE 4-bit unsigned integer. Number of prefix octets -! from the last segment (i.e., segment n) that are -! elided. For example, an SRH carrying a full IPv6 -! address in Addressesn sets CmprE to 0.*/ -! -! local_CmprE = rpl_routing_hdr->CmprICmprE & 0x0f; -! local_CmprI = rpl_routing_hdr->CmprICmprE & 0xf0; -! local_CmprI = local_CmprI>>4; -! -! numAddr = (((rpl_routing_hdr->HdrExtLen*8)-rpl_routing_hdr->PadRes-(16-local_CmprE))/(16-local_CmprI))+1; -! -! if (rpl_routing_hdr->SegmentsLeft==0){ -! // no more segments left, this is the last hop -! -! // push packet up the stack -! msg->l4_protocol = rpl_routing_hdr->nextHeader; -! hlen = rpl_routing_hdr->HdrExtLen; //in 8-octet units -! -! // toss RPL routing header -! packetfunctions_tossHeader(msg,sizeof(rpl_routing_ht)); -! -! // toss source route addresses -! octetsAddressSize = LENGTH_ADDR128b - local_CmprE; //total length - number of octets that are elided -! packetfunctions_tossHeader(msg,octetsAddressSize*hlen); -! -! // indicate reception to upper layer -! switch(msg->l4_protocol) { -! case IANA_TCP: -! opentcp_receive(msg); -! break; -! case IANA_UDP: -! openudp_receive(msg); -! break; -! case IANA_ICMPv6: -! icmpv6_receive(msg); -! break; -! default: -! openserial_printError(COMPONENT_FORWARDING,ERR_WRONG_TRAN_PROTOCOL, -! (errorparameter_t)msg->l4_protocol, -! (errorparameter_t)1); -! //not sure that this is correct as iphc will free it? -! openqueue_freePacketBuffer(msg); -! return E_FAIL; -! } -! -! // stop executing here (successful) -! return E_SUCCESS; -! -! } else { -! // this is not the last hop -! -! if (rpl_routing_hdr->SegmentsLeft>numAddr) { -! // error code: there are more segments left than space in source route -! -! // TODO: send ICMPv6 packet (code 0) to originator -! -! openserial_printError(COMPONENT_FORWARDING,ERR_NO_NEXTHOP, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return E_FAIL; -! -! } else { -! -! // decrement number of segments left -! rpl_routing_hdr->SegmentsLeft--; -! -! // find next hop address in source route -! //addressposition = numAddr-(rpl_routing_hdr->SegmentsLeft); -! addressposition = rpl_routing_hdr->SegmentsLeft; -! // how many octets have the address? -! if (rpl_routing_hdr->SegmentsLeft > 1){ -! octetsAddressSize = LENGTH_ADDR128b - local_CmprI; //max addr length - number of prefix octets that are elided in the internal route elements -! }else{ -! octetsAddressSize = LENGTH_ADDR128b - local_CmprE; //max addr length - number of prefix octets that are elided in the internal route elements -! } -! switch(octetsAddressSize) { -! case LENGTH_ADDR16b: -! // write previous hop -! msg->l2_nextORpreviousHop.type = ADDR_16B; -! memcpy( -! &(msg->l2_nextORpreviousHop.addr_16b), -! runningPointer+((addressposition)*octetsAddressSize), -! octetsAddressSize -! ); -! // write next hop -! msg->l3_destinationAdd.type = ADDR_16B; -! memcpy( -! &(msg->l3_destinationAdd.addr_16b), -! runningPointer+((addressposition)*octetsAddressSize), -! octetsAddressSize -! ); -! break; -! case LENGTH_ADDR64b: -! // write previous hop -! msg->l2_nextORpreviousHop.type = ADDR_64B; -! memcpy( -! &(msg->l2_nextORpreviousHop.addr_64b), -! runningPointer+((addressposition)*octetsAddressSize), -! octetsAddressSize -! ); -! -! //this is 128b address as send from forwarding function -! //takes care of reducing it if needed. -! -! //write next hop -! msg->l3_destinationAdd.type = ADDR_128B; -! memcpy( -! &(msg->l3_destinationAdd.addr_128b[0]), -! prefix->prefix, -! LENGTH_ADDR64b -! ); -! -! memcpy( -! &(msg->l3_destinationAdd.addr_128b[8]), -! runningPointer+((addressposition)*octetsAddressSize), -! octetsAddressSize -! ); -! -! break; -! case LENGTH_ADDR128b: -! // write previous hop -! msg->l2_nextORpreviousHop.type = ADDR_128B; -! memcpy( -! &(msg->l2_nextORpreviousHop.addr_128b), -! runningPointer+((addressposition)*octetsAddressSize), -! octetsAddressSize -! ); -! // write next hop -! msg->l3_destinationAdd.type = ADDR_128B; -! memcpy( -! &(msg->l3_destinationAdd.addr_128b), -! runningPointer+((addressposition)*octetsAddressSize), -! octetsAddressSize -! ); -! break; -! default: -! //poipoi xv -! //any other value is not supported by now. -! openserial_printError(COMPONENT_FORWARDING,ERR_INVALID_PARAM, -! (errorparameter_t)1, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return E_FAIL; -! } -! } -! } -! -! // send to next lower layer -! return iphc_sendFromForwarding(msg, ipv6_header,&hopbyhop_opt, PCKTFORWARD); -! } -! -! /** -! \brief Retrieve the next hop's address from routing table. -! -! \param[in] destination128b Final IPv6 destination address. -! \param[out] addressToWrite64b Location to write the EUI64 of next hop to. -! */ -! void forwarding_getNextHop_RoutingTable(open_addr_t* destination128b, open_addr_t* addressToWrite64b) { -! uint8_t i; -! open_addr_t temp_prefix64btoWrite; -! if (packetfunctions_isBroadcastMulticast(destination128b)) { -! // IP destination is broadcast, send to 0xffffffffffffffff -! addressToWrite64b->type = ADDR_64B; -! for (i=0;i<8;i++) { -! addressToWrite64b->addr_64b[i] = 0xff; -! } -! } else if (neighbors_isStableNeighbor(destination128b)) { -! // IP destination is 1-hop neighbor, send directly -! packetfunctions_ip128bToMac64b(destination128b,&temp_prefix64btoWrite,addressToWrite64b); -! } else { -! // destination is remote, send to preferred parent -! neighbors_getPreferredParentEui64(addressToWrite64b); -! } -! } -! /* -! * HOP BY HOP HEADER OPTION -! */ -! -! -! void forwarding_createHopByHopOption(rpl_hopoption_ht *hopbyhop_opt, uint8_t flags) { -! //set the rpl hop by hop header -! hopbyhop_opt->optionType = RPL_HOPBYHOP_HEADER_OPTION_TYPE; -! //8-bit field indicating the length of the option, in -! //octets, excluding the Option Type and Opt Data Len fields. -! hopbyhop_opt->optionLen = 0x04; //4-bytes, flags+instanceID+senderrank - no sub-tlvs -! hopbyhop_opt->flags = flags; -! hopbyhop_opt->rplInstanceID = icmpv6rpl_getRPLIntanceID(); //getit.. -! hopbyhop_opt->senderRank = neighbors_getMyDAGrank(); //TODO change to DAGRAnk(rank) instead of rank -! } -diff -crB openwsn/03b-IPv6/forwarding.h ../../../sys/net/openwsn/03b-IPv6/forwarding.h -*** openwsn/03b-IPv6/forwarding.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/03b-IPv6/forwarding.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,53 **** -! #ifndef __FORWARDING_H -! #define __FORWARDING_H -! -! /** -! \addtogroup IPv6 -! \{ -! \addtogroup Forwarding -! \{ -! */ -! -! #include "iphc.h" -! -! //=========================== define ========================================== -! -! enum { -! PCKTFORWARD = 1, -! PCKTSEND = 2, -! }; -! -! //=========================== typedef ========================================= -! -! /** -! \brief RPL source routing header. -! -! As defined in http://tools.ietf.org/html/rfc6554#section-3. -! */ -! PRAGMA(pack(1)); -! typedef struct { -! uint8_t nextHeader; ///< Header immediately following. -! uint8_t HdrExtLen; ///< In 8-octet units, excluding first 8. -! uint8_t RoutingType; ///< Set to 3 for "Source Routing Header". -! uint8_t SegmentsLeft; ///< Number of addresses still to visit. -! uint8_t CmprICmprE; ///< Number of prefix octets elided for all (CmprI) and last (CmprE) segment -! uint8_t PadRes; ///< Number of padding octets. Set to 0 if using EUI64. -! uint16_t Reserved; ///< Set to 0. -! } rpl_routing_ht; -! PRAGMA(pack()); -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void forwarding_init(); -! error_t forwarding_send(OpenQueueEntry_t *msg); -! void forwarding_sendDone(OpenQueueEntry_t* msg, error_t error); -! void forwarding_receive(OpenQueueEntry_t* msg, ipv6_header_iht ipv6_header); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,68 ---- -! #ifndef __FORWARDING_H -! #define __FORWARDING_H -! -! /** -! \addtogroup IPv6 -! \{ -! \addtogroup Forwarding -! \{ -! */ -! -! #include "iphc.h" -! -! -! //=========================== define ========================================== -! -! #define RPL_HOPBYHOP_HEADER_OPTION_TYPE 0x63 -! -! enum { -! PCKTFORWARD = 1, -! PCKTSEND = 2, -! }; -! -! enum { -! O_FLAG = 0x80, -! R_FLAG = 0x40, -! F_FLAG = 0x20, -! }; -! -! -! //=========================== typedef ========================================= -! -! /** -! \brief RPL source routing header. -! -! As defined in http://tools.ietf.org/html/rfc6554#section-3. -! */ -! -! //PRAGMA(pack(1)); -! typedef struct { -! uint8_t nextHeader; ///< Header immediately following. -! uint8_t HdrExtLen; ///< In 8-octet units, excluding first 8. -! uint8_t RoutingType; ///< Set to 3 for "Source Routing Header". -! uint8_t SegmentsLeft; ///< Number of addresses still to visit. -! uint8_t CmprICmprE; ///< Number of prefix octets elided for all (CmprI) and last (CmprE) segment -! uint8_t PadRes; ///< Number of padding octets. Set to 0 if using EUI64. -! uint16_t Reserved; ///< Set to 0. -! } rpl_routing_ht; -! //PRAGMA(pack()); -! -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void forwarding_init(void); -! owerror_t forwarding_send(OpenQueueEntry_t *msg); -! void forwarding_sendDone(OpenQueueEntry_t *msg, owerror_t error); -! void forwarding_receive(OpenQueueEntry_t *msg, -! ipv6_header_iht ipv6_header, -! ipv6_hopbyhop_ht ipv6_hop_header, -! rpl_hopoption_ht hop_by_hop_option); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/03b-IPv6/icmpv6.c ../../../sys/net/openwsn/03b-IPv6/icmpv6.c -*** openwsn/03b-IPv6/icmpv6.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/03b-IPv6/icmpv6.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,63 **** -! #include "openwsn.h" -! #include "icmpv6.h" -! #include "icmpv6echo.h" -! #include "icmpv6rpl.h" -! #include "forwarding.h" -! #include "openqueue.h" -! #include "openserial.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void icmpv6_init() { -! } -! -! error_t icmpv6_send(OpenQueueEntry_t* msg) { -! msg->owner = COMPONENT_ICMPv6; -! msg->l4_protocol = IANA_ICMPv6; -! return forwarding_send(msg); -! } -! -! void icmpv6_sendDone(OpenQueueEntry_t* msg, error_t error) { -! msg->owner = COMPONENT_ICMPv6; -! switch (msg->l4_sourcePortORicmpv6Type) { -! case IANA_ICMPv6_ECHO_REQUEST: -! case IANA_ICMPv6_ECHO_REPLY: -! icmpv6echo_sendDone(msg, error); -! break; -! case IANA_ICMPv6_RPL: -! icmpv6rpl_sendDone(msg, error); -! break; -! default: -! openserial_printCritical(COMPONENT_ICMPv6,ERR_UNSUPPORTED_ICMPV6_TYPE, -! (errorparameter_t)msg->l4_sourcePortORicmpv6Type, -! (errorparameter_t)0); -! // free the corresponding packet buffer -! openqueue_freePacketBuffer(msg); -! break; -! } -! } -! -! void icmpv6_receive(OpenQueueEntry_t* msg) { -! msg->owner = COMPONENT_ICMPv6; -! msg->l4_sourcePortORicmpv6Type = ((ICMPv6_ht*)(msg->payload))->type; -! switch (msg->l4_sourcePortORicmpv6Type) { -! case IANA_ICMPv6_ECHO_REQUEST: -! case IANA_ICMPv6_ECHO_REPLY: -! icmpv6echo_receive(msg); -! break; -! case IANA_ICMPv6_RPL: -! icmpv6rpl_receive(msg); -! break; -! default: -! openserial_printError(COMPONENT_ICMPv6,ERR_UNSUPPORTED_ICMPV6_TYPE, -! (errorparameter_t)msg->l4_sourcePortORicmpv6Type, -! (errorparameter_t)1); -! // free the corresponding packet buffer -! openqueue_freePacketBuffer(msg); -! break; -! } - } -\ No newline at end of file ---- 1,63 ---- -! #include "openwsn.h" -! #include "icmpv6.h" -! #include "icmpv6echo.h" -! #include "icmpv6rpl.h" -! #include "forwarding.h" -! #include "openqueue.h" -! #include "openserial.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void icmpv6_init(void) { -! } -! -! owerror_t icmpv6_send(OpenQueueEntry_t* msg) { -! msg->owner = COMPONENT_ICMPv6; -! msg->l4_protocol = IANA_ICMPv6; -! return forwarding_send(msg); -! } -! -! void icmpv6_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! msg->owner = COMPONENT_ICMPv6; -! switch (msg->l4_sourcePortORicmpv6Type) { -! case IANA_ICMPv6_ECHO_REQUEST: -! case IANA_ICMPv6_ECHO_REPLY: -! icmpv6echo_sendDone(msg, error); -! break; -! case IANA_ICMPv6_RPL: -! icmpv6rpl_sendDone(msg, error); -! break; -! default: -! openserial_printCritical(COMPONENT_ICMPv6,ERR_UNSUPPORTED_ICMPV6_TYPE, -! (errorparameter_t)msg->l4_sourcePortORicmpv6Type, -! (errorparameter_t)0); -! // free the corresponding packet buffer -! openqueue_freePacketBuffer(msg); -! break; -! } -! } -! -! void icmpv6_receive(OpenQueueEntry_t* msg) { -! msg->owner = COMPONENT_ICMPv6; -! msg->l4_sourcePortORicmpv6Type = ((ICMPv6_ht*)(msg->payload))->type; -! switch (msg->l4_sourcePortORicmpv6Type) { -! case IANA_ICMPv6_ECHO_REQUEST: -! case IANA_ICMPv6_ECHO_REPLY: -! icmpv6echo_receive(msg); -! break; -! case IANA_ICMPv6_RPL: -! icmpv6rpl_receive(msg); -! break; -! default: -! openserial_printError(COMPONENT_ICMPv6,ERR_UNSUPPORTED_ICMPV6_TYPE, -! (errorparameter_t)msg->l4_sourcePortORicmpv6Type, -! (errorparameter_t)1); -! // free the corresponding packet buffer -! openqueue_freePacketBuffer(msg); -! break; -! } - } -\ No newline at end of file -diff -crB openwsn/03b-IPv6/icmpv6.h ../../../sys/net/openwsn/03b-IPv6/icmpv6.h -*** openwsn/03b-IPv6/icmpv6.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/03b-IPv6/icmpv6.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,61 **** -! #ifndef __ICMPv6_H -! #define __ICMPv6_H -! -! /** -! \addtogroup IPv6 -! \{ -! \addtogroup ICMPv6 -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! typedef struct { -! uint8_t type; -! uint8_t code; -! uint16_t checksum; -! // Below Identifier might need to be replaced by the identifier used by icmpv6rpl -! // uint16_t identifier; -! // Below sequence_number might need to be removed -! // uint16_t sequence_number; -! } ICMPv6_ht; -! -! typedef struct { -! uint8_t type; -! uint8_t code; -! uint16_t checksum; -! uint8_t hop_limit; -! uint8_t flags; -! uint16_t router_lifetime; -! uint32_t reachable_time; -! uint32_t retransmission_timer; -! } ICMPv6_RA_ht; -! -! typedef struct { -! uint8_t option_type; -! uint8_t option_length; -! uint8_t prefix_length; -! uint8_t flags; -! uint32_t valid_lifetime; -! uint32_t preferred_lifetime; -! uint32_t unused; -! uint8_t prefix[16]; // prefix container always 16B -! } ICMPv6_64bprefix_option_ht; -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void icmpv6_init(); -! error_t icmpv6_send(OpenQueueEntry_t* msg); -! void icmpv6_sendDone(OpenQueueEntry_t* msg, error_t error); -! void icmpv6_receive(OpenQueueEntry_t* msg); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,61 ---- -! #ifndef __ICMPv6_H -! #define __ICMPv6_H -! -! /** -! \addtogroup IPv6 -! \{ -! \addtogroup ICMPv6 -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! typedef struct { -! uint8_t type; -! uint8_t code; -! uint16_t checksum; -! // Below Identifier might need to be replaced by the identifier used by icmpv6rpl -! // uint16_t identifier; -! // Below sequence_number might need to be removed -! // uint16_t sequence_number; -! } ICMPv6_ht; -! -! typedef struct { -! uint8_t type; -! uint8_t code; -! uint16_t checksum; -! uint8_t hop_limit; -! uint8_t flags; -! uint16_t router_lifetime; -! uint32_t reachable_time; -! uint32_t retransmission_timer; -! } ICMPv6_RA_ht; -! -! typedef struct { -! uint8_t option_type; -! uint8_t option_length; -! uint8_t prefix_length; -! uint8_t flags; -! uint32_t valid_lifetime; -! uint32_t preferred_lifetime; -! uint32_t unused; -! uint8_t prefix[16]; // prefix container always 16B -! } ICMPv6_64bprefix_option_ht; -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void icmpv6_init(void); -! owerror_t icmpv6_send(OpenQueueEntry_t* msg); -! void icmpv6_sendDone(OpenQueueEntry_t* msg, owerror_t error); -! void icmpv6_receive(OpenQueueEntry_t* msg); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/03b-IPv6/icmpv6echo.c ../../../sys/net/openwsn/03b-IPv6/icmpv6echo.c -*** openwsn/03b-IPv6/icmpv6echo.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/03b-IPv6/icmpv6echo.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,152 **** -! #include "openwsn.h" -! #include "icmpv6echo.h" -! #include "icmpv6.h" -! #include "openserial.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! -! //=========================== variables ======================================= -! -! typedef struct { -! bool busySending; -! open_addr_t hisAddress; -! uint16_t seq; -! } icmpv6echo_vars_t; -! -! icmpv6echo_vars_t icmpv6echo_vars; -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void icmpv6echo_init() { -! icmpv6echo_vars.busySending = FALSE; -! icmpv6echo_vars.seq = 0; -! } -! -! void icmpv6echo_trigger() { -! uint8_t number_bytes_from_input_buffer; -! uint8_t input_buffer[16]; -! OpenQueueEntry_t* msg; -! -! //get command from OpenSerial (16B IPv6 destination address) -! number_bytes_from_input_buffer = openserial_getInputBuffer(&(input_buffer[0]),sizeof(input_buffer)); -! if (number_bytes_from_input_buffer!=sizeof(input_buffer)) { -! openserial_printError(COMPONENT_ICMPv6ECHO,ERR_INPUTBUFFER_LENGTH, -! (errorparameter_t)number_bytes_from_input_buffer, -! (errorparameter_t)0); -! return; -! }; -! icmpv6echo_vars.hisAddress.type = ADDR_128B; -! memcpy(&(icmpv6echo_vars.hisAddress.addr_128b[0]),&(input_buffer[0]),16); -! -! //send -! if (icmpv6echo_vars.busySending==TRUE) { -! openserial_printError(COMPONENT_ICMPv6ECHO,ERR_BUSY_SENDING, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } else { -! icmpv6echo_vars.busySending = TRUE; -! -! msg = openqueue_getFreePacketBuffer(COMPONENT_ICMPv6ECHO); -! if (msg==NULL) { -! openserial_printError(COMPONENT_ICMPv6ECHO,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! icmpv6echo_vars.busySending = FALSE; -! return; -! } -! //admin -! msg->creator = COMPONENT_ICMPv6ECHO; -! msg->owner = COMPONENT_ICMPv6ECHO; -! //l4 -! msg->l4_protocol = IANA_ICMPv6; -! msg->l4_sourcePortORicmpv6Type = IANA_ICMPv6_ECHO_REQUEST; -! //l3 -! memcpy(&(msg->l3_destinationAdd),&icmpv6echo_vars.hisAddress,sizeof(open_addr_t)); -! //payload -! packetfunctions_reserveHeaderSize(msg,4); -! packetfunctions_htonl(0x789abcde,(uint8_t*)(msg->payload)); -! //ICMPv6 header -! packetfunctions_reserveHeaderSize(msg,sizeof(ICMPv6_ht)); -! ((ICMPv6_ht*)(msg->payload))->type = msg->l4_sourcePortORicmpv6Type; -! ((ICMPv6_ht*)(msg->payload))->code = 0; -! // Below Identifier might need to be replaced by the identifier used by icmpv6rpl -! // packetfunctions_htons(0x1234 ,(uint8_t*)&((ICMPv6_ht*)(msg->payload))->identifier); -! // Below sequence_number might need to be removed -! // packetfunctions_htons(icmpv6echo_vars.seq++ ,(uint8_t*)&((ICMPv6_ht*)(msg->payload))->sequence_number); -! packetfunctions_calculateChecksum(msg,(uint8_t*)&(((ICMPv6_ht*)(msg->payload))->checksum));//do last -! //send -! if (icmpv6_send(msg)!=E_SUCCESS) { -! icmpv6echo_vars.busySending = FALSE; -! openqueue_freePacketBuffer(msg); -! } -! } -! } -! -! void icmpv6echo_sendDone(OpenQueueEntry_t* msg, error_t error) { -! msg->owner = COMPONENT_ICMPv6ECHO; -! if (msg->creator!=COMPONENT_ICMPv6ECHO) {//that was a packet I had not created -! openserial_printError(COMPONENT_ICMPv6ECHO,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! openqueue_freePacketBuffer(msg); -! icmpv6echo_vars.busySending = FALSE; -! } -! -! void icmpv6echo_receive(OpenQueueEntry_t* msg) { -! OpenQueueEntry_t* reply; -! msg->owner = COMPONENT_ICMPv6ECHO; -! switch(msg->l4_sourcePortORicmpv6Type) { -! case IANA_ICMPv6_ECHO_REQUEST: -! openserial_printInfo(COMPONENT_ICMPv6ECHO,ERR_RCVD_ECHO_REQUEST, -! (errorparameter_t)0, -! (errorparameter_t)0); -! // get a new openqueuEntry_t for the echo reply -! reply = openqueue_getFreePacketBuffer(COMPONENT_ICMPv6ECHO); -! if (reply==NULL) { -! openserial_printError(COMPONENT_ICMPv6ECHO,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)1, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! // take ownership over reply -! reply->creator = COMPONENT_ICMPv6ECHO; -! reply->owner = COMPONENT_ICMPv6ECHO; -! // copy payload from msg to (end of) reply -! packetfunctions_reserveHeaderSize(reply,msg->length); -! memcpy(reply->payload,msg->payload,msg->length); -! // copy source of msg in destination of reply -! memcpy(&(reply->l3_destinationAdd),&(msg->l3_sourceAdd),sizeof(open_addr_t)); -! // free up msg -! openqueue_freePacketBuffer(msg); -! msg = NULL; -! // administrative information for reply -! reply->l4_protocol = IANA_ICMPv6; -! reply->l4_sourcePortORicmpv6Type = IANA_ICMPv6_ECHO_REPLY; -! ((ICMPv6_ht*)(reply->payload))->type = reply->l4_sourcePortORicmpv6Type; -! packetfunctions_calculateChecksum(reply,(uint8_t*)&(((ICMPv6_ht*)(reply->payload))->checksum));//do last -! icmpv6echo_vars.busySending = TRUE; -! if (icmpv6_send(reply)!=E_SUCCESS) { -! icmpv6echo_vars.busySending = FALSE; -! openqueue_freePacketBuffer(reply); -! } -! break; -! case IANA_ICMPv6_ECHO_REPLY: -! openserial_printInfo(COMPONENT_ICMPv6ECHO,ERR_RCVD_ECHO_REPLY, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! break; -! default: -! openserial_printError(COMPONENT_ICMPv6ECHO,ERR_UNSUPPORTED_ICMPV6_TYPE, -! (errorparameter_t)msg->l4_sourcePortORicmpv6Type, -! (errorparameter_t)2); -! openqueue_freePacketBuffer(msg); -! break; -! } -! } -! -! //=========================== private ========================================= -\ No newline at end of file ---- 1,148 ---- -! #include "openwsn.h" -! #include "icmpv6echo.h" -! #include "icmpv6.h" -! #include "openserial.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! //#include "debugpins.h" -! -! //=========================== variables ======================================= -! -! icmpv6echo_vars_t icmpv6echo_vars; -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void icmpv6echo_init(void) { -! icmpv6echo_vars.busySending = FALSE; -! icmpv6echo_vars.seq = 0; -! } -! -! void icmpv6echo_trigger(void) { -! uint8_t number_bytes_from_input_buffer; -! uint8_t input_buffer[16]; -! OpenQueueEntry_t* msg; -! -! -! //get command from OpenSerial (16B IPv6 destination address) -! number_bytes_from_input_buffer = openserial_getInputBuffer(&(input_buffer[0]),sizeof(input_buffer)); -! if (number_bytes_from_input_buffer!=sizeof(input_buffer)) { -! openserial_printError(COMPONENT_ICMPv6ECHO,ERR_INPUTBUFFER_LENGTH, -! (errorparameter_t)number_bytes_from_input_buffer, -! (errorparameter_t)0); -! return; -! }; -! icmpv6echo_vars.hisAddress.type = ADDR_128B; -! memcpy(&(icmpv6echo_vars.hisAddress.addr_128b[0]),&(input_buffer[0]),16); -! -! //send -! if (icmpv6echo_vars.busySending==TRUE) { -! openserial_printError(COMPONENT_ICMPv6ECHO,ERR_BUSY_SENDING, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } else { -! icmpv6echo_vars.busySending = TRUE; -! -! msg = openqueue_getFreePacketBuffer(COMPONENT_ICMPv6ECHO); -! if (msg==NULL) { -! openserial_printError(COMPONENT_ICMPv6ECHO,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! icmpv6echo_vars.busySending = FALSE; -! return; -! } -! //admin -! msg->creator = COMPONENT_ICMPv6ECHO; -! msg->owner = COMPONENT_ICMPv6ECHO; -! //l4 -! msg->l4_protocol = IANA_ICMPv6; -! msg->l4_sourcePortORicmpv6Type = IANA_ICMPv6_ECHO_REQUEST; -! //l3 -! memcpy(&(msg->l3_destinationAdd),&icmpv6echo_vars.hisAddress,sizeof(open_addr_t)); -! //payload -! packetfunctions_reserveHeaderSize(msg,4); -! packetfunctions_htonl(0x789abcde,(uint8_t*)(msg->payload)); -! //ICMPv6 header -! packetfunctions_reserveHeaderSize(msg,sizeof(ICMPv6_ht)); -! ((ICMPv6_ht*)(msg->payload))->type = msg->l4_sourcePortORicmpv6Type; -! ((ICMPv6_ht*)(msg->payload))->code = 0; -! // Below Identifier might need to be replaced by the identifier used by icmpv6rpl -! // packetfunctions_htons(0x1234 ,(uint8_t*)&((ICMPv6_ht*)(msg->payload))->identifier); -! // Below sequence_number might need to be removed -! // packetfunctions_htons(icmpv6echo_vars.seq++ ,(uint8_t*)&((ICMPv6_ht*)(msg->payload))->sequence_number); -! packetfunctions_calculateChecksum(msg,(uint8_t*)&(((ICMPv6_ht*)(msg->payload))->checksum));//do last -! //send -! if (icmpv6_send(msg)!=E_SUCCESS) { -! icmpv6echo_vars.busySending = FALSE; -! openqueue_freePacketBuffer(msg); -! } -! } -! } -! -! void icmpv6echo_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! msg->owner = COMPONENT_ICMPv6ECHO; -! if (msg->creator!=COMPONENT_ICMPv6ECHO) {//that was a packet I had not created -! openserial_printError(COMPONENT_ICMPv6ECHO,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! openqueue_freePacketBuffer(msg); -! icmpv6echo_vars.busySending = FALSE; -! } -! -! void icmpv6echo_receive(OpenQueueEntry_t* msg) { -! OpenQueueEntry_t* reply; -! msg->owner = COMPONENT_ICMPv6ECHO; -! switch(msg->l4_sourcePortORicmpv6Type) { -! case IANA_ICMPv6_ECHO_REQUEST: -! openserial_printInfo(COMPONENT_ICMPv6ECHO,ERR_RCVD_ECHO_REQUEST, -! (errorparameter_t)0, -! (errorparameter_t)0); -! // get a new openqueuEntry_t for the echo reply -! reply = openqueue_getFreePacketBuffer(COMPONENT_ICMPv6ECHO); -! if (reply==NULL) { -! openserial_printError(COMPONENT_ICMPv6ECHO,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)1, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! // take ownership over reply -! reply->creator = COMPONENT_ICMPv6ECHO; -! reply->owner = COMPONENT_ICMPv6ECHO; -! // copy payload from msg to (end of) reply -! packetfunctions_reserveHeaderSize(reply,msg->length); -! memcpy(reply->payload,msg->payload,msg->length); -! // copy source of msg in destination of reply -! memcpy(&(reply->l3_destinationAdd),&(msg->l3_sourceAdd),sizeof(open_addr_t)); -! // free up msg -! openqueue_freePacketBuffer(msg); -! msg = NULL; -! // administrative information for reply -! reply->l4_protocol = IANA_ICMPv6; -! reply->l4_sourcePortORicmpv6Type = IANA_ICMPv6_ECHO_REPLY; -! ((ICMPv6_ht*)(reply->payload))->type = reply->l4_sourcePortORicmpv6Type; -! packetfunctions_calculateChecksum(reply,(uint8_t*)&(((ICMPv6_ht*)(reply->payload))->checksum));//do last -! icmpv6echo_vars.busySending = TRUE; -! if (icmpv6_send(reply)!=E_SUCCESS) { -! icmpv6echo_vars.busySending = FALSE; -! openqueue_freePacketBuffer(reply); -! } -! break; -! case IANA_ICMPv6_ECHO_REPLY: -! openserial_printInfo(COMPONENT_ICMPv6ECHO,ERR_RCVD_ECHO_REPLY, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! break; -! default: -! openserial_printError(COMPONENT_ICMPv6ECHO,ERR_UNSUPPORTED_ICMPV6_TYPE, -! (errorparameter_t)msg->l4_sourcePortORicmpv6Type, -! (errorparameter_t)2); -! openqueue_freePacketBuffer(msg); -! break; -! } -! } -! -! //=========================== private ========================================= -diff -crB openwsn/03b-IPv6/icmpv6echo.h ../../../sys/net/openwsn/03b-IPv6/icmpv6echo.h -*** openwsn/03b-IPv6/icmpv6echo.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/03b-IPv6/icmpv6echo.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,29 **** -! #ifndef __ICMPv6ECHO_H -! #define __ICMPv6ECHO_H -! -! /** -! \addtogroup IPv6 -! \{ -! \addtogroup ICMPv6Echo -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void icmpv6echo_init(); -! void icmpv6echo_trigger(); -! void icmpv6echo_sendDone(OpenQueueEntry_t* msg, error_t error); -! void icmpv6echo_receive(OpenQueueEntry_t* msg); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,35 ---- -! #ifndef __ICMPv6ECHO_H -! #define __ICMPv6ECHO_H -! -! /** -! \addtogroup IPv6 -! \{ -! \addtogroup ICMPv6Echo -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== module variables ================================ -! -! typedef struct { -! bool busySending; -! open_addr_t hisAddress; -! uint16_t seq; -! } icmpv6echo_vars_t; -! -! //=========================== prototypes ====================================== -! -! void icmpv6echo_init(void); -! void icmpv6echo_trigger(void); -! void icmpv6echo_sendDone(OpenQueueEntry_t* msg, owerror_t error); -! void icmpv6echo_receive(OpenQueueEntry_t* msg); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/03b-IPv6/icmpv6rpl.c ../../../sys/net/openwsn/03b-IPv6/icmpv6rpl.c -*** openwsn/03b-IPv6/icmpv6rpl.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/03b-IPv6/icmpv6rpl.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,562 **** -! #include "openwsn.h" -! #include "icmpv6rpl.h" -! #include "icmpv6.h" -! #include "openserial.h" -! #include "openqueue.h" -! #include "neighbors.h" -! #include "packetfunctions.h" -! #include "openrandom.h" -! #include "scheduler.h" -! #include "idmanager.h" -! #include "opentimers.h" -! #include "IEEE802154E.h" -! -! //=========================== variables ======================================= -! -! typedef struct { -! // admin -! bool busySending; ///< currently sending DIO/DAO. -! uint8_t DODAGIDFlagSet; ///< is DODAGID set already? -! // DIO-related -! icmpv6rpl_dio_ht dio; ///< pre-populated DIO packet. -! open_addr_t dioDestination; ///< IPv6 destination address for DIOs. -! uint16_t periodDIO; ///< duration, in ms, of a timerIdDIO timeout. -! opentimer_id_t timerIdDIO; ///< ID of the timer used to send DIOs. -! uint8_t delayDIO; ///< number of timerIdDIO events before actually sending a DIO. -! // DAO-related -! icmpv6rpl_dao_ht dao; ///< pre-populated DAO packet. -! icmpv6rpl_dao_transit_ht dao_transit; ///< pre-populated DAO "Transit Info" option header. -! icmpv6rpl_dao_target_ht dao_target; ///< pre-populated DAO "Transit Info" option header. -! opentimer_id_t timerIdDAO; ///< ID of the timer used to send DAOs. -! uint16_t periodDAO; ///< duration, in ms, of a timerIdDAO timeout. -! uint8_t delayDAO; ///< number of timerIdDIO events before actually sending a DAO. -! } icmpv6rpl_vars_t; -! -! icmpv6rpl_vars_t icmpv6rpl_vars; -! -! //=========================== prototypes ====================================== -! -! // DIO-related -! void icmpv6rpl_timer_DIO_cb(); -! void icmpv6rpl_timer_DIO_task(); -! void sendDIO(); -! // DAO-related -! void icmpv6rpl_timer_DAO_cb(); -! void icmpv6rpl_timer_DAO_task(); -! void sendDAO(); -! -! //=========================== public ========================================== -! -! /** -! \brief Initialize this module. -! */ -! void icmpv6rpl_init() { -! -! //===== reset local variables -! memset(&icmpv6rpl_vars,0,sizeof(icmpv6rpl_vars_t)); -! -! //=== admin -! -! icmpv6rpl_vars.busySending = FALSE; -! icmpv6rpl_vars.DODAGIDFlagSet = 0; -! -! //=== DIO-related -! -! icmpv6rpl_vars.dio.rplinstanceId = 0x00; ///< TODO: put correct value -! icmpv6rpl_vars.dio.verNumb = 0x00; ///< TODO: put correct value -! // rank: to be populated upon TX -! icmpv6rpl_vars.dio.rplOptions = MOP_DIO_A | \ -! MOP_DIO_B | \ -! MOP_DIO_C | \ -! PRF_DIO_A | \ -! PRF_DIO_B | \ -! PRF_DIO_C | \ -! G_DIO ; -! icmpv6rpl_vars.dio.DTSN = 0x33; ///< TODO: put correct value -! icmpv6rpl_vars.dio.flags = 0x00; -! icmpv6rpl_vars.dio.reserved = 0x00; -! // DODAGID: to be populated upon receiving DIO -! -! icmpv6rpl_vars.dioDestination.type = ADDR_128B; -! memcpy(&icmpv6rpl_vars.dioDestination.addr_128b[0],all_routers_multicast,sizeof(all_routers_multicast)); -! -! icmpv6rpl_vars.periodDIO = TIMER_DIO_TIMEOUT+(openrandom_get16b()&0xff); -! icmpv6rpl_vars.timerIdDIO = opentimers_start( -! icmpv6rpl_vars.periodDIO, -! TIMER_PERIODIC, -! TIME_MS, -! icmpv6rpl_timer_DIO_cb -! ); -! -! //=== DAO-related -! -! icmpv6rpl_vars.dao.rplinstanceId = 0x00; ///< TODO: put correct value -! icmpv6rpl_vars.dao.K_D_flags = FLAG_DAO_A | \ -! FLAG_DAO_B | \ -! FLAG_DAO_C | \ -! FLAG_DAO_D | \ -! FLAG_DAO_E | \ -! PRF_DIO_C | \ -! FLAG_DAO_F | \ -! D_DAO | -! K_DAO; -! icmpv6rpl_vars.dao.reserved = 0x00; -! icmpv6rpl_vars.dao.DAOSequance = 0x00; -! // DODAGID: to be populated upon receiving DIO -! -! icmpv6rpl_vars.dao_transit.type = OPTION_TRANSIT_INFORMATION_TYPE; -! // optionLength: to be populated upon TX -! icmpv6rpl_vars.dao_transit.E_flags = E_DAO_Transit_Info; -! icmpv6rpl_vars.dao_transit.PathControl = PC1_A_DAO_Transit_Info | \ -! PC1_B_DAO_Transit_Info | \ -! PC2_A_DAO_Transit_Info | \ -! PC2_B_DAO_Transit_Info | \ -! PC3_A_DAO_Transit_Info | \ -! PC3_B_DAO_Transit_Info | \ -! PC4_A_DAO_Transit_Info | \ -! PC4_B_DAO_Transit_Info; -! icmpv6rpl_vars.dao_transit.PathSequence = 0x00; // to be incremented at each TX -! icmpv6rpl_vars.dao_transit.PathLifetime = 0xAA; -! //target information -! icmpv6rpl_vars.dao_target.type = OPTION_TARGET_INFORMATION_TYPE; -! icmpv6rpl_vars.dao_target.optionLength = 0; -! icmpv6rpl_vars.dao_target.flags = 0; -! icmpv6rpl_vars.dao_target.prefixLength = 0; -! -! icmpv6rpl_vars.periodDAO = TIMER_DAO_TIMEOUT+(openrandom_get16b()&0xff); -! icmpv6rpl_vars.timerIdDAO = opentimers_start( -! icmpv6rpl_vars.periodDAO, -! TIMER_PERIODIC, -! TIME_MS, -! icmpv6rpl_timer_DAO_cb -! ); -! -! } -! -! /** -! \brief Called when DIO/DAO was sent. -! -! \param[in] msg Pointer to the message just sent. -! \param[in] error Outcome of the sending. -! */ -! void icmpv6rpl_sendDone(OpenQueueEntry_t* msg, error_t error) { -! -! // take ownership over that packet -! msg->owner = COMPONENT_ICMPv6RPL; -! -! // make sure I created it -! if (msg->creator!=COMPONENT_ICMPv6RPL) { -! openserial_printError(COMPONENT_ICMPv6RPL,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! -! // free packet -! openqueue_freePacketBuffer(msg); -! -! // I'm not busy sending anymore -! icmpv6rpl_vars.busySending = FALSE; -! } -! -! /** -! \brief Called when RPL message received. -! -! \param[in] msg Pointer to the received message. -! */ -! void icmpv6rpl_receive(OpenQueueEntry_t* msg) { -! uint8_t icmpv6code; -! open_addr_t myPrefix; -! -! // take ownership -! msg->owner = COMPONENT_ICMPv6RPL; -! -! // retrieve ICMPv6 code -! icmpv6code = (((ICMPv6_ht*)(msg->payload))->code); -! -! // toss ICMPv6 header -! packetfunctions_tossHeader(msg,sizeof(ICMPv6_ht)); -! -! // handle message -! switch (icmpv6code) { -! -! case IANA_ICMPv6_RPL_DIO: -! if (idmanager_getIsBridge()==TRUE) { -! // stop here if I'm in bridge mode -! break; // break, don't return -! } -! -! // update neighbor table -! neighbors_indicateRxDIO(msg); -! -! // update DODAGID in DIO/DAO -! memcpy( -! &(icmpv6rpl_vars.dio.DODAGID[0]), -! &(((icmpv6rpl_dio_ht*)(msg->payload))->DODAGID[0]), -! sizeof(icmpv6rpl_vars.dio.DODAGID) -! ); -! memcpy( -! &(icmpv6rpl_vars.dao.DODAGID[0]), -! &(((icmpv6rpl_dio_ht*)(msg->payload))->DODAGID[0]), -! sizeof(icmpv6rpl_vars.dao.DODAGID) -! ); -! -! // remember I got a DODAGID -! icmpv6rpl_vars.DODAGIDFlagSet=1; -! -! // update my prefix -! myPrefix.type = ADDR_PREFIX; -! memcpy( -! myPrefix.prefix, -! &((icmpv6rpl_dio_ht*)(msg->payload))->DODAGID[0], -! sizeof(myPrefix.prefix) -! ); -! idmanager_setMyID(&myPrefix); -! -! break; -! -! case IANA_ICMPv6_RPL_DAO: -! // this should never happen -! openserial_printCritical(COMPONENT_ICMPv6RPL,ERR_UNEXPECTED_DAO, -! (errorparameter_t)0, -! (errorparameter_t)0); -! break; -! -! default: -! // this should never happen -! openserial_printCritical(COMPONENT_ICMPv6RPL,ERR_MSG_UNKNOWN_TYPE, -! (errorparameter_t)icmpv6code, -! (errorparameter_t)0); -! break; -! -! } -! -! // free message -! openqueue_freePacketBuffer(msg); -! } -! -! //=========================== private ========================================= -! -! //===== DIO-related -! -! /** -! \brief DIO timer callback function. -! -! \note This function is executed in interrupt context, and should only push a -! task. -! */ -! void icmpv6rpl_timer_DIO_cb() { -! scheduler_push_task(icmpv6rpl_timer_DIO_task,TASKPRIO_RPL); -! } -! -! /** -! \brief Handler for DIO timer event. -! -! \note This function is executed in task context, called by the scheduler. -! */ -! void icmpv6rpl_timer_DIO_task() { -! -! // update the delayDIO -! icmpv6rpl_vars.delayDIO = (icmpv6rpl_vars.delayDIO+1)%5; -! -! // check whether we need to send DIO -! if (icmpv6rpl_vars.delayDIO==0) { -! -! // send DIO -! sendDIO(); -! -! // pick a new pseudo-random periodDIO -! icmpv6rpl_vars.periodDIO = TIMER_DIO_TIMEOUT+(openrandom_get16b()&0xff); -! -! // arm the DIO timer with this new value -! opentimers_setPeriod( -! icmpv6rpl_vars.timerIdDIO, -! TIME_MS, -! icmpv6rpl_vars.periodDIO -! ); -! } -! } -! -! /** -! \brief Prepare and a send a RPL DIO. -! */ -! void sendDIO() { -! OpenQueueEntry_t* msg; -! -! // stop if I'm not sync'ed -! if (ieee154e_isSynch()==FALSE) { -! -! // remove packets genereted by this module (DIO and DAO) from openqueue -! openqueue_removeAllCreatedBy(COMPONENT_ICMPv6RPL); -! -! // I'm not busy sending a DIO/DAO -! icmpv6rpl_vars.busySending = FALSE; -! -! // stop here -! return; -! } -! -! // do not send DIO if I'm in in bridge mode -! if (idmanager_getIsBridge()==TRUE) { -! return; -! } -! -! // do not send DIO if I have the default DAG rank -! if (neighbors_getMyDAGrank()==DEFAULTDAGRANK) { -! return; -! } -! -! // do not send DIO if I'm already busy sending -! if (icmpv6rpl_vars.busySending==TRUE) { -! return; -! } -! -! // if you get here, all good to send a DIO -! -! // I'm now busy sending -! icmpv6rpl_vars.busySending = TRUE; -! -! // reserve a free packet buffer for DIO -! msg = openqueue_getFreePacketBuffer(COMPONENT_ICMPv6RPL); -! if (msg==NULL) { -! openserial_printError(COMPONENT_ICMPv6RPL,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! icmpv6rpl_vars.busySending = FALSE; -! -! return; -! } -! -! // take ownership -! msg->creator = COMPONENT_ICMPv6RPL; -! msg->owner = COMPONENT_ICMPv6RPL; -! -! // set transport information -! msg->l4_protocol = IANA_ICMPv6; -! msg->l4_sourcePortORicmpv6Type = IANA_ICMPv6_RPL; -! -! // set DIO destination -! memcpy(&(msg->l3_destinationAdd),&icmpv6rpl_vars.dioDestination,sizeof(open_addr_t)); -! -! //===== DIO payload -! // note: DIO is already mostly populated -! icmpv6rpl_vars.dio.rank = neighbors_getMyDAGrank(); -! packetfunctions_reserveHeaderSize(msg,sizeof(icmpv6rpl_dio_ht)); -! memcpy( -! ((icmpv6rpl_dio_ht*)(msg->payload)), -! &(icmpv6rpl_vars.dio), -! sizeof(icmpv6rpl_dio_ht) -! ); -! -! //===== ICMPv6 header -! packetfunctions_reserveHeaderSize(msg,sizeof(ICMPv6_ht)); -! ((ICMPv6_ht*)(msg->payload))->type = msg->l4_sourcePortORicmpv6Type; -! ((ICMPv6_ht*)(msg->payload))->code = IANA_ICMPv6_RPL_DIO; -! packetfunctions_calculateChecksum(msg,(uint8_t*)&(((ICMPv6_ht*)(msg->payload))->checksum));//call last -! -! //send -! if (icmpv6_send(msg)!=E_SUCCESS) { -! icmpv6rpl_vars.busySending = FALSE; -! openqueue_freePacketBuffer(msg); -! } else { -! icmpv6rpl_vars.busySending = FALSE; -! } -! } -! -! //===== DAO-related -! -! /** -! \brief DAO timer callback function. -! -! \note This function is executed in interrupt context, and should only push a -! task. -! */ -! void icmpv6rpl_timer_DAO_cb() { -! scheduler_push_task(icmpv6rpl_timer_DAO_task,TASKPRIO_RPL); -! } -! -! /** -! \brief Handler for DAO timer event. -! -! \note This function is executed in task context, called by the scheduler. -! */ -! void icmpv6rpl_timer_DAO_task() { -! -! // update the delayDAO -! icmpv6rpl_vars.delayDAO = (icmpv6rpl_vars.delayDAO+1)%5; -! -! // check whether we need to send DAO -! if (icmpv6rpl_vars.delayDAO==0) { -! -! // send DAO -! sendDAO(); -! -! // pick a new pseudo-random periodDAO -! icmpv6rpl_vars.periodDAO = TIMER_DAO_TIMEOUT+(openrandom_get16b()&0xff); -! -! // arm the DAO timer with this new value -! opentimers_setPeriod( -! icmpv6rpl_vars.timerIdDAO, -! TIME_MS, -! icmpv6rpl_vars.periodDAO -! ); -! } -! } -! -! /** -! \brief Prepare and a send a RPL DAO. -! */ -! void sendDAO() { -! OpenQueueEntry_t* msg; // pointer to DAO messages -! uint8_t nbrIdx; // running neighbor index -! uint8_t numTransitParents,numTargetParents; // the number of parents indicated in transit option -! open_addr_t address; -! -! if (ieee154e_isSynch()==FALSE) { -! // I'm not sync'ed -! -! // delete packets genereted by this module (DIO and DAO) from openqueue -! openqueue_removeAllCreatedBy(COMPONENT_ICMPv6RPL); -! -! // I'm not busy sending a DIO/DAO -! icmpv6rpl_vars.busySending = FALSE; -! -! // stop here -! return; -! } -! -! // dont' send a DAO if you're in bridge mode -! if (idmanager_getIsBridge()==TRUE) { -! return; -! } -! -! // dont' send a DAO if you did not acquire a DAGrank -! if (neighbors_getMyDAGrank()==DEFAULTDAGRANK) { -! return; -! } -! -! // dont' send a DAO if you're still busy sending the previous one -! if (icmpv6rpl_vars.busySending==TRUE) { -! return; -! } -! -! // if you get here, you start construct DAO -! -! // reserve a free packet buffer for DAO -! msg = openqueue_getFreePacketBuffer(COMPONENT_ICMPv6RPL); -! if (msg==NULL) { -! openserial_printError(COMPONENT_ICMPv6RPL,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return; -! } -! -! // take ownership -! msg->creator = COMPONENT_ICMPv6RPL; -! msg->owner = COMPONENT_ICMPv6RPL; -! -! // set transport information -! msg->l4_protocol = IANA_ICMPv6; -! msg->l4_sourcePortORicmpv6Type = IANA_ICMPv6_RPL; -! -! // set DAO destination -! msg->l3_destinationAdd.type=ADDR_128B; -! memcpy(msg->l3_destinationAdd.addr_128b,icmpv6rpl_vars.dio.DODAGID,sizeof(icmpv6rpl_vars.dio.DODAGID)); -! -! //===== fill in packet -! -! //=== transit option -- from RFC 6550, page 55 - 1 transit information header per parent is required. -! numTransitParents = 0; -! for (nbrIdx=0;nbrIdx<MAXNUMNEIGHBORS;nbrIdx++) { -! if ((neighbors_isNeighborWithLowerDAGrank(nbrIdx))==TRUE) { -! // this neighbor is of lower DAGrank as I am -! -! // write it's address in DAO -! //packetfunctions_reserveHeaderSize(msg,LENGTH_ADDR64b); -! neighbors_getNeighbor(&address,ADDR_64B,nbrIdx); -! packetfunctions_writeAddress(msg,&address,BIG_ENDIAN); -! -! -! // update transit info fields -! //size of the whole option in bytes. -! icmpv6rpl_vars.dao_transit.optionLength = LENGTH_ADDR64b + sizeof(icmpv6rpl_dao_transit_ht); -! icmpv6rpl_vars.dao_transit.PathControl=0; //todo. this is to set the preference of this parent. -! icmpv6rpl_vars.dao_transit.type=OPTION_TRANSIT_INFORMATION_TYPE; -! -! // write transit info in packet -! packetfunctions_reserveHeaderSize(msg,sizeof(icmpv6rpl_dao_transit_ht)); -! memcpy( -! ((icmpv6rpl_dao_transit_ht*)(msg->payload)), -! &(icmpv6rpl_vars.dao_transit), -! sizeof(icmpv6rpl_dao_transit_ht) -! ); -! -! // remember I found it -! numTransitParents++; -! } -! } -! -! //target information is required. RFC 6550 page 55. -! /* -! One or more Transit Information options MUST be preceded by one or -! more RPL Target options. -! */ -! numTargetParents = 0; -! for (nbrIdx=0;nbrIdx<MAXNUMNEIGHBORS;nbrIdx++) { -! if ((neighbors_isNeighborWithHigherDAGrank(nbrIdx))==TRUE) { -! // this neighbor is of higher DAGrank as I am. so it is my child -! -! // write it's address in DAO RFC6550 page 80 check point 1. -! neighbors_getNeighbor(&address,ADDR_64B,nbrIdx); -! packetfunctions_writeAddress(msg,&address,BIG_ENDIAN); -! -! // update target info fields -! icmpv6rpl_vars.dao_target.optionLength = LENGTH_ADDR64b + sizeof(icmpv6rpl_dao_target_ht); -! icmpv6rpl_vars.dao_target.type = OPTION_TARGET_INFORMATION_TYPE; -! icmpv6rpl_vars.dao_target.flags = 0; //must be 0 -! icmpv6rpl_vars.dao_target.prefixLength = 0; //no prefix. -! -! // write transit info in packet -! packetfunctions_reserveHeaderSize(msg,sizeof(icmpv6rpl_dao_target_ht)); -! memcpy( -! ((icmpv6rpl_dao_target_ht*)(msg->payload)), -! &(icmpv6rpl_vars.dao_target), -! sizeof(icmpv6rpl_dao_target_ht) -! ); -! -! // remember I found it -! numTargetParents++; -! } -! } -! -! -! // stop here if no parents found -! if (numTransitParents==0) { -! openqueue_freePacketBuffer(msg); -! return; -! } -! -! icmpv6rpl_vars.dao_transit.PathSequence++; //increment path sequence. -! // if you get here, you will send a DAO -! -! -! //=== DAO header -! packetfunctions_reserveHeaderSize(msg,sizeof(icmpv6rpl_dao_ht)); -! memcpy( -! ((icmpv6rpl_dao_ht*)(msg->payload)), -! &(icmpv6rpl_vars.dao), -! sizeof(icmpv6rpl_dao_ht) -! ); -! -! //=== ICMPv6 header -! packetfunctions_reserveHeaderSize(msg,sizeof(ICMPv6_ht)); -! ((ICMPv6_ht*)(msg->payload))->type = msg->l4_sourcePortORicmpv6Type; -! ((ICMPv6_ht*)(msg->payload))->code = IANA_ICMPv6_RPL_DAO; -! packetfunctions_calculateChecksum(msg,(uint8_t*)&(((ICMPv6_ht*)(msg->payload))->checksum)); //call last -! -! //===== send -! if (icmpv6_send(msg)==E_SUCCESS) { -! icmpv6rpl_vars.busySending = TRUE; -! } else { -! openqueue_freePacketBuffer(msg); -! } -! } ---- 1,561 ---- -! #include "openwsn.h" -! #include "icmpv6rpl.h" -! #include "icmpv6.h" -! #include "openserial.h" -! #include "openqueue.h" -! #include "neighbors.h" -! #include "packetfunctions.h" -! #include "openrandom.h" -! #include "scheduler.h" -! #include "idmanager.h" -! #include "opentimers.h" -! #include "IEEE802154E.h" -! -! #include "thread.h" -! -! //=========================== variables ======================================= -! -! icmpv6rpl_vars_t icmpv6rpl_vars; -! //static char openwsn_icmpv6rpl_DAO_stack[KERNEL_CONF_STACKSIZE_MAIN]; -! //static char openwsn_icmpv6rpl_DIO_stack[KERNEL_CONF_STACKSIZE_MAIN]; -! -! //=========================== prototypes ====================================== -! -! // DIO-related -! void icmpv6rpl_timer_DIO_cb(void); -! void icmpv6rpl_timer_DIO_task(void); -! void sendDIO(void); -! // DAO-related -! void icmpv6rpl_timer_DAO_cb(void); -! void icmpv6rpl_timer_DAO_task(void); -! void sendDAO(void); -! -! //=========================== public ========================================== -! -! /** -! \brief Initialize this module. -! */ -! void icmpv6rpl_init(void) { -! -! //===== reset local variables -! memset(&icmpv6rpl_vars,0,sizeof(icmpv6rpl_vars_t)); -! -! //=== admin -! -! icmpv6rpl_vars.busySending = FALSE; -! icmpv6rpl_vars.DODAGIDFlagSet = 0; -! -! //=== DIO-related -! -! icmpv6rpl_vars.dio.rplinstanceId = 0x00; ///< TODO: put correct value -! icmpv6rpl_vars.dio.verNumb = 0x00; ///< TODO: put correct value -! // rank: to be populated upon TX -! icmpv6rpl_vars.dio.rplOptions = MOP_DIO_A | \ -! MOP_DIO_B | \ -! MOP_DIO_C | \ -! PRF_DIO_A | \ -! PRF_DIO_B | \ -! PRF_DIO_C | \ -! G_DIO ; -! icmpv6rpl_vars.dio.DTSN = 0x33; ///< TODO: put correct value -! icmpv6rpl_vars.dio.flags = 0x00; -! icmpv6rpl_vars.dio.reserved = 0x00; -! // DODAGID: to be populated upon receiving DIO -! -! icmpv6rpl_vars.dioDestination.type = ADDR_128B; -! memcpy(&icmpv6rpl_vars.dioDestination.addr_128b[0],all_routers_multicast,sizeof(all_routers_multicast)); -! -! icmpv6rpl_vars.periodDIO = TIMER_DIO_TIMEOUT+(openrandom_get16b()&0xff); -! icmpv6rpl_vars.timerIdDIO = opentimers_start( -! icmpv6rpl_vars.periodDIO, -! TIMER_PERIODIC, -! TIME_MS, -! icmpv6rpl_timer_DIO_cb -! ); -! -! //=== DAO-related -! -! icmpv6rpl_vars.dao.rplinstanceId = 0x00; ///< TODO: put correct value -! icmpv6rpl_vars.dao.K_D_flags = FLAG_DAO_A | \ -! FLAG_DAO_B | \ -! FLAG_DAO_C | \ -! FLAG_DAO_D | \ -! FLAG_DAO_E | \ -! PRF_DIO_C | \ -! FLAG_DAO_F | \ -! D_DAO | -! K_DAO; -! icmpv6rpl_vars.dao.reserved = 0x00; -! icmpv6rpl_vars.dao.DAOSequence = 0x00; -! // DODAGID: to be populated upon receiving DIO -! -! icmpv6rpl_vars.dao_transit.type = OPTION_TRANSIT_INFORMATION_TYPE; -! // optionLength: to be populated upon TX -! icmpv6rpl_vars.dao_transit.E_flags = E_DAO_Transit_Info; -! icmpv6rpl_vars.dao_transit.PathControl = PC1_A_DAO_Transit_Info | \ -! PC1_B_DAO_Transit_Info | \ -! PC2_A_DAO_Transit_Info | \ -! PC2_B_DAO_Transit_Info | \ -! PC3_A_DAO_Transit_Info | \ -! PC3_B_DAO_Transit_Info | \ -! PC4_A_DAO_Transit_Info | \ -! PC4_B_DAO_Transit_Info; -! icmpv6rpl_vars.dao_transit.PathSequence = 0x00; // to be incremented at each TX -! icmpv6rpl_vars.dao_transit.PathLifetime = 0xAA; -! //target information -! icmpv6rpl_vars.dao_target.type = OPTION_TARGET_INFORMATION_TYPE; -! icmpv6rpl_vars.dao_target.optionLength = 0; -! icmpv6rpl_vars.dao_target.flags = 0; -! icmpv6rpl_vars.dao_target.prefixLength = 0; -! -! icmpv6rpl_vars.periodDAO = TIMER_DAO_TIMEOUT+(openrandom_get16b()&0xff); -! icmpv6rpl_vars.timerIdDAO = opentimers_start( -! icmpv6rpl_vars.periodDAO, -! TIMER_PERIODIC, -! TIME_MS, -! icmpv6rpl_timer_DAO_cb -! ); -! -! } -! -! uint8_t icmpv6rpl_getRPLIntanceID(void){ -! return icmpv6rpl_vars.dao.rplinstanceId; -! } -! -! /** -! \brief Called when DIO/DAO was sent. -! -! \param[in] msg Pointer to the message just sent. -! \param[in] error Outcome of the sending. -! */ -! void icmpv6rpl_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! -! // take ownership over that packet -! msg->owner = COMPONENT_ICMPv6RPL; -! -! // make sure I created it -! if (msg->creator!=COMPONENT_ICMPv6RPL) { -! openserial_printError(COMPONENT_ICMPv6RPL,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! -! // free packet -! openqueue_freePacketBuffer(msg); -! -! // I'm not busy sending anymore -! icmpv6rpl_vars.busySending = FALSE; -! } -! -! /** -! \brief Called when RPL message received. -! -! \param[in] msg Pointer to the received message. -! */ -! void icmpv6rpl_receive(OpenQueueEntry_t* msg) { -! uint8_t icmpv6code; -! open_addr_t myPrefix; -! -! // take ownership -! msg->owner = COMPONENT_ICMPv6RPL; -! -! // retrieve ICMPv6 code -! icmpv6code = (((ICMPv6_ht*)(msg->payload))->code); -! -! // toss ICMPv6 header -! packetfunctions_tossHeader(msg,sizeof(ICMPv6_ht)); -! -! // handle message -! switch (icmpv6code) { -! -! case IANA_ICMPv6_RPL_DIO: -! if (idmanager_getIsBridge()==TRUE) { -! // stop here if I'm in bridge mode -! break; // break, don't return -! } -! -! // update neighbor table -! neighbors_indicateRxDIO(msg); -! -! // update DODAGID in DIO/DAO -! memcpy( -! &(icmpv6rpl_vars.dio.DODAGID[0]), -! &(((icmpv6rpl_dio_ht*)(msg->payload))->DODAGID[0]), -! sizeof(icmpv6rpl_vars.dio.DODAGID) -! ); -! memcpy( -! &(icmpv6rpl_vars.dao.DODAGID[0]), -! &(((icmpv6rpl_dio_ht*)(msg->payload))->DODAGID[0]), -! sizeof(icmpv6rpl_vars.dao.DODAGID) -! ); -! -! // remember I got a DODAGID -! icmpv6rpl_vars.DODAGIDFlagSet=1; -! -! // update my prefix -! myPrefix.type = ADDR_PREFIX; -! memcpy( -! myPrefix.prefix, -! &((icmpv6rpl_dio_ht*)(msg->payload))->DODAGID[0], -! sizeof(myPrefix.prefix) -! ); -! idmanager_setMyID(&myPrefix); -! -! break; -! -! case IANA_ICMPv6_RPL_DAO: -! // this should never happen -! openserial_printCritical(COMPONENT_ICMPv6RPL,ERR_UNEXPECTED_DAO, -! (errorparameter_t)0, -! (errorparameter_t)0); -! break; -! -! default: -! // this should never happen -! openserial_printCritical(COMPONENT_ICMPv6RPL,ERR_MSG_UNKNOWN_TYPE, -! (errorparameter_t)icmpv6code, -! (errorparameter_t)0); -! break; -! -! } -! -! // free message -! openqueue_freePacketBuffer(msg); -! } -! -! //=========================== private ========================================= -! -! //===== DIO-related -! -! /** -! \brief DIO timer callback function. -! -! \note This function is executed in interrupt context, and should only push a -! task. -! */ -! void icmpv6rpl_timer_DIO_cb(void) { -! scheduler_push_task(icmpv6rpl_timer_DIO_task,TASKPRIO_RPL); -! /*thread_create(openwsn_icmpv6rpl_DIO_stack, KERNEL_CONF_STACKSIZE_MAIN, -! PRIORITY_OPENWSN_ICMPV6RPL, CREATE_STACKTEST, -! icmpv6rpl_timer_DIO_task, "icmpv6rpl_timer_DIO_task");*/ -! } -! -! /** -! \brief Handler for DIO timer event. -! -! \note This function is executed in task context, called by the scheduler. -! */ -! void icmpv6rpl_timer_DIO_task(void) { -! -! // update the delayDIO -! icmpv6rpl_vars.delayDIO = (icmpv6rpl_vars.delayDIO+1)%5; -! -! // check whether we need to send DIO -! if (icmpv6rpl_vars.delayDIO==0) { -! -! // send DIO -! sendDIO(); -! -! // pick a new pseudo-random periodDIO -! icmpv6rpl_vars.periodDIO = TIMER_DIO_TIMEOUT+(openrandom_get16b()&0xff); -! -! // arm the DIO timer with this new value -! opentimers_setPeriod( -! icmpv6rpl_vars.timerIdDIO, -! TIME_MS, -! icmpv6rpl_vars.periodDIO -! ); -! } -! } -! -! /** -! \brief Prepare and a send a RPL DIO. -! */ -! void sendDIO(void) { -! OpenQueueEntry_t* msg; -! -! // stop if I'm not sync'ed -! if (ieee154e_isSynch()==FALSE) { -! -! // remove packets genereted by this module (DIO and DAO) from openqueue -! openqueue_removeAllCreatedBy(COMPONENT_ICMPv6RPL); -! -! // I'm not busy sending a DIO/DAO -! icmpv6rpl_vars.busySending = FALSE; -! -! // stop here -! return; -! } -! -! // do not send DIO if I'm in in bridge mode -! if (idmanager_getIsBridge()==TRUE) { -! return; -! } -! -! // do not send DIO if I have the default DAG rank -! if (neighbors_getMyDAGrank()==DEFAULTDAGRANK) { -! return; -! } -! -! // do not send DIO if I'm already busy sending -! if (icmpv6rpl_vars.busySending==TRUE) { -! return; -! } -! -! // if you get here, all good to send a DIO -! -! // I'm now busy sending -! icmpv6rpl_vars.busySending = TRUE; -! -! // reserve a free packet buffer for DIO -! msg = openqueue_getFreePacketBuffer(COMPONENT_ICMPv6RPL); -! if (msg==NULL) { -! openserial_printError(COMPONENT_ICMPv6RPL,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! icmpv6rpl_vars.busySending = FALSE; -! -! return; -! } -! -! // take ownership -! msg->creator = COMPONENT_ICMPv6RPL; -! msg->owner = COMPONENT_ICMPv6RPL; -! -! // set transport information -! msg->l4_protocol = IANA_ICMPv6; -! msg->l4_sourcePortORicmpv6Type = IANA_ICMPv6_RPL; -! -! // set DIO destination -! memcpy(&(msg->l3_destinationAdd),&icmpv6rpl_vars.dioDestination,sizeof(open_addr_t)); -! -! //===== DIO payload -! // note: DIO is already mostly populated -! icmpv6rpl_vars.dio.rank = neighbors_getMyDAGrank(); -! packetfunctions_reserveHeaderSize(msg,sizeof(icmpv6rpl_dio_ht)); -! memcpy( -! ((icmpv6rpl_dio_ht*)(msg->payload)), -! &(icmpv6rpl_vars.dio), -! sizeof(icmpv6rpl_dio_ht) -! ); -! -! //===== ICMPv6 header -! packetfunctions_reserveHeaderSize(msg,sizeof(ICMPv6_ht)); -! ((ICMPv6_ht*)(msg->payload))->type = msg->l4_sourcePortORicmpv6Type; -! ((ICMPv6_ht*)(msg->payload))->code = IANA_ICMPv6_RPL_DIO; -! packetfunctions_calculateChecksum(msg,(uint8_t*)&(((ICMPv6_ht*)(msg->payload))->checksum));//call last -! -! //send -! if (icmpv6_send(msg)!=E_SUCCESS) { -! icmpv6rpl_vars.busySending = FALSE; -! openqueue_freePacketBuffer(msg); -! } else { -! icmpv6rpl_vars.busySending = FALSE; -! } -! } -! -! //===== DAO-related -! -! /** -! \brief DAO timer callback function. -! -! \note This function is executed in interrupt context, and should only push a -! task. -! */ -! void icmpv6rpl_timer_DAO_cb(void) { -! scheduler_push_task(icmpv6rpl_timer_DAO_task,TASKPRIO_RPL); -! /*thread_create(openwsn_icmpv6rpl_DAO_stack, KERNEL_CONF_STACKSIZE_MAIN, -! PRIORITY_OPENWSN_ICMPV6RPL, CREATE_STACKTEST, -! icmpv6rpl_timer_DAO_task, "icmpv6rpl_timer_DAO_task");*/ -! } -! -! /** -! \brief Handler for DAO timer event. -! -! \note This function is executed in task context, called by the scheduler. -! */ -! void icmpv6rpl_timer_DAO_task(void) { -! -! // update the delayDAO -! icmpv6rpl_vars.delayDAO = (icmpv6rpl_vars.delayDAO+1)%5; -! -! // check whether we need to send DAO -! if (icmpv6rpl_vars.delayDAO==0) { -! -! // send DAO -! sendDAO(); -! -! // pick a new pseudo-random periodDAO -! icmpv6rpl_vars.periodDAO = TIMER_DAO_TIMEOUT+(openrandom_get16b()&0xff); -! -! // arm the DAO timer with this new value -! opentimers_setPeriod( -! icmpv6rpl_vars.timerIdDAO, -! TIME_MS, -! icmpv6rpl_vars.periodDAO -! ); -! } -! } -! -! /** -! \brief Prepare and a send a RPL DAO. -! */ -! void sendDAO(void) { -! OpenQueueEntry_t* msg; // pointer to DAO messages -! uint8_t nbrIdx; // running neighbor index -! uint8_t numTransitParents,numTargetParents; // the number of parents indicated in transit option -! open_addr_t address; -! open_addr_t* prefix; -! -! if (ieee154e_isSynch()==FALSE) { -! // I'm not sync'ed -! -! // delete packets genereted by this module (DIO and DAO) from openqueue -! openqueue_removeAllCreatedBy(COMPONENT_ICMPv6RPL); -! -! // I'm not busy sending a DIO/DAO -! icmpv6rpl_vars.busySending = FALSE; -! -! // stop here -! return; -! } -! -! // dont' send a DAO if you're in bridge mode -! if (idmanager_getIsBridge()==TRUE) { -! return; -! } -! -! // dont' send a DAO if you did not acquire a DAGrank -! if (neighbors_getMyDAGrank()==DEFAULTDAGRANK) { -! return; -! } -! -! // dont' send a DAO if you're still busy sending the previous one -! if (icmpv6rpl_vars.busySending==TRUE) { -! return; -! } -! -! // if you get here, you start construct DAO -! -! // reserve a free packet buffer for DAO -! msg = openqueue_getFreePacketBuffer(COMPONENT_ICMPv6RPL); -! if (msg==NULL) { -! openserial_printError(COMPONENT_ICMPv6RPL,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return; -! } -! -! // take ownership -! msg->creator = COMPONENT_ICMPv6RPL; -! msg->owner = COMPONENT_ICMPv6RPL; -! -! // set transport information -! msg->l4_protocol = IANA_ICMPv6; -! msg->l4_sourcePortORicmpv6Type = IANA_ICMPv6_RPL; -! -! // set DAO destination -! msg->l3_destinationAdd.type=ADDR_128B; -! memcpy(msg->l3_destinationAdd.addr_128b,icmpv6rpl_vars.dio.DODAGID,sizeof(icmpv6rpl_vars.dio.DODAGID)); -! -! //===== fill in packet -! -! //NOTE: limit to preferrred parent only the number of DAO transit addresses to send -! -! //=== transit option -- from RFC 6550, page 55 - 1 transit information header per parent is required. -! //getting only preferred parent as transit -! numTransitParents=0; -! neighbors_getPreferredParentEui64(&address); -! packetfunctions_writeAddress(msg,&address,OW_BIG_ENDIAN); -! prefix=idmanager_getMyID(ADDR_PREFIX); -! packetfunctions_writeAddress(msg,prefix,OW_BIG_ENDIAN); -! // update transit info fields -! // from rfc6550 p.55 -- Variable, depending on whether or not the DODAG ParentAddress subfield is present. -! // poipoi xv: it is not very clear if this includes all fields in the header. or as target info 2 bytes are removed. -! // using the same pattern as in target information. -! icmpv6rpl_vars.dao_transit.optionLength = LENGTH_ADDR128b + sizeof(icmpv6rpl_dao_transit_ht)-2; -! icmpv6rpl_vars.dao_transit.PathControl=0; //todo. this is to set the preference of this parent. -! icmpv6rpl_vars.dao_transit.type=OPTION_TRANSIT_INFORMATION_TYPE; -! -! // write transit info in packet -! packetfunctions_reserveHeaderSize(msg,sizeof(icmpv6rpl_dao_transit_ht)); -! memcpy( -! ((icmpv6rpl_dao_transit_ht*)(msg->payload)), -! &(icmpv6rpl_vars.dao_transit), -! sizeof(icmpv6rpl_dao_transit_ht) -! ); -! numTransitParents++; -! -! //target information is required. RFC 6550 page 55. -! /* -! One or more Transit Information options MUST be preceded by one or -! more RPL Target options. -! */ -! numTargetParents = 0; -! for (nbrIdx=0;nbrIdx<MAXNUMNEIGHBORS;nbrIdx++) { -! if ((neighbors_isNeighborWithHigherDAGrank(nbrIdx))==TRUE) { -! // this neighbor is of higher DAGrank as I am. so it is my child -! -! // write it's address in DAO RFC6550 page 80 check point 1. -! neighbors_getNeighbor(&address,ADDR_64B,nbrIdx); -! packetfunctions_writeAddress(msg,&address,OW_BIG_ENDIAN); -! prefix=idmanager_getMyID(ADDR_PREFIX); -! packetfunctions_writeAddress(msg,prefix,OW_BIG_ENDIAN); -! -! // update target info fields -! // from rfc6550 p.55 -- Variable, length of the option in octets excluding the Type and Length fields. -! // poipoi xv: assuming that type and length fields refer to the 2 first bytes of the header -! icmpv6rpl_vars.dao_target.optionLength = LENGTH_ADDR128b +sizeof(icmpv6rpl_dao_target_ht) - 2; //no header type and length -! icmpv6rpl_vars.dao_target.type = OPTION_TARGET_INFORMATION_TYPE; -! icmpv6rpl_vars.dao_target.flags = 0; //must be 0 -! icmpv6rpl_vars.dao_target.prefixLength = 128; //128 leading bits -- full address. -! -! // write transit info in packet -! packetfunctions_reserveHeaderSize(msg,sizeof(icmpv6rpl_dao_target_ht)); -! memcpy( -! ((icmpv6rpl_dao_target_ht*)(msg->payload)), -! &(icmpv6rpl_vars.dao_target), -! sizeof(icmpv6rpl_dao_target_ht) -! ); -! -! // remember I found it -! numTargetParents++; -! } -! //limit to MAX_TARGET_PARENTS the number of DAO target addresses to send -! //section 8.2.1 pag 67 RFC6550 -- using a subset -! // poipoi TODO base selection on ETX rather than first X. -! if (numTargetParents>=MAX_TARGET_PARENTS) break; -! } -! -! -! // stop here if no parents found -! if (numTransitParents==0) { -! openqueue_freePacketBuffer(msg); -! return; -! } -! -! icmpv6rpl_vars.dao_transit.PathSequence++; //increment path sequence. -! // if you get here, you will send a DAO -! -! -! //=== DAO header -! packetfunctions_reserveHeaderSize(msg,sizeof(icmpv6rpl_dao_ht)); -! memcpy( -! ((icmpv6rpl_dao_ht*)(msg->payload)), -! &(icmpv6rpl_vars.dao), -! sizeof(icmpv6rpl_dao_ht) -! ); -! -! //=== ICMPv6 header -! packetfunctions_reserveHeaderSize(msg,sizeof(ICMPv6_ht)); -! ((ICMPv6_ht*)(msg->payload))->type = msg->l4_sourcePortORicmpv6Type; -! ((ICMPv6_ht*)(msg->payload))->code = IANA_ICMPv6_RPL_DAO; -! packetfunctions_calculateChecksum(msg,(uint8_t*)&(((ICMPv6_ht*)(msg->payload))->checksum)); //call last -! -! //===== send -! if (icmpv6_send(msg)==E_SUCCESS) { -! icmpv6rpl_vars.busySending = TRUE; -! } else { -! openqueue_freePacketBuffer(msg); -! } -! } -diff -crB openwsn/03b-IPv6/icmpv6rpl.h ../../../sys/net/openwsn/03b-IPv6/icmpv6rpl.h -*** openwsn/03b-IPv6/icmpv6rpl.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/03b-IPv6/icmpv6rpl.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,140 **** -! #ifndef __ICMPv6RPL_H -! #define __ICMPv6RPL_H -! -! /** -! \addtogroup IPv6 -! \{ -! \addtogroup ICMPv6RPL -! \{ -! */ -! -! //=========================== define ========================================== -! -! #define TIMER_DIO_TIMEOUT 1700 -! #define TIMER_DAO_TIMEOUT 10000 -! -! #define MOP_DIO_A 1<<5 -! #define MOP_DIO_B 1<<4 -! #define MOP_DIO_C 1<<3 -! #define PRF_DIO_A 0<<2 -! #define PRF_DIO_B 0<<1 -! #define PRF_DIO_C 0<<0 -! #define G_DIO 1<<7 -! -! #define FLAG_DAO_A 0<<0 -! #define FLAG_DAO_B 0<<1 -! #define FLAG_DAO_C 0<<2 -! #define FLAG_DAO_D 0<<3 -! #define FLAG_DAO_E 0<<4 -! #define FLAG_DAO_F 0<<5 -! #define D_DAO 1<<6 -! #define K_DAO 0<<7 -! -! #define E_DAO_Transit_Info 0<<7 -! -! #define PC1_A_DAO_Transit_Info 0<<7 -! #define PC1_B_DAO_Transit_Info 1<<6 -! -! #define PC2_A_DAO_Transit_Info 0<<5 -! #define PC2_B_DAO_Transit_Info 0<<4 -! -! #define PC3_A_DAO_Transit_Info 0<<3 -! #define PC3_B_DAO_Transit_Info 0<<2 -! -! #define PC4_A_DAO_Transit_Info 0<<1 -! #define PC4_B_DAO_Transit_Info 0<<0 -! -! #define Prf_A_dio_options 0<<4 -! #define Prf_B_dio_options 0<<3 -! -! enum{ -! OPTION_ROUTE_INFORMATION_TYPE = 0x03, -! OPTION_DODAG_CONFIGURATION_TYPE = 0x04, -! OPTION_TARGET_INFORMATION_TYPE = 0x05, -! OPTION_TRANSIT_INFORMATION_TYPE = 0x06, -! }; -! -! //=========================== static ========================================== -! -! /** -! \brief Well-known IPv6 multicast address for "all routers". -! */ -! static const uint8_t all_routers_multicast[] = { -! 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ -! 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -! }; -! -! //=========================== typedef ========================================= -! -! //===== DIO -! -! /** -! \brief Header format of a RPL DIO packet. -! */ -! PRAGMA(pack(1)); -! typedef struct { -! uint8_t rplinstanceId; ///< set by the DODAG root. -! uint8_t verNumb; -! dagrank_t rank; -! uint8_t rplOptions; -! uint8_t DTSN; -! uint8_t flags; -! uint8_t reserved; -! uint8_t DODAGID[16]; -! } icmpv6rpl_dio_ht; -! PRAGMA(pack()); -! -! //===== DAO -! -! /** -! \brief Header format of a RPL DAO packet. -! */ -! PRAGMA(pack(1)); -! typedef struct { -! uint8_t rplinstanceId; ///< set by the DODAG root. -! uint8_t K_D_flags; -! uint8_t reserved; -! uint8_t DAOSequance; -! uint8_t DODAGID[16]; -! } icmpv6rpl_dao_ht; -! PRAGMA(pack()); -! -! /** -! \brief Header format of a RPL DAO "Transit Information" option. -! */ -! PRAGMA(pack(1)); -! typedef struct { -! uint8_t type; ///< set by the DODAG root. -! uint8_t optionLength; -! uint8_t E_flags; -! uint8_t PathControl; -! uint8_t PathSequence; -! uint8_t PathLifetime; -! } icmpv6rpl_dao_transit_ht; -! PRAGMA(pack()); -! -! /** -! \brief Header format of a RPL DAO "Target" option. -! */ -! PRAGMA(pack(1)); -! typedef struct { -! uint8_t type; ///< set by the DODAG root. -! uint8_t optionLength; -! uint8_t flags; -! uint8_t prefixLength; -! } icmpv6rpl_dao_target_ht; -! PRAGMA(pack()); -! -! -! //=========================== prototypes ====================================== -! -! void icmpv6rpl_init(); -! void icmpv6rpl_sendDone(OpenQueueEntry_t* msg, error_t error); -! void icmpv6rpl_receive(OpenQueueEntry_t* msg); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,167 ---- -! #ifndef __ICMPv6RPL_H -! #define __ICMPv6RPL_H -! -! /** -! \addtogroup IPv6 -! \{ -! \addtogroup ICMPv6RPL -! \{ -! */ -! -! #include "opentimers.h" -! -! //=========================== define ========================================== -! -! #define TIMER_DIO_TIMEOUT 1700 -! #define TIMER_DAO_TIMEOUT 10000 -! -! #define MOP_DIO_A 1<<5 -! #define MOP_DIO_B 1<<4 -! #define MOP_DIO_C 1<<3 -! #define PRF_DIO_A 0<<2 -! #define PRF_DIO_B 0<<1 -! #define PRF_DIO_C 0<<0 -! #define G_DIO 1<<7 -! -! #define FLAG_DAO_A 0<<0 -! #define FLAG_DAO_B 0<<1 -! #define FLAG_DAO_C 0<<2 -! #define FLAG_DAO_D 0<<3 -! #define FLAG_DAO_E 0<<4 -! #define FLAG_DAO_F 0<<5 -! #define D_DAO 1<<6 -! #define K_DAO 0<<7 -! -! #define E_DAO_Transit_Info 0<<7 -! -! #define PC1_A_DAO_Transit_Info 0<<7 -! #define PC1_B_DAO_Transit_Info 1<<6 -! -! #define PC2_A_DAO_Transit_Info 0<<5 -! #define PC2_B_DAO_Transit_Info 0<<4 -! -! #define PC3_A_DAO_Transit_Info 0<<3 -! #define PC3_B_DAO_Transit_Info 0<<2 -! -! #define PC4_A_DAO_Transit_Info 0<<1 -! #define PC4_B_DAO_Transit_Info 0<<0 -! -! #define Prf_A_dio_options 0<<4 -! #define Prf_B_dio_options 0<<3 -! -! // max number of parents and children to send in DAO -! //section 8.2.1 pag 67 RFC6550 -- using a subset -! #define MAX_TARGET_PARENTS 0x01 -! -! enum{ -! OPTION_ROUTE_INFORMATION_TYPE = 0x03, -! OPTION_DODAG_CONFIGURATION_TYPE = 0x04, -! OPTION_TARGET_INFORMATION_TYPE = 0x05, -! OPTION_TRANSIT_INFORMATION_TYPE = 0x06, -! }; -! -! //=========================== static ========================================== -! -! /** -! \brief Well-known IPv6 multicast address for "all routers". -! */ -! static const uint8_t all_routers_multicast[] = { -! 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ -! 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 -! }; -! -! //=========================== typedef ========================================= -! -! //===== DIO -! -! /** -! \brief Header format of a RPL DIO packet. -! */ -! //PRAGMA(pack(1)); -! typedef struct { -! uint8_t rplinstanceId; ///< set by the DODAG root. -! uint8_t verNumb; -! dagrank_t rank; -! uint8_t rplOptions; -! uint8_t DTSN; -! uint8_t flags; -! uint8_t reserved; -! uint8_t DODAGID[16]; -! } icmpv6rpl_dio_ht; -! //PRAGMA(pack()); -! -! //===== DAO -! -! /** -! \brief Header format of a RPL DAO packet. -! */ -! //PRAGMA(pack(1)); -! typedef struct { -! uint8_t rplinstanceId; ///< set by the DODAG root. -! uint8_t K_D_flags; -! uint8_t reserved; -! uint8_t DAOSequence; -! uint8_t DODAGID[16]; -! } icmpv6rpl_dao_ht; -! //PRAGMA(pack()); -! -! /** -! \brief Header format of a RPL DAO "Transit Information" option. -! */ -! //PRAGMA(pack(1)); -! typedef struct { -! uint8_t type; ///< set by the DODAG root. -! uint8_t optionLength; -! uint8_t E_flags; -! uint8_t PathControl; -! uint8_t PathSequence; -! uint8_t PathLifetime; -! } icmpv6rpl_dao_transit_ht; -! //PRAGMA(pack()); -! -! /** -! \brief Header format of a RPL DAO "Target" option. -! */ -! //PRAGMA(pack(1)); -! typedef struct { -! uint8_t type; ///< set by the DODAG root. -! uint8_t optionLength; -! uint8_t flags; -! uint8_t prefixLength; -! } icmpv6rpl_dao_target_ht; -! //PRAGMA(pack()); -! -! //=========================== module variables ================================ -! -! typedef struct { -! // admin -! bool busySending; ///< currently sending DIO/DAO. -! uint8_t DODAGIDFlagSet; ///< is DODAGID set already? -! // DIO-related -! icmpv6rpl_dio_ht dio; ///< pre-populated DIO packet. -! open_addr_t dioDestination; ///< IPv6 destination address for DIOs. -! uint16_t periodDIO; ///< duration, in ms, of a timerIdDIO timeout. -! opentimer_id_t timerIdDIO; ///< ID of the timer used to send DIOs. -! uint8_t delayDIO; ///< number of timerIdDIO events before actually sending a DIO. -! // DAO-related -! icmpv6rpl_dao_ht dao; ///< pre-populated DAO packet. -! icmpv6rpl_dao_transit_ht dao_transit; ///< pre-populated DAO "Transit Info" option header. -! icmpv6rpl_dao_target_ht dao_target; ///< pre-populated DAO "Transit Info" option header. -! opentimer_id_t timerIdDAO; ///< ID of the timer used to send DAOs. -! uint16_t periodDAO; ///< duration, in ms, of a timerIdDAO timeout. -! uint8_t delayDAO; ///< number of timerIdDIO events before actually sending a DAO. -! } icmpv6rpl_vars_t; -! -! //=========================== prototypes ====================================== -! -! void icmpv6rpl_init(void); -! void icmpv6rpl_sendDone(OpenQueueEntry_t* msg, owerror_t error); -! void icmpv6rpl_receive(OpenQueueEntry_t* msg); -! uint8_t icmpv6rpl_getRPLIntanceID(void); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/04-TRAN/Makefile ../../../sys/net/openwsn/04-TRAN/Makefile -*** openwsn/04-TRAN/Makefile Wed Jan 15 13:55:34 2014 ---- ../../../sys/net/openwsn/04-TRAN/Makefile Wed Jan 15 13:48:27 2014 -*************** -*** 0 **** ---- 1,42 ---- -+ SUBMOD:=$(shell basename $(CURDIR)).a -+ #BINDIR = $(RIOTBASE)/bin/ -+ SRC = $(wildcard *.c) -+ OBJ = $(SRC:%.c=$(BINDIR)%.o) -+ DEP = $(SRC:%.c=$(BINDIR)%.d) -+ -+ INCLUDES += -I$(RIOTBASE) -I$(RIOTBASE)/sys/include -I$(RIOTBASE)/core/include -I$(RIOTBASE)/drivers/include -I$(RIOTBASE)/drivers/cc110x_ng/include -I$(RIOTBASE)/cpu/arm_common/include -I$(RIOTBASE)/sys/net/include/ -+ INCLUDES += -I$(CURDIR)/02a-MAClow -+ INCLUDES += -I$(CURDIR)/02b-MAChigh -+ INCLUDES += -I$(CURDIR)/03a-IPHC -+ INCLUDES += -I$(CURDIR)/03b-IPv6 -+ INCLUDES += -I$(CURDIR)/04-TRAN -+ INCLUDES += -I$(CURDIR)/07-App/ohlone -+ INCLUDES += -I$(CURDIR)/07-App/tcpecho -+ INCLUDES += -I$(CURDIR)/07-App/tcpinject -+ INCLUDES += -I$(CURDIR)/07-App/tcpprint -+ INCLUDES += -I$(CURDIR)/07-App/udpecho -+ INCLUDES += -I$(CURDIR)/07-App/udpinject -+ INCLUDES += -I$(CURDIR)/07-App/udplatency -+ INCLUDES += -I$(CURDIR)/07-App/udpprint -+ INCLUDES += -I$(CURDIR)/07-App/udprand -+ INCLUDES += -I$(CURDIR)/07-App/udpstorm -+ INCLUDES += -I$(CURDIR)/cross-layers -+ -+ .PHONY: $(BINDIR)$(SUBMOD) -+ -+ $(BINDIR)$(SUBMOD): $(OBJ) -+ $(AD)$(AR) rcs $(BINDIR)$(MODULE) $(OBJ) -+ -+ # pull in dependency info for *existing* .o files -+ -include $(OBJ:.o=.d) -+ -+ # compile and generate dependency info -+ $(BINDIR)%.o: %.c -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d -+ @printf "$(BINDIR)" | cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d -+ -+ # remove compilation products -+ -+ clean: -+ rm -f $(OBJ) $(DEP) -diff -crB openwsn/04-TRAN/opencoap.c ../../../sys/net/openwsn/04-TRAN/opencoap.c -*** openwsn/04-TRAN/opencoap.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/04-TRAN/opencoap.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,335 **** -! #include "openwsn.h" -! #include "opencoap.h" -! #include "openudp.h" -! #include "openqueue.h" -! #include "openserial.h" -! #include "openrandom.h" -! #include "packetfunctions.h" -! #include "idmanager.h" -! #include "opentimers.h" -! #include "scheduler.h" -! -! //=========================== variables ======================================= -! -! // general variable to the CoAP core -! typedef struct { -! coap_resource_desc_t* resources; -! bool busySending; -! uint8_t delayCounter; -! uint16_t messageID; -! opentimer_id_t timerId; -! } opencoap_vars_t; -! -! opencoap_vars_t opencoap_vars; -! -! //=========================== prototype ======================================= -! -! void icmpv6coap_timer_cb(); -! -! //=========================== public ========================================== -! -! //===== from stack -! -! void opencoap_init() { -! // initialize the resource linked list -! opencoap_vars.resources = NULL; -! -! // initialize the messageID -! opencoap_vars.messageID = openrandom_get16b(); -! -! // start the timer -! if (idmanager_getIsDAGroot()==FALSE) { -! opencoap_vars.timerId = opentimers_start(1000, -! TIMER_PERIODIC,TIME_MS, -! icmpv6coap_timer_cb); -! } -! } -! -! void opencoap_receive(OpenQueueEntry_t* msg) { -! uint16_t temp_l4_destination_port; -! uint8_t i; -! uint8_t index; -! coap_option_t last_option; -! coap_resource_desc_t* temp_desc; -! bool found; -! error_t outcome; -! // local variables passed to the handlers (with msg) -! coap_header_iht coap_header; -! coap_option_iht coap_options[MAX_COAP_OPTIONS]; -! -! // take ownership over the received packet -! msg->owner = COMPONENT_OPENCOAP; -! -! //=== step 1. parse the packet -! -! // parse the CoAP header and remove from packet -! index = 0; -! coap_header.Ver = (msg->payload[index] & 0xc0) >> 6; -! coap_header.T = (coap_type_t)((msg->payload[index] & 0x30) >> 4); -! coap_header.OC = (msg->payload[index] & 0x0f); -! index++; -! coap_header.Code = (coap_code_t)(msg->payload[index]); -! index++; -! coap_header.messageID = msg->payload[index]*256+msg->payload[index+1]; -! index+=2; -! // reject unsupported header -! if ( -! coap_header.Ver!=COAP_VERSION || -! coap_header.OC>MAX_COAP_OPTIONS -! ) { -! openserial_printError(COMPONENT_OPENCOAP,ERR_6LOWPAN_UNSUPPORTED, -! (errorparameter_t)0, -! (errorparameter_t)coap_header.Ver); -! openqueue_freePacketBuffer(msg); -! return; -! } -! // initialize the coap_options -! for (i=0;i<MAX_COAP_OPTIONS;i++) { -! coap_options[i].type = COAP_OPTION_NONE; -! } -! // fill in the coap_options -! last_option = COAP_OPTION_NONE; -! for (i=0;i<coap_header.OC;i++) { -! coap_options[i].type = (coap_option_t)((uint8_t)last_option+(uint8_t)((msg->payload[index] & 0xf0) >> 4)); -! last_option = coap_options[i].type; -! coap_options[i].length = (msg->payload[index] & 0x0f); -! index++; -! coap_options[i].pValue = &(msg->payload[index]); -! index += coap_options[i].length; -! } -! // remove the CoAP header+options -! packetfunctions_tossHeader(msg,index); -! -! //=== step 2. find the resource to handle the packet -! -! // find the resource this applies to -! found = FALSE; -! if (coap_header.Code>=COAP_CODE_REQ_GET && -! coap_header.Code<=COAP_CODE_REQ_DELETE) { -! // this is a request: target resource is indicated as COAP_OPTION_LOCATIONPATH option(s) -! -! // find the resource which matches -! temp_desc = opencoap_vars.resources; -! while (found==FALSE) { -! if ( -! coap_options[0].type==COAP_OPTION_URIPATH && -! coap_options[1].type==COAP_OPTION_URIPATH && -! temp_desc->path0len>0 && -! temp_desc->path0val!=NULL && -! temp_desc->path1len>0 && -! temp_desc->path1val!=NULL -! ) { -! // resource has a path of form path0/path1 -! -! if ( -! coap_options[0].length==temp_desc->path0len && -! memcmp(coap_options[0].pValue,temp_desc->path0val,temp_desc->path0len)==0 && -! coap_options[1].length==temp_desc->path1len && -! memcmp(coap_options[1].pValue,temp_desc->path1val,temp_desc->path1len)==0 -! ) { -! found = TRUE; -! }; -! } else if ( -! coap_options[0].type==COAP_OPTION_URIPATH && -! temp_desc->path0len>0 && -! temp_desc->path0val!=NULL -! ) { -! // resource has a path of form path0 -! -! if ( -! coap_options[0].length==temp_desc->path0len && -! memcmp(coap_options[0].pValue,temp_desc->path0val,temp_desc->path0len)==0 -! ) { -! found = TRUE; -! }; -! }; -! // iterate to next resource -! if (found==FALSE) { -! if (temp_desc->next!=NULL) { -! temp_desc = temp_desc->next; -! } else { -! break; -! } -! } -! }; -! } else { -! // this is a response: target resource is indicated by message ID -! -! // find the resource which matches -! temp_desc = opencoap_vars.resources; -! while (found==FALSE) { -! if (coap_header.messageID==temp_desc->messageID) { -! found=TRUE; -! if (temp_desc->callbackRx!=NULL) { -! temp_desc->callbackRx(msg,&coap_header,&coap_options[0]); -! } -! } -! // iterate to next resource -! if (found==FALSE) { -! if (temp_desc->next!=NULL) { -! temp_desc = temp_desc->next; -! } else { -! break; -! } -! } -! }; -! openqueue_freePacketBuffer(msg); -! // stop here: will will not respond to a response -! return; -! } -! -! //=== step 3. ask the resource to prepare response -! -! if (found==TRUE) { -! outcome = temp_desc->callbackRx(msg,&coap_header,&coap_options[0]); -! } else { -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! // set the CoAP header -! coap_header.OC = 0; -! coap_header.Code = COAP_CODE_RESP_NOTFOUND; -! } -! -! if (outcome==E_FAIL) { -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! // set the CoAP header -! coap_header.OC = 0; -! coap_header.Code = COAP_CODE_RESP_METHODNOTALLOWED; -! } -! -! //=== step 4. send that packet back -! -! // fill in packet metadata -! if (found==TRUE) { -! msg->creator = temp_desc->componentID; -! } else { -! msg->creator = COMPONENT_OPENCOAP; -! } -! msg->l4_protocol = IANA_UDP; -! temp_l4_destination_port = msg->l4_destination_port; -! msg->l4_destination_port = msg->l4_sourcePortORicmpv6Type; -! msg->l4_sourcePortORicmpv6Type = temp_l4_destination_port; -! -! // fill in CoAP header -! packetfunctions_reserveHeaderSize(msg,4); -! msg->payload[0] = (COAP_VERSION << 6) | -! (COAP_TYPE_ACK << 4) | -! (coap_header.OC << 0); -! msg->payload[1] = coap_header.Code; -! msg->payload[2] = coap_header.messageID/256; -! msg->payload[3] = coap_header.messageID%256; -! -! if ((openudp_send(msg))==E_FAIL) { -! openqueue_freePacketBuffer(msg); -! } -! } -! -! void opencoap_sendDone(OpenQueueEntry_t* msg, error_t error) { -! coap_resource_desc_t* temp_resource; -! -! // take ownership over that packet -! msg->owner = COMPONENT_OPENCOAP; -! -! // indicate sendDone to creator of that packet -! //=== mine -! if (msg->creator==COMPONENT_OPENCOAP) { -! openqueue_freePacketBuffer(msg); -! return; -! } -! //=== someone else's -! temp_resource = opencoap_vars.resources; -! while (temp_resource!=NULL) { -! if (temp_resource->componentID==msg->creator && -! temp_resource->callbackSendDone!=NULL) { -! temp_resource->callbackSendDone(msg,error); -! return; -! } -! temp_resource = temp_resource->next; -! } -! -! openserial_printError(COMPONENT_OPENCOAP,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! } -! -! void timers_coap_fired() { -! //do something here if necessary -! } -! -! //===== from CoAP resources -! -! void opencoap_writeLinks(OpenQueueEntry_t* msg) { -! coap_resource_desc_t* temp_resource; -! -! temp_resource = opencoap_vars.resources; -! while (temp_resource!=NULL) { -! packetfunctions_reserveHeaderSize(msg,1); -! msg->payload[0] = '>'; -! if (temp_resource->path1len>0) { -! packetfunctions_reserveHeaderSize(msg,temp_resource->path1len); -! memcpy(&msg->payload[0],temp_resource->path1val,temp_resource->path1len); -! packetfunctions_reserveHeaderSize(msg,1); -! msg->payload[0] = '/'; -! } -! packetfunctions_reserveHeaderSize(msg,temp_resource->path0len); -! memcpy(msg->payload,temp_resource->path0val,temp_resource->path0len); -! packetfunctions_reserveHeaderSize(msg,2); -! msg->payload[1] = '/'; -! msg->payload[0] = '<'; -! if (temp_resource->next!=NULL) { -! packetfunctions_reserveHeaderSize(msg,1); -! msg->payload[0] = ','; -! } -! temp_resource = temp_resource->next; -! } -! } -! -! void opencoap_register(coap_resource_desc_t* desc) { -! coap_resource_desc_t* last_elem; -! -! if (opencoap_vars.resources==NULL) { -! opencoap_vars.resources = desc; -! return; -! } -! -! // add to the end of the resource linked list -! last_elem = opencoap_vars.resources; -! while (last_elem->next!=NULL) { -! last_elem = last_elem->next; -! } -! last_elem->next = desc; -! } -! -! error_t opencoap_send(OpenQueueEntry_t* msg, -! coap_type_t type, -! coap_code_t code, -! uint8_t numOptions, -! coap_resource_desc_t* descSender) { -! // change the global messageID -! opencoap_vars.messageID = openrandom_get16b(); -! // take ownership -! msg->owner = COMPONENT_OPENCOAP; -! // metadata -! msg->l4_sourcePortORicmpv6Type = WKP_UDP_COAP; -! // fill in CoAP header -! packetfunctions_reserveHeaderSize(msg,4); -! msg->payload[0] = (COAP_VERSION << 6) | -! (type << 4) | -! (numOptions << 0); -! msg->payload[1] = code; -! msg->payload[2] = (opencoap_vars.messageID>>8) & 0xff; -! msg->payload[3] = (opencoap_vars.messageID>>0) & 0xff; -! // record the messageID with this sender -! descSender->messageID = opencoap_vars.messageID; -! return openudp_send(msg); -! } -! -! //=========================== private ========================================= -! -! void icmpv6coap_timer_cb() { -! scheduler_push_task(timers_coap_fired,TASKPRIO_COAP); - } -\ No newline at end of file ---- 1,364 ---- -! #include "openwsn.h" -! #include "opencoap.h" -! #include "openudp.h" -! #include "openqueue.h" -! #include "openserial.h" -! #include "openrandom.h" -! #include "packetfunctions.h" -! #include "idmanager.h" -! #include "opentimers.h" -! #include "scheduler.h" -! -! #include "thread.h" -! -! //=========================== variables ======================================= -! -! opencoap_vars_t opencoap_vars; -! //static char openwsn_coap_stack[KERNEL_CONF_STACKSIZE_MAIN]; -! -! //=========================== prototype ======================================= -! -! void icmpv6coap_timer_cb(void); -! -! //=========================== public ========================================== -! -! //===== from stack -! -! void opencoap_init(void) { -! // initialize the resource linked list -! opencoap_vars.resources = NULL; -! -! // initialize the messageID -! opencoap_vars.messageID = openrandom_get16b(); -! -! // start the timer -! if (idmanager_getIsDAGroot()==FALSE) { -! opencoap_vars.timerId = opentimers_start(1000, -! TIMER_PERIODIC,TIME_MS, -! icmpv6coap_timer_cb); -! } -! } -! -! void opencoap_receive(OpenQueueEntry_t* msg) { -! uint16_t temp_l4_destination_port; -! uint8_t i; -! uint8_t index; -! coap_option_t last_option; -! coap_resource_desc_t* temp_desc; -! bool found; -! owerror_t outcome = 0; -! // local variables passed to the handlers (with msg) -! coap_header_iht coap_header; -! coap_option_iht coap_options[MAX_COAP_OPTIONS]; -! -! // take ownership over the received packet -! msg->owner = COMPONENT_OPENCOAP; -! -! //=== step 1. parse the packet -! -! // parse the CoAP header and remove from packet -! index = 0; -! coap_header.Ver = (msg->payload[index] & 0xc0) >> 6; -! coap_header.T = (coap_type_t)((msg->payload[index] & 0x30) >> 4); -! coap_header.TKL = (msg->payload[index] & 0x0f); -! index++; -! coap_header.Code = (coap_code_t)(msg->payload[index]); -! index++; -! coap_header.messageID = msg->payload[index]*256+msg->payload[index+1]; -! index+=2; -! -! //poipoi xv. TKL tells us the length of the token. If we want to support tokens longer -! //than one token needs to be converted to an array and memcopy here for the length of TKL -! coap_header.token = (msg->payload[index]); -! index+=coap_header.TKL; -! -! -! // reject unsupported header -! if (coap_header.Ver!=COAP_VERSION || coap_header.TKL>8) { -! openserial_printError(COMPONENT_OPENCOAP,ERR_WRONG_TRAN_PROTOCOL, -! (errorparameter_t)0, -! (errorparameter_t)coap_header.Ver); -! openqueue_freePacketBuffer(msg); -! return; -! } -! // initialize the coap_options -! for (i=0;i<MAX_COAP_OPTIONS;i++) { -! coap_options[i].type = COAP_OPTION_NONE; -! } -! // fill in the coap_options -! last_option = COAP_OPTION_NONE; -! for (i=0;i<MAX_COAP_OPTIONS;i++) { -! if (msg->payload[index]==0xFF){ -! //found the payload spacer, options are already parsed. -! index++; //skip it and break. -! break; -! } -! coap_options[i].type = (coap_option_t)((uint8_t)last_option+(uint8_t)((msg->payload[index] & 0xf0) >> 4)); -! last_option = coap_options[i].type; -! coap_options[i].length = (msg->payload[index] & 0x0f); -! index++; -! coap_options[i].pValue = &(msg->payload[index]); -! index += coap_options[i].length; //includes length as well -! } -! -! // remove the CoAP header+options -! packetfunctions_tossHeader(msg,index); -! -! //=== step 2. find the resource to handle the packet -! -! // find the resource this applies to -! found = FALSE; -! if (coap_header.Code>=COAP_CODE_REQ_GET && -! coap_header.Code<=COAP_CODE_REQ_DELETE) { -! // this is a request: target resource is indicated as COAP_OPTION_LOCATIONPATH option(s) -! -! // find the resource which matches -! temp_desc = opencoap_vars.resources; -! while (found==FALSE) { -! if ( -! coap_options[0].type==COAP_OPTION_NUM_URIPATH && -! coap_options[1].type==COAP_OPTION_NUM_URIPATH && -! temp_desc->path0len>0 && -! temp_desc->path0val!=NULL && -! temp_desc->path1len>0 && -! temp_desc->path1val!=NULL -! ) { -! // resource has a path of form path0/path1 -! -! if ( -! coap_options[0].length==temp_desc->path0len && -! memcmp(coap_options[0].pValue,temp_desc->path0val,temp_desc->path0len)==0 && -! coap_options[1].length==temp_desc->path1len && -! memcmp(coap_options[1].pValue,temp_desc->path1val,temp_desc->path1len)==0 -! ) { -! found = TRUE; -! }; -! } else if ( -! coap_options[0].type==COAP_OPTION_NUM_URIPATH && -! temp_desc->path0len>0 && -! temp_desc->path0val!=NULL -! ) { -! // resource has a path of form path0 -! -! if ( -! coap_options[0].length==temp_desc->path0len && -! memcmp(coap_options[0].pValue,temp_desc->path0val,temp_desc->path0len)==0 -! ) { -! found = TRUE; -! }; -! }; -! // iterate to next resource -! if (found==FALSE) { -! if (temp_desc->next!=NULL) { -! temp_desc = temp_desc->next; -! } else { -! break; -! } -! } -! }; -! } else { -! // this is a response: target resource is indicated by message ID -! -! // find the resource which matches -! temp_desc = opencoap_vars.resources; -! while (found==FALSE) { -! if (coap_header.messageID==temp_desc->messageID) { -! found=TRUE; -! if (temp_desc->callbackRx!=NULL) { -! temp_desc->callbackRx(msg,&coap_header,&coap_options[0]); -! } -! } -! // iterate to next resource -! if (found==FALSE) { -! if (temp_desc->next!=NULL) { -! temp_desc = temp_desc->next; -! } else { -! break; -! } -! } -! }; -! openqueue_freePacketBuffer(msg); -! // stop here: will will not respond to a response -! return; -! } -! -! //=== step 3. ask the resource to prepare response -! -! if (found==TRUE) { -! outcome = temp_desc->callbackRx(msg,&coap_header,&coap_options[0]); -! } else { -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! // set the CoAP header -! coap_header.TKL = 0; -! coap_header.Code = COAP_CODE_RESP_NOTFOUND; -! } -! -! if (outcome==E_FAIL) { -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! // set the CoAP header -! coap_header.TKL = 0; -! coap_header.Code = COAP_CODE_RESP_METHODNOTALLOWED; -! } -! -! //=== step 4. send that packet back -! -! // fill in packet metadata -! if (found==TRUE) { -! msg->creator = temp_desc->componentID; -! } else { -! msg->creator = COMPONENT_OPENCOAP; -! } -! msg->l4_protocol = IANA_UDP; -! temp_l4_destination_port = msg->l4_destination_port; -! msg->l4_destination_port = msg->l4_sourcePortORicmpv6Type; -! msg->l4_sourcePortORicmpv6Type = temp_l4_destination_port; -! -! //set destination address as the current source. -! msg->l3_destinationAdd.type = ADDR_128B; -! memcpy(&msg->l3_destinationAdd.addr_128b[0],&msg->l3_sourceAdd.addr_128b[0],LENGTH_ADDR128b); -! -! -! // fill in CoAP header -! packetfunctions_reserveHeaderSize(msg,5); -! msg->payload[0] = (COAP_VERSION << 6) | -! (COAP_TYPE_ACK << 4) | -! (coap_header.TKL << 0); -! msg->payload[1] = coap_header.Code; -! msg->payload[2] = coap_header.messageID/256; -! msg->payload[3] = coap_header.messageID%256; -! msg->payload[4] = coap_header.token; //this will be a memcopy for TKL size -! -! if ((openudp_send(msg))==E_FAIL) { -! openqueue_freePacketBuffer(msg); -! } -! } -! -! void opencoap_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! coap_resource_desc_t* temp_resource; -! -! // take ownership over that packet -! msg->owner = COMPONENT_OPENCOAP; -! -! // indicate sendDone to creator of that packet -! //=== mine -! if (msg->creator==COMPONENT_OPENCOAP) { -! openqueue_freePacketBuffer(msg); -! return; -! } -! //=== someone else's -! temp_resource = opencoap_vars.resources; -! while (temp_resource!=NULL) { -! if (temp_resource->componentID==msg->creator && -! temp_resource->callbackSendDone!=NULL) { -! temp_resource->callbackSendDone(msg,error); -! return; -! } -! temp_resource = temp_resource->next; -! } -! -! openserial_printError(COMPONENT_OPENCOAP,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! } -! -! void timers_coap_fired(void) { -! //do something here if necessary -! } -! -! //===== from CoAP resources -! -! void opencoap_writeLinks(OpenQueueEntry_t* msg) { -! coap_resource_desc_t* temp_resource; -! -! temp_resource = opencoap_vars.resources; -! while (temp_resource!=NULL) { -! packetfunctions_reserveHeaderSize(msg,1); -! msg->payload[0] = '>'; -! if (temp_resource->path1len>0) { -! packetfunctions_reserveHeaderSize(msg,temp_resource->path1len); -! memcpy(&msg->payload[0],temp_resource->path1val,temp_resource->path1len); -! packetfunctions_reserveHeaderSize(msg,1); -! msg->payload[0] = '/'; -! } -! packetfunctions_reserveHeaderSize(msg,temp_resource->path0len); -! memcpy(msg->payload,temp_resource->path0val,temp_resource->path0len); -! packetfunctions_reserveHeaderSize(msg,2); -! msg->payload[1] = '/'; -! msg->payload[0] = '<'; -! if (temp_resource->next!=NULL) { -! packetfunctions_reserveHeaderSize(msg,1); -! msg->payload[0] = ','; -! } -! temp_resource = temp_resource->next; -! } -! } -! -! /** -! \brief Register a new CoAP resource. -! -! Registration consists in adding a new resource at the end of the linked list -! of resources. -! */ -! void opencoap_register(coap_resource_desc_t* desc) { -! coap_resource_desc_t* last_elem; -! -! // since this CoAP resource will be at the end of the list, its next element -! // should point to NULL, indicating the end of the linked list. -! desc->next = NULL; -! -! if (opencoap_vars.resources==NULL) { -! opencoap_vars.resources = desc; -! return; -! } -! -! // add to the end of the resource linked list -! last_elem = opencoap_vars.resources; -! while (last_elem->next!=NULL) { -! last_elem = last_elem->next; -! } -! last_elem->next = desc; -! } -! -! owerror_t opencoap_send(OpenQueueEntry_t* msg, -! coap_type_t type, -! coap_code_t code, -! uint8_t TKL, -! coap_resource_desc_t* descSender) { -! // change the global messageID -! opencoap_vars.messageID = openrandom_get16b(); -! // take ownership -! msg->owner = COMPONENT_OPENCOAP; -! // metadata -! msg->l4_sourcePortORicmpv6Type = WKP_UDP_COAP; -! // fill in CoAP header -! packetfunctions_reserveHeaderSize(msg,5); -! msg->payload[0] = (COAP_VERSION << 6) | -! (type << 4) | -! (TKL << 0); -! msg->payload[1] = code; -! msg->payload[2] = (opencoap_vars.messageID>>8) & 0xff; -! msg->payload[3] = (opencoap_vars.messageID>>0) & 0xff; -! //poipoi xv token needs to be defined by the app or here -! #define TOKEN 123 -! msg->payload[4] = TOKEN; //this will be a memcopy for TKL size -! -! // record the messageID with this sender -! descSender->messageID = opencoap_vars.messageID; -! descSender->token = TOKEN; -! -! return openudp_send(msg); -! } -! -! //=========================== private ========================================= -! -! void icmpv6coap_timer_cb(void) { -! scheduler_push_task(timers_coap_fired,TASKPRIO_COAP); -! /*thread_create(openwsn_coap_stack, KERNEL_CONF_STACKSIZE_MAIN, -! PRIORITY_OPENWSN_COAP, CREATE_STACKTEST, -! timers_coap_fired, "timers coap fired");*/ - } -\ No newline at end of file -diff -crB openwsn/04-TRAN/opencoap.h ../../../sys/net/openwsn/04-TRAN/opencoap.h -*** openwsn/04-TRAN/opencoap.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/04-TRAN/opencoap.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,161 **** -! #ifndef __OPENCOAP_H -! #define __OPENCOAP_H -! -! /** -! \addtogroup Transport -! \{ -! \addtogroup openCoap -! \{ -! */ -! -! //=========================== define ========================================== -! -! // IPv6 addresses of servers on the Internet -! static const uint8_t ipAddr_ipsoRD[] = {0x26, 0x07, 0xf7, 0x40, 0x00, 0x00, 0x00, 0x3f, \ -! 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x29}; -! static const uint8_t ipAddr_motesEecs[] = {0x20, 0x01, 0x04, 0x70, 0x00, 0x66, 0x00, 0x19, \ -! 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}; -! //static const uint8_t ipAddr_local[] = {0x20, 0x02, 0x80, 0x20, 0x21, 0x47, 0x00, 0x0c, \ -! 0x10, 0xcb, 0xc6, 0x52, 0x44, 0x17, 0xd4, 0x18}; -! // 2607:f140:400:1036:688e:fa3b:444:6211 -! //static const uint8_t ipAddr_local[] = {0x26, 0x07, 0xf1, 0x40, 0x04, 0x00, 0x10, 0x36, \ -! // 0x68, 0x8e, 0xfa, 0x3b, 0x04, 0x44, 0x62, 0x11}; -! -! static const uint8_t ipAddr_local[] = {0x26, 0x07, 0xf1, 0x40, 0x04, 0x00, 0x10, 0x36, \ -! 0x4d, 0xcd, 0xab, 0x54, 0x81, 0x99, 0xc1, 0xf7}; -! -! static const uint8_t ipAddr_motedata[] = {0x20, 0x01, 0x04, 0x70, 0x00, 0x66, 0x00, 0x17, \ -! 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}; -! -! /// the maximum number of options in a RX'ed CoAP message -! #define MAX_COAP_OPTIONS 3 -! -! #define COAP_VERSION 1 -! -! typedef enum { -! COAP_TYPE_CON = 0, -! COAP_TYPE_NON = 1, -! COAP_TYPE_ACK = 2, -! COAP_TYPE_RES = 3, -! } coap_type_t; -! -! typedef enum { -! COAP_CODE_EMPTY = 0, -! // request -! COAP_CODE_REQ_GET = 1, -! COAP_CODE_REQ_POST = 2, -! COAP_CODE_REQ_PUT = 3, -! COAP_CODE_REQ_DELETE = 4, -! // response -! // - OK -! COAP_CODE_RESP_CREATED = 65, -! COAP_CODE_RESP_DELETED = 66, -! COAP_CODE_RESP_VALID = 67, -! COAP_CODE_RESP_CHANGED = 68, -! COAP_CODE_RESP_CONTENT = 69, -! // - not OK -! COAP_CODE_RESP_BADREQ = 128, -! COAP_CODE_RESP_UNAUTHORIZED = 129, -! COAP_CODE_RESP_BADOPTION = 130, -! COAP_CODE_RESP_FORBIDDEN = 131, -! COAP_CODE_RESP_NOTFOUND = 132, -! COAP_CODE_RESP_METHODNOTALLOWED = 133, -! COAP_CODE_RESP_PRECONDFAILED = 140, -! COAP_CODE_RESP_REQTOOLARGE = 141, -! COAP_CODE_RESP_UNSUPPMEDIATYPE = 143, -! // - error -! COAP_CODE_RESP_SERVERERROR = 160, -! COAP_CODE_RESP_NOTIMPLEMENTED = 161, -! COAP_CODE_RESP_BADGATEWAY = 162, -! COAP_CODE_RESP_UNAVAILABLE = 163, -! COAP_CODE_RESP_GWTIMEOUT = 164, -! COAP_CODE_RESP_PROXYINGNOTSUPP = 165, -! } coap_code_t; -! -! typedef enum { -! COAP_OPTION_NONE = 0, -! COAP_OPTION_CONTENTTYPE = 1, -! COAP_OPTION_MAXAGE = 2, -! COAP_OPTION_PROXYURI = 3, -! COAP_OPTION_ETAG = 4, -! COAP_OPTION_URIHOST = 5, -! COAP_OPTION_LOCATIONPATH = 6, -! COAP_OPTION_URIPORT = 7, -! COAP_OPTION_LOCATIONQUERY = 8, -! COAP_OPTION_URIPATH = 9, -! COAP_OPTION_TOKEN = 11, -! COAP_OPTION_ACCEPT = 12, -! COAP_OPTION_IFMATCH = 13, -! COAP_OPTION_URIQUERY = 15, -! COAP_OPTION_IFNONEMATCH = 21, -! } coap_option_t; -! -! typedef enum { -! COAP_MEDTYPE_TEXTPLAIN = 0, -! COAP_MEDTYPE_APPLINKFORMAT = 40, -! COAP_MEDTYPE_APPXML = 41, -! COAP_MEDTYPE_APPOCTETSTREAM = 42, -! COAP_MEDTYPE_APPEXI = 47, -! COAP_MEDTYPE_APPJSON = 50, -! } coap_media_type_t; -! -! //=========================== typedef ========================================= -! -! typedef struct { -! uint8_t Ver; -! coap_type_t T; -! uint8_t OC; -! coap_code_t Code; -! uint16_t messageID; -! } coap_header_iht; -! -! typedef struct { -! coap_option_t type; -! uint8_t length; -! uint8_t* pValue; -! } coap_option_iht; -! -! typedef error_t (*callbackRx_t)(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! typedef void (*callbackTimer_t)(void); -! typedef void (*callbackSendDone_t)(OpenQueueEntry_t* msg, error_t error); -! -! typedef struct coap_resource_desc_t coap_resource_desc_t; -! -! struct coap_resource_desc_t { -! uint8_t path0len; -! uint8_t* path0val; -! uint8_t path1len; -! uint8_t* path1val; -! uint8_t componentID; -! uint16_t messageID; -! callbackRx_t callbackRx; -! callbackSendDone_t callbackSendDone; -! coap_resource_desc_t* next; -! }; -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! // from stack -! void opencoap_init(); -! void opencoap_receive(OpenQueueEntry_t* msg); -! void opencoap_sendDone(OpenQueueEntry_t* msg, error_t error); -! -! // from CoAP resources -! void opencoap_writeLinks(OpenQueueEntry_t* msg); -! void opencoap_register(coap_resource_desc_t* desc); -! error_t opencoap_send(OpenQueueEntry_t* msg, -! coap_type_t type, -! coap_code_t code, -! uint8_t numOptions, -! coap_resource_desc_t* descSender); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,175 ---- -! #ifndef __OPENCOAP_H -! #define __OPENCOAP_H -! -! /** -! \addtogroup Transport -! \{ -! \addtogroup openCoap -! \{ -! */ -! -! #include "opentimers.h" -! -! //=========================== define ========================================== -! -! // IPv6 addresses of servers on the Internet -! static const uint8_t ipAddr_ipsoRD[] = {0x26, 0x07, 0xf7, 0x40, 0x00, 0x00, 0x00, 0x3f, \ -! 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x29}; -! static const uint8_t ipAddr_motesEecs[] = {0x20, 0x01, 0x04, 0x70, 0x00, 0x66, 0x00, 0x19, \ -! 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}; -! /*static const uint8_t ipAddr_local[] = {0x20, 0x02, 0x80, 0x20, 0x21, 0x47, 0x00, 0x0c, \ -! 0x10, 0xcb, 0xc6, 0x52, 0x44, 0x17, 0xd4, 0x18}; -! // 2607:f140:400:1036:688e:fa3b:444:6211 -! //static const uint8_t ipAddr_local[] = {0x26, 0x07, 0xf1, 0x40, 0x04, 0x00, 0x10, 0x36, \ -! // 0x68, 0x8e, 0xfa, 0x3b, 0x04, 0x44, 0x62, 0x11}; -! */ -! static const uint8_t ipAddr_local[] = {0x26, 0x07, 0xf1, 0x40, 0x04, 0x00, 0x10, 0x36, \ -! 0x4d, 0xcd, 0xab, 0x54, 0x81, 0x99, 0xc1, 0xf7}; -! -! static const uint8_t ipAddr_motedata[] = {0x20, 0x01, 0x04, 0x70, 0x00, 0x66, 0x00, 0x17, \ -! 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}; -! -! /// the maximum number of options in a RX'ed CoAP message -! #define MAX_COAP_OPTIONS 10 //3 before but we want gets with more options -! -! #define COAP_VERSION 1 -! -! typedef enum { -! COAP_TYPE_CON = 0, -! COAP_TYPE_NON = 1, -! COAP_TYPE_ACK = 2, -! COAP_TYPE_RES = 3, -! } coap_type_t; -! -! typedef enum { -! COAP_CODE_EMPTY = 0, -! // request -! COAP_CODE_REQ_GET = 1, -! COAP_CODE_REQ_POST = 2, -! COAP_CODE_REQ_PUT = 3, -! COAP_CODE_REQ_DELETE = 4, -! // response -! // - OK -! COAP_CODE_RESP_CREATED = 65, -! COAP_CODE_RESP_DELETED = 66, -! COAP_CODE_RESP_VALID = 67, -! COAP_CODE_RESP_CHANGED = 68, -! COAP_CODE_RESP_CONTENT = 69, -! // - not OK -! COAP_CODE_RESP_BADREQ = 128, -! COAP_CODE_RESP_UNAUTHORIZED = 129, -! COAP_CODE_RESP_BADOPTION = 130, -! COAP_CODE_RESP_FORBIDDEN = 131, -! COAP_CODE_RESP_NOTFOUND = 132, -! COAP_CODE_RESP_METHODNOTALLOWED = 133, -! COAP_CODE_RESP_PRECONDFAILED = 140, -! COAP_CODE_RESP_REQTOOLARGE = 141, -! COAP_CODE_RESP_UNSUPPMEDIATYPE = 143, -! // - error -! COAP_CODE_RESP_SERVERERROR = 160, -! COAP_CODE_RESP_NOTIMPLEMENTED = 161, -! COAP_CODE_RESP_BADGATEWAY = 162, -! COAP_CODE_RESP_UNAVAILABLE = 163, -! COAP_CODE_RESP_GWTIMEOUT = 164, -! COAP_CODE_RESP_PROXYINGNOTSUPP = 165, -! } coap_code_t; -! -! typedef enum { -! COAP_OPTION_NONE = 0, -! COAP_OPTION_NUM_IFMATCH = 1, -! COAP_OPTION_NUM_URIHOST = 3, -! COAP_OPTION_NUM_ETAG = 4, -! COAP_OPTION_NUM_IFNONEMATCH = 5, -! COAP_OPTION_NUM_URIPORT = 7, -! COAP_OPTION_NUM_LOCATIONPATH = 8, -! COAP_OPTION_NUM_URIPATH = 11, -! COAP_OPTION_NUM_CONTENTFORMAT = 12, -! COAP_OPTION_NUM_MAXAGE = 14, -! COAP_OPTION_NUM_URIQUERY = 15, -! COAP_OPTION_NUM_ACCEPT = 16, -! COAP_OPTION_NUM_LOCATIONQUERY = 20, -! COAP_OPTION_NUM_PROXYURI = 35, -! COAP_OPTION_NUM_PROXYSCHEME = 39, -! } coap_option_t; -! -! -! -! typedef enum { -! COAP_MEDTYPE_TEXTPLAIN = 0, -! COAP_MEDTYPE_APPLINKFORMAT = 40, -! COAP_MEDTYPE_APPXML = 41, -! COAP_MEDTYPE_APPOCTETSTREAM = 42, -! COAP_MEDTYPE_APPEXI = 47, -! COAP_MEDTYPE_APPJSON = 50, -! } coap_media_type_t; -! -! //=========================== typedef ========================================= -! -! typedef struct { -! uint8_t Ver; -! coap_type_t T; -! uint8_t TKL; -! coap_code_t Code; -! uint16_t messageID; -! uint8_t token; //this might be an array of 8 as tkl can be 8 -! } coap_header_iht; -! -! typedef struct { -! coap_option_t type; -! uint8_t length; -! uint8_t* pValue; -! } coap_option_iht; -! -! typedef owerror_t (*callbackRx_cbt)(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! typedef void (*callbackSendDone_cbt)(OpenQueueEntry_t* msg, -! owerror_t error); -! -! typedef struct coap_resource_desc_t coap_resource_desc_t; -! -! struct coap_resource_desc_t { -! uint8_t path0len; -! uint8_t* path0val; -! uint8_t path1len; -! uint8_t* path1val; -! uint8_t componentID; -! uint16_t messageID; -! uint8_t token; //should be 8bytes -! callbackRx_cbt callbackRx; -! callbackSendDone_cbt callbackSendDone; -! coap_resource_desc_t* next; -! }; -! -! //=========================== module variables ================================ -! -! typedef struct { -! coap_resource_desc_t* resources; -! bool busySending; -! uint8_t delayCounter; -! uint16_t messageID; -! opentimer_id_t timerId; -! } opencoap_vars_t; -! -! //=========================== prototypes ====================================== -! -! // from stack -! void opencoap_init(void); -! void opencoap_receive(OpenQueueEntry_t* msg); -! void opencoap_sendDone(OpenQueueEntry_t* msg, owerror_t error); -! -! // from CoAP resources -! void opencoap_writeLinks(OpenQueueEntry_t* msg); -! void opencoap_register(coap_resource_desc_t* desc); -! owerror_t opencoap_send(OpenQueueEntry_t* msg, -! coap_type_t type, -! coap_code_t code, -! uint8_t numOptions, -! coap_resource_desc_t* descSender); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/04-TRAN/opentcp.c ../../../sys/net/openwsn/04-TRAN/opentcp.c -*** openwsn/04-TRAN/opentcp.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/04-TRAN/opentcp.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,760 **** -! #include "openwsn.h" -! #include "opentcp.h" -! #include "openserial.h" -! #include "openqueue.h" -! #include "forwarding.h" -! #include "packetfunctions.h" -! #include "bsp_timer.h" -! #include "scheduler.h" -! #include "opentimers.h" -! //TCP applications -! #include "ohlone.h" -! #include "tcpecho.h" -! #include "tcpinject.h" -! #include "tcpprint.h" -! -! //=========================== variables ======================================= -! -! typedef struct { -! uint8_t state; -! uint32_t mySeqNum; -! uint16_t myPort; -! uint32_t hisNextSeqNum; -! uint16_t hisPort; -! open_addr_t hisIPv6Address; -! OpenQueueEntry_t* dataToSend; -! OpenQueueEntry_t* dataReceived; -! bool timerStarted; -! opentimer_id_t timerId; -! } tcp_vars_t; -! -! tcp_vars_t tcp_vars; -! -! //=========================== prototypes ====================================== -! -! void prependTCPHeader(OpenQueueEntry_t* msg, bool ack, bool push, bool rst, bool syn, bool fin); -! bool containsControlBits(OpenQueueEntry_t* msg, uint8_t ack, uint8_t rst, uint8_t syn, uint8_t fin); -! void tcp_change_state(uint8_t new_state); -! void reset(); -! void opentcp_timer_cb(); -! -! //=========================== public ========================================== -! -! void opentcp_init() { -! // reset local variables -! memset(&tcp_vars,0,sizeof(tcp_vars_t)); -! // reset state machine -! reset(); -! } -! -! error_t opentcp_connect(open_addr_t* dest, uint16_t param_tcp_hisPort, uint16_t param_tcp_myPort) { -! //[command] establishment -! OpenQueueEntry_t* tempPkt; -! if (tcp_vars.state!=TCP_STATE_CLOSED) { -! openserial_printError(COMPONENT_OPENTCP,ERR_WRONG_TCP_STATE, -! (errorparameter_t)tcp_vars.state, -! (errorparameter_t)0); -! return E_FAIL; -! } -! tcp_vars.myPort = param_tcp_myPort; -! tcp_vars.hisPort = param_tcp_hisPort; -! memcpy(&tcp_vars.hisIPv6Address,dest,sizeof(open_addr_t)); -! //I receive command 'connect', I send SYNC -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return E_FAIL; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! tcp_vars.mySeqNum = TCP_INITIAL_SEQNUM; -! prependTCPHeader(tempPkt, -! TCP_ACK_NO, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_YES, -! TCP_FIN_NO); -! tcp_change_state(TCP_STATE_ALMOST_SYN_SENT); -! return forwarding_send(tempPkt); -! } -! -! error_t opentcp_send(OpenQueueEntry_t* msg) { //[command] data -! msg->owner = COMPONENT_OPENTCP; -! if (tcp_vars.state!=TCP_STATE_ESTABLISHED) { -! openserial_printError(COMPONENT_OPENTCP,ERR_WRONG_TCP_STATE, -! (errorparameter_t)tcp_vars.state, -! (errorparameter_t)2); -! return E_FAIL; -! } -! if (tcp_vars.dataToSend!=NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_BUSY_SENDING, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return E_FAIL; -! } -! //I receive command 'send', I send data -! msg->l4_protocol = IANA_TCP; -! msg->l4_sourcePortORicmpv6Type = tcp_vars.myPort; -! msg->l4_destination_port = tcp_vars.hisPort; -! msg->l4_payload = msg->payload; -! msg->l4_length = msg->length; -! memcpy(&(msg->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! tcp_vars.dataToSend = msg; -! prependTCPHeader(tcp_vars.dataToSend, -! TCP_ACK_YES, -! TCP_PSH_YES, -! TCP_RST_NO, -! TCP_SYN_NO, -! TCP_FIN_NO); -! tcp_vars.mySeqNum += tcp_vars.dataToSend->l4_length; -! tcp_change_state(TCP_STATE_ALMOST_DATA_SENT); -! return forwarding_send(tcp_vars.dataToSend); -! } -! -! void opentcp_sendDone(OpenQueueEntry_t* msg, error_t error) { -! OpenQueueEntry_t* tempPkt; -! msg->owner = COMPONENT_OPENTCP; -! switch (tcp_vars.state) { -! case TCP_STATE_ALMOST_SYN_SENT: //[sendDone] establishement -! openqueue_freePacketBuffer(msg); -! tcp_change_state(TCP_STATE_SYN_SENT); -! break; -! -! case TCP_STATE_ALMOST_SYN_RECEIVED: //[sendDone] establishement -! openqueue_freePacketBuffer(msg); -! tcp_change_state(TCP_STATE_SYN_RECEIVED); -! break; -! -! case TCP_STATE_ALMOST_ESTABLISHED: //[sendDone] establishement -! openqueue_freePacketBuffer(msg); -! tcp_change_state(TCP_STATE_ESTABLISHED); -! switch(tcp_vars.myPort) { -! case WKP_TCP_HTTP: -! ohlone_connectDone(E_SUCCESS); -! break; -! case WKP_TCP_ECHO: -! tcpecho_connectDone(E_SUCCESS); -! break; -! case WKP_TCP_INJECT: -! tcpinject_connectDone(E_SUCCESS); -! break; -! case WKP_TCP_DISCARD: -! tcpprint_connectDone(E_SUCCESS); -! break; -! default: -! openserial_printError(COMPONENT_OPENTCP,ERR_UNSUPPORTED_PORT_NUMBER, -! (errorparameter_t)tcp_vars.myPort, -! (errorparameter_t)0); -! break; -! } -! break; -! -! case TCP_STATE_ALMOST_DATA_SENT: //[sendDone] data -! tcp_change_state(TCP_STATE_DATA_SENT); -! break; -! -! case TCP_STATE_ALMOST_DATA_RECEIVED: //[sendDone] data -! openqueue_freePacketBuffer(msg); -! tcp_change_state(TCP_STATE_ESTABLISHED); -! switch(tcp_vars.myPort) { -! case WKP_TCP_HTTP: -! ohlone_receive(tcp_vars.dataReceived); -! break; -! case WKP_TCP_ECHO: -! tcpecho_receive(tcp_vars.dataReceived); -! break; -! case WKP_TCP_INJECT: -! tcpinject_receive(tcp_vars.dataReceived); -! break; -! case WKP_TCP_DISCARD: -! tcpprint_receive(tcp_vars.dataReceived); -! break; -! default: -! openserial_printError(COMPONENT_OPENTCP,ERR_UNSUPPORTED_PORT_NUMBER, -! (errorparameter_t)tcp_vars.myPort, -! (errorparameter_t)1); -! openqueue_freePacketBuffer(msg); -! tcp_vars.dataReceived = NULL; -! break; -! } -! break; -! -! case TCP_STATE_ALMOST_FIN_WAIT_1: //[sendDone] teardown -! openqueue_freePacketBuffer(msg); -! tcp_change_state(TCP_STATE_FIN_WAIT_1); -! break; -! -! case TCP_STATE_ALMOST_CLOSING: //[sendDone] teardown -! openqueue_freePacketBuffer(msg); -! tcp_change_state(TCP_STATE_CLOSING); -! break; -! -! case TCP_STATE_ALMOST_TIME_WAIT: //[sendDone] teardown -! openqueue_freePacketBuffer(msg); -! tcp_change_state(TCP_STATE_TIME_WAIT); -! //TODO implement waiting timer -! reset(); -! break; -! -! case TCP_STATE_ALMOST_CLOSE_WAIT: //[sendDone] teardown -! openqueue_freePacketBuffer(msg); -! tcp_change_state(TCP_STATE_CLOSE_WAIT); -! //I send FIN+ACK -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! prependTCPHeader(tempPkt, -! TCP_ACK_YES, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_NO, -! TCP_FIN_YES); -! forwarding_send(tempPkt); -! tcp_change_state(TCP_STATE_ALMOST_LAST_ACK); -! break; -! -! case TCP_STATE_ALMOST_LAST_ACK: //[sendDone] teardown -! openqueue_freePacketBuffer(msg); -! tcp_change_state(TCP_STATE_LAST_ACK); -! break; -! -! default: -! openserial_printError(COMPONENT_OPENTCP,ERR_WRONG_TCP_STATE, -! (errorparameter_t)tcp_vars.state, -! (errorparameter_t)3); -! break; -! } -! } -! -! void opentcp_receive(OpenQueueEntry_t* msg) { -! OpenQueueEntry_t* tempPkt; -! bool shouldIlisten; -! msg->owner = COMPONENT_OPENTCP; -! msg->l4_protocol = IANA_TCP; -! msg->l4_payload = msg->payload; -! msg->l4_length = msg->length; -! msg->l4_sourcePortORicmpv6Type = packetfunctions_ntohs((uint8_t*)&(((tcp_ht*)msg->payload)->source_port)); -! msg->l4_destination_port = packetfunctions_ntohs((uint8_t*)&(((tcp_ht*)msg->payload)->destination_port)); -! if ( -! tcp_vars.state!=TCP_STATE_CLOSED && -! ( -! msg->l4_destination_port != tcp_vars.myPort || -! msg->l4_sourcePortORicmpv6Type != tcp_vars.hisPort || -! packetfunctions_sameAddress(&(msg->l3_destinationAdd),&tcp_vars.hisIPv6Address)==FALSE -! ) -! ) { -! openqueue_freePacketBuffer(msg); -! return; -! } -! if (containsControlBits(msg,TCP_ACK_WHATEVER,TCP_RST_YES,TCP_SYN_WHATEVER,TCP_FIN_WHATEVER)) { -! //I receive RST[+*], I reset -! reset(); -! openqueue_freePacketBuffer(msg); -! } -! switch (tcp_vars.state) { -! case TCP_STATE_CLOSED: //[receive] establishement -! switch(msg->l4_destination_port) { -! case WKP_TCP_HTTP: -! shouldIlisten = ohlone_shouldIlisten(); -! break; -! case WKP_TCP_ECHO: -! shouldIlisten = tcpecho_shouldIlisten(); -! break; -! case WKP_TCP_INJECT: -! shouldIlisten = tcpinject_shouldIlisten(); -! break; -! case WKP_TCP_DISCARD: -! shouldIlisten = tcpprint_shouldIlisten(); -! break; -! default: -! openserial_printError(COMPONENT_OPENTCP,ERR_UNSUPPORTED_PORT_NUMBER, -! (errorparameter_t)msg->l4_sourcePortORicmpv6Type, -! (errorparameter_t)2); -! shouldIlisten = FALSE; -! break; -! } -! if ( containsControlBits(msg,TCP_ACK_NO,TCP_RST_NO,TCP_SYN_YES,TCP_FIN_NO) && shouldIlisten==TRUE ) { -! tcp_vars.myPort = msg->l4_destination_port; -! //I receive SYN, I send SYN+ACK -! tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+1; -! tcp_vars.hisPort = msg->l4_sourcePortORicmpv6Type; -! memcpy(&tcp_vars.hisIPv6Address,&(msg->l3_destinationAdd),sizeof(open_addr_t)); -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! prependTCPHeader(tempPkt, -! TCP_ACK_YES, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_YES, -! TCP_FIN_NO); -! tcp_vars.mySeqNum++; -! tcp_change_state(TCP_STATE_ALMOST_SYN_RECEIVED); -! forwarding_send(tempPkt); -! } else { -! reset(); -! openserial_printError(COMPONENT_OPENTCP,ERR_TCP_RESET, -! (errorparameter_t)tcp_vars.state, -! (errorparameter_t)0); -! } -! openqueue_freePacketBuffer(msg); -! break; -! -! case TCP_STATE_SYN_SENT: //[receive] establishement -! if (containsControlBits(msg,TCP_ACK_YES,TCP_RST_NO,TCP_SYN_YES,TCP_FIN_NO)) { -! //I receive SYN+ACK, I send ACK -! tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+1; -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! prependTCPHeader(tempPkt, -! TCP_ACK_YES, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_NO, -! TCP_FIN_NO); -! tcp_change_state(TCP_STATE_ALMOST_ESTABLISHED); -! forwarding_send(tempPkt); -! } else if (containsControlBits(msg,TCP_ACK_NO,TCP_RST_NO,TCP_SYN_YES,TCP_FIN_NO)) { -! //I receive SYN, I send SYN+ACK -! tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+1; -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! prependTCPHeader(tempPkt, -! TCP_ACK_YES, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_YES, -! TCP_FIN_NO); -! tcp_vars.mySeqNum++; -! tcp_change_state(TCP_STATE_ALMOST_SYN_RECEIVED); -! forwarding_send(tempPkt); -! } else { -! reset(); -! openserial_printError(COMPONENT_OPENTCP,ERR_TCP_RESET, -! (errorparameter_t)tcp_vars.state, -! (errorparameter_t)1); -! } -! openqueue_freePacketBuffer(msg); -! break; -! -! case TCP_STATE_SYN_RECEIVED: //[receive] establishement -! if (containsControlBits(msg,TCP_ACK_YES,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_NO)) { -! //I receive ACK, the virtual circuit is established -! tcp_change_state(TCP_STATE_ESTABLISHED); -! } else { -! reset(); -! openserial_printError(COMPONENT_OPENTCP,ERR_TCP_RESET, -! (errorparameter_t)tcp_vars.state, -! (errorparameter_t)2); -! } -! openqueue_freePacketBuffer(msg); -! break; -! -! case TCP_STATE_ESTABLISHED: //[receive] data/teardown -! if (containsControlBits(msg,TCP_ACK_WHATEVER,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_YES)) { -! //I receive FIN[+ACK], I send ACK -! tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+msg->length-sizeof(tcp_ht)+1; -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! prependTCPHeader(tempPkt, -! TCP_ACK_YES, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_NO, -! TCP_FIN_NO); -! forwarding_send(tempPkt); -! tcp_change_state(TCP_STATE_ALMOST_CLOSE_WAIT); -! } else if (containsControlBits(msg,TCP_ACK_WHATEVER,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_NO)) { -! //I receive data, I send ACK -! tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+msg->length-sizeof(tcp_ht); -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! prependTCPHeader(tempPkt, -! TCP_ACK_YES, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_NO, -! TCP_FIN_NO); -! forwarding_send(tempPkt); -! packetfunctions_tossHeader(msg,sizeof(tcp_ht)); -! tcp_vars.dataReceived = msg; -! tcp_change_state(TCP_STATE_ALMOST_DATA_RECEIVED); -! } else { -! reset(); -! openserial_printError(COMPONENT_OPENTCP,ERR_TCP_RESET, -! (errorparameter_t)tcp_vars.state, -! (errorparameter_t)3); -! openqueue_freePacketBuffer(msg); -! } -! break; -! -! case TCP_STATE_DATA_SENT: //[receive] data -! if (containsControlBits(msg,TCP_ACK_YES,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_NO)) { -! //I receive ACK, data message sent -! switch(tcp_vars.myPort) { -! case WKP_TCP_HTTP: -! ohlone_sendDone(tcp_vars.dataToSend,E_SUCCESS); -! break; -! case WKP_TCP_ECHO: -! tcpecho_sendDone(tcp_vars.dataToSend,E_SUCCESS); -! break; -! case WKP_TCP_INJECT: -! tcpinject_sendDone(tcp_vars.dataToSend,E_SUCCESS); -! break; -! case WKP_TCP_DISCARD: -! tcpprint_sendDone(tcp_vars.dataToSend,E_SUCCESS); -! break; -! default: -! openserial_printError(COMPONENT_OPENTCP,ERR_UNSUPPORTED_PORT_NUMBER, -! (errorparameter_t)tcp_vars.myPort, -! (errorparameter_t)3); -! break; -! } -! tcp_vars.dataToSend = NULL; -! tcp_change_state(TCP_STATE_ESTABLISHED); -! } else if (containsControlBits(msg,TCP_ACK_WHATEVER,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_YES)) { -! //I receive FIN[+ACK], I send ACK -! switch(tcp_vars.myPort) { -! case WKP_TCP_HTTP: -! ohlone_sendDone(tcp_vars.dataToSend,E_SUCCESS); -! break; -! case WKP_TCP_ECHO: -! tcpecho_sendDone(tcp_vars.dataToSend,E_SUCCESS); -! break; -! case WKP_TCP_INJECT: -! tcpinject_sendDone(tcp_vars.dataToSend,E_SUCCESS); -! break; -! case WKP_TCP_DISCARD: -! tcpprint_sendDone(tcp_vars.dataToSend,E_SUCCESS); -! break; -! default: -! openserial_printError(COMPONENT_OPENTCP,ERR_UNSUPPORTED_PORT_NUMBER, -! (errorparameter_t)tcp_vars.myPort, -! (errorparameter_t)4); -! break; -! } -! tcp_vars.dataToSend = NULL; -! tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+msg->length-sizeof(tcp_ht)+1; -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! prependTCPHeader(tempPkt, -! TCP_ACK_YES, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_NO, -! TCP_FIN_NO); -! forwarding_send(tempPkt); -! tcp_change_state(TCP_STATE_ALMOST_CLOSE_WAIT); -! } else { -! reset(); -! openserial_printError(COMPONENT_OPENTCP,ERR_TCP_RESET, -! (errorparameter_t)tcp_vars.state, -! (errorparameter_t)4); -! } -! openqueue_freePacketBuffer(msg); -! break; -! -! case TCP_STATE_FIN_WAIT_1: //[receive] teardown -! if (containsControlBits(msg,TCP_ACK_NO,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_YES)) { -! //I receive FIN, I send ACK -! tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+1; -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! prependTCPHeader(tempPkt, -! TCP_ACK_YES, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_NO, -! TCP_FIN_NO); -! forwarding_send(tempPkt); -! tcp_change_state(TCP_STATE_ALMOST_CLOSING); -! } else if (containsControlBits(msg,TCP_ACK_YES,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_YES)) { -! //I receive FIN+ACK, I send ACK -! tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+1; -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! prependTCPHeader(tempPkt, -! TCP_ACK_YES, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_NO, -! TCP_FIN_NO); -! forwarding_send(tempPkt); -! tcp_change_state(TCP_STATE_ALMOST_TIME_WAIT); -! } else if (containsControlBits(msg,TCP_ACK_YES,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_NO)) { -! //I receive ACK, I will receive FIN later -! tcp_change_state(TCP_STATE_FIN_WAIT_2); -! } else { -! reset(); -! openserial_printError(COMPONENT_OPENTCP,ERR_TCP_RESET, -! (errorparameter_t)tcp_vars.state, -! (errorparameter_t)5); -! } -! openqueue_freePacketBuffer(msg); -! break; -! -! case TCP_STATE_FIN_WAIT_2: //[receive] teardown -! if (containsControlBits(msg,TCP_ACK_WHATEVER,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_YES)) { -! //I receive FIN[+ACK], I send ACK -! tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+1; -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! prependTCPHeader(tempPkt, -! TCP_ACK_YES, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_NO, -! TCP_FIN_NO); -! forwarding_send(tempPkt); -! tcp_change_state(TCP_STATE_ALMOST_TIME_WAIT); -! } -! openqueue_freePacketBuffer(msg); -! break; -! -! case TCP_STATE_CLOSING: //[receive] teardown -! if (containsControlBits(msg,TCP_ACK_YES,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_NO)) { -! //I receive ACK, I do nothing -! tcp_change_state(TCP_STATE_TIME_WAIT); -! //TODO implement waiting timer -! reset(); -! } -! openqueue_freePacketBuffer(msg); -! break; -! -! case TCP_STATE_LAST_ACK: //[receive] teardown -! if (containsControlBits(msg,TCP_ACK_YES,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_NO)) { -! //I receive ACK, I reset -! reset(); -! } -! openqueue_freePacketBuffer(msg); -! break; -! -! default: -! openserial_printError(COMPONENT_OPENTCP,ERR_WRONG_TCP_STATE, -! (errorparameter_t)tcp_vars.state, -! (errorparameter_t)4); -! break; -! } -! } -! -! error_t opentcp_close() { //[command] teardown -! OpenQueueEntry_t* tempPkt; -! if ( tcp_vars.state==TCP_STATE_ALMOST_CLOSE_WAIT || -! tcp_vars.state==TCP_STATE_CLOSE_WAIT || -! tcp_vars.state==TCP_STATE_ALMOST_LAST_ACK || -! tcp_vars.state==TCP_STATE_LAST_ACK || -! tcp_vars.state==TCP_STATE_CLOSED) { -! //not an error, can happen when distant node has already started tearing down -! return E_SUCCESS; -! } -! //I receive command 'close', I send FIN+ACK -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return E_FAIL; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! prependTCPHeader(tempPkt, -! TCP_ACK_YES, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_NO, -! TCP_FIN_YES); -! tcp_vars.mySeqNum++; -! tcp_change_state(TCP_STATE_ALMOST_FIN_WAIT_1); -! return forwarding_send(tempPkt); -! } -! -! bool tcp_debugPrint() { -! return FALSE; -! } -! -! //======= timer -! -! //timer used to reset state when TCP state machine is stuck -! void timers_tcp_fired() { -! reset(); -! } -! -! //=========================== private ========================================= -! -! void prependTCPHeader(OpenQueueEntry_t* msg, -! bool ack, -! bool push, -! bool rst, -! bool syn, -! bool fin) { -! msg->l4_protocol = IANA_TCP; -! packetfunctions_reserveHeaderSize(msg,sizeof(tcp_ht)); -! packetfunctions_htons(tcp_vars.myPort ,(uint8_t*)&(((tcp_ht*)msg->payload)->source_port)); -! packetfunctions_htons(tcp_vars.hisPort ,(uint8_t*)&(((tcp_ht*)msg->payload)->destination_port)); -! packetfunctions_htonl(tcp_vars.mySeqNum ,(uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)); -! packetfunctions_htonl(tcp_vars.hisNextSeqNum ,(uint8_t*)&(((tcp_ht*)msg->payload)->ack_number)); -! ((tcp_ht*)msg->payload)->data_offset = TCP_DEFAULT_DATA_OFFSET; -! ((tcp_ht*)msg->payload)->control_bits = 0; -! if (ack==TCP_ACK_YES) { -! ((tcp_ht*)msg->payload)->control_bits |= 1 << TCP_ACK; -! } else { -! packetfunctions_htonl(0,(uint8_t*)&(((tcp_ht*)msg->payload)->ack_number)); -! } -! if (push==TCP_PSH_YES) { -! ((tcp_ht*)msg->payload)->control_bits |= 1 << TCP_PSH; -! } -! if (rst==TCP_RST_YES) { -! ((tcp_ht*)msg->payload)->control_bits |= 1 << TCP_RST; -! } -! if (syn==TCP_SYN_YES) { -! ((tcp_ht*)msg->payload)->control_bits |= 1 << TCP_SYN; -! } -! if (fin==TCP_FIN_YES) { -! ((tcp_ht*)msg->payload)->control_bits |= 1 << TCP_FIN; -! } -! packetfunctions_htons(TCP_DEFAULT_WINDOW_SIZE ,(uint8_t*)&(((tcp_ht*)msg->payload)->window_size)); -! packetfunctions_htons(TCP_DEFAULT_URGENT_POINTER ,(uint8_t*)&(((tcp_ht*)msg->payload)->urgent_pointer)); -! //calculate checksum last to take all header fields into account -! packetfunctions_calculateChecksum(msg,(uint8_t*)&(((tcp_ht*)msg->payload)->checksum)); -! } -! -! bool containsControlBits(OpenQueueEntry_t* msg, uint8_t ack, uint8_t rst, uint8_t syn, uint8_t fin) { -! bool return_value = TRUE; -! if (ack!=TCP_ACK_WHATEVER){ -! return_value = return_value && ((bool)( (((tcp_ht*)msg->payload)->control_bits >> TCP_ACK) & 0x01) == ack); -! } -! if (rst!=TCP_RST_WHATEVER){ -! return_value = return_value && ((bool)( (((tcp_ht*)msg->payload)->control_bits >> TCP_RST) & 0x01) == rst); -! } -! if (syn!=TCP_SYN_WHATEVER){ -! return_value = return_value && ((bool)( (((tcp_ht*)msg->payload)->control_bits >> TCP_SYN) & 0x01) == syn); -! } -! if (fin!=TCP_FIN_WHATEVER){ -! return_value = return_value && ((bool)( (((tcp_ht*)msg->payload)->control_bits >> TCP_FIN) & 0x01) == fin); -! } -! return return_value; -! } -! -! void reset() { -! tcp_change_state(TCP_STATE_CLOSED); -! tcp_vars.mySeqNum = TCP_INITIAL_SEQNUM; -! tcp_vars.hisNextSeqNum = 0; -! tcp_vars.hisPort = 0; -! tcp_vars.hisIPv6Address.type = ADDR_NONE; -! tcp_vars.dataToSend = NULL; -! tcp_vars.dataReceived = NULL; -! openqueue_removeAllOwnedBy(COMPONENT_OPENTCP); -! } -! -! void tcp_change_state(uint8_t new_tcp_state) { -! tcp_vars.state = new_tcp_state; -! if (tcp_vars.state==TCP_STATE_CLOSED) { -! if (tcp_vars.timerStarted==TRUE) { -! opentimers_stop(tcp_vars.timerId); -! } -! } else { -! if (tcp_vars.timerStarted==FALSE) { -! tcp_vars.timerId = opentimers_start(TCP_TIMEOUT, -! TIMER_ONESHOT,TIME_MS, -! opentcp_timer_cb); -! tcp_vars.timerStarted=TRUE; -! } -! -! } -! } -! -! void opentcp_timer_cb() { -! scheduler_push_task(timers_tcp_fired,TASKPRIO_TCP_TIMEOUT); - } -\ No newline at end of file ---- 1,753 ---- -! #include "openwsn.h" -! #include "opentcp.h" -! #include "openserial.h" -! #include "openqueue.h" -! #include "forwarding.h" -! #include "packetfunctions.h" -! //#include "bsp_timer.h" -! #include "scheduler.h" -! #include "opentimers.h" -! //TCP applications -! #include "ohlone.h" -! #include "tcpecho.h" -! #include "tcpinject.h" -! #include "tcpprint.h" -! -! #include "thread.h" -! -! //=========================== variables ======================================= -! -! tcp_vars_t tcp_vars; -! //static char openwsn_opentcp_stack[KERNEL_CONF_STACKSIZE_MAIN]; -! -! //=========================== prototypes ====================================== -! -! void prependTCPHeader(OpenQueueEntry_t* msg, bool ack, bool push, bool rst, bool syn, bool fin); -! bool containsControlBits(OpenQueueEntry_t* msg, uint8_t ack, uint8_t rst, uint8_t syn, uint8_t fin); -! void tcp_change_state(uint8_t new_state); -! void opentcp_reset(void); -! void opentcp_timer_cb(void); -! -! //=========================== public ========================================== -! -! void opentcp_init(void) { -! // reset local variables -! memset(&tcp_vars,0,sizeof(tcp_vars_t)); -! // reset state machine -! opentcp_reset(); -! } -! -! owerror_t opentcp_connect(open_addr_t* dest, uint16_t param_tcp_hisPort, uint16_t param_tcp_myPort) { -! //[command] establishment -! OpenQueueEntry_t* tempPkt; -! if (tcp_vars.state!=TCP_STATE_CLOSED) { -! openserial_printError(COMPONENT_OPENTCP,ERR_WRONG_TCP_STATE, -! (errorparameter_t)tcp_vars.state, -! (errorparameter_t)0); -! return E_FAIL; -! } -! tcp_vars.myPort = param_tcp_myPort; -! tcp_vars.hisPort = param_tcp_hisPort; -! memcpy(&tcp_vars.hisIPv6Address,dest,sizeof(open_addr_t)); -! //I receive command 'connect', I send SYNC -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return E_FAIL; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! tcp_vars.mySeqNum = TCP_INITIAL_SEQNUM; -! prependTCPHeader(tempPkt, -! TCP_ACK_NO, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_YES, -! TCP_FIN_NO); -! tcp_change_state(TCP_STATE_ALMOST_SYN_SENT); -! return forwarding_send(tempPkt); -! } -! -! owerror_t opentcp_send(OpenQueueEntry_t* msg) { //[command] data -! msg->owner = COMPONENT_OPENTCP; -! if (tcp_vars.state!=TCP_STATE_ESTABLISHED) { -! openserial_printError(COMPONENT_OPENTCP,ERR_WRONG_TCP_STATE, -! (errorparameter_t)tcp_vars.state, -! (errorparameter_t)2); -! return E_FAIL; -! } -! if (tcp_vars.dataToSend!=NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_BUSY_SENDING, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return E_FAIL; -! } -! //I receive command 'send', I send data -! msg->l4_protocol = IANA_TCP; -! msg->l4_sourcePortORicmpv6Type = tcp_vars.myPort; -! msg->l4_destination_port = tcp_vars.hisPort; -! msg->l4_payload = msg->payload; -! msg->l4_length = msg->length; -! memcpy(&(msg->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! tcp_vars.dataToSend = msg; -! prependTCPHeader(tcp_vars.dataToSend, -! TCP_ACK_YES, -! TCP_PSH_YES, -! TCP_RST_NO, -! TCP_SYN_NO, -! TCP_FIN_NO); -! tcp_vars.mySeqNum += tcp_vars.dataToSend->l4_length; -! tcp_change_state(TCP_STATE_ALMOST_DATA_SENT); -! return forwarding_send(tcp_vars.dataToSend); -! } -! -! void opentcp_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! OpenQueueEntry_t* tempPkt; -! msg->owner = COMPONENT_OPENTCP; -! switch (tcp_vars.state) { -! case TCP_STATE_ALMOST_SYN_SENT: //[sendDone] establishement -! openqueue_freePacketBuffer(msg); -! tcp_change_state(TCP_STATE_SYN_SENT); -! break; -! -! case TCP_STATE_ALMOST_SYN_RECEIVED: //[sendDone] establishement -! openqueue_freePacketBuffer(msg); -! tcp_change_state(TCP_STATE_SYN_RECEIVED); -! break; -! -! case TCP_STATE_ALMOST_ESTABLISHED: //[sendDone] establishement -! openqueue_freePacketBuffer(msg); -! tcp_change_state(TCP_STATE_ESTABLISHED); -! switch(tcp_vars.myPort) { -! case WKP_TCP_HTTP: -! ohlone_connectDone(E_SUCCESS); -! break; -! case WKP_TCP_ECHO: -! tcpecho_connectDone(E_SUCCESS); -! break; -! case WKP_TCP_INJECT: -! tcpinject_connectDone(E_SUCCESS); -! break; -! case WKP_TCP_DISCARD: -! tcpprint_connectDone(E_SUCCESS); -! break; -! default: -! openserial_printError(COMPONENT_OPENTCP,ERR_UNSUPPORTED_PORT_NUMBER, -! (errorparameter_t)tcp_vars.myPort, -! (errorparameter_t)0); -! break; -! } -! break; -! -! case TCP_STATE_ALMOST_DATA_SENT: //[sendDone] data -! tcp_change_state(TCP_STATE_DATA_SENT); -! break; -! -! case TCP_STATE_ALMOST_DATA_RECEIVED: //[sendDone] data -! openqueue_freePacketBuffer(msg); -! tcp_change_state(TCP_STATE_ESTABLISHED); -! switch(tcp_vars.myPort) { -! case WKP_TCP_HTTP: -! ohlone_receive(tcp_vars.dataReceived); -! break; -! case WKP_TCP_ECHO: -! tcpecho_receive(tcp_vars.dataReceived); -! break; -! case WKP_TCP_INJECT: -! tcpinject_receive(tcp_vars.dataReceived); -! break; -! case WKP_TCP_DISCARD: -! tcpprint_receive(tcp_vars.dataReceived); -! break; -! default: -! openserial_printError(COMPONENT_OPENTCP,ERR_UNSUPPORTED_PORT_NUMBER, -! (errorparameter_t)tcp_vars.myPort, -! (errorparameter_t)1); -! openqueue_freePacketBuffer(msg); -! tcp_vars.dataReceived = NULL; -! break; -! } -! break; -! -! case TCP_STATE_ALMOST_FIN_WAIT_1: //[sendDone] teardown -! openqueue_freePacketBuffer(msg); -! tcp_change_state(TCP_STATE_FIN_WAIT_1); -! break; -! -! case TCP_STATE_ALMOST_CLOSING: //[sendDone] teardown -! openqueue_freePacketBuffer(msg); -! tcp_change_state(TCP_STATE_CLOSING); -! break; -! -! case TCP_STATE_ALMOST_TIME_WAIT: //[sendDone] teardown -! openqueue_freePacketBuffer(msg); -! tcp_change_state(TCP_STATE_TIME_WAIT); -! //TODO implement waiting timer -! opentcp_reset(); -! break; -! -! case TCP_STATE_ALMOST_CLOSE_WAIT: //[sendDone] teardown -! openqueue_freePacketBuffer(msg); -! tcp_change_state(TCP_STATE_CLOSE_WAIT); -! //I send FIN+ACK -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! prependTCPHeader(tempPkt, -! TCP_ACK_YES, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_NO, -! TCP_FIN_YES); -! forwarding_send(tempPkt); -! tcp_change_state(TCP_STATE_ALMOST_LAST_ACK); -! break; -! -! case TCP_STATE_ALMOST_LAST_ACK: //[sendDone] teardown -! openqueue_freePacketBuffer(msg); -! tcp_change_state(TCP_STATE_LAST_ACK); -! break; -! -! default: -! openserial_printError(COMPONENT_OPENTCP,ERR_WRONG_TCP_STATE, -! (errorparameter_t)tcp_vars.state, -! (errorparameter_t)3); -! break; -! } -! } -! -! void opentcp_receive(OpenQueueEntry_t* msg) { -! OpenQueueEntry_t* tempPkt; -! bool shouldIlisten; -! msg->owner = COMPONENT_OPENTCP; -! msg->l4_protocol = IANA_TCP; -! msg->l4_payload = msg->payload; -! msg->l4_length = msg->length; -! msg->l4_sourcePortORicmpv6Type = packetfunctions_ntohs((uint8_t*)&(((tcp_ht*)msg->payload)->source_port)); -! msg->l4_destination_port = packetfunctions_ntohs((uint8_t*)&(((tcp_ht*)msg->payload)->destination_port)); -! if ( -! tcp_vars.state!=TCP_STATE_CLOSED && -! ( -! msg->l4_destination_port != tcp_vars.myPort || -! msg->l4_sourcePortORicmpv6Type != tcp_vars.hisPort || -! packetfunctions_sameAddress(&(msg->l3_destinationAdd),&tcp_vars.hisIPv6Address)==FALSE -! ) -! ) { -! openqueue_freePacketBuffer(msg); -! return; -! } -! if (containsControlBits(msg,TCP_ACK_WHATEVER,TCP_RST_YES,TCP_SYN_WHATEVER,TCP_FIN_WHATEVER)) { -! //I receive RST[+*], I reset -! opentcp_reset(); -! openqueue_freePacketBuffer(msg); -! } -! switch (tcp_vars.state) { -! case TCP_STATE_CLOSED: //[receive] establishement -! switch(msg->l4_destination_port) { -! case WKP_TCP_HTTP: -! shouldIlisten = ohlone_shouldIlisten(); -! break; -! case WKP_TCP_ECHO: -! shouldIlisten = tcpecho_shouldIlisten(); -! break; -! case WKP_TCP_INJECT: -! shouldIlisten = tcpinject_shouldIlisten(); -! break; -! case WKP_TCP_DISCARD: -! shouldIlisten = tcpprint_shouldIlisten(); -! break; -! default: -! openserial_printError(COMPONENT_OPENTCP,ERR_UNSUPPORTED_PORT_NUMBER, -! (errorparameter_t)msg->l4_sourcePortORicmpv6Type, -! (errorparameter_t)2); -! shouldIlisten = FALSE; -! break; -! } -! if ( containsControlBits(msg,TCP_ACK_NO,TCP_RST_NO,TCP_SYN_YES,TCP_FIN_NO) && shouldIlisten==TRUE ) { -! tcp_vars.myPort = msg->l4_destination_port; -! //I receive SYN, I send SYN+ACK -! tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+1; -! tcp_vars.hisPort = msg->l4_sourcePortORicmpv6Type; -! memcpy(&tcp_vars.hisIPv6Address,&(msg->l3_destinationAdd),sizeof(open_addr_t)); -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! prependTCPHeader(tempPkt, -! TCP_ACK_YES, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_YES, -! TCP_FIN_NO); -! tcp_vars.mySeqNum++; -! tcp_change_state(TCP_STATE_ALMOST_SYN_RECEIVED); -! forwarding_send(tempPkt); -! } else { -! opentcp_reset(); -! openserial_printError(COMPONENT_OPENTCP,ERR_TCP_RESET, -! (errorparameter_t)tcp_vars.state, -! (errorparameter_t)0); -! } -! openqueue_freePacketBuffer(msg); -! break; -! -! case TCP_STATE_SYN_SENT: //[receive] establishement -! if (containsControlBits(msg,TCP_ACK_YES,TCP_RST_NO,TCP_SYN_YES,TCP_FIN_NO)) { -! //I receive SYN+ACK, I send ACK -! tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+1; -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! prependTCPHeader(tempPkt, -! TCP_ACK_YES, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_NO, -! TCP_FIN_NO); -! tcp_change_state(TCP_STATE_ALMOST_ESTABLISHED); -! forwarding_send(tempPkt); -! } else if (containsControlBits(msg,TCP_ACK_NO,TCP_RST_NO,TCP_SYN_YES,TCP_FIN_NO)) { -! //I receive SYN, I send SYN+ACK -! tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+1; -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! prependTCPHeader(tempPkt, -! TCP_ACK_YES, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_YES, -! TCP_FIN_NO); -! tcp_vars.mySeqNum++; -! tcp_change_state(TCP_STATE_ALMOST_SYN_RECEIVED); -! forwarding_send(tempPkt); -! } else { -! opentcp_reset(); -! openserial_printError(COMPONENT_OPENTCP,ERR_TCP_RESET, -! (errorparameter_t)tcp_vars.state, -! (errorparameter_t)1); -! } -! openqueue_freePacketBuffer(msg); -! break; -! -! case TCP_STATE_SYN_RECEIVED: //[receive] establishement -! if (containsControlBits(msg,TCP_ACK_YES,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_NO)) { -! //I receive ACK, the virtual circuit is established -! tcp_change_state(TCP_STATE_ESTABLISHED); -! } else { -! opentcp_reset(); -! openserial_printError(COMPONENT_OPENTCP,ERR_TCP_RESET, -! (errorparameter_t)tcp_vars.state, -! (errorparameter_t)2); -! } -! openqueue_freePacketBuffer(msg); -! break; -! -! case TCP_STATE_ESTABLISHED: //[receive] data/teardown -! if (containsControlBits(msg,TCP_ACK_WHATEVER,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_YES)) { -! //I receive FIN[+ACK], I send ACK -! tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+msg->length-sizeof(tcp_ht)+1; -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! prependTCPHeader(tempPkt, -! TCP_ACK_YES, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_NO, -! TCP_FIN_NO); -! forwarding_send(tempPkt); -! tcp_change_state(TCP_STATE_ALMOST_CLOSE_WAIT); -! } else if (containsControlBits(msg,TCP_ACK_WHATEVER,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_NO)) { -! //I receive data, I send ACK -! tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+msg->length-sizeof(tcp_ht); -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! prependTCPHeader(tempPkt, -! TCP_ACK_YES, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_NO, -! TCP_FIN_NO); -! forwarding_send(tempPkt); -! packetfunctions_tossHeader(msg,sizeof(tcp_ht)); -! tcp_vars.dataReceived = msg; -! tcp_change_state(TCP_STATE_ALMOST_DATA_RECEIVED); -! } else { -! opentcp_reset(); -! openserial_printError(COMPONENT_OPENTCP,ERR_TCP_RESET, -! (errorparameter_t)tcp_vars.state, -! (errorparameter_t)3); -! openqueue_freePacketBuffer(msg); -! } -! break; -! -! case TCP_STATE_DATA_SENT: //[receive] data -! if (containsControlBits(msg,TCP_ACK_YES,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_NO)) { -! //I receive ACK, data message sent -! switch(tcp_vars.myPort) { -! case WKP_TCP_HTTP: -! ohlone_sendDone(tcp_vars.dataToSend,E_SUCCESS); -! break; -! case WKP_TCP_ECHO: -! tcpecho_sendDone(tcp_vars.dataToSend,E_SUCCESS); -! break; -! case WKP_TCP_INJECT: -! tcpinject_sendDone(tcp_vars.dataToSend,E_SUCCESS); -! break; -! case WKP_TCP_DISCARD: -! tcpprint_sendDone(tcp_vars.dataToSend,E_SUCCESS); -! break; -! default: -! openserial_printError(COMPONENT_OPENTCP,ERR_UNSUPPORTED_PORT_NUMBER, -! (errorparameter_t)tcp_vars.myPort, -! (errorparameter_t)3); -! break; -! } -! tcp_vars.dataToSend = NULL; -! tcp_change_state(TCP_STATE_ESTABLISHED); -! } else if (containsControlBits(msg,TCP_ACK_WHATEVER,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_YES)) { -! //I receive FIN[+ACK], I send ACK -! switch(tcp_vars.myPort) { -! case WKP_TCP_HTTP: -! ohlone_sendDone(tcp_vars.dataToSend,E_SUCCESS); -! break; -! case WKP_TCP_ECHO: -! tcpecho_sendDone(tcp_vars.dataToSend,E_SUCCESS); -! break; -! case WKP_TCP_INJECT: -! tcpinject_sendDone(tcp_vars.dataToSend,E_SUCCESS); -! break; -! case WKP_TCP_DISCARD: -! tcpprint_sendDone(tcp_vars.dataToSend,E_SUCCESS); -! break; -! default: -! openserial_printError(COMPONENT_OPENTCP,ERR_UNSUPPORTED_PORT_NUMBER, -! (errorparameter_t)tcp_vars.myPort, -! (errorparameter_t)4); -! break; -! } -! tcp_vars.dataToSend = NULL; -! tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+msg->length-sizeof(tcp_ht)+1; -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! prependTCPHeader(tempPkt, -! TCP_ACK_YES, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_NO, -! TCP_FIN_NO); -! forwarding_send(tempPkt); -! tcp_change_state(TCP_STATE_ALMOST_CLOSE_WAIT); -! } else { -! opentcp_reset(); -! openserial_printError(COMPONENT_OPENTCP,ERR_TCP_RESET, -! (errorparameter_t)tcp_vars.state, -! (errorparameter_t)4); -! } -! openqueue_freePacketBuffer(msg); -! break; -! -! case TCP_STATE_FIN_WAIT_1: //[receive] teardown -! if (containsControlBits(msg,TCP_ACK_NO,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_YES)) { -! //I receive FIN, I send ACK -! tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+1; -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! prependTCPHeader(tempPkt, -! TCP_ACK_YES, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_NO, -! TCP_FIN_NO); -! forwarding_send(tempPkt); -! tcp_change_state(TCP_STATE_ALMOST_CLOSING); -! } else if (containsControlBits(msg,TCP_ACK_YES,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_YES)) { -! //I receive FIN+ACK, I send ACK -! tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+1; -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! prependTCPHeader(tempPkt, -! TCP_ACK_YES, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_NO, -! TCP_FIN_NO); -! forwarding_send(tempPkt); -! tcp_change_state(TCP_STATE_ALMOST_TIME_WAIT); -! } else if (containsControlBits(msg,TCP_ACK_YES,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_NO)) { -! //I receive ACK, I will receive FIN later -! tcp_change_state(TCP_STATE_FIN_WAIT_2); -! } else { -! opentcp_reset(); -! openserial_printError(COMPONENT_OPENTCP,ERR_TCP_RESET, -! (errorparameter_t)tcp_vars.state, -! (errorparameter_t)5); -! } -! openqueue_freePacketBuffer(msg); -! break; -! -! case TCP_STATE_FIN_WAIT_2: //[receive] teardown -! if (containsControlBits(msg,TCP_ACK_WHATEVER,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_YES)) { -! //I receive FIN[+ACK], I send ACK -! tcp_vars.hisNextSeqNum = (packetfunctions_ntohl((uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)))+1; -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! return; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! prependTCPHeader(tempPkt, -! TCP_ACK_YES, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_NO, -! TCP_FIN_NO); -! forwarding_send(tempPkt); -! tcp_change_state(TCP_STATE_ALMOST_TIME_WAIT); -! } -! openqueue_freePacketBuffer(msg); -! break; -! -! case TCP_STATE_CLOSING: //[receive] teardown -! if (containsControlBits(msg,TCP_ACK_YES,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_NO)) { -! //I receive ACK, I do nothing -! tcp_change_state(TCP_STATE_TIME_WAIT); -! //TODO implement waiting timer -! opentcp_reset(); -! } -! openqueue_freePacketBuffer(msg); -! break; -! -! case TCP_STATE_LAST_ACK: //[receive] teardown -! if (containsControlBits(msg,TCP_ACK_YES,TCP_RST_NO,TCP_SYN_NO,TCP_FIN_NO)) { -! //I receive ACK, I reset -! opentcp_reset(); -! } -! openqueue_freePacketBuffer(msg); -! break; -! -! default: -! openserial_printError(COMPONENT_OPENTCP,ERR_WRONG_TCP_STATE, -! (errorparameter_t)tcp_vars.state, -! (errorparameter_t)4); -! break; -! } -! } -! -! owerror_t opentcp_close(void) { //[command] teardown -! OpenQueueEntry_t* tempPkt; -! if ( tcp_vars.state==TCP_STATE_ALMOST_CLOSE_WAIT || -! tcp_vars.state==TCP_STATE_CLOSE_WAIT || -! tcp_vars.state==TCP_STATE_ALMOST_LAST_ACK || -! tcp_vars.state==TCP_STATE_LAST_ACK || -! tcp_vars.state==TCP_STATE_CLOSED) { -! //not an error, can happen when distant node has already started tearing down -! return E_SUCCESS; -! } -! //I receive command 'close', I send FIN+ACK -! tempPkt = openqueue_getFreePacketBuffer(COMPONENT_OPENTCP); -! if (tempPkt==NULL) { -! openserial_printError(COMPONENT_OPENTCP,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return E_FAIL; -! } -! tempPkt->creator = COMPONENT_OPENTCP; -! tempPkt->owner = COMPONENT_OPENTCP; -! memcpy(&(tempPkt->l3_destinationAdd),&tcp_vars.hisIPv6Address,sizeof(open_addr_t)); -! prependTCPHeader(tempPkt, -! TCP_ACK_YES, -! TCP_PSH_NO, -! TCP_RST_NO, -! TCP_SYN_NO, -! TCP_FIN_YES); -! tcp_vars.mySeqNum++; -! tcp_change_state(TCP_STATE_ALMOST_FIN_WAIT_1); -! return forwarding_send(tempPkt); -! } -! -! bool tcp_debugPrint(void) { -! return FALSE; -! } -! -! //======= timer -! -! //timer used to reset state when TCP state machine is stuck -! void timers_tcp_fired(void) { -! opentcp_reset(); -! } -! -! //=========================== private ========================================= -! -! void prependTCPHeader(OpenQueueEntry_t* msg, -! bool ack, -! bool push, -! bool rst, -! bool syn, -! bool fin) { -! msg->l4_protocol = IANA_TCP; -! packetfunctions_reserveHeaderSize(msg,sizeof(tcp_ht)); -! packetfunctions_htons(tcp_vars.myPort ,(uint8_t*)&(((tcp_ht*)msg->payload)->source_port)); -! packetfunctions_htons(tcp_vars.hisPort ,(uint8_t*)&(((tcp_ht*)msg->payload)->destination_port)); -! packetfunctions_htonl(tcp_vars.mySeqNum ,(uint8_t*)&(((tcp_ht*)msg->payload)->sequence_number)); -! packetfunctions_htonl(tcp_vars.hisNextSeqNum ,(uint8_t*)&(((tcp_ht*)msg->payload)->ack_number)); -! ((tcp_ht*)msg->payload)->data_offset = TCP_DEFAULT_DATA_OFFSET; -! ((tcp_ht*)msg->payload)->control_bits = 0; -! if (ack==TCP_ACK_YES) { -! ((tcp_ht*)msg->payload)->control_bits |= 1 << TCP_ACK; -! } else { -! packetfunctions_htonl(0,(uint8_t*)&(((tcp_ht*)msg->payload)->ack_number)); -! } -! if (push==TCP_PSH_YES) { -! ((tcp_ht*)msg->payload)->control_bits |= 1 << TCP_PSH; -! } -! if (rst==TCP_RST_YES) { -! ((tcp_ht*)msg->payload)->control_bits |= 1 << TCP_RST; -! } -! if (syn==TCP_SYN_YES) { -! ((tcp_ht*)msg->payload)->control_bits |= 1 << TCP_SYN; -! } -! if (fin==TCP_FIN_YES) { -! ((tcp_ht*)msg->payload)->control_bits |= 1 << TCP_FIN; -! } -! packetfunctions_htons(TCP_DEFAULT_WINDOW_SIZE ,(uint8_t*)&(((tcp_ht*)msg->payload)->window_size)); -! packetfunctions_htons(TCP_DEFAULT_URGENT_POINTER ,(uint8_t*)&(((tcp_ht*)msg->payload)->urgent_pointer)); -! //calculate checksum last to take all header fields into account -! packetfunctions_calculateChecksum(msg,(uint8_t*)&(((tcp_ht*)msg->payload)->checksum)); -! } -! -! bool containsControlBits(OpenQueueEntry_t* msg, uint8_t ack, uint8_t rst, uint8_t syn, uint8_t fin) { -! bool return_value = TRUE; -! if (ack!=TCP_ACK_WHATEVER){ -! return_value = return_value && ((bool)( (((tcp_ht*)msg->payload)->control_bits >> TCP_ACK) & 0x01) == ack); -! } -! if (rst!=TCP_RST_WHATEVER){ -! return_value = return_value && ((bool)( (((tcp_ht*)msg->payload)->control_bits >> TCP_RST) & 0x01) == rst); -! } -! if (syn!=TCP_SYN_WHATEVER){ -! return_value = return_value && ((bool)( (((tcp_ht*)msg->payload)->control_bits >> TCP_SYN) & 0x01) == syn); -! } -! if (fin!=TCP_FIN_WHATEVER){ -! return_value = return_value && ((bool)( (((tcp_ht*)msg->payload)->control_bits >> TCP_FIN) & 0x01) == fin); -! } -! return return_value; -! } -! -! void opentcp_reset(void) { -! tcp_change_state(TCP_STATE_CLOSED); -! tcp_vars.mySeqNum = TCP_INITIAL_SEQNUM; -! tcp_vars.hisNextSeqNum = 0; -! tcp_vars.hisPort = 0; -! tcp_vars.hisIPv6Address.type = ADDR_NONE; -! tcp_vars.dataToSend = NULL; -! tcp_vars.dataReceived = NULL; -! openqueue_removeAllOwnedBy(COMPONENT_OPENTCP); -! } -! -! void tcp_change_state(uint8_t new_tcp_state) { -! tcp_vars.state = new_tcp_state; -! if (tcp_vars.state==TCP_STATE_CLOSED) { -! if (tcp_vars.timerStarted==TRUE) { -! opentimers_stop(tcp_vars.timerId); -! } -! } else { -! if (tcp_vars.timerStarted==FALSE) { -! tcp_vars.timerId = opentimers_start(TCP_TIMEOUT, -! TIMER_ONESHOT,TIME_MS, -! opentcp_timer_cb); -! tcp_vars.timerStarted=TRUE; -! } -! -! } -! } -! -! void opentcp_timer_cb(void) { -! scheduler_push_task(timers_tcp_fired,TASKPRIO_TCP_TIMEOUT); -! /*thread_create(openwsn_opentcp_stack, KERNEL_CONF_STACKSIZE_MAIN, -! PRIORITY_OPENWSN_OPENTCP, CREATE_STACKTEST, -! timers_tcp_fired, "timers tcp fired");*/ - } -\ No newline at end of file -diff -crB openwsn/04-TRAN/opentcp.h ../../../sys/net/openwsn/04-TRAN/opentcp.h -*** openwsn/04-TRAN/opentcp.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/04-TRAN/opentcp.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,118 **** -! #ifndef __OPENTCP_H -! #define __OPENTCP_H -! -! /** -! \addtogroup Transport -! \{ -! \addtogroup TCP -! \{ -! */ -! -! //=========================== define ========================================== -! -! enum { -! TCP_INITIAL_SEQNUM = 100, -! TCP_TIMEOUT = 1500, //in ms -! }; -! -! enum TCP_STATE_enums { -! //listen state is not declared but emulated by a closed state with shouldIlisten==TRUE -! TCP_STATE_CLOSED = 0, -! TCP_STATE_ALMOST_SYN_RECEIVED = 1, -! TCP_STATE_SYN_RECEIVED = 2, -! TCP_STATE_ALMOST_SYN_SENT = 3, -! TCP_STATE_SYN_SENT = 4, -! TCP_STATE_ALMOST_ESTABLISHED = 5, -! TCP_STATE_ESTABLISHED = 6, -! TCP_STATE_ALMOST_DATA_SENT = 7, -! TCP_STATE_DATA_SENT = 8, -! TCP_STATE_ALMOST_DATA_RECEIVED = 9, -! TCP_STATE_ALMOST_FIN_WAIT_1 = 10, -! TCP_STATE_FIN_WAIT_1 = 11, -! TCP_STATE_ALMOST_CLOSING = 12, -! TCP_STATE_CLOSING = 13, -! TCP_STATE_FIN_WAIT_2 = 14, -! TCP_STATE_ALMOST_TIME_WAIT = 15, -! TCP_STATE_TIME_WAIT = 16, -! TCP_STATE_ALMOST_CLOSE_WAIT = 17, -! TCP_STATE_CLOSE_WAIT = 18, -! TCP_STATE_ALMOST_LAST_ACK = 19, -! TCP_STATE_LAST_ACK = 20, -! }; -! -! enum TCP_DEFAULTS_enum{ -! TCP_DEFAULT_DATA_OFFSET = 0x50, -! TCP_DEFAULT_WINDOW_SIZE = 48, -! TCP_DEFAULT_URGENT_POINTER = 0x0000, -! }; -! -! enum TCP_ACK_FLAG_enum { -! TCP_ACK_WHATEVER = 2, -! TCP_ACK_YES = 1, -! TCP_ACK_NO = 0, -! }; -! -! enum TCP_PSH_FLAG_enum { -! TCP_PSH_WHATEVER = 2, -! TCP_PSH_YES = 1, -! TCP_PSH_NO = 0, -! }; -! -! enum TCP_RST_FLAG_enum { -! TCP_RST_WHATEVER = 2, -! TCP_RST_YES = 1, -! TCP_RST_NO = 0, -! }; -! -! enum TCP_SYN_FLAG_enum { -! TCP_SYN_WHATEVER = 2, -! TCP_SYN_YES = 1, -! TCP_SYN_NO = 0, -! }; -! -! enum TCP_FIN_FLAG_enum { -! TCP_FIN_WHATEVER = 2, -! TCP_FIN_YES = 1, -! TCP_FIN_NO = 0, -! }; -! -! enum TCP_FLAG_POSITIONS_enum { -! TCP_ACK = 4, -! TCP_PSH = 3, -! TCP_RST = 2, -! TCP_SYN = 1, -! TCP_FIN = 0, -! }; -! -! //=========================== typedef ========================================= -! -! typedef struct { -! uint16_t source_port; -! uint16_t destination_port; -! uint32_t sequence_number; -! uint32_t ack_number; -! uint8_t data_offset; -! uint8_t control_bits; -! uint16_t window_size; -! uint16_t checksum; -! uint16_t urgent_pointer; -! } tcp_ht; -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void opentcp_init(); -! error_t opentcp_connect(open_addr_t* dest, uint16_t param_hisPort, uint16_t param_myPort); -! error_t opentcp_send(OpenQueueEntry_t* msg); -! void opentcp_sendDone(OpenQueueEntry_t* msg, error_t error); -! void opentcp_receive(OpenQueueEntry_t* msg); -! error_t opentcp_close(); -! bool opentcp_debugPrint(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,133 ---- -! #ifndef __OPENTCP_H -! #define __OPENTCP_H -! -! /** -! \addtogroup Transport -! \{ -! \addtogroup OpenTcp -! \{ -! */ -! -! #include "opentimers.h" -! -! //=========================== define ========================================== -! -! enum { -! TCP_INITIAL_SEQNUM = 100, -! TCP_TIMEOUT = 1500, //in ms -! }; -! -! enum TCP_STATE_enums { -! //listen state is not declared but emulated by a closed state with shouldIlisten==TRUE -! TCP_STATE_CLOSED = 0, -! TCP_STATE_ALMOST_SYN_RECEIVED = 1, -! TCP_STATE_SYN_RECEIVED = 2, -! TCP_STATE_ALMOST_SYN_SENT = 3, -! TCP_STATE_SYN_SENT = 4, -! TCP_STATE_ALMOST_ESTABLISHED = 5, -! TCP_STATE_ESTABLISHED = 6, -! TCP_STATE_ALMOST_DATA_SENT = 7, -! TCP_STATE_DATA_SENT = 8, -! TCP_STATE_ALMOST_DATA_RECEIVED = 9, -! TCP_STATE_ALMOST_FIN_WAIT_1 = 10, -! TCP_STATE_FIN_WAIT_1 = 11, -! TCP_STATE_ALMOST_CLOSING = 12, -! TCP_STATE_CLOSING = 13, -! TCP_STATE_FIN_WAIT_2 = 14, -! TCP_STATE_ALMOST_TIME_WAIT = 15, -! TCP_STATE_TIME_WAIT = 16, -! TCP_STATE_ALMOST_CLOSE_WAIT = 17, -! TCP_STATE_CLOSE_WAIT = 18, -! TCP_STATE_ALMOST_LAST_ACK = 19, -! TCP_STATE_LAST_ACK = 20, -! }; -! -! enum TCP_DEFAULTS_enum{ -! TCP_DEFAULT_DATA_OFFSET = 0x50, -! TCP_DEFAULT_WINDOW_SIZE = 48, -! TCP_DEFAULT_URGENT_POINTER = 0x0000, -! }; -! -! enum TCP_ACK_FLAG_enum { -! TCP_ACK_WHATEVER = 2, -! TCP_ACK_YES = 1, -! TCP_ACK_NO = 0, -! }; -! -! enum TCP_PSH_FLAG_enum { -! TCP_PSH_WHATEVER = 2, -! TCP_PSH_YES = 1, -! TCP_PSH_NO = 0, -! }; -! -! enum TCP_RST_FLAG_enum { -! TCP_RST_WHATEVER = 2, -! TCP_RST_YES = 1, -! TCP_RST_NO = 0, -! }; -! -! enum TCP_SYN_FLAG_enum { -! TCP_SYN_WHATEVER = 2, -! TCP_SYN_YES = 1, -! TCP_SYN_NO = 0, -! }; -! -! enum TCP_FIN_FLAG_enum { -! TCP_FIN_WHATEVER = 2, -! TCP_FIN_YES = 1, -! TCP_FIN_NO = 0, -! }; -! -! enum TCP_FLAG_POSITIONS_enum { -! TCP_ACK = 4, -! TCP_PSH = 3, -! TCP_RST = 2, -! TCP_SYN = 1, -! TCP_FIN = 0, -! }; -! -! //=========================== typedef ========================================= -! -! typedef struct { -! uint16_t source_port; -! uint16_t destination_port; -! uint32_t sequence_number; -! uint32_t ack_number; -! uint8_t data_offset; -! uint8_t control_bits; -! uint16_t window_size; -! uint16_t checksum; -! uint16_t urgent_pointer; -! } tcp_ht; -! -! //=========================== module variables ================================ -! -! typedef struct { -! uint8_t state; -! uint32_t mySeqNum; -! uint16_t myPort; -! uint32_t hisNextSeqNum; -! uint16_t hisPort; -! open_addr_t hisIPv6Address; -! OpenQueueEntry_t* dataToSend; -! OpenQueueEntry_t* dataReceived; -! bool timerStarted; -! opentimer_id_t timerId; -! } tcp_vars_t; -! -! //=========================== prototypes ====================================== -! -! void opentcp_init(void); -! owerror_t opentcp_connect(open_addr_t* dest, uint16_t param_hisPort, uint16_t param_myPort); -! owerror_t opentcp_send(OpenQueueEntry_t* msg); -! void opentcp_sendDone(OpenQueueEntry_t* msg, owerror_t error); -! void opentcp_receive(OpenQueueEntry_t* msg); -! owerror_t opentcp_close(void); -! bool opentcp_debugPrint(void); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/04-TRAN/openudp.c ../../../sys/net/openwsn/04-TRAN/openudp.c -*** openwsn/04-TRAN/openudp.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/04-TRAN/openudp.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,158 **** -! #include "openwsn.h" -! #include "openudp.h" -! #include "openserial.h" -! #include "packetfunctions.h" -! #include "forwarding.h" -! #include "openqueue.h" -! //UDP applications -! #include "opencoap.h" -! #include "udpecho.h" -! #include "udpinject.h" -! #include "udpprint.h" -! #include "udprand.h" -! #include "udpstorm.h" -! #include "udplatency.h" -! //#include "heli.h" -! //#include "imu.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void openudp_init() { -! } -! -! error_t openudp_send(OpenQueueEntry_t* msg) { -! msg->owner = COMPONENT_OPENUDP; -! msg->l4_protocol = IANA_UDP; -! msg->l4_payload = msg->payload; -! msg->l4_length = msg->length; -! packetfunctions_reserveHeaderSize(msg,sizeof(udp_ht)); -! packetfunctions_htons(msg->l4_sourcePortORicmpv6Type,&(msg->payload[0])); -! packetfunctions_htons(msg->l4_destination_port,&(msg->payload[2])); -! packetfunctions_htons(msg->length,&(msg->payload[4])); -! packetfunctions_calculateChecksum(msg,(uint8_t*)&(((udp_ht*)msg->payload)->checksum)); -! return forwarding_send(msg); -! } -! -! void openudp_sendDone(OpenQueueEntry_t* msg, error_t error) { -! msg->owner = COMPONENT_OPENUDP; -! switch(msg->l4_sourcePortORicmpv6Type) { -! case WKP_UDP_COAP: -! opencoap_sendDone(msg,error); -! break; -! /* -! case WKP_UDP_HELI: -! appudpheli_sendDone(msg,error); -! break; -! case WKP_UDP_IMU: -! appudpgina_sendDone(msg,error); -! break; -! */ -! case WKP_UDP_ECHO: -! udpecho_sendDone(msg,error); -! break; -! case WKP_UDP_INJECT: -! udpinject_sendDone(msg,error); -! break; -! case WKP_UDP_DISCARD: -! udpprint_sendDone(msg,error); -! break; -! case WKP_UDP_RAND: -! udprand_sendDone(msg,error); -! break; -! case WKP_UDP_LATENCY: -! udplatency_sendDone(msg,error); -! break; -! -! default: -! openserial_printError(COMPONENT_OPENUDP,ERR_UNSUPPORTED_PORT_NUMBER, -! (errorparameter_t)msg->l4_sourcePortORicmpv6Type, -! (errorparameter_t)5); -! openqueue_freePacketBuffer(msg); -! } -! } -! -! void openudp_receive(OpenQueueEntry_t* msg) { -! uint8_t temp_8b; -! -! msg->owner = COMPONENT_OPENUDP; -! if (msg->l4_protocol_compressed==TRUE) { -! // get the UDP header encoding byte -! temp_8b = *((uint8_t*)(msg->payload)); -! packetfunctions_tossHeader(msg,sizeof(temp_8b)); -! switch (temp_8b & NHC_UDP_PORTS_MASK) { -! case NHC_UDP_PORTS_INLINE: -! // source port: 16 bits in-line -! // dest port: 16 bits in-line -! msg->l4_sourcePortORicmpv6Type = msg->payload[0]*256+msg->payload[1]; -! msg->l4_destination_port = msg->payload[2]*256+msg->payload[3]; -! packetfunctions_tossHeader(msg,2+2); -! break; -! case NHC_UDP_PORTS_16S_8D: -! // source port: 16 bits in-line -! // dest port: 0xf0 + 8 bits in-line -! msg->l4_sourcePortORicmpv6Type = msg->payload[0]*256+msg->payload[1]; -! msg->l4_destination_port = 0xf000 + msg->payload[2]; -! packetfunctions_tossHeader(msg,2+1); -! break; -! case NHC_UDP_PORTS_8S_8D: -! // source port: 0xf0 + 8 bits in-line -! // dest port: 0xf0 + 8 bits in-line -! msg->l4_sourcePortORicmpv6Type = 0xf000 + msg->payload[0]; -! msg->l4_destination_port = 0xf000 + msg->payload[1]; -! packetfunctions_tossHeader(msg,1+1); -! break; -! case NHC_UDP_PORTS_4S_4D: -! // source port: 0xf0b + 4 bits in-line -! // dest port: 0xf0b + 4 bits in-line -! msg->l4_sourcePortORicmpv6Type = 0xf0b0 + (msg->payload[0] >> 4) & 0x0f; -! msg->l4_destination_port = 0xf0b0 + (msg->payload[0] >> 0) & 0x0f; -! packetfunctions_tossHeader(msg,1); -! break; -! } -! } else { -! msg->l4_sourcePortORicmpv6Type = msg->payload[0]*256+msg->payload[1]; -! msg->l4_destination_port = msg->payload[2]*256+msg->payload[3]; -! packetfunctions_tossHeader(msg,sizeof(udp_ht)); -! } -! -! switch(msg->l4_destination_port) { -! case WKP_UDP_COAP: -! opencoap_receive(msg); -! break; -! /* -! case WKP_UDP_HELI: -! appudpheli_receive(msg); -! break; -! case WKP_UDP_IMU: -! imu_receive(msg); -! break; -! */ -! case WKP_UDP_ECHO: -! udpecho_receive(msg); -! break; -! case WKP_UDP_INJECT: -! udpinject_receive(msg); -! break; -! case WKP_UDP_DISCARD: -! udpprint_receive(msg); -! break; -! case WKP_UDP_RAND: -! udprand_receive(msg); -! break; -! default: -! openserial_printError(COMPONENT_OPENUDP,ERR_UNSUPPORTED_PORT_NUMBER, -! (errorparameter_t)msg->l4_destination_port, -! (errorparameter_t)6); -! openqueue_freePacketBuffer(msg); -! } -! } -! -! bool openudp_debugPrint() { -! return FALSE; -! } -! -! //=========================== private ========================================= ---- 1,158 ---- -! #include "openwsn.h" -! #include "openudp.h" -! #include "openserial.h" -! #include "packetfunctions.h" -! #include "forwarding.h" -! #include "openqueue.h" -! //UDP applications -! #include "opencoap.h" -! #include "udpecho.h" -! #include "udpinject.h" -! #include "udpprint.h" -! #include "udprand.h" -! #include "udpstorm.h" -! #include "udplatency.h" -! //#include "heli.h" -! //#include "imu.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void openudp_init(void) { -! } -! -! owerror_t openudp_send(OpenQueueEntry_t* msg) { -! msg->owner = COMPONENT_OPENUDP; -! msg->l4_protocol = IANA_UDP; -! msg->l4_payload = msg->payload; -! msg->l4_length = msg->length; -! packetfunctions_reserveHeaderSize(msg,sizeof(udp_ht)); -! packetfunctions_htons(msg->l4_sourcePortORicmpv6Type,&(msg->payload[0])); -! packetfunctions_htons(msg->l4_destination_port,&(msg->payload[2])); -! packetfunctions_htons(msg->length,&(msg->payload[4])); -! packetfunctions_calculateChecksum(msg,(uint8_t*)&(((udp_ht*)msg->payload)->checksum)); -! return forwarding_send(msg); -! } -! -! void openudp_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! msg->owner = COMPONENT_OPENUDP; -! switch(msg->l4_sourcePortORicmpv6Type) { -! case WKP_UDP_COAP: -! opencoap_sendDone(msg,error); -! break; -! /* -! case WKP_UDP_HELI: -! appudpheli_sendDone(msg,error); -! break; -! case WKP_UDP_IMU: -! appudpgina_sendDone(msg,error); -! break; -! */ -! case WKP_UDP_ECHO: -! udpecho_sendDone(msg,error); -! break; -! case WKP_UDP_INJECT: -! udpinject_sendDone(msg,error); -! break; -! case WKP_UDP_DISCARD: -! udpprint_sendDone(msg,error); -! break; -! case WKP_UDP_RAND: -! udprand_sendDone(msg,error); -! break; -! case WKP_UDP_LATENCY: -! udplatency_sendDone(msg,error); -! break; -! -! default: -! openserial_printError(COMPONENT_OPENUDP,ERR_UNSUPPORTED_PORT_NUMBER, -! (errorparameter_t)msg->l4_sourcePortORicmpv6Type, -! (errorparameter_t)5); -! openqueue_freePacketBuffer(msg); -! } -! } -! -! void openudp_receive(OpenQueueEntry_t* msg) { -! uint8_t temp_8b; -! -! msg->owner = COMPONENT_OPENUDP; -! if (msg->l4_protocol_compressed==TRUE) { -! // get the UDP header encoding byte -! temp_8b = *((uint8_t*)(msg->payload)); -! packetfunctions_tossHeader(msg,sizeof(temp_8b)); -! switch (temp_8b & NHC_UDP_PORTS_MASK) { -! case NHC_UDP_PORTS_INLINE: -! // source port: 16 bits in-line -! // dest port: 16 bits in-line -! msg->l4_sourcePortORicmpv6Type = msg->payload[0]*256+msg->payload[1]; -! msg->l4_destination_port = msg->payload[2]*256+msg->payload[3]; -! packetfunctions_tossHeader(msg,2+2); -! break; -! case NHC_UDP_PORTS_16S_8D: -! // source port: 16 bits in-line -! // dest port: 0xf0 + 8 bits in-line -! msg->l4_sourcePortORicmpv6Type = msg->payload[0]*256+msg->payload[1]; -! msg->l4_destination_port = 0xf000 + msg->payload[2]; -! packetfunctions_tossHeader(msg,2+1); -! break; -! case NHC_UDP_PORTS_8S_8D: -! // source port: 0xf0 + 8 bits in-line -! // dest port: 0xf0 + 8 bits in-line -! msg->l4_sourcePortORicmpv6Type = 0xf000 + msg->payload[0]; -! msg->l4_destination_port = 0xf000 + msg->payload[1]; -! packetfunctions_tossHeader(msg,1+1); -! break; -! case NHC_UDP_PORTS_4S_4D: -! // source port: 0xf0b + 4 bits in-line -! // dest port: 0xf0b + 4 bits in-line -! msg->l4_sourcePortORicmpv6Type = 0xf0b0 + ((msg->payload[0] >> 4) & 0x0f); -! msg->l4_destination_port = 0xf0b0 + ((msg->payload[0] >> 0) & 0x0f); -! packetfunctions_tossHeader(msg,1); -! break; -! } -! } else { -! msg->l4_sourcePortORicmpv6Type = msg->payload[0]*256+msg->payload[1]; -! msg->l4_destination_port = msg->payload[2]*256+msg->payload[3]; -! packetfunctions_tossHeader(msg,sizeof(udp_ht)); -! } -! -! switch(msg->l4_destination_port) { -! case WKP_UDP_COAP: -! opencoap_receive(msg); -! break; -! /* -! case WKP_UDP_HELI: -! appudpheli_receive(msg); -! break; -! case WKP_UDP_IMU: -! imu_receive(msg); -! break; -! */ -! case WKP_UDP_ECHO: -! udpecho_receive(msg); -! break; -! case WKP_UDP_INJECT: -! udpinject_receive(msg); -! break; -! case WKP_UDP_DISCARD: -! udpprint_receive(msg); -! break; -! case WKP_UDP_RAND: -! udprand_receive(msg); -! break; -! default: -! openserial_printError(COMPONENT_OPENUDP,ERR_UNSUPPORTED_PORT_NUMBER, -! (errorparameter_t)msg->l4_destination_port, -! (errorparameter_t)6); -! openqueue_freePacketBuffer(msg); -! } -! } -! -! bool openudp_debugPrint(void) { -! return FALSE; -! } -! -! //=========================== private ========================================= -diff -crB openwsn/04-TRAN/openudp.h ../../../sys/net/openwsn/04-TRAN/openudp.h -*** openwsn/04-TRAN/openudp.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/04-TRAN/openudp.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,59 **** -! #ifndef __OPENUDP_H -! #define __OPENUDP_H -! -! /** -! \addtogroup Transport -! \{ -! \addtogroup UDP -! \{ -! */ -! -! //=========================== define ========================================== -! -! enum UDP_enums { -! UDP_ID = 3, -! UDP_CHECKSUM = 2, -! UDP_PORTS = 0, -! }; -! -! enum UDP_ID_enums { -! UDP_ID_DEFAULT = 0x1E, -! }; -! -! enum UDP_CHECKSUM_enums { -! UDP_CHECKSUM_INLINE = 0, -! UDP_CHECKSUM_ELIDED = 1, -! }; -! -! enum UDP_PORTS_enums { -! UDP_PORTS_16b_SRC_16b_DEST_INLINE = 0, -! UDP_PORTS_16b_SRC_8b_DEST_INLINE = 1, -! UDP_PORTS_8b_SRC_16b_DEST_INLINE = 2, -! UDP_PORTS_4b_SRC_4b_DEST_INLINE = 3, -! }; -! -! //=========================== typedef ========================================= -! -! typedef struct { -! uint16_t port_src; -! uint16_t port_dest; -! uint16_t length; -! uint16_t checksum; -! } udp_ht; -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void openudp_init(); -! error_t openudp_send(OpenQueueEntry_t* msg); -! void openudp_sendDone(OpenQueueEntry_t* msg, error_t error); -! void openudp_receive(OpenQueueEntry_t* msg); -! bool openudp_debugPrint(); -! -! /** -! \} -! \} -! */ -! - #endif -\ No newline at end of file ---- 1,59 ---- -! #ifndef __OPENUDP_H -! #define __OPENUDP_H -! -! /** -! \addtogroup Transport -! \{ -! \addtogroup OpenUdp -! \{ -! */ -! -! //=========================== define ========================================== -! -! enum UDP_enums { -! UDP_ID = 3, -! UDP_CHECKSUM = 2, -! UDP_PORTS = 0, -! }; -! -! enum UDP_ID_enums { -! UDP_ID_DEFAULT = 0x1E, -! }; -! -! enum UDP_CHECKSUM_enums { -! UDP_CHECKSUM_INLINE = 0, -! UDP_CHECKSUM_ELIDED = 1, -! }; -! -! enum UDP_PORTS_enums { -! UDP_PORTS_16b_SRC_16b_DEST_INLINE = 0, -! UDP_PORTS_16b_SRC_8b_DEST_INLINE = 1, -! UDP_PORTS_8b_SRC_16b_DEST_INLINE = 2, -! UDP_PORTS_4b_SRC_4b_DEST_INLINE = 3, -! }; -! -! //=========================== typedef ========================================= -! -! typedef struct { -! uint16_t port_src; -! uint16_t port_dest; -! uint16_t length; -! uint16_t checksum; -! } udp_ht; -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void openudp_init(void); -! owerror_t openudp_send(OpenQueueEntry_t* msg); -! void openudp_sendDone(OpenQueueEntry_t* msg, owerror_t error); -! void openudp_receive(OpenQueueEntry_t* msg); -! bool openudp_debugPrint(void); -! -! /** -! \} -! \} -! */ -! - #endif -\ No newline at end of file -diff -crB openwsn/04-TRAN/rsvp.c ../../../sys/net/openwsn/04-TRAN/rsvp.c -*** openwsn/04-TRAN/rsvp.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/04-TRAN/rsvp.c Wed Jan 15 13:48:27 2014 -*************** -*** 17,27 **** - uint8_t rsvp_timer_id; - }rsvp_vars_t; - -! void rsvp_timer_cb(); - - rsvp_vars_t rsvp_vars; - -! void rsvp_init(){ - rsvp_vars.rsvp_period = 0; - rsvp_vars.rsvp_timer_id = 0; - } ---- 17,27 ---- - uint8_t rsvp_timer_id; - }rsvp_vars_t; - -! void rsvp_timer_cb(void); - - rsvp_vars_t rsvp_vars; - -! void rsvp_init(void){ - rsvp_vars.rsvp_period = 0; - rsvp_vars.rsvp_timer_id = 0; - } -*************** -*** 35,42 **** - void rsvp_qos_request(uint8_t bandwith, uint16_t refresh_period, open_addr_t dest){ - - OpenQueueEntry_t* pkt; -! error_t outcome; - uint8_t i,j; - - pkt = openqueue_getFreePacketBuffer(COMPONENT_RSVP); - if (pkt==NULL) { ---- 35,46 ---- - void rsvp_qos_request(uint8_t bandwith, uint16_t refresh_period, open_addr_t dest){ - - OpenQueueEntry_t* pkt; -! owerror_t outcome; - uint8_t i,j; -+ -+ (void)outcome; -+ (void)i; -+ (void)j; - - pkt = openqueue_getFreePacketBuffer(COMPONENT_RSVP); - if (pkt==NULL) { -diff -crB openwsn/04-TRAN/rsvp.h ../../../sys/net/openwsn/04-TRAN/rsvp.h -*** openwsn/04-TRAN/rsvp.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/04-TRAN/rsvp.h Wed Jan 15 13:48:27 2014 -*************** -*** 157,163 **** - - - -! void rsvp_init(); - void rsvp_qos_request(uint8_t bandwith, uint16_t refresh_period,open_addr_t dest); - - #endif ---- 157,163 ---- - - - -! void rsvp_init(void); - void rsvp_qos_request(uint8_t bandwith, uint16_t refresh_period,open_addr_t dest); - - #endif -diff -crB openwsn/07-App/Makefile ../../../sys/net/openwsn/07-App/Makefile -*** openwsn/07-App/Makefile Wed Jan 15 13:55:34 2014 ---- ../../../sys/net/openwsn/07-App/Makefile Wed Jan 15 13:48:27 2014 -*************** -*** 0 **** ---- 1,49 ---- -+ SUBMOD:=$(shell basename $(CURDIR)).a -+ #BINDIR = $(RIOTBASE)/bin/ -+ SRC = $(wildcard *.c) -+ OBJ = $(SRC:%.c=$(BINDIR)%.o) -+ DEP = $(SRC:%.c=$(BINDIR)%.d) -+ -+ INCLUDES += -I$(RIOTBASE) -I$(RIOTBASE)/sys/include -I$(RIOTBASE)/core/include -I$(RIOTBASE)/drivers/include -I$(RIOTBASE)/drivers/cc110x_ng/include -I$(RIOTBASE)/cpu/arm_common/include -I$(RIOTBASE)/sys/net/include/ -+ INCLUDES += -I$(CURDIR)/02a-MAClow -+ INCLUDES += -I$(CURDIR)/02b-MAChigh -+ INCLUDES += -I$(CURDIR)/03a-IPHC -+ INCLUDES += -I$(CURDIR)/03b-IPv6 -+ INCLUDES += -I$(CURDIR)/04-TRAN -+ INCLUDES += -I$(CURDIR)/07-App/ohlone -+ INCLUDES += -I$(CURDIR)/07-App/tcpecho -+ INCLUDES += -I$(CURDIR)/07-App/tcpinject -+ INCLUDES += -I$(CURDIR)/07-App/tcpprint -+ INCLUDES += -I$(CURDIR)/cross-layers -+ -+ DIRS += rinfo -+ DIRS += rwellknown -+ DIRS += ohlone -+ DIRS += tcpecho -+ DIRS += tcpinject -+ DIRS += tcpprint -+ DIRS += udpecho -+ DIRS += udpinject -+ DIRS += udplatency -+ DIRS += udpprint -+ DIRS += udprand -+ DIRS += udpstorm -+ -+ all: $(BINDIR)$(SUBMOD) -+ @for i in $(DIRS) ; do "$(MAKE)" -C $$i || exit 1; done ; -+ -+ $(BINDIR)$(SUBMOD): $(OBJ) -+ $(AD)$(AR) rcs $(BINDIR)$(MODULE) $(OBJ) -+ -+ # pull in dependency info for *existing* .o files -+ -include $(OBJ:.o=.d) -+ -+ # compile and generate dependency info -+ $(BINDIR)%.o: %.c -+ mkdir -p $(BINDIR) -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d -+ @printf "$(BINDIR)"|cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d -+ -+ clean:: -+ @for i in $(DIRS) ; do "$(MAKE)" -C $$i clean || exit 1; done ; -diff -crB openwsn/07-App/heli/heli.c ../../../sys/net/openwsn/07-App/heli/heli.c -*** openwsn/07-App/heli/heli.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/heli/heli.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,87 **** -! #include "openwsn.h" -! #include "heli.h" -! //openwsn stack -! #include "openudp.h" -! #include "openqueue.h" -! #include "openserial.h" -! #include "packetfunctions.h" -! -! #define MOTORPERIOD 100 -! #define MOTORMAX MOTORPERIOD -! #define MOTORMIN 0 -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void heli_setmotor(uint8_t which, uint16_t value); -! uint16_t heli_threshold(uint16_t value); -! -! //=========================== public ========================================== -! -! void heli_init() { -! P1DIR |= 0x0C; // P1.2,3 output -! P1SEL |= 0x0C; // P1.2,3 in PWM mode -! TACTL = TBSSEL_1 + ID_3 + MC_1; // ACLK, count up to TACCR0 -! TACCR0 = MOTORPERIOD; // ~320 Hz frequency -! TACCTL1 = OUTMOD_7; -! TACCR1 = MOTORMIN; -! TACCTL2 = OUTMOD_7; -! TACCR2 = MOTORMIN; -! } -! -! //this is called when the corresponding button is pressed on the OpenVisualizer interface -! void heli_trigger() { -! } -! -! uint16_t heli_threshold(uint16_t value) { -! /*if (value < MOTORMIN) { //causes warning because set to zero -! return MOTORMIN; -! }*/ -! if (value > MOTORMAX) { -! return MOTORMAX; -! } -! return value; -! } -! -! //I just received a request -! void heli_receive(OpenQueueEntry_t* msg) { -! msg->owner = COMPONENT_HELI; -! if (msg->length==4) { -! heli_setmotor(1,heli_threshold(packetfunctions_ntohs(&(msg->payload[0])))); -! heli_setmotor(2,heli_threshold(packetfunctions_ntohs(&(msg->payload[2])))); -! } -! openqueue_freePacketBuffer(msg); -! } -! -! //I just sent a IMU packet, check I need to resend one -! void heli_sendDone(OpenQueueEntry_t* msg, error_t error) { -! msg->owner = COMPONENT_HELI; -! if (msg->creator!=COMPONENT_HELI) { -! openserial_printError(COMPONENT_HELI,ERR_SENDDONE_FOR_MSG_I_DID_NOT_SEND,0,0); -! } -! openqueue_freePacketBuffer(msg); -! } -! -! bool heli_debugPrint() { -! return FALSE; -! } -! -! //=========================== private ========================================= -! -! void heli_setmotor(uint8_t which, uint16_t value) { -! /*if (value < MOTORMIN) { -! value = MOTORMIN; -! }*/ -! if (value > MOTORMAX) { -! value = MOTORMAX; -! } -! switch (which) { -! case 1: -! TACCR1 = value; -! break; -! case 2: -! TACCR2 = value; -! break; -! } -! } ---- 1,87 ---- -! #include "openwsn.h" -! #include "heli.h" -! //openwsn stack -! #include "openudp.h" -! #include "openqueue.h" -! #include "openserial.h" -! #include "packetfunctions.h" -! -! #define MOTORPERIOD 100 -! #define MOTORMAX MOTORPERIOD -! #define MOTORMIN 0 -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void heli_setmotor(uint8_t which, uint16_t value); -! uint16_t heli_threshold(uint16_t value); -! -! //=========================== public ========================================== -! -! void heli_init() { -! P1DIR |= 0x0C; // P1.2,3 output -! P1SEL |= 0x0C; // P1.2,3 in PWM mode -! TACTL = TBSSEL_1 + ID_3 + MC_1; // ACLK, count up to TACCR0 -! TACCR0 = MOTORPERIOD; // ~320 Hz frequency -! TACCTL1 = OUTMOD_7; -! TACCR1 = MOTORMIN; -! TACCTL2 = OUTMOD_7; -! TACCR2 = MOTORMIN; -! } -! -! //this is called when the corresponding button is pressed on the OpenVisualizer interface -! void heli_trigger() { -! } -! -! uint16_t heli_threshold(uint16_t value) { -! /*if (value < MOTORMIN) { //causes warning because set to zero -! return MOTORMIN; -! }*/ -! if (value > MOTORMAX) { -! return MOTORMAX; -! } -! return value; -! } -! -! //I just received a request -! void heli_receive(OpenQueueEntry_t* msg) { -! msg->owner = COMPONENT_HELI; -! if (msg->length==4) { -! heli_setmotor(1,heli_threshold(packetfunctions_ntohs(&(msg->payload[0])))); -! heli_setmotor(2,heli_threshold(packetfunctions_ntohs(&(msg->payload[2])))); -! } -! openqueue_freePacketBuffer(msg); -! } -! -! //I just sent a IMU packet, check I need to resend one -! void heli_sendDone(OpenQueueEntry_t* msg, error_t error) { -! msg->owner = COMPONENT_HELI; -! if (msg->creator!=COMPONENT_HELI) { -! openserial_printError(COMPONENT_HELI,ERR_SENDDONE_FOR_MSG_I_DID_NOT_SEND,0,0); -! } -! openqueue_freePacketBuffer(msg); -! } -! -! bool heli_debugPrint() { -! return FALSE; -! } -! -! //=========================== private ========================================= -! -! void heli_setmotor(uint8_t which, uint16_t value) { -! /*if (value < MOTORMIN) { -! value = MOTORMIN; -! }*/ -! if (value > MOTORMAX) { -! value = MOTORMAX; -! } -! switch (which) { -! case 1: -! TACCR1 = value; -! break; -! case 2: -! TACCR2 = value; -! break; -! } -! } -diff -crB openwsn/07-App/heli/heli.h ../../../sys/net/openwsn/07-App/heli/heli.h -*** openwsn/07-App/heli/heli.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/heli/heli.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,30 **** -! #ifndef __HELI_H -! #define __HELI_H -! -! /** -! \addtogroup App -! \{ -! \addtogroup Heli -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void heli_init(); -! void heli_trigger(); -! void heli_sendDone(OpenQueueEntry_t* msg, error_t error); -! void heli_receive(OpenQueueEntry_t* msg); -! bool heli_debugPrint(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,32 ---- -! #ifndef __HELI_H -! #define __HELI_H -! -! /** -! \addtogroup AppUdp -! \{ -! \addtogroup Heli -! \{ -! */ -! -! -! #include "openwsn.h" -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void heli_init(); -! void heli_trigger(); -! void heli_sendDone(OpenQueueEntry_t* msg, owerror_t error); -! void heli_receive(OpenQueueEntry_t* msg); -! bool heli_debugPrint(); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/07-App/heli/heli.py ../../../sys/net/openwsn/07-App/heli/heli.py -*** openwsn/07-App/heli/heli.py Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/heli/heli.py Wed Jan 15 13:48:27 2014 -*************** -*** 1,185 **** -! import socket -! import binascii -! import time -! import os -! import Tkinter -! import sys -! -! MOTOR_MAX = 800 -! MOTOR_MIN = 0 -! MOTOR_STEP = 10 -! -! myAddress = '' # means 'any suitable interface' -! myPort = 2158 -! hisAddress = '2001:470:1f05:dff:1415:9209:22b:51' -! hisPort = 2192 -! -! motor1_command = 0 -! motor2_command = 0 -! -! print "Testing heli..." -! -! def heli_up(): -! global motor1_command, motor2_command -! if (motor1_command+MOTOR_STEP<=MOTOR_MAX and motor2_command+MOTOR_STEP<=MOTOR_MAX): -! motor1_command += MOTOR_STEP -! motor2_command += MOTOR_STEP -! sendCommand() -! -! def heli_down(): -! global motor1_command, motor2_command -! if (motor1_command-MOTOR_STEP>=MOTOR_MIN and motor2_command-MOTOR_STEP>=MOTOR_MIN): -! motor1_command -= MOTOR_STEP -! motor2_command -= MOTOR_STEP -! sendCommand() -! -! def heli_left(): -! global motor1_command -! if (motor1_command+MOTOR_STEP<=MOTOR_MAX): -! motor1_command += MOTOR_STEP -! sendCommand() -! -! def heli_right(): -! global motor1_command -! if (motor1_command-MOTOR_STEP>=MOTOR_MIN): -! motor1_command -= MOTOR_STEP -! sendCommand() -! -! def heli_stop(): -! global motor1_command, motor2_command -! motor1_command = 0 -! motor2_command = 0 -! sendCommand() -! -! def heli_takeoff(): -! global motor1_command, motor2_command -! motor1_command = 0x0260 -! motor2_command = 0x0260 -! sendCommand() -! -! def heli_land(): -! global motor1_command, motor2_command -! motor1_command = 0x0200 -! motor2_command = 0x0200 -! sendCommand() -! -! def key_pressed(event): -! if (event.char=='i'): -! heli_up() -! if (event.char=='j'): -! heli_left() -! if (event.char=='l'): -! heli_right() -! if (event.char=='k'): -! heli_down() -! if (event.char==' '): -! heli_stop() -! if (event.char=='a'): -! heli_takeoff() -! if (event.char=='q'): -! heli_land() -! -! def gui_clicked(event): -! global motor1_command, motor2_command -! if (event.x>100 and event.x<200 and event.y>0 and event.y<100): -! heli_up() -! if (event.x>0 and event.x<100 and event.y>100 and event.y<200): -! heli_left() -! if (event.x>200 and event.x<300 and event.y>100 and event.y<200): -! heli_right() -! if (event.x>100 and event.x<200 and event.y>200 and event.y<300): -! heli_down() -! if (event.x>100 and event.x<200 and event.y>100 and event.y<200): -! heli_stop() -! if (event.x>200 and event.x<300 and event.y>0 and event.y<100): -! heli_takeoff() -! if (event.x>200 and event.x<300 and event.y>200 and event.y<300): -! heli_land() -! if (event.y>310 and event.y<340): -! motor1_command = event.x/300.0*800.0 -! sendCommand() -! if (event.y>340 and event.y<360): -! motor_diff = motor1_command-motor2_command -! motor1_command = (event.x/300.0*800.0)+(motor_diff/2.0) -! if motor1_command>800: -! motor1_command=800 -! motor2_command = (event.x/300.0*800.0)-(motor_diff/2.0) -! if motor2_command>800: -! motor2_command=800 -! sendCommand() -! if (event.y>360 and event.y<390): -! motor2_command = event.x/300.0*800.0 -! sendCommand() -! -! def sendCommand(): -! #update the sliders -! buttonCanvas.delete("temp_slider") -! buttonCanvas.create_rectangle(0 ,310,(motor1_command/800.0)*300.0,340,fill="yellow",tag="temp_slider") -! buttonCanvas.create_rectangle(0 ,360,(motor2_command/800.0)*300.0,390,fill="yellow",tag="temp_slider") -! #send the command over UDP -! request = [] -! request.append(chr(int(motor1_command/256))) -! request.append(chr(int(motor1_command%256))) -! request.append(chr(int(motor2_command/256))) -! request.append(chr(int(motor2_command%256))) -! request = ''.join(request) -! hisAddress = addressText.get(1.0,Tkinter.END) -! hisAddress = hisAddress[0:len(hisAddress)-1] -! try: -! socket_handler = socket.socket(socket.AF_INET6,socket.SOCK_DGRAM) -! socket_handler.settimeout(5) -! socket_handler.bind((myAddress,myPort)) -! socket_handler.sendto(request,(hisAddress,hisPort)) -! except: -! addressText.config(background="red") -! else: -! addressText.config(background="green") -! -! #================================= GUI functions ==================== -! -! def releaseAndQuit(): -! root.quit() -! sys.exit() -! -! #================================= GUI definition =================== -! -! root=Tkinter.Tk() -! root.title("OpenHelicopter") -! root.protocol("WM_DELETE_WINDOW",releaseAndQuit) -! root.resizable(0,0) -! -! root.bind("<Key>",key_pressed) -! -! addressText = Tkinter.Text(root,width=50,height=1) -! #displayElements[motePort]["cellTable"]["TextField"].delete("1.0",Tkinter.END) -! addressText.insert(Tkinter.END,'2001:470:1f05:dff:1415:9209:22b:51') -! addressText.grid(row=0,column=0) -! -! buttonCanvas=Tkinter.Canvas(root,width=300,height=400) -! buttonCanvas.bind("<Button-1>",gui_clicked) -! buttonCanvas.bind("<Button-2>",gui_clicked) -! buttonCanvas.bind("<Button-3>",gui_clicked) -! buttonCanvas.create_rectangle(100, 0,200,100,fill="blue") -! buttonCanvas.create_text(150,50,text="up <i>") -! buttonCanvas.create_rectangle( 0,100,100,200,fill="blue") -! buttonCanvas.create_text(50,150,text="left <j>") -! buttonCanvas.create_rectangle(200,100,300,200,fill="blue") -! buttonCanvas.create_text(250,150,text="right <l>") -! buttonCanvas.create_rectangle(100,200,200,300,fill="blue") -! buttonCanvas.create_text(150,250,text="down <k>") -! buttonCanvas.create_oval(120,120,180,180,fill="red") -! buttonCanvas.create_text(150,150,text="stop!\n<space>") -! buttonCanvas.create_oval(220, 20,280, 80,fill="green") -! buttonCanvas.create_text(250, 50,text="takeoff <a>") -! buttonCanvas.create_oval(220,220,280,280,fill="green") -! buttonCanvas.create_text(250,250,text="land <q>") -! -! buttonCanvas.create_rectangle(0 ,310,300,340) -! buttonCanvas.create_text(150,325,text="motor 1") -! buttonCanvas.create_rectangle(0 ,360,300,390) -! buttonCanvas.create_text(150,375,text="motor 2") -! buttonCanvas.grid(row=1,column=0) -! -! #================================= main ============================= -! -! root.mainloop() ---- 1,185 ---- -! import socket -! import binascii -! import time -! import os -! import Tkinter -! import sys -! -! MOTOR_MAX = 800 -! MOTOR_MIN = 0 -! MOTOR_STEP = 10 -! -! myAddress = '' # means 'any suitable interface' -! myPort = 2158 -! hisAddress = '2001:470:1f05:dff:1415:9209:22b:51' -! hisPort = 2192 -! -! motor1_command = 0 -! motor2_command = 0 -! -! print "Testing heli..." -! -! def heli_up(): -! global motor1_command, motor2_command -! if (motor1_command+MOTOR_STEP<=MOTOR_MAX and motor2_command+MOTOR_STEP<=MOTOR_MAX): -! motor1_command += MOTOR_STEP -! motor2_command += MOTOR_STEP -! sendCommand() -! -! def heli_down(): -! global motor1_command, motor2_command -! if (motor1_command-MOTOR_STEP>=MOTOR_MIN and motor2_command-MOTOR_STEP>=MOTOR_MIN): -! motor1_command -= MOTOR_STEP -! motor2_command -= MOTOR_STEP -! sendCommand() -! -! def heli_left(): -! global motor1_command -! if (motor1_command+MOTOR_STEP<=MOTOR_MAX): -! motor1_command += MOTOR_STEP -! sendCommand() -! -! def heli_right(): -! global motor1_command -! if (motor1_command-MOTOR_STEP>=MOTOR_MIN): -! motor1_command -= MOTOR_STEP -! sendCommand() -! -! def heli_stop(): -! global motor1_command, motor2_command -! motor1_command = 0 -! motor2_command = 0 -! sendCommand() -! -! def heli_takeoff(): -! global motor1_command, motor2_command -! motor1_command = 0x0260 -! motor2_command = 0x0260 -! sendCommand() -! -! def heli_land(): -! global motor1_command, motor2_command -! motor1_command = 0x0200 -! motor2_command = 0x0200 -! sendCommand() -! -! def key_pressed(event): -! if (event.char=='i'): -! heli_up() -! if (event.char=='j'): -! heli_left() -! if (event.char=='l'): -! heli_right() -! if (event.char=='k'): -! heli_down() -! if (event.char==' '): -! heli_stop() -! if (event.char=='a'): -! heli_takeoff() -! if (event.char=='q'): -! heli_land() -! -! def gui_clicked(event): -! global motor1_command, motor2_command -! if (event.x>100 and event.x<200 and event.y>0 and event.y<100): -! heli_up() -! if (event.x>0 and event.x<100 and event.y>100 and event.y<200): -! heli_left() -! if (event.x>200 and event.x<300 and event.y>100 and event.y<200): -! heli_right() -! if (event.x>100 and event.x<200 and event.y>200 and event.y<300): -! heli_down() -! if (event.x>100 and event.x<200 and event.y>100 and event.y<200): -! heli_stop() -! if (event.x>200 and event.x<300 and event.y>0 and event.y<100): -! heli_takeoff() -! if (event.x>200 and event.x<300 and event.y>200 and event.y<300): -! heli_land() -! if (event.y>310 and event.y<340): -! motor1_command = event.x/300.0*800.0 -! sendCommand() -! if (event.y>340 and event.y<360): -! motor_diff = motor1_command-motor2_command -! motor1_command = (event.x/300.0*800.0)+(motor_diff/2.0) -! if motor1_command>800: -! motor1_command=800 -! motor2_command = (event.x/300.0*800.0)-(motor_diff/2.0) -! if motor2_command>800: -! motor2_command=800 -! sendCommand() -! if (event.y>360 and event.y<390): -! motor2_command = event.x/300.0*800.0 -! sendCommand() -! -! def sendCommand(): -! #update the sliders -! buttonCanvas.delete("temp_slider") -! buttonCanvas.create_rectangle(0 ,310,(motor1_command/800.0)*300.0,340,fill="yellow",tag="temp_slider") -! buttonCanvas.create_rectangle(0 ,360,(motor2_command/800.0)*300.0,390,fill="yellow",tag="temp_slider") -! #send the command over UDP -! request = [] -! request.append(chr(int(motor1_command/256))) -! request.append(chr(int(motor1_command%256))) -! request.append(chr(int(motor2_command/256))) -! request.append(chr(int(motor2_command%256))) -! request = ''.join(request) -! hisAddress = addressText.get(1.0,Tkinter.END) -! hisAddress = hisAddress[0:len(hisAddress)-1] -! try: -! socket_handler = socket.socket(socket.AF_INET6,socket.SOCK_DGRAM) -! socket_handler.settimeout(5) -! socket_handler.bind((myAddress,myPort)) -! socket_handler.sendto(request,(hisAddress,hisPort)) -! except: -! addressText.config(background="red") -! else: -! addressText.config(background="green") -! -! #================================= GUI functions ==================== -! -! def releaseAndQuit(): -! root.quit() -! sys.exit() -! -! #================================= GUI definition =================== -! -! root=Tkinter.Tk() -! root.title("OpenHelicopter") -! root.protocol("WM_DELETE_WINDOW",releaseAndQuit) -! root.resizable(0,0) -! -! root.bind("<Key>",key_pressed) -! -! addressText = Tkinter.Text(root,width=50,height=1) -! #displayElements[motePort]["cellTable"]["TextField"].delete("1.0",Tkinter.END) -! addressText.insert(Tkinter.END,'2001:470:1f05:dff:1415:9209:22b:51') -! addressText.grid(row=0,column=0) -! -! buttonCanvas=Tkinter.Canvas(root,width=300,height=400) -! buttonCanvas.bind("<Button-1>",gui_clicked) -! buttonCanvas.bind("<Button-2>",gui_clicked) -! buttonCanvas.bind("<Button-3>",gui_clicked) -! buttonCanvas.create_rectangle(100, 0,200,100,fill="blue") -! buttonCanvas.create_text(150,50,text="up <i>") -! buttonCanvas.create_rectangle( 0,100,100,200,fill="blue") -! buttonCanvas.create_text(50,150,text="left <j>") -! buttonCanvas.create_rectangle(200,100,300,200,fill="blue") -! buttonCanvas.create_text(250,150,text="right <l>") -! buttonCanvas.create_rectangle(100,200,200,300,fill="blue") -! buttonCanvas.create_text(150,250,text="down <k>") -! buttonCanvas.create_oval(120,120,180,180,fill="red") -! buttonCanvas.create_text(150,150,text="stop!\n<space>") -! buttonCanvas.create_oval(220, 20,280, 80,fill="green") -! buttonCanvas.create_text(250, 50,text="takeoff <a>") -! buttonCanvas.create_oval(220,220,280,280,fill="green") -! buttonCanvas.create_text(250,250,text="land <q>") -! -! buttonCanvas.create_rectangle(0 ,310,300,340) -! buttonCanvas.create_text(150,325,text="motor 1") -! buttonCanvas.create_rectangle(0 ,360,300,390) -! buttonCanvas.create_text(150,375,text="motor 2") -! buttonCanvas.grid(row=1,column=0) -! -! #================================= main ============================= -! -! root.mainloop() -diff -crB openwsn/07-App/imu/imu.c ../../../sys/net/openwsn/07-App/imu/imu.c -*** openwsn/07-App/imu/imu.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/imu/imu.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,123 **** -! #include "openwsn.h" -! #include "imu.h" -! //drivers -! #include "gyro.h" -! #include "large_range_accel.h" -! #include "magnetometer.h" -! #include "sensitive_accel_temperature.h" -! //openwsn stack -! #include "openudp.h" -! #include "openqueue.h" -! #include "openserial.h" -! #include "packetfunctions.h" -! -! //=========================== variables ======================================= -! -! typedef struct { -! uint8_t mesurements_left; -! OpenQueueEntry_t* pktReceived; -! } imu_vars_t; -! -! imu_vars_t imu_vars; -! -! //=========================== prototypes ====================================== -! -! void imu_send(); -! void imu_reset(); -! -! //=========================== public ========================================== -! -! void imu_init() { -! if (*(&eui64+3)==0x09) { // this is a GINA board (not a basestation) -! gyro_init(); -! large_range_accel_init(); -! magnetometer_init(); -! sensitive_accel_temperature_init(); -! } -! imu_vars.mesurements_left = 0; -! } -! -! //this is called when the UdpGina button is pressed on the OpenVisualizer interface -! void imu_trigger() { -! } -! -! //I just received a request, send a packet with IMU data -! void imu_receive(OpenQueueEntry_t* msg) { -! msg->owner = COMPONENT_IMU; -! if (imu_vars.pktReceived==NULL) { -! imu_vars.pktReceived = msg; -! imu_vars.mesurements_left = imu_vars.pktReceived->payload[0]; -! imu_send(); -! } else { -! openqueue_freePacketBuffer(msg); -! } -! } -! -! //I just sent a IMU packet, check I need to resend one -! void imu_sendDone(OpenQueueEntry_t* msg, error_t error) { -! msg->owner = COMPONENT_IMU; -! if (msg->creator!=COMPONENT_IMU) { -! openserial_printError(COMPONENT_IMU,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! openqueue_freePacketBuffer(msg); -! if (imu_vars.mesurements_left>0) { -! imu_send(); -! } else { -! imu_reset(); -! } -! } -! -! bool imu_debugPrint() { -! return FALSE; -! } -! -! //=========================== private ========================================= -! -! void imu_send() { -! OpenQueueEntry_t* packetToSend; -! packetToSend = openqueue_getFreePacketBuffer(); -! if (packetToSend==NULL) { -! openserial_printError(COMPONENT_IMU,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! imu_reset(); -! return; -! } -! packetToSend->creator = COMPONENT_IMU; -! packetToSend->owner = COMPONENT_IMU; -! packetToSend->l4_protocol = IANA_UDP; -! packetToSend->l4_sourcePortORicmpv6Type = imu_vars.pktReceived->l4_destination_port; -! packetToSend->l4_destination_port = imu_vars.pktReceived->l4_sourcePortORicmpv6Type; -! packetToSend->l3_destinationORsource.type = ADDR_128B; -! memcpy(&(packetToSend->l3_destinationORsource.addr_128b[0]), -! &(imu_vars.pktReceived->l3_destinationORsource.addr_128b[0]), -! 16); -! //payload, gyro data -! packetfunctions_reserveHeaderSize(packetToSend,8); -! gyro_get_measurement(&(packetToSend->payload[0])); -! //payload, large_range_accel data -! packetfunctions_reserveHeaderSize(packetToSend,6); -! large_range_accel_get_measurement(&(packetToSend->payload[0])); -! //payload, magnetometer data -! packetfunctions_reserveHeaderSize(packetToSend,6); -! magnetometer_get_measurement(&(packetToSend->payload[0])); -! //payload, sensitive_accel_temperature data -! packetfunctions_reserveHeaderSize(packetToSend,10); -! sensitive_accel_temperature_get_measurement(&(packetToSend->payload[0])); -! //send packet -! if ((openudp_send(packetToSend))==E_FAIL) { -! openqueue_freePacketBuffer(packetToSend); -! imu_reset(); -! } -! imu_vars.mesurements_left--; -! } -! -! void imu_reset() { -! imu_vars.mesurements_left=0; -! if (imu_vars.pktReceived!=NULL) { -! openqueue_freePacketBuffer(imu_vars.pktReceived); -! imu_vars.pktReceived = NULL; -! } -! } ---- 1,123 ---- -! #include "openwsn.h" -! #include "imu.h" -! //drivers -! #include "gyro.h" -! #include "large_range_accel.h" -! #include "magnetometer.h" -! #include "sensitive_accel_temperature.h" -! //openwsn stack -! #include "openudp.h" -! #include "openqueue.h" -! #include "openserial.h" -! #include "packetfunctions.h" -! -! //=========================== variables ======================================= -! -! typedef struct { -! uint8_t mesurements_left; -! OpenQueueEntry_t* pktReceived; -! } imu_vars_t; -! -! imu_vars_t imu_vars; -! -! //=========================== prototypes ====================================== -! -! void imu_send(); -! void imu_reset(); -! -! //=========================== public ========================================== -! -! void imu_init() { -! if (*(&eui64+3)==0x09) { // this is a GINA board (not a basestation) -! gyro_init(); -! large_range_accel_init(); -! magnetometer_init(); -! sensitive_accel_temperature_init(); -! } -! imu_vars.mesurements_left = 0; -! } -! -! //this is called when the UdpGina button is pressed on the OpenVisualizer interface -! void imu_trigger() { -! } -! -! //I just received a request, send a packet with IMU data -! void imu_receive(OpenQueueEntry_t* msg) { -! msg->owner = COMPONENT_IMU; -! if (imu_vars.pktReceived==NULL) { -! imu_vars.pktReceived = msg; -! imu_vars.mesurements_left = imu_vars.pktReceived->payload[0]; -! imu_send(); -! } else { -! openqueue_freePacketBuffer(msg); -! } -! } -! -! //I just sent a IMU packet, check I need to resend one -! void imu_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! msg->owner = COMPONENT_IMU; -! if (msg->creator!=COMPONENT_IMU) { -! openserial_printError(COMPONENT_IMU,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! openqueue_freePacketBuffer(msg); -! if (imu_vars.mesurements_left>0) { -! imu_send(); -! } else { -! imu_reset(); -! } -! } -! -! bool imu_debugPrint() { -! return FALSE; -! } -! -! //=========================== private ========================================= -! -! void imu_send() { -! OpenQueueEntry_t* packetToSend; -! packetToSend = openqueue_getFreePacketBuffer(); -! if (packetToSend==NULL) { -! openserial_printError(COMPONENT_IMU,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! imu_reset(); -! return; -! } -! packetToSend->creator = COMPONENT_IMU; -! packetToSend->owner = COMPONENT_IMU; -! packetToSend->l4_protocol = IANA_UDP; -! packetToSend->l4_sourcePortORicmpv6Type = imu_vars.pktReceived->l4_destination_port; -! packetToSend->l4_destination_port = imu_vars.pktReceived->l4_sourcePortORicmpv6Type; -! packetToSend->l3_destinationORsource.type = ADDR_128B; -! memcpy(&(packetToSend->l3_destinationORsource.addr_128b[0]), -! &(imu_vars.pktReceived->l3_destinationORsource.addr_128b[0]), -! 16); -! //payload, gyro data -! packetfunctions_reserveHeaderSize(packetToSend,8); -! gyro_get_measurement(&(packetToSend->payload[0])); -! //payload, large_range_accel data -! packetfunctions_reserveHeaderSize(packetToSend,6); -! large_range_accel_get_measurement(&(packetToSend->payload[0])); -! //payload, magnetometer data -! packetfunctions_reserveHeaderSize(packetToSend,6); -! magnetometer_get_measurement(&(packetToSend->payload[0])); -! //payload, sensitive_accel_temperature data -! packetfunctions_reserveHeaderSize(packetToSend,10); -! sensitive_accel_temperature_get_measurement(&(packetToSend->payload[0])); -! //send packet -! if ((openudp_send(packetToSend))==E_FAIL) { -! openqueue_freePacketBuffer(packetToSend); -! imu_reset(); -! } -! imu_vars.mesurements_left--; -! } -! -! void imu_reset() { -! imu_vars.mesurements_left=0; -! if (imu_vars.pktReceived!=NULL) { -! openqueue_freePacketBuffer(imu_vars.pktReceived); -! imu_vars.pktReceived = NULL; -! } -! } -diff -crB openwsn/07-App/imu/imu.h ../../../sys/net/openwsn/07-App/imu/imu.h -*** openwsn/07-App/imu/imu.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/imu/imu.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,30 **** -! #ifndef __IMU_H -! #define __IMU_H -! -! /** -! \addtogroup App -! \{ -! \addtogroup imu -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void imu_init(); -! void imu_trigger(); -! void imu_sendDone(OpenQueueEntry_t* msg, error_t error); -! void imu_receive(OpenQueueEntry_t* msg); -! bool imu_debugPrint(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,30 ---- -! #ifndef __IMU_H -! #define __IMU_H -! -! /** -! \addtogroup AppUdp -! \{ -! \addtogroup imu -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void imu_init(); -! void imu_trigger(); -! void imu_sendDone(OpenQueueEntry_t* msg, owerror_t error); -! void imu_receive(OpenQueueEntry_t* msg); -! bool imu_debugPrint(); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/07-App/imu/imu.py ../../../sys/net/openwsn/07-App/imu/imu.py -*** openwsn/07-App/imu/imu.py Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/imu/imu.py Wed Jan 15 13:48:27 2014 -*************** -*** 1,62 **** -! import socket -! import binascii -! import time -! import os -! -! num_measurements = str(chr(0x64)) # (100)d -! myAddress = '' # means 'any suitable interface' -! myPort = 2158 -! hisAddress = '2001:470:1f05:dff:1415:9209:22b:51' -! hisPort = 2190 -! -! print "Testing imu..." -! -! socket_handler = socket.socket(socket.AF_INET6,socket.SOCK_DGRAM) -! socket_handler.settimeout(5) -! socket_handler.bind((myAddress,myPort)) -! socket_handler.sendto(num_measurements,(hisAddress,hisPort)) -! print "\nrequest "+myAddress+"%"+str(myPort)+" -> "+hisAddress+"%"+str(hisPort) -! print num_measurements+" ("+str(len(num_measurements))+" bytes)" -! -! time_first = time.time() -! replycounter = 0 -! while (1): -! try: -! reply,dist_addr = socket_handler.recvfrom(1024) -! except socket.timeout: -! print "\nno further replies, it seems\n" -! break -! else: -! time_last = time.time() -! os.system("CLS") -! print "\nreply "+str(replycounter)+": "+str(dist_addr[0])+"%"+str(dist_addr[1])+" -> "+myAddress+"%"+str(myPort)+" ("+str(len(reply))+" bytes)\n" -! replycounter += 1 -! -! print "sensitive_accel X : "+str(ord(reply[0])) -! print " Y : "+binascii.hexlify(reply[ 2: 4]) -! print " Z1 : "+binascii.hexlify(reply[ 4: 6]) -! print " Z3 : "+binascii.hexlify(reply[ 6: 8])+"\n" -! -! print "temperature : "+binascii.hexlify(reply[ 8:10])+"\n" -! -! print "magnetometer X : "+binascii.hexlify(reply[10:12]) -! print " Y : "+binascii.hexlify(reply[12:14]) -! print " Z : "+binascii.hexlify(reply[14:16])+"\n" -! -! print "large_range_accel X : "+binascii.hexlify(reply[16:18]) -! print " Y : "+binascii.hexlify(reply[18:20]) -! print " Z : "+binascii.hexlify(reply[20:22])+"\n" -! -! print "gyro_temperature : "+binascii.hexlify(reply[22:24]) -! print "gyro X : "+binascii.hexlify(reply[24:26]) -! print " Y : "+binascii.hexlify(reply[26:28]) -! print " Z : "+binascii.hexlify(reply[28:30]) -! -! socket_handler.close() -! -! try: -! print str(replycounter)+" replies in "+str(time_last-time_first)+"s (one every "+str((time_last-time_first)/(replycounter-1))+"s)" -! except: -! pass -! -! raw_input("\nPress return to close this window...") ---- 1,62 ---- -! import socket -! import binascii -! import time -! import os -! -! num_measurements = str(chr(0x64)) # (100)d -! myAddress = '' # means 'any suitable interface' -! myPort = 2158 -! hisAddress = '2001:470:1f05:dff:1415:9209:22b:51' -! hisPort = 2190 -! -! print "Testing imu..." -! -! socket_handler = socket.socket(socket.AF_INET6,socket.SOCK_DGRAM) -! socket_handler.settimeout(5) -! socket_handler.bind((myAddress,myPort)) -! socket_handler.sendto(num_measurements,(hisAddress,hisPort)) -! print "\nrequest "+myAddress+"%"+str(myPort)+" -> "+hisAddress+"%"+str(hisPort) -! print num_measurements+" ("+str(len(num_measurements))+" bytes)" -! -! time_first = time.time() -! replycounter = 0 -! while (1): -! try: -! reply,dist_addr = socket_handler.recvfrom(1024) -! except socket.timeout: -! print "\nno further replies, it seems\n" -! break -! else: -! time_last = time.time() -! os.system("CLS") -! print "\nreply "+str(replycounter)+": "+str(dist_addr[0])+"%"+str(dist_addr[1])+" -> "+myAddress+"%"+str(myPort)+" ("+str(len(reply))+" bytes)\n" -! replycounter += 1 -! -! print "sensitive_accel X : "+str(ord(reply[0])) -! print " Y : "+binascii.hexlify(reply[ 2: 4]) -! print " Z1 : "+binascii.hexlify(reply[ 4: 6]) -! print " Z3 : "+binascii.hexlify(reply[ 6: 8])+"\n" -! -! print "temperature : "+binascii.hexlify(reply[ 8:10])+"\n" -! -! print "magnetometer X : "+binascii.hexlify(reply[10:12]) -! print " Y : "+binascii.hexlify(reply[12:14]) -! print " Z : "+binascii.hexlify(reply[14:16])+"\n" -! -! print "large_range_accel X : "+binascii.hexlify(reply[16:18]) -! print " Y : "+binascii.hexlify(reply[18:20]) -! print " Z : "+binascii.hexlify(reply[20:22])+"\n" -! -! print "gyro_temperature : "+binascii.hexlify(reply[22:24]) -! print "gyro X : "+binascii.hexlify(reply[24:26]) -! print " Y : "+binascii.hexlify(reply[26:28]) -! print " Z : "+binascii.hexlify(reply[28:30]) -! -! socket_handler.close() -! -! try: -! print str(replycounter)+" replies in "+str(time_last-time_first)+"s (one every "+str((time_last-time_first)/(replycounter-1))+"s)" -! except: -! pass -! -! raw_input("\nPress return to close this window...") -diff -crB openwsn/07-App/layerdebug/layerdebug.c ../../../sys/net/openwsn/07-App/layerdebug/layerdebug.c -*** openwsn/07-App/layerdebug/layerdebug.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/layerdebug/layerdebug.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,301 **** -! #include "openwsn.h" -! #include "layerdebug.h" -! #include "opencoap.h" -! #include "opentimers.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! #include "openserial.h" -! #include "openrandom.h" -! #include "scheduler.h" -! -! -! // include layer files to debug -! #include "neighbors.h" -! #include "schedule.h" -! //=========================== defines ========================================= -! -! /// inter-packet period (in ms) -! #define DEBUGPERIODNBS 11000 -! #define DEBUGPERIODSCH 7000 -! -! const uint8_t schedule_layerdebug_path0[] = "d_s"; // debug/scheduling -! const uint8_t neighbors_layerdebug_path0[] = "d_n"; // debug/neighbours -! -! //=========================== variables ======================================= -! -! typedef struct { -! coap_resource_desc_t schdesc; ///< descriptor for shedule table -! coap_resource_desc_t nbsdesc; ///< descriptor for neigbour table -! opentimer_id_t schtimerId; ///< schedule timer -! opentimer_id_t nbstimerId; ///< neigbour timer -! } layerdebug_vars_t; -! -! layerdebug_vars_t layerdebug_vars; -! -! //=========================== prototypes ====================================== -! -! error_t layerdebug_schedule_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! -! -! error_t layerdebug_neighbors_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! -! void layerdebug_timer_schedule_cb(); -! void layerdebug_timer_neighbors_cb(); -! -! void layerdebug_task_schedule_cb(); -! void layerdebug_task_neighbors_cb(); -! -! void layerdebug_sendDone(OpenQueueEntry_t* msg, -! error_t error); -! -! //=========================== public ========================================== -! -! void layerdebug_init() { -! -! // prepare the resource descriptor for the scheduling path -! layerdebug_vars.schdesc.path0len = sizeof(schedule_layerdebug_path0)-1; -! layerdebug_vars.schdesc.path0val = (uint8_t*)(&schedule_layerdebug_path0); -! layerdebug_vars.schdesc.path1len = 0; -! layerdebug_vars.schdesc.path1val = NULL; -! layerdebug_vars.schdesc.componentID = COMPONENT_LAYERDEBUG; -! layerdebug_vars.schdesc.callbackRx = &layerdebug_schedule_receive; -! layerdebug_vars.schdesc.callbackSendDone = &layerdebug_sendDone; -! opencoap_register(&layerdebug_vars.schdesc); -! -! layerdebug_vars.schtimerId = opentimers_start(DEBUGPERIODSCH, -! TIMER_PERIODIC,TIME_MS, -! layerdebug_timer_schedule_cb); -! -! // prepare the resource descriptor for the neighbors path -! layerdebug_vars.nbsdesc.path0len = sizeof(schedule_layerdebug_path0)-1; -! layerdebug_vars.nbsdesc.path0val = (uint8_t*)(&schedule_layerdebug_path0); -! layerdebug_vars.nbsdesc.path1len = 0; -! layerdebug_vars.nbsdesc.path1val = NULL; -! layerdebug_vars.nbsdesc.componentID = COMPONENT_LAYERDEBUG; -! layerdebug_vars.nbsdesc.callbackRx = &layerdebug_neighbors_receive; -! layerdebug_vars.nbsdesc.callbackSendDone = &layerdebug_sendDone; -! opencoap_register(&layerdebug_vars.nbsdesc); -! -! layerdebug_vars.nbstimerId = opentimers_start(DEBUGPERIODNBS, -! TIMER_PERIODIC,TIME_MS, -! layerdebug_timer_neighbors_cb); -! } -! -! //=========================== private ========================================= -! -! //timer fired, but we don't want to execute task in ISR mode -! //instead, push task to scheduler with COAP priority, and let scheduler take care of it -! void layerdebug_timer_schedule_cb(){ -! scheduler_push_task(layerdebug_task_schedule_cb,TASKPRIO_COAP); -! } -! -! void layerdebug_timer_neighbors_cb(){ -! scheduler_push_task(layerdebug_task_neighbors_cb,TASKPRIO_COAP); -! } -! -! //schedule stats -! void layerdebug_task_schedule_cb() { -! OpenQueueEntry_t* pkt; -! error_t outcome; -! uint8_t numOptions; -! uint8_t size; -! -! // create a CoAP RD packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_LAYERDEBUG); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_LAYERDEBUG,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(pkt); -! return; -! } -! // take ownership over that packet -! pkt->creator = COMPONENT_LAYERDEBUG; -! pkt->owner = COMPONENT_LAYERDEBUG; -! // CoAP payload -! size=sizeof(netDebugScheduleEntry_t)*MAXACTIVESLOTS; -! packetfunctions_reserveHeaderSize(pkt,size);//reserve for some schedule entries -! //get the schedule information from the mac layer -! schedule_getNetDebugInfo((netDebugScheduleEntry_t*)pkt->payload); -! -! packetfunctions_reserveHeaderSize(pkt,1);//reserve for the size of schedule entries -! pkt->payload[0] = MAXACTIVESLOTS; -! -! -! numOptions = 0; -! // location-path option -! packetfunctions_reserveHeaderSize(pkt,sizeof(schedule_layerdebug_path0)-1); -! memcpy(&pkt->payload[0],&schedule_layerdebug_path0,sizeof(schedule_layerdebug_path0)-1); -! packetfunctions_reserveHeaderSize(pkt,1); -! pkt->payload[0] = (COAP_OPTION_LOCATIONPATH-COAP_OPTION_CONTENTTYPE) << 4 | -! sizeof(schedule_layerdebug_path0)-1; -! numOptions++; -! // content-type option -! packetfunctions_reserveHeaderSize(pkt,2); -! pkt->payload[0] = COAP_OPTION_CONTENTTYPE << 4 | -! 1; -! pkt->payload[1] = COAP_MEDTYPE_APPOCTETSTREAM; -! numOptions++; -! // metadata -! pkt->l4_destination_port = WKP_UDP_COAP; -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&pkt->l3_destinationAdd.addr_128b[0],&ipAddr_local,16); -! // send -! outcome = opencoap_send(pkt, -! COAP_TYPE_NON, -! COAP_CODE_REQ_PUT, -! numOptions, -! &layerdebug_vars.schdesc); -! // avoid overflowing the queue if fails -! if (outcome==E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! -! return; -! } -! -! //neighbours stats -! void layerdebug_task_neighbors_cb() { -! -! OpenQueueEntry_t* pkt; -! error_t outcome; -! uint8_t numOptions; -! uint8_t size; -! -! // create a CoAP RD packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_LAYERDEBUG); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_LAYERDEBUG,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(pkt); -! return; -! } -! // take ownership over that packet -! pkt->creator = COMPONENT_LAYERDEBUG; -! pkt->owner = COMPONENT_LAYERDEBUG; -! // CoAP payload -! -! size=neighbors_getNumNeighbors(); //compute the number of neigbours sent -! packetfunctions_reserveHeaderSize(pkt,size*sizeof(netDebugNeigborEntry_t));//reserve for the size of schedule entries -! -! debugNetPrint_neighbors((netDebugNeigborEntry_t*) pkt->payload); -! -! //now we know the size of the neihbours. Put it on the packet. -! packetfunctions_reserveHeaderSize(pkt,1);//reserve for the size of neighbours entries -! pkt->payload[0] = size; -! -! //coap options -! numOptions = 0; -! // location-path option -! packetfunctions_reserveHeaderSize(pkt,sizeof(neighbors_layerdebug_path0)-1); -! memcpy(&pkt->payload[0],&neighbors_layerdebug_path0,sizeof(neighbors_layerdebug_path0)-1); -! packetfunctions_reserveHeaderSize(pkt,1); -! pkt->payload[0] = (COAP_OPTION_LOCATIONPATH-COAP_OPTION_CONTENTTYPE) << 4 | -! sizeof(neighbors_layerdebug_path0)-1; -! numOptions++; -! // content-type option -! packetfunctions_reserveHeaderSize(pkt,2); -! pkt->payload[0] = COAP_OPTION_CONTENTTYPE << 4 | -! 1; -! pkt->payload[1] = COAP_MEDTYPE_APPOCTETSTREAM; -! numOptions++; -! // metadata -! pkt->l4_destination_port = WKP_UDP_COAP; -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&pkt->l3_destinationAdd.addr_128b[0],&ipAddr_local,16); -! // send -! outcome = opencoap_send(pkt, -! COAP_TYPE_NON, -! COAP_CODE_REQ_PUT, -! numOptions, -! &layerdebug_vars.nbsdesc); -! // avoid overflowing the queue if fails -! if (outcome==E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! -! return; -! } -! -! void layerdebug_sendDone(OpenQueueEntry_t* msg, error_t error) { -! openqueue_freePacketBuffer(msg); -! } -! -! -! error_t layerdebug_schedule_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! error_t outcome; -! uint8_t size; -! -! -! if (coap_header->Code==COAP_CODE_REQ_GET) { -! // return current schedule value -! -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! size=sizeof(netDebugScheduleEntry_t)*MAXACTIVESLOTS; -! packetfunctions_reserveHeaderSize(msg,size);//reserve for some schedule entries -! //get the schedule information from the mac layer -! schedule_getNetDebugInfo((netDebugScheduleEntry_t*)msg->payload); -! -! packetfunctions_reserveHeaderSize(msg,1);//reserve for the size of schedule entries -! msg->payload[0] = MAXACTIVESLOTS; -! -! // set the CoAP header -! coap_header->OC = 0; -! coap_header->Code = COAP_CODE_RESP_CONTENT; -! -! outcome = E_SUCCESS; -! -! } else { -! // return an error message -! outcome = E_FAIL; -! } -! -! return outcome; -! } -! -! error_t layerdebug_neighbors_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! error_t outcome; -! uint8_t size; -! -! -! if (coap_header->Code==COAP_CODE_REQ_GET) { -! // return current schedule value -! -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! size=neighbors_getNumNeighbors(); //compute the number of neigbours sent -! packetfunctions_reserveHeaderSize(msg,size*sizeof(netDebugNeigborEntry_t));//reserve for the size of schedule entries -! -! debugNetPrint_neighbors((netDebugNeigborEntry_t*)msg->payload); -! -! //now we know the size of the neihbours. Put it on the packet. -! packetfunctions_reserveHeaderSize(msg,1);//reserve for the size of neighbours entries -! msg->payload[0] = size; -! -! // set the CoAP header -! coap_header->OC = 0; -! coap_header->Code = COAP_CODE_RESP_CONTENT; -! -! outcome = E_SUCCESS; -! -! } else { -! // return an error message -! outcome = E_FAIL; -! } -! -! return outcome; - } -\ No newline at end of file ---- 1,310 ---- -! #include "openwsn.h" -! #include "layerdebug.h" -! #include "opencoap.h" -! #include "opentimers.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! #include "openserial.h" -! #include "openrandom.h" -! #include "scheduler.h" -! #include "IEEE802154E.h" -! #include "idmanager.h" -! -! // include layer files to debug -! #include "neighbors.h" -! #include "schedule.h" -! //=========================== defines ========================================= -! -! /// inter-packet period (in ms) -! #define DEBUGPERIODNBS 11000 -! #define DEBUGPERIODSCH 7000 -! -! const uint8_t schedule_layerdebug_path0[] = "d_s"; // debug/scheduling -! const uint8_t neighbors_layerdebug_path0[] = "d_n"; // debug/neighbours -! -! //=========================== variables ======================================= -! -! typedef struct { -! coap_resource_desc_t schdesc; ///< descriptor for shedule table -! coap_resource_desc_t nbsdesc; ///< descriptor for neigbour table -! opentimer_id_t schtimerId; ///< schedule timer -! opentimer_id_t nbstimerId; ///< neigbour timer -! } layerdebug_vars_t; -! -! layerdebug_vars_t layerdebug_vars; -! -! //=========================== prototypes ====================================== -! -! owerror_t layerdebug_schedule_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! -! -! owerror_t layerdebug_neighbors_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! -! void layerdebug_timer_schedule_cb(); -! void layerdebug_timer_neighbors_cb(); -! -! void layerdebug_task_schedule_cb(); -! void layerdebug_task_neighbors_cb(); -! -! void layerdebug_sendDone(OpenQueueEntry_t* msg, -! owerror_t error); -! -! //=========================== public ========================================== -! -! void layerdebug_init() { -! -! // prepare the resource descriptor for the scheduling path -! layerdebug_vars.schdesc.path0len = sizeof(schedule_layerdebug_path0)-1; -! layerdebug_vars.schdesc.path0val = (uint8_t*)(&schedule_layerdebug_path0); -! layerdebug_vars.schdesc.path1len = 0; -! layerdebug_vars.schdesc.path1val = NULL; -! layerdebug_vars.schdesc.componentID = COMPONENT_LAYERDEBUG; -! layerdebug_vars.schdesc.callbackRx = &layerdebug_schedule_receive; -! layerdebug_vars.schdesc.callbackSendDone = &layerdebug_sendDone; -! opencoap_register(&layerdebug_vars.schdesc); -! -! layerdebug_vars.schtimerId = opentimers_start(DEBUGPERIODSCH, -! TIMER_PERIODIC,TIME_MS, -! layerdebug_timer_schedule_cb); -! -! // prepare the resource descriptor for the neighbors path -! layerdebug_vars.nbsdesc.path0len = sizeof(schedule_layerdebug_path0)-1; -! layerdebug_vars.nbsdesc.path0val = (uint8_t*)(&schedule_layerdebug_path0); -! layerdebug_vars.nbsdesc.path1len = 0; -! layerdebug_vars.nbsdesc.path1val = NULL; -! layerdebug_vars.nbsdesc.componentID = COMPONENT_LAYERDEBUG; -! layerdebug_vars.nbsdesc.callbackRx = &layerdebug_neighbors_receive; -! layerdebug_vars.nbsdesc.callbackSendDone = &layerdebug_sendDone; -! opencoap_register(&layerdebug_vars.nbsdesc); -! -! layerdebug_vars.nbstimerId = opentimers_start(DEBUGPERIODNBS, -! TIMER_PERIODIC,TIME_MS, -! layerdebug_timer_neighbors_cb); -! } -! -! //=========================== private ========================================= -! -! //timer fired, but we don't want to execute task in ISR mode -! //instead, push task to scheduler with COAP priority, and let scheduler take care of it -! void layerdebug_timer_schedule_cb(){ -! scheduler_push_task(layerdebug_task_schedule_cb,TASKPRIO_COAP); -! } -! -! void layerdebug_timer_neighbors_cb(){ -! scheduler_push_task(layerdebug_task_neighbors_cb,TASKPRIO_COAP); -! } -! -! //schedule stats -! void layerdebug_task_schedule_cb() { -! OpenQueueEntry_t* pkt; -! owerror_t outcome; -! uint8_t numOptions; -! uint8_t size; -! -! // don't run if not synch -! if (ieee154e_isSynch() == FALSE) return; -! -! // don't run on dagroot -! if (idmanager_getIsDAGroot()) { -! opentimers_stop( layerdebug_vars.schtimerId); -! opentimers_stop( layerdebug_vars.nbstimerId); -! return; -! } -! -! // create a CoAP RD packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_LAYERDEBUG); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_LAYERDEBUG,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(pkt); -! return; -! } -! // take ownership over that packet -! pkt->creator = COMPONENT_LAYERDEBUG; -! pkt->owner = COMPONENT_LAYERDEBUG; -! // CoAP payload -! size=sizeof(netDebugScheduleEntry_t)*MAXACTIVESLOTS; -! packetfunctions_reserveHeaderSize(pkt,size);//reserve for some schedule entries -! //get the schedule information from the mac layer -! schedule_getNetDebugInfo((netDebugScheduleEntry_t*)pkt->payload); -! -! packetfunctions_reserveHeaderSize(pkt,1);//reserve for the size of schedule entries -! pkt->payload[0] = MAXACTIVESLOTS; -! -! -! numOptions = 0; -! // location-path option -! packetfunctions_reserveHeaderSize(pkt,sizeof(schedule_layerdebug_path0)-1); -! memcpy(&pkt->payload[0],&schedule_layerdebug_path0,sizeof(schedule_layerdebug_path0)-1); -! packetfunctions_reserveHeaderSize(pkt,1); -! pkt->payload[0] = (COAP_OPTION_NUM_URIPATH) << 4 | -! sizeof(schedule_layerdebug_path0)-1; -! numOptions++; -! // content-type option -! packetfunctions_reserveHeaderSize(pkt,2); -! pkt->payload[0] = COAP_OPTION_NUM_CONTENTFORMAT << 4 | -! 1; -! pkt->payload[1] = COAP_MEDTYPE_APPOCTETSTREAM; -! numOptions++; -! // metadata -! pkt->l4_destination_port = WKP_UDP_COAP; -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&pkt->l3_destinationAdd.addr_128b[0],&ipAddr_local,16); -! // send -! outcome = opencoap_send(pkt, -! COAP_TYPE_NON, -! COAP_CODE_REQ_PUT, -! numOptions, -! &layerdebug_vars.schdesc); -! // avoid overflowing the queue if fails -! if (outcome==E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! -! return; -! } -! -! //neighbours stats -! void layerdebug_task_neighbors_cb() { -! -! OpenQueueEntry_t* pkt; -! owerror_t outcome; -! uint8_t numOptions; -! uint8_t size; -! -! // create a CoAP RD packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_LAYERDEBUG); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_LAYERDEBUG,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(pkt); -! return; -! } -! // take ownership over that packet -! pkt->creator = COMPONENT_LAYERDEBUG; -! pkt->owner = COMPONENT_LAYERDEBUG; -! // CoAP payload -! -! size=neighbors_getNumNeighbors(); //compute the number of neigbours sent -! packetfunctions_reserveHeaderSize(pkt,size*sizeof(netDebugNeigborEntry_t));//reserve for the size of schedule entries -! -! debugNetPrint_neighbors((netDebugNeigborEntry_t*) pkt->payload); -! -! //now we know the size of the neihbours. Put it on the packet. -! packetfunctions_reserveHeaderSize(pkt,1);//reserve for the size of neighbours entries -! pkt->payload[0] = size; -! -! //coap options -! numOptions = 0; -! // location-path option -! packetfunctions_reserveHeaderSize(pkt,sizeof(neighbors_layerdebug_path0)-1); -! memcpy(&pkt->payload[0],&neighbors_layerdebug_path0,sizeof(neighbors_layerdebug_path0)-1); -! packetfunctions_reserveHeaderSize(pkt,1); -! pkt->payload[0] = (COAP_OPTION_NUM_URIPATH) << 4 | -! sizeof(neighbors_layerdebug_path0)-1; -! numOptions++; -! // content-type option -! packetfunctions_reserveHeaderSize(pkt,2); -! pkt->payload[0] = COAP_OPTION_NUM_CONTENTFORMAT << 4 | -! 1; -! pkt->payload[1] = COAP_MEDTYPE_APPOCTETSTREAM; -! numOptions++; -! // metadata -! pkt->l4_destination_port = WKP_UDP_COAP; -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&pkt->l3_destinationAdd.addr_128b[0],&ipAddr_local,16); -! // send -! outcome = opencoap_send(pkt, -! COAP_TYPE_NON, -! COAP_CODE_REQ_PUT, -! numOptions, -! &layerdebug_vars.nbsdesc); -! // avoid overflowing the queue if fails -! if (outcome==E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! -! return; -! } -! -! void layerdebug_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! openqueue_freePacketBuffer(msg); -! } -! -! -! owerror_t layerdebug_schedule_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! owerror_t outcome; -! uint8_t size; -! -! -! if (coap_header->Code==COAP_CODE_REQ_GET) { -! // return current schedule value -! -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! size=sizeof(netDebugScheduleEntry_t)*MAXACTIVESLOTS; -! packetfunctions_reserveHeaderSize(msg,size);//reserve for some schedule entries -! //get the schedule information from the mac layer -! schedule_getNetDebugInfo((netDebugScheduleEntry_t*)msg->payload); -! -! packetfunctions_reserveHeaderSize(msg,1);//reserve for the size of schedule entries -! msg->payload[0] = MAXACTIVESLOTS; -! -! // set the CoAP header -! coap_header->Code = COAP_CODE_RESP_CONTENT; -! -! outcome = E_SUCCESS; -! -! } else { -! // return an error message -! outcome = E_FAIL; -! } -! -! return outcome; -! } -! -! owerror_t layerdebug_neighbors_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! owerror_t outcome; -! uint8_t size; -! -! -! if (coap_header->Code==COAP_CODE_REQ_GET) { -! // return current schedule value -! -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! size=neighbors_getNumNeighbors(); //compute the number of neigbours sent -! packetfunctions_reserveHeaderSize(msg,size*sizeof(netDebugNeigborEntry_t));//reserve for the size of schedule entries -! -! debugNetPrint_neighbors((netDebugNeigborEntry_t*)msg->payload); -! -! //now we know the size of the neihbours. Put it on the packet. -! packetfunctions_reserveHeaderSize(msg,1);//reserve for the size of neighbours entries -! msg->payload[0] = size; -! -! // set the CoAP header -! coap_header->Code = COAP_CODE_RESP_CONTENT; -! -! outcome = E_SUCCESS; -! -! } else { -! // return an error message -! outcome = E_FAIL; -! } -! -! return outcome; - } -\ No newline at end of file -diff -crB openwsn/07-App/layerdebug/layerdebug.h ../../../sys/net/openwsn/07-App/layerdebug/layerdebug.h -*** openwsn/07-App/layerdebug/layerdebug.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/layerdebug/layerdebug.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,26 **** -! #ifndef __LAYERDEBUG_H -! #define __LAYERDEBUG_H -! -! /** -! \addtogroup App -! \{ -! \addtogroup rT -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void layerdebug_init(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,26 ---- -! #ifndef __LAYERDEBUG_H -! #define __LAYERDEBUG_H -! -! /** -! \addtogroup AppCoAP -! \{ -! \addtogroup rT -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void layerdebug_init(); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/07-App/ohlone/Makefile ../../../sys/net/openwsn/07-App/ohlone/Makefile -*** openwsn/07-App/ohlone/Makefile Wed Jan 15 13:55:34 2014 ---- ../../../sys/net/openwsn/07-App/ohlone/Makefile Wed Jan 15 13:48:27 2014 -*************** -*** 0 **** ---- 1,32 ---- -+ SUBSUBMOD:=$(shell basename $(CURDIR)).a -+ #BINDIR = $(RIOTBASE)/bin/ -+ SRC = $(wildcard *.c) -+ OBJ = $(SRC:%.c=$(BINDIR)%.o) -+ DEP = $(SRC:%.c=$(BINDIR)%.d) -+ -+ INCLUDES += -I$(RIOTBASE) -I$(RIOTBASE)/sys/include -I$(RIOTBASE)/core/include -I$(RIOTBASE)/drivers/include -I$(RIOTBASE)/drivers/cc110x_ng/include -I$(RIOTBASE)/cpu/arm_common/include -I$(RIOTBASE)/sys/net/include/ -+ INCLUDES += -I$(CURDIR)/02a-MAClow -+ INCLUDES += -I$(CURDIR)/02b-MAChigh -+ INCLUDES += -I$(CURDIR)/03a-IPHC -+ INCLUDES += -I$(CURDIR)/03b-IPv6 -+ INCLUDES += -I$(CURDIR)/04-TRAN -+ INCLUDES += -I$(CURDIR)/cross-layers -+ -+ .PHONY: $(BINDIR)$(SUBSUBMOD) -+ -+ $(BINDIR)$(SUBSUBMOD): $(OBJ) -+ $(AD)$(AR) rcs $(BINDIR)$(MODULE) $(OBJ) -+ -+ # pull in dependency info for *existing* .o files -+ -include $(OBJ:.o=.d) -+ -+ # compile and generate dependency info -+ $(BINDIR)%.o: %.c -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d -+ @printf "$(BINDIR)" | cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d -+ -+ # remove compilation products -+ -+ clean: -+ rm -f $(OBJ) $(DEP) -diff -crB openwsn/07-App/ohlone/ohlone.c ../../../sys/net/openwsn/07-App/ohlone/ohlone.c -*** openwsn/07-App/ohlone/ohlone.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/ohlone/ohlone.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,120 **** -! #include "openwsn.h" -! #include "ohlone.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! #include "openserial.h" -! #include "opentcp.h" -! -! #include "ohlone_webpages.h" -! -! //=========================== variables ======================================= -! -! typedef struct { -! OpenQueueEntry_t* pkt; -! bool sending; -! uint16_t httpChunk; -! uint8_t getRequest[TCP_DEFAULT_WINDOW_SIZE]; -! } ohlone_vars_t; -! -! ohlone_vars_t ohlone_vars; -! -! //=========================== prototypes ====================================== -! -! void ohlone_sendpkt(); -! bool ohlone_check4chars(uint8_t c1[4], uint8_t c2[4]); -! -! //=========================== public ========================================== -! -! void ohlone_init() { -! ohlone_vars.httpChunk = 0; -! ohlone_vars.getRequest[0] = '/'; -! ohlone_vars.getRequest[1] = ' '; -! ohlone_webpages_init(); -! } -! -! bool ohlone_shouldIlisten() { -! return TRUE; -! } -! -! void ohlone_sendpkt() { -! uint8_t buffer[TCP_DEFAULT_WINDOW_SIZE]; -! uint8_t buffer_len; -! -! buffer_len = ohlone_webpage(ohlone_vars.getRequest, ohlone_vars.httpChunk++, buffer); -! -! if (buffer_len == 0) { -! // No more to send -! // close TCP session, but keep listening -! ohlone_vars.getRequest[0] = '/'; -! ohlone_vars.getRequest[1] = ' '; -! opentcp_close(); -! return; -! } -! -! ohlone_vars.pkt = openqueue_getFreePacketBuffer(COMPONENT_OHLONE); -! if (ohlone_vars.pkt==NULL) { -! openserial_printError(COMPONENT_OHLONE,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! opentcp_close(); -! return; -! } -! ohlone_vars.pkt->creator = COMPONENT_OHLONE; -! ohlone_vars.pkt->owner = COMPONENT_OHLONE; -! -! packetfunctions_reserveHeaderSize(ohlone_vars.pkt, buffer_len); -! memcpy(ohlone_vars.pkt->payload, buffer, buffer_len); -! -! if ((opentcp_send(ohlone_vars.pkt))==E_FAIL) { -! openqueue_freePacketBuffer(ohlone_vars.pkt); -! opentcp_close(); -! } -! -! } -! -! bool ohlone_check4chars(uint8_t c1[4], uint8_t c2[4]) { -! return ((c1[0] == c2[0]) && -! (c1[1] == c2[1]) && -! (c1[2] == c2[2]) && -! (c1[3] == c2[3])); -! } -! -! void ohlone_receive(OpenQueueEntry_t* msg) { -! uint8_t payload_index; -! -! for (payload_index=0;payload_index<msg->length-3;payload_index++) { -! if (ohlone_check4chars(msg->payload+payload_index,(unsigned char *) "GET ")) -! memcpy(ohlone_vars.getRequest, -! msg->payload + payload_index + 4, -! msg->length - payload_index - 4); -! -! if (ohlone_check4chars(msg->payload+payload_index, (unsigned char *)"\r\n\r\n")) { -! ohlone_vars.httpChunk = 0; -! ohlone_sendpkt(); -! return; -! } -! } -! openserial_printData((uint8_t*)(msg->payload),msg->length); -! openqueue_freePacketBuffer(msg); -! } -! -! void ohlone_sendDone(OpenQueueEntry_t* msg, error_t error) { -! msg->owner = COMPONENT_OHLONE; -! if (msg->creator!=COMPONENT_OHLONE) { -! openserial_printError(COMPONENT_OHLONE,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! -! ohlone_sendpkt(); -! openqueue_freePacketBuffer(msg); -! } -! -! void ohlone_connectDone(error_t error) { -! } -! -! bool ohlone_debugPrint() { -! return FALSE; -! } -! - //=========================== private ========================================= -\ No newline at end of file ---- 1,113 ---- -! #include "openwsn.h" -! #include "ohlone.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! #include "openserial.h" -! #include "opentcp.h" -! -! #include "ohlone_webpages.h" -! -! //=========================== variables ======================================= -! -! ohlone_vars_t ohlone_vars; -! -! //=========================== prototypes ====================================== -! -! void ohlone_sendpkt(void); -! bool ohlone_check4chars(uint8_t c1[4], uint8_t c2[4]); -! -! //=========================== public ========================================== -! -! void ohlone_init(void) { -! ohlone_vars.httpChunk = 0; -! ohlone_vars.getRequest[0] = '/'; -! ohlone_vars.getRequest[1] = ' '; -! ohlone_webpages_init(); -! } -! -! bool ohlone_shouldIlisten(void) { -! return TRUE; -! } -! -! void ohlone_sendpkt(void) { -! uint8_t buffer[TCP_DEFAULT_WINDOW_SIZE]; -! uint8_t buffer_len; -! -! buffer_len = ohlone_webpage(ohlone_vars.getRequest, ohlone_vars.httpChunk++, buffer); -! -! if (buffer_len == 0) { -! // No more to send -! // close TCP session, but keep listening -! ohlone_vars.getRequest[0] = '/'; -! ohlone_vars.getRequest[1] = ' '; -! opentcp_close(); -! return; -! } -! -! ohlone_vars.pkt = openqueue_getFreePacketBuffer(COMPONENT_OHLONE); -! if (ohlone_vars.pkt==NULL) { -! openserial_printError(COMPONENT_OHLONE,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! opentcp_close(); -! return; -! } -! ohlone_vars.pkt->creator = COMPONENT_OHLONE; -! ohlone_vars.pkt->owner = COMPONENT_OHLONE; -! -! packetfunctions_reserveHeaderSize(ohlone_vars.pkt, buffer_len); -! memcpy(ohlone_vars.pkt->payload, buffer, buffer_len); -! -! if ((opentcp_send(ohlone_vars.pkt))==E_FAIL) { -! openqueue_freePacketBuffer(ohlone_vars.pkt); -! opentcp_close(); -! } -! -! } -! -! bool ohlone_check4chars(uint8_t c1[4], uint8_t c2[4]) { -! return ((c1[0] == c2[0]) && -! (c1[1] == c2[1]) && -! (c1[2] == c2[2]) && -! (c1[3] == c2[3])); -! } -! -! void ohlone_receive(OpenQueueEntry_t* msg) { -! uint8_t payload_index; -! -! for (payload_index=0;payload_index<msg->length-3;payload_index++) { -! if (ohlone_check4chars(msg->payload+payload_index,(unsigned char *) "GET ")) -! memcpy(ohlone_vars.getRequest, -! msg->payload + payload_index + 4, -! msg->length - payload_index - 4); -! -! if (ohlone_check4chars(msg->payload+payload_index, (unsigned char *)"\r\n\r\n")) { -! ohlone_vars.httpChunk = 0; -! ohlone_sendpkt(); -! return; -! } -! } -! openserial_printData((uint8_t*)(msg->payload),msg->length); -! openqueue_freePacketBuffer(msg); -! } -! -! void ohlone_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! msg->owner = COMPONENT_OHLONE; -! if (msg->creator!=COMPONENT_OHLONE) { -! openserial_printError(COMPONENT_OHLONE,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! -! ohlone_sendpkt(); -! openqueue_freePacketBuffer(msg); -! } -! -! void ohlone_connectDone(owerror_t error) { -! } -! -! bool ohlone_debugPrint(void) { -! return FALSE; -! } -! - //=========================== private ========================================= -\ No newline at end of file -diff -crB openwsn/07-App/ohlone/ohlone.h ../../../sys/net/openwsn/07-App/ohlone/ohlone.h -*** openwsn/07-App/ohlone/ohlone.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/ohlone/ohlone.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,31 **** -! #ifndef __OHLONE_H -! #define __OHLONE_H -! -! /** -! \addtogroup App -! \{ -! \addtogroup ohlone -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void ohlone_init(); -! bool ohlone_shouldIlisten(); -! void ohlone_receive(OpenQueueEntry_t* msg); -! void ohlone_sendDone(OpenQueueEntry_t* msg, error_t error); -! void ohlone_connectDone(error_t error); -! bool ohlone_debugPrint(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,40 ---- -! #ifndef __OHLONE_H -! #define __OHLONE_H -! -! /** -! \addtogroup AppTcp -! \{ -! \addtogroup ohlone -! \{ -! */ -! -! #include "opentcp.h" -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== module variables ================================ -! -! typedef struct { -! OpenQueueEntry_t* pkt; -! bool sending; -! uint16_t httpChunk; -! uint8_t getRequest[TCP_DEFAULT_WINDOW_SIZE]; -! } ohlone_vars_t; -! -! //=========================== prototypes ====================================== -! -! void ohlone_init(void); -! bool ohlone_shouldIlisten(void); -! void ohlone_receive(OpenQueueEntry_t* msg); -! void ohlone_sendDone(OpenQueueEntry_t* msg, owerror_t error); -! void ohlone_connectDone(owerror_t error); -! bool ohlone_debugPrint(void); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/07-App/ohlone/ohlone_webpages.c ../../../sys/net/openwsn/07-App/ohlone/ohlone_webpages.c -*** openwsn/07-App/ohlone/ohlone_webpages.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/ohlone/ohlone_webpages.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,94 **** -! /** -! \brief Webpgages for Ohlone -! -! \author Ankur Mehta <mehtank@eecs.berkeley.edu>, September 2010 -! */ -! -! #include "openwsn.h" -! #include "ohlone_webpages.h" -! -! /* -! #include "gyro.h" -! #include "large_range_accel.h" -! #include "magnetometer.h" -! #include "sensitive_accel_temperature.h" -! */ -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! uint16_t ohlone_replace_digit(uint8_t *buffer, uint16_t value, uint16_t place); -! void ohlone_line_replace16(uint8_t *buffer, uint16_t value); -! uint8_t ohlone_insert3sensors(uint8_t *buffer, uint8_t *sensors); -! uint8_t ohlone_insert4sensors(uint8_t *buffer, uint8_t *sensors); -! -! //=========================== public ========================================== -! -! void ohlone_webpages_init() { -! /* -! if (*(&eui64+3)==0x09) { // this is a GINA board (not a basestation) -! gyro_init(); -! large_range_accel_init(); -! magnetometer_init(); -! sensitive_accel_temperature_init(); -! } -! */ -! } -! -! uint8_t ohlone_webpage(uint8_t *getRequest, uint16_t chunk, uint8_t *packet) { -! // TODO : enforce max of TCP_DEFAULT_WINDOW_SIZE -! uint8_t len = 0; -! uint8_t current_line = 0; -! current_line--; -! -! HTTP_LINE("HTTP/1.1 200 OK\r\n\r\n"); -! -! switch (*(getRequest + 1)) { -! -! default: -! memcpy(packet + len, ":)", 2); -! len += 2; -! } -! -! return len; -! } -! -! //=========================== private ========================================= -! -! uint16_t ohlone_replace_digit(uint8_t *buffer, uint16_t value, uint16_t place) { -! uint8_t digit = '0'; -! while (value > place) { -! value -= place; -! digit++; -! } -! *buffer = digit; -! return value; -! } -! -! void ohlone_line_replace16(uint8_t *buffer, uint16_t value) { -! value = ohlone_replace_digit(buffer++, value, 10000); -! value = ohlone_replace_digit(buffer++, value, 1000); -! value = ohlone_replace_digit(buffer++, value, 100); -! value = ohlone_replace_digit(buffer++, value, 10); -! value = ohlone_replace_digit(buffer++, value, 1); -! } -! -! uint8_t ohlone_insert3sensors(uint8_t *buffer, uint8_t *sensordata) { -! uint8_t len = 0; -! ohlone_line_replace16(buffer + len, (sensordata[0] << 8) + sensordata[1]); -! len += 5; buffer[len++] = ','; -! ohlone_line_replace16(buffer + len, (sensordata[2] << 8) + sensordata[3]); -! len += 5; buffer[len++] = ','; -! ohlone_line_replace16(buffer + len, (sensordata[4] << 8) + sensordata[5]); -! len += 5; -! return len; -! } -! -! uint8_t ohlone_insert4sensors(uint8_t *buffer, uint8_t *sensordata) { -! uint8_t len = ohlone_insert3sensors(buffer, sensordata); -! buffer[len++] = ','; -! ohlone_line_replace16(buffer + len, (sensordata[6] << 8) + sensordata[7]); -! len += 5; -! return len; - } -\ No newline at end of file ---- 1,94 ---- -! /** -! \brief Webpgages for Ohlone -! -! \author Ankur Mehta <mehtank@eecs.berkeley.edu>, September 2010 -! */ -! -! #include "openwsn.h" -! #include "ohlone_webpages.h" -! -! /* -! #include "gyro.h" -! #include "large_range_accel.h" -! #include "magnetometer.h" -! #include "sensitive_accel_temperature.h" -! */ -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! uint16_t ohlone_replace_digit(uint8_t *buffer, uint16_t value, uint16_t place); -! void ohlone_line_replace16(uint8_t *buffer, uint16_t value); -! uint8_t ohlone_insert3sensors(uint8_t *buffer, uint8_t *sensors); -! uint8_t ohlone_insert4sensors(uint8_t *buffer, uint8_t *sensors); -! -! //=========================== public ========================================== -! -! void ohlone_webpages_init(void) { -! /* -! if (*(&eui64+3)==0x09) { // this is a GINA board (not a basestation) -! gyro_init(); -! large_range_accel_init(); -! magnetometer_init(); -! sensitive_accel_temperature_init(); -! } -! */ -! } -! -! uint8_t ohlone_webpage(uint8_t *getRequest, uint16_t chunk, uint8_t *packet) { -! // TODO : enforce max of TCP_DEFAULT_WINDOW_SIZE -! uint8_t len = 0; -! uint8_t current_line = 0; -! current_line--; -! -! HTTP_LINE("HTTP/1.1 200 OK\r\n\r\n"); -! -! switch (*(getRequest + 1)) { -! -! default: -! memcpy(packet + len, ":)", 2); -! len += 2; -! } -! -! return len; -! } -! -! //=========================== private ========================================= -! -! uint16_t ohlone_replace_digit(uint8_t *buffer, uint16_t value, uint16_t place) { -! uint8_t digit = '0'; -! while (value > place) { -! value -= place; -! digit++; -! } -! *buffer = digit; -! return value; -! } -! -! void ohlone_line_replace16(uint8_t *buffer, uint16_t value) { -! value = ohlone_replace_digit(buffer++, value, 10000); -! value = ohlone_replace_digit(buffer++, value, 1000); -! value = ohlone_replace_digit(buffer++, value, 100); -! value = ohlone_replace_digit(buffer++, value, 10); -! value = ohlone_replace_digit(buffer++, value, 1); -! } -! -! uint8_t ohlone_insert3sensors(uint8_t *buffer, uint8_t *sensordata) { -! uint8_t len = 0; -! ohlone_line_replace16(buffer + len, (sensordata[0] << 8) + sensordata[1]); -! len += 5; buffer[len++] = ','; -! ohlone_line_replace16(buffer + len, (sensordata[2] << 8) + sensordata[3]); -! len += 5; buffer[len++] = ','; -! ohlone_line_replace16(buffer + len, (sensordata[4] << 8) + sensordata[5]); -! len += 5; -! return len; -! } -! -! uint8_t ohlone_insert4sensors(uint8_t *buffer, uint8_t *sensordata) { -! uint8_t len = ohlone_insert3sensors(buffer, sensordata); -! buffer[len++] = ','; -! ohlone_line_replace16(buffer + len, (sensordata[6] << 8) + sensordata[7]); -! len += 5; -! return len; - } -\ No newline at end of file -diff -crB openwsn/07-App/ohlone/ohlone_webpages.h ../../../sys/net/openwsn/07-App/ohlone/ohlone_webpages.h -*** openwsn/07-App/ohlone/ohlone_webpages.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/ohlone/ohlone_webpages.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,33 **** -! /** -! \brief Webpages for Ohlone -! -! \author Ankur Mehta <mehtank@eecs.berkeley.edu>, September 2010 -! */ -! -! #ifndef __OHLONEWEBPAGES_H -! #define __OHLONEWEBPAGES_H -! -! //=========================== define ========================================== -! -! #define HTTP_LINE(str) { \ -! if (chunk == ++current_line) { \ -! memcpy(packet, str, sizeof(str)-1); \ -! len = sizeof(str)-1; \ -! } \ -! } -! -! #define HTTP_LINE_REPLACE16(offset, value) { \ -! if (chunk == current_line) \ -! ohlone_line_replace16(packet+offset, value); \ -! } -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void ohlone_webpages_init(); -! uint8_t ohlone_webpage(uint8_t *getRequest, uint16_t chunk, uint8_t *packet); -! - #endif -\ No newline at end of file ---- 1,33 ---- -! /** -! \brief Webpages for Ohlone -! -! \author Ankur Mehta <mehtank@eecs.berkeley.edu>, September 2010 -! */ -! -! #ifndef __OHLONEWEBPAGES_H -! #define __OHLONEWEBPAGES_H -! -! //=========================== define ========================================== -! -! #define HTTP_LINE(str) { \ -! if (chunk == ++current_line) { \ -! memcpy(packet, str, sizeof(str)-1); \ -! len = sizeof(str)-1; \ -! } \ -! } -! -! #define HTTP_LINE_REPLACE16(offset, value) { \ -! if (chunk == current_line) \ -! ohlone_line_replace16(packet+offset, value); \ -! } -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void ohlone_webpages_init(void); -! uint8_t ohlone_webpage(uint8_t *getRequest, uint16_t chunk, uint8_t *packet); -! - #endif -\ No newline at end of file -diff -crB openwsn/07-App/r6tus/r6tus.c ../../../sys/net/openwsn/07-App/r6tus/r6tus.c -*** openwsn/07-App/r6tus/r6tus.c Wed Jan 15 13:55:34 2014 ---- ../../../sys/net/openwsn/07-App/r6tus/r6tus.c Wed Jan 15 13:48:27 2014 -*************** -*** 0 **** ---- 1,211 ---- -+ /** -+ \brief CoAP schedule manager application. -+ -+ \author Xavi Vilajosana <xvilajosana@eecs.berkeley.edu>, Feb. 2013. -+ -+ */ -+ -+ #include "openwsn.h" -+ #include "r6tus.h" -+ #include "opentimers.h" -+ #include "openqueue.h" -+ #include "packetfunctions.h" -+ #include "openserial.h" -+ #include "scheduler.h" -+ #include "schedule.h" -+ #include "idmanager.h" -+ -+ //=========================== defines ========================================= -+ -+ #define TSCH_GET_OPTIONS 4 //how many params in a get request. -+ -+ const uint8_t r6tus_path0[] = "6tus"; -+ -+ //=========================== variables ======================================= -+ -+ r6tus_vars_t r6tus_vars; -+ -+ //=========================== prototypes ====================================== -+ -+ owerror_t r6tus_receive(OpenQueueEntry_t* msg, -+ coap_header_iht* coap_header, -+ coap_option_iht* coap_options); -+ -+ void r6tus_sendDone(OpenQueueEntry_t* msg, -+ owerror_t error); -+ -+ //=========================== public ========================================== -+ -+ void r6tus_init() { -+ -+ if(idmanager_getIsDAGroot()==TRUE) return; -+ // prepare the resource descriptor for the /r6tus path -+ r6tus_vars.desc.path0len = sizeof(r6tus_path0)-1; -+ r6tus_vars.desc.path0val = (uint8_t*)(&r6tus_path0); -+ r6tus_vars.desc.path1len = 0; -+ r6tus_vars.desc.path1val = NULL; -+ r6tus_vars.desc.componentID = COMPONENT_R6TUS; -+ r6tus_vars.desc.callbackRx = &r6tus_receive; -+ r6tus_vars.desc.callbackSendDone = &r6tus_sendDone; -+ -+ opencoap_register(&r6tus_vars.desc); -+ } -+ -+ //=========================== private ========================================= -+ -+ /** -+ \brief Receives a command and a list of items to be used by the command. -+ -+ the coap payload contains, command_type (CREATE,READ,UPDATE,DELETE) number of -+ items to be processed. -+ A tuple including address,slotoffset,choffset,whether is shared or not and link -+ type. -+ -+ According to the command it returns the list of responses or the required -+ information. -+ */ -+ owerror_t r6tus_receive(OpenQueueEntry_t* msg, -+ coap_header_iht* coap_header, -+ coap_option_iht* coap_options) { -+ -+ uint8_t i; -+ owerror_t outcome; -+ r6tus_command_t* link_command; -+ r6tus_command_t getResponse; -+ slotinfo_element_t* link_element; -+ slotinfo_element_t getLink_elementResponse; -+ open_addr_t temp_addr; -+ owerror_t responses[R6TUS_MAXRESPONSES]; -+ //assuming data comes in binary format. -+ -+ if (coap_header->Code==COAP_CODE_REQ_GET) { -+ outcome = E_SUCCESS; -+ // parsing the options from header -+ // assuming the following header: /6tus/LinkComandType/targetSlot/targetAddress -+ // if (coap_header->OC != TSCH_GET_OPTIONS) { -+ //option[0] is 6tus -+ getResponse.type=(link_command_t)coap_options[1].pValue[0]; -+ if (getResponse.type != READ_LINK){ -+ //fail if this is not a READ REQUEST -+ outcome = E_FAIL; -+ coap_header->Code = COAP_CODE_RESP_CONTENT; -+ //return as this is not the right request. -+ return outcome; -+ } -+ -+ getResponse.numelem = 1; //get is always for 1 element. -+ getLink_elementResponse.slotOffset=coap_options[2].pValue[0]; -+ -+ switch (coap_options[3].length){ -+ case ADDR_16B: -+ temp_addr.type=ADDR_16B; -+ memcpy(&(temp_addr.addr_16b[0]), &(coap_options[3].pValue[0]),LENGTH_ADDR16b); -+ schedule_getSlotInfo(getLink_elementResponse.slotOffset, &temp_addr, &getLink_elementResponse); -+ outcome = E_SUCCESS; -+ break; -+ case ADDR_64B: -+ temp_addr.type=ADDR_64B; -+ memcpy(&(temp_addr.addr_64b[0]), &(coap_options[3].pValue[0]),LENGTH_ADDR64b); -+ schedule_getSlotInfo(getLink_elementResponse.slotOffset, &temp_addr, &getLink_elementResponse); -+ outcome = E_SUCCESS; -+ break; -+ case ADDR_128B: -+ // not supported -+ outcome = E_FAIL; -+ break; -+ default: -+ outcome = E_FAIL; -+ break; -+ } -+ -+ coap_header->Code = COAP_CODE_RESP_CONTENT; -+ // By using the same link_element we don't need to write the packet. -+ // It returns the same payload but with the correct values. -+ if (outcome==E_SUCCESS) { -+ // write the payload in the response. -+ packetfunctions_reserveHeaderSize(msg,sizeof(slotinfo_element_t)); -+ memcpy(&msg->payload[0],&getLink_elementResponse,sizeof(slotinfo_element_t)); -+ } -+ } else if (coap_header->Code==COAP_CODE_REQ_PUT) { -+ link_command = (r6tus_command_t*) msg->payload; -+ //parsing all cases at post as we want params. once tested we can decide. GET does not accept params -+ //so params should be encoded in the url. -+ switch (link_command->type){ -+ case READ_LINK: -+ outcome=E_FAIL; -+ //cannot put READ operation -+ break; -+ case CREATE_LINK: -+ case UPDATE_LINK: //update should be post according to REST architecture. -+ outcome=E_FAIL; -+ if (link_command->numelem<R6TUS_MAXRESPONSES) { -+ for (i=0;i<link_command->numelem;i++) { -+ link_element=(slotinfo_element_t*) &(msg->payload[sizeof(r6tus_command_t)+i*sizeof(slotinfo_element_t)]); -+ temp_addr.type=ADDR_64B; -+ memcpy(&(temp_addr.addr_64b[0]), &(link_element->address[0]),LENGTH_ADDR64b); -+ responses[i]=schedule_addActiveSlot(link_element->slotOffset,link_element->link_type,link_element->shared,link_element->channelOffset,&temp_addr,(link_command->type==UPDATE_LINK)); -+ } -+ outcome=E_SUCCESS; -+ } -+ break; -+ case DELETE_LINK: -+ outcome=E_FAIL; -+ //cannot delete with PUT/POST -+ break; -+ default: -+ openserial_printError(COMPONENT_R6TUS,ERR_COMMAND_NOT_ALLOWED, -+ (errorparameter_t)0, -+ (errorparameter_t)0 -+ ); -+ //who clears the packet?? -+ //error. Print error and send error msg. -+ outcome = E_FAIL; -+ break; -+ } -+ //response of the post -+ if (outcome==E_SUCCESS){ -+ -+ // reset packet payload -+ msg->payload = &(msg->packet[127]); -+ msg->length = 0; -+ //copy the response. -+ -+ //packetfunctions_reserveHeaderSize(msg,link_command->numelem); -+ //memcpy(&(msg->payload[0]), &(responses[0]),link_command->numelem); -+ -+ // set the CoAP header -+ coap_header->Code = COAP_CODE_RESP_CONTENT; -+ } -+ } else if (coap_header->Code==COAP_CODE_REQ_DELETE) { -+ link_command = (r6tus_command_t*) msg->payload; -+ switch (link_command->type){ -+ case DELETE_LINK: -+ outcome=E_FAIL; -+ if (link_command->numelem<R6TUS_MAXRESPONSES){ -+ for(i=0;i<link_command->numelem;i++) { -+ link_element=(slotinfo_element_t*) &(msg->payload[sizeof(r6tus_command_t)+i*sizeof(slotinfo_element_t)]); -+ temp_addr.type=ADDR_64B; -+ memcpy(&(temp_addr.addr_64b[0]), &(link_element->address[0]),LENGTH_ADDR64b); -+ //remove the required links. -+ responses[i]=schedule_removeActiveSlot(link_element->slotOffset,&temp_addr); -+ } -+ outcome=E_SUCCESS; -+ } -+ break; -+ default: -+ openserial_printError(COMPONENT_R6TUS,ERR_COMMAND_NOT_ALLOWED, -+ (errorparameter_t)0, -+ (errorparameter_t)0); -+ //who clears the packet?? -+ //error. Print error and send error msg. -+ outcome = E_FAIL; -+ break; -+ } -+ } -+ return outcome; -+ } -+ -+ -+ void r6tus_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -+ openqueue_freePacketBuffer(msg); -+ } -diff -crB openwsn/07-App/r6tus/r6tus.h ../../../sys/net/openwsn/07-App/r6tus/r6tus.h -*** openwsn/07-App/r6tus/r6tus.h Wed Jan 15 13:55:34 2014 ---- ../../../sys/net/openwsn/07-App/r6tus/r6tus.h Wed Jan 15 13:48:27 2014 -*************** -*** 0 **** ---- 1,60 ---- -+ /** -+ \brief CoAP schedule manager application. -+ -+ \author Xavi Vilajosana <xvilajosana@eecs.berkeley.edu>, Feb. 2013. -+ -+ */ -+ -+ -+ #ifndef __RSCHED_H -+ #define __RSCHED_H -+ -+ /** -+ \addtogroup AppCoAP -+ \{ -+ \addtogroup rsched -+ \{ -+ */ -+ -+ #include "openwsn.h" -+ #include "opencoap.h" -+ #include "schedule.h" -+ -+ //=========================== define ========================================== -+ -+ #define R6TUS_MAXRESPONSES 20 //max number of elements to be processed by a command. -+ -+ //=========================== typedef ========================================= -+ -+ //CRUD OPERATIONS FOR LINKS. -+ typedef enum { -+ CREATE_LINK = 0, -+ READ_LINK = 1, -+ UPDATE_LINK = 2, -+ DELETE_LINK = 3, -+ }link_command_t; -+ -+ //header -+ PRAGMA(pack(1)); //elements for slot info -+ typedef struct { -+ link_command_t type; -+ uint8_t numelem;//number of elements -+ }r6tus_command_t; -+ PRAGMA(pack()); -+ -+ //=========================== variables ======================================= -+ -+ typedef struct { -+ coap_resource_desc_t desc; -+ } r6tus_vars_t; -+ -+ //=========================== prototypes ====================================== -+ -+ void r6tus_init(); -+ -+ /** -+ \} -+ \} -+ */ -+ -+ #endif -diff -crB openwsn/07-App/rex/rex.c ../../../sys/net/openwsn/07-App/rex/rex.c -*** openwsn/07-App/rex/rex.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/rex/rex.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,149 **** -! #include "openwsn.h" -! #include "rex.h" -! #include "opencoap.h" -! #include "opentimers.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! #include "openserial.h" -! #include "openrandom.h" -! #include "scheduler.h" -! //#include "ADC_Channel.h" -! -! //=========================== defines ========================================= -! -! /// inter-packet period (in ms) -! #define REXPERIOD 10000 -! #define PAYLOADLEN 62 -! -! const uint8_t rex_path0[] = "rex"; -! -! //=========================== variables ======================================= -! -! typedef struct { -! coap_resource_desc_t desc; -! opentimer_id_t timerId; -! } rex_vars_t; -! -! rex_vars_t rex_vars; -! -! //=========================== prototypes ====================================== -! -! error_t rex_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! void rex_timer_cb(); -! void rex_task_cb(); -! void rex_sendDone(OpenQueueEntry_t* msg, -! error_t error); -! -! //=========================== public ========================================== -! -! void rex_init() { -! -! // prepare the resource descriptor for the /rex path -! rex_vars.desc.path0len = sizeof(rex_path0)-1; -! rex_vars.desc.path0val = (uint8_t*)(&rex_path0); -! rex_vars.desc.path1len = 0; -! rex_vars.desc.path1val = NULL; -! rex_vars.desc.componentID = COMPONENT_REX; -! rex_vars.desc.callbackRx = &rex_receive; -! rex_vars.desc.callbackSendDone = &rex_sendDone; -! -! -! opencoap_register(&rex_vars.desc); -! rex_vars.timerId = opentimers_start(REXPERIOD, -! TIMER_PERIODIC,TIME_MS, -! rex_timer_cb); -! } -! -! //=========================== private ========================================= -! -! error_t rex_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! return E_FAIL; -! } -! -! //timer fired, but we don't want to execute task in ISR mode -! //instead, push task to scheduler with COAP priority, and let scheduler take care of it -! void rex_timer_cb(){ -! scheduler_push_task(rex_task_cb,TASKPRIO_COAP); -! } -! -! void rex_task_cb() { -! OpenQueueEntry_t* pkt; -! error_t outcome; -! uint8_t numOptions; -! uint8_t i; -! -! uint16_t x_int = 0; -! //uint16_t* p_x_int = &x_int; -! uint16_t sum = 0; -! uint16_t avg = 0; -! uint8_t N_avg = 10; -! -! for (int i = 0; i < N_avg; i++) -! { -! //ADC_getvoltage(p_x_int); -! -! sum += x_int; -! } -! avg = sum/N_avg; -! -! -! // create a CoAP RD packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_REX); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_REX,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(pkt); -! return; -! } -! // take ownership over that packet -! pkt->creator = COMPONENT_REX; -! pkt->owner = COMPONENT_REX; -! // CoAP payload -! packetfunctions_reserveHeaderSize(pkt,PAYLOADLEN); -! for (i=0;i<PAYLOADLEN;i++) { -! pkt->payload[i] = i; -! } -! avg = openrandom_get16b(); -! pkt->payload[0] = (avg>>8)&0xff; -! pkt->payload[1] = (avg>>0)&0xff; -! -! numOptions = 0; -! // location-path option -! packetfunctions_reserveHeaderSize(pkt,sizeof(rex_path0)-1); -! memcpy(&pkt->payload[0],&rex_path0,sizeof(rex_path0)-1); -! packetfunctions_reserveHeaderSize(pkt,1); -! pkt->payload[0] = (COAP_OPTION_LOCATIONPATH-COAP_OPTION_CONTENTTYPE) << 4 | -! sizeof(rex_path0)-1; -! numOptions++; -! // content-type option -! packetfunctions_reserveHeaderSize(pkt,2); -! pkt->payload[0] = COAP_OPTION_CONTENTTYPE << 4 | -! 1; -! pkt->payload[1] = COAP_MEDTYPE_APPOCTETSTREAM; -! numOptions++; -! // metadata -! pkt->l4_destination_port = WKP_UDP_COAP; -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&pkt->l3_destinationAdd.addr_128b[0],&ipAddr_motesEecs,16); -! // send -! outcome = opencoap_send(pkt, -! COAP_TYPE_NON, -! COAP_CODE_REQ_PUT, -! numOptions, -! &rex_vars.desc); -! // avoid overflowing the queue if fails -! if (outcome==E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! -! return; -! } -! -! void rex_sendDone(OpenQueueEntry_t* msg, error_t error) { -! openqueue_freePacketBuffer(msg); -! } ---- 1,159 ---- -! #include "openwsn.h" -! #include "rex.h" -! #include "opencoap.h" -! #include "opentimers.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! #include "openserial.h" -! #include "openrandom.h" -! #include "scheduler.h" -! //#include "ADC_Channel.h" -! #include "idmanager.h" -! #include "IEEE802154E.h" -! -! //=========================== defines ========================================= -! -! /// inter-packet period (in ms) -! #define REXPERIOD 10000 -! #define PAYLOADLEN 62 -! -! const uint8_t rex_path0[] = "rex"; -! -! //=========================== variables ======================================= -! -! typedef struct { -! coap_resource_desc_t desc; -! opentimer_id_t timerId; -! } rex_vars_t; -! -! rex_vars_t rex_vars; -! -! //=========================== prototypes ====================================== -! -! owerror_t rex_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! void rex_timer_cb(); -! void rex_task_cb(); -! void rex_sendDone(OpenQueueEntry_t* msg, -! owerror_t error); -! -! //=========================== public ========================================== -! -! void rex_init() { -! -! // prepare the resource descriptor for the /rex path -! rex_vars.desc.path0len = sizeof(rex_path0)-1; -! rex_vars.desc.path0val = (uint8_t*)(&rex_path0); -! rex_vars.desc.path1len = 0; -! rex_vars.desc.path1val = NULL; -! rex_vars.desc.componentID = COMPONENT_REX; -! rex_vars.desc.callbackRx = &rex_receive; -! rex_vars.desc.callbackSendDone = &rex_sendDone; -! -! -! opencoap_register(&rex_vars.desc); -! rex_vars.timerId = opentimers_start(REXPERIOD, -! TIMER_PERIODIC,TIME_MS, -! rex_timer_cb); -! } -! -! //=========================== private ========================================= -! -! owerror_t rex_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! return E_FAIL; -! } -! -! //timer fired, but we don't want to execute task in ISR mode -! //instead, push task to scheduler with COAP priority, and let scheduler take care of it -! void rex_timer_cb(){ -! scheduler_push_task(rex_task_cb,TASKPRIO_COAP); -! } -! -! void rex_task_cb() { -! OpenQueueEntry_t* pkt; -! owerror_t outcome; -! uint8_t numOptions; -! uint8_t i; -! -! uint16_t x_int = 0; -! //uint16_t* p_x_int = &x_int; -! uint16_t sum = 0; -! uint16_t avg = 0; -! uint8_t N_avg = 10; -! -! // don't run if not synch -! if (ieee154e_isSynch() == FALSE) return; -! -! // don't run on dagroot -! if (idmanager_getIsDAGroot()) { -! opentimers_stop(rex_vars.timerId); -! return; -! } -! -! -! for (i = 0; i < N_avg; i++) { -! //ADC_getvoltage(p_x_int); -! sum += x_int; -! } -! avg = sum/N_avg; -! -! -! // create a CoAP RD packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_REX); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_REX,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(pkt); -! return; -! } -! // take ownership over that packet -! pkt->creator = COMPONENT_REX; -! pkt->owner = COMPONENT_REX; -! // CoAP payload -! packetfunctions_reserveHeaderSize(pkt,PAYLOADLEN); -! for (i=0;i<PAYLOADLEN;i++) { -! pkt->payload[i] = i; -! } -! avg = openrandom_get16b(); -! pkt->payload[0] = (avg>>8)&0xff; -! pkt->payload[1] = (avg>>0)&0xff; -! -! numOptions = 0; -! // location-path option -! packetfunctions_reserveHeaderSize(pkt,sizeof(rex_path0)-1); -! memcpy(&pkt->payload[0],&rex_path0,sizeof(rex_path0)-1); -! packetfunctions_reserveHeaderSize(pkt,1); -! pkt->payload[0] = (COAP_OPTION_NUM_URIPATH) << 4 | -! sizeof(rex_path0)-1; -! numOptions++; -! // content-type option -! packetfunctions_reserveHeaderSize(pkt,2); -! pkt->payload[0] = COAP_OPTION_NUM_CONTENTFORMAT << 4 | -! 1; -! pkt->payload[1] = COAP_MEDTYPE_APPOCTETSTREAM; -! numOptions++; -! // metadata -! pkt->l4_destination_port = WKP_UDP_COAP; -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&pkt->l3_destinationAdd.addr_128b[0],&ipAddr_motesEecs,16); -! // send -! outcome = opencoap_send(pkt, -! COAP_TYPE_NON, -! COAP_CODE_REQ_PUT, -! numOptions, -! &rex_vars.desc); -! // avoid overflowing the queue if fails -! if (outcome==E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! -! return; -! } -! -! void rex_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! openqueue_freePacketBuffer(msg); -! } -diff -crB openwsn/07-App/rex/rex.h ../../../sys/net/openwsn/07-App/rex/rex.h -*** openwsn/07-App/rex/rex.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/rex/rex.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,26 **** -! #ifndef __REX_H -! #define __REX_H -! -! /** -! \addtogroup App -! \{ -! \addtogroup rT -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void rex_init(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,26 ---- -! #ifndef __REX_H -! #define __REX_H -! -! /** -! \addtogroup AppUdp -! \{ -! \addtogroup rT -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void rex_init(); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/07-App/rheli/rheli.c ../../../sys/net/openwsn/07-App/rheli/rheli.c -*** openwsn/07-App/rheli/rheli.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/rheli/rheli.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,84 **** -! #include "openwsn.h" -! #include "rheli.h" -! #include "opentimers.h" -! #include "opencoap.h" -! #include "packetfunctions.h" -! #include "heli.h" -! #include "openqueue.h" -! -! //=========================== variables ======================================= -! -! typedef struct { -! coap_resource_desc_t desc; -! opentimer_id_t timerId; -! } rheli_vars_t; -! -! rheli_vars_t rheli_vars; -! -! const uint8_t rheli_path0[] = "h"; -! -! //=========================== prototypes ====================================== -! -! error_t rheli_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! void rheli_timer(); -! void rheli_sendDone(OpenQueueEntry_t* msg, -! error_t error); -! -! //=========================== public ========================================== -! -! void rheli_init() { -! // initialize the heli drivers -! heli_init(); -! -! // prepare the resource descriptor -! rheli_vars.desc.path0len = sizeof(rheli_path0)-1; -! rheli_vars.desc.path0val = (uint8_t*)(&rheli_path0); -! rheli_vars.desc.path1len = 0; -! rheli_vars.desc.path1val = NULL; -! rheli_vars.desc.componentID = COMPONENT_RHELI; -! rheli_vars.desc.callbackRx = &rheli_receive; -! rheli_vars.desc.callbackSendDone = &rheli_sendDone; -! -! opencoap_register(&rheli_vars.desc); -! rheli_vars.timerId = opentimers_start(1000, -! TIMER_PERIODIC,TIME_MS, -! rheli_timer); -! } -! -! //=========================== private ========================================= -! -! error_t rheli_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! error_t outcome; -! -! if (coap_header->Code==COAP_CODE_REQ_POST) { -! -! // switch on the heli -! heli_on(); -! -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! // set the CoAP header -! coap_header->OC = 0; -! coap_header->Code = COAP_CODE_RESP_CHANGED; -! -! outcome = E_SUCCESS; -! } else { -! outcome = E_FAIL; -! } -! return outcome; -! } -! -! void rheli_timer() { -! // switch off the heli -! heli_off(); -! } -! -! void rheli_sendDone(OpenQueueEntry_t* msg, error_t error) { -! openqueue_freePacketBuffer(msg); - } -\ No newline at end of file ---- 1,83 ---- -! #include "openwsn.h" -! #include "rheli.h" -! #include "opentimers.h" -! #include "opencoap.h" -! #include "packetfunctions.h" -! #include "heli.h" -! #include "openqueue.h" -! -! //=========================== variables ======================================= -! -! typedef struct { -! coap_resource_desc_t desc; -! opentimer_id_t timerId; -! } rheli_vars_t; -! -! rheli_vars_t rheli_vars; -! -! const uint8_t rheli_path0[] = "h"; -! -! //=========================== prototypes ====================================== -! -! owerror_t rheli_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! void rheli_timer(); -! void rheli_sendDone(OpenQueueEntry_t* msg, -! owerror_t error); -! -! //=========================== public ========================================== -! -! void rheli_init() { -! // initialize the heli drivers -! heli_init(); -! -! // prepare the resource descriptor -! rheli_vars.desc.path0len = sizeof(rheli_path0)-1; -! rheli_vars.desc.path0val = (uint8_t*)(&rheli_path0); -! rheli_vars.desc.path1len = 0; -! rheli_vars.desc.path1val = NULL; -! rheli_vars.desc.componentID = COMPONENT_RHELI; -! rheli_vars.desc.callbackRx = &rheli_receive; -! rheli_vars.desc.callbackSendDone = &rheli_sendDone; -! -! opencoap_register(&rheli_vars.desc); -! rheli_vars.timerId = opentimers_start(1000, -! TIMER_PERIODIC,TIME_MS, -! rheli_timer); -! } -! -! //=========================== private ========================================= -! -! owerror_t rheli_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! owerror_t outcome; -! -! if (coap_header->Code==COAP_CODE_REQ_POST) { -! -! // switch on the heli -! heli_on(); -! -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! // set the CoAP header -! coap_header->Code = COAP_CODE_RESP_CHANGED; -! -! outcome = E_SUCCESS; -! } else { -! outcome = E_FAIL; -! } -! return outcome; -! } -! -! void rheli_timer() { -! // switch off the heli -! heli_off(); -! } -! -! void rheli_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! openqueue_freePacketBuffer(msg); - } -\ No newline at end of file -diff -crB openwsn/07-App/rheli/rheli.h ../../../sys/net/openwsn/07-App/rheli/rheli.h -*** openwsn/07-App/rheli/rheli.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/rheli/rheli.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,26 **** -! #ifndef __RHELI_H -! #define __RHELI_H -! -! /** -! \addtogroup App -! \{ -! \addtogroup rHeli -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void rheli_init(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,26 ---- -! #ifndef __RHELI_H -! #define __RHELI_H -! -! /** -! \addtogroup AppCoAP -! \{ -! \addtogroup rHeli -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void rheli_init(); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/07-App/rinfo/Makefile ../../../sys/net/openwsn/07-App/rinfo/Makefile -*** openwsn/07-App/rinfo/Makefile Wed Jan 15 13:55:34 2014 ---- ../../../sys/net/openwsn/07-App/rinfo/Makefile Wed Jan 15 13:48:27 2014 -*************** -*** 0 **** ---- 1,32 ---- -+ SUBSUBMOD:=$(shell basename $(CURDIR)).a -+ #BINDIR = $(RIOTBASE)/bin/ -+ SRC = $(wildcard *.c) -+ OBJ = $(SRC:%.c=$(BINDIR)%.o) -+ DEP = $(SRC:%.c=$(BINDIR)%.d) -+ -+ INCLUDES += -I$(RIOTBASE) -I$(RIOTBASE)/sys/include -I$(RIOTBASE)/core/include -I$(RIOTBASE)/drivers/include -I$(RIOTBASE)/drivers/cc110x_ng/include -I$(RIOTBASE)/cpu/arm_common/include -I$(RIOTBASE)/sys/net/include/ -+ INCLUDES += -I$(CURDIR)/02a-MAClow -+ INCLUDES += -I$(CURDIR)/02b-MAChigh -+ INCLUDES += -I$(CURDIR)/03a-IPHC -+ INCLUDES += -I$(CURDIR)/03b-IPv6 -+ INCLUDES += -I$(CURDIR)/04-TRAN -+ INCLUDES += -I$(CURDIR)/cross-layers -+ -+ .PHONY: $(BINDIR)$(SUBSUBMOD) -+ -+ $(BINDIR)$(SUBSUBMOD): $(OBJ) -+ $(AD)$(AR) rcs $(BINDIR)$(MODULE) $(OBJ) -+ -+ # pull in dependency info for *existing* .o files -+ -include $(OBJ:.o=.d) -+ -+ # compile and generate dependency info -+ $(BINDIR)%.o: %.c -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d -+ @printf "$(BINDIR)" | cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d -+ -+ # remove compilation products -+ -+ clean: -+ rm -f $(OBJ) $(DEP) -diff -crB openwsn/07-App/rinfo/rinfo.c ../../../sys/net/openwsn/07-App/rinfo/rinfo.c -*** openwsn/07-App/rinfo/rinfo.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/rinfo/rinfo.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,99 **** -! #include "openwsn.h" -! #include "rinfo.h" -! #include "opencoap.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! #include "openserial.h" -! #include "openrandom.h" -! #include "board.h" -! -! //=========================== defines ========================================= -! -! const uint8_t rinfo_path0[] = "i"; -! -! //=========================== variables ======================================= -! -! typedef struct { -! coap_resource_desc_t desc; -! } rinfo_vars_t; -! -! rinfo_vars_t rinfo_vars; -! -! //=========================== prototypes ====================================== -! -! error_t rinfo_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! void rinfo_sendDone(OpenQueueEntry_t* msg, -! error_t error); -! -! //=========================== public ========================================== -! -! void rinfo_init() { -! // prepare the resource descriptor for the /temp path -! rinfo_vars.desc.path0len = sizeof(rinfo_path0)-1; -! rinfo_vars.desc.path0val = (uint8_t*)(&rinfo_path0); -! rinfo_vars.desc.path1len = 0; -! rinfo_vars.desc.path1val = NULL; -! rinfo_vars.desc.componentID = COMPONENT_RINFO; -! rinfo_vars.desc.callbackRx = &rinfo_receive; -! rinfo_vars.desc.callbackSendDone = &rinfo_sendDone; -! -! opencoap_register(&rinfo_vars.desc); -! } -! -! //=========================== private ========================================= -! -! error_t rinfo_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! error_t outcome; -! -! if (coap_header->Code==COAP_CODE_REQ_GET) { -! -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! // CoAP payload -! //==radio name -! packetfunctions_reserveHeaderSize(msg,sizeof(infoRadioName)-1); -! memcpy(&msg->payload[0],&infoRadioName,sizeof(infoRadioName)-1); -! //==uC name -! packetfunctions_reserveHeaderSize(msg,1); -! msg->payload[0] = '\n'; -! packetfunctions_reserveHeaderSize(msg,sizeof(infouCName)-1); -! memcpy(&msg->payload[0],&infouCName,sizeof(infouCName)-1); -! //==board name -! packetfunctions_reserveHeaderSize(msg,1); -! msg->payload[0] = '\n'; -! packetfunctions_reserveHeaderSize(msg,sizeof(infoBoardname)-1); -! memcpy(&msg->payload[0],&infoBoardname,sizeof(infoBoardname)-1); -! //==stackname -! packetfunctions_reserveHeaderSize(msg,1); -! msg->payload[0] = '\n'; -! packetfunctions_reserveHeaderSize(msg,sizeof(infoStackName)-1+5); -! memcpy(&msg->payload[0],&infoStackName,sizeof(infoStackName)-1); -! msg->payload[sizeof(infoStackName)-1+5-5] = '0'+OPENWSN_VERSION_MAJOR; -! msg->payload[sizeof(infoStackName)-1+5-4] = '.'; -! msg->payload[sizeof(infoStackName)-1+5-3] = '0'+OPENWSN_VERSION_MINOR; -! msg->payload[sizeof(infoStackName)-1+5-2] = '.'; -! msg->payload[sizeof(infoStackName)-1+5-1] = '0'+OPENWSN_VERSION_PATCH; -! -! // set the CoAP header -! coap_header->OC = 0; -! coap_header->Code = COAP_CODE_RESP_CONTENT; -! -! outcome = E_SUCCESS; -! -! } else { -! // return an error message -! outcome = E_FAIL; -! } -! -! return outcome; -! } -! -! void rinfo_sendDone(OpenQueueEntry_t* msg, error_t error) { -! openqueue_freePacketBuffer(msg); - } -\ No newline at end of file ---- 1,102 ---- -! #include "openwsn.h" -! #include "rinfo.h" -! #include "opencoap.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! #include "openserial.h" -! #include "openrandom.h" -! #include "board.h" -! #include "idmanager.h" -! -! //=========================== defines ========================================= -! -! const uint8_t rinfo_path0[] = "i"; -! -! //=========================== variables ======================================= -! -! typedef struct { -! coap_resource_desc_t desc; -! } rinfo_vars_t; -! -! rinfo_vars_t rinfo_vars; -! -! //=========================== prototypes ====================================== -! -! owerror_t rinfo_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! void rinfo_sendDone(OpenQueueEntry_t* msg, -! owerror_t error); -! -! //=========================== public ========================================== -! -! void rinfo_init(void) { -! -! -! if(idmanager_getIsDAGroot()==TRUE) return; -! // prepare the resource descriptor for the /temp path -! rinfo_vars.desc.path0len = sizeof(rinfo_path0)-1; -! rinfo_vars.desc.path0val = (uint8_t*)(&rinfo_path0); -! rinfo_vars.desc.path1len = 0; -! rinfo_vars.desc.path1val = NULL; -! rinfo_vars.desc.componentID = COMPONENT_RINFO; -! rinfo_vars.desc.callbackRx = &rinfo_receive; -! rinfo_vars.desc.callbackSendDone = &rinfo_sendDone; -! -! opencoap_register(&rinfo_vars.desc); -! } -! -! //=========================== private ========================================= -! -! owerror_t rinfo_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! owerror_t outcome; -! -! if (coap_header->Code==COAP_CODE_REQ_GET) { -! -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! // CoAP payload -! //==radio name -! packetfunctions_reserveHeaderSize(msg,sizeof(infoRadioName)-1); -! memcpy(&msg->payload[0],&infoRadioName,sizeof(infoRadioName)-1); -! //==uC name -! packetfunctions_reserveHeaderSize(msg,1); -! msg->payload[0] = '\n'; -! packetfunctions_reserveHeaderSize(msg,sizeof(infouCName)-1); -! memcpy(&msg->payload[0],&infouCName,sizeof(infouCName)-1); -! //==board name -! packetfunctions_reserveHeaderSize(msg,1); -! msg->payload[0] = '\n'; -! packetfunctions_reserveHeaderSize(msg,sizeof(infoBoardname)-1); -! memcpy(&msg->payload[0],&infoBoardname,sizeof(infoBoardname)-1); -! //==stackname -! packetfunctions_reserveHeaderSize(msg,1); -! msg->payload[0] = '\n'; -! packetfunctions_reserveHeaderSize(msg,sizeof(infoStackName)-1+5); -! memcpy(&msg->payload[0],&infoStackName,sizeof(infoStackName)-1); -! msg->payload[sizeof(infoStackName)-1+5-5] = '0'+OPENWSN_VERSION_MAJOR; -! msg->payload[sizeof(infoStackName)-1+5-4] = '.'; -! msg->payload[sizeof(infoStackName)-1+5-3] = '0'+OPENWSN_VERSION_MINOR; -! msg->payload[sizeof(infoStackName)-1+5-2] = '.'; -! msg->payload[sizeof(infoStackName)-1+5-1] = '0'+OPENWSN_VERSION_PATCH; -! -! // set the CoAP header -! coap_header->Code = COAP_CODE_RESP_CONTENT; -! -! outcome = E_SUCCESS; -! -! } else { -! // return an error message -! outcome = E_FAIL; -! } -! -! return outcome; -! } -! -! void rinfo_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! openqueue_freePacketBuffer(msg); - } -\ No newline at end of file -diff -crB openwsn/07-App/rinfo/rinfo.h ../../../sys/net/openwsn/07-App/rinfo/rinfo.h -*** openwsn/07-App/rinfo/rinfo.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/rinfo/rinfo.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,26 **** -! #ifndef __RINFO_H -! #define __RINFO_H -! -! /** -! \addtogroup App -! \{ -! \addtogroup rXL1 -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void rinfo_init(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,26 ---- -! #ifndef __RINFO_H -! #define __RINFO_H -! -! /** -! \addtogroup AppCoAP -! \{ -! \addtogroup rXL1 -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void rinfo_init(void); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/07-App/rleds/rleds.c ../../../sys/net/openwsn/07-App/rleds/rleds.c -*** openwsn/07-App/rleds/rleds.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/rleds/rleds.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,94 **** -! #include "openwsn.h" -! #include "rleds.h" -! #include "opencoap.h" -! #include "packetfunctions.h" -! #include "leds.h" -! #include "openqueue.h" -! -! //=========================== variables ======================================= -! -! typedef struct { -! coap_resource_desc_t desc; -! } rleds_vars_t; -! -! rleds_vars_t rleds_vars; -! -! const uint8_t rleds_path0[] = "l"; -! -! //=========================== prototypes ====================================== -! -! error_t rleds_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! void rleds_sendDone(OpenQueueEntry_t* msg, -! error_t error); -! -! //=========================== public ========================================== -! -! void rleds_init() { -! // prepare the resource descriptor for the /.well-known/core path -! rleds_vars.desc.path0len = sizeof(rleds_path0)-1; -! rleds_vars.desc.path0val = (uint8_t*)(&rleds_path0); -! rleds_vars.desc.path1len = 0; -! rleds_vars.desc.path1val = NULL; -! rleds_vars.desc.componentID = COMPONENT_RLEDS; -! rleds_vars.desc.callbackRx = &rleds_receive; -! rleds_vars.desc.callbackSendDone = &rleds_sendDone; -! -! opencoap_register(&rleds_vars.desc); -! } -! -! //=========================== private ========================================= -! -! error_t rleds_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! error_t outcome; -! -! if (coap_header->Code==COAP_CODE_REQ_GET) { -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! // add CoAP payload -! packetfunctions_reserveHeaderSize(msg,1); -! if (leds_error_isOn()==1) { -! msg->payload[0] = '1'; -! } else { -! msg->payload[0] = '0'; -! } -! -! // set the CoAP header -! coap_header->OC = 0; -! coap_header->Code = COAP_CODE_RESP_CONTENT; -! -! outcome = E_SUCCESS; -! } else if (coap_header->Code==COAP_CODE_REQ_PUT) { -! -! // change the LED's state -! if (msg->payload[0]=='1') { -! leds_debug_on(); -! } else if (msg->payload[0]=='2') { -! leds_debug_toggle(); -! } else { -! leds_debug_off(); -! } -! -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! // set the CoAP header -! coap_header->OC = 0; -! coap_header->Code = COAP_CODE_RESP_CHANGED; -! -! outcome = E_SUCCESS; -! } else { -! outcome = E_FAIL; -! } -! return outcome; -! } -! -! void rleds_sendDone(OpenQueueEntry_t* msg, error_t error) { -! openqueue_freePacketBuffer(msg); - } -\ No newline at end of file ---- 1,92 ---- -! #include "openwsn.h" -! #include "rleds.h" -! #include "opencoap.h" -! #include "packetfunctions.h" -! #include "leds.h" -! #include "openqueue.h" -! -! //=========================== variables ======================================= -! -! typedef struct { -! coap_resource_desc_t desc; -! } rleds_vars_t; -! -! rleds_vars_t rleds_vars; -! -! const uint8_t rleds_path0[] = "l"; -! -! //=========================== prototypes ====================================== -! -! owerror_t rleds_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! void rleds_sendDone(OpenQueueEntry_t* msg, -! owerror_t error); -! -! //=========================== public ========================================== -! -! void rleds__init() { -! // prepare the resource descriptor for the /.well-known/core path -! rleds_vars.desc.path0len = sizeof(rleds_path0)-1; -! rleds_vars.desc.path0val = (uint8_t*)(&rleds_path0); -! rleds_vars.desc.path1len = 0; -! rleds_vars.desc.path1val = NULL; -! rleds_vars.desc.componentID = COMPONENT_RLEDS; -! rleds_vars.desc.callbackRx = &rleds_receive; -! rleds_vars.desc.callbackSendDone = &rleds_sendDone; -! -! opencoap_register(&rleds_vars.desc); -! } -! -! //=========================== private ========================================= -! -! owerror_t rleds_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! owerror_t outcome; -! -! if (coap_header->Code==COAP_CODE_REQ_GET) { -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! // add CoAP payload -! packetfunctions_reserveHeaderSize(msg,1); -! if (leds_error_isOn()==1) { -! msg->payload[0] = '1'; -! } else { -! msg->payload[0] = '0'; -! } -! -! // set the CoAP header -! coap_header->Code = COAP_CODE_RESP_CONTENT; -! -! outcome = E_SUCCESS; -! } else if (coap_header->Code==COAP_CODE_REQ_PUT) { -! -! // change the LED's state -! if (msg->payload[0]=='1') { -! leds_debug_on(); -! } else if (msg->payload[0]=='2') { -! leds_debug_toggle(); -! } else { -! leds_debug_off(); -! } -! -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! // set the CoAP header -! coap_header->Code = COAP_CODE_RESP_CHANGED; -! -! outcome = E_SUCCESS; -! } else { -! outcome = E_FAIL; -! } -! return outcome; -! } -! -! void rleds_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! openqueue_freePacketBuffer(msg); - } -\ No newline at end of file -diff -crB openwsn/07-App/rleds/rleds.h ../../../sys/net/openwsn/07-App/rleds/rleds.h -*** openwsn/07-App/rleds/rleds.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/rleds/rleds.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,26 **** -! #ifndef __RLEDS_H -! #define __RLEDS_H -! -! /** -! \addtogroup App -! \{ -! \addtogroup netLeds -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void rleds_init(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,26 ---- -! #ifndef __RLEDS_H -! #define __RLEDS_H -! -! /** -! \addtogroup AppCoAP -! \{ -! \addtogroup netLeds -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void rleds__init(); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/07-App/rreg/rreg.c ../../../sys/net/openwsn/07-App/rreg/rreg.c -*** openwsn/07-App/rreg/rreg.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/rreg/rreg.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,164 **** -! #include "openwsn.h" -! #include "rreg.h" -! #include "opentimers.h" -! #include "opencoap.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! #include "openserial.h" -! #include "idmanager.h" -! #include "board.h" -! #include "scheduler.h" -! -! //=========================== variables ======================================= -! -! #define RREGPERIOD 30000 -! -! typedef struct { -! coap_resource_desc_t desc; -! opentimer_id_t timerId; -! } rreg_vars_t; -! -! rreg_vars_t rreg_vars; -! -! const uint8_t rreg_path0[] = "r"; -! -! //=========================== prototypes ====================================== -! -! error_t rreg_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! void rreg_timer(); -! void rreg_sendDone(OpenQueueEntry_t* msg, -! error_t error); -! uint8_t hexToAscii(uint8_t hex); -! -! //=========================== public ========================================== -! -! void rreg_init() { -! // prepare the resource descriptor for the /.well-known/core path -! rreg_vars.desc.path0len = sizeof(rreg_path0)-1; -! rreg_vars.desc.path0val = (uint8_t*)(&rreg_path0); -! rreg_vars.desc.path1len = 0; -! rreg_vars.desc.path1val = NULL; -! rreg_vars.desc.componentID = COMPONENT_RREG; -! rreg_vars.desc.callbackRx = &rreg_receive; -! rreg_vars.desc.callbackSendDone = &rreg_sendDone; -! -! -! -! opencoap_register(&rreg_vars.desc); -! // register to the RD server every 30s -! rreg_vars.timerId = opentimers_start(RREGPERIOD, -! TIMER_PERIODIC,TIME_MS, -! rreg_timer); -! } -! -! //=========================== private ========================================= -! -! error_t rreg_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! -! error_t outcome; -! -! if (coap_header->Code==COAP_CODE_REQ_POST) { -! // request to register received -! -! // triggered: schedule task to execute timer function next -! scheduler_push_task(rreg_timer,TASKPRIO_COAP); -! //call timer here, but reset timer after -! -! -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! // set the CoAP header -! coap_header->OC = 0; -! coap_header->Code = COAP_CODE_RESP_VALID; -! -! outcome = E_SUCCESS; -! } else if (coap_header->T==COAP_TYPE_ACK) { -! // it worked! -! } else { -! outcome = E_FAIL; -! } -! -! return outcome; -! } -! -! void rreg_timer() { -! OpenQueueEntry_t* pkt; -! uint8_t temp8b; -! error_t outcome; -! uint8_t numOptions; -! -! -! // create a CoAP RD packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_RREG); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_RREG,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(pkt); -! return; -! } -! // take ownership over that packet -! pkt->creator = COMPONENT_RREG; -! pkt->owner = COMPONENT_RREG; -! // CoAP payload -! opencoap_writeLinks(pkt); -! numOptions = 0; -! // URI-query -! packetfunctions_reserveHeaderSize(pkt,sizeof(rreg_uriquery)-1+2); -! memcpy(&pkt->payload[0],&rreg_uriquery,sizeof(rreg_uriquery)-1); -! temp8b = idmanager_getMyID(ADDR_16B)->addr_16b[1]; -! pkt->payload[sizeof(rreg_uriquery)-1] = hexToAscii((temp8b>>4) & 0x0f); -! pkt->payload[sizeof(rreg_uriquery)-0] = hexToAscii((temp8b>>0) & 0x0f); -! packetfunctions_reserveHeaderSize(pkt,1); -! pkt->payload[0] = (COAP_OPTION_URIQUERY-COAP_OPTION_URIPATH) << 4 | -! sizeof(rreg_uriquery)-1+2; -! numOptions++; -! // URI-path -! packetfunctions_reserveHeaderSize(pkt,2); -! pkt->payload[0] = 'r'; -! pkt->payload[1] = 'd'; -! packetfunctions_reserveHeaderSize(pkt,1); -! pkt->payload[0] = (COAP_OPTION_URIPATH-COAP_OPTION_CONTENTTYPE) << 4 | -! 2; -! numOptions++; -! // add content-type option -! packetfunctions_reserveHeaderSize(pkt,2); -! pkt->payload[0] = COAP_OPTION_CONTENTTYPE << 4 | -! 1; -! pkt->payload[1] = COAP_MEDTYPE_APPLINKFORMAT; -! numOptions++; -! // metadata -! pkt->l4_destination_port = WKP_UDP_COAP; -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&pkt->l3_destinationAdd.addr_128b[0],&ipAddr_ipsoRD,16); -! // send -! outcome = opencoap_send(pkt, -! COAP_TYPE_CON, -! COAP_CODE_REQ_POST, -! numOptions, -! &rreg_vars.desc); -! // avoid overflowing the queue if fails -! if (outcome==E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! -! return; -! } -! -! void rreg_sendDone(OpenQueueEntry_t* msg, error_t error) { -! openqueue_freePacketBuffer(msg); -! } -! -! port_INLINE uint8_t hexToAscii(uint8_t hex) { -! if (hex<0x0a) { -! return '0'+(hex-0x00); -! } else { -! return 'A'+(hex-0x0a); -! } - } -\ No newline at end of file ---- 1,166 ---- -! #include "openwsn.h" -! #include "rreg.h" -! #include "opentimers.h" -! #include "opencoap.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! #include "openserial.h" -! #include "idmanager.h" -! #include "board.h" -! #include "scheduler.h" -! -! //=========================== variables ======================================= -! -! #define RREGPERIOD 30000 -! -! typedef struct { -! coap_resource_desc_t desc; -! opentimer_id_t timerId; -! } rreg_vars_t; -! -! rreg_vars_t rreg_vars; -! -! const uint8_t rreg_path0[] = "r"; -! -! //=========================== prototypes ====================================== -! -! owerror_t rreg_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! void rreg_timer(); -! void rreg_sendDone(OpenQueueEntry_t* msg, -! owerror_t error); -! uint8_t hexToAscii(uint8_t hex); -! -! //=========================== public ========================================== -! -! void rreg_init() { -! //dagroot does not run upper layers. -! if(idmanager_getIsDAGroot()==TRUE) return; -! -! // prepare the resource descriptor for the /.well-known/core path -! rreg_vars.desc.path0len = sizeof(rreg_path0)-1; -! rreg_vars.desc.path0val = (uint8_t*)(&rreg_path0); -! rreg_vars.desc.path1len = 0; -! rreg_vars.desc.path1val = NULL; -! rreg_vars.desc.componentID = COMPONENT_RREG; -! rreg_vars.desc.callbackRx = &rreg_receive; -! rreg_vars.desc.callbackSendDone = &rreg_sendDone; -! -! -! -! opencoap_register(&rreg_vars.desc); -! // register to the RD server every 30s -! rreg_vars.timerId = opentimers_start(RREGPERIOD, -! TIMER_PERIODIC,TIME_MS, -! rreg_timer); -! } -! -! //=========================== private ========================================= -! -! owerror_t rreg_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! -! owerror_t outcome; -! -! if (coap_header->Code==COAP_CODE_REQ_POST) { -! // request to register received -! -! // triggered: schedule task to execute timer function next -! scheduler_push_task(rreg_timer,TASKPRIO_COAP); -! //call timer here, but reset timer after -! -! -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! // set the CoAP header -! coap_header->Code = COAP_CODE_RESP_VALID; -! -! outcome = E_SUCCESS; -! } else if (coap_header->T==COAP_TYPE_ACK) { -! // it worked! -! } else { -! outcome = E_FAIL; -! } -! -! return outcome; -! } -! -! void rreg_timer() { -! OpenQueueEntry_t* pkt; -! uint8_t temp8b; -! owerror_t outcome; -! uint8_t numOptions; -! -! -! // create a CoAP RD packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_RREG); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_RREG,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! //openqueue_freePacketBuffer(pkt); -! return; -! } -! // take ownership over that packet -! pkt->creator = COMPONENT_RREG; -! pkt->owner = COMPONENT_RREG; -! // CoAP payload -! opencoap_writeLinks(pkt); -! numOptions = 0; -! // URI-query -! packetfunctions_reserveHeaderSize(pkt,sizeof(rreg_uriquery)-1+2); -! memcpy(&pkt->payload[0],&rreg_uriquery,sizeof(rreg_uriquery)-1); -! temp8b = idmanager_getMyID(ADDR_16B)->addr_16b[1]; -! pkt->payload[sizeof(rreg_uriquery)-1] = hexToAscii((temp8b>>4) & 0x0f); -! pkt->payload[sizeof(rreg_uriquery)-0] = hexToAscii((temp8b>>0) & 0x0f); -! packetfunctions_reserveHeaderSize(pkt,1); -! pkt->payload[0] = (COAP_OPTION_NUM_URIQUERY-COAP_OPTION_NUM_URIPATH) << 4 | -! sizeof(rreg_uriquery)-1+2; -! numOptions++; -! // URI-path -! packetfunctions_reserveHeaderSize(pkt,2); -! pkt->payload[0] = 'r'; -! pkt->payload[1] = 'd'; -! packetfunctions_reserveHeaderSize(pkt,1); -! pkt->payload[0] = (COAP_OPTION_NUM_URIPATH) << 4 | -! 2; -! numOptions++; -! // add content-type option -! packetfunctions_reserveHeaderSize(pkt,2); -! pkt->payload[0] = COAP_OPTION_NUM_CONTENTFORMAT << 4 | -! 1; -! pkt->payload[1] = COAP_MEDTYPE_APPLINKFORMAT; -! numOptions++; -! // metadata -! pkt->l4_destination_port = WKP_UDP_COAP; -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&pkt->l3_destinationAdd.addr_128b[0],&ipAddr_ipsoRD,16); -! // send -! outcome = opencoap_send(pkt, -! COAP_TYPE_CON, -! COAP_CODE_REQ_POST, -! numOptions, -! &rreg_vars.desc); -! // avoid overflowing the queue if fails -! if (outcome==E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! -! return; -! } -! -! void rreg_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! openqueue_freePacketBuffer(msg); -! } -! -! port_INLINE uint8_t hexToAscii(uint8_t hex) { -! if (hex<0x0a) { -! return '0'+(hex-0x00); -! } else { -! return 'A'+(hex-0x0a); -! } - } -\ No newline at end of file -diff -crB openwsn/07-App/rreg/rreg.h ../../../sys/net/openwsn/07-App/rreg/rreg.h -*** openwsn/07-App/rreg/rreg.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/rreg/rreg.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,26 **** -! #ifndef __RREG_H -! #define __RREG_H -! -! /** -! \addtogroup App -! \{ -! \addtogroup rReg -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void rreg_init(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,26 ---- -! #ifndef __RREG_H -! #define __RREG_H -! -! /** -! \addtogroup AppCoAP -! \{ -! \addtogroup rReg -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void rreg_init(); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/07-App/rrube/rrube.c ../../../sys/net/openwsn/07-App/rrube/rrube.c -*** openwsn/07-App/rrube/rrube.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/rrube/rrube.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,243 **** -! #include "openwsn.h" -! #include "rrube.h" -! #include "opencoap.h" -! #include "opentimers.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! #include "openserial.h" -! #include "idmanager.h" -! #include "board.h" -! #include "heli.h" -! #include "leds.h" -! -! //=========================== defines ========================================= -! -! static const uint8_t ipAddr_rubeServer[] = {0x24, 0x06, 0xa0, 0x00, 0xf0, 0xff, 0xff, 0xfe, \ -! 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0xbf}; -! -! typedef enum { -! RRUBE_ST_IDLE, -! RRUBE_ST_WAITTXPUT, -! RRUBE_ST_PUTRXD, -! RRUBE_ST_WAITACK, -! } rrube_state_t; -! -! //=========================== variables ======================================= -! -! typedef struct { -! rrube_state_t rrube_state; -! coap_resource_desc_t desc; -! open_addr_t nextHop; -! opentimer_id_t timerId; -! } rrube_vars_t; -! -! rrube_vars_t rrube_vars; -! -! const uint8_t rrube_path0[] = "g"; -! -! //=========================== prototypes ====================================== -! -! error_t rrube_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! void rrube_timer(); -! void rrube_sendDone(OpenQueueEntry_t* msg, -! error_t error); -! uint8_t hexToAscii(uint8_t hex); -! -! //=========================== public ========================================== -! -! void rrube_init() { -! heli_init(); -! -! rrube_vars.nextHop.type = ADDR_128B; -! rrube_vars.rrube_state = RRUBE_ST_IDLE; -! -! // prepare the resource descriptor for the /.well-known/core path -! rrube_vars.desc.path0len = sizeof(rrube_path0)-1; -! rrube_vars.desc.path0val = (uint8_t*)(&rrube_path0); -! rrube_vars.desc.path1len = 0; -! rrube_vars.desc.path1val = NULL; -! rrube_vars.desc.componentID = COMPONENT_RRUBE; -! rrube_vars.desc.callbackRx = &rrube_receive; -! rrube_vars.desc.callbackSendDone = &rrube_sendDone; -! -! opencoap_register(&rrube_vars.desc); -! rrube_vars.timerId = opentimers_start(1000, -! TIMER_PERIODIC,TIME_MS, -! rrube_timer); -! } -! -! //=========================== private ========================================= -! -! error_t rrube_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! -! error_t outcome; -! -! if (rrube_vars.rrube_state==RRUBE_ST_IDLE && -! coap_header->Code==COAP_CODE_REQ_POST) { -! -! // turn on LED -! leds_debug_on(); -! -! // record the next hop's address -! memcpy(&rrube_vars.nextHop.addr_128b[0],&msg->payload[0],16); -! -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! // set the CoAP header -! coap_header->OC = 0; -! coap_header->Code = COAP_CODE_RESP_VALID; -! -! // advance state machine -! rrube_vars.rrube_state = RRUBE_ST_WAITTXPUT; -! -! outcome = E_SUCCESS; -! -! } else if (rrube_vars.rrube_state==RRUBE_ST_IDLE && -! coap_header->Code==COAP_CODE_REQ_PUT) { -! -! // turn on LED -! leds_debug_on(); -! -! // turn heli on -! heli_on(); -! -! // advance state machine -! rrube_vars.rrube_state = RRUBE_ST_PUTRXD; -! -! } else if (rrube_vars.rrube_state==RRUBE_ST_WAITACK && -! coap_header->T==COAP_TYPE_ACK) { -! // record the next hop's address -! memcpy(&rrube_vars.nextHop.addr_128b[0],&msg->payload[0],16); -! -! // advance state machine -! rrube_vars.rrube_state = RRUBE_ST_WAITTXPUT; -! -! outcome = E_SUCCESS; -! -! } else { -! // didn't expect that packet -! -! // reset state machine -! outcome = E_FAIL; -! -! // turn off LED -! leds_debug_off(); -! } -! -! return outcome; -! } -! -! void rrube_timer() { -! OpenQueueEntry_t* pkt; -! uint8_t numOptions; -! error_t outcome; -! -! // turn off heli -! heli_off(); -! -! if (rrube_vars.rrube_state == RRUBE_ST_WAITTXPUT) { -! // I received a POST from the server, I need to send data to the next hop -! -! // create a CoAP RD packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_RREG); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_RREG,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(pkt); -! return; -! } -! // take ownership over that packet -! pkt->creator = COMPONENT_RRUBE; -! pkt->owner = COMPONENT_RRUBE; -! numOptions = 0; -! // URI-path -! packetfunctions_reserveHeaderSize(pkt,sizeof(rrube_path0)-1); -! memcpy(&pkt->payload[0],&rrube_path0,sizeof(rrube_path0)-1); -! packetfunctions_reserveHeaderSize(pkt,1); -! pkt->payload[0] = (COAP_OPTION_URIPATH) << 4 | -! sizeof(rrube_path0)-1; -! numOptions++; -! // metadata -! pkt->l4_destination_port = WKP_UDP_COAP; -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&pkt->l3_destinationAdd,&rrube_vars.nextHop,sizeof(open_addr_t)); -! // send -! outcome = opencoap_send(pkt, -! COAP_TYPE_NON, -! COAP_CODE_REQ_PUT, -! numOptions, -! &rrube_vars.desc); -! // avoid overflowing the queue if fails -! if (outcome==E_FAIL) { -! rrube_vars.rrube_state = RRUBE_ST_IDLE; -! openqueue_freePacketBuffer(pkt); -! } -! // advance state machine -! rrube_vars.rrube_state = RRUBE_ST_IDLE; -! -! // turn off LED -! leds_debug_off(); -! -! } else if (rrube_vars.rrube_state == RRUBE_ST_PUTRXD) { -! // I received a PUT from the previous hop, I need ask the server for the next address -! -! // create a CoAP RD packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_RREG); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_RREG,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(pkt); -! return; -! } -! // take ownership over that packet -! pkt->creator = COMPONENT_RRUBE; -! pkt->owner = COMPONENT_RRUBE; -! numOptions = 0; -! // URI-path -! packetfunctions_reserveHeaderSize(pkt,sizeof(rrube_path0)-1); -! memcpy(&pkt->payload[0],&rrube_path0,sizeof(rrube_path0)-1); -! packetfunctions_reserveHeaderSize(pkt,1); -! pkt->payload[0] = (COAP_OPTION_URIPATH) << 4 | -! sizeof(rrube_path0)-1; -! numOptions++; -! // metadata -! pkt->l4_destination_port = WKP_UDP_COAP; -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&pkt->l3_destinationAdd.addr_128b[0],&ipAddr_rubeServer,16); -! // send -! outcome = opencoap_send(pkt, -! COAP_TYPE_CON, -! COAP_CODE_REQ_GET, -! numOptions, -! &rrube_vars.desc); -! // avoid overflowing the queue if fails -! if (outcome==E_FAIL) { -! rrube_vars.rrube_state = RRUBE_ST_IDLE; -! openqueue_freePacketBuffer(pkt); -! } -! // advance state machine -! rrube_vars.rrube_state = RRUBE_ST_WAITACK; -! -! } else { -! // timer expired while not in expected state -! -! // reset state machine -! rrube_vars.rrube_state = RRUBE_ST_IDLE; -! -! // turn off LED -! leds_debug_off(); -! } -! return; -! } -! -! void rrube_sendDone(OpenQueueEntry_t* msg, error_t error) { -! openqueue_freePacketBuffer(msg); - } -\ No newline at end of file ---- 1,242 ---- -! #include "openwsn.h" -! #include "rrube.h" -! #include "opencoap.h" -! #include "opentimers.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! #include "openserial.h" -! #include "idmanager.h" -! #include "board.h" -! #include "heli.h" -! #include "leds.h" -! -! //=========================== defines ========================================= -! -! static const uint8_t ipAddr_rubeServer[] = {0x24, 0x06, 0xa0, 0x00, 0xf0, 0xff, 0xff, 0xfe, \ -! 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0xbf}; -! -! typedef enum { -! RRUBE_ST_IDLE, -! RRUBE_ST_WAITTXPUT, -! RRUBE_ST_PUTRXD, -! RRUBE_ST_WAITACK, -! } rrube_state_t; -! -! //=========================== variables ======================================= -! -! typedef struct { -! rrube_state_t rrube_state; -! coap_resource_desc_t desc; -! open_addr_t nextHop; -! opentimer_id_t timerId; -! } rrube_vars_t; -! -! rrube_vars_t rrube_vars; -! -! const uint8_t rrube_path0[] = "g"; -! -! //=========================== prototypes ====================================== -! -! owerror_t rrube_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! void rrube_timer(); -! void rrube_sendDone(OpenQueueEntry_t* msg, -! owerror_t error); -! uint8_t hexToAscii(uint8_t hex); -! -! //=========================== public ========================================== -! -! void rrube_init() { -! heli_init(); -! -! rrube_vars.nextHop.type = ADDR_128B; -! rrube_vars.rrube_state = RRUBE_ST_IDLE; -! -! // prepare the resource descriptor for the /.well-known/core path -! rrube_vars.desc.path0len = sizeof(rrube_path0)-1; -! rrube_vars.desc.path0val = (uint8_t*)(&rrube_path0); -! rrube_vars.desc.path1len = 0; -! rrube_vars.desc.path1val = NULL; -! rrube_vars.desc.componentID = COMPONENT_RRUBE; -! rrube_vars.desc.callbackRx = &rrube_receive; -! rrube_vars.desc.callbackSendDone = &rrube_sendDone; -! -! opencoap_register(&rrube_vars.desc); -! rrube_vars.timerId = opentimers_start(1000, -! TIMER_PERIODIC,TIME_MS, -! rrube_timer); -! } -! -! //=========================== private ========================================= -! -! owerror_t rrube_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! -! owerror_t outcome; -! -! if (rrube_vars.rrube_state==RRUBE_ST_IDLE && -! coap_header->Code==COAP_CODE_REQ_POST) { -! -! // turn on LED -! leds_debug_on(); -! -! // record the next hop's address -! memcpy(&rrube_vars.nextHop.addr_128b[0],&msg->payload[0],16); -! -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! // set the CoAP header -! coap_header->Code = COAP_CODE_RESP_VALID; -! -! // advance state machine -! rrube_vars.rrube_state = RRUBE_ST_WAITTXPUT; -! -! outcome = E_SUCCESS; -! -! } else if (rrube_vars.rrube_state==RRUBE_ST_IDLE && -! coap_header->Code==COAP_CODE_REQ_PUT) { -! -! // turn on LED -! leds_debug_on(); -! -! // turn heli on -! heli_on(); -! -! // advance state machine -! rrube_vars.rrube_state = RRUBE_ST_PUTRXD; -! -! } else if (rrube_vars.rrube_state==RRUBE_ST_WAITACK && -! coap_header->T==COAP_TYPE_ACK) { -! // record the next hop's address -! memcpy(&rrube_vars.nextHop.addr_128b[0],&msg->payload[0],16); -! -! // advance state machine -! rrube_vars.rrube_state = RRUBE_ST_WAITTXPUT; -! -! outcome = E_SUCCESS; -! -! } else { -! // didn't expect that packet -! -! // reset state machine -! outcome = E_FAIL; -! -! // turn off LED -! leds_debug_off(); -! } -! -! return outcome; -! } -! -! void rrube_timer() { -! OpenQueueEntry_t* pkt; -! uint8_t numOptions; -! owerror_t outcome; -! -! // turn off heli -! heli_off(); -! -! if (rrube_vars.rrube_state == RRUBE_ST_WAITTXPUT) { -! // I received a POST from the server, I need to send data to the next hop -! -! // create a CoAP RD packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_RREG); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_RREG,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(pkt); -! return; -! } -! // take ownership over that packet -! pkt->creator = COMPONENT_RRUBE; -! pkt->owner = COMPONENT_RRUBE; -! numOptions = 0; -! // URI-path -! packetfunctions_reserveHeaderSize(pkt,sizeof(rrube_path0)-1); -! memcpy(&pkt->payload[0],&rrube_path0,sizeof(rrube_path0)-1); -! packetfunctions_reserveHeaderSize(pkt,1); -! pkt->payload[0] = (COAP_OPTION_NUM_URIPATH) << 4 | -! sizeof(rrube_path0)-1; -! numOptions++; -! // metadata -! pkt->l4_destination_port = WKP_UDP_COAP; -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&pkt->l3_destinationAdd,&rrube_vars.nextHop,sizeof(open_addr_t)); -! // send -! outcome = opencoap_send(pkt, -! COAP_TYPE_NON, -! COAP_CODE_REQ_PUT, -! numOptions, -! &rrube_vars.desc); -! // avoid overflowing the queue if fails -! if (outcome==E_FAIL) { -! rrube_vars.rrube_state = RRUBE_ST_IDLE; -! openqueue_freePacketBuffer(pkt); -! } -! // advance state machine -! rrube_vars.rrube_state = RRUBE_ST_IDLE; -! -! // turn off LED -! leds_debug_off(); -! -! } else if (rrube_vars.rrube_state == RRUBE_ST_PUTRXD) { -! // I received a PUT from the previous hop, I need ask the server for the next address -! -! // create a CoAP RD packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_RREG); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_RREG,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(pkt); -! return; -! } -! // take ownership over that packet -! pkt->creator = COMPONENT_RRUBE; -! pkt->owner = COMPONENT_RRUBE; -! numOptions = 0; -! // URI-path -! packetfunctions_reserveHeaderSize(pkt,sizeof(rrube_path0)-1); -! memcpy(&pkt->payload[0],&rrube_path0,sizeof(rrube_path0)-1); -! packetfunctions_reserveHeaderSize(pkt,1); -! pkt->payload[0] = (COAP_OPTION_NUM_URIPATH) << 4 | -! sizeof(rrube_path0)-1; -! numOptions++; -! // metadata -! pkt->l4_destination_port = WKP_UDP_COAP; -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&pkt->l3_destinationAdd.addr_128b[0],&ipAddr_rubeServer,16); -! // send -! outcome = opencoap_send(pkt, -! COAP_TYPE_CON, -! COAP_CODE_REQ_GET, -! numOptions, -! &rrube_vars.desc); -! // avoid overflowing the queue if fails -! if (outcome==E_FAIL) { -! rrube_vars.rrube_state = RRUBE_ST_IDLE; -! openqueue_freePacketBuffer(pkt); -! } -! // advance state machine -! rrube_vars.rrube_state = RRUBE_ST_WAITACK; -! -! } else { -! // timer expired while not in expected state -! -! // reset state machine -! rrube_vars.rrube_state = RRUBE_ST_IDLE; -! -! // turn off LED -! leds_debug_off(); -! } -! return; -! } -! -! void rrube_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! openqueue_freePacketBuffer(msg); - } -\ No newline at end of file -diff -crB openwsn/07-App/rrube/rrube.h ../../../sys/net/openwsn/07-App/rrube/rrube.h -*** openwsn/07-App/rrube/rrube.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/rrube/rrube.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,26 **** -! #ifndef __RRUBE_H -! #define __RRUBE_H -! -! /** -! \addtogroup App -! \{ -! \addtogroup rRube -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void rrube_init(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,26 ---- -! #ifndef __RRUBE_H -! #define __RRUBE_H -! -! /** -! \addtogroup AppCoAP -! \{ -! \addtogroup rRube -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void rrube_init(); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/07-App/rt/rt.c ../../../sys/net/openwsn/07-App/rt/rt.c -*** openwsn/07-App/rt/rt.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/rt/rt.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,171 **** -! #include "openwsn.h" -! #include "rt.h" -! #include "opentimers.h" -! #include "opencoap.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! #include "openserial.h" -! #include "openrandom.h" -! #include "sensitive_accel_temperature.h" -! -! -! //=========================== defines ========================================= -! -! /// inter-packet period (in mseconds) -! #define RTPERIOD 20000 -! -! const uint8_t rt_path0[] = "t"; -! -! //=========================== variables ======================================= -! -! typedef struct { -! opentimer_id_t timerId; -! coap_resource_desc_t desc; -! } rt_vars_t; -! -! rt_vars_t rt_vars; -! -! //=========================== prototypes ====================================== -! -! error_t rt_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! void rt_timer(); -! void rt_sendDone(OpenQueueEntry_t* msg, -! error_t error); -! -! //=========================== public ========================================== -! -! void rt_init() { -! // startup the sensor -! sensitive_accel_temperature_init(); -! -! // prepare the resource descriptor for the /temp path -! rt_vars.desc.path0len = sizeof(rt_path0)-1; -! rt_vars.desc.path0val = (uint8_t*)(&rt_path0); -! rt_vars.desc.path1len = 0; -! rt_vars.desc.path1val = NULL; -! rt_vars.desc.componentID = COMPONENT_RT; -! rt_vars.desc.callbackRx = &rt_receive; -! rt_vars.desc.callbackSendDone = &rt_sendDone; -! -! -! rt_vars.timerId = opentimers_start(openrandom_get16b()%RTPERIOD, -! TIMER_PERIODIC,TIME_MS, -! rt_timer); -! opencoap_register(&rt_vars.desc); -! } -! -! //=========================== private ========================================= -! -! error_t rt_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! error_t outcome; -! uint8_t rawdata[SENSITIVE_ACCEL_TEMPERATURE_DATALEN]; -! -! if (coap_header->Code==COAP_CODE_REQ_POST) { -! // start/stop the data generation to data server -! -! if (msg->payload[0]=='1') { -! opentimers_restart(rt_vars.timerId); -! } else { -! opentimers_stop(rt_vars.timerId); -! } -! -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! // CoAP header -! coap_header->OC = 0; -! coap_header->Code = COAP_CODE_RESP_VALID; -! -! outcome = E_SUCCESS; -! -! } else if (coap_header->Code==COAP_CODE_REQ_GET) { -! // return current sensor value -! -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! // CoAP payload (2 bytes of temperature data) -! packetfunctions_reserveHeaderSize(msg,2); -! sensitive_accel_temperature_get_measurement(&rawdata[0]); -! msg->payload[0] = rawdata[8]; -! msg->payload[1] = rawdata[9]; -! -! // set the CoAP header -! coap_header->OC = 0; -! coap_header->Code = COAP_CODE_RESP_CONTENT; -! -! outcome = E_SUCCESS; -! -! } else { -! // return an error message -! outcome = E_FAIL; -! } -! -! return outcome; -! } -! -! void rt_timer() { -! OpenQueueEntry_t* pkt; -! error_t outcome; -! uint8_t numOptions; -! uint8_t rawdata[SENSITIVE_ACCEL_TEMPERATURE_DATALEN]; -! -! -! // create a CoAP RD packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_RT); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_RT,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(pkt); -! return; -! } -! // take ownership over that packet -! pkt->creator = COMPONENT_RT; -! pkt->owner = COMPONENT_RT; -! // CoAP payload (2 bytes of temperature data) -! packetfunctions_reserveHeaderSize(pkt,2); -! sensitive_accel_temperature_get_measurement(&rawdata[0]); -! pkt->payload[0] = rawdata[8]; -! pkt->payload[1] = rawdata[9]; -! numOptions = 0; -! // location-path option -! packetfunctions_reserveHeaderSize(pkt,sizeof(rt_path0)-1); -! memcpy(&pkt->payload[0],&rt_path0,sizeof(rt_path0)-1); -! packetfunctions_reserveHeaderSize(pkt,1); -! pkt->payload[0] = (COAP_OPTION_LOCATIONPATH-COAP_OPTION_CONTENTTYPE) << 4 | -! sizeof(rt_path0)-1; -! numOptions++; -! // content-type option -! packetfunctions_reserveHeaderSize(pkt,2); -! pkt->payload[0] = COAP_OPTION_CONTENTTYPE << 4 | -! 1; -! pkt->payload[1] = COAP_MEDTYPE_APPOCTETSTREAM; -! numOptions++; -! // metadata -! pkt->l4_destination_port = WKP_UDP_COAP; -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&pkt->l3_destinationAdd.addr_128b[0],&ipAddr_motesEecs,16); -! // send -! outcome = opencoap_send(pkt, -! COAP_TYPE_NON, -! COAP_CODE_REQ_PUT, -! numOptions, -! &rt_vars.desc); -! // avoid overflowing the queue if fails -! if (outcome==E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! -! return; -! } -! -! void rt_sendDone(OpenQueueEntry_t* msg, error_t error) { -! openqueue_freePacketBuffer(msg); - } -\ No newline at end of file ---- 1,169 ---- -! #include "openwsn.h" -! #include "rt.h" -! #include "opentimers.h" -! #include "opencoap.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! #include "openserial.h" -! #include "openrandom.h" -! #include "sensitive_accel_temperature.h" -! -! -! //=========================== defines ========================================= -! -! /// inter-packet period (in mseconds) -! #define RTPERIOD 20000 -! -! const uint8_t rt_path0[] = "t"; -! -! //=========================== variables ======================================= -! -! typedef struct { -! opentimer_id_t timerId; -! coap_resource_desc_t desc; -! } rt_vars_t; -! -! rt_vars_t rt_vars; -! -! //=========================== prototypes ====================================== -! -! owerror_t rt_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! void rt_timer(); -! void rt_sendDone(OpenQueueEntry_t* msg, -! owerror_t error); -! -! //=========================== public ========================================== -! -! void rt_init() { -! // startup the sensor -! sensitive_accel_temperature_init(); -! -! // prepare the resource descriptor for the /temp path -! rt_vars.desc.path0len = sizeof(rt_path0)-1; -! rt_vars.desc.path0val = (uint8_t*)(&rt_path0); -! rt_vars.desc.path1len = 0; -! rt_vars.desc.path1val = NULL; -! rt_vars.desc.componentID = COMPONENT_RT; -! rt_vars.desc.callbackRx = &rt_receive; -! rt_vars.desc.callbackSendDone = &rt_sendDone; -! -! -! rt_vars.timerId = opentimers_start(openrandom_get16b()%RTPERIOD, -! TIMER_PERIODIC,TIME_MS, -! rt_timer); -! opencoap_register(&rt_vars.desc); -! } -! -! //=========================== private ========================================= -! -! owerror_t rt_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! owerror_t outcome; -! uint8_t rawdata[SENSITIVE_ACCEL_TEMPERATURE_DATALEN]; -! -! if (coap_header->Code==COAP_CODE_REQ_POST) { -! // start/stop the data generation to data server -! -! if (msg->payload[0]=='1') { -! opentimers_restart(rt_vars.timerId); -! } else { -! opentimers_stop(rt_vars.timerId); -! } -! -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! // CoAP header -! coap_header->Code = COAP_CODE_RESP_VALID; -! -! outcome = E_SUCCESS; -! -! } else if (coap_header->Code==COAP_CODE_REQ_GET) { -! // return current sensor value -! -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! // CoAP payload (2 bytes of temperature data) -! packetfunctions_reserveHeaderSize(msg,2); -! sensitive_accel_temperature_get_measurement(&rawdata[0]); -! msg->payload[0] = rawdata[8]; -! msg->payload[1] = rawdata[9]; -! -! // set the CoAP header -! coap_header->Code = COAP_CODE_RESP_CONTENT; -! -! outcome = E_SUCCESS; -! -! } else { -! // return an error message -! outcome = E_FAIL; -! } -! -! return outcome; -! } -! -! void rt_timer() { -! OpenQueueEntry_t* pkt; -! owerror_t outcome; -! uint8_t numOptions; -! uint8_t rawdata[SENSITIVE_ACCEL_TEMPERATURE_DATALEN]; -! -! -! // create a CoAP RD packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_RT); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_RT,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(pkt); -! return; -! } -! // take ownership over that packet -! pkt->creator = COMPONENT_RT; -! pkt->owner = COMPONENT_RT; -! // CoAP payload (2 bytes of temperature data) -! packetfunctions_reserveHeaderSize(pkt,2); -! sensitive_accel_temperature_get_measurement(&rawdata[0]); -! pkt->payload[0] = rawdata[8]; -! pkt->payload[1] = rawdata[9]; -! numOptions = 0; -! // location-path option -! packetfunctions_reserveHeaderSize(pkt,sizeof(rt_path0)-1); -! memcpy(&pkt->payload[0],&rt_path0,sizeof(rt_path0)-1); -! packetfunctions_reserveHeaderSize(pkt,1); -! pkt->payload[0] = (COAP_OPTION_NUM_URIPATH) << 4 | -! sizeof(rt_path0)-1; -! numOptions++; -! // content-type option -! packetfunctions_reserveHeaderSize(pkt,2); -! pkt->payload[0] = COAP_OPTION_NUM_CONTENTFORMAT << 4 | -! 1; -! pkt->payload[1] = COAP_MEDTYPE_APPOCTETSTREAM; -! numOptions++; -! // metadata -! pkt->l4_destination_port = WKP_UDP_COAP; -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&pkt->l3_destinationAdd.addr_128b[0],&ipAddr_motesEecs,16); -! // send -! outcome = opencoap_send(pkt, -! COAP_TYPE_NON, -! COAP_CODE_REQ_PUT, -! numOptions, -! &rt_vars.desc); -! // avoid overflowing the queue if fails -! if (outcome==E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! -! return; -! } -! -! void rt_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! openqueue_freePacketBuffer(msg); - } -\ No newline at end of file -diff -crB openwsn/07-App/rt/rt.h ../../../sys/net/openwsn/07-App/rt/rt.h -*** openwsn/07-App/rt/rt.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/rt/rt.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,26 **** -! #ifndef __RT_H -! #define __RT_H -! -! /** -! \addtogroup App -! \{ -! \addtogroup rT -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void rt_init(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,26 ---- -! #ifndef __RT_H -! #define __RT_H -! -! /** -! \addtogroup AppCoAP -! \{ -! \addtogroup rT -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void rt_init(); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/07-App/rwellknown/Makefile ../../../sys/net/openwsn/07-App/rwellknown/Makefile -*** openwsn/07-App/rwellknown/Makefile Wed Jan 15 13:55:34 2014 ---- ../../../sys/net/openwsn/07-App/rwellknown/Makefile Wed Jan 15 13:48:27 2014 -*************** -*** 0 **** ---- 1,32 ---- -+ SUBSUBMOD:=$(shell basename $(CURDIR)).a -+ #BINDIR = $(RIOTBASE)/bin/ -+ SRC = $(wildcard *.c) -+ OBJ = $(SRC:%.c=$(BINDIR)%.o) -+ DEP = $(SRC:%.c=$(BINDIR)%.d) -+ -+ INCLUDES += -I$(RIOTBASE) -I$(RIOTBASE)/sys/include -I$(RIOTBASE)/core/include -I$(RIOTBASE)/drivers/include -I$(RIOTBASE)/drivers/cc110x_ng/include -I$(RIOTBASE)/cpu/arm_common/include -I$(RIOTBASE)/sys/net/include/ -+ INCLUDES += -I$(CURDIR)/02a-MAClow -+ INCLUDES += -I$(CURDIR)/02b-MAChigh -+ INCLUDES += -I$(CURDIR)/03a-IPHC -+ INCLUDES += -I$(CURDIR)/03b-IPv6 -+ INCLUDES += -I$(CURDIR)/04-TRAN -+ INCLUDES += -I$(CURDIR)/cross-layers -+ -+ .PHONY: $(BINDIR)$(SUBSUBMOD) -+ -+ $(BINDIR)$(SUBSUBMOD): $(OBJ) -+ $(AD)$(AR) rcs $(BINDIR)$(MODULE) $(OBJ) -+ -+ # pull in dependency info for *existing* .o files -+ -include $(OBJ:.o=.d) -+ -+ # compile and generate dependency info -+ $(BINDIR)%.o: %.c -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d -+ @printf "$(BINDIR)" | cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d -+ -+ # remove compilation products -+ -+ clean: -+ rm -f $(OBJ) $(DEP) -diff -crB openwsn/07-App/rwellknown/rwellknown.c ../../../sys/net/openwsn/07-App/rwellknown/rwellknown.c -*** openwsn/07-App/rwellknown/rwellknown.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/rwellknown/rwellknown.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,77 **** -! #include "openwsn.h" -! #include "rwellknown.h" -! #include "opencoap.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! #include "openserial.h" -! -! //=========================== variables ======================================= -! -! typedef struct { -! coap_resource_desc_t desc; -! } rwellknown_vars_t; -! -! rwellknown_vars_t rwellknown_vars; -! -! const uint8_t rwellknown_path0[] = ".well-known"; -! const uint8_t rwellknown_path1[] = "core"; -! const uint8_t rwellknown_testlink[] = "</led>;if=\"actuator\";rt=\"ipso:light\";ct=\"0\""; -! -! //=========================== prototypes ====================================== -! -! error_t rwellknown_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! void rwellknown_sendDone(OpenQueueEntry_t* msg, -! error_t error); -! -! //=========================== public ========================================== -! -! void rwellknown_init() { -! // prepare the resource descriptor for the /.well-known/core path -! rwellknown_vars.desc.path0len = sizeof(rwellknown_path0)-1; -! rwellknown_vars.desc.path0val = (uint8_t*)(&rwellknown_path0); -! rwellknown_vars.desc.path1len = sizeof(rwellknown_path1)-1; -! rwellknown_vars.desc.path1val = (uint8_t*)(&rwellknown_path1); -! rwellknown_vars.desc.componentID = COMPONENT_RWELLKNOWN; -! rwellknown_vars.desc.callbackRx = &rwellknown_receive; -! rwellknown_vars.desc.callbackSendDone = &rwellknown_sendDone; -! -! opencoap_register(&rwellknown_vars.desc); -! } -! -! //=========================== private ========================================= -! -! error_t rwellknown_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! error_t outcome; -! -! if (coap_header->Code==COAP_CODE_REQ_GET) { -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! // add link descriptors to the packet -! opencoap_writeLinks(msg); -! -! // add return option -! packetfunctions_reserveHeaderSize(msg,2); -! msg->payload[0] = COAP_OPTION_CONTENTTYPE << 4 | -! 1; -! msg->payload[1] = COAP_MEDTYPE_APPLINKFORMAT; -! -! // set the CoAP header -! coap_header->OC = 1; -! coap_header->Code = COAP_CODE_RESP_CONTENT; -! -! outcome = E_SUCCESS; -! } else { -! outcome = E_FAIL; -! } -! return outcome; -! } -! -! void rwellknown_sendDone(OpenQueueEntry_t* msg, error_t error) { -! openqueue_freePacketBuffer(msg); - } -\ No newline at end of file ---- 1,80 ---- -! #include "openwsn.h" -! #include "rwellknown.h" -! #include "opencoap.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! #include "openserial.h" -! #include "idmanager.h" -! //=========================== variables ======================================= -! -! typedef struct { -! coap_resource_desc_t desc; -! } rwellknown_vars_t; -! -! rwellknown_vars_t rwellknown_vars; -! -! const uint8_t rwellknown_path0[] = ".well-known"; -! const uint8_t rwellknown_path1[] = "core"; -! const uint8_t rwellknown_testlink[] = "</led>;if=\"actuator\";rt=\"ipso:light\";ct=\"0\""; -! -! //=========================== prototypes ====================================== -! -! owerror_t rwellknown_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! void rwellknown_sendDone(OpenQueueEntry_t* msg, -! owerror_t error); -! -! //=========================== public ========================================== -! -! void rwellknown_init(void) { -! -! -! if(idmanager_getIsDAGroot()==TRUE) return; -! -! // prepare the resource descriptor for the /.well-known/core path -! rwellknown_vars.desc.path0len = sizeof(rwellknown_path0)-1; -! rwellknown_vars.desc.path0val = (uint8_t*)(&rwellknown_path0); -! rwellknown_vars.desc.path1len = sizeof(rwellknown_path1)-1; -! rwellknown_vars.desc.path1val = (uint8_t*)(&rwellknown_path1); -! rwellknown_vars.desc.componentID = COMPONENT_RWELLKNOWN; -! rwellknown_vars.desc.callbackRx = &rwellknown_receive; -! rwellknown_vars.desc.callbackSendDone = &rwellknown_sendDone; -! -! opencoap_register(&rwellknown_vars.desc); -! } -! -! //=========================== private ========================================= -! -! owerror_t rwellknown_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! owerror_t outcome; -! -! if (coap_header->Code==COAP_CODE_REQ_GET) { -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! // add link descriptors to the packet -! opencoap_writeLinks(msg); -! -! // add return option -! packetfunctions_reserveHeaderSize(msg,2); -! msg->payload[0] = COAP_OPTION_NUM_CONTENTFORMAT << 4 | -! 1; -! msg->payload[1] = COAP_MEDTYPE_APPLINKFORMAT; -! -! // set the CoAP header -! coap_header->Code = COAP_CODE_RESP_CONTENT; -! -! outcome = E_SUCCESS; -! } else { -! outcome = E_FAIL; -! } -! return outcome; -! } -! -! void rwellknown_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! openqueue_freePacketBuffer(msg); - } -\ No newline at end of file -diff -crB openwsn/07-App/rwellknown/rwellknown.h ../../../sys/net/openwsn/07-App/rwellknown/rwellknown.h -*** openwsn/07-App/rwellknown/rwellknown.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/rwellknown/rwellknown.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,26 **** -! #ifndef __RWELLKNOWN_H -! #define __RWELLKNOWN_H -! -! /** -! \addtogroup App -! \{ -! \addtogroup rWellKnown -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void rwellknown_init(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,26 ---- -! #ifndef __RWELLKNOWN_H -! #define __RWELLKNOWN_H -! -! /** -! \addtogroup AppCoAP -! \{ -! \addtogroup rWellKnown -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void rwellknown_init(void); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/07-App/rxl1/rxl1.c ../../../sys/net/openwsn/07-App/rxl1/rxl1.c -*** openwsn/07-App/rxl1/rxl1.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/rxl1/rxl1.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,176 **** -! #include "openwsn.h" -! #include "rxl1.h" -! #include "opentimers.h" -! #include "opencoap.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! #include "openserial.h" -! #include "openrandom.h" -! #include "sensitive_accel_temperature.h" -! -! -! //=========================== defines ========================================= -! -! /// inter-packet period (in mseconds) -! #define RXL1PERIOD 6000 -! -! const uint8_t rxl1_path0[] = "x"; -! -! //=========================== variables ======================================= -! -! typedef struct { -! coap_resource_desc_t desc; -! opentimer_id_t timerId; -! } rxl1_vars_t; -! -! rxl1_vars_t rxl1_vars; -! -! //=========================== prototypes ====================================== -! -! error_t rxl1_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! void rxl1_timer(); -! void rxl1_sendDone(OpenQueueEntry_t* msg, -! error_t error); -! -! //=========================== public ========================================== -! -! void rxl1_init() { -! // startup the sensor -! sensitive_accel_temperature_init(); -! -! // prepare the resource descriptor for the /temp path -! rxl1_vars.desc.path0len = sizeof(rxl1_path0)-1; -! rxl1_vars.desc.path0val = (uint8_t*)(&rxl1_path0); -! rxl1_vars.desc.path1len = 0; -! rxl1_vars.desc.path1val = NULL; -! rxl1_vars.desc.componentID = COMPONENT_RXL1; -! rxl1_vars.desc.callbackRx = &rxl1_receive; -! rxl1_vars.desc.callbackSendDone = &rxl1_sendDone; -! -! //we start a timer, but just to get a timer ID, we stop it immediately -! rxl1_vars.timerId = opentimers_start(openrandom_get16b()%RXL1PERIOD, -! TIMER_PERIODIC,TIME_MS, -! rxl1_timer); -! opentimers_stop(rxl1_vars.timerId); -! -! opencoap_register(&rxl1_vars.desc); -! } -! -! //=========================== private ========================================= -! -! error_t rxl1_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! error_t outcome; -! uint8_t rawdata[SENSITIVE_ACCEL_TEMPERATURE_DATALEN]; -! -! if (coap_header->Code==COAP_CODE_REQ_POST) { -! // start/stop the data generation to data server -! -! if (msg->payload[0]=='1') { -! //restart timer -! opentimers_restart(rxl1_vars.timerId); -! -! } else { -! //stop timer -! opentimers_stop(rxl1_vars.timerId); -! } -! -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! // CoAP header -! coap_header->OC = 0; -! coap_header->Code = COAP_CODE_RESP_VALID; -! -! outcome = E_SUCCESS; -! -! } else if (coap_header->Code==COAP_CODE_REQ_GET) { -! // return current sensor value -! -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! // CoAP payload (8 bytes of XL data) -! packetfunctions_reserveHeaderSize(msg,8); -! sensitive_accel_temperature_get_measurement(&rawdata[0]); -! memcpy(&msg->payload[0],&rawdata[8],8); -! -! // set the CoAP header -! coap_header->OC = 0; -! coap_header->Code = COAP_CODE_RESP_CONTENT; -! -! outcome = E_SUCCESS; -! -! } else { -! // return an error message -! outcome = E_FAIL; -! } -! -! return outcome; -! } -! -! void rxl1_timer() { -! OpenQueueEntry_t* pkt; -! error_t outcome; -! uint8_t numOptions; -! uint8_t rawdata[SENSITIVE_ACCEL_TEMPERATURE_DATALEN]; -! -! -! // create a CoAP RD packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_RXL1); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_RXL1,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(pkt); -! return; -! } -! // take ownership over that packet -! pkt->creator = COMPONENT_RXL1; -! pkt->owner = COMPONENT_RXL1; -! // CoAP payload (2 bytes of temperature data) -! packetfunctions_reserveHeaderSize(pkt,2); -! sensitive_accel_temperature_get_measurement(&rawdata[0]); -! pkt->payload[0] = rawdata[8]; -! pkt->payload[1] = rawdata[9]; -! numOptions = 0; -! // location-path option -! packetfunctions_reserveHeaderSize(pkt,sizeof(rxl1_path0)-1); -! memcpy(&pkt->payload[0],&rxl1_path0,sizeof(rxl1_path0)-1); -! packetfunctions_reserveHeaderSize(pkt,1); -! pkt->payload[0] = (COAP_OPTION_LOCATIONPATH-COAP_OPTION_CONTENTTYPE) << 4 | -! sizeof(rxl1_path0)-1; -! numOptions++; -! // content-type option -! packetfunctions_reserveHeaderSize(pkt,2); -! pkt->payload[0] = COAP_OPTION_CONTENTTYPE << 4 | -! 1; -! pkt->payload[1] = COAP_MEDTYPE_APPOCTETSTREAM; -! numOptions++; -! // metadata -! pkt->l4_destination_port = WKP_UDP_COAP; -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&pkt->l3_destinationAdd.addr_128b[0],&ipAddr_motesEecs,16); -! // send -! outcome = opencoap_send(pkt, -! COAP_TYPE_NON, -! COAP_CODE_REQ_PUT, -! numOptions, -! &rxl1_vars.desc); -! // avoid overflowing the queue if fails -! if (outcome==E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! -! -! return; -! } -! -! void rxl1_sendDone(OpenQueueEntry_t* msg, error_t error) { -! openqueue_freePacketBuffer(msg); -! } ---- 1,174 ---- -! #include "openwsn.h" -! #include "rxl1.h" -! #include "opentimers.h" -! #include "opencoap.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! #include "openserial.h" -! #include "openrandom.h" -! #include "sensitive_accel_temperature.h" -! -! -! //=========================== defines ========================================= -! -! /// inter-packet period (in mseconds) -! #define RXL1PERIOD 6000 -! -! const uint8_t rxl1_path0[] = "x"; -! -! //=========================== variables ======================================= -! -! typedef struct { -! coap_resource_desc_t desc; -! opentimer_id_t timerId; -! } rxl1_vars_t; -! -! rxl1_vars_t rxl1_vars; -! -! //=========================== prototypes ====================================== -! -! owerror_t rxl1_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! void rxl1_timer(); -! void rxl1_sendDone(OpenQueueEntry_t* msg, -! owerror_t error); -! -! //=========================== public ========================================== -! -! void rxl1_init() { -! // startup the sensor -! sensitive_accel_temperature_init(); -! -! // prepare the resource descriptor for the /temp path -! rxl1_vars.desc.path0len = sizeof(rxl1_path0)-1; -! rxl1_vars.desc.path0val = (uint8_t*)(&rxl1_path0); -! rxl1_vars.desc.path1len = 0; -! rxl1_vars.desc.path1val = NULL; -! rxl1_vars.desc.componentID = COMPONENT_RXL1; -! rxl1_vars.desc.callbackRx = &rxl1_receive; -! rxl1_vars.desc.callbackSendDone = &rxl1_sendDone; -! -! //we start a timer, but just to get a timer ID, we stop it immediately -! rxl1_vars.timerId = opentimers_start(openrandom_get16b()%RXL1PERIOD, -! TIMER_PERIODIC,TIME_MS, -! rxl1_timer); -! opentimers_stop(rxl1_vars.timerId); -! -! opencoap_register(&rxl1_vars.desc); -! } -! -! //=========================== private ========================================= -! -! owerror_t rxl1_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! owerror_t outcome; -! uint8_t rawdata[SENSITIVE_ACCEL_TEMPERATURE_DATALEN]; -! -! if (coap_header->Code==COAP_CODE_REQ_POST) { -! // start/stop the data generation to data server -! -! if (msg->payload[0]=='1') { -! //restart timer -! opentimers_restart(rxl1_vars.timerId); -! -! } else { -! //stop timer -! opentimers_stop(rxl1_vars.timerId); -! } -! -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! // CoAP header -! coap_header->Code = COAP_CODE_RESP_VALID; -! -! outcome = E_SUCCESS; -! -! } else if (coap_header->Code==COAP_CODE_REQ_GET) { -! // return current sensor value -! -! // reset packet payload -! msg->payload = &(msg->packet[127]); -! msg->length = 0; -! -! // CoAP payload (8 bytes of XL data) -! packetfunctions_reserveHeaderSize(msg,8); -! sensitive_accel_temperature_get_measurement(&rawdata[0]); -! memcpy(&msg->payload[0],&rawdata[8],8); -! -! // set the CoAP header -! coap_header->Code = COAP_CODE_RESP_CONTENT; -! -! outcome = E_SUCCESS; -! -! } else { -! // return an error message -! outcome = E_FAIL; -! } -! -! return outcome; -! } -! -! void rxl1_timer() { -! OpenQueueEntry_t* pkt; -! owerror_t outcome; -! uint8_t numOptions; -! uint8_t rawdata[SENSITIVE_ACCEL_TEMPERATURE_DATALEN]; -! -! -! // create a CoAP RD packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_RXL1); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_RXL1,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(pkt); -! return; -! } -! // take ownership over that packet -! pkt->creator = COMPONENT_RXL1; -! pkt->owner = COMPONENT_RXL1; -! // CoAP payload (2 bytes of temperature data) -! packetfunctions_reserveHeaderSize(pkt,2); -! sensitive_accel_temperature_get_measurement(&rawdata[0]); -! pkt->payload[0] = rawdata[8]; -! pkt->payload[1] = rawdata[9]; -! numOptions = 0; -! // location-path option -! packetfunctions_reserveHeaderSize(pkt,sizeof(rxl1_path0)-1); -! memcpy(&pkt->payload[0],&rxl1_path0,sizeof(rxl1_path0)-1); -! packetfunctions_reserveHeaderSize(pkt,1); -! pkt->payload[0] = (COAP_OPTION_NUM_URIPATH) << 4 | -! sizeof(rxl1_path0)-1; -! numOptions++; -! // content-type option -! packetfunctions_reserveHeaderSize(pkt,2); -! pkt->payload[0] = COAP_OPTION_NUM_CONTENTFORMAT << 4 | -! 1; -! pkt->payload[1] = COAP_MEDTYPE_APPOCTETSTREAM; -! numOptions++; -! // metadata -! pkt->l4_destination_port = WKP_UDP_COAP; -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&pkt->l3_destinationAdd.addr_128b[0],&ipAddr_motesEecs,16); -! // send -! outcome = opencoap_send(pkt, -! COAP_TYPE_NON, -! COAP_CODE_REQ_PUT, -! numOptions, -! &rxl1_vars.desc); -! // avoid overflowing the queue if fails -! if (outcome==E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! -! -! return; -! } -! -! void rxl1_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! openqueue_freePacketBuffer(msg); -! } -diff -crB openwsn/07-App/rxl1/rxl1.h ../../../sys/net/openwsn/07-App/rxl1/rxl1.h -*** openwsn/07-App/rxl1/rxl1.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/rxl1/rxl1.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,26 **** -! #ifndef __RXL1_H -! #define __RXL1_H -! -! /** -! \addtogroup App -! \{ -! \addtogroup rXL1 -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void rxl1_init(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,26 ---- -! #ifndef __RXL1_H -! #define __RXL1_H -! -! /** -! \addtogroup AppCoAP -! \{ -! \addtogroup rXL1 -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void rxl1_init(); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/07-App/tcpecho/Makefile ../../../sys/net/openwsn/07-App/tcpecho/Makefile -*** openwsn/07-App/tcpecho/Makefile Wed Jan 15 13:55:34 2014 ---- ../../../sys/net/openwsn/07-App/tcpecho/Makefile Wed Jan 15 13:48:27 2014 -*************** -*** 0 **** ---- 1,32 ---- -+ SUBSUBMOD:=$(shell basename $(CURDIR)).a -+ #BINDIR = $(RIOTBASE)/bin/ -+ SRC = $(wildcard *.c) -+ OBJ = $(SRC:%.c=$(BINDIR)%.o) -+ DEP = $(SRC:%.c=$(BINDIR)%.d) -+ -+ INCLUDES += -I$(RIOTBASE) -I$(RIOTBASE)/sys/include -I$(RIOTBASE)/core/include -I$(RIOTBASE)/drivers/include -I$(RIOTBASE)/drivers/cc110x_ng/include -I$(RIOTBASE)/cpu/arm_common/include -I$(RIOTBASE)/sys/net/include/ -+ INCLUDES += -I$(CURDIR)/02a-MAClow -+ INCLUDES += -I$(CURDIR)/02b-MAChigh -+ INCLUDES += -I$(CURDIR)/03a-IPHC -+ INCLUDES += -I$(CURDIR)/03b-IPv6 -+ INCLUDES += -I$(CURDIR)/04-TRAN -+ INCLUDES += -I$(CURDIR)/cross-layers -+ -+ .PHONY: $(BINDIR)$(SUBSUBMOD) -+ -+ $(BINDIR)$(SUBSUBMOD): $(OBJ) -+ $(AD)$(AR) rcs $(BINDIR)$(MODULE) $(OBJ) -+ -+ # pull in dependency info for *existing* .o files -+ -include $(OBJ:.o=.d) -+ -+ # compile and generate dependency info -+ $(BINDIR)%.o: %.c -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d -+ @printf "$(BINDIR)" | cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d -+ -+ # remove compilation products -+ -+ clean: -+ rm -f $(OBJ) $(DEP) -diff -crB openwsn/07-App/tcpecho/tcpecho.c ../../../sys/net/openwsn/07-App/tcpecho/tcpecho.c -*** openwsn/07-App/tcpecho/tcpecho.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/tcpecho/tcpecho.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,53 **** -! #include "openwsn.h" -! #include "tcpecho.h" -! #include "openqueue.h" -! #include "openserial.h" -! #include "opentcp.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void tcpecho_init() { -! } -! -! bool tcpecho_shouldIlisten() { -! return TRUE; -! } -! -! void tcpecho_receive(OpenQueueEntry_t* msg) { -! uint16_t temp_l4_destination_port; -! msg->owner = COMPONENT_TCPECHO; -! //reply with the same OpenQueueEntry_t -! msg->creator = COMPONENT_TCPECHO; -! msg->l4_protocol = IANA_TCP; -! temp_l4_destination_port = msg->l4_destination_port; -! msg->l4_destination_port = msg->l4_sourcePortORicmpv6Type; -! msg->l4_sourcePortORicmpv6Type = temp_l4_destination_port; -! if (opentcp_send(msg)==E_FAIL) { -! openqueue_freePacketBuffer(msg); -! } -! } -! -! void tcpecho_sendDone(OpenQueueEntry_t* msg, error_t error) { -! msg->owner = COMPONENT_TCPECHO; -! if (msg->creator!=COMPONENT_TCPECHO) { -! openserial_printError(COMPONENT_TCPECHO,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! //close TCP session, but keep listening -! opentcp_close(); -! openqueue_freePacketBuffer(msg); -! } -! -! void tcpecho_connectDone() { -! } -! -! bool tcpecho_debugPrint() { -! return FALSE; -! } -! - //=========================== private ========================================= -\ No newline at end of file ---- 1,53 ---- -! #include "openwsn.h" -! #include "tcpecho.h" -! #include "openqueue.h" -! #include "openserial.h" -! #include "opentcp.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void tcpecho_init(void) { -! } -! -! bool tcpecho_shouldIlisten(void) { -! return TRUE; -! } -! -! void tcpecho_receive(OpenQueueEntry_t* msg) { -! uint16_t temp_l4_destination_port; -! msg->owner = COMPONENT_TCPECHO; -! //reply with the same OpenQueueEntry_t -! msg->creator = COMPONENT_TCPECHO; -! msg->l4_protocol = IANA_TCP; -! temp_l4_destination_port = msg->l4_destination_port; -! msg->l4_destination_port = msg->l4_sourcePortORicmpv6Type; -! msg->l4_sourcePortORicmpv6Type = temp_l4_destination_port; -! if (opentcp_send(msg)==E_FAIL) { -! openqueue_freePacketBuffer(msg); -! } -! } -! -! void tcpecho_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! msg->owner = COMPONENT_TCPECHO; -! if (msg->creator!=COMPONENT_TCPECHO) { -! openserial_printError(COMPONENT_TCPECHO,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! //close TCP session, but keep listening -! opentcp_close(); -! openqueue_freePacketBuffer(msg); -! } -! -! void tcpecho_connectDone(owerror_t error) { -! } -! -! bool tcpecho_debugPrint(void) { -! return FALSE; -! } -! - //=========================== private ========================================= -\ No newline at end of file -diff -crB openwsn/07-App/tcpecho/tcpecho.h ../../../sys/net/openwsn/07-App/tcpecho/tcpecho.h -*** openwsn/07-App/tcpecho/tcpecho.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/tcpecho/tcpecho.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,31 **** -! #ifndef __TCPECHO_H -! #define __TCPECHO_H -! -! /** -! \addtogroup App -! \{ -! \addtogroup tcpEcho -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void tcpecho_init(); -! bool tcpecho_shouldIlisten(); -! void tcpecho_receive(OpenQueueEntry_t* msg); -! void tcpecho_sendDone(OpenQueueEntry_t* msg, error_t error); -! void tcpecho_connectDone(); -! bool tcpecho_debugPrint(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,31 ---- -! #ifndef __TCPECHO_H -! #define __TCPECHO_H -! -! /** -! \addtogroup AppTcp -! \{ -! \addtogroup tcpEcho -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void tcpecho_init(void); -! bool tcpecho_shouldIlisten(void); -! void tcpecho_receive(OpenQueueEntry_t* msg); -! void tcpecho_sendDone(OpenQueueEntry_t* msg, owerror_t error); -! void tcpecho_connectDone(owerror_t error); -! bool tcpecho_debugPrint(void); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/07-App/tcpinject/Makefile ../../../sys/net/openwsn/07-App/tcpinject/Makefile -*** openwsn/07-App/tcpinject/Makefile Wed Jan 15 13:55:34 2014 ---- ../../../sys/net/openwsn/07-App/tcpinject/Makefile Wed Jan 15 13:48:27 2014 -*************** -*** 0 **** ---- 1,32 ---- -+ SUBSUBMOD:=$(shell basename $(CURDIR)).a -+ #BINDIR = $(RIOTBASE)/bin/ -+ SRC = $(wildcard *.c) -+ OBJ = $(SRC:%.c=$(BINDIR)%.o) -+ DEP = $(SRC:%.c=$(BINDIR)%.d) -+ -+ INCLUDES += -I$(RIOTBASE) -I$(RIOTBASE)/sys/include -I$(RIOTBASE)/core/include -I$(RIOTBASE)/drivers/include -I$(RIOTBASE)/drivers/cc110x_ng/include -I$(RIOTBASE)/cpu/arm_common/include -I$(RIOTBASE)/sys/net/include/ -+ INCLUDES += -I$(CURDIR)/02a-MAClow -+ INCLUDES += -I$(CURDIR)/02b-MAChigh -+ INCLUDES += -I$(CURDIR)/03a-IPHC -+ INCLUDES += -I$(CURDIR)/03b-IPv6 -+ INCLUDES += -I$(CURDIR)/04-TRAN -+ INCLUDES += -I$(CURDIR)/cross-layers -+ -+ .PHONY: $(BINDIR)$(SUBSUBMOD) -+ -+ $(BINDIR)$(SUBSUBMOD): $(OBJ) -+ $(AD)$(AR) rcs $(BINDIR)$(MODULE) $(OBJ) -+ -+ # pull in dependency info for *existing* .o files -+ -include $(OBJ:.o=.d) -+ -+ # compile and generate dependency info -+ $(BINDIR)%.o: %.c -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d -+ @printf "$(BINDIR)" | cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d -+ -+ # remove compilation products -+ -+ clean: -+ rm -f $(OBJ) $(DEP) -diff -crB openwsn/07-App/tcpinject/tcpinject.c ../../../sys/net/openwsn/07-App/tcpinject/tcpinject.c -*** openwsn/07-App/tcpinject/tcpinject.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/tcpinject/tcpinject.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,95 **** -! #include "openwsn.h" -! #include "tcpinject.h" -! #include "openserial.h" -! #include "packetfunctions.h" -! #include "opentcp.h" -! #include "openqueue.h" -! -! //=========================== variables ======================================= -! -! typedef struct { -! OpenQueueEntry_t* pkt; -! bool sending; -! open_addr_t hisAddress; -! uint16_t hisPort; -! } tcpinject_vars_t; -! -! tcpinject_vars_t tcpinject_vars; -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void tcpinject_init() { -! } -! -! bool tcpinject_shouldIlisten() { -! return FALSE; -! } -! -! void tcpinject_trigger() { -! uint8_t number_bytes_from_input_buffer; -! uint8_t input_buffer[18]; -! //get command from OpenSerial (16B IPv6 destination address, 2B destination port) -! number_bytes_from_input_buffer = openserial_getInputBuffer(&(input_buffer[0]),sizeof(input_buffer)); -! if (number_bytes_from_input_buffer!=sizeof(input_buffer)) { -! openserial_printError(COMPONENT_TCPINJECT,ERR_INPUTBUFFER_LENGTH, -! (errorparameter_t)number_bytes_from_input_buffer, -! (errorparameter_t)0); -! return; -! }; -! tcpinject_vars.hisAddress.type = ADDR_128B; -! memcpy(&(tcpinject_vars.hisAddress.addr_128b[0]),&(input_buffer[0]),16); -! tcpinject_vars.hisPort = packetfunctions_ntohs(&(input_buffer[16])); -! //connect -! opentcp_connect(&tcpinject_vars.hisAddress,tcpinject_vars.hisPort,WKP_TCP_INJECT); -! } -! -! void tcpinject_connectDone(error_t error) { -! if (error==E_SUCCESS) { -! tcpinject_vars.pkt = openqueue_getFreePacketBuffer(COMPONENT_TCPINJECT); -! if (tcpinject_vars.pkt==NULL) { -! openserial_printError(COMPONENT_TCPINJECT,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return; -! } -! tcpinject_vars.pkt->creator = COMPONENT_TCPINJECT; -! tcpinject_vars.pkt->owner = COMPONENT_TCPINJECT; -! tcpinject_vars.pkt->l4_protocol = IANA_UDP; -! tcpinject_vars.pkt->l4_sourcePortORicmpv6Type = WKP_TCP_INJECT; -! tcpinject_vars.pkt->l4_destination_port = tcpinject_vars.hisPort; -! memcpy(&(tcpinject_vars.pkt->l3_destinationAdd),&tcpinject_vars.hisAddress,sizeof(open_addr_t)); -! packetfunctions_reserveHeaderSize(tcpinject_vars.pkt,6); -! ((uint8_t*)tcpinject_vars.pkt->payload)[0] = 'p'; -! ((uint8_t*)tcpinject_vars.pkt->payload)[1] = 'o'; -! ((uint8_t*)tcpinject_vars.pkt->payload)[2] = 'i'; -! ((uint8_t*)tcpinject_vars.pkt->payload)[3] = 'p'; -! ((uint8_t*)tcpinject_vars.pkt->payload)[4] = 'o'; -! ((uint8_t*)tcpinject_vars.pkt->payload)[5] = 'i'; -! if (opentcp_send(tcpinject_vars.pkt)==E_FAIL) { -! openqueue_freePacketBuffer(tcpinject_vars.pkt); -! } -! return; -! } -! } -! -! void tcpinject_sendDone(OpenQueueEntry_t* msg, error_t error) { -! msg->owner = COMPONENT_TCPINJECT; -! if (msg->creator!=COMPONENT_TCPINJECT) { -! openserial_printError(COMPONENT_TCPINJECT,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! opentcp_close(); -! openqueue_freePacketBuffer(msg); -! } -! -! void tcpinject_receive(OpenQueueEntry_t* msg) { -! } -! -! bool tcpinject_debugPrint() { -! return FALSE; -! } -! - //=========================== private ========================================= -\ No newline at end of file ---- 1,88 ---- -! #include "openwsn.h" -! #include "tcpinject.h" -! #include "openserial.h" -! #include "packetfunctions.h" -! #include "opentcp.h" -! #include "openqueue.h" -! -! //=========================== variables ======================================= -! -! tcpinject_vars_t tcpinject_vars; -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void tcpinject_init(void) { -! } -! -! bool tcpinject_shouldIlisten(void) { -! return FALSE; -! } -! -! void tcpinject_trigger(void) { -! uint8_t number_bytes_from_input_buffer; -! uint8_t input_buffer[18]; -! //get command from OpenSerial (16B IPv6 destination address, 2B destination port) -! number_bytes_from_input_buffer = openserial_getInputBuffer(&(input_buffer[0]),sizeof(input_buffer)); -! if (number_bytes_from_input_buffer!=sizeof(input_buffer)) { -! openserial_printError(COMPONENT_TCPINJECT,ERR_INPUTBUFFER_LENGTH, -! (errorparameter_t)number_bytes_from_input_buffer, -! (errorparameter_t)0); -! return; -! }; -! tcpinject_vars.hisAddress.type = ADDR_128B; -! memcpy(&(tcpinject_vars.hisAddress.addr_128b[0]),&(input_buffer[0]),16); -! tcpinject_vars.hisPort = packetfunctions_ntohs(&(input_buffer[16])); -! //connect -! opentcp_connect(&tcpinject_vars.hisAddress,tcpinject_vars.hisPort,WKP_TCP_INJECT); -! } -! -! void tcpinject_connectDone(owerror_t error) { -! if (error==E_SUCCESS) { -! tcpinject_vars.pkt = openqueue_getFreePacketBuffer(COMPONENT_TCPINJECT); -! if (tcpinject_vars.pkt==NULL) { -! openserial_printError(COMPONENT_TCPINJECT,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return; -! } -! tcpinject_vars.pkt->creator = COMPONENT_TCPINJECT; -! tcpinject_vars.pkt->owner = COMPONENT_TCPINJECT; -! tcpinject_vars.pkt->l4_protocol = IANA_UDP; -! tcpinject_vars.pkt->l4_sourcePortORicmpv6Type = WKP_TCP_INJECT; -! tcpinject_vars.pkt->l4_destination_port = tcpinject_vars.hisPort; -! memcpy(&(tcpinject_vars.pkt->l3_destinationAdd),&tcpinject_vars.hisAddress,sizeof(open_addr_t)); -! packetfunctions_reserveHeaderSize(tcpinject_vars.pkt,6); -! ((uint8_t*)tcpinject_vars.pkt->payload)[0] = 'p'; -! ((uint8_t*)tcpinject_vars.pkt->payload)[1] = 'o'; -! ((uint8_t*)tcpinject_vars.pkt->payload)[2] = 'i'; -! ((uint8_t*)tcpinject_vars.pkt->payload)[3] = 'p'; -! ((uint8_t*)tcpinject_vars.pkt->payload)[4] = 'o'; -! ((uint8_t*)tcpinject_vars.pkt->payload)[5] = 'i'; -! if (opentcp_send(tcpinject_vars.pkt)==E_FAIL) { -! openqueue_freePacketBuffer(tcpinject_vars.pkt); -! } -! return; -! } -! } -! -! void tcpinject_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! msg->owner = COMPONENT_TCPINJECT; -! if (msg->creator!=COMPONENT_TCPINJECT) { -! openserial_printError(COMPONENT_TCPINJECT,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! opentcp_close(); -! openqueue_freePacketBuffer(msg); -! } -! -! void tcpinject_receive(OpenQueueEntry_t* msg) { -! } -! -! bool tcpinject_debugPrint(void) { -! return FALSE; -! } -! - //=========================== private ========================================= -\ No newline at end of file -diff -crB openwsn/07-App/tcpinject/tcpinject.h ../../../sys/net/openwsn/07-App/tcpinject/tcpinject.h -*** openwsn/07-App/tcpinject/tcpinject.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/tcpinject/tcpinject.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,32 **** -! #ifndef __TCPINJECT_H -! #define __TCPINJECT_H -! -! /** -! \addtogroup App -! \{ -! \addtogroup tcpInject -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void tcpinject_init(); -! bool tcpinject_shouldIlisten(); -! void tcpinject_trigger(); -! void tcpinject_connectDone(error_t error); -! void tcpinject_sendDone(OpenQueueEntry_t* msg, error_t error); -! void tcpinject_receive(OpenQueueEntry_t* msg); -! bool tcpinject_debugPrint(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,39 ---- -! #ifndef __TCPINJECT_H -! #define __TCPINJECT_H -! -! /** -! \addtogroup AppTcp -! \{ -! \addtogroup tcpInject -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== module variables ================================ -! -! typedef struct { -! OpenQueueEntry_t* pkt; -! bool sending; -! open_addr_t hisAddress; -! uint16_t hisPort; -! } tcpinject_vars_t; -! -! //=========================== prototypes ====================================== -! -! void tcpinject_init(void); -! bool tcpinject_shouldIlisten(void); -! void tcpinject_trigger(void); -! void tcpinject_connectDone(owerror_t error); -! void tcpinject_sendDone(OpenQueueEntry_t* msg, owerror_t error); -! void tcpinject_receive(OpenQueueEntry_t* msg); -! bool tcpinject_debugPrint(void); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/07-App/tcpprint/Makefile ../../../sys/net/openwsn/07-App/tcpprint/Makefile -*** openwsn/07-App/tcpprint/Makefile Wed Jan 15 13:55:34 2014 ---- ../../../sys/net/openwsn/07-App/tcpprint/Makefile Wed Jan 15 13:48:27 2014 -*************** -*** 0 **** ---- 1,32 ---- -+ SUBSUBMOD:=$(shell basename $(CURDIR)).a -+ #BINDIR = $(RIOTBASE)/bin/ -+ SRC = $(wildcard *.c) -+ OBJ = $(SRC:%.c=$(BINDIR)%.o) -+ DEP = $(SRC:%.c=$(BINDIR)%.d) -+ -+ INCLUDES += -I$(RIOTBASE) -I$(RIOTBASE)/sys/include -I$(RIOTBASE)/core/include -I$(RIOTBASE)/drivers/include -I$(RIOTBASE)/drivers/cc110x_ng/include -I$(RIOTBASE)/cpu/arm_common/include -I$(RIOTBASE)/sys/net/include/ -+ INCLUDES += -I$(CURDIR)/02a-MAClow -+ INCLUDES += -I$(CURDIR)/02b-MAChigh -+ INCLUDES += -I$(CURDIR)/03a-IPHC -+ INCLUDES += -I$(CURDIR)/03b-IPv6 -+ INCLUDES += -I$(CURDIR)/04-TRAN -+ INCLUDES += -I$(CURDIR)/cross-layers -+ -+ .PHONY: $(BINDIR)$(SUBSUBMOD) -+ -+ $(BINDIR)$(SUBSUBMOD): $(OBJ) -+ $(AD)$(AR) rcs $(BINDIR)$(MODULE) $(OBJ) -+ -+ # pull in dependency info for *existing* .o files -+ -include $(OBJ:.o=.d) -+ -+ # compile and generate dependency info -+ $(BINDIR)%.o: %.c -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d -+ @printf "$(BINDIR)" | cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d -+ -+ # remove compilation products -+ -+ clean: -+ rm -f $(OBJ) $(DEP) -diff -crB openwsn/07-App/tcpprint/tcpprint.c ../../../sys/net/openwsn/07-App/tcpprint/tcpprint.c -*** openwsn/07-App/tcpprint/tcpprint.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/tcpprint/tcpprint.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,37 **** -! #include "openwsn.h" -! #include "tcpprint.h" -! #include "openserial.h" -! #include "openqueue.h" -! #include "opentcp.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void tcpprint_init() { -! } -! -! bool tcpprint_shouldIlisten(){ -! return TRUE; -! } -! -! void tcpprint_receive(OpenQueueEntry_t* msg) { -! openserial_printData((uint8_t*)(msg->payload),msg->length); -! //close TCP session, but keep listening -! opentcp_close(); -! openqueue_freePacketBuffer(msg); -! } -! -! void tcpprint_connectDone(error_t error) { -! } -! -! void tcpprint_sendDone(OpenQueueEntry_t* msg, error_t error) { -! } -! -! bool tcpprint_debugPrint() { -! return FALSE; -! } -! - //=========================== private ========================================= -\ No newline at end of file ---- 1,37 ---- -! #include "openwsn.h" -! #include "tcpprint.h" -! #include "openserial.h" -! #include "openqueue.h" -! #include "opentcp.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void tcpprint_init(void) { -! } -! -! bool tcpprint_shouldIlisten(void){ -! return TRUE; -! } -! -! void tcpprint_receive(OpenQueueEntry_t* msg) { -! openserial_printData((uint8_t*)(msg->payload),msg->length); -! //close TCP session, but keep listening -! opentcp_close(); -! openqueue_freePacketBuffer(msg); -! } -! -! void tcpprint_connectDone(owerror_t error) { -! } -! -! void tcpprint_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! } -! -! bool tcpprint_debugPrint(void) { -! return FALSE; -! } -! - //=========================== private ========================================= -\ No newline at end of file -diff -crB openwsn/07-App/tcpprint/tcpprint.h ../../../sys/net/openwsn/07-App/tcpprint/tcpprint.h -*** openwsn/07-App/tcpprint/tcpprint.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/tcpprint/tcpprint.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,31 **** -! #ifndef __TCPPRINT_H -! #define __TCPPRINT_H -! -! /** -! \addtogroup App -! \{ -! \addtogroup tcpPrint -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void tcpprint_init(); -! bool tcpprint_shouldIlisten(); -! void tcpprint_receive(OpenQueueEntry_t* msg); -! void tcpprint_connectDone(error_t error); -! void tcpprint_sendDone(OpenQueueEntry_t* msg, error_t error); -! bool tcpprint_debugPrint(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,31 ---- -! #ifndef __TCPPRINT_H -! #define __TCPPRINT_H -! -! /** -! \addtogroup AppTcp -! \{ -! \addtogroup tcpPrint -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void tcpprint_init(void); -! bool tcpprint_shouldIlisten(void); -! void tcpprint_receive(OpenQueueEntry_t* msg); -! void tcpprint_connectDone(owerror_t error); -! void tcpprint_sendDone(OpenQueueEntry_t* msg, owerror_t error); -! bool tcpprint_debugPrint(void); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/07-App/udpecho/Makefile ../../../sys/net/openwsn/07-App/udpecho/Makefile -*** openwsn/07-App/udpecho/Makefile Wed Jan 15 13:55:34 2014 ---- ../../../sys/net/openwsn/07-App/udpecho/Makefile Wed Jan 15 13:48:27 2014 -*************** -*** 0 **** ---- 1,32 ---- -+ SUBSUBMOD:=$(shell basename $(CURDIR)).a -+ #BINDIR = $(RIOTBASE)/bin/ -+ SRC = $(wildcard *.c) -+ OBJ = $(SRC:%.c=$(BINDIR)%.o) -+ DEP = $(SRC:%.c=$(BINDIR)%.d) -+ -+ INCLUDES += -I$(RIOTBASE) -I$(RIOTBASE)/sys/include -I$(RIOTBASE)/core/include -I$(RIOTBASE)/drivers/include -I$(RIOTBASE)/drivers/cc110x_ng/include -I$(RIOTBASE)/cpu/arm_common/include -I$(RIOTBASE)/sys/net/include/ -+ INCLUDES += -I$(CURDIR)/02a-MAClow -+ INCLUDES += -I$(CURDIR)/02b-MAChigh -+ INCLUDES += -I$(CURDIR)/03a-IPHC -+ INCLUDES += -I$(CURDIR)/03b-IPv6 -+ INCLUDES += -I$(CURDIR)/04-TRAN -+ INCLUDES += -I$(CURDIR)/cross-layers -+ -+ .PHONY: $(BINDIR)$(SUBSUBMOD) -+ -+ $(BINDIR)$(SUBSUBMOD): $(OBJ) -+ $(AD)$(AR) rcs $(BINDIR)$(MODULE) $(OBJ) -+ -+ # pull in dependency info for *existing* .o files -+ -include $(OBJ:.o=.d) -+ -+ # compile and generate dependency info -+ $(BINDIR)%.o: %.c -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d -+ @printf "$(BINDIR)" | cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d -+ -+ # remove compilation products -+ -+ clean: -+ rm -f $(OBJ) $(DEP) -diff -crB openwsn/07-App/udpecho/udpecho.c ../../../sys/net/openwsn/07-App/udpecho/udpecho.c -*** openwsn/07-App/udpecho/udpecho.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/udpecho/udpecho.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,61 **** -! #include "openwsn.h" -! #include "udpecho.h" -! #include "openudp.h" -! #include "openqueue.h" -! #include "openserial.h" -! #include "packetfunctions.h" -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void udpecho_init() { -! } -! -! void udpecho_receive(OpenQueueEntry_t* msg) { -! uint16_t temp_l4_destination_port; -! -! OpenQueueEntry_t * pkt = openqueue_getFreePacketBuffer(COMPONENT_UDPECHO); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_UDPLATENCY,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return; -! } -! -! pkt->owner = COMPONENT_UDPECHO; -! //reply with the same OpenQueueEntry_t -! pkt->creator = COMPONENT_UDPECHO; -! pkt->l4_protocol = IANA_UDP; -! temp_l4_destination_port = msg->l4_destination_port; -! pkt->l4_destination_port = msg->l4_sourcePortORicmpv6Type; -! pkt->l4_sourcePortORicmpv6Type = temp_l4_destination_port; -! pkt->l3_destinationAdd.type = ADDR_128B; -! //copy source to destination to echo. -! memcpy(&pkt->l3_destinationAdd.addr_128b[0],&msg->l3_sourceAdd.addr_128b[0],16); -! -! packetfunctions_reserveHeaderSize(pkt,msg->length); -! memcpy(&pkt->payload[0],&msg->payload[0],msg->length); -! openqueue_freePacketBuffer(msg); -! -! if ((openudp_send(pkt))==E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! } -! -! void udpecho_sendDone(OpenQueueEntry_t* msg, error_t error) { -! msg->owner = COMPONENT_UDPECHO; -! if (msg->creator!=COMPONENT_UDPECHO) { -! openserial_printError(COMPONENT_UDPECHO,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! openqueue_freePacketBuffer(msg); -! } -! -! bool udpecho_debugPrint() { -! return FALSE; -! } -! - //=========================== private ========================================= -\ No newline at end of file ---- 1,61 ---- -! #include "openwsn.h" -! #include "udpecho.h" -! #include "openudp.h" -! #include "openqueue.h" -! #include "openserial.h" -! #include "packetfunctions.h" -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void udpecho_init(void) { -! } -! -! void udpecho_receive(OpenQueueEntry_t* msg) { -! uint16_t temp_l4_destination_port; -! -! OpenQueueEntry_t * pkt = openqueue_getFreePacketBuffer(COMPONENT_UDPECHO); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_UDPLATENCY,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return; -! } -! -! pkt->owner = COMPONENT_UDPECHO; -! //reply with the same OpenQueueEntry_t -! pkt->creator = COMPONENT_UDPECHO; -! pkt->l4_protocol = IANA_UDP; -! temp_l4_destination_port = msg->l4_destination_port; -! pkt->l4_destination_port = msg->l4_sourcePortORicmpv6Type; -! pkt->l4_sourcePortORicmpv6Type = temp_l4_destination_port; -! pkt->l3_destinationAdd.type = ADDR_128B; -! //copy source to destination to echo. -! memcpy(&pkt->l3_destinationAdd.addr_128b[0],&msg->l3_sourceAdd.addr_128b[0],16); -! -! packetfunctions_reserveHeaderSize(pkt,msg->length); -! memcpy(&pkt->payload[0],&msg->payload[0],msg->length); -! openqueue_freePacketBuffer(msg); -! -! if ((openudp_send(pkt))==E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! } -! -! void udpecho_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! msg->owner = COMPONENT_UDPECHO; -! if (msg->creator!=COMPONENT_UDPECHO) { -! openserial_printError(COMPONENT_UDPECHO,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! openqueue_freePacketBuffer(msg); -! } -! -! bool udpecho_debugPrint(void) { -! return FALSE; -! } -! - //=========================== private ========================================= -\ No newline at end of file -diff -crB openwsn/07-App/udpecho/udpecho.h ../../../sys/net/openwsn/07-App/udpecho/udpecho.h -*** openwsn/07-App/udpecho/udpecho.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/udpecho/udpecho.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,29 **** -! #ifndef __UDPECHO_H -! #define __UDPECHO_H -! -! /** -! \addtogroup App -! \{ -! \addtogroup udpEcho -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void udpecho_init(); -! void udpecho_receive(OpenQueueEntry_t* msg); -! void udpecho_sendDone(OpenQueueEntry_t* msg, error_t error); -! bool udpecho_debugPrint(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,29 ---- -! #ifndef __UDPECHO_H -! #define __UDPECHO_H -! -! /** -! \addtogroup AppUdp -! \{ -! \addtogroup udpEcho -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void udpecho_init(void); -! void udpecho_receive(OpenQueueEntry_t* msg); -! void udpecho_sendDone(OpenQueueEntry_t* msg, owerror_t error); -! bool udpecho_debugPrint(void); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/07-App/udpecho/udpecho.py ../../../sys/net/openwsn/07-App/udpecho/udpecho.py -*** openwsn/07-App/udpecho/udpecho.py Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/udpecho/udpecho.py Wed Jan 15 13:48:27 2014 -*************** -*** 1,26 **** -! import socket -! -! request = "poipoipoipoi" -! myAddress = '' #means 'all' -! myPort = 21568 -! hisAddress = '2001:470:48b8:cfde:1415:9200:12:e63b' -! hisPort = 7 -! -! print "Testing udpEcho..." -! -! socket_handler = socket.socket(socket.AF_INET6,socket.SOCK_DGRAM) -! socket_handler.settimeout(5) -! socket_handler.bind((myAddress,myPort)) -! socket_handler.sendto(request,(hisAddress,hisPort)) -! print "\nrequest "+myAddress+"%"+str(myPort)+" -> "+hisAddress+"%"+str(hisPort) -! print request+" ("+str(len(request))+" bytes)" -! try: -! reply,dist_addr = socket_handler.recvfrom(1024) -! except socket.timeout: -! print "\nno reply" -! else: -! print "\nreply "+str(dist_addr[0])+"%"+str(dist_addr[1])+" -> "+myAddress+"%"+str(myPort) -! print reply+" ("+str(len(reply))+" bytes)" -! socket_handler.close() -! -! raw_input("\nPress return to close this window...") ---- 1,32 ---- -! import socket -! -! request = "poipoipoipoi" -! myAddress = '' #means 'all' -! myPort = 21568 -! hisAddress = 'bbbb::1415:920b:0301:00e9' -! hisPort = 7 -! succ = 0 -! fail = 0 -! print "Testing udpEcho..." -! -! for i in range(10): -! print "echo " + str(i) -! socket_handler = socket.socket(socket.AF_INET6,socket.SOCK_DGRAM) -! socket_handler.settimeout(5) -! socket_handler.bind((myAddress,myPort)) -! socket_handler.sendto(request,(hisAddress,hisPort)) -! print "\nrequest "+myAddress+"%"+str(myPort)+" -> "+hisAddress+"%"+str(hisPort) -! print request+" ("+str(len(request))+" bytes)" -! try: -! reply,dist_addr = socket_handler.recvfrom(1024) -! except socket.timeout: -! print "\nno reply" -! fail=fail+1 -! else: -! print "\nreply "+str(dist_addr[0])+"%"+str(dist_addr[1])+" -> "+myAddress+"%"+str(myPort) -! print reply+" ("+str(len(reply))+" bytes)" -! succ=succ+1 -! socket_handler.close() -! -! print "success " + str(succ) + " fail " + str(fail) -! raw_input("\nPress return to close this window...") -diff -crB openwsn/07-App/udpinject/Makefile ../../../sys/net/openwsn/07-App/udpinject/Makefile -*** openwsn/07-App/udpinject/Makefile Wed Jan 15 13:55:34 2014 ---- ../../../sys/net/openwsn/07-App/udpinject/Makefile Wed Jan 15 13:48:27 2014 -*************** -*** 0 **** ---- 1,32 ---- -+ SUBSUBMOD:=$(shell basename $(CURDIR)).a -+ #BINDIR = $(RIOTBASE)/bin/ -+ SRC = $(wildcard *.c) -+ OBJ = $(SRC:%.c=$(BINDIR)%.o) -+ DEP = $(SRC:%.c=$(BINDIR)%.d) -+ -+ INCLUDES += -I$(RIOTBASE) -I$(RIOTBASE)/sys/include -I$(RIOTBASE)/core/include -I$(RIOTBASE)/drivers/include -I$(RIOTBASE)/drivers/cc110x_ng/include -I$(RIOTBASE)/cpu/arm_common/include -I$(RIOTBASE)/sys/net/include/ -+ INCLUDES += -I$(CURDIR)/02a-MAClow -+ INCLUDES += -I$(CURDIR)/02b-MAChigh -+ INCLUDES += -I$(CURDIR)/03a-IPHC -+ INCLUDES += -I$(CURDIR)/03b-IPv6 -+ INCLUDES += -I$(CURDIR)/04-TRAN -+ INCLUDES += -I$(CURDIR)/cross-layers -+ -+ .PHONY: $(BINDIR)$(SUBSUBMOD) -+ -+ $(BINDIR)$(SUBSUBMOD): $(OBJ) -+ $(AD)$(AR) rcs $(BINDIR)$(MODULE) $(OBJ) -+ -+ # pull in dependency info for *existing* .o files -+ -include $(OBJ:.o=.d) -+ -+ # compile and generate dependency info -+ $(BINDIR)%.o: %.c -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d -+ @printf "$(BINDIR)" | cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d -+ -+ # remove compilation products -+ -+ clean: -+ rm -f $(OBJ) $(DEP) -diff -crB openwsn/07-App/udpinject/udpinject.c ../../../sys/net/openwsn/07-App/udpinject/udpinject.c -*** openwsn/07-App/udpinject/udpinject.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/udpinject/udpinject.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,75 **** -! #include "openwsn.h" -! #include "udpinject.h" -! #include "openudp.h" -! #include "openqueue.h" -! #include "openserial.h" -! #include "packetfunctions.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void udpinject_init() { -! } -! -! void udpinject_trigger() { -! OpenQueueEntry_t* pkt; -! uint8_t number_bytes_from_input_buffer; -! uint8_t input_buffer[18]; -! //get command from OpenSerial (16B IPv6 destination address, 2B destination port) -! number_bytes_from_input_buffer = openserial_getInputBuffer(&(input_buffer[0]),sizeof(input_buffer)); -! if (number_bytes_from_input_buffer!=sizeof(input_buffer)) { -! openserial_printError(COMPONENT_UDPINJECT,ERR_INPUTBUFFER_LENGTH, -! (errorparameter_t)number_bytes_from_input_buffer, -! (errorparameter_t)0); -! return; -! }; -! //prepare packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_UDPINJECT); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_UDPINJECT,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return; -! } -! pkt->creator = COMPONENT_UDPINJECT; -! pkt->owner = COMPONENT_UDPINJECT; -! pkt->l4_protocol = IANA_UDP; -! pkt->l4_sourcePortORicmpv6Type = WKP_UDP_INJECT; -! pkt->l4_destination_port = packetfunctions_ntohs(&(input_buffer[16])); -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&(pkt->l3_destinationAdd.addr_128b[0]),&(input_buffer[0]),16); -! packetfunctions_reserveHeaderSize(pkt,6); -! ((uint8_t*)pkt->payload)[0] = 'p'; -! ((uint8_t*)pkt->payload)[1] = 'o'; -! ((uint8_t*)pkt->payload)[2] = 'i'; -! ((uint8_t*)pkt->payload)[3] = 'p'; -! ((uint8_t*)pkt->payload)[4] = 'o'; -! ((uint8_t*)pkt->payload)[5] = 'i'; -! //send packet -! if ((openudp_send(pkt))==E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! } -! -! void udpinject_sendDone(OpenQueueEntry_t* msg, error_t error) { -! msg->owner = COMPONENT_UDPINJECT; -! if (msg->creator!=COMPONENT_UDPINJECT) { -! openserial_printError(COMPONENT_UDPINJECT,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! openqueue_freePacketBuffer(msg); -! } -! -! void udpinject_receive(OpenQueueEntry_t* msg) { -! openqueue_freePacketBuffer(msg); -! } -! -! bool udpinject_debugPrint() { -! return FALSE; -! } -! - //=========================== private ========================================= -\ No newline at end of file ---- 1,75 ---- -! #include "openwsn.h" -! #include "udpinject.h" -! #include "openudp.h" -! #include "openqueue.h" -! #include "openserial.h" -! #include "packetfunctions.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void udpinject_init(void) { -! } -! -! void udpinject_trigger(void) { -! OpenQueueEntry_t* pkt; -! uint8_t number_bytes_from_input_buffer; -! uint8_t input_buffer[18]; -! //get command from OpenSerial (16B IPv6 destination address, 2B destination port) -! number_bytes_from_input_buffer = openserial_getInputBuffer(&(input_buffer[0]),sizeof(input_buffer)); -! if (number_bytes_from_input_buffer!=sizeof(input_buffer)) { -! openserial_printError(COMPONENT_UDPINJECT,ERR_INPUTBUFFER_LENGTH, -! (errorparameter_t)number_bytes_from_input_buffer, -! (errorparameter_t)0); -! return; -! }; -! //prepare packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_UDPINJECT); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_UDPINJECT,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return; -! } -! pkt->creator = COMPONENT_UDPINJECT; -! pkt->owner = COMPONENT_UDPINJECT; -! pkt->l4_protocol = IANA_UDP; -! pkt->l4_sourcePortORicmpv6Type = WKP_UDP_INJECT; -! pkt->l4_destination_port = packetfunctions_ntohs(&(input_buffer[16])); -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&(pkt->l3_destinationAdd.addr_128b[0]),&(input_buffer[0]),16); -! packetfunctions_reserveHeaderSize(pkt,6); -! ((uint8_t*)pkt->payload)[0] = 'p'; -! ((uint8_t*)pkt->payload)[1] = 'o'; -! ((uint8_t*)pkt->payload)[2] = 'i'; -! ((uint8_t*)pkt->payload)[3] = 'p'; -! ((uint8_t*)pkt->payload)[4] = 'o'; -! ((uint8_t*)pkt->payload)[5] = 'i'; -! //send packet -! if ((openudp_send(pkt))==E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! } -! -! void udpinject_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! msg->owner = COMPONENT_UDPINJECT; -! if (msg->creator!=COMPONENT_UDPINJECT) { -! openserial_printError(COMPONENT_UDPINJECT,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! openqueue_freePacketBuffer(msg); -! } -! -! void udpinject_receive(OpenQueueEntry_t* msg) { -! openqueue_freePacketBuffer(msg); -! } -! -! bool udpinject_debugPrint(void) { -! return FALSE; -! } -! - //=========================== private ========================================= -\ No newline at end of file -diff -crB openwsn/07-App/udpinject/udpinject.h ../../../sys/net/openwsn/07-App/udpinject/udpinject.h -*** openwsn/07-App/udpinject/udpinject.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/udpinject/udpinject.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,30 **** -! #ifndef __UDPINJECT_H -! #define __UDPINJECT_H -! -! /** -! \addtogroup App -! \{ -! \addtogroup udpInject -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void udpinject_init(); -! void udpinject_trigger(); -! void udpinject_sendDone(OpenQueueEntry_t* msg, error_t error); -! void udpinject_receive(OpenQueueEntry_t* msg); -! bool udpinject_debugPrint(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,30 ---- -! #ifndef __UDPINJECT_H -! #define __UDPINJECT_H -! -! /** -! \addtogroup AppUdp -! \{ -! \addtogroup udpInject -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void udpinject_init(void); -! void udpinject_trigger(void); -! void udpinject_sendDone(OpenQueueEntry_t* msg, owerror_t error); -! void udpinject_receive(OpenQueueEntry_t* msg); -! bool udpinject_debugPrint(void); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/07-App/udplatency/Makefile ../../../sys/net/openwsn/07-App/udplatency/Makefile -*** openwsn/07-App/udplatency/Makefile Wed Jan 15 13:55:34 2014 ---- ../../../sys/net/openwsn/07-App/udplatency/Makefile Wed Jan 15 13:48:27 2014 -*************** -*** 0 **** ---- 1,32 ---- -+ SUBSUBMOD:=$(shell basename $(CURDIR)).a -+ #BINDIR = $(RIOTBASE)/bin/ -+ SRC = $(wildcard *.c) -+ OBJ = $(SRC:%.c=$(BINDIR)%.o) -+ DEP = $(SRC:%.c=$(BINDIR)%.d) -+ -+ INCLUDES += -I$(RIOTBASE) -I$(RIOTBASE)/sys/include -I$(RIOTBASE)/core/include -I$(RIOTBASE)/drivers/include -I$(RIOTBASE)/drivers/cc110x_ng/include -I$(RIOTBASE)/cpu/arm_common/include -I$(RIOTBASE)/sys/net/include/ -+ INCLUDES += -I$(CURDIR)/02a-MAClow -+ INCLUDES += -I$(CURDIR)/02b-MAChigh -+ INCLUDES += -I$(CURDIR)/03a-IPHC -+ INCLUDES += -I$(CURDIR)/03b-IPv6 -+ INCLUDES += -I$(CURDIR)/04-TRAN -+ INCLUDES += -I$(CURDIR)/cross-layers -+ -+ .PHONY: $(BINDIR)$(SUBSUBMOD) -+ -+ $(BINDIR)$(SUBSUBMOD): $(OBJ) -+ $(AD)$(AR) rcs $(BINDIR)$(MODULE) $(OBJ) -+ -+ # pull in dependency info for *existing* .o files -+ -include $(OBJ:.o=.d) -+ -+ # compile and generate dependency info -+ $(BINDIR)%.o: %.c -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d -+ @printf "$(BINDIR)" | cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d -+ -+ # remove compilation products -+ -+ clean: -+ rm -f $(OBJ) $(DEP) -diff -crB openwsn/07-App/udplatency/udplatency.c ../../../sys/net/openwsn/07-App/udplatency/udplatency.c -*** openwsn/07-App/udplatency/udplatency.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/udplatency/udplatency.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,117 **** -! #include "openwsn.h" -! #include "udplatency.h" -! #include "openudp.h" -! #include "openqueue.h" -! #include "openserial.h" -! #include "packetfunctions.h" -! #include "opentimers.h" -! #include "openrandom.h" -! #include "opencoap.h" -! #include "scheduler.h" -! #include "IEEE802154E.h" -! #include "idmanager.h" -! #include "neighbors.h" -! -! //=========================== defines ========================================= -! -! /// inter-packet period (in mseconds) -! #define UDPLATENCYPERIOD 30000 -! -! //=========================== variables ======================================= -! -! typedef struct { -! opentimer_id_t timerId; -! } udplatency_vars_t; -! -! udplatency_vars_t udplatency_vars; -! -! //=========================== prototypes ====================================== -! -! void udplatency_timer(); -! -! //=========================== public ========================================== -! -! void udplatency_init() { -! //don't run on dagroot -! if (idmanager_getIsDAGroot()) return; -! -! udplatency_vars.timerId = opentimers_start(UDPLATENCYPERIOD, -! TIMER_PERIODIC,TIME_MS, -! udplatency_timer); -! } -! -! void udplatency_task(){ -! OpenQueueEntry_t* pkt; -! open_addr_t * p; -! open_addr_t q; -! -! //prepare packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_UDPLATENCY); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_UDPLATENCY,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return; -! } -! pkt->creator = COMPONENT_UDPLATENCY; -! pkt->owner = COMPONENT_UDPLATENCY; -! pkt->l4_protocol = IANA_UDP; -! pkt->l4_sourcePortORicmpv6Type = WKP_UDP_LATENCY; -! pkt->l4_destination_port = WKP_UDP_LATENCY; -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&pkt->l3_destinationAdd.addr_128b[0],&ipAddr_motedata,16); -! -! //the payload contains the 64bit address of the sender + the ASN -! packetfunctions_reserveHeaderSize(pkt,sizeof(asn_t)); -! asnWriteToPkt(pkt);//gets asn from mac layer. -! -! packetfunctions_reserveHeaderSize(pkt,8); -! p=idmanager_getMyID(ADDR_64B); -! pkt->payload[0]=p->addr_64b[0]; -! pkt->payload[1]=p->addr_64b[1]; -! pkt->payload[2]=p->addr_64b[2]; -! pkt->payload[3]=p->addr_64b[3]; -! pkt->payload[4]=p->addr_64b[4]; -! pkt->payload[5]=p->addr_64b[5]; -! pkt->payload[6]=p->addr_64b[6]; -! pkt->payload[7]=p->addr_64b[7]; -! -! neighbors_getPreferredParentEui64(&q); -! if (q.type==ADDR_64B){ -! packetfunctions_reserveHeaderSize(pkt,8); -! -! //copy my preferred parent so we can build the topology -! pkt->payload[0]=q.addr_64b[0]; -! pkt->payload[1]=q.addr_64b[1]; -! pkt->payload[2]=q.addr_64b[2]; -! pkt->payload[3]=q.addr_64b[3]; -! pkt->payload[4]=q.addr_64b[4]; -! pkt->payload[5]=q.addr_64b[5]; -! pkt->payload[6]=q.addr_64b[6]; -! pkt->payload[7]=q.addr_64b[7]; -! } -! //send packet -! if ((openudp_send(pkt))==E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! } -! -! void udplatency_timer() { -! scheduler_push_task(udplatency_task,TASKPRIO_COAP); -! } -! -! void udplatency_sendDone(OpenQueueEntry_t* msg, error_t error) { -! msg->owner = COMPONENT_UDPLATENCY; -! if (msg->creator!=COMPONENT_UDPLATENCY) { -! openserial_printError(COMPONENT_UDPLATENCY,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! openqueue_freePacketBuffer(msg); -! } -! -! void udplatency_receive(OpenQueueEntry_t* msg) { -! openqueue_freePacketBuffer(msg); -! } -! -! //=========================== private ========================================= -\ No newline at end of file ---- 1,143 ---- -! #include "openwsn.h" -! #include "udplatency.h" -! #include "openudp.h" -! #include "openqueue.h" -! #include "openserial.h" -! #include "packetfunctions.h" -! #include "opentimers.h" -! #include "openrandom.h" -! #include "opencoap.h" -! #include "scheduler.h" -! #include "IEEE802154E.h" -! #include "idmanager.h" -! #include "neighbors.h" -! -! #include "thread.h" -! -! //=========================== defines ========================================= -! -! //=========================== variables ======================================= -! -! typedef struct { -! opentimer_id_t timerId; -! } udplatency_vars_t; -! -! udplatency_vars_t udplatency_vars; -! uint16_t seqNum; -! -! //static char openwsn_udplatency_stack[KERNEL_CONF_STACKSIZE_MAIN]; -! -! //=========================== prototypes ====================================== -! -! void udplatency_timer(void); -! -! //=========================== public ========================================== -! -! void udplatency_init(void) { -! seqNum = 0; -! udplatency_vars.timerId = opentimers_start(UDPLATENCYPERIOD, -! TIMER_PERIODIC,TIME_MS, -! udplatency_timer); -! } -! -! void udplatency_task(void) { -! OpenQueueEntry_t* pkt; -! open_addr_t * p; -! open_addr_t q; -! -! // don't run if not synch -! if (ieee154e_isSynch() == FALSE) return; -! -! // don't run on dagroot -! if (idmanager_getIsDAGroot()) { -! opentimers_stop(udplatency_vars.timerId); -! return; -! } -! -! // prepare packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_UDPLATENCY); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_UDPLATENCY,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return; -! } -! pkt->creator = COMPONENT_UDPLATENCY; -! pkt->owner = COMPONENT_UDPLATENCY; -! pkt->l4_protocol = IANA_UDP; -! pkt->l4_sourcePortORicmpv6Type = WKP_UDP_LATENCY; -! pkt->l4_destination_port = WKP_UDP_LATENCY; -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&pkt->l3_destinationAdd.addr_128b[0],&ipAddr_motedata,16); -! -! // the payload contains the 64bit address of the sender + the ASN -! packetfunctions_reserveHeaderSize(pkt, sizeof(asn_t)); -! ieee154e_getAsn(pkt->payload);//gets asn from mac layer. -! -! packetfunctions_reserveHeaderSize(pkt,8); -! p=idmanager_getMyID(ADDR_64B); -! pkt->payload[0] = p->addr_64b[0]; -! pkt->payload[1] = p->addr_64b[1]; -! pkt->payload[2] = p->addr_64b[2]; -! pkt->payload[3] = p->addr_64b[3]; -! pkt->payload[4] = p->addr_64b[4]; -! pkt->payload[5] = p->addr_64b[5]; -! pkt->payload[6] = p->addr_64b[6]; -! pkt->payload[7] = p->addr_64b[7]; -! -! neighbors_getPreferredParentEui64(&q); -! if (q.type==ADDR_64B) { -! packetfunctions_reserveHeaderSize(pkt,8); -! -! // copy my preferred parent so we can build the topology -! pkt->payload[0] = q.addr_64b[0]; -! pkt->payload[1] = q.addr_64b[1]; -! pkt->payload[2] = q.addr_64b[2]; -! pkt->payload[3] = q.addr_64b[3]; -! pkt->payload[4] = q.addr_64b[4]; -! pkt->payload[5] = q.addr_64b[5]; -! pkt->payload[6] = q.addr_64b[6]; -! pkt->payload[7] = q.addr_64b[7]; -! } -! -! // insert Sequence Number -! packetfunctions_reserveHeaderSize(pkt,sizeof(seqNum)); -! pkt->payload[0] = (seqNum >> 8) & 0xff; -! pkt->payload[1] = seqNum & 0xff; -! -! // send packet -! if ((openudp_send(pkt)) == E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! -! // increment seqNum -! seqNum++; -! -! // close timer when test finish -! if (seqNum > NUMPKTTEST) { -! opentimers_stop(udplatency_vars.timerId); -! } -! } -! -! void udplatency_timer(void) { -! scheduler_push_task(udplatency_task,TASKPRIO_COAP); -! /*thread_create(openwsn_udplatency_stack, KERNEL_CONF_STACKSIZE_MAIN, -! PRIORITY_OPENWSN_UDPLATENCY, CREATE_STACKTEST, -! udplatency_task, "udplatency task");*/ -! } -! -! void udplatency_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! msg->owner = COMPONENT_UDPLATENCY; -! if (msg->creator!=COMPONENT_UDPLATENCY) { -! openserial_printError(COMPONENT_UDPLATENCY,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! openqueue_freePacketBuffer(msg); -! } -! -! void udplatency_receive(OpenQueueEntry_t* msg) { -! openqueue_freePacketBuffer(msg); -! } -! -! //=========================== private ========================================= -diff -crB openwsn/07-App/udplatency/udplatency.h ../../../sys/net/openwsn/07-App/udplatency/udplatency.h -*** openwsn/07-App/udplatency/udplatency.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/udplatency/udplatency.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,31 **** -! #ifndef __UDPLATENCY_H -! #define __UDPLATENCY_H -! -! /** -! \addtogroup App -! -! \addtogroup udpLatency -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void udplatency_init(); -! void udplatency_trigger(); -! void udplatency_sendDone(OpenQueueEntry_t* msg, error_t error); -! void udplatency_receive(OpenQueueEntry_t* msg); -! bool udplatency_debugPrint(); -! void udplatency_task(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,35 ---- -! #ifndef __UDPLATENCY_H -! #define __UDPLATENCY_H -! -! /** -! \addtogroup AppUdp -! \{ -! \addtogroup UdpLatency -! \{ -! */ -! -! //=========================== define ========================================== -! -! /// inter-packet period (in mseconds) -! #define UDPLATENCYPERIOD 3000 -! #define NUMPKTTEST 300 -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void udplatency_init(void); -! void udplatency_trigger(void); -! void udplatency_sendDone(OpenQueueEntry_t* msg, owerror_t error); -! void udplatency_receive(OpenQueueEntry_t* msg); -! bool udplatency_debugPrint(void); -! void udplatency_task(void); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/07-App/udpprint/Makefile ../../../sys/net/openwsn/07-App/udpprint/Makefile -*** openwsn/07-App/udpprint/Makefile Wed Jan 15 13:55:34 2014 ---- ../../../sys/net/openwsn/07-App/udpprint/Makefile Wed Jan 15 13:48:27 2014 -*************** -*** 0 **** ---- 1,32 ---- -+ SUBSUBMOD:=$(shell basename $(CURDIR)).a -+ #BINDIR = $(RIOTBASE)/bin/ -+ SRC = $(wildcard *.c) -+ OBJ = $(SRC:%.c=$(BINDIR)%.o) -+ DEP = $(SRC:%.c=$(BINDIR)%.d) -+ -+ INCLUDES += -I$(RIOTBASE) -I$(RIOTBASE)/sys/include -I$(RIOTBASE)/core/include -I$(RIOTBASE)/drivers/include -I$(RIOTBASE)/drivers/cc110x_ng/include -I$(RIOTBASE)/cpu/arm_common/include -I$(RIOTBASE)/sys/net/include/ -+ INCLUDES += -I$(CURDIR)/02a-MAClow -+ INCLUDES += -I$(CURDIR)/02b-MAChigh -+ INCLUDES += -I$(CURDIR)/03a-IPHC -+ INCLUDES += -I$(CURDIR)/03b-IPv6 -+ INCLUDES += -I$(CURDIR)/04-TRAN -+ INCLUDES += -I$(CURDIR)/cross-layers -+ -+ .PHONY: $(BINDIR)$(SUBSUBMOD) -+ -+ $(BINDIR)$(SUBSUBMOD): $(OBJ) -+ $(AD)$(AR) rcs $(BINDIR)$(MODULE) $(OBJ) -+ -+ # pull in dependency info for *existing* .o files -+ -include $(OBJ:.o=.d) -+ -+ # compile and generate dependency info -+ $(BINDIR)%.o: %.c -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d -+ @printf "$(BINDIR)" | cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d -+ -+ # remove compilation products -+ -+ clean: -+ rm -f $(OBJ) $(DEP) -diff -crB openwsn/07-App/udpprint/udpprint.c ../../../sys/net/openwsn/07-App/udpprint/udpprint.c -*** openwsn/07-App/udpprint/udpprint.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/udpprint/udpprint.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,31 **** -! #include "openwsn.h" -! #include "udpprint.h" -! #include "openqueue.h" -! #include "openserial.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void udpprint_init() { -! } -! -! void udpprint_sendDone(OpenQueueEntry_t* msg, error_t error) { -! openserial_printError(COMPONENT_UDPPRINT,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! } -! -! void udpprint_receive(OpenQueueEntry_t* msg) { -! openserial_printData((uint8_t*)(msg->payload),msg->length); -! openqueue_freePacketBuffer(msg); -! } -! -! bool udpprint_debugPrint() { -! return FALSE; -! } -! - //=========================== private ========================================= -\ No newline at end of file ---- 1,31 ---- -! #include "openwsn.h" -! #include "udpprint.h" -! #include "openqueue.h" -! #include "openserial.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void udpprint_init(void) { -! } -! -! void udpprint_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! openserial_printError(COMPONENT_UDPPRINT,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(msg); -! } -! -! void udpprint_receive(OpenQueueEntry_t* msg) { -! openserial_printData((uint8_t*)(msg->payload),msg->length); -! openqueue_freePacketBuffer(msg); -! } -! -! bool udpprint_debugPrint(void) { -! return FALSE; -! } -! - //=========================== private ========================================= -\ No newline at end of file -diff -crB openwsn/07-App/udpprint/udpprint.h ../../../sys/net/openwsn/07-App/udpprint/udpprint.h -*** openwsn/07-App/udpprint/udpprint.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/udpprint/udpprint.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,29 **** -! #ifndef __UDPPRINT_H -! #define __UDPPRINT_H -! -! /** -! \addtogroup App -! \{ -! \addtogroup udpPrint -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void udpprint_init(); -! void udpprint_sendDone(OpenQueueEntry_t* msg, error_t error); -! void udpprint_receive(OpenQueueEntry_t* msg); -! bool udpprint_debugPrint(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,29 ---- -! #ifndef __UDPPRINT_H -! #define __UDPPRINT_H -! -! /** -! \addtogroup AppUdp -! \{ -! \addtogroup udpPrint -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void udpprint_init(void); -! void udpprint_sendDone(OpenQueueEntry_t* msg, owerror_t error); -! void udpprint_receive(OpenQueueEntry_t* msg); -! bool udpprint_debugPrint(void); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/07-App/udprand/Makefile ../../../sys/net/openwsn/07-App/udprand/Makefile -*** openwsn/07-App/udprand/Makefile Wed Jan 15 13:55:34 2014 ---- ../../../sys/net/openwsn/07-App/udprand/Makefile Wed Jan 15 13:48:27 2014 -*************** -*** 0 **** ---- 1,32 ---- -+ SUBSUBMOD:=$(shell basename $(CURDIR)).a -+ #BINDIR = $(RIOTBASE)/bin/ -+ SRC = $(wildcard *.c) -+ OBJ = $(SRC:%.c=$(BINDIR)%.o) -+ DEP = $(SRC:%.c=$(BINDIR)%.d) -+ -+ INCLUDES += -I$(RIOTBASE) -I$(RIOTBASE)/sys/include -I$(RIOTBASE)/core/include -I$(RIOTBASE)/drivers/include -I$(RIOTBASE)/drivers/cc110x_ng/include -I$(RIOTBASE)/cpu/arm_common/include -I$(RIOTBASE)/sys/net/include/ -+ INCLUDES += -I$(CURDIR)/02a-MAClow -+ INCLUDES += -I$(CURDIR)/02b-MAChigh -+ INCLUDES += -I$(CURDIR)/03a-IPHC -+ INCLUDES += -I$(CURDIR)/03b-IPv6 -+ INCLUDES += -I$(CURDIR)/04-TRAN -+ INCLUDES += -I$(CURDIR)/cross-layers -+ -+ .PHONY: $(BINDIR)$(SUBSUBMOD) -+ -+ $(BINDIR)$(SUBSUBMOD): $(OBJ) -+ $(AD)$(AR) rcs $(BINDIR)$(MODULE) $(OBJ) -+ -+ # pull in dependency info for *existing* .o files -+ -include $(OBJ:.o=.d) -+ -+ # compile and generate dependency info -+ $(BINDIR)%.o: %.c -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d -+ @printf "$(BINDIR)" | cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d -+ -+ # remove compilation products -+ -+ clean: -+ rm -f $(OBJ) $(DEP) -diff -crB openwsn/07-App/udprand/udprand.c ../../../sys/net/openwsn/07-App/udprand/udprand.c -*** openwsn/07-App/udprand/udprand.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/udprand/udprand.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,81 **** -! #include "openwsn.h" -! #include "udprand.h" -! #include "openudp.h" -! #include "openqueue.h" -! #include "openserial.h" -! #include "packetfunctions.h" -! #include "opentimers.h" -! #include "openrandom.h" -! #include "opencoap.h" -! #include "scheduler.h" -! -! //=========================== defines ========================================= -! -! /// inter-packet period (in mseconds) -! #define UDPRANDPERIOD 30000 -! -! //=========================== variables ======================================= -! -! typedef struct { -! opentimer_id_t timerId; -! } udprand_vars_t; -! -! udprand_vars_t udprand_vars; -! -! //=========================== prototypes ====================================== -! -! void udprand_timer(); -! -! //=========================== public ========================================== -! -! void udprand_init() { -! udprand_vars.timerId = opentimers_start(openrandom_get16b()%UDPRANDPERIOD, -! TIMER_PERIODIC,TIME_MS, -! udprand_timer); -! } -! -! void udprand_task(){ -! OpenQueueEntry_t* pkt; -! //prepare packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_UDPRAND); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_UDPRAND,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return; -! } -! pkt->creator = COMPONENT_UDPRAND; -! pkt->owner = COMPONENT_UDPRAND; -! pkt->l4_protocol = IANA_UDP; -! pkt->l4_sourcePortORicmpv6Type = WKP_UDP_RAND; -! pkt->l4_destination_port = WKP_UDP_RAND; -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&pkt->l3_destinationAdd.addr_128b[0],&ipAddr_motedata,16); -! packetfunctions_reserveHeaderSize(pkt,2); -! ((uint8_t*)pkt->payload)[0] = openrandom_get16b()%0xff; -! ((uint8_t*)pkt->payload)[1] = openrandom_get16b()%0xff; -! //send packet -! if ((openudp_send(pkt))==E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! } -! -! void udprand_timer() { -! scheduler_push_task(udprand_task,TASKPRIO_COAP); -! } -! -! void udprand_sendDone(OpenQueueEntry_t* msg, error_t error) { -! msg->owner = COMPONENT_UDPRAND; -! if (msg->creator!=COMPONENT_UDPRAND) { -! openserial_printError(COMPONENT_UDPRAND,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! openqueue_freePacketBuffer(msg); -! } -! -! void udprand_receive(OpenQueueEntry_t* msg) { -! openqueue_freePacketBuffer(msg); -! } -! - //=========================== private ========================================= -\ No newline at end of file ---- 1,98 ---- -! #include "openwsn.h" -! #include "udprand.h" -! #include "openudp.h" -! #include "openqueue.h" -! #include "openserial.h" -! #include "packetfunctions.h" -! #include "opentimers.h" -! #include "openrandom.h" -! #include "opencoap.h" -! #include "scheduler.h" -! #include "idmanager.h" -! #include "IEEE802154E.h" -! -! #include "thread.h" -! -! //=========================== defines ========================================= -! -! /// inter-packet period (in mseconds) -! #define UDPRANDPERIOD 30000 -! -! //=========================== variables ======================================= -! -! typedef struct { -! opentimer_id_t timerId; -! } udprand_vars_t; -! -! udprand_vars_t udprand_vars; -! //static char openwsn_udprand_stack[KERNEL_CONF_STACKSIZE_MAIN]; -! //=========================== prototypes ====================================== -! -! void udprand_timer(void); -! -! //=========================== public ========================================== -! -! void udprand_init(void) { -! udprand_vars.timerId = opentimers_start(openrandom_get16b()%UDPRANDPERIOD, -! TIMER_PERIODIC,TIME_MS, -! udprand_timer); -! } -! -! void udprand_task(void){ -! OpenQueueEntry_t* pkt; -! -! // don't run if not synch -! if (ieee154e_isSynch() == FALSE) return; -! -! // don't run on dagroot -! if (idmanager_getIsDAGroot()) { -! opentimers_stop(udprand_vars.timerId); -! return; -! } -! -! //prepare packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_UDPRAND); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_UDPRAND,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! return; -! } -! pkt->creator = COMPONENT_UDPRAND; -! pkt->owner = COMPONENT_UDPRAND; -! pkt->l4_protocol = IANA_UDP; -! pkt->l4_sourcePortORicmpv6Type = WKP_UDP_RAND; -! pkt->l4_destination_port = WKP_UDP_RAND; -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&pkt->l3_destinationAdd.addr_128b[0],&ipAddr_motedata,16); -! packetfunctions_reserveHeaderSize(pkt,2); -! ((uint8_t*)pkt->payload)[0] = openrandom_get16b()%0xff; -! ((uint8_t*)pkt->payload)[1] = openrandom_get16b()%0xff; -! //send packet -! if ((openudp_send(pkt))==E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! } -! -! void udprand_timer(void) { -! scheduler_push_task(udprand_task,TASKPRIO_COAP); -! /*thread_create(openwsn_udprand_stack, KERNEL_CONF_STACKSIZE_MAIN, -! PRIORITY_OPENWSN_UDPRAND, CREATE_STACKTEST, -! udprand_task, "udprand task");*/ -! } -! -! void udprand_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! msg->owner = COMPONENT_UDPRAND; -! if (msg->creator!=COMPONENT_UDPRAND) { -! openserial_printError(COMPONENT_UDPRAND,ERR_UNEXPECTED_SENDDONE, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! openqueue_freePacketBuffer(msg); -! } -! -! void udprand_receive(OpenQueueEntry_t* msg) { -! openqueue_freePacketBuffer(msg); -! } -! - //=========================== private ========================================= -\ No newline at end of file -diff -crB openwsn/07-App/udprand/udprand.h ../../../sys/net/openwsn/07-App/udprand/udprand.h -*** openwsn/07-App/udprand/udprand.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/udprand/udprand.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,31 **** -! #ifndef __UDPRAND_H -! #define __UDPRAND_H -! -! /** -! \addtogroup App -! -! \addtogroup udpRand -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void udprand_init(); -! void udprand_trigger(); -! void udprand_sendDone(OpenQueueEntry_t* msg, error_t error); -! void udprand_receive(OpenQueueEntry_t* msg); -! bool udprand_debugPrint(); -! void udprand_task(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,31 ---- -! #ifndef __UDPRAND_H -! #define __UDPRAND_H -! -! /** -! \addtogroup AppUdp -! \{ -! \addtogroup UdpRand -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void udprand_init(void); -! void udprand_trigger(void); -! void udprand_sendDone(OpenQueueEntry_t* msg, owerror_t error); -! void udprand_receive(OpenQueueEntry_t* msg); -! bool udprand_debugPrint(void); -! void udprand_task(void); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/07-App/udpstorm/Makefile ../../../sys/net/openwsn/07-App/udpstorm/Makefile -*** openwsn/07-App/udpstorm/Makefile Wed Jan 15 13:55:34 2014 ---- ../../../sys/net/openwsn/07-App/udpstorm/Makefile Wed Jan 15 13:48:27 2014 -*************** -*** 0 **** ---- 1,32 ---- -+ SUBSUBMOD:=$(shell basename $(CURDIR)).a -+ #BINDIR = $(RIOTBASE)/bin/ -+ SRC = $(wildcard *.c) -+ OBJ = $(SRC:%.c=$(BINDIR)%.o) -+ DEP = $(SRC:%.c=$(BINDIR)%.d) -+ -+ INCLUDES += -I$(RIOTBASE) -I$(RIOTBASE)/sys/include -I$(RIOTBASE)/core/include -I$(RIOTBASE)/drivers/include -I$(RIOTBASE)/drivers/cc110x_ng/include -I$(RIOTBASE)/cpu/arm_common/include -I$(RIOTBASE)/sys/net/include/ -+ INCLUDES += -I$(CURDIR)/02a-MAClow -+ INCLUDES += -I$(CURDIR)/02b-MAChigh -+ INCLUDES += -I$(CURDIR)/03a-IPHC -+ INCLUDES += -I$(CURDIR)/03b-IPv6 -+ INCLUDES += -I$(CURDIR)/04-TRAN -+ INCLUDES += -I$(CURDIR)/cross-layers -+ -+ .PHONY: $(BINDIR)$(SUBSUBMOD) -+ -+ $(BINDIR)$(SUBSUBMOD): $(OBJ) -+ $(AD)$(AR) rcs $(BINDIR)$(MODULE) $(OBJ) -+ -+ # pull in dependency info for *existing* .o files -+ -include $(OBJ:.o=.d) -+ -+ # compile and generate dependency info -+ $(BINDIR)%.o: %.c -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d -+ @printf "$(BINDIR)" | cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d -+ -+ # remove compilation products -+ -+ clean: -+ rm -f $(OBJ) $(DEP) -diff -crB openwsn/07-App/udpstorm/udpstorm.c ../../../sys/net/openwsn/07-App/udpstorm/udpstorm.c -*** openwsn/07-App/udpstorm/udpstorm.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/udpstorm/udpstorm.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,152 **** -! #include "openwsn.h" -! #include "udpstorm.h" -! #include "opencoap.h" -! #include "opentimers.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! #include "openserial.h" -! #include "openrandom.h" -! #include "scheduler.h" -! //#include "ADC_Channel.h" -! #include "IEEE802154E.h" -! -! //=========================== defines ========================================= -! -! /// inter-packet period (in ms) -! #define UDPSTORMPERIOD 1000 -! #define NUMPACKETS 300 -! -! const uint8_t udpstorm_path0[] = "strm"; -! -! PRAGMA(pack(1)); -! typedef struct { -! uint16_t seqNum; -! } udpstorm_payload_t; -! PRAGMA(pack()); -! -! //=========================== variables ======================================= -! -! typedef struct { -! coap_resource_desc_t desc; -! opentimer_id_t timerId; -! uint16_t seqNum; -! } udpstorm_vars_t; -! -! udpstorm_vars_t udpstorm_vars; -! -! //=========================== prototypes ====================================== -! -! error_t udpstorm_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! void udpstorm_timer_cb(); -! void udpstorm_task_cb(); -! void udpstorm_sendDone(OpenQueueEntry_t* msg, -! error_t error); -! -! //=========================== public ========================================== -! -! void udpstorm_init() { -! // prepare the resource descriptor for the path -! udpstorm_vars.desc.path0len = sizeof(udpstorm_path0)-1; -! udpstorm_vars.desc.path0val = (uint8_t*)(&udpstorm_path0); -! udpstorm_vars.desc.path1len = 0; -! udpstorm_vars.desc.path1val = NULL; -! udpstorm_vars.desc.componentID = COMPONENT_UDPSTORM; -! udpstorm_vars.desc.callbackRx = &udpstorm_receive; -! udpstorm_vars.desc.callbackSendDone = &udpstorm_sendDone; -! -! opencoap_register(&udpstorm_vars.desc); -! udpstorm_vars.timerId = opentimers_start(UDPSTORMPERIOD, -! TIMER_PERIODIC,TIME_MS, -! udpstorm_timer_cb); -! udpstorm_vars.seqNum = 0; -! } -! -! //=========================== private ========================================= -! -! error_t udpstorm_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! return E_FAIL; -! } -! -! //timer fired, but we don't want to execute task in ISR mode -! //instead, push task to scheduler with CoAP priority, and let scheduler take care of it -! void udpstorm_timer_cb(){ -! scheduler_push_task(udpstorm_task_cb,TASKPRIO_COAP); -! } -! -! void udpstorm_task_cb() { -! OpenQueueEntry_t* pkt; -! error_t outcome; -! uint8_t numOptions; -! -! if(udpstorm_vars.seqNum>=NUMPACKETS) { -! // we've sent enough packets -! -! // stop the periodic timer -! opentimers_stop(udpstorm_vars.timerId); -! -! // reset the sequence number -! udpstorm_vars.seqNum = 0; -! } -! -! // if you get here, send a packet -! -! // get a packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_UDPSTORM); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_UDPSTORM,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(pkt); -! return; -! } -! // take ownership over that packet -! pkt->creator = COMPONENT_UDPSTORM; -! pkt->owner = COMPONENT_UDPSTORM; -! -! // add payload -! packetfunctions_reserveHeaderSize(pkt,sizeof(udpstorm_payload_t)); -! ((udpstorm_payload_t*)(pkt->payload))->seqNum = udpstorm_vars.seqNum; -! -! numOptions = 0; -! // location-path option -! packetfunctions_reserveHeaderSize(pkt,sizeof(udpstorm_path0)-1); -! memcpy(&pkt->payload[0],&udpstorm_path0,sizeof(udpstorm_path0)-1); -! packetfunctions_reserveHeaderSize(pkt,1); -! pkt->payload[0] = (COAP_OPTION_LOCATIONPATH-COAP_OPTION_CONTENTTYPE) << 4 | -! sizeof(udpstorm_path0)-1; -! numOptions++; -! // content-type option -! packetfunctions_reserveHeaderSize(pkt,2); -! pkt->payload[0] = COAP_OPTION_CONTENTTYPE << 4 | -! 1; -! pkt->payload[1] = COAP_MEDTYPE_APPOCTETSTREAM; -! numOptions++; -! -! // metadata -! pkt->l4_destination_port = WKP_UDP_COAP; -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&pkt->l3_destinationAdd.addr_128b[0],&ipAddr_local,16); -! -! // send -! outcome = opencoap_send(pkt, -! COAP_TYPE_NON, -! COAP_CODE_REQ_PUT, -! numOptions, -! &udpstorm_vars.desc); -! -! // avoid overflowing the queue if fails -! if (outcome==E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! -! // increment counter -! udpstorm_vars.seqNum++; -! } -! -! void udpstorm_sendDone(OpenQueueEntry_t* msg, error_t error) { -! openqueue_freePacketBuffer(msg); - } -\ No newline at end of file ---- 1,168 ---- -! #include "openwsn.h" -! #include "udpstorm.h" -! #include "opencoap.h" -! #include "opentimers.h" -! #include "openqueue.h" -! #include "packetfunctions.h" -! #include "openserial.h" -! #include "openrandom.h" -! #include "scheduler.h" -! //#include "ADC_Channel.h" -! #include "IEEE802154E.h" -! #include "idmanager.h" -! -! #include "thread.h" -! -! //=========================== defines ========================================= -! -! /// inter-packet period (in ms) -! #define UDPSTORMPERIOD 1000 -! #define NUMPACKETS 300 -! -! const uint8_t udpstorm_path0[] = "strm"; -! -! //PRAGMA(pack(1)); -! typedef struct { -! uint16_t seqNum; -! } udpstorm_payload_t; -! //PRAGMA(pack()); -! -! //=========================== variables ======================================= -! -! typedef struct { -! coap_resource_desc_t desc; -! opentimer_id_t timerId; -! uint16_t seqNum; -! } udpstorm_vars_t; -! -! udpstorm_vars_t udpstorm_vars; -! //static char openwsn_udpstorm_stack[KERNEL_CONF_STACKSIZE_MAIN]; -! //=========================== prototypes ====================================== -! -! owerror_t udpstorm_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options); -! void udpstorm_timer_cb(void); -! void udpstorm_task_cb(void); -! void udpstorm_sendDone(OpenQueueEntry_t* msg, -! owerror_t error); -! -! //=========================== public ========================================== -! -! void udpstorm_init(void) { -! // prepare the resource descriptor for the path -! udpstorm_vars.desc.path0len = sizeof(udpstorm_path0)-1; -! udpstorm_vars.desc.path0val = (uint8_t*)(&udpstorm_path0); -! udpstorm_vars.desc.path1len = 0; -! udpstorm_vars.desc.path1val = NULL; -! udpstorm_vars.desc.componentID = COMPONENT_UDPSTORM; -! udpstorm_vars.desc.callbackRx = &udpstorm_receive; -! udpstorm_vars.desc.callbackSendDone = &udpstorm_sendDone; -! -! opencoap_register(&udpstorm_vars.desc); -! udpstorm_vars.timerId = opentimers_start(UDPSTORMPERIOD, -! TIMER_PERIODIC,TIME_MS, -! udpstorm_timer_cb); -! udpstorm_vars.seqNum = 0; -! } -! -! //=========================== private ========================================= -! -! owerror_t udpstorm_receive(OpenQueueEntry_t* msg, -! coap_header_iht* coap_header, -! coap_option_iht* coap_options) { -! return E_FAIL; -! } -! -! //timer fired, but we don't want to execute task in ISR mode -! //instead, push task to scheduler with CoAP priority, and let scheduler take care of it -! void udpstorm_timer_cb(void){ -! scheduler_push_task(udpstorm_task_cb,TASKPRIO_COAP); -! /*thread_create(openwsn_udpstorm_stack, KERNEL_CONF_STACKSIZE_MAIN, -! PRIORITY_OPENWSN_UDPSTORM, CREATE_STACKTEST, -! udpstorm_task_cb, "udpstorm task cb");*/ -! } -! -! void udpstorm_task_cb(void) { -! OpenQueueEntry_t* pkt; -! owerror_t outcome; -! uint8_t numOptions; -! -! // don't run if not synch -! if (ieee154e_isSynch() == FALSE) return; -! -! // don't run on dagroot -! if (idmanager_getIsDAGroot()) { -! opentimers_stop(udpstorm_vars.timerId); -! return; -! } -! -! -! if(udpstorm_vars.seqNum>=NUMPACKETS) { -! // we've sent enough packets -! -! // stop the periodic timer -! opentimers_stop(udpstorm_vars.timerId); -! -! // reset the sequence number -! udpstorm_vars.seqNum = 0; -! } -! -! // if you get here, send a packet -! -! // get a packet -! pkt = openqueue_getFreePacketBuffer(COMPONENT_UDPSTORM); -! if (pkt==NULL) { -! openserial_printError(COMPONENT_UDPSTORM,ERR_NO_FREE_PACKET_BUFFER, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openqueue_freePacketBuffer(pkt); -! return; -! } -! // take ownership over that packet -! pkt->creator = COMPONENT_UDPSTORM; -! pkt->owner = COMPONENT_UDPSTORM; -! -! // add payload -! packetfunctions_reserveHeaderSize(pkt,sizeof(udpstorm_payload_t)); -! ((udpstorm_payload_t*)(pkt->payload))->seqNum = udpstorm_vars.seqNum; -! -! numOptions = 0; -! // location-path option -! packetfunctions_reserveHeaderSize(pkt,sizeof(udpstorm_path0)-1); -! memcpy(&pkt->payload[0],&udpstorm_path0,sizeof(udpstorm_path0)-1); -! packetfunctions_reserveHeaderSize(pkt,1); -! pkt->payload[0] = ((COAP_OPTION_NUM_URIPATH) << 4) | -! (sizeof(udpstorm_path0)-1); -! numOptions++; -! // content-type option -! packetfunctions_reserveHeaderSize(pkt,2); -! pkt->payload[0] = COAP_OPTION_NUM_CONTENTFORMAT << 4 | -! 1; -! pkt->payload[1] = COAP_MEDTYPE_APPOCTETSTREAM; -! numOptions++; -! -! // metadata -! pkt->l4_destination_port = WKP_UDP_COAP; -! pkt->l3_destinationAdd.type = ADDR_128B; -! memcpy(&pkt->l3_destinationAdd.addr_128b[0],&ipAddr_local,16); -! -! // send -! outcome = opencoap_send(pkt, -! COAP_TYPE_NON, -! COAP_CODE_REQ_PUT, -! numOptions, -! &udpstorm_vars.desc); -! -! // avoid overflowing the queue if fails -! if (outcome==E_FAIL) { -! openqueue_freePacketBuffer(pkt); -! } -! -! // increment counter -! udpstorm_vars.seqNum++; -! } -! -! void udpstorm_sendDone(OpenQueueEntry_t* msg, owerror_t error) { -! openqueue_freePacketBuffer(msg); - } -\ No newline at end of file -diff -crB openwsn/07-App/udpstorm/udpstorm.h ../../../sys/net/openwsn/07-App/udpstorm/udpstorm.h -*** openwsn/07-App/udpstorm/udpstorm.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/07-App/udpstorm/udpstorm.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,26 **** -! #ifndef __UDPSTORM_H -! #define __UDPSTORM_H -! -! /** -! \addtogroup App -! \{ -! \addtogroup udpStorm -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void udpstorm_init(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,26 ---- -! #ifndef __UDPSTORM_H -! #define __UDPSTORM_H -! -! /** -! \addtogroup AppUdp -! \{ -! \addtogroup udpStorm -! \{ -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void udpstorm_init(void); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/Makefile ../../../sys/net/openwsn/Makefile -*** openwsn/Makefile Wed Jan 15 13:55:34 2014 ---- ../../../sys/net/openwsn/Makefile Wed Jan 15 13:48:27 2014 -*************** -*** 0 **** ---- 1,57 ---- -+ export MODULE:=$(shell basename $(CURDIR)).a -+ #BINDIR = $(RIOTBASE)/bin/ -+ SRC = $(wildcard *.c) -+ OBJ = $(SRC:%.c=$(BINDIR)%.o) -+ DEP = $(SRC:%.c=$(BINDIR)%.d) -+ -+ INCLUDES += -I$(RIOTBASE) -I$(RIOTBASE)/sys/include -I$(RIOTBASE)/core/include -I$(RIOTBASE)/drivers/include -I$(RIOTBASE)/drivers/cc110x_ng/include -I$(RIOTBASE)/cpu/arm_common/include -I$(RIOTBASE)/cpu/msp430-common/include -I$(RIOTBASE)/sys/net/include/ -+ -+ INCLUDES += -I$(CURDIR) -+ INCLUDES += -I$(CURDIR)/02a-MAClow -+ INCLUDES += -I$(CURDIR)/02b-MAChigh -+ INCLUDES += -I$(CURDIR)/03a-IPHC -+ INCLUDES += -I$(CURDIR)/03b-IPv6 -+ INCLUDES += -I$(CURDIR)/04-TRAN -+ INCLUDES += -I$(CURDIR)/cross-layers -+ INCLUDES += -I$(CURDIR)/07-App/rinfo -+ INCLUDES += -I$(CURDIR)/07-App/rwellknown -+ INCLUDES += -I$(CURDIR)/07-App/ohlone -+ INCLUDES += -I$(CURDIR)/07-App/tcpecho -+ INCLUDES += -I$(CURDIR)/07-App/tcpinject -+ INCLUDES += -I$(CURDIR)/07-App/tcpprint -+ INCLUDES += -I$(CURDIR)/07-App/udpecho -+ INCLUDES += -I$(CURDIR)/07-App/udpinject -+ INCLUDES += -I$(CURDIR)/07-App/udplatency -+ INCLUDES += -I$(CURDIR)/07-App/udpprint -+ INCLUDES += -I$(CURDIR)/07-App/udprand -+ INCLUDES += -I$(CURDIR)/07-App/udpstorm -+ -+ -+ DIRS = -+ DIRS += cross-layers -+ DIRS += 02a-MAClow -+ DIRS += 02b-MAChigh -+ DIRS += 03a-IPHC -+ DIRS += 03b-IPv6 -+ DIRS += 04-TRAN -+ DIRS += 07-App -+ -+ all: $(BINDIR)$(MODULE) -+ @for i in $(DIRS) ; do "$(MAKE)" -C $$i || exit 1; done ; -+ -+ $(BINDIR)$(MODULE): $(OBJ) -+ $(AD)$(AR) rcs $(BINDIR)$(MODULE) $(OBJ) -+ -+ # pull in dependency info for *existing* .o files -+ -include $(OBJ:.o=.d) -+ -+ # compile and generate dependency info -+ $(BINDIR)%.o: %.c -+ mkdir -p $(BINDIR) -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d -+ @printf "$(BINDIR)"|cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d -+ -+ -+ # remove compilation products -+ clean:: -+ @for i in $(DIRS) ; do "$(MAKE)" -C $$i clean || exit 1; done ; -diff -crB openwsn/board_info.h ../../../sys/net/openwsn/board_info.h -*** openwsn/board_info.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/board_info.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,80 **** -! /** -! \brief TelosB-specific board information bsp module. -! -! This module file defines board-related element, but which are applicable only -! to this board. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #ifndef __BOARD_INFO_H -! #define __BOARD_INFO_H -! -! #include "stdint.h" -! #include "msp430f1611.h" -! #include "string.h" -! -! //=========================== define ========================================== -! -! // (pre-)processor scpecific commands -! -! #define port_INLINE inline -! -! #define PRAGMA(x) _Pragma(#x) -! #define PACK(x) pack(x) -! -! #define INTERRUPT_DECLARATION() __istate_t s; -! #define DISABLE_INTERRUPTS() s = __get_interrupt_state(); \ -! __disable_interrupt(); -! #define ENABLE_INTERRUPTS() __set_interrupt_state(s); -! -! //===== timer -! -! #define PORT_TIMER_WIDTH uint16_t -! #define PORT_SIGNED_INT_WIDTH int16_t -! #define PORT_TICS_PER_MS 33 -! -! // on TelosB, we use the comparatorA interrupt for the OS -! #define SCHEDULER_WAKEUP() CACTL1 |= CAIFG -! #define SCHEDULER_ENABLE_INTERRUPT() CACTL1 = CAIE -! -! //===== pins -! -! // [P4.5] radio VREG -! #define PORT_PIN_RADIO_VREG_HIGH() P4OUT |= 0x20; -! #define PORT_PIN_RADIO_VREG_LOW() P4OUT &= ~0x20; -! // [P4.6] radio RESET -! #define PORT_PIN_RADIO_RESET_HIGH() P4OUT |= 0x40; -! #define PORT_PIN_RADIO_RESET_LOW() P4OUT &= ~0x40; -! -! //===== IEEE802154E timing -! -! // time-slot related -! #define PORT_TsSlotDuration 491 // counter counts one extra count, see datasheet -! -! // execution speed related -! #define PORT_maxTxDataPrepare 100 // 2899us (measured 2420us) -! #define PORT_maxRxAckPrepare 20 // 610us (measured 474us) -! #define PORT_maxRxDataPrepare 33 // 1000us (measured 477us) -! #define PORT_maxTxAckPrepare 40 // 792us (measured 746us)- cannot be bigger than 28.. is the limit for telosb as actvitiy_rt5 is executed almost there. -! -! // radio speed related -! #define PORT_delayTx 12 // 366us (measured 352us) -! #define PORT_delayRx 0 // 0us (can not measure) -! -! //=========================== variables ======================================= -! -! // The variables below are used by CoAP's registration engine. -! -! static const uint8_t rreg_uriquery[] = "h=ucb"; -! static const uint8_t infoBoardname[] = "TelosB"; -! static const uint8_t infouCName[] = "MSP430f1611"; -! static const uint8_t infoRadioName[] = "CC2420"; -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! //=========================== private ========================================= -! -! #endif ---- 1,93 ---- -! /** -! \brief TelosB-specific board information bsp module. -! -! This module file defines board-related element, but which are applicable only -! to this board. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #ifndef __BOARD_INFO_H -! #define __BOARD_INFO_H -! -! #include "stdint.h" -! #include "msp430f1611.h" -! #include "string.h" -! -! //=========================== define ========================================== -! -! // (pre-)processor scpecific commands -! -! #define port_INLINE inline -! -! #define PRAGMA(x) _Pragma(#x) -! #define PACK(x) pack(x) -! -! //===== interrupt state -! -! #if defined(__GNUC__) && (__GNUC__==4) && (__GNUC_MINOR__<=5) && defined(__MSP430__) -! // mspgcc <4.5.x -! #define INTERRUPT_DECLARATION() unsigned short s; -! #define DISABLE_INTERRUPTS() s = READ_SR&0x0008; \ -! __disable_interrupt(); -! #define ENABLE_INTERRUPTS() __asm__("bis %0,r2" : : "ir" ((uint16_t) s)); -! #else -! // other -! #define INTERRUPT_DECLARATION() __istate_t s; -! #define DISABLE_INTERRUPTS() s = __get_interrupt_state(); \ -! __disable_interrupt(); -! #define ENABLE_INTERRUPTS() __set_interrupt_state(s); -! #endif -! -! //===== timer -! -! #define PORT_TIMER_WIDTH uint16_t -! #define PORT_RADIOTIMER_WIDTH uint16_t -! -! #define PORT_SIGNED_INT_WIDTH int16_t -! #define PORT_TICS_PER_MS 33 -! -! // on TelosB, we use the comparatorA interrupt for the OS -! #define SCHEDULER_WAKEUP() CACTL1 |= CAIFG -! #define SCHEDULER_ENABLE_INTERRUPT() CACTL1 = CAIE -! -! //===== pins -! -! // [P4.5] radio VREG -! #define PORT_PIN_RADIO_VREG_HIGH() P4OUT |= 0x20; -! #define PORT_PIN_RADIO_VREG_LOW() P4OUT &= ~0x20; -! // [P4.6] radio RESET -! #define PORT_PIN_RADIO_RESET_HIGH() P4OUT |= 0x40; -! #define PORT_PIN_RADIO_RESET_LOW() P4OUT &= ~0x40; -! -! //===== IEEE802154E timing -! -! // time-slot related -! #define PORT_TsSlotDuration 491 // counter counts one extra count, see datasheet -! -! // execution speed related -! #define PORT_maxTxDataPrepare 100 // 2899us (measured 2420us) -! #define PORT_maxRxAckPrepare 20 // 610us (measured 474us) -! #define PORT_maxRxDataPrepare 33 // 1000us (measured 477us) -! #define PORT_maxTxAckPrepare 40 // 792us (measured 746us)- cannot be bigger than 28.. is the limit for telosb as actvitiy_rt5 is executed almost there. -! -! // radio speed related -! #define PORT_delayTx 12 // 366us (measured 352us) -! #define PORT_delayRx 0 // 0us (can not measure) -! -! //=========================== variables ======================================= -! -! // The variables below are used by CoAP's registration engine. -! -! static const uint8_t rreg_uriquery[] = "h=ucb"; -! static const uint8_t infoBoardname[] = "TelosB"; -! static const uint8_t infouCName[] = "MSP430f1611"; -! static const uint8_t infoRadioName[] = "CC2420"; -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! //=========================== private ========================================= -! -! #endif -diff -crB openwsn/board_ow.c ../../../sys/net/openwsn/board_ow.c -*** openwsn/board_ow.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/board_ow.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,138 **** -! /** -! \brief TelosB-specific definition of the "board" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #include "msp430f1611.h" -! #include "board.h" -! // bsp modules -! #include "debugpins.h" -! #include "leds.h" -! #include "uart.h" -! #include "spi.h" -! #include "bsp_timer.h" -! #include "radio.h" -! #include "radiotimer.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== main ============================================ -! -! extern int mote_main(void); -! int main(void) { -! return mote_main(); -! } -! -! //=========================== public ========================================== -! -! void board_init() { -! // disable watchdog timer -! WDTCTL = WDTPW + WDTHOLD; -! -! // setup clock speed -! DCOCTL |= DCO0 | DCO1 | DCO2; // MCLK at ~8MHz -! BCSCTL1 |= RSEL0 | RSEL1 | RSEL2; // MCLK at ~8MHz -! // by default, ACLK from 32kHz XTAL which is running -! -! // initialize pins -! P4DIR |= 0x20; // [P4.5] radio VREG: output -! P4DIR |= 0x40; // [P4.6] radio reset: output -! -! // initialize bsp modules -! debugpins_init(); -! leds_init(); -! uart_init(); -! spi_init(); -! bsp_timer_init(); -! radio_init(); -! radiotimer_init(); -! -! // enable interrupts -! __bis_SR_register(GIE); -! } -! -! void board_sleep() { -! __bis_SR_register(GIE+LPM0_bits); // sleep, but leave ACLK on -! } -! -! void board_reset() { -! WDTCTL = (WDTPW+0x1200) + WDTHOLD; // writing a wrong watchdog password to causes handler to reset -! } -! -! //=========================== private ========================================= -! -! //=========================== interrupt handlers ============================== -! -! // DACDMA_VECTOR -! -! // PORT2_VECTOR -! -! #pragma vector = USART1TX_VECTOR -! __interrupt void USART1TX_ISR (void) { -! debugpins_isr_set(); -! if (uart_tx_isr()==KICK_SCHEDULER) { // UART; TX -! __bic_SR_register_on_exit(CPUOFF); -! } -! debugpins_isr_clr(); -! } -! -! #pragma vector = USART1RX_VECTOR -! __interrupt void USART1RX_ISR (void) { -! debugpins_isr_set(); -! if (uart_rx_isr()==KICK_SCHEDULER) { // UART: RX -! __bic_SR_register_on_exit(CPUOFF); -! } -! debugpins_isr_clr(); -! } -! -! // PORT1_VECTOR -! -! // TIMERA1_VECTOR -! -! #pragma vector = TIMERA0_VECTOR -! __interrupt void TIMERA0_ISR (void) { -! debugpins_isr_set(); -! if (bsp_timer_isr()==KICK_SCHEDULER) { // timer: 0 -! __bic_SR_register_on_exit(CPUOFF); -! } -! debugpins_isr_clr(); -! } -! -! // ADC12_VECTOR -! -! // USART0TX_VECTOR -! -! #pragma vector = USART0RX_VECTOR -! __interrupt void USART0RX_ISR (void) { -! debugpins_isr_set(); -! if (spi_isr()==KICK_SCHEDULER) { // SPI -! __bic_SR_register_on_exit(CPUOFF); -! } -! debugpins_isr_clr(); -! } -! -! // WDT_VECTOR -! -! #pragma vector = COMPARATORA_VECTOR -! __interrupt void COMPARATORA_ISR (void) { -! debugpins_isr_set(); -! __bic_SR_register_on_exit(CPUOFF); // restart CPU -! debugpins_isr_clr(); -! } -! -! #pragma vector = TIMERB1_VECTOR -! __interrupt void TIMERB1_ISR (void) { -! debugpins_isr_set(); -! if (radiotimer_isr()==KICK_SCHEDULER) { // radiotimer -! __bic_SR_register_on_exit(CPUOFF); -! } -! debugpins_isr_clr(); -! } -! -! // TIMERB0_VECTOR -! -! // NMI_VECTOR -! ---- 1,65 ---- -! #include "msp430f1611.h" -! #include "board_ow.h" -! -! #include "leds.h" -! #include "uart_ow.h" -! #include "spi.h" -! //#include "bsp_timer.h" -! #include "radio.h" -! #include "radiotimer.h" -! -! void board_init_ow() { -! puts(__PRETTY_FUNCTION__); -! //disable watchdog timer -! WDTCTL = WDTPW + WDTHOLD; -! -! //setup clock speed -! DCOCTL |= DCO0 | DCO1 | DCO2; // MCLK at ~8MHz -! BCSCTL1 |= RSEL0 | RSEL1 | RSEL2; // MCLK at ~8MHz -! // by default, ACLK from 32kHz XTAL which is running -! -! // initialize pins -! P4DIR |= 0x20; // [P4.5] radio VREG: output -! P4DIR |= 0x40; // [P4.6] radio reset: output -! -! // initialize bsp modules -! // debugpins_init(); -! // leds_init(); -! // uart_init_ow(); -! // spi_init(); -! // bsp_timer_init(); -! // radio_init(); -! // radiotimer_init(); -! -! // enable interrupts -! // __bis_SR_register(GIE); -! } -! -! void board_reset() { -! WDTCTL = (WDTPW+0x1200) + WDTHOLD; // writing a wrong watchdog password to causes handler to reset -! } -! -! void board_sleep() { -! __bis_SR_register(GIE+LPM0_bits); // sleep, but leave ACLK on -! } -! // ISR(COMPARATORA) { -! // //debugpins_isr_set(); -! // __bic_SR_register_on_exit(CPUOFF); // restart CPU -! // //debugpins_isr_clr(); -! // } -! -! ISR(TIMERB1) { -! //debugpins_isr_set(); -! if (radiotimer_isr()==KICK_SCHEDULER) { // radiotimer -! __bic_SR_register_on_exit(CPUOFF); -! } -! //debugpins_isr_clr(); -! } -! -! // ISR(TIMERA0) { -! // //debugpins_isr_set(); -! // if (bsp_timer_isr()==KICK_SCHEDULER) { // timer: 0 -! // __bic_SR_register_on_exit(CPUOFF); -! // } -! // //debugpins_isr_clr(); -! // } -diff -crB openwsn/board_ow.h ../../../sys/net/openwsn/board_ow.h -*** openwsn/board_ow.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/board_ow.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,29 **** -! /** -! \brief Cross-platform declaration "board" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #ifndef __BOARD_H -! #define __BOARD_H -! -! #include "board_info.h" -! -! //=========================== define ========================================== -! -! typedef enum { -! DO_NOT_KICK_SCHEDULER, -! KICK_SCHEDULER, -! } kick_scheduler_t; -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void board_init(); -! void board_sleep(); -! void board_reset(); -! -! #endif ---- 1,49 ---- -! #ifndef __BOARD_H -! #define __BOARD_H -! -! /** -! \addtogroup BSP -! \{ -! \addtogroup board -! \{ -! -! \brief Cross-platform declaration "board" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #include "board_info.h" -! -! //=========================== define ========================================== -! -! typedef enum { -! DO_NOT_KICK_SCHEDULER, -! KICK_SCHEDULER, -! } kick_scheduler_t; -! -! #if defined(__GNUC__) && (__GNUC__==4) && (__GNUC_MINOR__<=5) && defined(__MSP430__) -! // mspgcc <4.5.x -! #include <signal.h> -! #define ISR(v) interrupt (v ## _VECTOR) v ## _ISR(void) -! #else -! // other -! #define __PRAGMA__(x) _Pragma(#x) -! #define ISR(v) __PRAGMA__(vector=v ##_VECTOR) __interrupt void v ##_ISR(void) -! #endif -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void board_init_ow(void); -! void board_sleep(void); -! void board_reset(void); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/cc2420.h ../../../sys/net/openwsn/cc2420.h -*** openwsn/cc2420.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/cc2420.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,407 **** -! /** -! \brief Register definitions for the Texas Instruments CC2420 radio chip. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #ifndef __CC2420_H -! #define __CC2420_H -! -! //=========================== spi flags ======================================= -! -! #define CC2420_FLAG_READ 0x40 -! #define CC2420_FLAG_WRITE 0x00 -! -! #define CC2420_FLAG_RAM 0x80 -! #define CC2420_FLAG_REG 0x00 -! -! //=========================== status byte ===================================== -! -! typedef struct { -! uint8_t reserved_1:1; -! uint8_t rssi_valid:1; -! uint8_t lock:1; -! uint8_t tx_active:1; -! uint8_t enc_busy:1; -! uint8_t tx_underflow:1; -! uint8_t xosc16m_stable:1; -! uint8_t reserved_2:1; -! } cc2420_status_t; -! -! //=========================== strobes ========================================= -! -! #define CC2420_SNOP 0x00 // [S ] No Operation -! #define CC2420_SXOSCON 0x01 // [S ] Turn on the crystal oscillator -! #define CC2420_STXCAL 0x02 // [S ] Enable and calibrate frequency synthesizer for TX -! #define CC2420_SRXON 0x03 // [S ] Enable RX -! #define CC2420_STXON 0x04 // [S ] Enable TX after calibration (if not already performed) -! #define CC2420_STXONCCA 0x05 // [S ] If CCA indicates a clear channel, Enable calibration, then TX -! #define CC2420_SRFOFF 0x06 // [S ] Disable RX/TX and frequency synthesizer -! #define CC2420_SXOSCOFF 0x07 // [S ] Turn off the crystal oscillator and RF -! #define CC2420_SFLUSHRX 0x08 // [S ] Flush the RX FIFO buffer and reset the demodulator -! #define CC2420_SFLUSHTX 0x09 // [S ] Flush the TX FIFO buffer -! #define CC2420_SACK 0x0a // [S ] Send acknowledge frame, with pending field cleared -! #define CC2420_SACKPEND 0x0b // [S ] Send acknowledge frame, with pending field set -! #define CC2420_SRXDEC 0x0c // [S ] Start RXFIFO in-line decryption / authentication -! #define CC2420_STXENC 0x0d // [S ] Start TXFIFO in-line encryption / authentication -! #define CC2420_SAES 0x0e // [S ] AES Stand alone encryption strobe -! -! //=========================== registers ======================================= -! -! /// [R/W] Main Control Register -! #define CC2420_MAIN_ADDR 0x10 -! typedef struct { -! uint16_t XOSC16M_BYPASS:1; -! uint16_t reserved_w0:10; -! uint16_t FS_RESETn:1; -! uint16_t MOD_RESETn:1; -! uint16_t DEMOD_RESETn:1; -! uint16_t ENC_RESETn:1; -! uint16_t RESETn:1; -! } cc2420_MAIN_reg_t; -! -! /// [R/W] Modem Control Register 0 -! #define CC2420_MDMCTRL0_ADDR 0x11 -! typedef struct { -! uint16_t PREAMBLE_LENGTH:4; -! uint16_t AUTOACK:1; -! uint16_t AUTOCRC:1; -! uint16_t CCA_MODE:2; -! uint16_t CCA_HYST:3; -! uint16_t ADR_DECODE:1; -! uint16_t PAN_COORDINATOR:1; -! uint16_t RESERVED_FRAME_MODE:1; -! uint16_t reserved_w0:2; -! } cc2420_MDMCTRL0_reg_t; -! -! /// [R/W] Modem Control Register 1 -! #define CC2420_MDMCTRL1_ADDR 0x12 -! typedef struct { -! uint16_t RX_MODE:2; -! uint16_t TX_MODE:2; -! uint16_t MODULATION_MODE:1; -! uint16_t DEMOD_AVG_MODE:1; -! uint16_t CORR_THR:5; -! uint16_t reserved_w0:5; -! } cc2420_MDMCTRL1_reg_t; -! -! // [R/W] RSSI and CCA Status and Control register -! #define CC2420_RSSI_ADDR 0x13 -! typedef struct { -! uint16_t RSSI_VAL:8; -! uint16_t CCR_THR:8; -! } cc2420_RSSI_reg_t; -! -! /// [R/W] Synchronisation word control register -! #define CC2420_SYNCWORD_ADDR 0x14 -! typedef struct { -! uint16_t SYNCWORD:16; -! } cc2420_SYNCWORD_reg_t; -! -! /// [R/W] Transmit Control Register -! #define CC2420_TXCTRL_ADDR 0x15 -! typedef struct { -! uint16_t PA_LEVEL:5; -! uint16_t reserved_w1:1; -! uint16_t PA_CURRENT:3; -! uint16_t TXMIX_CURRENT:2; -! uint16_t TXMIX_CAP_ARRAY:2; -! uint16_t TX_TURNAROUND:1; -! uint16_t TXMIXBUF_CUR:2; -! } cc2420_TXCTRL_reg_t; -! -! /// [R/W] Receive Control Register 0 -! #define CC2420_RXCTRL0_ADDR 0x16 -! typedef struct { -! uint16_t LOW_LNA_CURRENT:2; -! uint16_t MED_LNA_CURRENT:2; -! uint16_t HIGH_LNA_CURRENT:2; -! uint16_t LOW_LNA_GAIN:2; -! uint16_t MED_LNA_GAIN:2; -! uint16_t HIGH_LNA_GAIN:2; -! uint16_t RXMIXBUF_CUR:2; -! uint16_t reserved_w0:2; -! } cc2420_RXCTRL0_reg_t; -! -! /// [R/W] Receive Control Register 1 -! #define CC2420_RXCTRL1_ADDR 0x17 -! typedef struct { -! uint16_t RXMIX_CURRENT:2; -! uint16_t RXMIX_VCM:2; -! uint16_t RXMIX_TAIL:2; -! uint16_t LNA_CAP_ARRAY:2; -! uint16_t MED_HGM:1; -! uint16_t HIGH_HGM:1; -! uint16_t MED_LOWGAIN:1; -! uint16_t LOW_LOWGAIN:1; -! uint16_t RXBPF_MIDCUR:1; -! uint16_t RXBPF_LOCUR:1; -! uint16_t reserved_w0:2; -! } cc2420_RXCTRL1_reg_t; -! -! /// [R/W] Frequency Synthesizer Control and Status Register -! #define CC2420_FSCTRL_ADDR 0x18 -! typedef struct { -! uint16_t FREQ:10; -! uint16_t LOCK_STATUS:1; -! uint16_t LOCK_LENGTH:1; -! uint16_t CAL_RUNNING:1; -! uint16_t CAL_DONE:1; -! uint16_t LOCK_THR:2; -! } cc2420_FSCTRL_reg_t; -! -! /// [R/W] Security Control Register 0 -! #define CC2420_SECCTRL0_ADDR 0x19 -! typedef struct { -! uint16_t SEC_MODE:2; -! uint16_t SEC_M:3; -! uint16_t SEC_RXKEYSEL:1; -! uint16_t SEC_TXKEYSEL:1; -! uint16_t SEC_SAKEYSEL:1; -! uint16_t SEC_CBC_HEAD:1; -! uint16_t RXFIFO_PROTECTION:1; -! uint16_t reserved_w0:6; -! } cc2420_SECCTRL0_reg_t; -! -! /// [R/W] Security Control Register 1 -! #define CC2420_SECCTRL1_ADDR 0x1a -! typedef struct { -! uint16_t SEC_RXL:7; -! uint16_t reserved_1_w0:1; -! uint16_t SEC_TXL:7; -! uint16_t reserved_2_w0:1; -! } cc2420_SECCTRL1_reg_t; -! -! /// [R/W] Battery Monitor Control and Status Register -! #define CC2420_BATTMON_ADDR 0x1b -! typedef struct { -! uint16_t BATTMON_VOLTAGE:5; -! uint16_t BATTMON_EN:1; -! uint16_t BATTMON_OK:1; -! uint16_t reserved_w0:9; -! } cc2420_BATTMON_reg_t; -! -! /// [R/W] Input / Output Control Register 0 -! #define CC2420_IOCFG0_ADDR 0x1c -! typedef struct { -! uint16_t FIFOP_THR:7; -! uint16_t CCA_POLARITY:1; -! uint16_t SFD_POLARITY:1; -! uint16_t FIFOP_POLARITY:1; -! uint16_t FIFO_POLARITY:1; -! uint16_t BCN_ACCEPT:1; -! uint16_t reserved_w0:4; -! } cc2420_IOCFG0_reg_t; -! -! /// [R/W] Input / Output Control Register 1 -! #define CC2420_IOCFG1_ADDR 0x1d -! typedef struct { -! uint16_t CCAMUX:5; -! uint16_t SFDMUX:5; -! uint16_t HSSD_SRC:3; -! uint16_t reserved_w0:3; -! } cc2420_IOCFG1_reg_t; -! -! /// [R/W] Manufacturer ID, Low 16 bits -! #define CC2420_MANFIDL_ADDR 0x1e -! typedef struct { -! uint16_t MANFID:12; -! uint16_t PARTNUM:4; -! } cc2420_MANFIDL_reg_t; -! -! /// [R/W] Manufacturer ID, High 16 bits -! #define CC2420_MANFIDH_ADDR 0x1f -! typedef struct { -! uint16_t PARTNUM:12; -! uint16_t VERSION:4; -! } cc2420_MANFIDH_reg_t; -! -! /// [R/W] Finite State Machine Time Constants -! #define CC2420_FSMTC_ADDR 0x20 -! typedef struct { -! uint16_t TC_TXEND2PAOFF:3; -! uint16_t TC_TXEND2SWITCH:3; -! uint16_t TC_PAON2TX:4; -! uint16_t TC_SWITCH2TX:3; -! uint16_t TC_RXCHAIN2RX:3; -! } cc2420_FSMTC_reg_t; -! -! /// [R/W] Manual signal AND override register -! #define CC2420_MANAND_ADDR 0x21 -! typedef struct { -! uint16_t LNAMIX_PD:1; -! uint16_t RXBPF_PD:1; -! uint16_t VGA_PD:1; -! uint16_t ADC_PD:1; -! uint16_t FS_PD:1; -! uint16_t CHP_PD:1; -! uint16_t RXBPF_CAL_PD:1; -! uint16_t XOSC16M_PD:1; -! uint16_t DAC_LPF_PD:1; -! uint16_t PA_P_PD:1; -! uint16_t PA_N_PD:1; -! uint16_t PRE_PD:1; -! uint16_t RXTX:1; -! uint16_t BALUN_CTRL:1; -! uint16_t BIAS_PD:1; -! uint16_t VGA_RESET_N:1; -! } cc2420_MANAND_reg_t; -! -! /// [R/W] Manual signal OR override register -! #define CC2420_MANOR_ADDR 0x22 -! typedef struct { -! uint16_t LNAMIX_PD:1; -! uint16_t RXBPF_PD:1; -! uint16_t VGA_PD:1; -! uint16_t ADC_PD:1; -! uint16_t FS_PD:1; -! uint16_t CHP_PD:1; -! uint16_t RXBPF_CAL_PD:1; -! uint16_t XOSC16M_PD:1; -! uint16_t DAC_LPF_PD:1; -! uint16_t PA_P_PD:1; -! uint16_t PA_N_PD:1; -! uint16_t PRE_PD:1; -! uint16_t RXTX:1; -! uint16_t BALUN_CTRL:1; -! uint16_t BIAS_PD:1; -! uint16_t VGA_RESET_N:1; -! } cc2420_MANOR_reg_t; -! -! /// [R/W] AGC Control Register -! #define CC2420_AGCCTRL_ADDR 0x23 -! typedef struct { -! uint16_t LNAMIX_GAINMODE:2; -! uint16_t LNAMIX_GAINMODE_O:2; -! uint16_t VGA_GAIN:7; -! uint16_t VGA_GAIN_OE:1; -! uint16_t reserved_w0:4; -! } cc2420_AGCCTRL_reg_t; -! -! /// [R/W] AGC Test Register 0 -! #define CC2420_AGCTST0_ADDR 0x24 -! typedef struct { -! uint16_t LNAMIX_THR_L:6; -! uint16_t LNAMIX_THR_H:6; -! uint16_t LNAMIX_HYST:4; -! } cc2420_AGCTST0_reg_t; -! -! /// [R/W] AGC Test Register 1 -! #define CC2420_AGCTST1_ADDR 0x25 -! typedef struct { -! uint16_t AGC_REF:6; -! uint16_t AGC_WIN_SIZE:2; -! uint16_t AGC_PEAK_DET_MODE:3; -! uint16_t AGC_SETTLE_WAIT:2; -! uint16_t PEAKDET_CUR_BOOST:1; -! uint16_t AGC_BLANK_MODE:1; -! uint16_t reserved_w0:1; -! } cc2420_AGCTST1_reg_t; -! -! /// [R/W] AGC Test Register 2 -! #define CC2420_AGCTST2_ADDR 0x26 -! typedef struct { -! uint16_t LOW2MEDGAIN:5; -! uint16_t MED2HIGHGAIN:5; -! uint16_t reserved_w0:6; -! } cc2420_AGCTST2_reg_t; -! -! /// [R/W] Frequency Synthesizer Test Register 0 -! #define CC2420_FSTST0_ADDR 0x27 -! typedef struct { -! uint16_t VCO_ARRAY_RES:5; -! uint16_t VCO_ARRAY_O:5; -! uint16_t VCO_ARRAY_OE:1; -! uint16_t VCO_ARRAY_SETTLE_LONG:1; -! uint16_t reserved_w0:4; -! } cc2420_FSTST0_reg_t; -! -! /// [R/W] Frequency Synthesizer Test Register 1 -! #define CC2420_FSTST1_ADDR 0x28 -! typedef struct { -! uint16_t VC_DAC_VAL:3; -! uint16_t VC_DAC_EN:1; -! uint16_t VCO_CURRENT_K:6; -! uint16_t VCO_CURRENT_REF:4; -! uint16_t VCO_ARRAY_CAL_LONG:1; -! uint16_t VCO_TX_NOCAL:1; -! } cc2420_FSTST1_reg_t; -! -! /// [R/W] Frequency Synthesizer Test Register 2 -! #define CC2420_FSTST2_ADDR 0x29 -! typedef struct { -! uint16_t VCO_CURRENT_RES:6; -! uint16_t VCO_CURRENT_O:6; -! uint16_t VCO_CURRENT_OE:1; -! uint16_t VCO_CURCAL_SPEED:2; -! uint16_t reserved_w0:1; -! } cc2420_FSTST2_reg_t; -! -! /// [R/W] Frequency Synthesizer Test Register 3 -! #define CC2420_FSTST3_ADDR 0x2a -! typedef struct { -! uint16_t START_CHP_CURRENT:4; -! uint16_t STOP_CHP_CURRENT:4; -! uint16_t CHP_STEP_PERIOD:2; -! uint16_t PD_DELAY:1; -! uint16_t CHP_DISABLE:1; -! uint16_t CHP_TEST_DN:1; -! uint16_t CHP_TEST_UP:1; -! uint16_t CHP_CURRENT_OE:1; -! uint16_t CHP_CAL_DISABLE:1; -! } cc2420_FSTST3_reg_t; -! -! /// [R/W] Receiver Bandpass Filter Test Register -! #define CC2420_RXBPFTST_ADDR 0x2b -! typedef struct { -! uint16_t RXBPF_CAP_RES:7; -! uint16_t RXBPF_CAP_O:7; -! uint16_t RXBPF_CAP_OE:1; -! uint16_t reserved_w0:1; -! } cc2420_RXBPFTST_reg_t; -! -! /// [R ] Finite State Machine State Status Register -! #define CC2420_FSMSTATE_ADDR 0x2c -! typedef struct { -! uint16_t FSM_CUR_STATE:6; -! uint16_t reserved_w0:10; -! } cc2420_FSMSTATE_reg_t; -! -! /// [R/W] ADC Test Register -! #define CC2420_ADCTST_ADDR 0x2d -! typedef struct { -! uint16_t ADC_Q:7; -! uint16_t reserved_w0:1; -! uint16_t ADC_I:7; -! uint16_t ADC_CLOCK_DISABLE:1; -! } cc2420_ADCTST_reg_t; -! -! /// [R/W] DAC Test Register -! #define CC2420_DACTST_ADDR 0x2e -! typedef struct { -! uint16_t DAC_Q_O:6; -! uint16_t DAC_I_O:6; -! uint16_t DAC_SRC:3; -! uint16_t reserved_w0:1; -! } cc2420_DACTST_reg_t; -! -! /// [R/W] Top Level Test Register -! #define CC2420_TOPTST_ADDR 0x2f -! typedef struct { -! uint16_t ATESTMOD_MODE:4; -! uint16_t ATESTMOD_PD:1; -! uint16_t VC_IN_TEST_EN:1; -! uint16_t TEST_BATTMON_EN:1; -! uint16_t RAM_BIST_RUN:1; -! uint16_t reserved_w0:8; -! } cc2420_TOPTST_reg_t; -! -! //=========================== buffer ========================================== -! -! /// [ W] Transmit FIFO Byte Register -! #define CC2420_TXFIFO_ADDR 0x3e -! -! /// [R/W] Receiver FIFO Byte Register -! #define CC2420_RXFIFO_ADDR 0x3f -! - #endif -\ No newline at end of file ---- 1,407 ---- -! /** -! \brief Register definitions for the Texas Instruments CC2420 radio chip. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #ifndef __CC2420_H -! #define __CC2420_H -! -! //=========================== spi flags ======================================= -! -! #define CC2420_FLAG_READ 0x40 -! #define CC2420_FLAG_WRITE 0x00 -! -! #define CC2420_FLAG_RAM 0x80 -! #define CC2420_FLAG_REG 0x00 -! -! //=========================== status byte ===================================== -! -! typedef struct { -! uint8_t reserved_1:1; -! uint8_t rssi_valid:1; -! uint8_t lock:1; -! uint8_t tx_active:1; -! uint8_t enc_busy:1; -! uint8_t tx_underflow:1; -! uint8_t xosc16m_stable:1; -! uint8_t reserved_2:1; -! } cc2420_status_t; -! -! //=========================== strobes ========================================= -! -! #define CC2420_SNOP 0x00 // [S ] No Operation -! #define CC2420_SXOSCON 0x01 // [S ] Turn on the crystal oscillator -! #define CC2420_STXCAL 0x02 // [S ] Enable and calibrate frequency synthesizer for TX -! #define CC2420_SRXON 0x03 // [S ] Enable RX -! #define CC2420_STXON 0x04 // [S ] Enable TX after calibration (if not already performed) -! #define CC2420_STXONCCA 0x05 // [S ] If CCA indicates a clear channel, Enable calibration, then TX -! #define CC2420_SRFOFF 0x06 // [S ] Disable RX/TX and frequency synthesizer -! #define CC2420_SXOSCOFF 0x07 // [S ] Turn off the crystal oscillator and RF -! #define CC2420_SFLUSHRX 0x08 // [S ] Flush the RX FIFO buffer and reset the demodulator -! #define CC2420_SFLUSHTX 0x09 // [S ] Flush the TX FIFO buffer -! #define CC2420_SACK 0x0a // [S ] Send acknowledge frame, with pending field cleared -! #define CC2420_SACKPEND 0x0b // [S ] Send acknowledge frame, with pending field set -! #define CC2420_SRXDEC 0x0c // [S ] Start RXFIFO in-line decryption / authentication -! #define CC2420_STXENC 0x0d // [S ] Start TXFIFO in-line encryption / authentication -! #define CC2420_SAES 0x0e // [S ] AES Stand alone encryption strobe -! -! //=========================== registers ======================================= -! -! /// [R/W] Main Control Register -! #define CC2420_MAIN_ADDR 0x10 -! typedef struct { -! uint16_t XOSC16M_BYPASS:1; -! uint16_t reserved_w0:10; -! uint16_t FS_RESETn:1; -! uint16_t MOD_RESETn:1; -! uint16_t DEMOD_RESETn:1; -! uint16_t ENC_RESETn:1; -! uint16_t RESETn:1; -! } cc2420_MAIN_reg_t; -! -! /// [R/W] Modem Control Register 0 -! #define CC2420_MDMCTRL0_ADDR 0x11 -! typedef struct { -! uint16_t PREAMBLE_LENGTH:4; -! uint16_t AUTOACK:1; -! uint16_t AUTOCRC:1; -! uint16_t CCA_MODE:2; -! uint16_t CCA_HYST:3; -! uint16_t ADR_DECODE:1; -! uint16_t PAN_COORDINATOR:1; -! uint16_t RESERVED_FRAME_MODE:1; -! uint16_t reserved_w0:2; -! } cc2420_MDMCTRL0_reg_t; -! -! /// [R/W] Modem Control Register 1 -! #define CC2420_MDMCTRL1_ADDR 0x12 -! typedef struct { -! uint16_t RX_MODE:2; -! uint16_t TX_MODE:2; -! uint16_t MODULATION_MODE:1; -! uint16_t DEMOD_AVG_MODE:1; -! uint16_t CORR_THR:5; -! uint16_t reserved_w0:5; -! } cc2420_MDMCTRL1_reg_t; -! -! // [R/W] RSSI and CCA Status and Control register -! #define CC2420_RSSI_ADDR 0x13 -! typedef struct { -! uint16_t RSSI_VAL:8; -! uint16_t CCR_THR:8; -! } cc2420_RSSI_reg_t; -! -! /// [R/W] Synchronisation word control register -! #define CC2420_SYNCWORD_ADDR 0x14 -! typedef struct { -! uint16_t SYNCWORD:16; -! } cc2420_SYNCWORD_reg_t; -! -! /// [R/W] Transmit Control Register -! #define CC2420_TXCTRL_ADDR 0x15 -! typedef struct { -! uint16_t PA_LEVEL:5; -! uint16_t reserved_w1:1; -! uint16_t PA_CURRENT:3; -! uint16_t TXMIX_CURRENT:2; -! uint16_t TXMIX_CAP_ARRAY:2; -! uint16_t TX_TURNAROUND:1; -! uint16_t TXMIXBUF_CUR:2; -! } cc2420_TXCTRL_reg_t; -! -! /// [R/W] Receive Control Register 0 -! #define CC2420_RXCTRL0_ADDR 0x16 -! typedef struct { -! uint16_t LOW_LNA_CURRENT:2; -! uint16_t MED_LNA_CURRENT:2; -! uint16_t HIGH_LNA_CURRENT:2; -! uint16_t LOW_LNA_GAIN:2; -! uint16_t MED_LNA_GAIN:2; -! uint16_t HIGH_LNA_GAIN:2; -! uint16_t RXMIXBUF_CUR:2; -! uint16_t reserved_w0:2; -! } cc2420_RXCTRL0_reg_t; -! -! /// [R/W] Receive Control Register 1 -! #define CC2420_RXCTRL1_ADDR 0x17 -! typedef struct { -! uint16_t RXMIX_CURRENT:2; -! uint16_t RXMIX_VCM:2; -! uint16_t RXMIX_TAIL:2; -! uint16_t LNA_CAP_ARRAY:2; -! uint16_t MED_HGM:1; -! uint16_t HIGH_HGM:1; -! uint16_t MED_LOWGAIN:1; -! uint16_t LOW_LOWGAIN:1; -! uint16_t RXBPF_MIDCUR:1; -! uint16_t RXBPF_LOCUR:1; -! uint16_t reserved_w0:2; -! } cc2420_RXCTRL1_reg_t; -! -! /// [R/W] Frequency Synthesizer Control and Status Register -! #define CC2420_FSCTRL_ADDR 0x18 -! typedef struct { -! uint16_t FREQ:10; -! uint16_t LOCK_STATUS:1; -! uint16_t LOCK_LENGTH:1; -! uint16_t CAL_RUNNING:1; -! uint16_t CAL_DONE:1; -! uint16_t LOCK_THR:2; -! } cc2420_FSCTRL_reg_t; -! -! /// [R/W] Security Control Register 0 -! #define CC2420_SECCTRL0_ADDR 0x19 -! typedef struct { -! uint16_t SEC_MODE:2; -! uint16_t SEC_M:3; -! uint16_t SEC_RXKEYSEL:1; -! uint16_t SEC_TXKEYSEL:1; -! uint16_t SEC_SAKEYSEL:1; -! uint16_t SEC_CBC_HEAD:1; -! uint16_t RXFIFO_PROTECTION:1; -! uint16_t reserved_w0:6; -! } cc2420_SECCTRL0_reg_t; -! -! /// [R/W] Security Control Register 1 -! #define CC2420_SECCTRL1_ADDR 0x1a -! typedef struct { -! uint16_t SEC_RXL:7; -! uint16_t reserved_1_w0:1; -! uint16_t SEC_TXL:7; -! uint16_t reserved_2_w0:1; -! } cc2420_SECCTRL1_reg_t; -! -! /// [R/W] Battery Monitor Control and Status Register -! #define CC2420_BATTMON_ADDR 0x1b -! typedef struct { -! uint16_t BATTMON_VOLTAGE:5; -! uint16_t BATTMON_EN:1; -! uint16_t BATTMON_OK:1; -! uint16_t reserved_w0:9; -! } cc2420_BATTMON_reg_t; -! -! /// [R/W] Input / Output Control Register 0 -! #define CC2420_IOCFG0_ADDR 0x1c -! typedef struct { -! uint16_t FIFOP_THR:7; -! uint16_t CCA_POLARITY:1; -! uint16_t SFD_POLARITY:1; -! uint16_t FIFOP_POLARITY:1; -! uint16_t FIFO_POLARITY:1; -! uint16_t BCN_ACCEPT:1; -! uint16_t reserved_w0:4; -! } cc2420_IOCFG0_reg_t; -! -! /// [R/W] Input / Output Control Register 1 -! #define CC2420_IOCFG1_ADDR 0x1d -! typedef struct { -! uint16_t CCAMUX:5; -! uint16_t SFDMUX:5; -! uint16_t HSSD_SRC:3; -! uint16_t reserved_w0:3; -! } cc2420_IOCFG1_reg_t; -! -! /// [R/W] Manufacturer ID, Low 16 bits -! #define CC2420_MANFIDL_ADDR 0x1e -! typedef struct { -! uint16_t MANFID:12; -! uint16_t PARTNUM:4; -! } cc2420_MANFIDL_reg_t; -! -! /// [R/W] Manufacturer ID, High 16 bits -! #define CC2420_MANFIDH_ADDR 0x1f -! typedef struct { -! uint16_t PARTNUM:12; -! uint16_t AVERSION:4; // collision with -DVERSION=$(GIT_VERSION) -! } cc2420_MANFIDH_reg_t; -! -! /// [R/W] Finite State Machine Time Constants -! #define CC2420_FSMTC_ADDR 0x20 -! typedef struct { -! uint16_t TC_TXEND2PAOFF:3; -! uint16_t TC_TXEND2SWITCH:3; -! uint16_t TC_PAON2TX:4; -! uint16_t TC_SWITCH2TX:3; -! uint16_t TC_RXCHAIN2RX:3; -! } cc2420_FSMTC_reg_t; -! -! /// [R/W] Manual signal AND override register -! #define CC2420_MANAND_ADDR 0x21 -! typedef struct { -! uint16_t LNAMIX_PD:1; -! uint16_t RXBPF_PD:1; -! uint16_t VGA_PD:1; -! uint16_t ADC_PD:1; -! uint16_t FS_PD:1; -! uint16_t CHP_PD:1; -! uint16_t RXBPF_CAL_PD:1; -! uint16_t XOSC16M_PD:1; -! uint16_t DAC_LPF_PD:1; -! uint16_t PA_P_PD:1; -! uint16_t PA_N_PD:1; -! uint16_t PRE_PD:1; -! uint16_t RXTX:1; -! uint16_t BALUN_CTRL:1; -! uint16_t BIAS_PD:1; -! uint16_t VGA_RESET_N:1; -! } cc2420_MANAND_reg_t; -! -! /// [R/W] Manual signal OR override register -! #define CC2420_MANOR_ADDR 0x22 -! typedef struct { -! uint16_t LNAMIX_PD:1; -! uint16_t RXBPF_PD:1; -! uint16_t VGA_PD:1; -! uint16_t ADC_PD:1; -! uint16_t FS_PD:1; -! uint16_t CHP_PD:1; -! uint16_t RXBPF_CAL_PD:1; -! uint16_t XOSC16M_PD:1; -! uint16_t DAC_LPF_PD:1; -! uint16_t PA_P_PD:1; -! uint16_t PA_N_PD:1; -! uint16_t PRE_PD:1; -! uint16_t RXTX:1; -! uint16_t BALUN_CTRL:1; -! uint16_t BIAS_PD:1; -! uint16_t VGA_RESET_N:1; -! } cc2420_MANOR_reg_t; -! -! /// [R/W] AGC Control Register -! #define CC2420_AGCCTRL_ADDR 0x23 -! typedef struct { -! uint16_t LNAMIX_GAINMODE:2; -! uint16_t LNAMIX_GAINMODE_O:2; -! uint16_t VGA_GAIN:7; -! uint16_t VGA_GAIN_OE:1; -! uint16_t reserved_w0:4; -! } cc2420_AGCCTRL_reg_t; -! -! /// [R/W] AGC Test Register 0 -! #define CC2420_AGCTST0_ADDR 0x24 -! typedef struct { -! uint16_t LNAMIX_THR_L:6; -! uint16_t LNAMIX_THR_H:6; -! uint16_t LNAMIX_HYST:4; -! } cc2420_AGCTST0_reg_t; -! -! /// [R/W] AGC Test Register 1 -! #define CC2420_AGCTST1_ADDR 0x25 -! typedef struct { -! uint16_t AGC_REF:6; -! uint16_t AGC_WIN_SIZE:2; -! uint16_t AGC_PEAK_DET_MODE:3; -! uint16_t AGC_SETTLE_WAIT:2; -! uint16_t PEAKDET_CUR_BOOST:1; -! uint16_t AGC_BLANK_MODE:1; -! uint16_t reserved_w0:1; -! } cc2420_AGCTST1_reg_t; -! -! /// [R/W] AGC Test Register 2 -! #define CC2420_AGCTST2_ADDR 0x26 -! typedef struct { -! uint16_t LOW2MEDGAIN:5; -! uint16_t MED2HIGHGAIN:5; -! uint16_t reserved_w0:6; -! } cc2420_AGCTST2_reg_t; -! -! /// [R/W] Frequency Synthesizer Test Register 0 -! #define CC2420_FSTST0_ADDR 0x27 -! typedef struct { -! uint16_t VCO_ARRAY_RES:5; -! uint16_t VCO_ARRAY_O:5; -! uint16_t VCO_ARRAY_OE:1; -! uint16_t VCO_ARRAY_SETTLE_LONG:1; -! uint16_t reserved_w0:4; -! } cc2420_FSTST0_reg_t; -! -! /// [R/W] Frequency Synthesizer Test Register 1 -! #define CC2420_FSTST1_ADDR 0x28 -! typedef struct { -! uint16_t VC_DAC_VAL:3; -! uint16_t VC_DAC_EN:1; -! uint16_t VCO_CURRENT_K:6; -! uint16_t VCO_CURRENT_REF:4; -! uint16_t VCO_ARRAY_CAL_LONG:1; -! uint16_t VCO_TX_NOCAL:1; -! } cc2420_FSTST1_reg_t; -! -! /// [R/W] Frequency Synthesizer Test Register 2 -! #define CC2420_FSTST2_ADDR 0x29 -! typedef struct { -! uint16_t VCO_CURRENT_RES:6; -! uint16_t VCO_CURRENT_O:6; -! uint16_t VCO_CURRENT_OE:1; -! uint16_t VCO_CURCAL_SPEED:2; -! uint16_t reserved_w0:1; -! } cc2420_FSTST2_reg_t; -! -! /// [R/W] Frequency Synthesizer Test Register 3 -! #define CC2420_FSTST3_ADDR 0x2a -! typedef struct { -! uint16_t START_CHP_CURRENT:4; -! uint16_t STOP_CHP_CURRENT:4; -! uint16_t CHP_STEP_PERIOD:2; -! uint16_t PD_DELAY:1; -! uint16_t CHP_DISABLE:1; -! uint16_t CHP_TEST_DN:1; -! uint16_t CHP_TEST_UP:1; -! uint16_t CHP_CURRENT_OE:1; -! uint16_t CHP_CAL_DISABLE:1; -! } cc2420_FSTST3_reg_t; -! -! /// [R/W] Receiver Bandpass Filter Test Register -! #define CC2420_RXBPFTST_ADDR 0x2b -! typedef struct { -! uint16_t RXBPF_CAP_RES:7; -! uint16_t RXBPF_CAP_O:7; -! uint16_t RXBPF_CAP_OE:1; -! uint16_t reserved_w0:1; -! } cc2420_RXBPFTST_reg_t; -! -! /// [R ] Finite State Machine State Status Register -! #define CC2420_FSMSTATE_ADDR 0x2c -! typedef struct { -! uint16_t FSM_CUR_STATE:6; -! uint16_t reserved_w0:10; -! } cc2420_FSMSTATE_reg_t; -! -! /// [R/W] ADC Test Register -! #define CC2420_ADCTST_ADDR 0x2d -! typedef struct { -! uint16_t ADC_Q:7; -! uint16_t reserved_w0:1; -! uint16_t ADC_I:7; -! uint16_t ADC_CLOCK_DISABLE:1; -! } cc2420_ADCTST_reg_t; -! -! /// [R/W] DAC Test Register -! #define CC2420_DACTST_ADDR 0x2e -! typedef struct { -! uint16_t DAC_Q_O:6; -! uint16_t DAC_I_O:6; -! uint16_t DAC_SRC:3; -! uint16_t reserved_w0:1; -! } cc2420_DACTST_reg_t; -! -! /// [R/W] Top Level Test Register -! #define CC2420_TOPTST_ADDR 0x2f -! typedef struct { -! uint16_t ATESTMOD_MODE:4; -! uint16_t ATESTMOD_PD:1; -! uint16_t VC_IN_TEST_EN:1; -! uint16_t TEST_BATTMON_EN:1; -! uint16_t RAM_BIST_RUN:1; -! uint16_t reserved_w0:8; -! } cc2420_TOPTST_reg_t; -! -! //=========================== buffer ========================================== -! -! /// [ W] Transmit FIFO Byte Register -! #define CC2420_TXFIFO_ADDR 0x3e -! -! /// [R/W] Receiver FIFO Byte Register -! #define CC2420_RXFIFO_ADDR 0x3f -! - #endif -\ No newline at end of file -diff -crB openwsn/cross-layers/Makefile ../../../sys/net/openwsn/cross-layers/Makefile -*** openwsn/cross-layers/Makefile Wed Jan 15 13:55:34 2014 ---- ../../../sys/net/openwsn/cross-layers/Makefile Wed Jan 15 13:48:27 2014 -*************** -*** 0 **** ---- 1,32 ---- -+ SUBMOD:=$(shell basename $(CURDIR)).a -+ #BINDIR = $(RIOTBASE)/bin/ -+ SRC = $(wildcard *.c) -+ OBJ = $(SRC:%.c=$(BINDIR)%.o) -+ DEP = $(SRC:%.c=$(BINDIR)%.d) -+ -+ INCLUDES += -I$(RIOTBASE) -I$(RIOTBASE)/sys/include -I$(RIOTBASE)/core/include -I$(RIOTBASE)/drivers/include -I$(RIOTBASE)/drivers/cc110x_ng/include -I$(RIOTBASE)/cpu/arm_common/include -I$(RIOTBASE)/sys/net/include/ -+ INCLUDES += -I$(CURDIR)/02a-MAClow -+ INCLUDES += -I$(CURDIR)/02b-MAChigh -+ INCLUDES += -I$(CURDIR)/03a-IPHC -+ INCLUDES += -I$(CURDIR)/03b-IPv6 -+ INCLUDES += -I$(CURDIR)/04-TRAN -+ INCLUDES += -I$(CURDIR)/cross-layers -+ -+ .PHONY: $(BINDIR)$(SUBMOD) -+ -+ $(BINDIR)$(SUBMOD): $(OBJ) -+ $(AD)$(AR) rcs $(BINDIR)$(MODULE) $(OBJ) -+ -+ # pull in dependency info for *existing* .o files -+ -include $(OBJ:.o=.d) -+ -+ # compile and generate dependency info -+ $(BINDIR)%.o: %.c -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o -+ $(AD)$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d -+ @printf "$(BINDIR)" | cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d -+ -+ # remove compilation products -+ -+ clean: -+ rm -f $(OBJ) $(DEP) -diff -crB openwsn/cross-layers/idmanager.c ../../../sys/net/openwsn/cross-layers/idmanager.c -*** openwsn/cross-layers/idmanager.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/cross-layers/idmanager.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,269 **** -! #include "openwsn.h" -! #include "idmanager.h" -! #include "eui64.h" -! #include "packetfunctions.h" -! #include "openserial.h" -! #include "neighbors.h" -! -! //=========================== variables ======================================= -! -! typedef struct { -! bool isDAGroot; -! bool isBridge; -! open_addr_t my16bID; -! open_addr_t my64bID; -! open_addr_t myPANID; -! open_addr_t myPrefix; -! } idmanager_vars_t; -! -! idmanager_vars_t idmanager_vars; -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void idmanager_init() { -! idmanager_vars.isDAGroot = FALSE; -! idmanager_vars.isBridge = FALSE; -! idmanager_vars.myPANID.type = ADDR_PANID; -! idmanager_vars.myPANID.panid[0] = 0xca; -! idmanager_vars.myPANID.panid[1] = 0xfe; -! idmanager_vars.myPrefix.type = ADDR_PREFIX; -! idmanager_vars.myPrefix.prefix[0] = 0x00; -! idmanager_vars.myPrefix.prefix[1] = 0x00; -! idmanager_vars.myPrefix.prefix[2] = 0x00; -! idmanager_vars.myPrefix.prefix[3] = 0x00; -! idmanager_vars.myPrefix.prefix[4] = 0x00; -! idmanager_vars.myPrefix.prefix[5] = 0x00; -! idmanager_vars.myPrefix.prefix[6] = 0x00; -! idmanager_vars.myPrefix.prefix[7] = 0x00; -! idmanager_vars.my64bID.type = ADDR_64B; -! eui64_get(idmanager_vars.my64bID.addr_64b); -! packetfunctions_mac64bToMac16b(&idmanager_vars.my64bID,&idmanager_vars.my16bID); -! -! // DEBUG_MOTEID_MASTER is DAGroot and bridge -! if (idmanager_vars.my16bID.addr_16b[1]==DEBUG_MOTEID_MASTER) { -! idmanager_vars.isDAGroot = TRUE; -! idmanager_vars.isBridge = TRUE; -! } -! } -! -! bool idmanager_getIsDAGroot() { -! bool res; -! INTERRUPT_DECLARATION(); -! -! DISABLE_INTERRUPTS(); -! res=idmanager_vars.isDAGroot; -! ENABLE_INTERRUPTS(); -! return res; -! } -! -! void idmanager_setIsDAGroot(bool newRole) { -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! idmanager_vars.isDAGroot = newRole; -! neighbors_updateMyDAGrankAndNeighborPreference(); -! ENABLE_INTERRUPTS(); -! } -! -! bool idmanager_getIsBridge() { -! bool res; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! res=idmanager_vars.isBridge; -! ENABLE_INTERRUPTS(); -! return res; -! } -! -! void idmanager_setIsBridge(bool newRole) { -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! idmanager_vars.isBridge = newRole; -! ENABLE_INTERRUPTS(); -! -! } -! -! open_addr_t* idmanager_getMyID(uint8_t type) { -! open_addr_t* res; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! switch (type) { -! case ADDR_16B: -! res= &idmanager_vars.my16bID; -! break; -! case ADDR_64B: -! res= &idmanager_vars.my64bID; -! break; -! case ADDR_PANID: -! res= &idmanager_vars.myPANID; -! break; -! case ADDR_PREFIX: -! res= &idmanager_vars.myPrefix; -! break; -! case ADDR_128B: -! // you don't ask for my full address, rather for prefix, then 64b -! default: -! openserial_printCritical(COMPONENT_IDMANAGER,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)type, -! (errorparameter_t)0); -! res= NULL; -! break; -! } -! ENABLE_INTERRUPTS(); -! return res; -! } -! -! error_t idmanager_setMyID(open_addr_t* newID) { -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! switch (newID->type) { -! case ADDR_16B: -! memcpy(&idmanager_vars.my16bID,newID,sizeof(open_addr_t)); -! break; -! case ADDR_64B: -! memcpy(&idmanager_vars.my64bID,newID,sizeof(open_addr_t)); -! break; -! case ADDR_PANID: -! memcpy(&idmanager_vars.myPANID,newID,sizeof(open_addr_t)); -! break; -! case ADDR_PREFIX: -! memcpy(&idmanager_vars.myPrefix,newID,sizeof(open_addr_t)); -! break; -! case ADDR_128B: -! //don't set 128b, but rather prefix and 64b -! default: -! openserial_printCritical(COMPONENT_IDMANAGER,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)newID->type, -! (errorparameter_t)1); -! ENABLE_INTERRUPTS(); -! return E_FAIL; -! } -! ENABLE_INTERRUPTS(); -! return E_SUCCESS; -! } -! -! bool idmanager_isMyAddress(open_addr_t* addr) { -! open_addr_t temp_my128bID; -! bool res; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! -! switch (addr->type) { -! case ADDR_16B: -! res= packetfunctions_sameAddress(addr,&idmanager_vars.my16bID); -! ENABLE_INTERRUPTS(); -! return res; -! case ADDR_64B: -! res= packetfunctions_sameAddress(addr,&idmanager_vars.my64bID); -! ENABLE_INTERRUPTS(); -! return res; -! case ADDR_128B: -! //build temporary my128bID -! temp_my128bID.type = ADDR_128B; -! memcpy(&temp_my128bID.addr_128b[0],&idmanager_vars.myPrefix.prefix,8); -! memcpy(&temp_my128bID.addr_128b[8],&idmanager_vars.my64bID.addr_64b,8); -! -! res= packetfunctions_sameAddress(addr,&temp_my128bID); -! ENABLE_INTERRUPTS(); -! return res; -! case ADDR_PANID: -! res= packetfunctions_sameAddress(addr,&idmanager_vars.myPANID); -! ENABLE_INTERRUPTS(); -! return res; -! case ADDR_PREFIX: -! res= packetfunctions_sameAddress(addr,&idmanager_vars.myPrefix); -! ENABLE_INTERRUPTS(); -! return res; -! default: -! openserial_printCritical(COMPONENT_IDMANAGER,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)addr->type, -! (errorparameter_t)2); -! ENABLE_INTERRUPTS(); -! return FALSE; -! } -! } -! -! void idmanager_triggerAboutRoot() { -! uint8_t number_bytes_from_input_buffer; -! uint8_t input_buffer; -! //get command from OpenSerial -! number_bytes_from_input_buffer = openserial_getInputBuffer(&input_buffer,sizeof(input_buffer)); -! if (number_bytes_from_input_buffer!=sizeof(input_buffer)) { -! openserial_printError(COMPONENT_IDMANAGER,ERR_INPUTBUFFER_LENGTH, -! (errorparameter_t)number_bytes_from_input_buffer, -! (errorparameter_t)0); -! return; -! }; -! //handle command -! switch (input_buffer) { -! case 'Y': -! idmanager_setIsDAGroot(TRUE); -! break; -! case 'N': -! idmanager_setIsDAGroot(FALSE); -! break; -! case 'T': -! if (idmanager_getIsDAGroot()) { -! idmanager_setIsDAGroot(FALSE); -! } else { -! idmanager_setIsDAGroot(TRUE); -! } -! break; -! } -! return; -! } -! -! void idmanager_triggerAboutBridge() { -! uint8_t number_bytes_from_input_buffer; -! uint8_t input_buffer[9]; -! //get command from OpenSerial (1B command, 8B prefix) -! number_bytes_from_input_buffer = openserial_getInputBuffer(&input_buffer[0],sizeof(input_buffer)); -! if (number_bytes_from_input_buffer!=sizeof(input_buffer)) { -! openserial_printError(COMPONENT_IDMANAGER,ERR_INPUTBUFFER_LENGTH, -! (errorparameter_t)number_bytes_from_input_buffer, -! (errorparameter_t)0); -! return; -! }; -! //handle command -! switch (input_buffer[0]) { -! case 'Y': -! idmanager_setIsBridge(TRUE); -! memcpy(&(idmanager_vars.myPrefix.prefix),&(input_buffer[1]),8); -! break; -! case 'N': -! idmanager_setIsBridge(FALSE); -! break; -! case 'T': -! if (idmanager_getIsBridge()) { -! idmanager_setIsBridge(FALSE); -! } else { -! idmanager_setIsBridge(TRUE); -! memcpy(&(idmanager_vars.myPrefix.prefix),&(input_buffer[1]),8); -! } -! break; -! } -! return; -! } -! -! /** -! \brief Trigger this module to print status information, over serial. -! -! debugPrint_* functions are used by the openserial module to continuously print -! status information about several modules in the OpenWSN stack. -! -! \returns TRUE if this function printed something, FALSE otherwise. -! */ -! bool debugPrint_id() { -! debugIDManagerEntry_t output; -! output.isDAGroot = idmanager_vars.isDAGroot; -! output.isBridge = idmanager_vars.isBridge; -! output.my16bID = idmanager_vars.my16bID; -! output.my64bID = idmanager_vars.my64bID; -! output.myPANID = idmanager_vars.myPANID; -! output.myPrefix = idmanager_vars.myPrefix; -! openserial_printStatus(STATUS_ID,(uint8_t*)&output,sizeof(debugIDManagerEntry_t)); -! return TRUE; -! } -! -! -! //=========================== private ========================================= ---- 1,250 ---- -! #include "openwsn.h" -! #include "idmanager.h" -! #include "eui64.h" -! #include "packetfunctions.h" -! #include "openserial.h" -! #include "neighbors.h" -! -! //=========================== variables ======================================= -! -! idmanager_vars_t idmanager_vars; -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void idmanager_init(void) { -! idmanager_vars.isDAGroot = FALSE; -! idmanager_vars.isBridge = FALSE; -! idmanager_vars.myPANID.type = ADDR_PANID; -! idmanager_vars.myPANID.panid[0] = 0xca; -! idmanager_vars.myPANID.panid[1] = 0xfe; -! -! idmanager_vars.myPrefix.type = ADDR_PREFIX; -! memset(&idmanager_vars.myPrefix.prefix[0], 0x00, sizeof(idmanager_vars.myPrefix.prefix)); -! idmanager_vars.my64bID.type = ADDR_64B; -! -! eui64_get(idmanager_vars.my64bID.addr_64b); -! packetfunctions_mac64bToMac16b(&idmanager_vars.my64bID,&idmanager_vars.my16bID); -! -! // if(idmanager_vars.my16bID.addr_16b[1] == 0x0B) -! // idmanager_setIsDAGroot(TRUE); -! } -! -! bool idmanager_getIsDAGroot(void) { -! bool res; -! INTERRUPT_DECLARATION(); -! -! DISABLE_INTERRUPTS(); -! res=idmanager_vars.isDAGroot; -! ENABLE_INTERRUPTS(); -! return res; -! } -! -! void idmanager_setIsDAGroot(bool newRole) { -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! idmanager_vars.isDAGroot = newRole; -! neighbors_updateMyDAGrankAndNeighborPreference(); -! ENABLE_INTERRUPTS(); -! } -! -! bool idmanager_getIsBridge(void) { -! bool res; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! res=idmanager_vars.isBridge; -! ENABLE_INTERRUPTS(); -! return res; -! } -! -! void idmanager_setIsBridge(bool newRole) { -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! idmanager_vars.isBridge = newRole; -! ENABLE_INTERRUPTS(); -! -! } -! -! open_addr_t* idmanager_getMyID(uint8_t type) { -! open_addr_t* res; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! switch (type) { -! case ADDR_16B: -! res= &idmanager_vars.my16bID; -! break; -! case ADDR_64B: -! res= &idmanager_vars.my64bID; -! break; -! case ADDR_PANID: -! res= &idmanager_vars.myPANID; -! break; -! case ADDR_PREFIX: -! res= &idmanager_vars.myPrefix; -! break; -! case ADDR_128B: -! // you don't ask for my full address, rather for prefix, then 64b -! default: -! openserial_printCritical(COMPONENT_IDMANAGER,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)type, -! (errorparameter_t)0); -! res= NULL; -! break; -! } -! ENABLE_INTERRUPTS(); -! return res; -! } -! -! owerror_t idmanager_setMyID(open_addr_t* newID) { -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! switch (newID->type) { -! case ADDR_16B: -! memcpy(&idmanager_vars.my16bID,newID,sizeof(open_addr_t)); -! break; -! case ADDR_64B: -! memcpy(&idmanager_vars.my64bID,newID,sizeof(open_addr_t)); -! break; -! case ADDR_PANID: -! memcpy(&idmanager_vars.myPANID,newID,sizeof(open_addr_t)); -! break; -! case ADDR_PREFIX: -! memcpy(&idmanager_vars.myPrefix,newID,sizeof(open_addr_t)); -! break; -! case ADDR_128B: -! //don't set 128b, but rather prefix and 64b -! default: -! openserial_printCritical(COMPONENT_IDMANAGER,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)newID->type, -! (errorparameter_t)1); -! ENABLE_INTERRUPTS(); -! return E_FAIL; -! } -! ENABLE_INTERRUPTS(); -! return E_SUCCESS; -! } -! -! bool idmanager_isMyAddress(open_addr_t* addr) { -! open_addr_t temp_my128bID; -! bool res; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! -! switch (addr->type) { -! case ADDR_16B: -! res= packetfunctions_sameAddress(addr,&idmanager_vars.my16bID); -! ENABLE_INTERRUPTS(); -! return res; -! case ADDR_64B: -! res= packetfunctions_sameAddress(addr,&idmanager_vars.my64bID); -! ENABLE_INTERRUPTS(); -! return res; -! case ADDR_128B: -! //build temporary my128bID -! temp_my128bID.type = ADDR_128B; -! memcpy(&temp_my128bID.addr_128b[0],&idmanager_vars.myPrefix.prefix,8); -! memcpy(&temp_my128bID.addr_128b[8],&idmanager_vars.my64bID.addr_64b,8); -! -! res= packetfunctions_sameAddress(addr,&temp_my128bID); -! ENABLE_INTERRUPTS(); -! return res; -! case ADDR_PANID: -! res= packetfunctions_sameAddress(addr,&idmanager_vars.myPANID); -! ENABLE_INTERRUPTS(); -! return res; -! case ADDR_PREFIX: -! res= packetfunctions_sameAddress(addr,&idmanager_vars.myPrefix); -! ENABLE_INTERRUPTS(); -! return res; -! default: -! openserial_printCritical(COMPONENT_IDMANAGER,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)addr->type, -! (errorparameter_t)2); -! ENABLE_INTERRUPTS(); -! return FALSE; -! } -! } -! -! void idmanager_triggerAboutRoot(void) { -! uint8_t number_bytes_from_input_buffer; -! uint8_t input_buffer; -! // get command from OpenSerial -! number_bytes_from_input_buffer = openserial_getInputBuffer(&input_buffer,sizeof(input_buffer)); -! if (number_bytes_from_input_buffer!=sizeof(input_buffer)) { -! openserial_printError(COMPONENT_IDMANAGER,ERR_INPUTBUFFER_LENGTH, -! (errorparameter_t)number_bytes_from_input_buffer, -! (errorparameter_t)0); -! return; -! }; -! // handle command -! switch (input_buffer) { -! case ACTION_YES: -! idmanager_setIsDAGroot(TRUE); -! break; -! case ACTION_NO: -! idmanager_setIsDAGroot(FALSE); -! break; -! case ACTION_TOGGLE: -! if (idmanager_getIsDAGroot()) { -! idmanager_setIsDAGroot(FALSE); -! } else { -! idmanager_setIsDAGroot(TRUE); -! } -! break; -! } -! return; -! } -! -! void idmanager_triggerAboutBridge(void) { -! uint8_t number_bytes_from_input_buffer; -! uint8_t input_buffer; -! //get command from OpenSerial -! number_bytes_from_input_buffer = openserial_getInputBuffer(&input_buffer,sizeof(input_buffer)); -! if (number_bytes_from_input_buffer!=sizeof(input_buffer)) { -! openserial_printError(COMPONENT_IDMANAGER,ERR_INPUTBUFFER_LENGTH, -! (errorparameter_t)number_bytes_from_input_buffer, -! (errorparameter_t)1); -! return; -! }; -! //handle command -! switch (input_buffer) { -! case ACTION_YES: -! idmanager_setIsBridge(TRUE); -! break; -! case ACTION_NO: -! idmanager_setIsBridge(FALSE); -! break; -! case ACTION_TOGGLE: -! if (idmanager_getIsBridge()) { -! idmanager_setIsBridge(FALSE); -! } else { -! idmanager_setIsBridge(TRUE); -! } -! break; -! } -! return; -! } -! -! /** -! \brief Trigger this module to print status information, over serial. -! -! debugPrint_* functions are used by the openserial module to continuously print -! status information about several modules in the OpenWSN stack. -! -! \returns TRUE if this function printed something, FALSE otherwise. -! */ -! bool debugPrint_id(void) { -! debugIDManagerEntry_t output; -! output.isDAGroot = idmanager_vars.isDAGroot; -! output.isBridge = idmanager_vars.isBridge; -! output.my16bID = idmanager_vars.my16bID; -! output.my64bID = idmanager_vars.my64bID; -! output.myPANID = idmanager_vars.myPANID; -! output.myPrefix = idmanager_vars.myPrefix; -! openserial_printStatus(STATUS_ID,(uint8_t*)&output,sizeof(debugIDManagerEntry_t)); -! return TRUE; -! } -! -! -! //=========================== private ========================================= -diff -crB openwsn/cross-layers/idmanager.h ../../../sys/net/openwsn/cross-layers/idmanager.h -*** openwsn/cross-layers/idmanager.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/cross-layers/idmanager.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,49 **** -! #ifndef __IDMANAGER_H -! #define __IDMANAGER_H -! -! /** -! \addtogroup cross-layers -! \{ -! \addtogroup IDManager -! \{ -! */ -! -! #include "openwsn.h" -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! typedef struct { -! bool isDAGroot; -! bool isBridge; -! open_addr_t my16bID; -! open_addr_t my64bID; -! open_addr_t myPANID; -! open_addr_t myPrefix; -! } debugIDManagerEntry_t; -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void idmanager_init(); -! bool idmanager_getIsDAGroot(); -! void idmanager_setIsDAGroot(bool newRole); -! bool idmanager_getIsBridge(); -! void idmanager_setIsBridge(bool newRole); -! open_addr_t* idmanager_getMyID(uint8_t type); -! error_t idmanager_setMyID(open_addr_t* newID); -! bool idmanager_isMyAddress(open_addr_t* addr); -! void idmanager_triggerAboutRoot(); -! void idmanager_triggerAboutBridge(); -! -! bool debugPrint_id(); -! -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,62 ---- -! #ifndef __IDMANAGER_H -! #define __IDMANAGER_H -! -! /** -! \addtogroup cross-layers -! \{ -! \addtogroup IDManager -! \{ -! */ -! -! #include "openwsn.h" -! -! //=========================== define ========================================== -! -! #define ACTION_YES 'Y' -! #define ACTION_NO 'N' -! #define ACTION_TOGGLE 'T' -! -! //=========================== typedef ========================================= -! -! typedef struct { -! bool isDAGroot; -! bool isBridge; -! open_addr_t my16bID; -! open_addr_t my64bID; -! open_addr_t myPANID; -! open_addr_t myPrefix; -! } debugIDManagerEntry_t; -! -! //=========================== module variables ================================ -! -! typedef struct { -! bool isDAGroot; -! bool isBridge; -! open_addr_t my16bID; -! open_addr_t my64bID; -! open_addr_t myPANID; -! open_addr_t myPrefix; -! } idmanager_vars_t; -! -! //=========================== prototypes ====================================== -! -! void idmanager_init(void); -! bool idmanager_getIsDAGroot(void); -! void idmanager_setIsDAGroot(bool newRole); -! bool idmanager_getIsBridge(void); -! void idmanager_setIsBridge(bool newRole); -! open_addr_t* idmanager_getMyID(uint8_t type); -! owerror_t idmanager_setMyID(open_addr_t* newID); -! bool idmanager_isMyAddress(open_addr_t* addr); -! void idmanager_triggerAboutRoot(void); -! void idmanager_triggerAboutBridge(void); -! -! bool debugPrint_id(void); -! -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/cross-layers/openqueue.c ../../../sys/net/openwsn/cross-layers/openqueue.c -*** openwsn/cross-layers/openqueue.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/cross-layers/openqueue.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,261 **** -! #include "openwsn.h" -! #include "openqueue.h" -! #include "openserial.h" -! #include "packetfunctions.h" -! #include "IEEE802154E.h" -! -! //=========================== variables ======================================= -! -! typedef struct { -! OpenQueueEntry_t queue[QUEUELENGTH]; -! } openqueue_vars_t; -! -! openqueue_vars_t openqueue_vars; -! -! //=========================== prototypes ====================================== -! -! void openqueue_reset_entry(OpenQueueEntry_t* entry); -! -! //=========================== public ========================================== -! -! //======= admin -! -! /** -! \brief Initialize this module. -! */ -! void openqueue_init() { -! uint8_t i; -! for (i=0;i<QUEUELENGTH;i++){ -! openqueue_reset_entry(&(openqueue_vars.queue[i])); -! } -! } -! -! /** -! \brief Trigger this module to print status information, over serial. -! -! debugPrint_* functions are used by the openserial module to continuously print -! status information about several modules in the OpenWSN stack. -! -! \returns TRUE if this function printed something, FALSE otherwise. -! */ -! bool debugPrint_queue() { -! debugOpenQueueEntry_t output[QUEUELENGTH]; -! uint8_t i; -! for (i=0;i<QUEUELENGTH;i++) { -! output[i].creator = openqueue_vars.queue[i].creator; -! output[i].owner = openqueue_vars.queue[i].owner; -! } -! openserial_printStatus(STATUS_QUEUE,(uint8_t*)&output,QUEUELENGTH*sizeof(debugOpenQueueEntry_t)); -! return TRUE; -! } -! -! //======= called by any component -! -! /** -! \brief Request a new (free) packet buffer. -! -! Component throughout the protocol stack can call this function is they want to -! get a new packet buffer to start creating a new packet. -! -! \note Once a packet has been allocated, it is up to the creator of the packet -! to free it using the openqueue_freePacketBuffer() function. -! -! \returns A pointer to the queue entry when it could be allocated, or NULL when -! it could not be allocated (buffer full or not synchronized). -! */ -! OpenQueueEntry_t* openqueue_getFreePacketBuffer(uint8_t creator) { -! uint8_t i; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! -! // refuse to allocate if we're not in sync -! if (ieee154e_isSynch()==FALSE && creator > COMPONENT_IEEE802154E){ -! ENABLE_INTERRUPTS(); -! return NULL; -! } -! -! // if you get here, I will try to allocate a buffer for you -! -! // walk through queue and find free entry -! for (i=0;i<QUEUELENGTH;i++) { -! if (openqueue_vars.queue[i].owner==COMPONENT_NULL) { -! openqueue_vars.queue[i].creator=creator; -! openqueue_vars.queue[i].owner=COMPONENT_OPENQUEUE; -! ENABLE_INTERRUPTS(); -! return &openqueue_vars.queue[i]; -! } -! } -! ENABLE_INTERRUPTS(); -! return NULL; -! } -! -! -! /** -! \brief Free a previously-allocated packet buffer. -! -! \param pkt A pointer to the previsouly-allocated packet buffer. -! -! \returns E_SUCCESS when the freeing was succeful. -! \returns E_FAIL when the module could not find the specified packet buffer. -! */ -! error_t openqueue_freePacketBuffer(OpenQueueEntry_t* pkt) { -! uint8_t i; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! for (i=0;i<QUEUELENGTH;i++) { -! if (&openqueue_vars.queue[i]==pkt) { -! if (openqueue_vars.queue[i].owner==COMPONENT_NULL) { -! // log the error -! openserial_printCritical(COMPONENT_OPENQUEUE,ERR_FREEING_UNUSED, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! openqueue_reset_entry(&(openqueue_vars.queue[i])); -! ENABLE_INTERRUPTS(); -! return E_SUCCESS; -! } -! } -! // log the error -! openserial_printCritical(COMPONENT_OPENQUEUE,ERR_FREEING_ERROR, -! (errorparameter_t)0, -! (errorparameter_t)0); -! ENABLE_INTERRUPTS(); -! return E_FAIL; -! } -! -! /** -! \brief Free all the packet buffers created by a specific module. -! -! \param owner The identifier of the component, taken in COMPONENT_*. -! */ -! void openqueue_removeAllCreatedBy(uint8_t creator) { -! uint8_t i; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! for (i=0;i<QUEUELENGTH;i++){ -! if (openqueue_vars.queue[i].creator==creator) { -! openqueue_reset_entry(&(openqueue_vars.queue[i])); -! } -! } -! ENABLE_INTERRUPTS(); -! } -! -! /** -! \brief Free all the packet buffers owned by a specific module. -! -! \param owner The identifier of the component, taken in COMPONENT_*. -! */ -! void openqueue_removeAllOwnedBy(uint8_t owner) { -! uint8_t i; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! for (i=0;i<QUEUELENGTH;i++){ -! if (openqueue_vars.queue[i].owner==owner) { -! openqueue_reset_entry(&(openqueue_vars.queue[i])); -! } -! } -! ENABLE_INTERRUPTS(); -! } -! -! //======= called by RES -! -! OpenQueueEntry_t* openqueue_resGetSentPacket() { -! uint8_t i; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! for (i=0;i<QUEUELENGTH;i++) { -! if (openqueue_vars.queue[i].owner==COMPONENT_IEEE802154E_TO_RES && -! openqueue_vars.queue[i].creator!=COMPONENT_IEEE802154E) { -! ENABLE_INTERRUPTS(); -! return &openqueue_vars.queue[i]; -! } -! } -! ENABLE_INTERRUPTS(); -! return NULL; -! } -! -! OpenQueueEntry_t* openqueue_resGetReceivedPacket() { -! uint8_t i; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! for (i=0;i<QUEUELENGTH;i++) { -! if (openqueue_vars.queue[i].owner==COMPONENT_IEEE802154E_TO_RES && -! openqueue_vars.queue[i].creator==COMPONENT_IEEE802154E) { -! ENABLE_INTERRUPTS(); -! return &openqueue_vars.queue[i]; -! } -! } -! ENABLE_INTERRUPTS(); -! return NULL; -! } -! -! //======= called by IEEE80215E -! -! OpenQueueEntry_t* openqueue_macGetDataPacket(open_addr_t* toNeighbor) { -! uint8_t i; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! if (toNeighbor->type==ADDR_64B) { -! // a neighbor is specified, look for a packet unicast to that neigbhbor -! for (i=0;i<QUEUELENGTH;i++) { -! if (openqueue_vars.queue[i].owner==COMPONENT_RES_TO_IEEE802154E && -! packetfunctions_sameAddress(toNeighbor,&openqueue_vars.queue[i].l2_nextORpreviousHop)) { -! ENABLE_INTERRUPTS(); -! return &openqueue_vars.queue[i]; -! } -! } -! } else if (toNeighbor->type==ADDR_ANYCAST) { -! // anycast case: look for a packet which is either not created by RES -! // or an KA (created by RES, but not broadcast) -! for (i=0;i<QUEUELENGTH;i++) { -! if (openqueue_vars.queue[i].owner==COMPONENT_RES_TO_IEEE802154E && -! ( openqueue_vars.queue[i].creator!=COMPONENT_RES || -! ( -! openqueue_vars.queue[i].creator==COMPONENT_RES && -! packetfunctions_isBroadcastMulticast(&(openqueue_vars.queue[i].l2_nextORpreviousHop))==FALSE -! ) -! ) -! ) { -! ENABLE_INTERRUPTS(); -! return &openqueue_vars.queue[i]; -! } -! } -! } -! ENABLE_INTERRUPTS(); -! return NULL; -! } -! -! OpenQueueEntry_t* openqueue_macGetAdvPacket() { -! uint8_t i; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! for (i=0;i<QUEUELENGTH;i++) { -! if (openqueue_vars.queue[i].owner==COMPONENT_RES_TO_IEEE802154E && -! openqueue_vars.queue[i].creator==COMPONENT_RES && -! packetfunctions_isBroadcastMulticast(&(openqueue_vars.queue[i].l2_nextORpreviousHop))) { -! ENABLE_INTERRUPTS(); -! return &openqueue_vars.queue[i]; -! } -! } -! ENABLE_INTERRUPTS(); -! return NULL; -! } -! -! //=========================== private ========================================= -! -! void openqueue_reset_entry(OpenQueueEntry_t* entry) { -! //admin -! entry->creator = COMPONENT_NULL; -! entry->owner = COMPONENT_NULL; -! entry->payload = &(entry->packet[127]); -! entry->length = 0; -! //l4 -! entry->l4_protocol = IANA_UNDEFINED; -! //l3 -! entry->l3_destinationAdd.type = ADDR_NONE; -! entry->l3_sourceAdd.type = ADDR_NONE; -! //l2 -! entry->l2_nextORpreviousHop.type = ADDR_NONE; -! entry->l2_frameType = IEEE154_TYPE_UNDEFINED; -! entry->l2_retriesLeft = 0; -! } ---- 1,257 ---- -! #include "openwsn.h" -! #include "openqueue.h" -! #include "openserial.h" -! #include "packetfunctions.h" -! #include "IEEE802154E.h" -! -! //=========================== variables ======================================= -! -! openqueue_vars_t openqueue_vars; -! -! //=========================== prototypes ====================================== -! -! void openqueue_reset_entry(OpenQueueEntry_t* entry); -! -! //=========================== public ========================================== -! -! //======= admin -! -! /** -! \brief Initialize this module. -! */ -! void openqueue_init(void) { -! uint8_t i; -! for (i=0;i<QUEUELENGTH;i++){ -! openqueue_reset_entry(&(openqueue_vars.queue[i])); -! } -! } -! -! /** -! \brief Trigger this module to print status information, over serial. -! -! debugPrint_* functions are used by the openserial module to continuously print -! status information about several modules in the OpenWSN stack. -! -! \returns TRUE if this function printed something, FALSE otherwise. -! */ -! bool debugPrint_queue(void) { -! debugOpenQueueEntry_t output[QUEUELENGTH]; -! uint8_t i; -! for (i=0;i<QUEUELENGTH;i++) { -! output[i].creator = openqueue_vars.queue[i].creator; -! output[i].owner = openqueue_vars.queue[i].owner; -! } -! openserial_printStatus(STATUS_QUEUE,(uint8_t*)&output,QUEUELENGTH*sizeof(debugOpenQueueEntry_t)); -! return TRUE; -! } -! -! //======= called by any component -! -! /** -! \brief Request a new (free) packet buffer. -! -! Component throughout the protocol stack can call this function is they want to -! get a new packet buffer to start creating a new packet. -! -! \note Once a packet has been allocated, it is up to the creator of the packet -! to free it using the openqueue_freePacketBuffer() function. -! -! \returns A pointer to the queue entry when it could be allocated, or NULL when -! it could not be allocated (buffer full or not synchronized). -! */ -! OpenQueueEntry_t* openqueue_getFreePacketBuffer(uint8_t creator) { -! uint8_t i; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! -! // refuse to allocate if we're not in sync -! if (ieee154e_isSynch()==FALSE && creator > COMPONENT_IEEE802154E){ -! ENABLE_INTERRUPTS(); -! return NULL; -! } -! -! // if you get here, I will try to allocate a buffer for you -! -! // walk through queue and find free entry -! for (i=0;i<QUEUELENGTH;i++) { -! if (openqueue_vars.queue[i].owner==COMPONENT_NULL) { -! openqueue_vars.queue[i].creator=creator; -! openqueue_vars.queue[i].owner=COMPONENT_OPENQUEUE; -! ENABLE_INTERRUPTS(); -! return &openqueue_vars.queue[i]; -! } -! } -! ENABLE_INTERRUPTS(); -! return NULL; -! } -! -! -! /** -! \brief Free a previously-allocated packet buffer. -! -! \param pkt A pointer to the previsouly-allocated packet buffer. -! -! \returns E_SUCCESS when the freeing was succeful. -! \returns E_FAIL when the module could not find the specified packet buffer. -! */ -! owerror_t openqueue_freePacketBuffer(OpenQueueEntry_t* pkt) { -! uint8_t i; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! for (i=0;i<QUEUELENGTH;i++) { -! if (&openqueue_vars.queue[i]==pkt) { -! if (openqueue_vars.queue[i].owner==COMPONENT_NULL) { -! // log the error -! openserial_printCritical(COMPONENT_OPENQUEUE,ERR_FREEING_UNUSED, -! (errorparameter_t)0, -! (errorparameter_t)0); -! } -! openqueue_reset_entry(&(openqueue_vars.queue[i])); -! ENABLE_INTERRUPTS(); -! return E_SUCCESS; -! } -! } -! // log the error -! openserial_printCritical(COMPONENT_OPENQUEUE,ERR_FREEING_ERROR, -! (errorparameter_t)0, -! (errorparameter_t)0); -! ENABLE_INTERRUPTS(); -! return E_FAIL; -! } -! -! /** -! \brief Free all the packet buffers created by a specific module. -! -! \param creator The identifier of the component, taken in COMPONENT_*. -! */ -! void openqueue_removeAllCreatedBy(uint8_t creator) { -! uint8_t i; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! for (i=0;i<QUEUELENGTH;i++){ -! if (openqueue_vars.queue[i].creator==creator) { -! openqueue_reset_entry(&(openqueue_vars.queue[i])); -! } -! } -! ENABLE_INTERRUPTS(); -! } -! -! /** -! \brief Free all the packet buffers owned by a specific module. -! -! \param owner The identifier of the component, taken in COMPONENT_*. -! */ -! void openqueue_removeAllOwnedBy(uint8_t owner) { -! uint8_t i; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! for (i=0;i<QUEUELENGTH;i++){ -! if (openqueue_vars.queue[i].owner==owner) { -! openqueue_reset_entry(&(openqueue_vars.queue[i])); -! } -! } -! ENABLE_INTERRUPTS(); -! } -! -! //======= called by RES -! -! OpenQueueEntry_t* openqueue_resGetSentPacket(void) { -! uint8_t i; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! for (i=0;i<QUEUELENGTH;i++) { -! if (openqueue_vars.queue[i].owner==COMPONENT_IEEE802154E_TO_RES && -! openqueue_vars.queue[i].creator!=COMPONENT_IEEE802154E) { -! ENABLE_INTERRUPTS(); -! return &openqueue_vars.queue[i]; -! } -! } -! ENABLE_INTERRUPTS(); -! return NULL; -! } -! -! OpenQueueEntry_t* openqueue_resGetReceivedPacket(void) { -! uint8_t i; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! for (i=0;i<QUEUELENGTH;i++) { -! if (openqueue_vars.queue[i].owner==COMPONENT_IEEE802154E_TO_RES && -! openqueue_vars.queue[i].creator==COMPONENT_IEEE802154E) { -! ENABLE_INTERRUPTS(); -! return &openqueue_vars.queue[i]; -! } -! } -! ENABLE_INTERRUPTS(); -! return NULL; -! } -! -! //======= called by IEEE80215E -! -! OpenQueueEntry_t* openqueue_macGetDataPacket(open_addr_t* toNeighbor) { -! uint8_t i; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! if (toNeighbor->type==ADDR_64B) { -! // a neighbor is specified, look for a packet unicast to that neigbhbor -! for (i=0;i<QUEUELENGTH;i++) { -! if (openqueue_vars.queue[i].owner==COMPONENT_RES_TO_IEEE802154E && -! packetfunctions_sameAddress(toNeighbor,&openqueue_vars.queue[i].l2_nextORpreviousHop)) { -! ENABLE_INTERRUPTS(); -! return &openqueue_vars.queue[i]; -! } -! } -! } else if (toNeighbor->type==ADDR_ANYCAST) { -! // anycast case: look for a packet which is either not created by RES -! // or an KA (created by RES, but not broadcast) -! for (i=0;i<QUEUELENGTH;i++) { -! if (openqueue_vars.queue[i].owner==COMPONENT_RES_TO_IEEE802154E && -! ( openqueue_vars.queue[i].creator!=COMPONENT_RES || -! ( -! openqueue_vars.queue[i].creator==COMPONENT_RES && -! packetfunctions_isBroadcastMulticast(&(openqueue_vars.queue[i].l2_nextORpreviousHop))==FALSE -! ) -! ) -! ) { -! ENABLE_INTERRUPTS(); -! return &openqueue_vars.queue[i]; -! } -! } -! } -! ENABLE_INTERRUPTS(); -! return NULL; -! } -! -! OpenQueueEntry_t* openqueue_macGetAdvPacket(void) { -! uint8_t i; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! for (i=0;i<QUEUELENGTH;i++) { -! if (openqueue_vars.queue[i].owner==COMPONENT_RES_TO_IEEE802154E && -! openqueue_vars.queue[i].creator==COMPONENT_RES && -! packetfunctions_isBroadcastMulticast(&(openqueue_vars.queue[i].l2_nextORpreviousHop))) { -! ENABLE_INTERRUPTS(); -! return &openqueue_vars.queue[i]; -! } -! } -! ENABLE_INTERRUPTS(); -! return NULL; -! } -! -! //=========================== private ========================================= -! -! void openqueue_reset_entry(OpenQueueEntry_t* entry) { -! //admin -! entry->creator = COMPONENT_NULL; -! entry->owner = COMPONENT_NULL; -! entry->payload = &(entry->packet[127]); -! entry->length = 0; -! //l4 -! entry->l4_protocol = IANA_UNDEFINED; -! //l3 -! entry->l3_destinationAdd.type = ADDR_NONE; -! entry->l3_sourceAdd.type = ADDR_NONE; -! //l2 -! entry->l2_nextORpreviousHop.type = ADDR_NONE; -! entry->l2_frameType = IEEE154_TYPE_UNDEFINED; -! entry->l2_retriesLeft = 0; -! } -diff -crB openwsn/cross-layers/openqueue.h ../../../sys/net/openwsn/cross-layers/openqueue.h -*** openwsn/cross-layers/openqueue.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/cross-layers/openqueue.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,49 **** -! #ifndef __OPENQUEUE_H -! #define __OPENQUEUE_H -! -! /** -! \addtogroup cross-layers -! \{ -! \addtogroup OpenQueue -! \{ -! */ -! -! #include "openwsn.h" -! #include "IEEE802154.h" -! -! //=========================== define ========================================== -! -! #define QUEUELENGTH 10 -! -! //=========================== typedef ========================================= -! -! typedef struct { -! uint8_t creator; -! uint8_t owner; -! } debugOpenQueueEntry_t; -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! // admin -! void openqueue_init(); -! bool debugPrint_queue(); -! // called by any component -! OpenQueueEntry_t* openqueue_getFreePacketBuffer(uint8_t creator); -! error_t openqueue_freePacketBuffer(OpenQueueEntry_t* pkt); -! void openqueue_removeAllCreatedBy(uint8_t creator); -! void openqueue_removeAllOwnedBy(uint8_t owner); -! // called by res -! OpenQueueEntry_t* openqueue_resGetSentPacket(); -! OpenQueueEntry_t* openqueue_resGetReceivedPacket(); -! // called by IEEE80215E -! OpenQueueEntry_t* openqueue_macGetDataPacket(open_addr_t* toNeighbor); -! OpenQueueEntry_t* openqueue_macGetAdvPacket(); -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,53 ---- -! #ifndef __OPENQUEUE_H -! #define __OPENQUEUE_H -! -! /** -! \addtogroup cross-layers -! \{ -! \addtogroup OpenQueue -! \{ -! */ -! -! #include "openwsn.h" -! #include "IEEE802154.h" -! -! //=========================== define ========================================== -! -! #define QUEUELENGTH 10 -! -! //=========================== typedef ========================================= -! -! typedef struct { -! uint8_t creator; -! uint8_t owner; -! } debugOpenQueueEntry_t; -! -! //=========================== module variables ================================ -! -! typedef struct { -! OpenQueueEntry_t queue[QUEUELENGTH]; -! } openqueue_vars_t; -! -! //=========================== prototypes ====================================== -! -! // admin -! void openqueue_init(void); -! bool debugPrint_queue(void); -! // called by any component -! OpenQueueEntry_t* openqueue_getFreePacketBuffer(uint8_t creator); -! owerror_t openqueue_freePacketBuffer(OpenQueueEntry_t* pkt); -! void openqueue_removeAllCreatedBy(uint8_t creator); -! void openqueue_removeAllOwnedBy(uint8_t owner); -! // called by res -! OpenQueueEntry_t* openqueue_resGetSentPacket(void); -! OpenQueueEntry_t* openqueue_resGetReceivedPacket(void); -! // called by IEEE80215E -! OpenQueueEntry_t* openqueue_macGetDataPacket(open_addr_t* toNeighbor); -! OpenQueueEntry_t* openqueue_macGetAdvPacket(void); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/cross-layers/openrandom.c ../../../sys/net/openwsn/cross-layers/openrandom.c -*** openwsn/cross-layers/openrandom.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/cross-layers/openrandom.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,38 **** -! #include "openwsn.h" -! #include "openrandom.h" -! #include "idmanager.h" -! -! //=========================== variables ======================================= -! -! typedef struct { -! uint16_t shift_reg; // Galois shift register used to obtain a pseudo-random number -! } random_vars_t; -! -! random_vars_t random_vars; -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void openrandom_init() { -! // seed the random number generator with the last 2 bytes of the MAC address -! random_vars.shift_reg = 0; -! random_vars.shift_reg += idmanager_getMyID(ADDR_16B)->addr_16b[0]*256; -! random_vars.shift_reg += idmanager_getMyID(ADDR_16B)->addr_16b[1]; -! } -! -! uint16_t openrandom_get16b() { -! uint8_t i; -! uint16_t random_value; -! random_value = 0; -! for(i=0;i<16;i++) { -! // Galois shift register -! // taps: 16 14 13 11 -! // characteristic polynomial: x^16 + x^14 + x^13 + x^11 + 1 -! random_value |= (random_vars.shift_reg & 0x01)<<i; -! random_vars.shift_reg = (random_vars.shift_reg>>1)^(-(int16_t)(random_vars.shift_reg & 1)&0xb400); -! } -! return random_value; -! } -! - //=========================== private ========================================= -\ No newline at end of file ---- 1,34 ---- -! #include "openwsn.h" -! #include "openrandom.h" -! #include "idmanager.h" -! -! //=========================== variables ======================================= -! -! random_vars_t random_vars; -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void openrandom_init(void) { -! // seed the random number generator with the last 2 bytes of the MAC address -! random_vars.shift_reg = 0; -! random_vars.shift_reg += idmanager_getMyID(ADDR_16B)->addr_16b[0]*256; -! random_vars.shift_reg += idmanager_getMyID(ADDR_16B)->addr_16b[1]; -! } -! -! uint16_t openrandom_get16b(void) { -! uint8_t i; -! uint16_t random_value; -! random_value = 0; -! for(i=0;i<16;i++) { -! // Galois shift register -! // taps: 16 14 13 11 -! // characteristic polynomial: x^16 + x^14 + x^13 + x^11 + 1 -! random_value |= (random_vars.shift_reg & 0x01)<<i; -! random_vars.shift_reg = (random_vars.shift_reg>>1)^(-(int16_t)(random_vars.shift_reg & 1)&0xb400); -! } -! return random_value; -! } -! - //=========================== private ========================================= -\ No newline at end of file -diff -crB openwsn/cross-layers/openrandom.h ../../../sys/net/openwsn/cross-layers/openrandom.h -*** openwsn/cross-layers/openrandom.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/cross-layers/openrandom.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,29 **** -! #ifndef __OPENRANDOM_H -! #define __OPENRANDOM_H -! -! /** -! \addtogroup helpers -! \{ -! \addtogroup Random -! \{ -! */ -! -! #include "openwsn.h" -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void openrandom_init(); -! uint16_t openrandom_get16b(); -! -! /** -! \} -! \} -! */ -! - #endif -\ No newline at end of file ---- 1,33 ---- -! #ifndef __OPENRANDOM_H -! #define __OPENRANDOM_H -! -! /** -! \addtogroup cross-layers -! \{ -! \addtogroup OpenRandom -! \{ -! */ -! -! #include "openwsn.h" -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== module variables ================================ -! -! typedef struct { -! uint16_t shift_reg; // Galois shift register used to obtain a pseudo-random number -! } random_vars_t; -! -! //=========================== prototypes ====================================== -! -! void openrandom_init(void); -! uint16_t openrandom_get16b(void); -! -! /** -! \} -! \} -! */ -! - #endif -\ No newline at end of file -diff -crB openwsn/cross-layers/packetfunctions.c ../../../sys/net/openwsn/cross-layers/packetfunctions.c -*** openwsn/cross-layers/packetfunctions.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/cross-layers/packetfunctions.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,447 **** -! #include "packetfunctions.h" -! #include "openserial.h" -! #include "idmanager.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void onesComplementSum(uint8_t* global_sum, uint8_t* ptr, int length); -! -! //=========================== public ========================================== -! -! //======= address translation -! -! //assuming an ip128b is a concatenation of prefix64b followed by a mac64b -! void packetfunctions_ip128bToMac64b( -! open_addr_t* ip128b, -! open_addr_t* prefix64btoWrite, -! open_addr_t* mac64btoWrite) { -! if (ip128b->type!=ADDR_128B) { -! openserial_printCritical(COMPONENT_PACKETFUNCTIONS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)ip128b->type, -! (errorparameter_t)0); -! mac64btoWrite->type=ADDR_NONE; -! return; -! } -! prefix64btoWrite->type=ADDR_PREFIX; -! memcpy(prefix64btoWrite->prefix, &(ip128b->addr_128b[0]), 8); -! mac64btoWrite->type=ADDR_64B; -! memcpy(mac64btoWrite->addr_64b , &(ip128b->addr_128b[8]), 8); -! } -! void packetfunctions_mac64bToIp128b( -! open_addr_t* prefix64b, -! open_addr_t* mac64b, -! open_addr_t* ip128bToWrite) { -! if (prefix64b->type!=ADDR_PREFIX || mac64b->type!=ADDR_64B) { -! openserial_printCritical(COMPONENT_PACKETFUNCTIONS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)prefix64b->type, -! (errorparameter_t)1); -! ip128bToWrite->type=ADDR_NONE; -! return; -! } -! ip128bToWrite->type=ADDR_128B; -! memcpy(&(ip128bToWrite->addr_128b[0]), &(prefix64b->prefix[0]), 8); -! memcpy(&(ip128bToWrite->addr_128b[8]), &(mac64b->addr_64b[0]), 8); -! } -! -! //assuming an mac16b is lower 2B of mac64b -! void packetfunctions_mac64bToMac16b(open_addr_t* mac64b, open_addr_t* mac16btoWrite) { -! if (mac64b->type!=ADDR_64B) { -! openserial_printCritical(COMPONENT_PACKETFUNCTIONS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)mac64b->type, -! (errorparameter_t)2); -! mac16btoWrite->type=ADDR_NONE; -! return; -! } -! mac16btoWrite->type = ADDR_16B; -! mac16btoWrite->addr_16b[0] = mac64b->addr_64b[6]; -! mac16btoWrite->addr_16b[1] = mac64b->addr_64b[7]; -! } -! void packetfunctions_mac16bToMac64b(open_addr_t* mac16b, open_addr_t* mac64btoWrite) { -! if (mac16b->type!=ADDR_16B) { -! openserial_printCritical(COMPONENT_PACKETFUNCTIONS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)mac16b->type, -! (errorparameter_t)3); -! mac64btoWrite->type=ADDR_NONE; -! return; -! } -! mac64btoWrite->type = ADDR_64B; -! mac64btoWrite->addr_64b[0] = 0; -! mac64btoWrite->addr_64b[1] = 0; -! mac64btoWrite->addr_64b[2] = 0; -! mac64btoWrite->addr_64b[3] = 0; -! mac64btoWrite->addr_64b[4] = 0; -! mac64btoWrite->addr_64b[5] = 0; -! mac64btoWrite->addr_64b[6] = mac16b->addr_16b[0]; -! mac64btoWrite->addr_64b[7] = mac16b->addr_16b[1]; -! } -! -! //======= address recognition -! -! bool packetfunctions_isBroadcastMulticast(open_addr_t* address) { -! uint8_t i; -! uint8_t address_length; -! //IPv6 multicast -! if (address->type==ADDR_128B) { -! if (address->addr_128b[0]==0xff) { -! return TRUE; -! } else { -! return FALSE; -! } -! } -! //15.4 broadcast -! switch (address->type) { -! case ADDR_16B: -! address_length = 2; -! break; -! case ADDR_64B: -! address_length = 8; -! break; -! default: -! openserial_printCritical(COMPONENT_PACKETFUNCTIONS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)address->type, -! (errorparameter_t)4); -! return FALSE; -! } -! for (i=0;i<address_length;i++) { -! if (address->addr_128b[i]!=0xFF) { -! return FALSE; -! } -! } -! return TRUE; -! } -! -! bool packetfunctions_isAllRoutersMulticast(open_addr_t* address) { -! if ( -! address->type == ADDR_128B && -! address->addr_128b[0] == 0xff && -! address->addr_128b[1] == 0x02 && -! address->addr_128b[2] == 0x00 && -! address->addr_128b[3] == 0x00 && -! address->addr_128b[4] == 0x00 && -! address->addr_128b[5] == 0x00 && -! address->addr_128b[6] == 0x00 && -! address->addr_128b[7] == 0x00 && -! address->addr_128b[8] == 0x00 && -! address->addr_128b[9] == 0x00 && -! address->addr_128b[10] == 0x00 && -! address->addr_128b[11] == 0x00 && -! address->addr_128b[12] == 0x00 && -! address->addr_128b[13] == 0x00 && -! address->addr_128b[14] == 0x00 && -! address->addr_128b[15] == 0x02 -! ) { -! return TRUE; -! } -! return FALSE; -! } -! -! bool packetfunctions_isAllHostsMulticast(open_addr_t* address) { -! if ( -! address->type == ADDR_128B && -! address->addr_128b[0] == 0xff && -! address->addr_128b[1] == 0x02 && -! address->addr_128b[2] == 0x00 && -! address->addr_128b[3] == 0x00 && -! address->addr_128b[4] == 0x00 && -! address->addr_128b[5] == 0x00 && -! address->addr_128b[6] == 0x00 && -! address->addr_128b[7] == 0x00 && -! address->addr_128b[8] == 0x00 && -! address->addr_128b[9] == 0x00 && -! address->addr_128b[10] == 0x00 && -! address->addr_128b[11] == 0x00 && -! address->addr_128b[12] == 0x00 && -! address->addr_128b[13] == 0x00 && -! address->addr_128b[14] == 0x00 && -! address->addr_128b[15] == 0x01 -! ) { -! return TRUE; -! } -! return FALSE; -! } -! -! bool packetfunctions_sameAddress(open_addr_t* address_1, open_addr_t* address_2) { -! uint8_t address_length; -! -! if (address_1->type!=address_2->type) { -! return FALSE; -! } -! switch (address_1->type) { -! case ADDR_16B: -! case ADDR_PANID: -! address_length = 2; -! break; -! case ADDR_64B: -! case ADDR_PREFIX: -! address_length = 8; -! break; -! case ADDR_128B: -! address_length = 16; -! break; -! default: -! openserial_printCritical(COMPONENT_PACKETFUNCTIONS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)address_1->type, -! (errorparameter_t)5); -! return FALSE; -! } -! if (memcmp((void*)address_1->addr_128b,(void*)address_2->addr_128b,address_length)==0) { -! return TRUE; -! } -! return FALSE; -! } -! -! //======= address read/write -! -! void packetfunctions_readAddress(uint8_t* payload, uint8_t type, open_addr_t* writeToAddress, bool littleEndian) { -! uint8_t i; -! uint8_t address_length; -! -! writeToAddress->type = type; -! switch (type) { -! case ADDR_16B: -! case ADDR_PANID: -! address_length = 2; -! break; -! case ADDR_64B: -! case ADDR_PREFIX: -! address_length = 8; -! break; -! case ADDR_128B: -! address_length = 16; -! break; -! default: -! openserial_printCritical(COMPONENT_PACKETFUNCTIONS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)type, -! (errorparameter_t)6); -! return; -! } -! -! for (i=0;i<address_length;i++) { -! if (littleEndian) { -! writeToAddress->addr_128b[address_length-1-i] = *(payload+i); -! } else { -! writeToAddress->addr_128b[i] = *(payload+i); -! } -! } -! } -! -! void packetfunctions_writeAddress(OpenQueueEntry_t* msg, open_addr_t* address, bool littleEndian) { -! uint8_t i; -! uint8_t address_length; -! -! switch (address->type) { -! case ADDR_16B: -! case ADDR_PANID: -! address_length = 2; -! break; -! case ADDR_64B: -! case ADDR_PREFIX: -! address_length = 8; -! break; -! case ADDR_128B: -! address_length = 16; -! break; -! default: -! openserial_printCritical(COMPONENT_PACKETFUNCTIONS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)address->type, -! (errorparameter_t)7); -! return; -! } -! -! for (i=0;i<address_length;i++) { -! msg->payload -= sizeof(uint8_t); -! msg->length += sizeof(uint8_t); -! if (littleEndian) { -! *((uint8_t*)(msg->payload)) = address->addr_128b[i]; -! } else { -! *((uint8_t*)(msg->payload)) = address->addr_128b[address_length-1-i]; -! } -! } -! } -! -! //======= reserving/tossing headers -! -! void packetfunctions_reserveHeaderSize(OpenQueueEntry_t* pkt, uint8_t header_length) { -! pkt->payload -= header_length; -! pkt->length += header_length; -! if ( (uint8_t*)(pkt->payload) < (uint8_t*)(pkt->packet) ) { -! openserial_printError(COMPONENT_PACKETFUNCTIONS,ERR_HEADER_TOO_LONG, -! (errorparameter_t)0, -! (errorparameter_t)pkt->length); -! } -! } -! -! void packetfunctions_tossHeader(OpenQueueEntry_t* pkt, uint8_t header_length) { -! pkt->payload += header_length; -! pkt->length -= header_length; -! if ( (uint8_t*)(pkt->payload) > (uint8_t*)(pkt->packet+126) ) { -! openserial_printError(COMPONENT_PACKETFUNCTIONS,ERR_HEADER_TOO_LONG, -! (errorparameter_t)1, -! (errorparameter_t)pkt->length); -! } -! } -! -! void packetfunctions_reserveFooterSize(OpenQueueEntry_t* pkt, uint8_t header_length) { -! pkt->length += header_length; -! if (pkt->length>127) { -! openserial_printError(COMPONENT_PACKETFUNCTIONS,ERR_HEADER_TOO_LONG, -! (errorparameter_t)2, -! (errorparameter_t)pkt->length); -! } -! } -! -! void packetfunctions_tossFooter(OpenQueueEntry_t* pkt, uint8_t header_length) { -! pkt->length -= header_length; -! if (pkt->length>128) {//wraps around, so a negative value will be >128 -! openserial_printError(COMPONENT_PACKETFUNCTIONS,ERR_HEADER_TOO_LONG, -! (errorparameter_t)3, -! (errorparameter_t)pkt->length); -! } -! } -! -! //======= CRC calculation -! -! void packetfunctions_calculateCRC(OpenQueueEntry_t* msg) { -! uint16_t crc; -! uint8_t i; -! uint8_t count; -! crc = 0; -! for (count=1;count<msg->length-2;count++) { -! crc = crc ^ (uint8_t)*(msg->payload+count); -! //crc = crc ^ (uint16_t)*ptr++ << 8; -! for (i=0;i<8;i++) { -! if (crc & 0x1) { -! crc = crc >> 1 ^ 0x8408; -! } else { -! crc = crc >> 1; -! } -! } -! } -! *(msg->payload+(msg->length-2)) = crc%256; -! *(msg->payload+(msg->length-1)) = crc/256; -! } -! -! bool packetfunctions_checkCRC(OpenQueueEntry_t* msg) { -! uint16_t crc; -! uint8_t i; -! uint8_t count; -! crc = 0; -! for (count=0;count<msg->length-2;count++) { -! crc = crc ^ (uint8_t)*(msg->payload+count); -! //crc = crc ^ (uint16_t)*ptr++ << 8; -! for (i=0;i<8;i++) { -! if (crc & 0x1) { -! crc = crc >> 1 ^ 0x8408; -! } else { -! crc = crc >> 1; -! } -! } -! } -! if (*(msg->payload+(msg->length-2))==crc%256 && -! *(msg->payload+(msg->length-1))==crc/256) { -! return TRUE; -! } else { -! return FALSE; -! } -! } -! -! //======= checksum calculation -! -! //see http://www-net.cs.umass.edu/kurose/transport/UDP.html, or http://tools.ietf.org/html/rfc1071 -! //see http://en.wikipedia.org/wiki/User_Datagram_Protocol#IPv6_PSEUDO-HEADER -! void packetfunctions_calculateChecksum(OpenQueueEntry_t* msg, uint8_t* checksum_ptr) { -! open_addr_t temp_dest_prefix; -! open_addr_t temp_dest_mac64b; -! uint8_t temp_checksum[2]; -! uint8_t little_helper[2]; -! //initialization -! temp_checksum[0] = 0; -! temp_checksum[1] = 0; -! *checksum_ptr = 0; -! *(checksum_ptr+1) = 0; -! //source/destination address -! packetfunctions_ip128bToMac64b(&(msg->l3_destinationAdd),&temp_dest_prefix,&temp_dest_mac64b); -! if (packetfunctions_sameAddress(&temp_dest_prefix,idmanager_getMyID(ADDR_PREFIX))) { -! little_helper[0] = 0xfe; -! little_helper[1] = 0x80; -! //source address prefix -! onesComplementSum(temp_checksum,little_helper,2); -! //source address EUI -! onesComplementSum(temp_checksum,(idmanager_getMyID(ADDR_64B))->addr_64b,8); -! //destination address prefix (fe:80) -! onesComplementSum(temp_checksum,little_helper,2); -! //destination address EUI -! onesComplementSum(temp_checksum,temp_dest_mac64b.addr_64b,8); -! } else { -! //source address prefix -! onesComplementSum(temp_checksum,(idmanager_getMyID(ADDR_PREFIX))->prefix,8); -! //source address EUI -! onesComplementSum(temp_checksum,(idmanager_getMyID(ADDR_64B))->addr_64b,8); -! //destination address -! onesComplementSum(temp_checksum,msg->l3_destinationAdd.addr_128b,16); -! } -! //length -! little_helper[0] = 0; -! little_helper[1] = msg->length; -! onesComplementSum(temp_checksum,little_helper,2); -! //next header -! little_helper[0] = 0; -! little_helper[1] = msg->l4_protocol; -! onesComplementSum(temp_checksum,little_helper,2); -! //ICMPv6 packet -! onesComplementSum(temp_checksum,msg->payload,msg->length); -! temp_checksum[0] ^= 0xFF; -! temp_checksum[1] ^= 0xFF; -! //write in packet -! *checksum_ptr = temp_checksum[0]; -! *(checksum_ptr+1) = temp_checksum[1]; -! } -! -! void onesComplementSum(uint8_t* global_sum, uint8_t* ptr, int length) { -! uint32_t sum = 0xFFFF & (global_sum[0]<<8 | global_sum[1]); -! while (length>1) { -! sum += 0xFFFF & (*ptr<<8 | *(ptr+1)); -! ptr += 2; -! length -= 2; -! } -! if (length) { -! sum += (0xFF & *ptr)<<8; -! } -! while (sum>>16) { -! sum = (sum & 0xFFFF)+(sum >> 16); -! } -! global_sum[0] = (sum>>8) & 0xFF; -! global_sum[1] = sum & 0xFF; -! } -! -! //======= endianness -! -! void packetfunctions_htons( uint16_t val, uint8_t* dest ) { -! dest[0] = (val & 0xff00) >> 8; -! dest[1] = (val & 0x00ff); -! } -! -! uint16_t packetfunctions_ntohs( uint8_t* src ) { -! return (((uint16_t) src[0]) << 8) | -! (((uint16_t) src[1]) -! ); -! } -! -! void packetfunctions_htonl( uint32_t val, uint8_t* dest ) { -! dest[0] = (val & 0xff000000) >> 24; -! dest[1] = (val & 0x00ff0000) >> 16; -! dest[2] = (val & 0x0000ff00) >> 8; -! dest[3] = (val & 0x000000ff); -! } -! -! uint32_t packetfunctions_ntohl( uint8_t* src ) { -! return (((uint32_t) src[0]) << 24) | -! (((uint32_t) src[1]) << 16) | -! (((uint32_t) src[2]) << 8) | -! (((uint32_t) src[3]) -! ); -! } -! - //=========================== private ========================================= -\ No newline at end of file ---- 1,444 ---- -! #include "packetfunctions.h" -! #include "openserial.h" -! #include "idmanager.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void onesComplementSum(uint8_t* global_sum, uint8_t* ptr, int length); -! -! //=========================== public ========================================== -! -! //======= address translation -! -! //assuming an ip128b is a concatenation of prefix64b followed by a mac64b -! void packetfunctions_ip128bToMac64b( -! open_addr_t* ip128b, -! open_addr_t* prefix64btoWrite, -! open_addr_t* mac64btoWrite) { -! if (ip128b->type!=ADDR_128B) { -! openserial_printCritical(COMPONENT_PACKETFUNCTIONS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)ip128b->type, -! (errorparameter_t)0); -! mac64btoWrite->type=ADDR_NONE; -! return; -! } -! prefix64btoWrite->type=ADDR_PREFIX; -! memcpy(prefix64btoWrite->prefix, &(ip128b->addr_128b[0]), 8); -! mac64btoWrite->type=ADDR_64B; -! memcpy(mac64btoWrite->addr_64b , &(ip128b->addr_128b[8]), 8); -! } -! void packetfunctions_mac64bToIp128b( -! open_addr_t* prefix64b, -! open_addr_t* mac64b, -! open_addr_t* ip128bToWrite) { -! if (prefix64b->type!=ADDR_PREFIX || mac64b->type!=ADDR_64B) { -! openserial_printCritical(COMPONENT_PACKETFUNCTIONS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)prefix64b->type, -! (errorparameter_t)1); -! ip128bToWrite->type=ADDR_NONE; -! return; -! } -! ip128bToWrite->type=ADDR_128B; -! memcpy(&(ip128bToWrite->addr_128b[0]), &(prefix64b->prefix[0]), 8); -! memcpy(&(ip128bToWrite->addr_128b[8]), &(mac64b->addr_64b[0]), 8); -! } -! -! //assuming an mac16b is lower 2B of mac64b -! void packetfunctions_mac64bToMac16b(open_addr_t* mac64b, open_addr_t* mac16btoWrite) { -! if (mac64b->type!=ADDR_64B) { -! openserial_printCritical(COMPONENT_PACKETFUNCTIONS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)mac64b->type, -! (errorparameter_t)2); -! mac16btoWrite->type=ADDR_NONE; -! return; -! } -! mac16btoWrite->type = ADDR_16B; -! mac16btoWrite->addr_16b[0] = mac64b->addr_64b[6]; -! mac16btoWrite->addr_16b[1] = mac64b->addr_64b[7]; -! } -! void packetfunctions_mac16bToMac64b(open_addr_t* mac16b, open_addr_t* mac64btoWrite) { -! if (mac16b->type!=ADDR_16B) { -! openserial_printCritical(COMPONENT_PACKETFUNCTIONS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)mac16b->type, -! (errorparameter_t)3); -! mac64btoWrite->type=ADDR_NONE; -! return; -! } -! mac64btoWrite->type = ADDR_64B; -! mac64btoWrite->addr_64b[0] = 0; -! mac64btoWrite->addr_64b[1] = 0; -! mac64btoWrite->addr_64b[2] = 0; -! mac64btoWrite->addr_64b[3] = 0; -! mac64btoWrite->addr_64b[4] = 0; -! mac64btoWrite->addr_64b[5] = 0; -! mac64btoWrite->addr_64b[6] = mac16b->addr_16b[0]; -! mac64btoWrite->addr_64b[7] = mac16b->addr_16b[1]; -! } -! -! //======= address recognition -! -! bool packetfunctions_isBroadcastMulticast(open_addr_t* address) { -! uint8_t i; -! uint8_t address_length; -! //IPv6 multicast -! if (address->type==ADDR_128B) { -! if (address->addr_128b[0]==0xff) { -! return TRUE; -! } else { -! return FALSE; -! } -! } -! //15.4 broadcast -! switch (address->type) { -! case ADDR_16B: -! address_length = 2; -! break; -! case ADDR_64B: -! address_length = 8; -! break; -! default: -! openserial_printCritical(COMPONENT_PACKETFUNCTIONS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)address->type, -! (errorparameter_t)4); -! return FALSE; -! } -! for (i=0;i<address_length;i++) { -! if (address->addr_128b[i]!=0xFF) { -! return FALSE; -! } -! } -! return TRUE; -! } -! -! bool packetfunctions_isAllRoutersMulticast(open_addr_t* address) { -! if ( -! address->type == ADDR_128B && -! address->addr_128b[0] == 0xff && -! address->addr_128b[1] == 0x02 && -! address->addr_128b[2] == 0x00 && -! address->addr_128b[3] == 0x00 && -! address->addr_128b[4] == 0x00 && -! address->addr_128b[5] == 0x00 && -! address->addr_128b[6] == 0x00 && -! address->addr_128b[7] == 0x00 && -! address->addr_128b[8] == 0x00 && -! address->addr_128b[9] == 0x00 && -! address->addr_128b[10] == 0x00 && -! address->addr_128b[11] == 0x00 && -! address->addr_128b[12] == 0x00 && -! address->addr_128b[13] == 0x00 && -! address->addr_128b[14] == 0x00 && -! address->addr_128b[15] == 0x02 -! ) { -! return TRUE; -! } -! return FALSE; -! } -! -! bool packetfunctions_isAllHostsMulticast(open_addr_t* address) { -! if ( -! address->type == ADDR_128B && -! address->addr_128b[0] == 0xff && -! address->addr_128b[1] == 0x02 && -! address->addr_128b[2] == 0x00 && -! address->addr_128b[3] == 0x00 && -! address->addr_128b[4] == 0x00 && -! address->addr_128b[5] == 0x00 && -! address->addr_128b[6] == 0x00 && -! address->addr_128b[7] == 0x00 && -! address->addr_128b[8] == 0x00 && -! address->addr_128b[9] == 0x00 && -! address->addr_128b[10] == 0x00 && -! address->addr_128b[11] == 0x00 && -! address->addr_128b[12] == 0x00 && -! address->addr_128b[13] == 0x00 && -! address->addr_128b[14] == 0x00 && -! address->addr_128b[15] == 0x01 -! ) { -! return TRUE; -! } -! return FALSE; -! } -! -! bool packetfunctions_sameAddress(open_addr_t* address_1, open_addr_t* address_2) { -! uint8_t address_length; -! -! if (address_1->type!=address_2->type) { -! return FALSE; -! } -! switch (address_1->type) { -! case ADDR_16B: -! case ADDR_PANID: -! address_length = 2; -! break; -! case ADDR_64B: -! case ADDR_PREFIX: -! address_length = 8; -! break; -! case ADDR_128B: -! case ADDR_ANYCAST: -! address_length = 16; -! break; -! -! default: -! openserial_printCritical(COMPONENT_PACKETFUNCTIONS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)address_1->type, -! (errorparameter_t)5); -! return FALSE; -! } -! if (memcmp((void*)address_1->addr_128b,(void*)address_2->addr_128b,address_length)==0) { -! return TRUE; -! } -! return FALSE; -! } -! -! //======= address read/write -! -! void packetfunctions_readAddress(uint8_t* payload, uint8_t type, open_addr_t* writeToAddress, bool littleEndian) { -! uint8_t i; -! uint8_t address_length; -! -! writeToAddress->type = type; -! switch (type) { -! case ADDR_16B: -! case ADDR_PANID: -! address_length = 2; -! break; -! case ADDR_64B: -! case ADDR_PREFIX: -! address_length = 8; -! break; -! case ADDR_128B: -! address_length = 16; -! break; -! default: -! openserial_printCritical(COMPONENT_PACKETFUNCTIONS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)type, -! (errorparameter_t)6); -! return; -! } -! -! for (i=0;i<address_length;i++) { -! if (littleEndian) { -! writeToAddress->addr_128b[address_length-1-i] = *(payload+i); -! } else { -! writeToAddress->addr_128b[i] = *(payload+i); -! } -! } -! } -! -! void packetfunctions_writeAddress(OpenQueueEntry_t* msg, open_addr_t* address, bool littleEndian) { -! uint8_t i; -! uint8_t address_length; -! -! switch (address->type) { -! case ADDR_16B: -! case ADDR_PANID: -! address_length = 2; -! break; -! case ADDR_64B: -! case ADDR_PREFIX: -! address_length = 8; -! break; -! case ADDR_128B: -! address_length = 16; -! break; -! default: -! openserial_printCritical(COMPONENT_PACKETFUNCTIONS,ERR_WRONG_ADDR_TYPE, -! (errorparameter_t)address->type, -! (errorparameter_t)7); -! return; -! } -! -! for (i=0;i<address_length;i++) { -! msg->payload -= sizeof(uint8_t); -! msg->length += sizeof(uint8_t); -! if (littleEndian) { -! *((uint8_t*)(msg->payload)) = address->addr_128b[i]; -! } else { -! *((uint8_t*)(msg->payload)) = address->addr_128b[address_length-1-i]; -! } -! } -! } -! -! //======= reserving/tossing headers -! -! void packetfunctions_reserveHeaderSize(OpenQueueEntry_t* pkt, uint8_t header_length) { -! pkt->payload -= header_length; -! pkt->length += header_length; -! if ( (uint8_t*)(pkt->payload) < (uint8_t*)(pkt->packet) ) { -! openserial_printCritical(COMPONENT_PACKETFUNCTIONS,ERR_HEADER_TOO_LONG, -! (errorparameter_t)0, -! (errorparameter_t)pkt->length); -! } -! } -! -! void packetfunctions_tossHeader(OpenQueueEntry_t* pkt, uint8_t header_length) { -! pkt->payload += header_length; -! pkt->length -= header_length; -! if ( (uint8_t*)(pkt->payload) > (uint8_t*)(pkt->packet+126) ) { -! openserial_printError(COMPONENT_PACKETFUNCTIONS,ERR_HEADER_TOO_LONG, -! (errorparameter_t)1, -! (errorparameter_t)pkt->length); -! } -! } -! -! void packetfunctions_reserveFooterSize(OpenQueueEntry_t* pkt, uint8_t header_length) { -! pkt->length += header_length; -! if (pkt->length>127) { -! openserial_printError(COMPONENT_PACKETFUNCTIONS,ERR_HEADER_TOO_LONG, -! (errorparameter_t)2, -! (errorparameter_t)pkt->length); -! } -! } -! -! void packetfunctions_tossFooter(OpenQueueEntry_t* pkt, uint8_t header_length) { -! pkt->length -= header_length; -! if (pkt->length>128) {//wraps around, so a negative value will be >128 -! openserial_printError(COMPONENT_PACKETFUNCTIONS,ERR_HEADER_TOO_LONG, -! (errorparameter_t)3, -! (errorparameter_t)pkt->length); -! } -! } -! -! //======= CRC calculation -! -! void packetfunctions_calculateCRC(OpenQueueEntry_t* msg) { -! uint16_t crc; -! uint8_t i; -! uint8_t count; -! crc = 0; -! for (count=1;count<msg->length-2;count++) { -! crc = crc ^ (uint8_t)*(msg->payload+count); -! //crc = crc ^ (uint16_t)*ptr++ << 8; -! for (i=0;i<8;i++) { -! if (crc & 0x1) { -! crc = crc >> 1 ^ 0x8408; -! } else { -! crc = crc >> 1; -! } -! } -! } -! *(msg->payload+(msg->length-2)) = crc%256; -! *(msg->payload+(msg->length-1)) = crc/256; -! } -! -! bool packetfunctions_checkCRC(OpenQueueEntry_t* msg) { -! uint16_t crc; -! uint8_t i; -! uint8_t count; -! crc = 0; -! for (count=0;count<msg->length-2;count++) { -! crc = crc ^ (uint8_t)*(msg->payload+count); -! //crc = crc ^ (uint16_t)*ptr++ << 8; -! for (i=0;i<8;i++) { -! if (crc & 0x1) { -! crc = crc >> 1 ^ 0x8408; -! } else { -! crc = crc >> 1; -! } -! } -! } -! if (*(msg->payload+(msg->length-2))==crc%256 && -! *(msg->payload+(msg->length-1))==crc/256) { -! return TRUE; -! } else { -! return FALSE; -! } -! } -! -! //======= checksum calculation -! -! //see http://www-net.cs.umass.edu/kurose/transport/UDP.html, or http://tools.ietf.org/html/rfc1071 -! //see http://en.wikipedia.org/wiki/User_Datagram_Protocol#IPv6_PSEUDO-HEADER -! void packetfunctions_calculateChecksum(OpenQueueEntry_t* msg, uint8_t* checksum_ptr) { -! uint8_t temp_checksum[2]; -! uint8_t little_helper[2]; -! -! // initialize running checksum -! temp_checksum[0] = 0; -! temp_checksum[1] = 0; -! -! //===== IPv6 pseudo header -! -! // source address (prefix and EUI64) -! onesComplementSum(temp_checksum,(idmanager_getMyID(ADDR_PREFIX))->prefix,8); -! onesComplementSum(temp_checksum,(idmanager_getMyID(ADDR_64B))->addr_64b,8); -! -! // destination address -! onesComplementSum(temp_checksum,msg->l3_destinationAdd.addr_128b,16); -! -! // length -! little_helper[0] = 0; -! little_helper[1] = msg->length; -! onesComplementSum(temp_checksum,little_helper,2); -! -! // next header -! little_helper[0] = 0; -! little_helper[1] = msg->l4_protocol; -! onesComplementSum(temp_checksum,little_helper,2); -! -! //===== payload -! -! // reset the checksum currently in the payload -! *checksum_ptr = 0; -! *(checksum_ptr+1) = 0; -! -! onesComplementSum(temp_checksum,msg->payload,msg->length); -! temp_checksum[0] ^= 0xFF; -! temp_checksum[1] ^= 0xFF; -! -! //write in packet -! *checksum_ptr = temp_checksum[0]; -! *(checksum_ptr+1) = temp_checksum[1]; -! } -! -! -! void onesComplementSum(uint8_t* global_sum, uint8_t* ptr, int length) { -! uint32_t sum = 0xFFFF & (global_sum[0]<<8 | global_sum[1]); -! while (length>1) { -! sum += 0xFFFF & (*ptr<<8 | *(ptr+1)); -! ptr += 2; -! length -= 2; -! } -! if (length) { -! sum += (0xFF & *ptr)<<8; -! } -! while (sum>>16) { -! sum = (sum & 0xFFFF)+(sum >> 16); -! } -! global_sum[0] = (sum>>8) & 0xFF; -! global_sum[1] = sum & 0xFF; -! } -! -! //======= endianness -! -! void packetfunctions_htons( uint16_t val, uint8_t* dest ) { -! dest[0] = (val & 0xff00) >> 8; -! dest[1] = (val & 0x00ff); -! } -! -! uint16_t packetfunctions_ntohs( uint8_t* src ) { -! return (((uint16_t) src[0]) << 8) | -! (((uint16_t) src[1]) -! ); -! } -! -! void packetfunctions_htonl( uint32_t val, uint8_t* dest ) { -! dest[0] = (val & 0xff000000) >> 24; -! dest[1] = (val & 0x00ff0000) >> 16; -! dest[2] = (val & 0x0000ff00) >> 8; -! dest[3] = (val & 0x000000ff); -! } -! -! uint32_t packetfunctions_ntohl( uint8_t* src ) { -! return (((uint32_t) src[0]) << 24) | -! (((uint32_t) src[1]) << 16) | -! (((uint32_t) src[2]) << 8) | -! (((uint32_t) src[3]) -! ); -! } -! - //=========================== private ========================================= -\ No newline at end of file -diff -crB openwsn/cross-layers/packetfunctions.h ../../../sys/net/openwsn/cross-layers/packetfunctions.h -*** openwsn/cross-layers/packetfunctions.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/cross-layers/packetfunctions.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,61 **** -! #ifndef __PACKETFUNCTIONS_H -! #define __PACKETFUNCTIONS_H -! -! /** -! \addtogroup helpers -! \{ -! \addtogroup PacketFunctions -! \{ -! */ -! -! #include "openwsn.h" -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! // address translation -! void packetfunctions_ip128bToMac64b(open_addr_t* ip128b,open_addr_t* prefix64btoWrite,open_addr_t* mac64btoWrite); -! void packetfunctions_mac64bToIp128b(open_addr_t* prefix64b,open_addr_t* mac64b,open_addr_t* ip128bToWrite); -! void packetfunctions_mac64bToMac16b(open_addr_t* mac64b, open_addr_t* mac16btoWrite); -! void packetfunctions_mac16bToMac64b(open_addr_t* mac16b, open_addr_t* mac64btoWrite); -! -! // address recognition -! bool packetfunctions_isBroadcastMulticast(open_addr_t* address); -! bool packetfunctions_isAllRoutersMulticast(open_addr_t* address); -! bool packetfunctions_isAllHostsMulticast(open_addr_t* address); -! bool packetfunctions_sameAddress(open_addr_t* address_1, open_addr_t* address_2); -! -! // read/write addresses to/from packets -! void packetfunctions_readAddress(uint8_t* payload, uint8_t type, open_addr_t* writeToAddress, bool littleEndian); -! void packetfunctions_writeAddress(OpenQueueEntry_t* msg, open_addr_t* address, bool littleEndian); -! -! // reserving/tossing headers and footers -! void packetfunctions_reserveHeaderSize(OpenQueueEntry_t* pkt, uint8_t header_length); -! void packetfunctions_tossHeader(OpenQueueEntry_t* pkt, uint8_t header_length); -! void packetfunctions_reserveFooterSize(OpenQueueEntry_t* pkt, uint8_t header_length); -! void packetfunctions_tossFooter(OpenQueueEntry_t* pkt, uint8_t header_length); -! -! // calculate CRC -! void packetfunctions_calculateCRC(OpenQueueEntry_t* msg); -! bool packetfunctions_checkCRC(OpenQueueEntry_t* msg); -! -! // calculate checksum -! void packetfunctions_calculateChecksum(OpenQueueEntry_t* msg, uint8_t* checksum_ptr); -! -! // endianness -! void packetfunctions_htons( uint16_t val, uint8_t* dest ); -! uint16_t packetfunctions_ntohs( uint8_t* src ); -! void packetfunctions_htonl( uint32_t val, uint8_t* dest ); -! uint32_t packetfunctions_ntohl( uint8_t* src ); -! -! /** -! \} -! \} -! */ -! - #endif -\ No newline at end of file ---- 1,61 ---- -! #ifndef __PACKETFUNCTIONS_H -! #define __PACKETFUNCTIONS_H -! -! /** -! \addtogroup cross-layers -! \{ -! \addtogroup PacketFunctions -! \{ -! */ -! -! #include "openwsn.h" -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! // address translation -! void packetfunctions_ip128bToMac64b(open_addr_t* ip128b,open_addr_t* prefix64btoWrite,open_addr_t* mac64btoWrite); -! void packetfunctions_mac64bToIp128b(open_addr_t* prefix64b,open_addr_t* mac64b,open_addr_t* ip128bToWrite); -! void packetfunctions_mac64bToMac16b(open_addr_t* mac64b, open_addr_t* mac16btoWrite); -! void packetfunctions_mac16bToMac64b(open_addr_t* mac16b, open_addr_t* mac64btoWrite); -! -! // address recognition -! bool packetfunctions_isBroadcastMulticast(open_addr_t* address); -! bool packetfunctions_isAllRoutersMulticast(open_addr_t* address); -! bool packetfunctions_isAllHostsMulticast(open_addr_t* address); -! bool packetfunctions_sameAddress(open_addr_t* address_1, open_addr_t* address_2); -! -! // read/write addresses to/from packets -! void packetfunctions_readAddress(uint8_t* payload, uint8_t type, open_addr_t* writeToAddress, bool littleEndian); -! void packetfunctions_writeAddress(OpenQueueEntry_t* msg, open_addr_t* address, bool littleEndian); -! -! // reserving/tossing headers and footers -! void packetfunctions_reserveHeaderSize(OpenQueueEntry_t* pkt, uint8_t header_length); -! void packetfunctions_tossHeader(OpenQueueEntry_t* pkt, uint8_t header_length); -! void packetfunctions_reserveFooterSize(OpenQueueEntry_t* pkt, uint8_t header_length); -! void packetfunctions_tossFooter(OpenQueueEntry_t* pkt, uint8_t header_length); -! -! // calculate CRC -! void packetfunctions_calculateCRC(OpenQueueEntry_t* msg); -! bool packetfunctions_checkCRC(OpenQueueEntry_t* msg); -! -! // calculate checksum -! void packetfunctions_calculateChecksum(OpenQueueEntry_t* msg, uint8_t* checksum_ptr); -! -! // endianness -! void packetfunctions_htons( uint16_t val, uint8_t* dest ); -! uint16_t packetfunctions_ntohs( uint8_t* src ); -! void packetfunctions_htonl( uint32_t val, uint8_t* dest ); -! uint32_t packetfunctions_ntohl( uint8_t* src ); -! -! /** -! \} -! \} -! */ -! - #endif -\ No newline at end of file -diff -crB openwsn/debugpins.c ../../../sys/net/openwsn/debugpins.c -*** openwsn/debugpins.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/debugpins.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,93 **** -! /** -! \brief TelosB-specific definition of the "debugpins" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #include "msp430f1611.h" -! #include "debugpins.h" -! -! //=========================== defines ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void debugpins_init() { -! P6DIR |= 0x40; // frame [P6.6] -! P6DIR |= 0x80; // slot [P6.7] -! P2DIR |= 0x08; // fsm [P2.3] -! P2DIR |= 0x40; // task [P2.6] -! P6DIR |= 0x01; // isr [P6.0] -! P6DIR |= 0x02; // radio [P6.1] -! } -! -! // P6.6 -! void debugpins_frame_toggle() { -! P6OUT ^= 0x40; -! } -! void debugpins_frame_clr() { -! P6OUT &= ~0x40; -! } -! void debugpins_frame_set() { -! P6OUT |= 0x40; -! } -! -! // P6.7 -! void debugpins_slot_toggle() { -! P6OUT ^= 0x80; -! } -! void debugpins_slot_clr() { -! P6OUT &= ~0x80; -! } -! void debugpins_slot_set() { -! P6OUT |= 0x80; -! } -! -! // P2.3 -! void debugpins_fsm_toggle() { -! P2OUT ^= 0x08; -! } -! void debugpins_fsm_clr() { -! P2OUT &= ~0x08; -! } -! void debugpins_fsm_set() { -! P2OUT |= 0x08; -! } -! -! // P2.6 -! void debugpins_task_toggle() { -! P2OUT ^= 0x40; -! } -! void debugpins_task_clr() { -! P2OUT &= ~0x40; -! } -! void debugpins_task_set() { -! P2OUT |= 0x40; -! } -! -! // P6.0 -! void debugpins_isr_toggle() { -! P6OUT ^= 0x01; -! } -! void debugpins_isr_clr() { -! P6OUT &= ~0x01; -! } -! void debugpins_isr_set() { -! P6OUT |= 0x01; -! } -! -! // P6.1 -! void debugpins_radio_toggle() { -! P6OUT ^= 0x02; -! } -! void debugpins_radio_clr() { -! P6OUT &= ~0x02; -! } -! void debugpins_radio_set() { -! P6OUT |= 0x02; -! } -! - //=========================== private ========================================= -\ No newline at end of file ---- 1,110 ---- -! /** -! \brief TelosB-specific definition of the "debugpins" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! #include <stdint.h> // needed for uin8_t, uint16_t -! #include "msp430f1611.h" -! #include "debugpins.h" -! -! //=========================== defines ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void debugpins_init(void) { -! P6DIR |= 0x40; // frame [P6.6] -! P6DIR |= 0x80; // slot [P6.7] -! P2DIR |= 0x08; // fsm [P2.3] -! P2DIR |= 0x40; // task [P2.6] -! P6DIR |= 0x01; // isr [P6.0] -! P6DIR |= 0x02; // radio [P6.1] -! } -! -! // P6.6 -! void debugpins_frame_toggle(void) { -! P6OUT ^= 0x40; -! } -! void debugpins_frame_clr(void) { -! P6OUT &= ~0x40; -! } -! void debugpins_frame_set(void) { -! P6OUT |= 0x40; -! } -! -! // P6.7 -! void debugpins_slot_toggle(void) { -! P6OUT ^= 0x80; -! } -! void debugpins_slot_clr(void) { -! P6OUT &= ~0x80; -! } -! void debugpins_slot_set(void) { -! P6OUT |= 0x80; -! } -! -! // P2.3 -! void debugpins_fsm_toggle(void) { -! P2OUT ^= 0x08; -! } -! void debugpins_fsm_clr(void) { -! P2OUT &= ~0x08; -! } -! void debugpins_fsm_set(void) { -! P2OUT |= 0x08; -! } -! -! // P2.6 -! void debugpins_task_toggle(void) { -! P2OUT ^= 0x40; -! } -! void debugpins_task_clr(void) { -! P2OUT &= ~0x40; -! } -! void debugpins_task_set(void) { -! P2OUT |= 0x40; -! } -! -! // P6.0 -! void debugpins_isr_toggle(void) { -! P6OUT ^= 0x01; -! } -! void debugpins_isr_clr(void) { -! P6OUT &= ~0x01; -! } -! void debugpins_isr_set(void) { -! P6OUT |= 0x01; -! } -! -! // P6.1 -! void debugpins_radio_toggle(void) { -! P6OUT ^= 0x02; -! } -! void debugpins_radio_clr(void) { -! P6OUT &= ~0x02; -! } -! void debugpins_radio_set(void) { -! P6OUT |= 0x02; -! } -! -! -! void leds_toggle_2x(void){ -! -! uint16_t i; -! debugpins_task_toggle(); -! for (i=0;i<0xFFFF;i++); -! for (i=0;i<0xFFFF;i++); -! debugpins_task_toggle(); -! } -! void leds_toggle_4x(void){ -! uint16_t i; -! leds_toggle_2x(); -! for (i=0;i<0xFFFF;i++); -! for (i=0;i<0xFFFF;i++); -! leds_toggle_2x(); -! } -! - //=========================== private ========================================= -\ No newline at end of file -diff -crB openwsn/debugpins.h ../../../sys/net/openwsn/debugpins.h -*** openwsn/debugpins.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/debugpins.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,44 **** -! /** -! \brief Cross-platform declaration "leds" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #ifndef __DEBUGPINS_H -! #define __DEBUGPINS_H -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void debugpins_init(); -! -! void debugpins_frame_toggle(); -! void debugpins_frame_clr(); -! void debugpins_frame_set(); -! -! void debugpins_slot_toggle(); -! void debugpins_slot_clr(); -! void debugpins_slot_set(); -! -! void debugpins_fsm_toggle(); -! void debugpins_fsm_clr(); -! void debugpins_fsm_set(); -! -! void debugpins_task_toggle(); -! void debugpins_task_clr(); -! void debugpins_task_set(); -! -! void debugpins_isr_toggle(); -! void debugpins_isr_clr(); -! void debugpins_isr_set(); -! -! void debugpins_radio_toggle(); -! void debugpins_radio_clr(); -! void debugpins_radio_set(); -! -! #endif ---- 1,54 ---- -! #ifndef __DEBUGPINS_H -! #define __DEBUGPINS_H -! -! /** -! \addtogroup BSP -! \{ -! \addtogroup debugpins -! \{ -! -! \brief Cross-platform declaration "leds" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void debugpins_init(void); -! -! void debugpins_frame_toggle(void); -! void debugpins_frame_clr(void); -! void debugpins_frame_set(void); -! -! void debugpins_slot_toggle(void); -! void debugpins_slot_clr(void); -! void debugpins_slot_set(void); -! -! void debugpins_fsm_toggle(void); -! void debugpins_fsm_clr(void); -! void debugpins_fsm_set(void); -! -! void debugpins_task_toggle(void); -! void debugpins_task_clr(void); -! void debugpins_task_set(void); -! -! void debugpins_isr_toggle(void); -! void debugpins_isr_clr(void); -! void debugpins_isr_set(void); -! -! void debugpins_radio_toggle(void); -! void debugpins_radio_clr(void); -! void debugpins_radio_set(void); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/eui64.c ../../../sys/net/openwsn/eui64.c -*** openwsn/eui64.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/eui64.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,218 **** -! /** -! \brief TelosB-specific definition of the "eui64" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, March 2012. -! */ -! -! #include "msp430f1611.h" -! #include "string.h" -! #include "eui64.h" -! -! //=========================== defines ========================================= -! -! #define PIN_1WIRE 0x10 -! -! //=========================== enums =========================================== -! -! enum { -! OW_DLY_A = 6, -! OW_DLY_B = 64, -! OW_DLY_C = 60, -! OW_DLY_D = 10, -! OW_DLY_E = 9, -! OW_DLY_F = 55, -! OW_DLY_G = 0, -! OW_DLY_H = 480, -! OW_DLY_I = 90, -! OW_DLY_J = 220, -! }; -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! // 1Wire -! uint8_t ow_reset(); -! void ow_write_byte(uint8_t byte); -! uint8_t ow_read_byte(); -! void ow_write_bit(int is_one); -! uint8_t ow_read_bit(); -! void ow_write_bit_one(); -! void ow_write_bit_zero(); -! // CRC -! uint8_t crc8_byte(uint8_t crc, uint8_t byte); -! uint8_t crc8_bytes(uint8_t crc, uint8_t* bytes, uint8_t len); -! // timer -! void delay_us(uint16_t delay); -! // pin -! void owpin_init(); -! void owpin_output_low(); -! void owpin_output_high(); -! void owpin_prepare_read(); -! uint8_t owpin_read(); -! -! //=========================== public ========================================== -! -! void eui64_get(uint8_t* addressToWrite) { // >= 6000us -! uint8_t id[8]; -! int retry; -! int crc; -! uint8_t* byte; -! uint16_t oldTactl; -! -! retry = 5; -! memset(addressToWrite,0,8); -! -! // store current value of TACTL -! oldTactl = TACTL; -! -! // start timer in continuous mode at 1MHz -! TACTL = TASSEL_2 | ID_2 | MC_2; -! -! owpin_init(); -! while (retry-- > 0) { -! crc = 0; -! -! if(ow_reset()) { -! ow_write_byte(0x33); //read rom -! for(byte=id+7; byte>=id; byte--) { -! crc = crc8_byte( crc, *byte=ow_read_byte() ); -! } -! if(crc==0) { -! // CRC valid -! *(addressToWrite+0) = 0x14; -! *(addressToWrite+1) = 0x15; -! *(addressToWrite+2) = 0x92; -! memcpy(addressToWrite+3,id+1,5); -! } -! } -! } -! -! // restore value of TACTL -! TACTL = oldTactl; -! } -! -! //=========================== private ========================================= -! -! //===== 1Wire -! -! // admin -! -! uint8_t ow_reset() { // >= 960us -! int present; -! owpin_output_low(); -! delay_us(OW_DLY_H); // t_RSTL -! owpin_prepare_read(); -! delay_us(OW_DLY_I); // t_MSP -! present = owpin_read(); -! delay_us(OW_DLY_J); // t_REC -! return (present==0); -! } -! -! // byte-level access -! -! void ow_write_byte(uint8_t byte) {// >= 560us -! uint8_t bit; -! for(bit=0x01;bit!=0;bit<<=1) { -! ow_write_bit(byte & bit); -! } -! } -! -! uint8_t ow_read_byte() { // >= 560us -! uint8_t byte = 0; -! uint8_t bit; -! for( bit=0x01; bit!=0; bit<<=1 ) { -! if(ow_read_bit()) { -! byte |= bit; -! } -! } -! return byte; -! } -! -! // bit-level access -! -! void ow_write_bit(int is_one) { // >= 70us -! if(is_one) { -! ow_write_bit_one(); -! } else { -! ow_write_bit_zero(); -! } -! } -! -! uint8_t ow_read_bit() { // >= 70us -! int bit; -! owpin_output_low(); -! delay_us(OW_DLY_A); // t_RL -! owpin_prepare_read(); -! delay_us(OW_DLY_E); // near-max t_MSR -! bit = owpin_read(); -! delay_us(OW_DLY_F); // t_REC -! return bit; -! } -! -! void ow_write_bit_one() { // >= 70us -! owpin_output_low(); -! delay_us(OW_DLY_A); // t_W1L -! owpin_output_high(); -! delay_us(OW_DLY_B); // t_SLOT - t_W1L -! } -! -! void ow_write_bit_zero() { // >= 70us -! owpin_output_low(); -! delay_us(OW_DLY_C); // t_W0L -! owpin_output_high(); -! delay_us(OW_DLY_D); // t_SLOT - t_W0L -! } -! -! //===== CRC -! -! uint8_t crc8_byte(uint8_t crc, uint8_t byte) { -! int i; -! crc ^= byte; -! for( i=0; i<8; i++ ) -! { -! if( crc & 1 ) -! crc = (crc >> 1) ^ 0x8c; -! else -! crc >>= 1; -! } -! return crc; -! } -! -! uint8_t crc8_bytes(uint8_t crc, uint8_t* bytes, uint8_t len) { -! uint8_t* end = bytes+len; -! while( bytes != end ) -! crc = crc8_byte( crc, *bytes++ ); -! return crc; -! } -! -! //===== timer -! -! void delay_us(uint16_t delay) { -! uint16_t startTime; -! startTime = TAR; -! while (TAR<startTime+delay); -! } -! -! //===== pin -! -! void owpin_init() { -! P2DIR &= ~PIN_1WIRE; // set as input -! P2OUT &= ~PIN_1WIRE; // pull low -! } -! -! void owpin_output_low() { -! P2DIR |= PIN_1WIRE; // set as output -! } -! -! void owpin_output_high() { -! P2DIR &= ~PIN_1WIRE; // set as input -! } -! -! void owpin_prepare_read() { -! P2DIR &= ~PIN_1WIRE; // set as input -! } -! -! uint8_t owpin_read() { -! return (P2IN & PIN_1WIRE); - } -\ No newline at end of file ---- 1,218 ---- -! /** -! \brief TelosB-specific definition of the "eui64" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, March 2012. -! */ -! -! #include "msp430f1611.h" -! #include "string.h" -! #include "eui64.h" -! -! //=========================== defines ========================================= -! -! #define PIN_1WIRE 0x10 -! -! //=========================== enums =========================================== -! -! enum { -! OW_DLY_A = 6, -! OW_DLY_B = 64, -! OW_DLY_C = 60, -! OW_DLY_D = 10, -! OW_DLY_E = 9, -! OW_DLY_F = 55, -! OW_DLY_G = 0, -! OW_DLY_H = 480, -! OW_DLY_I = 90, -! OW_DLY_J = 220, -! }; -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! // 1Wire -! uint8_t ow_reset(void); -! void ow_write_byte(uint8_t byte); -! uint8_t ow_read_byte(void); -! void ow_write_bit(int is_one); -! uint8_t ow_read_bit(void); -! void ow_write_bit_one(void); -! void ow_write_bit_zero(void); -! // CRC -! uint8_t crc8_byte(uint8_t crc, uint8_t byte); -! uint8_t crc8_bytes(uint8_t crc, uint8_t* bytes, uint8_t len); -! // timer -! void delay_us(uint16_t delay); -! // pin -! void owpin_init(void); -! void owpin_output_low(void); -! void owpin_output_high(void); -! void owpin_prepare_read(void); -! uint8_t owpin_read(void); -! -! //=========================== public ========================================== -! -! void eui64_get(uint8_t* addressToWrite) { // >= 6000us -! uint8_t id[8]; -! int retry; -! int crc; -! uint8_t* byte; -! uint16_t oldTactl; -! -! retry = 5; -! memset(addressToWrite,0,8); -! -! // store current value of TACTL -! oldTactl = TACTL; -! -! // start timer in continuous mode at 1MHz -! TACTL = TASSEL_2 | ID_2 | MC_2; -! -! owpin_init(); -! while (retry-- > 0) { -! crc = 0; -! -! if(ow_reset()) { -! ow_write_byte(0x33); //read rom -! for(byte=id+7; byte>=id; byte--) { -! crc = crc8_byte( crc, *byte=ow_read_byte() ); -! } -! if(crc==0) { -! // CRC valid -! *(addressToWrite+0) = 0x14; -! *(addressToWrite+1) = 0x15; -! *(addressToWrite+2) = 0x92; -! memcpy(addressToWrite+3,id+1,5); -! } -! } -! } -! -! // restore value of TACTL -! TACTL = oldTactl; -! } -! -! //=========================== private ========================================= -! -! //===== 1Wire -! -! // admin -! -! uint8_t ow_reset(void) { // >= 960us -! int present; -! owpin_output_low(); -! delay_us(OW_DLY_H); // t_RSTL -! owpin_prepare_read(); -! delay_us(OW_DLY_I); // t_MSP -! present = owpin_read(); -! delay_us(OW_DLY_J); // t_REC -! return (present==0); -! } -! -! // byte-level access -! -! void ow_write_byte(uint8_t byte) {// >= 560us -! uint8_t bit; -! for(bit=0x01;bit!=0;bit<<=1) { -! ow_write_bit(byte & bit); -! } -! } -! -! uint8_t ow_read_byte(void) { // >= 560us -! uint8_t byte = 0; -! uint8_t bit; -! for( bit=0x01; bit!=0; bit<<=1 ) { -! if(ow_read_bit()) { -! byte |= bit; -! } -! } -! return byte; -! } -! -! // bit-level access -! -! void ow_write_bit(int is_one) { // >= 70us -! if(is_one) { -! ow_write_bit_one(); -! } else { -! ow_write_bit_zero(); -! } -! } -! -! uint8_t ow_read_bit(void) { // >= 70us -! int bit; -! owpin_output_low(); -! delay_us(OW_DLY_A); // t_RL -! owpin_prepare_read(); -! delay_us(OW_DLY_E); // near-max t_MSR -! bit = owpin_read(); -! delay_us(OW_DLY_F); // t_REC -! return bit; -! } -! -! void ow_write_bit_one(void) { // >= 70us -! owpin_output_low(); -! delay_us(OW_DLY_A); // t_W1L -! owpin_output_high(); -! delay_us(OW_DLY_B); // t_SLOT - t_W1L -! } -! -! void ow_write_bit_zero(void) { // >= 70us -! owpin_output_low(); -! delay_us(OW_DLY_C); // t_W0L -! owpin_output_high(); -! delay_us(OW_DLY_D); // t_SLOT - t_W0L -! } -! -! //===== CRC -! -! uint8_t crc8_byte(uint8_t crc, uint8_t byte) { -! int i; -! crc ^= byte; -! for( i=0; i<8; i++ ) -! { -! if( crc & 1 ) -! crc = (crc >> 1) ^ 0x8c; -! else -! crc >>= 1; -! } -! return crc; -! } -! -! uint8_t crc8_bytes(uint8_t crc, uint8_t* bytes, uint8_t len) { -! uint8_t* end = bytes+len; -! while( bytes != end ) -! crc = crc8_byte( crc, *bytes++ ); -! return crc; -! } -! -! //===== timer -! -! void delay_us(uint16_t delay) { -! uint16_t startTime; -! startTime = TAR; -! while (TAR<startTime+delay); -! } -! -! //===== pin -! -! void owpin_init(void) { -! P2DIR &= ~PIN_1WIRE; // set as input -! P2OUT &= ~PIN_1WIRE; // pull low -! } -! -! void owpin_output_low(void) { -! P2DIR |= PIN_1WIRE; // set as output -! } -! -! void owpin_output_high(void) { -! P2DIR &= ~PIN_1WIRE; // set as input -! } -! -! void owpin_prepare_read(void) { -! P2DIR &= ~PIN_1WIRE; // set as input -! } -! -! uint8_t owpin_read(void) { -! return (P2IN & PIN_1WIRE); - } -\ No newline at end of file -diff -crB openwsn/eui64.h ../../../sys/net/openwsn/eui64.h -*** openwsn/eui64.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/eui64.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,22 **** -! /** -! \brief Cross-platform declaration "eui64" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, March 2012. -! */ -! -! #ifndef __EUI64_H -! #define __EUI64_H -! -! #include <stdint.h> -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void eui64_get(uint8_t* addressToWrite); -! - #endif -\ No newline at end of file ---- 1,32 ---- -! #ifndef __EUI64_H -! #define __EUI64_H -! -! /** -! \addtogroup BSP -! \{ -! \addtogroup eui64 -! \{ -! -! \brief Cross-platform declaration "eui64" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, March 2012. -! */ -! -! #include <stdint.h> -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void eui64_get(uint8_t* addressToWrite); -! -! /** -! \} -! \} -! */ -! - #endif -\ No newline at end of file -diff -crB openwsn/leds.c ../../../sys/net/openwsn/leds.c -*** openwsn/leds.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/leds.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,137 **** -! /** -! \brief TelosB-specific definition of the "leds" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #include "msp430f1611.h" -! #include "leds.h" -! -! //=========================== defines ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void leds_init() { -! P5DIR |= 0x70; // P5DIR = 0bx111xxxx for LEDs -! P5OUT |= 0x70; // P2OUT = 0bx111xxxx, all LEDs off -! } -! -! // red = LED1 = P5.4 -! void leds_error_on() { -! P5OUT &= ~0x10; -! } -! void leds_error_off() { -! P5OUT |= 0x10; -! } -! void leds_error_toggle() { -! P5OUT ^= 0x10; -! } -! uint8_t leds_error_isOn() { -! return (uint8_t)(P5OUT & 0x10)>>4; -! } -! void leds_error_blink() { -! uint8_t i; -! volatile uint16_t delay; -! // turn all LEDs off -! P5OUT |= 0x70; -! -! // blink error LED for ~10s -! for (i=0;i<80;i++) { -! P5OUT ^= 0x10; -! for (delay=0xffff;delay>0;delay--); -! } -! } -! -! // green = LED2 = P5.5 -! void leds_radio_on() { -! P5OUT &= ~0x20; -! } -! void leds_radio_off() { -! P5OUT |= 0x20; -! } -! void leds_radio_toggle() { -! P5OUT ^= 0x20; -! } -! uint8_t leds_radio_isOn() { -! return (uint8_t)(P5OUT & 0x20)>>5; -! } -! -! // blue = LED3 = P5.6 -! void leds_sync_on() { -! P5OUT &= ~0x40; -! } -! void leds_sync_off() { -! P5OUT |= 0x40; -! } -! void leds_sync_toggle() { -! P5OUT ^= 0x40; -! } -! uint8_t leds_sync_isOn() { -! return (uint8_t)(P5OUT & 0x40)>>6; -! } -! -! void leds_debug_on() { -! // TelosB doesn't have a debug LED :( -! } -! void leds_debug_off() { -! // TelosB doesn't have a debug LED :( -! } -! void leds_debug_toggle() { -! // TelosB doesn't have a debug LED :( -! } -! uint8_t leds_debug_isOn() { -! // TelosB doesn't have a debug LED :( -! return 0; -! } -! -! void leds_all_on() { -! P5OUT &= ~0x70; -! } -! void leds_all_off() { -! P5OUT |= 0x70; -! } -! void leds_all_toggle() { -! P5OUT ^= 0x70; -! } -! -! void leds_circular_shift() { -! uint8_t leds_on; -! // get LED state -! leds_on = (~P5OUT & 0x70) >> 4; -! // modify LED state -! if (leds_on==0) { // if no LEDs on, switch on one -! leds_on = 0x01; -! } else { -! leds_on <<= 1; // shift by one position -! if ((leds_on & 0x08)!=0) { -! leds_on &= ~0x08; -! leds_on |= 0x01; // handle overflow -! } -! } -! // apply updated LED state -! leds_on <<= 4; // send back to position 4 -! P5OUT |= (~leds_on & 0x70); // switch on the leds marked '1' in leds_on -! P5OUT &= ~( leds_on & 0x70); // switch off the leds marked '0' in leds_on -! } -! -! void leds_increment() { -! uint8_t leds_on; -! // get LED state -! leds_on = (~P5OUT & 0x70) >> 4; -! // modify LED state -! if (leds_on==0) { // if no LEDs on, switch on one -! leds_on = 0x01; -! } else { -! leds_on += 1; -! } -! // apply updated LED state -! leds_on <<= 4; // send back to position 4 -! P5OUT |= (~leds_on & 0x70); // switch on the leds marked '1' in leds_on -! P5OUT &= ~( leds_on & 0x70); // switch off the leds marked '0' in leds_on -! } -! - //=========================== private ========================================= -\ No newline at end of file ---- 1,137 ---- -! /** -! \brief TelosB-specific definition of the "leds" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #include "msp430f1611.h" -! #include "leds.h" -! -! //=========================== defines ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void leds_init(void) { -! P5DIR |= 0x70; // P5DIR = 0bx111xxxx for LEDs -! P5OUT |= 0x70; // P2OUT = 0bx111xxxx, all LEDs off -! } -! -! // red = LED1 = P5.4 -! void leds_error_on(void) { -! P5OUT &= ~0x10; -! } -! void leds_error_off(void) { -! P5OUT |= 0x10; -! } -! void leds_error_toggle(void) { -! P5OUT ^= 0x10; -! } -! uint8_t leds_error_isOn(void) { -! return (uint8_t)(P5OUT & 0x10)>>4; -! } -! void leds_error_blink(void) { -! uint8_t i; -! volatile uint16_t delay; -! // turn all LEDs off -! P5OUT |= 0x70; -! -! // blink error LED for ~10s -! for (i=0;i<80;i++) { -! P5OUT ^= 0x10; -! for (delay=0xffff;delay>0;delay--); -! } -! } -! -! // green = LED2 = P5.5 -! void leds_radio_on(void) { -! P5OUT &= ~0x20; -! } -! void leds_radio_off(void) { -! P5OUT |= 0x20; -! } -! void leds_radio_toggle(void) { -! P5OUT ^= 0x20; -! } -! uint8_t leds_radio_isOn(void) { -! return (uint8_t)(P5OUT & 0x20)>>5; -! } -! -! // blue = LED3 = P5.6 -! void leds_sync_on(void) { -! P5OUT &= ~0x40; -! } -! void leds_sync_off(void) { -! P5OUT |= 0x40; -! } -! void leds_sync_toggle(void) { -! P5OUT ^= 0x40; -! } -! uint8_t leds_sync_isOn(void) { -! return (uint8_t)(P5OUT & 0x40)>>6; -! } -! -! void leds_debug_on(void) { -! // TelosB doesn't have a debug LED :( -! } -! void leds_debug_off(void) { -! // TelosB doesn't have a debug LED :( -! } -! void leds_debug_toggle(void) { -! // TelosB doesn't have a debug LED :( -! } -! uint8_t leds_debug_isOn(void) { -! // TelosB doesn't have a debug LED :( -! return 0; -! } -! -! void leds_all_on(void) { -! P5OUT &= ~0x70; -! } -! void leds_all_off(void) { -! P5OUT |= 0x70; -! } -! void leds_all_toggle(void) { -! P5OUT ^= 0x70; -! } -! -! void leds_circular_shift(void) { -! uint8_t leds_on; -! // get LED state -! leds_on = (~P5OUT & 0x70) >> 4; -! // modify LED state -! if (leds_on==0) { // if no LEDs on, switch on one -! leds_on = 0x01; -! } else { -! leds_on <<= 1; // shift by one position -! if ((leds_on & 0x08)!=0) { -! leds_on &= ~0x08; -! leds_on |= 0x01; // handle overflow -! } -! } -! // apply updated LED state -! leds_on <<= 4; // send back to position 4 -! P5OUT |= (~leds_on & 0x70); // switch on the leds marked '1' in leds_on -! P5OUT &= ~( leds_on & 0x70); // switch off the leds marked '0' in leds_on -! } -! -! void leds_increment(void) { -! uint8_t leds_on; -! // get LED state -! leds_on = (~P5OUT & 0x70) >> 4; -! // modify LED state -! if (leds_on==0) { // if no LEDs on, switch on one -! leds_on = 0x01; -! } else { -! leds_on += 1; -! } -! // apply updated LED state -! leds_on <<= 4; // send back to position 4 -! P5OUT |= (~leds_on & 0x70); // switch on the leds marked '1' in leds_on -! P5OUT &= ~( leds_on & 0x70); // switch off the leds marked '0' in leds_on -! } -! - //=========================== private ========================================= -\ No newline at end of file -diff -crB openwsn/leds.h ../../../sys/net/openwsn/leds.h -*** openwsn/leds.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/leds.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,50 **** -! /** -! \brief Cross-platform declaration "leds" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #ifndef __LEDS_H -! #define __LEDS_H -! -! #include "stdint.h" -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void leds_init(); -! -! void leds_error_on(); -! void leds_error_off(); -! void leds_error_toggle(); -! uint8_t leds_error_isOn(); -! void leds_error_blink(); -! -! void leds_radio_on(); -! void leds_radio_off(); -! void leds_radio_toggle(); -! uint8_t leds_radio_isOn(); -! -! void leds_sync_on(); -! void leds_sync_off(); -! void leds_sync_toggle(); -! uint8_t leds_sync_isOn(); -! -! void leds_debug_on(); -! void leds_debug_off(); -! void leds_debug_toggle(); -! uint8_t leds_debug_isOn(); -! -! void leds_all_on(); -! void leds_all_off(); -! void leds_all_toggle(); -! -! void leds_circular_shift(); -! void leds_increment(); -! -! #endif ---- 1,60 ---- -! #ifndef __LEDS_H -! #define __LEDS_H -! -! /** -! \addtogroup BSP -! \{ -! \addtogroup leds -! \{ -! -! \brief Cross-platform declaration "leds" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #include "stdint.h" -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void leds_init(void); -! -! void leds_error_on(void); -! void leds_error_off(void); -! void leds_error_toggle(void); -! uint8_t leds_error_isOn(void); -! void leds_error_blink(void); -! -! void leds_radio_on(void); -! void leds_radio_off(void); -! void leds_radio_toggle(void); -! uint8_t leds_radio_isOn(void); -! -! void leds_sync_on(void); -! void leds_sync_off(void); -! void leds_sync_toggle(void); -! uint8_t leds_sync_isOn(void); -! -! void leds_debug_on(void); -! void leds_debug_off(void); -! void leds_debug_toggle(void); -! uint8_t leds_debug_isOn(void); -! -! void leds_all_on(void); -! void leds_all_off(void); -! void leds_all_toggle(void); -! -! void leds_circular_shift(void); -! void leds_increment(void); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/openhdlc.c ../../../sys/net/openwsn/openhdlc.c -*** openwsn/openhdlc.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/openhdlc.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,20 **** -! /** -! \brief Definition of the "openserial" driver. -! -! \author Min Ting <tingm417@gmail.com>, October 2012. -! \author Fabien Chraim <chraim@eecs.berkeley.edu>, October 2012. -! */ -! -! #include "openhdlc.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! uint16_t crcIteration(uint16_t crc, uint8_t byte) { -! return (crc >> 8) ^ fcstab[(crc ^ byte) & 0xff]; -! } -! -! //=========================== private ========================================= ---- 1,20 ---- -! /** -! \brief Definition of the "openserial" driver. -! -! \author Min Ting <tingm417@gmail.com>, October 2012. -! \author Fabien Chraim <chraim@eecs.berkeley.edu>, October 2012. -! */ -! -! #include "openhdlc.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! uint16_t crcIteration(uint16_t crc, uint8_t byte) { -! return (crc >> 8) ^ fcstab[(crc ^ byte) & 0xff]; -! } -! -! //=========================== private ========================================= -diff -crB openwsn/openhdlc.h ../../../sys/net/openwsn/openhdlc.h -*** openwsn/openhdlc.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/openhdlc.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,75 **** -! /** -! \brief Declaraion of the "openserial" driver. -! -! \author Min Ting <tingm417@gmail.com>, October 2012. -! \author Fabien Chraim <chraim@eecs.berkeley.edu>, October 2012. -! */ -! -! #ifndef __OPENHDLC_H -! #define __OPENHDLC_H -! -! #include "openwsn.h" -! -! /** -! \addtogroup cross-layers -! \{ -! \addtogroup HDLC -! \{ -! */ -! -! //=========================== define ========================================== -! -! #define HDLC_FLAG 0x7e -! #define HDLC_ESCAPE 0x7d -! #define HDLC_ESCAPE_MASK 0x20 -! #define HDLC_CRCINIT 0xffff -! #define HDLC_CRCGOOD 0xf0b8 -! -! //this table is used to expedite execution (at the expense of memory usage) -! static const uint16_t fcstab[256] = { -! 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, -! 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, -! 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, -! 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, -! 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, -! 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, -! 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, -! 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, -! 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, -! 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, -! 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, -! 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, -! 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, -! 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, -! 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, -! 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, -! 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, -! 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, -! 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, -! 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, -! 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, -! 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, -! 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, -! 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, -! 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, -! 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, -! 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, -! 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, -! 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, -! 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, -! 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, -! 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 -! }; -! -! //=========================== typedef ========================================= -! -! //=========================== prototypes ====================================== -! -! uint16_t crcIteration(uint16_t crc, uint8_t byte); -! -! /** -! \} -! \} -! */ -! - #endif -\ No newline at end of file ---- 1,75 ---- -! /** -! \brief Declaraion of the "openserial" driver. -! -! \author Min Ting <tingm417@gmail.com>, October 2012. -! \author Fabien Chraim <chraim@eecs.berkeley.edu>, October 2012. -! */ -! -! #ifndef __OPENHDLC_H -! #define __OPENHDLC_H -! -! #include "openwsn.h" -! -! /** -! \addtogroup drivers -! \{ -! \addtogroup HDLC -! \{ -! */ -! -! //=========================== define ========================================== -! -! #define HDLC_FLAG 0x7e -! #define HDLC_ESCAPE 0x7d -! #define HDLC_ESCAPE_MASK 0x20 -! #define HDLC_CRCINIT 0xffff -! #define HDLC_CRCGOOD 0xf0b8 -! -! //this table is used to expedite execution (at the expense of memory usage) -! static const uint16_t fcstab[256] = { -! 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, -! 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, -! 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, -! 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, -! 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, -! 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, -! 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, -! 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, -! 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, -! 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, -! 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, -! 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, -! 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, -! 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, -! 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, -! 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, -! 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, -! 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, -! 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, -! 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, -! 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, -! 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, -! 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, -! 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, -! 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, -! 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, -! 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, -! 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, -! 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, -! 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, -! 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, -! 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 -! }; -! -! //=========================== typedef ========================================= -! -! //=========================== prototypes ====================================== -! -! uint16_t crcIteration(uint16_t crc, uint8_t byte); -! -! /** -! \} -! \} -! */ -! - #endif -\ No newline at end of file -diff -crB openwsn/openserial.c ../../../sys/net/openwsn/openserial.c -*** openwsn/openserial.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/openserial.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,633 **** -! /** -! \brief Definition of the "openserial" driver. -! -! \author Fabien Chraim <chraim@eecs.berkeley.edu>, March 2012. -! */ -! -! #include "openwsn.h" -! #include "openserial.h" -! #include "IEEE802154E.h" -! #include "neighbors.h" -! #include "res.h" -! #include "icmpv6echo.h" -! #include "idmanager.h" -! #include "openqueue.h" -! #include "tcpinject.h" -! #include "udpinject.h" -! #include "openbridge.h" -! #include "leds.h" -! #include "schedule.h" -! #include "uart.h" -! #include "opentimers.h" -! #include "openhdlc.h" -! -! //=========================== variables ======================================= -! -! typedef struct { -! // admin -! uint8_t mode; -! uint8_t debugPrintCounter; -! // input -! uint8_t reqFrame[1+1+2+1]; // flag (1B), command (2B), CRC (2B), flag (1B) -! uint8_t reqFrameIdx; -! uint8_t lastRxByte; -! bool busyReceiving; -! bool inputEscaping; -! uint16_t inputCrc; -! uint8_t inputBufFill; -! uint8_t inputBuf[SERIAL_INPUT_BUFFER_SIZE]; -! // output -! bool outputBufFilled; -! uint16_t outputCrc; -! uint8_t outputBufIdxW; -! uint8_t outputBufIdxR; -! uint8_t outputBuf[SERIAL_OUTPUT_BUFFER_SIZE]; -! } openserial_vars_t; -! -! openserial_vars_t openserial_vars; -! -! //=========================== prototypes ====================================== -! -! error_t openserial_printInfoErrorCritical( -! char severity, -! uint8_t calling_component, -! uint8_t error_code, -! errorparameter_t arg1, -! errorparameter_t arg2 -! ); -! // HDLC output -! void outputHdlcOpen(); -! void outputHdlcWrite(uint8_t b); -! void outputHdlcClose(); -! // HDLC input -! void inputHdlcOpen(); -! void inputHdlcWrite(uint8_t b); -! void inputHdlcClose(); -! -! //=========================== public ========================================== -! -! void openserial_init() { -! uint16_t crc; -! -! // reset variable -! memset(&openserial_vars,0,sizeof(openserial_vars_t)); -! -! // admin -! openserial_vars.mode = MODE_OFF; -! openserial_vars.debugPrintCounter = 0; -! -! // input -! openserial_vars.reqFrame[0] = HDLC_FLAG; -! openserial_vars.reqFrame[1] = SERFRAME_MOTE2PC_REQUEST; -! crc = HDLC_CRCINIT; -! crc = crcIteration(crc,openserial_vars.reqFrame[1]); -! crc = ~crc; -! openserial_vars.reqFrame[2] = (crc>>0)&0xff; -! openserial_vars.reqFrame[3] = (crc>>8)&0xff; -! openserial_vars.reqFrame[4] = HDLC_FLAG; -! openserial_vars.reqFrameIdx = 0; -! openserial_vars.lastRxByte = HDLC_FLAG; -! openserial_vars.busyReceiving = FALSE; -! openserial_vars.inputEscaping = FALSE; -! openserial_vars.inputBufFill = 0; -! -! // ouput -! openserial_vars.outputBufFilled = FALSE; -! openserial_vars.outputBufIdxR = 0; -! openserial_vars.outputBufIdxW = 0; -! -! // set callbacks -! uart_setCallbacks(isr_openserial_tx, -! isr_openserial_rx); -! } -! -! error_t openserial_printStatus(uint8_t statusElement,uint8_t* buffer, uint16_t length) { -! uint8_t i; -! INTERRUPT_DECLARATION(); -! -! DISABLE_INTERRUPTS(); -! openserial_vars.outputBufFilled = TRUE; -! outputHdlcOpen(); -! outputHdlcWrite(SERFRAME_MOTE2PC_STATUS); -! outputHdlcWrite(idmanager_getMyID(ADDR_16B)->addr_16b[0]); -! outputHdlcWrite(idmanager_getMyID(ADDR_16B)->addr_16b[1]); -! outputHdlcWrite(statusElement); -! for (i=0;i<length;i++){ -! outputHdlcWrite(buffer[i]); -! } -! outputHdlcClose(); -! ENABLE_INTERRUPTS(); -! -! return E_SUCCESS; -! } -! -! error_t openserial_printInfoErrorCritical( -! char severity, -! uint8_t calling_component, -! uint8_t error_code, -! errorparameter_t arg1, -! errorparameter_t arg2 -! ) { -! INTERRUPT_DECLARATION(); -! -! DISABLE_INTERRUPTS(); -! openserial_vars.outputBufFilled = TRUE; -! outputHdlcOpen(); -! outputHdlcWrite(severity); -! outputHdlcWrite(idmanager_getMyID(ADDR_16B)->addr_16b[0]); -! outputHdlcWrite(idmanager_getMyID(ADDR_16B)->addr_16b[1]); -! outputHdlcWrite(calling_component); -! outputHdlcWrite(error_code); -! outputHdlcWrite((uint8_t)((arg1 & 0xff00)>>8)); -! outputHdlcWrite((uint8_t) (arg1 & 0x00ff)); -! outputHdlcWrite((uint8_t)((arg2 & 0xff00)>>8)); -! outputHdlcWrite((uint8_t) (arg2 & 0x00ff)); -! outputHdlcClose(); -! ENABLE_INTERRUPTS(); -! -! return E_SUCCESS; -! } -! -! error_t openserial_printData(uint8_t* buffer, uint8_t length) { -! uint8_t i; -! uint8_t asn[5]; -! INTERRUPT_DECLARATION(); -! -! // retrieve ASN -! asnWriteToSerial(asn);// byte01,byte23,byte4 -! -! DISABLE_INTERRUPTS(); -! openserial_vars.outputBufFilled = TRUE; -! outputHdlcOpen(); -! outputHdlcWrite(SERFRAME_MOTE2PC_DATA); -! outputHdlcWrite(idmanager_getMyID(ADDR_16B)->addr_16b[1]); -! outputHdlcWrite(idmanager_getMyID(ADDR_16B)->addr_16b[0]); -! outputHdlcWrite(asn[0]); -! outputHdlcWrite(asn[1]); -! outputHdlcWrite(asn[2]); -! outputHdlcWrite(asn[3]); -! outputHdlcWrite(asn[4]); -! for (i=0;i<length;i++){ -! outputHdlcWrite(buffer[i]); -! } -! outputHdlcClose(); -! ENABLE_INTERRUPTS(); -! -! return E_SUCCESS; -! } -! -! error_t openserial_printInfo(uint8_t calling_component, uint8_t error_code, -! errorparameter_t arg1, -! errorparameter_t arg2) { -! return openserial_printInfoErrorCritical( -! SERFRAME_MOTE2PC_INFO, -! calling_component, -! error_code, -! arg1, -! arg2 -! ); -! } -! -! error_t openserial_printError(uint8_t calling_component, uint8_t error_code, -! errorparameter_t arg1, -! errorparameter_t arg2) { -! // blink error LED, this is serious -! leds_error_toggle(); -! -! return openserial_printInfoErrorCritical( -! SERFRAME_MOTE2PC_ERROR, -! calling_component, -! error_code, -! arg1, -! arg2 -! ); -! } -! -! error_t openserial_printCritical(uint8_t calling_component, uint8_t error_code, -! errorparameter_t arg1, -! errorparameter_t arg2) { -! // blink error LED, this is serious -! leds_error_blink(); -! -! // schedule for the mote to reboot in 10s -! opentimers_start(10000, -! TIMER_ONESHOT,TIME_MS, -! board_reset); -! -! return openserial_printInfoErrorCritical( -! SERFRAME_MOTE2PC_CRITICAL, -! calling_component, -! error_code, -! arg1, -! arg2 -! ); -! } -! -! uint8_t openserial_getNumDataBytes() { -! uint8_t inputBufFill; -! INTERRUPT_DECLARATION(); -! -! DISABLE_INTERRUPTS(); -! inputBufFill = openserial_vars.inputBufFill; -! ENABLE_INTERRUPTS(); -! -! return inputBufFill-1; // removing the command byte -! } -! -! uint8_t openserial_getInputBuffer(uint8_t* bufferToWrite, uint8_t maxNumBytes) { -! uint8_t numBytesWritten; -! uint8_t inputBufFill; -! INTERRUPT_DECLARATION(); -! -! DISABLE_INTERRUPTS(); -! inputBufFill = openserial_vars.inputBufFill; -! ENABLE_INTERRUPTS(); -! -! if (maxNumBytes<inputBufFill-1) { -! openserial_printError(COMPONENT_OPENSERIAL,ERR_GETDATA_ASKS_TOO_FEW_BYTES, -! (errorparameter_t)maxNumBytes, -! (errorparameter_t)inputBufFill-1); -! numBytesWritten = 0; -! } else { -! numBytesWritten = inputBufFill-1; -! memcpy(bufferToWrite,&(openserial_vars.inputBuf[1]),numBytesWritten); -! } -! DISABLE_INTERRUPTS(); -! openserial_vars.inputBufFill=0; -! ENABLE_INTERRUPTS(); -! -! return numBytesWritten; -! } -! -! void openserial_startInput() { -! INTERRUPT_DECLARATION(); -! -! if (openserial_vars.inputBufFill>0) { -! openserial_printError(COMPONENT_OPENSERIAL,ERR_INPUTBUFFER_LENGTH, -! (errorparameter_t)openserial_vars.inputBufFill, -! (errorparameter_t)0); -! openserial_vars.inputBufFill = 0; -! } -! -! uart_clearTxInterrupts(); -! uart_clearRxInterrupts(); // clear possible pending interrupts -! uart_enableInterrupts(); // Enable USCI_A1 TX & RX interrupt -! -! DISABLE_INTERRUPTS(); -! openserial_vars.mode = MODE_INPUT; -! openserial_vars.reqFrameIdx = 0; -! uart_writeByte(openserial_vars.reqFrame[openserial_vars.reqFrameIdx]); -! ENABLE_INTERRUPTS(); -! } -! -! void openserial_startOutput() { -! //schedule a task to get new status in the output buffer -! uint8_t debugPrintCounter; -! -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! openserial_vars.debugPrintCounter = (openserial_vars.debugPrintCounter+1)%STATUS_MAX; -! debugPrintCounter = openserial_vars.debugPrintCounter; -! ENABLE_INTERRUPTS(); -! -! // print debug information -! switch (debugPrintCounter) { -! case STATUS_ISSYNC: -! if (debugPrint_isSync()==TRUE) { -! break; -! } -! case STATUS_ID: -! if (debugPrint_id()==TRUE) { -! break; -! } -! case STATUS_DAGRANK: -! if (debugPrint_myDAGrank()==TRUE) { -! break; -! } -! case STATUS_OUTBUFFERINDEXES: -! if (debugPrint_outBufferIndexes()==TRUE) { -! break; -! } -! case STATUS_ASN: -! if (debugPrint_asn()==TRUE) { -! break; -! } -! case STATUS_MACSTATS: -! if (debugPrint_macStats()==TRUE) { -! break; -! } -! case STATUS_SCHEDULE: -! if(debugPrint_schedule()==TRUE) { -! break; -! } -! case STATUS_BACKOFF: -! if(debugPrint_backoff()==TRUE) { -! break; -! } -! case STATUS_QUEUE: -! if(debugPrint_queue()==TRUE) { -! break; -! } -! case STATUS_NEIGHBORS: -! if (debugPrint_neighbors()==TRUE) { -! break; -! } -! default: -! DISABLE_INTERRUPTS(); -! openserial_vars.debugPrintCounter=0; -! ENABLE_INTERRUPTS(); -! } -! -! // flush buffer -! uart_clearTxInterrupts(); -! uart_clearRxInterrupts(); // clear possible pending interrupts -! uart_enableInterrupts(); // Enable USCI_A1 TX & RX interrupt -! DISABLE_INTERRUPTS(); -! openserial_vars.mode=MODE_OUTPUT; -! if (openserial_vars.outputBufFilled) { -! uart_writeByte(openserial_vars.outputBuf[openserial_vars.outputBufIdxR++]); -! } else { -! openserial_stop(); -! } -! ENABLE_INTERRUPTS(); -! } -! -! void openserial_stop() { -! uint8_t inputBufFill; -! uint8_t cmdByte; -! INTERRUPT_DECLARATION(); -! -! DISABLE_INTERRUPTS(); -! inputBufFill = openserial_vars.inputBufFill; -! ENABLE_INTERRUPTS(); -! -! // disable USCI_A1 TX & RX interrupt -! uart_disableInterrupts(); -! -! DISABLE_INTERRUPTS(); -! openserial_vars.mode=MODE_OFF; -! ENABLE_INTERRUPTS(); -! -! if (inputBufFill>0) { -! DISABLE_INTERRUPTS(); -! cmdByte = openserial_vars.inputBuf[0]; -! ENABLE_INTERRUPTS(); -! switch (cmdByte) { -! case SERFRAME_PC2MOTE_SETROOT: -! idmanager_triggerAboutRoot(); -! break; -! case SERFRAME_PC2MOTE_SETBRIDGE: -! idmanager_triggerAboutBridge(); -! break; -! case SERFRAME_PC2MOTE_DATA: -! openbridge_triggerData(); -! break; -! case SERFRAME_PC2MOTE_TRIGGERTCPINJECT: -! tcpinject_trigger(); -! break; -! case SERFRAME_PC2MOTE_TRIGGERUDPINJECT: -! udpinject_trigger(); -! break; -! case SERFRAME_PC2MOTE_TRIGGERICMPv6ECHO: -! icmpv6echo_trigger(); -! break; -! case SERFRAME_PC2MOTE_TRIGGERSERIALECHO: -! openserial_echo(&openserial_vars.inputBuf[1],inputBufFill-1); -! break; -! default: -! openserial_printError(COMPONENT_OPENSERIAL,ERR_UNSUPPORTED_COMMAND, -! (errorparameter_t)cmdByte, -! (errorparameter_t)0); -! DISABLE_INTERRUPTS(); -! openserial_vars.inputBufFill = 0; -! ENABLE_INTERRUPTS(); -! break; -! } -! DISABLE_INTERRUPTS(); -! openserial_vars.inputBufFill = 0; -! ENABLE_INTERRUPTS(); -! } -! } -! -! /** -! \brief Trigger this module to print status information, over serial. -! -! debugPrint_* functions are used by the openserial module to continuously print -! status information about several modules in the OpenWSN stack. -! -! \returns TRUE if this function printed something, FALSE otherwise. -! */ -! bool debugPrint_outBufferIndexes() { -! uint16_t temp_buffer[2]; -! INTERRUPT_DECLARATION(); -! DISABLE_INTERRUPTS(); -! temp_buffer[0] = openserial_vars.outputBufIdxW; -! temp_buffer[1] = openserial_vars.outputBufIdxR; -! ENABLE_INTERRUPTS(); -! openserial_printStatus(STATUS_OUTBUFFERINDEXES,(uint8_t*)temp_buffer,sizeof(temp_buffer)); -! return TRUE; -! } -! -! //=========================== private ========================================= -! -! //===== hdlc (output) -! -! /** -! \brief Start an HDLC frame in the output buffer. -! */ -! inline void outputHdlcOpen() { -! // initialize the value of the CRC -! openserial_vars.outputCrc = HDLC_CRCINIT; -! -! // write the opening HDLC flag -! openserial_vars.outputBuf[openserial_vars.outputBufIdxW++] = HDLC_FLAG; -! } -! /** -! \brief Add a byte to the outgoing HDLC frame being built. -! -! \todo escape 0x7e and 0x7d. -! */ -! inline void outputHdlcWrite(uint8_t b) { -! -! // iterate through CRC calculator -! openserial_vars.outputCrc = crcIteration(openserial_vars.outputCrc,b); -! -! // add byte to buffer -! if (b==HDLC_FLAG || b==HDLC_ESCAPE) { -! openserial_vars.outputBuf[openserial_vars.outputBufIdxW++] = HDLC_ESCAPE; -! b = b^HDLC_ESCAPE_MASK; -! } -! openserial_vars.outputBuf[openserial_vars.outputBufIdxW++] = b; -! -! } -! /** -! \brief Finalize the outgoing HDLC frame. -! */ -! inline void outputHdlcClose() { -! // finalize the calculation of the CRC -! openserial_vars.outputCrc = ~openserial_vars.outputCrc; -! -! // write the CRC value -! openserial_vars.outputBuf[openserial_vars.outputBufIdxW++] = (openserial_vars.outputCrc>>0)&0xff; -! openserial_vars.outputBuf[openserial_vars.outputBufIdxW++] = (openserial_vars.outputCrc>>8)&0xff; -! -! // write the closing HDLC flag -! openserial_vars.outputBuf[openserial_vars.outputBufIdxW++] = HDLC_FLAG; -! } -! -! //===== hdlc (input) -! -! /** -! \brief Start an HDLC frame in the input buffer. -! */ -! inline void inputHdlcOpen() { -! // reset the input buffer index -! openserial_vars.inputBufFill = 0; -! -! // initialize the value of the CRC -! openserial_vars.inputCrc = HDLC_CRCINIT; -! } -! /** -! \brief Add a byte to the incoming HDLC frame. -! -! \todo escape 0x7e and 0x7d. -! */ -! inline void inputHdlcWrite(uint8_t b) { -! if (b==HDLC_ESCAPE) { -! openserial_vars.inputEscaping = TRUE; -! } else { -! if (openserial_vars.inputEscaping==TRUE) { -! b = b^HDLC_ESCAPE_MASK; -! openserial_vars.inputEscaping = FALSE; -! } -! -! // add byte to input buffer -! openserial_vars.inputBuf[openserial_vars.inputBufFill] = b; -! openserial_vars.inputBufFill++; -! -! // iterate through CRC calculator -! openserial_vars.inputCrc = crcIteration(openserial_vars.inputCrc,b); -! } -! } -! /** -! \brief Finalize the incoming HDLC frame. -! */ -! inline void inputHdlcClose() { -! -! // verify the validity of the frame -! if (openserial_vars.inputCrc==HDLC_CRCGOOD) { -! // the CRC is correct -! -! // remove the CRC from the input buffer -! openserial_vars.inputBufFill -= 2; -! } else { -! // the CRC is incorrect -! -! // drop the incoming fram -! openserial_vars.inputBufFill = 0; -! } -! } -! -! //=========================== interrupt handlers ============================== -! -! //executed in ISR, called from scheduler.c -! void isr_openserial_tx() { -! switch (openserial_vars.mode) { -! case MODE_INPUT: -! openserial_vars.reqFrameIdx++; -! if (openserial_vars.reqFrameIdx<sizeof(openserial_vars.reqFrame)) { -! uart_writeByte(openserial_vars.reqFrame[openserial_vars.reqFrameIdx]); -! } -! break; -! case MODE_OUTPUT: -! if (openserial_vars.outputBufIdxW==openserial_vars.outputBufIdxR) { -! openserial_vars.outputBufFilled = FALSE; -! } -! if (openserial_vars.outputBufFilled) { -! uart_writeByte(openserial_vars.outputBuf[openserial_vars.outputBufIdxR++]); -! } -! break; -! case MODE_OFF: -! default: -! break; -! } -! } -! -! // executed in ISR, called from scheduler.c -! void isr_openserial_rx() { -! uint8_t rxbyte; -! -! // stop if I'm not in input mode -! if (openserial_vars.mode!=MODE_INPUT) { -! return; -! } -! -! // read byte just received -! rxbyte = uart_readByte(); -! -! if ( -! openserial_vars.busyReceiving==FALSE && -! openserial_vars.lastRxByte==HDLC_FLAG && -! rxbyte!=HDLC_FLAG -! ) { -! // start of frame -! -! // I'm now receiving -! openserial_vars.busyReceiving = TRUE; -! -! // create the HDLC frame -! inputHdlcOpen(); -! -! // add the byte just received -! inputHdlcWrite(rxbyte); -! } else if ( -! openserial_vars.busyReceiving==TRUE && -! rxbyte!=HDLC_FLAG -! ) { -! // middle of frame -! -! // add the byte just received -! inputHdlcWrite(rxbyte); -! if (openserial_vars.inputBufFill+1>SERIAL_INPUT_BUFFER_SIZE){ -! // input buffer overflow -! openserial_printError(COMPONENT_OPENSERIAL,ERR_INPUT_BUFFER_OVERFLOW, -! (errorparameter_t)0, -! (errorparameter_t)0); -! openserial_vars.inputBufFill = 0; -! openserial_vars.busyReceiving = FALSE; -! openserial_stop(); -! } -! } else if ( -! openserial_vars.busyReceiving==TRUE && -! rxbyte==HDLC_FLAG -! ) { -! // end of frame -! -! // finalize the HDLC frame -! inputHdlcClose(); -! -! if (openserial_vars.inputBufFill==0){ -! // invalid HDLC frame -! openserial_printError(COMPONENT_OPENSERIAL,ERR_INVALIDSERIALFRAME, -! (errorparameter_t)0, -! (errorparameter_t)0); -! -! } -! -! openserial_vars.busyReceiving = FALSE; -! openserial_stop(); -! } -! -! openserial_vars.lastRxByte = rxbyte; -! } -! -! -! //======== SERIAL ECHO ============= -! -! void openserial_echo(uint8_t* buf, uint8_t bufLen){ -! // echo back what you received -! openserial_printData( -! buf, -! bufLen -! ); -! } ---- 1,648 ---- -! /** -! \brief Definition of the "openserial" driver. -! -! \author Fabien Chraim <chraim@eecs.berkeley.edu>, March 2012. -! */ -! -! #include "openwsn.h" -! #include "openserial.h" -! #include "IEEE802154E.h" -! #include "neighbors.h" -! #include "res.h" -! #include "icmpv6echo.h" -! #include "idmanager.h" -! #include "openqueue.h" -! #include "tcpinject.h" -! #include "udpinject.h" -! #include "openbridge.h" -! #include "leds.h" -! #include "schedule.h" -! #include "uart_ow.h" -! #include "opentimers.h" -! #include "openhdlc.h" -! -! //=========================== variables ======================================= -! -! openserial_vars_t openserial_vars; -! -! //=========================== prototypes ====================================== -! -! owerror_t openserial_printInfoErrorCritical( -! char severity, -! uint8_t calling_component, -! uint8_t error_code, -! errorparameter_t arg1, -! errorparameter_t arg2 -! ); -! // HDLC output -! void outputHdlcOpen(void); -! void outputHdlcWrite(uint8_t b); -! void outputHdlcClose(void); -! // HDLC input -! void inputHdlcOpen(void); -! void inputHdlcWrite(uint8_t b); -! void inputHdlcClose(void); -! -! //=========================== public ========================================== -! -! void openserial_init(void) { -! // uint16_t crc; -! // -! // // reset variable -! // memset(&openserial_vars,0,sizeof(openserial_vars_t)); -! // -! // // admin -! // openserial_vars.mode = MODE_OFF; -! // openserial_vars.debugPrintCounter = 0; -! // -! // // input -! // openserial_vars.reqFrame[0] = HDLC_FLAG; -! // openserial_vars.reqFrame[1] = SERFRAME_MOTE2PC_REQUEST; -! // crc = HDLC_CRCINIT; -! // crc = crcIteration(crc,openserial_vars.reqFrame[1]); -! // crc = ~crc; -! // openserial_vars.reqFrame[2] = (crc>>0)&0xff; -! // openserial_vars.reqFrame[3] = (crc>>8)&0xff; -! // openserial_vars.reqFrame[4] = HDLC_FLAG; -! // openserial_vars.reqFrameIdx = 0; -! // openserial_vars.lastRxByte = HDLC_FLAG; -! // openserial_vars.busyReceiving = FALSE; -! // openserial_vars.inputEscaping = FALSE; -! // openserial_vars.inputBufFill = 0; -! // -! // // ouput -! // openserial_vars.outputBufFilled = FALSE; -! // openserial_vars.outputBufIdxR = 0; -! // openserial_vars.outputBufIdxW = 0; -! // -! // // set callbacks -! // uart_setCallbacks(isr_openserial_tx, -! // isr_openserial_rx); -! } -! -! owerror_t openserial_printStatus(uint8_t statusElement,uint8_t* buffer, uint8_t length) { -! // uint8_t i; -! // INTERRUPT_DECLARATION(); -! // -! // DISABLE_INTERRUPTS(); -! // openserial_vars.outputBufFilled = TRUE; -! // outputHdlcOpen(); -! // outputHdlcWrite(SERFRAME_MOTE2PC_STATUS); -! // outputHdlcWrite(idmanager_getMyID(ADDR_16B)->addr_16b[0]); -! // outputHdlcWrite(idmanager_getMyID(ADDR_16B)->addr_16b[1]); -! // outputHdlcWrite(statusElement); -! // for (i=0;i<length;i++){ -! // outputHdlcWrite(buffer[i]); -! // } -! // outputHdlcClose(); -! // ENABLE_INTERRUPTS(); -! -! return E_SUCCESS; -! } -! -! owerror_t openserial_printInfoErrorCritical( -! char severity, -! uint8_t calling_component, -! uint8_t error_code, -! errorparameter_t arg1, -! errorparameter_t arg2 -! ) { -! // INTERRUPT_DECLARATION(); -! // -! // DISABLE_INTERRUPTS(); -! // openserial_vars.outputBufFilled = TRUE; -! // outputHdlcOpen(); -! // outputHdlcWrite(severity); -! // outputHdlcWrite(idmanager_getMyID(ADDR_16B)->addr_16b[0]); -! // outputHdlcWrite(idmanager_getMyID(ADDR_16B)->addr_16b[1]); -! // outputHdlcWrite(calling_component); -! // outputHdlcWrite(error_code); -! // outputHdlcWrite((uint8_t)((arg1 & 0xff00)>>8)); -! // outputHdlcWrite((uint8_t) (arg1 & 0x00ff)); -! // outputHdlcWrite((uint8_t)((arg2 & 0xff00)>>8)); -! // outputHdlcWrite((uint8_t) (arg2 & 0x00ff)); -! // outputHdlcClose(); -! // ENABLE_INTERRUPTS(); -! -! return E_SUCCESS; -! } -! -! owerror_t openserial_printData(uint8_t* buffer, uint8_t length) { -! (void)length; -! puts(buffer); -! // uint8_t i; -! // uint8_t asn[5]; -! // INTERRUPT_DECLARATION(); -! // -! // // retrieve ASN -! // ieee154e_getAsn(asn);// byte01,byte23,byte4 -! // -! // DISABLE_INTERRUPTS(); -! // openserial_vars.outputBufFilled = TRUE; -! // outputHdlcOpen(); -! // outputHdlcWrite(SERFRAME_MOTE2PC_DATA); -! // outputHdlcWrite(idmanager_getMyID(ADDR_16B)->addr_16b[1]); -! // outputHdlcWrite(idmanager_getMyID(ADDR_16B)->addr_16b[0]); -! // outputHdlcWrite(asn[0]); -! // outputHdlcWrite(asn[1]); -! // outputHdlcWrite(asn[2]); -! // outputHdlcWrite(asn[3]); -! // outputHdlcWrite(asn[4]); -! // for (i=0;i<length;i++){ -! // outputHdlcWrite(buffer[i]); -! // } -! // outputHdlcClose(); -! // ENABLE_INTERRUPTS(); -! -! return E_SUCCESS; -! } -! -! owerror_t openserial_printInfo(uint8_t calling_component, uint8_t error_code, -! errorparameter_t arg1, -! errorparameter_t arg2) { -! return openserial_printInfoErrorCritical( -! SERFRAME_MOTE2PC_INFO, -! calling_component, -! error_code, -! arg1, -! arg2 -! ); -! } -! -! owerror_t openserial_printError(uint8_t calling_component, uint8_t error_code, -! errorparameter_t arg1, -! errorparameter_t arg2) { -! // blink error LED, this is serious -! leds_error_toggle(); -! -! return openserial_printInfoErrorCritical( -! SERFRAME_MOTE2PC_ERROR, -! calling_component, -! error_code, -! arg1, -! arg2 -! ); -! } -! -! owerror_t openserial_printCritical(uint8_t calling_component, uint8_t error_code, -! errorparameter_t arg1, -! errorparameter_t arg2) { -! // blink error LED, this is serious -! leds_error_blink(); -! // -! // // schedule for the mote to reboot in 10s -! // opentimers_start(10000, -! // TIMER_ONESHOT,TIME_MS, -! // board_reset); -! -! return openserial_printInfoErrorCritical( -! SERFRAME_MOTE2PC_CRITICAL, -! calling_component, -! error_code, -! arg1, -! arg2 -! ); -! } -! -! uint8_t openserial_getNumDataBytes(void) { -! uint8_t inputBufFill; -! // INTERRUPT_DECLARATION(); -! // -! // DISABLE_INTERRUPTS(); -! // inputBufFill = openserial_vars.inputBufFill; -! // ENABLE_INTERRUPTS(); -! -! return inputBufFill-1; // removing the command byte -! } -! -! uint8_t openserial_getInputBuffer(uint8_t* bufferToWrite, uint8_t maxNumBytes) { -! uint8_t numBytesWritten; -! // uint8_t inputBufFill; -! // INTERRUPT_DECLARATION(); -! // -! // DISABLE_INTERRUPTS(); -! // inputBufFill = openserial_vars.inputBufFill; -! // ENABLE_INTERRUPTS(); -! // -! // if (maxNumBytes<inputBufFill-1) { -! // openserial_printError(COMPONENT_OPENSERIAL,ERR_GETDATA_ASKS_TOO_FEW_BYTES, -! // (errorparameter_t)maxNumBytes, -! // (errorparameter_t)inputBufFill-1); -! // numBytesWritten = 0; -! // } else { -! // numBytesWritten = inputBufFill-1; -! // memcpy(bufferToWrite,&(openserial_vars.inputBuf[1]),numBytesWritten); -! // } -! -! return numBytesWritten; -! } -! -! void openserial_startInput() { -! // INTERRUPT_DECLARATION(); -! // -! // if (openserial_vars.inputBufFill>0) { -! // openserial_printError(COMPONENT_OPENSERIAL,ERR_INPUTBUFFER_LENGTH, -! // (errorparameter_t)openserial_vars.inputBufFill, -! // (errorparameter_t)0); -! // DISABLE_INTERRUPTS(); -! // openserial_vars.inputBufFill=0; -! // ENABLE_INTERRUPTS(); -! // } -! // -! // uart_clearTxInterrupts(); -! // uart_clearRxInterrupts(); // clear possible pending interrupts -! // uart_enableInterrupts(); // Enable USCI_A1 TX & RX interrupt -! // -! // DISABLE_INTERRUPTS(); -! // openserial_vars.busyReceiving = FALSE; -! // openserial_vars.mode = MODE_INPUT; -! // openserial_vars.reqFrameIdx = 0; -! // #ifdef FASTSIM -! // uart_writeBufferByLen_FASTSIM( -! // openserial_vars.reqFrame, -! // sizeof(openserial_vars.reqFrame) -! // ); -! // openserial_vars.reqFrameIdx = sizeof(openserial_vars.reqFrame); -! // #else -! // uart_writeByte(openserial_vars.reqFrame[openserial_vars.reqFrameIdx]); -! // #endif -! // ENABLE_INTERRUPTS(); -! } -! -! void openserial_startOutput(void) { -! // //schedule a task to get new status in the output buffer -! // uint8_t debugPrintCounter; -! // -! // INTERRUPT_DECLARATION(); -! // DISABLE_INTERRUPTS(); -! // openserial_vars.debugPrintCounter = (openserial_vars.debugPrintCounter+1)%STATUS_MAX; -! // debugPrintCounter = openserial_vars.debugPrintCounter; -! // ENABLE_INTERRUPTS(); -! // -! // // print debug information -! // switch (debugPrintCounter) { -! // case STATUS_ISSYNC: -! // if (debugPrint_isSync()==TRUE) { -! // break; -! // } -! // case STATUS_ID: -! // if (debugPrint_id()==TRUE) { -! // break; -! // } -! // case STATUS_DAGRANK: -! // if (debugPrint_myDAGrank()==TRUE) { -! // break; -! // } -! // case STATUS_OUTBUFFERINDEXES: -! // if (debugPrint_outBufferIndexes()==TRUE) { -! // break; -! // } -! // case STATUS_ASN: -! // if (debugPrint_asn()==TRUE) { -! // break; -! // } -! // case STATUS_MACSTATS: -! // if (debugPrint_macStats()==TRUE) { -! // break; -! // } -! // case STATUS_SCHEDULE: -! // if(debugPrint_schedule()==TRUE) { -! // break; -! // } -! // case STATUS_BACKOFF: -! // if(debugPrint_backoff()==TRUE) { -! // break; -! // } -! // case STATUS_QUEUE: -! // if(debugPrint_queue()==TRUE) { -! // break; -! // } -! // case STATUS_NEIGHBORS: -! // if (debugPrint_neighbors()==TRUE) { -! // break; -! // } -! // default: -! // DISABLE_INTERRUPTS(); -! // openserial_vars.debugPrintCounter=0; -! // ENABLE_INTERRUPTS(); -! // } -! // -! // // flush buffer -! // uart_clearTxInterrupts(); -! // uart_clearRxInterrupts(); // clear possible pending interrupts -! // uart_enableInterrupts(); // Enable USCI_A1 TX & RX interrupt -! // DISABLE_INTERRUPTS(); -! // openserial_vars.mode=MODE_OUTPUT; -! // if (openserial_vars.outputBufFilled) { -! // #ifdef FASTSIM -! // uart_writeCircularBuffer_FASTSIM( -! // openserial_vars.outputBuf, -! // &openserial_vars.outputBufIdxR, -! // &openserial_vars.outputBufIdxW -! // ); -! // #else -! // uart_writeByte(openserial_vars.outputBuf[openserial_vars.outputBufIdxR++]); -! // #endif -! // } else { -! // openserial_stop(); -! // } -! // ENABLE_INTERRUPTS(); -! } -! -! void openserial_stop(void) { -! // uint8_t inputBufFill; -! // uint8_t cmdByte; -! // bool busyReceiving; -! // INTERRUPT_DECLARATION(); -! // -! // DISABLE_INTERRUPTS(); -! // busyReceiving = openserial_vars.busyReceiving; -! // inputBufFill = openserial_vars.inputBufFill; -! // ENABLE_INTERRUPTS(); -! // -! // // disable USCI_A1 TX & RX interrupt -! // uart_disableInterrupts(); -! // -! // DISABLE_INTERRUPTS(); -! // openserial_vars.mode=MODE_OFF; -! // ENABLE_INTERRUPTS(); -! // //the inputBuffer has to be reset if it is not reset where the data is read. -! // //or the function openserial_getInputBuffer is called (which resets the buffer) -! // if (busyReceiving==TRUE){ -! // openserial_printError(COMPONENT_OPENSERIAL,ERR_BUSY_RECEIVING, -! // (errorparameter_t)0, -! // (errorparameter_t)inputBufFill); -! // } -! // -! // if (busyReceiving == FALSE && inputBufFill>0) { -! // DISABLE_INTERRUPTS(); -! // cmdByte = openserial_vars.inputBuf[0]; -! // ENABLE_INTERRUPTS(); -! // switch (cmdByte) { -! // case SERFRAME_PC2MOTE_SETROOT: -! // idmanager_triggerAboutRoot(); -! // break; -! // case SERFRAME_PC2MOTE_SETBRIDGE: -! // idmanager_triggerAboutBridge(); -! // break; -! // case SERFRAME_PC2MOTE_DATA: -! // openbridge_triggerData(); -! // break; -! // case SERFRAME_PC2MOTE_TRIGGERTCPINJECT: -! // tcpinject_trigger(); -! // break; -! // case SERFRAME_PC2MOTE_TRIGGERUDPINJECT: -! // udpinject_trigger(); -! // break; -! // case SERFRAME_PC2MOTE_TRIGGERICMPv6ECHO: -! // icmpv6echo_trigger(); -! // break; -! // case SERFRAME_PC2MOTE_TRIGGERSERIALECHO: -! // //echo function must reset input buffer after reading the data. -! // openserial_echo(&openserial_vars.inputBuf[1],inputBufFill-1); -! // break; -! // default: -! // openserial_printError(COMPONENT_OPENSERIAL,ERR_UNSUPPORTED_COMMAND, -! // (errorparameter_t)cmdByte, -! // (errorparameter_t)0); -! // //reset here as it is not being reset in any other callback -! // DISABLE_INTERRUPTS(); -! // openserial_vars.inputBufFill = 0; -! // ENABLE_INTERRUPTS(); -! // break; -! // } -! // } -! // -! // DISABLE_INTERRUPTS(); -! // openserial_vars.inputBufFill = 0; -! // openserial_vars.busyReceiving = FALSE; -! // ENABLE_INTERRUPTS(); -! } -! -! /** -! \brief Trigger this module to print status information, over serial. -! -! debugPrint_* functions are used by the openserial module to continuously print -! status information about several modules in the OpenWSN stack. -! -! \returns TRUE if this function printed something, FALSE otherwise. -! */ -! bool debugPrint_outBufferIndexes(void) { -! // uint16_t temp_buffer[2]; -! // INTERRUPT_DECLARATION(); -! // DISABLE_INTERRUPTS(); -! // temp_buffer[0] = openserial_vars.outputBufIdxW; -! // temp_buffer[1] = openserial_vars.outputBufIdxR; -! // ENABLE_INTERRUPTS(); -! // openserial_printStatus(STATUS_OUTBUFFERINDEXES,(uint8_t*)temp_buffer,sizeof(temp_buffer)); -! return TRUE; -! } -! -! //=========================== private ========================================= -! -! //===== hdlc (output) -! -! /** -! \brief Start an HDLC frame in the output buffer. -! */ -! // inline void outputHdlcOpen(void) { -! // // initialize the value of the CRC -! // openserial_vars.outputCrc = HDLC_CRCINIT; -! // -! // // write the opening HDLC flag -! // openserial_vars.outputBuf[openserial_vars.outputBufIdxW++] = HDLC_FLAG; -! // } -! /** -! \brief Add a byte to the outgoing HDLC frame being built. -! */ -! // inline void outputHdlcWrite(uint8_t b) { -! // -! // // iterate through CRC calculator -! // openserial_vars.outputCrc = crcIteration(openserial_vars.outputCrc,b); -! // -! // // add byte to buffer -! // if (b==HDLC_FLAG || b==HDLC_ESCAPE) { -! // openserial_vars.outputBuf[openserial_vars.outputBufIdxW++] = HDLC_ESCAPE; -! // b = b^HDLC_ESCAPE_MASK; -! // } -! // openserial_vars.outputBuf[openserial_vars.outputBufIdxW++] = b; -! // -! // } -! /** -! \brief Finalize the outgoing HDLC frame. -! */ -! // inline void outputHdlcClose(void) { -! // uint16_t finalCrc; -! // -! // // finalize the calculation of the CRC -! // finalCrc = ~openserial_vars.outputCrc; -! // -! // // write the CRC value -! // outputHdlcWrite((finalCrc>>0)&0xff); -! // outputHdlcWrite((finalCrc>>8)&0xff); -! // -! // // write the closing HDLC flag -! // openserial_vars.outputBuf[openserial_vars.outputBufIdxW++] = HDLC_FLAG; -! // } -! -! //===== hdlc (input) -! -! /** -! \brief Start an HDLC frame in the input buffer. -! */ -! // inline void inputHdlcOpen(void) { -! // // reset the input buffer index -! // openserial_vars.inputBufFill = 0; -! // -! // // initialize the value of the CRC -! // openserial_vars.inputCrc = HDLC_CRCINIT; -! // } -! /** -! \brief Add a byte to the incoming HDLC frame. -! */ -! // inline void inputHdlcWrite(uint8_t b) { -! // if (b==HDLC_ESCAPE) { -! // openserial_vars.inputEscaping = TRUE; -! // } else { -! // if (openserial_vars.inputEscaping==TRUE) { -! // b = b^HDLC_ESCAPE_MASK; -! // openserial_vars.inputEscaping = FALSE; -! // } -! // -! // // add byte to input buffer -! // openserial_vars.inputBuf[openserial_vars.inputBufFill] = b; -! // openserial_vars.inputBufFill++; -! // -! // // iterate through CRC calculator -! // openserial_vars.inputCrc = crcIteration(openserial_vars.inputCrc,b); -! // } -! // } -! /** -! \brief Finalize the incoming HDLC frame. -! */ -! // inline void inputHdlcClose(void) { -! // -! // // verify the validity of the frame -! // if (openserial_vars.inputCrc==HDLC_CRCGOOD) { -! // // the CRC is correct -! // -! // // remove the CRC from the input buffer -! // openserial_vars.inputBufFill -= 2; -! // } else { -! // // the CRC is incorrect -! // -! // // drop the incoming fram -! // openserial_vars.inputBufFill = 0; -! // } -! // } -! -! //=========================== interrupt handlers ============================== -! -! // executed in ISR, called from scheduler.c -! // void isr_openserial_tx(void) { -! // switch (openserial_vars.mode) { -! // case MODE_INPUT: -! // openserial_vars.reqFrameIdx++; -! // if (openserial_vars.reqFrameIdx<sizeof(openserial_vars.reqFrame)) { -! // uart_writeByte(openserial_vars.reqFrame[openserial_vars.reqFrameIdx]); -! // } -! // break; -! // case MODE_OUTPUT: -! // if (openserial_vars.outputBufIdxW==openserial_vars.outputBufIdxR) { -! // openserial_vars.outputBufFilled = FALSE; -! // } -! // if (openserial_vars.outputBufFilled) { -! // uart_writeByte(openserial_vars.outputBuf[openserial_vars.outputBufIdxR++]); -! // } -! // break; -! // case MODE_OFF: -! // default: -! // break; -! // } -! // } -! -! // executed in ISR, called from scheduler.c -! // void isr_openserial_rx(void) { -! // uint8_t rxbyte; -! // uint8_t inputBufFill; -! // -! // // stop if I'm not in input mode -! // if (openserial_vars.mode!=MODE_INPUT) { -! // return; -! // } -! // -! // // read byte just received -! // rxbyte = uart_readByte(); -! // //keep lenght -! // inputBufFill=openserial_vars.inputBufFill; -! // -! // if ( -! // openserial_vars.busyReceiving==FALSE && -! // openserial_vars.lastRxByte==HDLC_FLAG && -! // rxbyte!=HDLC_FLAG -! // ) { -! // // start of frame -! // -! // // I'm now receiving -! // openserial_vars.busyReceiving = TRUE; -! // -! // // create the HDLC frame -! // inputHdlcOpen(); -! // -! // // add the byte just received -! // inputHdlcWrite(rxbyte); -! // } else if ( -! // openserial_vars.busyReceiving==TRUE && -! // rxbyte!=HDLC_FLAG -! // ) { -! // // middle of frame -! // -! // // add the byte just received -! // inputHdlcWrite(rxbyte); -! // if (openserial_vars.inputBufFill+1>SERIAL_INPUT_BUFFER_SIZE){ -! // // input buffer overflow -! // openserial_printError(COMPONENT_OPENSERIAL,ERR_INPUT_BUFFER_OVERFLOW, -! // (errorparameter_t)0, -! // (errorparameter_t)0); -! // openserial_vars.inputBufFill = 0; -! // openserial_vars.busyReceiving = FALSE; -! // openserial_stop(); -! // } -! // } else if ( -! // openserial_vars.busyReceiving==TRUE && -! // rxbyte==HDLC_FLAG -! // ) { -! // // end of frame -! // -! // // finalize the HDLC frame -! // inputHdlcClose(); -! // -! // if (openserial_vars.inputBufFill==0){ -! // // invalid HDLC frame -! // openserial_printError(COMPONENT_OPENSERIAL,ERR_WRONG_CRC_INPUT, -! // (errorparameter_t)inputBufFill, -! // (errorparameter_t)0); -! // -! // } -! // -! // openserial_vars.busyReceiving = FALSE; -! // openserial_stop(); -! // } -! // -! // openserial_vars.lastRxByte = rxbyte; -! // } -! -! //======== SERIAL ECHO ============= -! -! void openserial_echo(uint8_t* buf, uint8_t bufLen){ -! INTERRUPT_DECLARATION(); -! // echo back what you received -! openserial_printData( -! buf, -! bufLen -! ); -! -! DISABLE_INTERRUPTS(); -! openserial_vars.inputBufFill = 0; -! ENABLE_INTERRUPTS(); -! } -diff -crB openwsn/openserial.h ../../../sys/net/openwsn/openserial.h -*** openwsn/openserial.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/openserial.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,94 **** -! /** -! \brief Declaration of the "openserial" driver. -! -! \author Fabien Chraim <chraim@eecs.berkeley.edu>, March 2012. -! */ -! -! #ifndef __OPENSERIAL_H -! #define __OPENSERIAL_H -! -! #include "openwsn.h" -! -! /** -! \addtogroup cross-layers -! \{ -! \addtogroup OpenSerial -! \{ -! */ -! -! //=========================== define ========================================== -! -! /** -! \brief Number of bytes of the serial output buffer, in bytes. -! -! \warning should be exactly 256 so wrap-around on the index does not require -! the use of a slow modulo operator. -! */ -! #define SERIAL_OUTPUT_BUFFER_SIZE 256 // leave at 256! -! -! /** -! \brief Number of bytes of the serial input buffer, in bytes. -! -! \warning Do not pick a number greater than 255, since its filling level is -! encoded by a single byte in the code. -! */ -! #define SERIAL_INPUT_BUFFER_SIZE 200 -! -! /// Modes of the openserial module. -! enum { -! MODE_OFF = 0, ///< The module is off, no serial activity. -! MODE_INPUT = 1, ///< The serial is listening or receiving bytes. -! MODE_OUTPUT = 2 ///< The serial is transmitting bytes. -! }; -! -! // frames sent mote->PC -! #define SERFRAME_MOTE2PC_DATA ((uint8_t)'D') -! #define SERFRAME_MOTE2PC_STATUS ((uint8_t)'S') -! #define SERFRAME_MOTE2PC_INFO ((uint8_t)'I') -! #define SERFRAME_MOTE2PC_ERROR ((uint8_t)'E') -! #define SERFRAME_MOTE2PC_CRITICAL ((uint8_t)'C') -! #define SERFRAME_MOTE2PC_REQUEST ((uint8_t)'R') -! -! // frames sent PC->mote -! #define SERFRAME_PC2MOTE_SETROOT ((uint8_t)'R') -! #define SERFRAME_PC2MOTE_SETBRIDGE ((uint8_t)'B') -! #define SERFRAME_PC2MOTE_DATA ((uint8_t)'D') -! #define SERFRAME_PC2MOTE_TRIGGERTCPINJECT ((uint8_t)'T') -! #define SERFRAME_PC2MOTE_TRIGGERUDPINJECT ((uint8_t)'U') -! #define SERFRAME_PC2MOTE_TRIGGERICMPv6ECHO ((uint8_t)'E') -! #define SERFRAME_PC2MOTE_TRIGGERSERIALECHO ((uint8_t)'S') -! -! //=========================== typedef ========================================= -! -! //=========================== prototypes ====================================== -! -! void openserial_init(); -! error_t openserial_printStatus(uint8_t statusElement, uint8_t* buffer, uint16_t length); -! error_t openserial_printInfo(uint8_t calling_component, uint8_t error_code, -! errorparameter_t arg1, -! errorparameter_t arg2); -! error_t openserial_printError(uint8_t calling_component, uint8_t error_code, -! errorparameter_t arg1, -! errorparameter_t arg2); -! error_t openserial_printCritical(uint8_t calling_component, uint8_t error_code, -! errorparameter_t arg1, -! errorparameter_t arg2); -! error_t openserial_printData(uint8_t* buffer, uint8_t length); -! uint8_t openserial_getNumDataBytes(); -! uint8_t openserial_getInputBuffer(uint8_t* bufferToWrite, uint8_t maxNumBytes); -! void openserial_startInput(); -! void openserial_startOutput(); -! void openserial_stop(); -! bool debugPrint_outBufferIndexes(); -! void openserial_echo(uint8_t* but, uint8_t bufLen); -! -! // interrupt handlers -! void isr_openserial_rx(); -! void isr_openserial_tx(); -! -! /** -! \} -! \} -! */ -! - #endif -\ No newline at end of file ---- 1,117 ---- -! /** -! \brief Declaration of the "openserial" driver. -! -! \author Fabien Chraim <chraim@eecs.berkeley.edu>, March 2012. -! */ -! -! #ifndef __OPENSERIAL_H -! #define __OPENSERIAL_H -! -! #include "openwsn.h" -! -! /** -! \addtogroup drivers -! \{ -! \addtogroup OpenSerial -! \{ -! */ -! -! //=========================== define ========================================== -! -! /** -! \brief Number of bytes of the serial output buffer, in bytes. -! -! \warning should be exactly 256 so wrap-around on the index does not require -! the use of a slow modulo operator. -! */ -! #define SERIAL_OUTPUT_BUFFER_SIZE 256 // leave at 256! -! -! /** -! \brief Number of bytes of the serial input buffer, in bytes. -! -! \warning Do not pick a number greater than 255, since its filling level is -! encoded by a single byte in the code. -! */ -! #define SERIAL_INPUT_BUFFER_SIZE 200 -! -! /// Modes of the openserial module. -! enum { -! MODE_OFF = 0, ///< The module is off, no serial activity. -! MODE_INPUT = 1, ///< The serial is listening or receiving bytes. -! MODE_OUTPUT = 2 ///< The serial is transmitting bytes. -! }; -! -! // frames sent mote->PC -! #define SERFRAME_MOTE2PC_DATA ((uint8_t)'D') -! #define SERFRAME_MOTE2PC_STATUS ((uint8_t)'S') -! #define SERFRAME_MOTE2PC_INFO ((uint8_t)'I') -! #define SERFRAME_MOTE2PC_ERROR ((uint8_t)'E') -! #define SERFRAME_MOTE2PC_CRITICAL ((uint8_t)'C') -! #define SERFRAME_MOTE2PC_REQUEST ((uint8_t)'R') -! -! // frames sent PC->mote -! #define SERFRAME_PC2MOTE_SETROOT ((uint8_t)'R') -! #define SERFRAME_PC2MOTE_SETBRIDGE ((uint8_t)'B') -! #define SERFRAME_PC2MOTE_DATA ((uint8_t)'D') -! #define SERFRAME_PC2MOTE_TRIGGERTCPINJECT ((uint8_t)'T') -! #define SERFRAME_PC2MOTE_TRIGGERUDPINJECT ((uint8_t)'U') -! #define SERFRAME_PC2MOTE_TRIGGERICMPv6ECHO ((uint8_t)'E') -! #define SERFRAME_PC2MOTE_TRIGGERSERIALECHO ((uint8_t)'S') -! -! //=========================== typedef ========================================= -! -! //=========================== module variables ================================ -! -! typedef struct { -! // admin -! uint8_t mode; -! uint8_t debugPrintCounter; -! // input -! uint8_t reqFrame[1+1+2+1]; // flag (1B), command (2B), CRC (2B), flag (1B) -! uint8_t reqFrameIdx; -! uint8_t lastRxByte; -! bool busyReceiving; -! bool inputEscaping; -! uint16_t inputCrc; -! uint8_t inputBufFill; -! uint8_t inputBuf[SERIAL_INPUT_BUFFER_SIZE]; -! // output -! bool outputBufFilled; -! uint16_t outputCrc; -! uint8_t outputBufIdxW; -! uint8_t outputBufIdxR; -! uint8_t outputBuf[SERIAL_OUTPUT_BUFFER_SIZE]; -! } openserial_vars_t; -! -! //=========================== prototypes ====================================== -! -! void openserial_init(void); -! owerror_t openserial_printStatus(uint8_t statusElement, uint8_t* buffer, uint8_t length); -! owerror_t openserial_printInfo(uint8_t calling_component, uint8_t error_code, -! errorparameter_t arg1, -! errorparameter_t arg2); -! owerror_t openserial_printError(uint8_t calling_component, uint8_t error_code, -! errorparameter_t arg1, -! errorparameter_t arg2); -! owerror_t openserial_printCritical(uint8_t calling_component, uint8_t error_code, -! errorparameter_t arg1, -! errorparameter_t arg2); -! owerror_t openserial_printData(uint8_t* buffer, uint8_t length); -! uint8_t openserial_getNumDataBytes(void); -! uint8_t openserial_getInputBuffer(uint8_t* bufferToWrite, uint8_t maxNumBytes); -! void openserial_startInput(void); -! void openserial_startOutput(void); -! void openserial_stop(void); -! bool debugPrint_outBufferIndexes(void); -! void openserial_echo(uint8_t* but, uint8_t bufLen); -! -! // interrupt handlers -! void isr_openserial_rx(void); -! void isr_openserial_tx(void); -! -! /** -! \} -! \} -! */ -! - #endif -\ No newline at end of file -diff -crB openwsn/opentimers.c ../../../sys/net/openwsn/opentimers.c -*** openwsn/opentimers.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/opentimers.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,284 **** -! /** -! \brief Definition of the "opentimers" driver. -! -! This driver uses a single hardware timer, which it virtualizes to support -! at most MAX_NUM_TIMERS timers. -! -! \author Xavi Vilajosana <xvilajosana@eecs.berkeley.edu>, March 2012. -! */ -! -! #include "openwsn.h" -! #include "opentimers.h" -! #include "bsp_timer.h" -! #include "leds.h" -! -! //=========================== define ========================================== -! -! //=========================== variables ======================================= -! -! typedef struct { -! opentimers_t timersBuf[MAX_NUM_TIMERS]; -! bool running; -! PORT_TIMER_WIDTH currentTimeout; // current timeout, in ticks -! } opentimers_vars_t; -! -! opentimers_vars_t opentimers_vars; -! //uint32_t counter; //counts the elapsed time. -! -! //=========================== prototypes ====================================== -! -! void opentimers_timer_callback(); -! -! //=========================== public ========================================== -! -! /** -! \brief Initialize this module. -! -! Initializes data structures and hardware timer. -! */ -! void opentimers_init(){ -! uint8_t i; -! -! // initialize local variables -! opentimers_vars.running=FALSE; -! for (i=0;i<MAX_NUM_TIMERS;i++) { -! opentimers_vars.timersBuf[i].period_ticks = 0; -! opentimers_vars.timersBuf[i].ticks_remaining = 0; -! opentimers_vars.timersBuf[i].type = TIMER_ONESHOT; -! opentimers_vars.timersBuf[i].isrunning = FALSE; -! opentimers_vars.timersBuf[i].callback = NULL; -! opentimers_vars.timersBuf[i].hasExpired = FALSE; -! } -! -! // set callback for bsp_timers module -! bsp_timer_set_callback(opentimers_timer_callback); -! } -! -! /** -! \brief Start a timer. -! -! The timer works as follows: -! - currentTimeout is the number of ticks before the next timer expires. -! - if a new timer is inserted, we check that it is not earlier than the soonest -! - if it is earliest, replace it -! - if not, insert it in the list -! -! \param duration Number milli-seconds after which the timer will fire. -! \param type The type of timer, indicating whether it's a one-shot or a period timer. -! \param callback The function to call when the timer fires. -! -! \returns The id of the timer (which serves as a handler to stop it) if the -! timer could be started. -! \returns TOO_MANY_TIMERS_ERROR if the timer could NOT be started. -! */ -! opentimer_id_t opentimers_start(uint32_t duration, timer_type_t type, time_type_t timetype, opentimers_cbt callback) { -! -! uint8_t id; -! -! // find an unused timer -! for (id=0; id<MAX_NUM_TIMERS && opentimers_vars.timersBuf[id].isrunning==TRUE; id++); -! -! if (id<MAX_NUM_TIMERS) { -! // we found an unused timer -! -! // register the timer -! if (timetype==TIME_MS) { -! opentimers_vars.timersBuf[id].period_ticks = duration*PORT_TICS_PER_MS; -! opentimers_vars.timersBuf[id].wraps_remaining = (duration*PORT_TICS_PER_MS/MAX_TICKS_IN_SINGLE_CLOCK);//65535=maxValue of uint16_t -! } else if (timetype==TIME_TICS) { -! opentimers_vars.timersBuf[id].period_ticks = duration; -! opentimers_vars.timersBuf[id].wraps_remaining = (duration/MAX_TICKS_IN_SINGLE_CLOCK);//65535=maxValue of uint16_t -! } else { -! while (1); //error -! } -! //if the number of ticks falls below a 16bit value, use it, otherwise set to max 16bit value -! if(opentimers_vars.timersBuf[id].wraps_remaining==0){ -! if (timetype==TIME_MS){ -! opentimers_vars.timersBuf[id].ticks_remaining = duration*PORT_TICS_PER_MS; -! } else if (timetype==TIME_TICS) { -! opentimers_vars.timersBuf[id].ticks_remaining = duration; -! } else { -! // this should never happpen! -! -! // we can not print from within the drivers. Instead: -! // blink the error LED -! leds_error_blink(); -! // reset the board -! board_reset(); -! } -! }else{ -! opentimers_vars.timersBuf[id].ticks_remaining = MAX_TICKS_IN_SINGLE_CLOCK; -! } -! opentimers_vars.timersBuf[id].type = type; -! opentimers_vars.timersBuf[id].isrunning = TRUE; -! opentimers_vars.timersBuf[id].callback = callback; -! opentimers_vars.timersBuf[id].hasExpired = FALSE; -! -! // re-schedule the running timer, if needed -! if ( -! (opentimers_vars.running==FALSE) -! || -! (opentimers_vars.timersBuf[id].ticks_remaining < opentimers_vars.currentTimeout) -! ) { -! opentimers_vars.currentTimeout = opentimers_vars.timersBuf[id].ticks_remaining; -! if (opentimers_vars.running==FALSE) { -! bsp_timer_reset(); -! } -! bsp_timer_scheduleIn(opentimers_vars.timersBuf[id].ticks_remaining); -! } -! -! opentimers_vars.running = TRUE; -! -! } else { -! return TOO_MANY_TIMERS_ERROR; -! } -! -! return id; -! } -! -! /** -! \brief Replace the period of a running timer. -! */ -! void opentimers_setPeriod(opentimer_id_t id,time_type_t timetype,uint32_t newDuration) { -! if (timetype==TIME_MS) { -! opentimers_vars.timersBuf[id].period_ticks = newDuration*PORT_TICS_PER_MS; -! opentimers_vars.timersBuf[id].wraps_remaining = (newDuration*PORT_TICS_PER_MS/MAX_TICKS_IN_SINGLE_CLOCK);//65535=maxValue of uint16_t -! } else if (timetype==TIME_TICS) { -! opentimers_vars.timersBuf[id].period_ticks = newDuration; -! opentimers_vars.timersBuf[id].wraps_remaining = (newDuration/MAX_TICKS_IN_SINGLE_CLOCK);//65535=maxValue of uint16_t -! } else { -! // this should never happpen! -! -! // we can not print from within the drivers. Instead: -! // blink the error LED -! leds_error_blink(); -! // reset the board -! board_reset(); -! } -! if(opentimers_vars.timersBuf[id].wraps_remaining==0) { -! if (timetype==TIME_MS){ -! opentimers_vars.timersBuf[id].ticks_remaining = newDuration*PORT_TICS_PER_MS; -! } else if (timetype==TIME_TICS){ -! opentimers_vars.timersBuf[id].ticks_remaining = newDuration; -! } -! } else { -! opentimers_vars.timersBuf[id].ticks_remaining = MAX_TICKS_IN_SINGLE_CLOCK; -! } -! } -! -! /** -! \brief Stop a running timer. -! -! Sets the timer to "not running". the system recovers even if this was the next -! timer to expire. -! */ -! void opentimers_stop(opentimer_id_t id) { -! opentimers_vars.timersBuf[id].isrunning=FALSE; -! } -! -! /** -! \brief Restart a stop timer. -! -! Sets the timer to " running". -! */ -! void opentimers_restart(opentimer_id_t id) { -! opentimers_vars.timersBuf[id].isrunning=TRUE; -! } -! -! -! //=========================== private ========================================= -! -! /** -! \brief Function called when the hardware timer expires. -! -! Executed in interrupt mode. -! -! This function maps the expiration event to possibly multiple timers, calls the -! corresponding callback(s), and restarts the hardware timer with the next timer -! to expire. -! */ -! void opentimers_timer_callback() { -! -! opentimer_id_t id; -! PORT_TIMER_WIDTH min_timeout; -! bool found; -! -! // step 1. Identify expired timers -! for(id=0; id<MAX_NUM_TIMERS; id++) { -! if (opentimers_vars.timersBuf[id].isrunning==TRUE) { -! -! if(opentimers_vars.currentTimeout >= opentimers_vars.timersBuf[id].ticks_remaining) { -! // this timer has expired -! //check to see if we have completed the whole timer, or we're just wrapping around the max 16bit value -! if(opentimers_vars.timersBuf[id].wraps_remaining == 0){ -! // declare as so -! opentimers_vars.timersBuf[id].hasExpired = TRUE; -! }else{ -! opentimers_vars.timersBuf[id].wraps_remaining--; -! if(opentimers_vars.timersBuf[id].wraps_remaining == 0){ -! //if we have fully wrapped around, then set the remainring ticks to the modulus of the total ticks and the max clock value -! opentimers_vars.timersBuf[id].ticks_remaining = (opentimers_vars.timersBuf[id].period_ticks) % MAX_TICKS_IN_SINGLE_CLOCK; -! }else{ -! opentimers_vars.timersBuf[id].ticks_remaining = MAX_TICKS_IN_SINGLE_CLOCK; -! } -! } -! } else { -! // this timer is not expired -! -! // update its counter -! opentimers_vars.timersBuf[id].ticks_remaining -= opentimers_vars.currentTimeout; -! } -! } -! } -! -! // step 2. call callbacks of expired timers -! for(id=0; id<MAX_NUM_TIMERS; id++) { -! if (opentimers_vars.timersBuf[id].hasExpired==TRUE){ -! -! // call the callback -! opentimers_vars.timersBuf[id].callback(); -! opentimers_vars.timersBuf[id].hasExpired = FALSE; -! -! // reload the timer, if applicable -! if (opentimers_vars.timersBuf[id].type==TIMER_PERIODIC) { -! opentimers_vars.timersBuf[id].wraps_remaining = (opentimers_vars.timersBuf[id].period_ticks/MAX_TICKS_IN_SINGLE_CLOCK);//65535=maxValue of uint16_t -! //if the number of ticks falls below a 16bit value, use it, otherwise set to max 16bit value -! if(opentimers_vars.timersBuf[id].wraps_remaining==0) -! opentimers_vars.timersBuf[id].ticks_remaining = opentimers_vars.timersBuf[id].period_ticks; -! else -! opentimers_vars.timersBuf[id].ticks_remaining = MAX_TICKS_IN_SINGLE_CLOCK; -! -! } else { -! opentimers_vars.timersBuf[id].isrunning = FALSE; -! } -! } -! -! } -! -! // step 3. find the minimum remaining timeout among running timers -! found = FALSE; -! for(id=0;id<MAX_NUM_TIMERS;id++) { -! if ( -! opentimers_vars.timersBuf[id].isrunning==TRUE && -! ( -! found==FALSE -! || -! opentimers_vars.timersBuf[id].ticks_remaining < min_timeout -! ) -! ) { -! min_timeout = opentimers_vars.timersBuf[id].ticks_remaining; -! found = TRUE; -! } -! } -! -! // step 4. schedule next timeout -! if (found==TRUE) { -! // at least one timer pending -! opentimers_vars.currentTimeout = min_timeout; -! bsp_timer_scheduleIn(opentimers_vars.currentTimeout); -! } else { -! // no more timers pending -! opentimers_vars.running = FALSE; -! } -! } -! ---- 1,382 ---- -! /** -! \brief Definition of the "opentimers" driver. -! -! This driver uses a single hardware timer, which it virtualizes to support -! at most MAX_NUM_TIMERS timers. -! -! \author Xavi Vilajosana <xvilajosana@eecs.berkeley.edu>, March 2012. -! */ -! -! #include "openwsn.h" -! #include "opentimers.h" -! //#include "bsp_timer.h" -! #include "leds.h" -! -! #include "hwtimer_arch.h" -! #include "hwtimer_cpu.h" -! -! //=========================== define ========================================== -! -! //=========================== variables ======================================= -! -! opentimers_vars_t opentimers_vars; -! //uint32_t counter; //counts the elapsed time. -! -! //=========================== prototypes ====================================== -! -! void opentimers_int_handler(int); -! void opentimers_timer_callback(void); -! -! //=========================== public ========================================== -! -! /** -! \brief Initialize this module. -! -! Initializes data structures and hardware timer. -! */ -! void opentimers_init(void){ -! uint8_t i; -! -! // initialize local variables -! opentimers_vars.running=FALSE; -! for (i=0;i<MAX_NUM_TIMERS;i++) { -! opentimers_vars.timersBuf[i].period_ticks = 0; -! opentimers_vars.timersBuf[i].ticks_remaining = 0; -! opentimers_vars.timersBuf[i].type = TIMER_ONESHOT; -! opentimers_vars.timersBuf[i].isrunning = FALSE; -! opentimers_vars.timersBuf[i].callback = NULL; -! opentimers_vars.timersBuf[i].hasExpired = FALSE; -! } -! -! // set callback for bsp_timers module -! // bsp_timer_set_callback(opentimers_timer_callback); -! hwtimer_arch_init(opentimers_int_handler, F_CPU); -! } -! -! /** -! \brief opentimers interrupt handler -! -! This is a wrapper to fit the hwtimer_arch API -! */ -! void opentimers_int_handler(int t) { -! (void)t; -! opentimers_timer_callback(); -! } -! -! /** -! \brief Start a timer. -! -! The timer works as follows: -! - currentTimeout is the number of ticks before the next timer expires. -! - if a new timer is inserted, we check that it is not earlier than the soonest -! - if it is earliest, replace it -! - if not, insert it in the list -! -! \param duration Number milli-seconds after which the timer will fire. -! \param type Type of timer: -! - #TIMER_PERIODIC for a periodic timer. -! - #TIMER_ONESHOT for a on-shot timer. -! \param timetype Units of the <tt>duration</tt>: -! - #TIME_MS when <tt>duration</tt> is in ms. -! - #TIME_TICS when <tt>duration</tt> is in clock ticks. -! \param callback The function to call when the timer fires. -! -! \returns The id of the timer (which serves as a handler to stop it) if the -! timer could be started. -! \returns TOO_MANY_TIMERS_ERROR if the timer could NOT be started. -! */ -! opentimer_id_t opentimers_start(uint32_t duration, timer_type_t type, time_type_t timetype, opentimers_cbt callback) { -! -! uint8_t id; -! -! // find an unused timer -! for (id=0; id<MAX_NUM_TIMERS && opentimers_vars.timersBuf[id].isrunning==TRUE; id++); -! -! if (id<MAX_NUM_TIMERS) { -! // we found an unused timer -! -! // register the timer -! if (timetype==TIME_MS) { -! opentimers_vars.timersBuf[id].period_ticks = duration*PORT_TICS_PER_MS; -! opentimers_vars.timersBuf[id].wraps_remaining = (duration*PORT_TICS_PER_MS/MAX_TICKS_IN_SINGLE_CLOCK);//65535=maxValue of uint16_t -! } else if (timetype==TIME_TICS) { -! opentimers_vars.timersBuf[id].period_ticks = duration; -! opentimers_vars.timersBuf[id].wraps_remaining = (duration/MAX_TICKS_IN_SINGLE_CLOCK);//65535=maxValue of uint16_t -! } else { -! while (1); //error -! } -! //if the number of ticks falls below a 16bit value, use it, otherwise set to max 16bit value -! if(opentimers_vars.timersBuf[id].wraps_remaining==0){ -! if (timetype==TIME_MS){ -! opentimers_vars.timersBuf[id].ticks_remaining = duration*PORT_TICS_PER_MS; -! } else if (timetype==TIME_TICS) { -! opentimers_vars.timersBuf[id].ticks_remaining = duration; -! } else { -! // this should never happpen! -! -! // we can not print from within the drivers. Instead: -! // blink the error LED -! leds_error_blink(); -! // reset the board -! board_reset(); -! } -! }else{ -! opentimers_vars.timersBuf[id].ticks_remaining = MAX_TICKS_IN_SINGLE_CLOCK; -! } -! opentimers_vars.timersBuf[id].type = type; -! opentimers_vars.timersBuf[id].isrunning = TRUE; -! opentimers_vars.timersBuf[id].callback = callback; -! opentimers_vars.timersBuf[id].hasExpired = FALSE; -! -! // re-schedule the running timer, if needed -! if ( -! (opentimers_vars.running==FALSE) -! || -! (opentimers_vars.timersBuf[id].ticks_remaining < opentimers_vars.currentTimeout) -! ) { -! opentimers_vars.currentTimeout = opentimers_vars.timersBuf[id].ticks_remaining; -! if (opentimers_vars.running==FALSE) { -! //bsp_timer_reset(); -! hwtimer_arch_unset(OPENTIMERS_HWTIMER_ID); -! } -! // bsp_timer_scheduleIn(opentimers_vars.timersBuf[id].ticks_remaining); -! hwtimer_arch_set(opentimers_vars.timersBuf[id].ticks_remaining, OPENTIMERS_HWTIMER_ID); -! } -! -! opentimers_vars.running = TRUE; -! -! } else { -! return TOO_MANY_TIMERS_ERROR; -! } -! -! return id; -! } -! -! /** -! \brief Replace the period of a running timer. -! */ -! void opentimers_setPeriod(opentimer_id_t id,time_type_t timetype,uint32_t newDuration) { -! if (timetype==TIME_MS) { -! opentimers_vars.timersBuf[id].period_ticks = newDuration*PORT_TICS_PER_MS; -! opentimers_vars.timersBuf[id].wraps_remaining = (newDuration*PORT_TICS_PER_MS/MAX_TICKS_IN_SINGLE_CLOCK);//65535=maxValue of uint16_t -! } else if (timetype==TIME_TICS) { -! opentimers_vars.timersBuf[id].period_ticks = newDuration; -! opentimers_vars.timersBuf[id].wraps_remaining = (newDuration/MAX_TICKS_IN_SINGLE_CLOCK);//65535=maxValue of uint16_t -! } else { -! // this should never happpen! -! -! // we can not print from within the drivers. Instead: -! // blink the error LED -! leds_error_blink(); -! // reset the board -! board_reset(); -! } -! if(opentimers_vars.timersBuf[id].wraps_remaining==0) { -! if (timetype==TIME_MS){ -! opentimers_vars.timersBuf[id].ticks_remaining = newDuration*PORT_TICS_PER_MS; -! } else if (timetype==TIME_TICS){ -! opentimers_vars.timersBuf[id].ticks_remaining = newDuration; -! } -! } else { -! opentimers_vars.timersBuf[id].ticks_remaining = MAX_TICKS_IN_SINGLE_CLOCK; -! } -! } -! -! /** -! \brief Stop a running timer. -! -! Sets the timer to "not running". the system recovers even if this was the next -! timer to expire. -! */ -! void opentimers_stop(opentimer_id_t id) { -! opentimers_vars.timersBuf[id].isrunning=FALSE; -! } -! -! /** -! \brief Restart a stop timer. -! -! Sets the timer to " running". -! */ -! void opentimers_restart(opentimer_id_t id) { -! opentimers_vars.timersBuf[id].isrunning=TRUE; -! } -! -! -! //=========================== private ========================================= -! -! /** -! \brief Function called when the hardware timer expires. -! -! Executed in interrupt mode. -! -! This function maps the expiration event to possibly multiple timers, calls the -! corresponding callback(s), and restarts the hardware timer with the next timer -! to expire. -! */ -! void opentimers_timer_callback(void) { -! -! opentimer_id_t id; -! PORT_TIMER_WIDTH min_timeout; -! bool found; -! -! // step 1. Identify expired timers -! for(id=0; id<MAX_NUM_TIMERS; id++) { -! if (opentimers_vars.timersBuf[id].isrunning==TRUE) { -! -! if(opentimers_vars.currentTimeout >= opentimers_vars.timersBuf[id].ticks_remaining) { -! // this timer has expired -! //check to see if we have completed the whole timer, or we're just wrapping around the max 16bit value -! if(opentimers_vars.timersBuf[id].wraps_remaining == 0){ -! // declare as so -! opentimers_vars.timersBuf[id].hasExpired = TRUE; -! }else{ -! opentimers_vars.timersBuf[id].wraps_remaining--; -! if(opentimers_vars.timersBuf[id].wraps_remaining == 0){ -! //if we have fully wrapped around, then set the remainring ticks to the modulus of the total ticks and the max clock value -! opentimers_vars.timersBuf[id].ticks_remaining = (opentimers_vars.timersBuf[id].period_ticks) % MAX_TICKS_IN_SINGLE_CLOCK; -! }else{ -! opentimers_vars.timersBuf[id].ticks_remaining = MAX_TICKS_IN_SINGLE_CLOCK; -! } -! } -! } else { -! // this timer is not expired -! -! // update its counter -! opentimers_vars.timersBuf[id].ticks_remaining -= opentimers_vars.currentTimeout; -! } -! } -! } -! -! // step 2. call callbacks of expired timers -! for(id=0; id<MAX_NUM_TIMERS; id++) { -! if (opentimers_vars.timersBuf[id].hasExpired==TRUE){ -! -! // call the callback -! opentimers_vars.timersBuf[id].callback(); -! opentimers_vars.timersBuf[id].hasExpired = FALSE; -! -! // reload the timer, if applicable -! if (opentimers_vars.timersBuf[id].type==TIMER_PERIODIC) { -! opentimers_vars.timersBuf[id].wraps_remaining = (opentimers_vars.timersBuf[id].period_ticks/MAX_TICKS_IN_SINGLE_CLOCK);//65535=maxValue of uint16_t -! //if the number of ticks falls below a 16bit value, use it, otherwise set to max 16bit value -! if(opentimers_vars.timersBuf[id].wraps_remaining==0) -! opentimers_vars.timersBuf[id].ticks_remaining = opentimers_vars.timersBuf[id].period_ticks; -! else -! opentimers_vars.timersBuf[id].ticks_remaining = MAX_TICKS_IN_SINGLE_CLOCK; -! -! } else { -! opentimers_vars.timersBuf[id].isrunning = FALSE; -! } -! } -! -! } -! -! // step 3. find the minimum remaining timeout among running timers -! found = FALSE; -! for(id=0;id<MAX_NUM_TIMERS;id++) { -! if ( -! opentimers_vars.timersBuf[id].isrunning==TRUE && -! ( -! found==FALSE -! || -! opentimers_vars.timersBuf[id].ticks_remaining < min_timeout -! ) -! ) { -! min_timeout = opentimers_vars.timersBuf[id].ticks_remaining; -! found = TRUE; -! } -! } -! -! // step 4. schedule next timeout -! if (found==TRUE) { -! // at least one timer pending -! opentimers_vars.currentTimeout = min_timeout; -! // bsp_timer_scheduleIn(opentimers_vars.currentTimeout); -! hwtimer_arch_set(opentimers_vars.currentTimeout, OPENTIMERS_HWTIMER_ID); -! } else { -! // no more timers pending -! opentimers_vars.running = FALSE; -! } -! } -! -! void opentimers_sleepTimeCompesation(uint16_t sleepTime) -! { -! opentimer_id_t id; -! PORT_TIMER_WIDTH min_timeout; -! bool found; -! -! //step 1. reCount the ticks_remain after waking up from sleep -! for(id=0; id<MAX_NUM_TIMERS; id++) -! { -! if (opentimers_vars.timersBuf[id].isrunning==TRUE) -! { -! if(opentimers_vars.timersBuf[id].ticks_remaining > sleepTime) -! { -! opentimers_vars.timersBuf[id].ticks_remaining -= sleepTime; -! } -! else -! { -! if(opentimers_vars.timersBuf[id].wraps_remaining > 0) -! { -! opentimers_vars.timersBuf[id].wraps_remaining--; -! opentimers_vars.timersBuf[id].ticks_remaining += (MAX_TICKS_IN_SINGLE_CLOCK - sleepTime); -! } -! else -! { -! opentimers_vars.timersBuf[id].hasExpired = TRUE; -! } -! } -! } -! } -! -! // step 2. call callbacks of expired timers -! for(id=0; id<MAX_NUM_TIMERS; id++) { -! if (opentimers_vars.timersBuf[id].hasExpired==TRUE){ -! -! // call the callback -! opentimers_vars.timersBuf[id].callback(); -! opentimers_vars.timersBuf[id].hasExpired = FALSE; -! -! // reload the timer, if applicable -! if (opentimers_vars.timersBuf[id].type==TIMER_PERIODIC) { -! opentimers_vars.timersBuf[id].wraps_remaining = (opentimers_vars.timersBuf[id].period_ticks/MAX_TICKS_IN_SINGLE_CLOCK);//65535=maxValue of uint16_t -! //if the number of ticks falls below a 16bit value, use it, otherwise set to max 16bit value -! if(opentimers_vars.timersBuf[id].wraps_remaining==0) -! opentimers_vars.timersBuf[id].ticks_remaining = opentimers_vars.timersBuf[id].period_ticks; -! else -! opentimers_vars.timersBuf[id].ticks_remaining = MAX_TICKS_IN_SINGLE_CLOCK; -! -! } else { -! opentimers_vars.timersBuf[id].isrunning = FALSE; -! } -! } -! -! } -! -! // step 3. find the minimum remaining timeout among running timers -! found = FALSE; -! for(id=0;id<MAX_NUM_TIMERS;id++) { -! if ( -! opentimers_vars.timersBuf[id].isrunning==TRUE && -! ( -! found==FALSE -! || -! opentimers_vars.timersBuf[id].ticks_remaining < min_timeout -! ) -! ) { -! min_timeout = opentimers_vars.timersBuf[id].ticks_remaining; -! found = TRUE; -! } -! } -! -! // step 4. schedule next timeout -! if (found==TRUE) { -! // at least one timer pending -! opentimers_vars.currentTimeout = min_timeout; -! // bsp_timer_scheduleIn(opentimers_vars.currentTimeout); -! hwtimer_arch_set(opentimers_vars.currentTimeout, OPENTIMERS_HWTIMER_ID); -! } else { -! // no more timers pending -! opentimers_vars.running = FALSE; -! } -! } -diff -crB openwsn/opentimers.h ../../../sys/net/openwsn/opentimers.h -*** openwsn/opentimers.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/opentimers.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,60 **** -! /** -! \brief Declaration of the "opentimers" driver. -! -! \author Xavi Vilajosana <xvilajosana@eecs.berkeley.edu>, March 2012. -! */ -! -! #ifndef __OPENTIMERS_H -! #define __OPENTIMERS_H -! -! #include "openwsn.h" -! -! //=========================== define ========================================== -! -! /// Maximum number of timers that can run concurrently -! #define MAX_NUM_TIMERS 10 -! -! #define MAX_TICKS_IN_SINGLE_CLOCK ((PORT_TIMER_WIDTH)0xFFFFFFFF) -! -! #define TOO_MANY_TIMERS_ERROR 255 -! -! #define opentimer_id_t uint8_t -! -! typedef void (*opentimers_cbt)(void); -! -! //=========================== typedef ========================================= -! -! typedef enum { -! TIMER_PERIODIC, -! TIMER_ONESHOT, -! } timer_type_t; -! -! /*the time can be in tics or in ms*/ -! typedef enum { -! TIME_MS, -! TIME_TICS, -! } time_type_t; -! -! typedef struct { -! uint32_t period_ticks; // total number of clock ticks -! PORT_TIMER_WIDTH ticks_remaining; // ticks remaining before elapses -! uint16_t wraps_remaining; // the clock register is 16 bit, and can't count beyond 32k... -! // so period_ticks = wraps_remaining*(32k or uint16_t) -! timer_type_t type; // periodic or one-shot -! bool isrunning; // is running? -! opentimers_cbt callback; // function to call when elapses -! bool hasExpired; // whether the callback has to be called -! } opentimers_t; -! -! //=========================== prototypes ====================================== -! -! void opentimers_init(); -! opentimer_id_t opentimers_start(uint32_t duration, -! timer_type_t type, -! time_type_t timetype, -! opentimers_cbt callback); -! void opentimers_setPeriod(opentimer_id_t id,time_type_t timetype, uint32_t newPeriod); -! void opentimers_stop(opentimer_id_t id); -! void opentimers_restart(opentimer_id_t id); -! -! #endif ---- 1,86 ---- -! /** -! \brief Declaration of the "opentimers" driver. -! -! \author Xavi Vilajosana <xvilajosana@eecs.berkeley.edu>, March 2012. -! */ -! -! #ifndef __OPENTIMERS_H -! #define __OPENTIMERS_H -! -! #include "openwsn.h" -! -! #include "hwtimer_cpu.h" -! -! /** -! \addtogroup drivers -! \{ -! \addtogroup OpenTimers -! \{ -! */ -! -! //=========================== define ========================================== -! -! /// Maximum number of timers that can run concurrently -! #define MAX_NUM_TIMERS 10 -! -! #define MAX_TICKS_IN_SINGLE_CLOCK ((PORT_TIMER_WIDTH)0xFFFFFFFF) -! -! #define TOO_MANY_TIMERS_ERROR 255 -! -! #define opentimer_id_t uint8_t -! -! typedef void (*opentimers_cbt)(void); -! -! #define OPENTIMERS_HWTIMER_ID (HWTIMER_MAXTIMERS - 1) -! -! //=========================== typedef ========================================= -! -! typedef enum { -! TIMER_PERIODIC, -! TIMER_ONESHOT, -! } timer_type_t; -! -! /*the time can be in tics or in ms*/ -! typedef enum { -! TIME_MS, -! TIME_TICS, -! } time_type_t; -! -! typedef struct { -! uint32_t period_ticks; // total number of clock ticks -! PORT_TIMER_WIDTH ticks_remaining; // ticks remaining before elapses -! uint16_t wraps_remaining; // the clock register is 16 bit, and can't count beyond 32k... -! // so period_ticks = wraps_remaining*(32k or uint16_t) -! timer_type_t type; // periodic or one-shot -! bool isrunning; // is running? -! opentimers_cbt callback; // function to call when elapses -! bool hasExpired; // whether the callback has to be called -! } opentimers_t; -! -! //=========================== module variables ================================ -! -! typedef struct { -! opentimers_t timersBuf[MAX_NUM_TIMERS]; -! bool running; -! PORT_TIMER_WIDTH currentTimeout; // current timeout, in ticks -! } opentimers_vars_t; -! -! //=========================== prototypes ====================================== -! -! void opentimers_init(void); -! opentimer_id_t opentimers_start(uint32_t duration, -! timer_type_t type, -! time_type_t timetype, -! opentimers_cbt callback); -! void opentimers_setPeriod(opentimer_id_t id,time_type_t timetype, uint32_t newPeriod); -! void opentimers_stop(opentimer_id_t id); -! void opentimers_restart(opentimer_id_t id); -! -! void opentimers_sleepTimeCompesation(uint16_t sleepTime); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/openwsn.c ../../../sys/net/openwsn/openwsn.c -*** openwsn/openwsn.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/openwsn.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,134 **** -! /** -! \brief General OpenWSN definitions -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, September 2012 -! */ -! -! #include "openwsn.h" -! //===== drivers -! #include "openserial.h" -! //===== stack -! //-- cross-layer -! #include "idmanager.h" -! #include "openqueue.h" -! #include "openrandom.h" -! #include "opentimers.h" -! //-- 02a-TSCH -! #include "IEEE802154E.h" -! //-- 02b-RES -! #include "schedule.h" -! #include "res.h" -! #include "neighbors.h" -! //-- 03a-IPHC -! #include "openbridge.h" -! #include "iphc.h" -! //-- 03b-IPv6 -! #include "forwarding.h" -! #include "icmpv6.h" -! #include "icmpv6echo.h" -! #include "icmpv6rpl.h" -! //-- 04-TRAN -! #include "opentcp.h" -! #include "openudp.h" -! #include "opencoap.h" -! //-- app (common) -! //#include "rreg.h" -! //#include "rwellknown.h" -! //#include "rinfo.h" -! //===== applications -! //-- TCP -! #include "tcpecho.h" -! #include "tcpinject.h" -! #include "tcpprint.h" -! #include "ohlone.h" -! //-- UDP -! #include "udpecho.h" -! #include "udpinject.h" -! #include "udpprint.h" -! //#include "udprand.h" -! //#include "udplatency.h" -! //#include "udpstorm.h" -! //-- CoAP -! //#include "rleds.h" -! //#include "rt.h" -! //#include "rex.h" -! //#include "rheli.h" -! //#include "rrube.h" -! //#include "rxl1.h" -! //#include "layerdebug.h" -! //-- misc -! //#include "heli.h" -! //#include "imu.h" -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void openwsn_init(); -! -! //=========================== public ========================================== -! -! //=========================== private ========================================= -! -! void openwsn_init() { -! //===== drivers -! openserial_init(); -! -! //===== stack -! //-- cross-layer -! idmanager_init(); // call first since initializes EUI64 and isDAGroot -! openqueue_init(); -! openrandom_init(); -! opentimers_init(); -! //-- 02a-TSCH -! ieee154e_init(); -! //-- 02b-RES -! schedule_init(); -! res_init(); -! neighbors_init(); -! //-- 03a-IPHC -! openbridge_init(); -! iphc_init(); -! //-- 03b-IPv6 -! forwarding_init(); -! icmpv6_init(); -! icmpv6echo_init(); -! icmpv6rpl_init(); -! //-- 04-TRAN -! opentcp_init(); -! openudp_init(); -! opencoap_init(); // initialize before any of the CoAP applications -! //-- app (common) -! //rreg_init(); -! //rwellknown_init(); -! //rinfo_init(); -! -! //===== applications -! //-- TCP -! tcpecho_init(); -! tcpinject_init(); -! tcpprint_init(); -! ohlone_init(); -! //-- UDP -! udpecho_init(); -! udpinject_init(); -! udpprint_init(); -! //udprand_init(); -! //udplatency_init(); -! //udpstorm_init(); -! //-- CoAP -! //rleds_init(); -! //rt_init(); -! //rex_init(); -! //rheli_init(); -! //rrube_init(); -! //rxl1_init(); -! //layerdebug_init(); -! //-- misc -! //heli_init(); -! //imu_init(); -! -! openserial_printInfo(COMPONENT_OPENWSN,ERR_BOOTED, -! (errorparameter_t)0, -! (errorparameter_t)0); - } -\ No newline at end of file ---- 1,158 ---- -! /** -! \brief General OpenWSN definitions -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, September 2012 -! */ -! -! #include "openwsn.h" -! #include "scheduler.h" -! #include "thread.h" -! #include "board_ow.h" -! //===== drivers -! #include "openserial.h" -! //===== stack -! //-- cross-layer -! #include "idmanager.h" -! #include "openqueue.h" -! #include "openrandom.h" -! #include "opentimers.h" -! //-- 02a-TSCH -! #include "IEEE802154E.h" -! //-- 02b-RES -! #include "schedule.h" -! #include "res.h" -! #include "neighbors.h" -! //-- 03a-IPHC -! #include "openbridge.h" -! #include "iphc.h" -! //-- 03b-IPv6 -! #include "forwarding.h" -! #include "icmpv6.h" -! #include "icmpv6echo.h" -! #include "icmpv6rpl.h" -! //-- 04-TRAN -! #include "opentcp.h" -! #include "openudp.h" -! #include "opencoap.h" -! //-- app (common) -! //#include "rreg.h" -! #include "rwellknown.h" -! #include "rinfo.h" -! //===== applications -! //-- TCP -! //#include "tcpecho.h" -! //#include "tcpinject.h" -! //#include "tcpprint.h" -! #include "ohlone.h" -! //-- UDP -! #include "udpecho.h" -! #include "udpinject.h" -! #include "udpprint.h" -! //#include "udprand.h" -! //#include "udplatency.h" -! //#include "udpstorm.h" -! //-- CoAP -! //#include "rleds.h" -! //#include "rt.h" -! //#include "rex.h" -! //#include "rheli.h" -! //#include "rrube.h" -! //#include "rxl1.h" -! //#include "layerdebug.h" -! //#include "r6tus.h" -! //-- misc -! //#include "heli.h" -! //#include "imu.h" -! -! //=========================== variables ======================================= -! -! static char openwsn_stack[KERNEL_CONF_STACKSIZE_MAIN]; -! -! //=========================== prototypes ====================================== -! -! void openwsn_init(void); -! void openwsn_start(void); -! -! //=========================== public ========================================== -! -! void openwsn_start_thread(void) { -! puts(__PRETTY_FUNCTION__); -! thread_create(openwsn_stack, KERNEL_CONF_STACKSIZE_MAIN, -! PRIORITY_OPENWSN, CREATE_STACKTEST, -! openwsn_start, "openwsn thread"); -! } -! -! void openwsn_start(void) { -! puts(__PRETTY_FUNCTION__); -! //board_init_ow(); -! scheduler_init(); -! openwsn_init(); -! scheduler_start(); -! } -! -! //=========================== private ========================================= -! -! void openwsn_init(void) { -! puts(__PRETTY_FUNCTION__); -! //===== drivers -! openserial_init(); -! -! //===== stack -! //-- cross-layer -! idmanager_init(); // call first since initializes EUI64 and isDAGroot -! openqueue_init(); -! openrandom_init(); -! opentimers_init(); -! //-- 02a-TSCH -! ieee154e_init(); -! //-- 02b-RES -! schedule_init(); -! res_init(); -! neighbors_init(); -! //-- 03a-IPHC -! openbridge_init(); -! iphc_init(); -! //-- 03b-IPv6 -! forwarding_init(); -! icmpv6_init(); -! icmpv6echo_init(); -! icmpv6rpl_init(); -! //-- 04-TRAN -! opentcp_init(); -! openudp_init(); -! opencoap_init(); // initialize before any of the CoAP applications -! //-- app (common) -! //rreg_init(); -! rwellknown_init(); -! rinfo_init(); -! -! //===== applications -! //-- TCP -! //tcpecho_init(); -! //tcpinject_init(); -! //tcpprint_init(); -! //ohlone_init(); -! //-- UDP -! udpecho_init(); -! udpinject_init(); -! udpprint_init(); -! //udprand_init(); -! //udplatency_init(); -! //udpstorm_init(); -! //-- CoAP -! //rleds_init(); -! //rt_init(); -! //rex_init(); -! //rheli_init(); -! //rrube_init(); -! //rxl1_init(); -! //layerdebug_init(); -! //r6tus_init(); -! //-- misc -! //heli_init(); -! //imu_init(); -! -! openserial_printInfo(COMPONENT_OPENWSN,ERR_BOOTED, -! (errorparameter_t)0, -! (errorparameter_t)0); - } -\ No newline at end of file -diff -crB openwsn/openwsn.h ../../../sys/net/openwsn/openwsn.h -*** openwsn/openwsn.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/openwsn.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,314 **** -! /** -! \brief General OpenWSN definitions -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, August 2010 -! \author Ankur Mehta <mehtank@eecs.berkeley.edu>, September 2010 -! */ -! -! #ifndef __OPENWSN_H -! #define __OPENWSN_H -! -! //general -! #include <stdint.h> // needed for uin8_t, uint16_t -! #include "board_info.h" -! -! //=========================== define ========================================== -! -! static const uint8_t infoStackName[] = "OpenWSN "; -! #define OPENWSN_VERSION_MAJOR 1 -! #define OPENWSN_VERSION_MINOR 2 -! #define OPENWSN_VERSION_PATCH 1 -! -! // enter the last byte of your mote's address if you want it to be an LBR -! #define DEBUG_MOTEID_MASTER 0xe8 -! -! #ifndef TRUE -! #define TRUE 1 -! #endif -! -! #ifndef FALSE -! #define FALSE 0 -! #endif -! -! #define LENGTH_ADDR16b 2 -! #define LENGTH_ADDR64b 8 -! #define LENGTH_ADDR128b 16 -! -! enum { -! E_SUCCESS = 0, -! E_FAIL = 1, -! }; -! -! // types of addresses -! enum { -! ADDR_NONE = 0, -! ADDR_16B = 1, -! ADDR_64B = 2, -! ADDR_128B = 3, -! ADDR_PANID = 4, -! ADDR_PREFIX = 5, -! ADDR_ANYCAST = 6, -! }; -! -! enum { -! LITTLE_ENDIAN = TRUE, -! BIG_ENDIAN = FALSE, -! }; -! -! // protocol numbers, as defined by the IANA -! enum { -! IANA_UNDEFINED = 0x00, -! IANA_TCP = 0x06, -! IANA_UDP = 0x11, -! IANA_IPv6ROUTE = 43, -! IANA_ICMPv6 = 0x3a, -! IANA_ICMPv6_ECHO_REQUEST = 128, -! IANA_ICMPv6_ECHO_REPLY = 129, -! IANA_ICMPv6_RS = 133, -! IANA_ICMPv6_RA = 134, -! IANA_ICMPv6_RA_PREFIX_INFORMATION = 3, -! IANA_ICMPv6_RPL = 155, -! IANA_ICMPv6_RPL_DIO = 0x01, -! IANA_ICMPv6_RPL_DAO = 0x04, -! IANA_RSVP = 46, -! }; -! -! // well known ports (which we define) -! enum { -! //TCP -! WKP_TCP_HTTP = 80, -! WKP_TCP_ECHO = 7, -! WKP_TCP_INJECT = 2188, -! WKP_TCP_DISCARD = 9, -! //UDP -! WKP_UDP_COAP = 5683, -! WKP_UDP_HELI = 2192, -! WKP_UDP_IMU = 2190, -! WKP_UDP_ECHO = 7, -! WKP_UDP_INJECT = 2188, -! WKP_UDP_DISCARD = 9, -! WKP_UDP_RAND = 61000, -! WKP_UDP_LATENCY = 61001, -! }; -! -! //status elements -! enum { -! STATUS_ISSYNC = 0, -! STATUS_ID = 1, -! STATUS_DAGRANK = 2, -! STATUS_OUTBUFFERINDEXES = 3, -! STATUS_ASN = 4, -! STATUS_MACSTATS = 5, -! STATUS_SCHEDULE = 6, -! STATUS_BACKOFF = 7, -! STATUS_QUEUE = 8, -! STATUS_NEIGHBORS = 9, -! STATUS_MAX = 10, -! }; -! -! //component identifiers -! //the order is important because -! enum { -! COMPONENT_NULL = 0x00, -! COMPONENT_OPENWSN = 0x01, -! //cross-layers -! COMPONENT_IDMANAGER = 0x02, -! COMPONENT_OPENQUEUE = 0x03, -! COMPONENT_OPENSERIAL = 0x04, -! COMPONENT_PACKETFUNCTIONS = 0x05, -! COMPONENT_RANDOM = 0x06, -! //PHY -! COMPONENT_RADIO = 0x07, -! //MAClow -! COMPONENT_IEEE802154 = 0x08, -! COMPONENT_IEEE802154E = 0x09, -! -! //All components with higher component id than COMPONENT_IEEE802154E -! //won't be able to get free packets from the queue -! //when the mote is not synch -! -! //MAClow<->MAChigh ("virtual components") -! COMPONENT_RES_TO_IEEE802154E = 0x0a, -! COMPONENT_IEEE802154E_TO_RES = 0x0b, -! //MAChigh -! COMPONENT_RES = 0x0c, -! COMPONENT_NEIGHBORS = 0x0d, -! COMPONENT_SCHEDULE = 0x0e, -! //IPHC -! COMPONENT_OPENBRIDGE = 0x0f, -! COMPONENT_IPHC = 0x10, -! //IPv6 -! COMPONENT_FORWARDING = 0x11, -! COMPONENT_ICMPv6 = 0x12, -! COMPONENT_ICMPv6ECHO = 0x13, -! COMPONENT_ICMPv6ROUTER = 0x14, -! COMPONENT_ICMPv6RPL = 0x15, -! //TRAN -! COMPONENT_OPENTCP = 0x16, -! COMPONENT_OPENUDP = 0x17, -! COMPONENT_OPENCOAP = 0x18, -! //App test -! COMPONENT_TCPECHO = 0x19, -! COMPONENT_TCPINJECT = 0x1a, -! COMPONENT_TCPPRINT = 0x1b, -! COMPONENT_UDPECHO = 0x1c, -! COMPONENT_UDPINJECT = 0x1d, -! COMPONENT_UDPPRINT = 0x1e, -! COMPONENT_RSVP = 0x1f, -! //App -! COMPONENT_OHLONE = 0x20, -! COMPONENT_HELI = 0x21, -! COMPONENT_IMU = 0x22, -! COMPONENT_RLEDS = 0x23, -! COMPONENT_RREG = 0x24, -! COMPONENT_RWELLKNOWN = 0x25, -! COMPONENT_RT = 0x26, -! COMPONENT_REX = 0x27, -! COMPONENT_RXL1 = 0x28, -! COMPONENT_RINFO = 0x29, -! COMPONENT_RHELI = 0x2a, -! COMPONENT_RRUBE = 0x2b, -! COMPONENT_LAYERDEBUG = 0x2c, -! COMPONENT_UDPRAND = 0x2d, -! COMPONENT_UDPSTORM = 0x2e, -! COMPONENT_UDPLATENCY = 0x2f, -! COMPONENT_TEST = 0x30, -! }; -! -! /** -! \brief error codes used throughout the OpenWSN stack -! -! \note The comments are used in the Python parsing tool: -! - {0} refers to the value of the first argument, -! - {1} refers to the value of the second argument, -! */ -! enum { -! // l7 -! ERR_RCVD_ECHO_REQUEST = 0x01, // received an echo request -! ERR_RCVD_ECHO_REPLY = 0x02, // received an echo reply -! ERR_GETDATA_ASKS_TOO_FEW_BYTES = 0x03, // getData asks for too few bytes, maxNumBytes={0}, fill level={1} -! ERR_INPUT_BUFFER_OVERFLOW = 0x04, // the input buffer has overflown -! // l4 -! ERR_WRONG_TRAN_PROTOCOL = 0x05, // unknown transport protocol {0} (code location {1}) -! ERR_WRONG_TCP_STATE = 0x06, // wrong TCP state {0} (code location {1}) -! ERR_TCP_RESET = 0x07, // TCP reset while in state {0} (code location {1}) -! ERR_UNSUPPORTED_PORT_NUMBER = 0x08, // unsupported port number {0} (code location {1}) -! // l3 -! ERR_UNEXPECTED_DAO = 0x09, // unexpected DAO (code location {0}) -! ERR_UNSUPPORTED_ICMPV6_TYPE = 0x0a, // unsupported ICMPv6 type {0} (code location {1}) -! ERR_6LOWPAN_UNSUPPORTED = 0x0b, // unsupported 6LoWPAN parameter {1} at location {0} -! ERR_NO_NEXTHOP = 0x0c, // no next hop -! ERR_INVALID_PARAM = 0x0d, // invalid parameter -! ERR_INVALID_FWDMODE = 0x0e, // invalid forward mode -! ERR_LARGE_DAGRANK = 0x0f, // large DAGrank {0}, set to {1} -! ERR_HOP_LIMIT_REACHED = 0x10, // packet discarded hop limit reached -! // l2b -! ERR_NEIGHBORS_FULL = 0x11, // neighbors table is full (max number of neighbor is {0}) -! ERR_NO_SENT_PACKET = 0x12, // there is no sent packet in queue -! ERR_NO_RECEIVED_PACKET = 0x13, // there is no received packet in queue -! ERR_SCHEDULE_OVERFLOWN = 0x14, // schedule overflown -! // l2a -! ERR_WRONG_CELLTYPE = 0x15, // wrong celltype {0} at slotOffset {1} -! ERR_IEEE154_UNSUPPORTED = 0x16, // unsupported IEEE802.15.4 parameter {1} at location {0} -! ERR_DESYNCHRONIZED = 0x17, // got desynchronized at slotOffset {0} -! ERR_SYNCHRONIZED = 0x18, // synchronized at slotOffset {0} -! ERR_LARGE_TIMECORRECTION = 0x19, // large timeCorr.: {0} ticks (code loc. {1}) -! ERR_WRONG_STATE_IN_ENDFRAME_SYNC = 0x1a, // wrong state {0} in end of frame+sync -! ERR_WRONG_STATE_IN_STARTSLOT = 0x1b, // wrong state {0} in startSlot, at slotOffset {1} -! ERR_WRONG_STATE_IN_TIMERFIRES = 0x1c, // wrong state {0} in timer fires, at slotOffset {1} -! ERR_WRONG_STATE_IN_NEWSLOT = 0x1d, // wrong state {0} in start of frame, at slotOffset {1} -! ERR_WRONG_STATE_IN_ENDOFFRAME = 0x1e, // wrong state {0} in end of frame, at slotOffset {1} -! ERR_MAXTXDATAPREPARE_OVERFLOW = 0x1f, // maxTxDataPrepare overflows while at state {0} in slotOffset {1} -! ERR_MAXRXACKPREPARE_OVERFLOWS = 0x20, // maxRxAckPrepapare overflows while at state {0} in slotOffset {1} -! ERR_MAXRXDATAPREPARE_OVERFLOWS = 0x21, // maxRxDataPrepapre overflows while at state {0} in slotOffset {1} -! ERR_MAXTXACKPREPARE_OVERFLOWS = 0x22, // maxTxAckPrepapre overflows while at state {0} in slotOffset {1} -! ERR_WDDATADURATION_OVERFLOWS = 0x23, // wdDataDuration overflows while at state {0} in slotOffset {1} -! ERR_WDRADIO_OVERFLOWS = 0x24, // wdRadio overflows while at state {0} in slotOffset {1} -! ERR_WDRADIOTX_OVERFLOWS = 0x25, // wdRadioTx overflows while at state {0} in slotOffset {1} -! ERR_WDACKDURATION_OVERFLOWS = 0x26, // wdAckDuration overflows while at state {0} in slotOffset {1} -! // general -! ERR_BUSY_SENDING = 0x27, // busy sending -! ERR_UNEXPECTED_SENDDONE = 0x28, // sendDone for packet I didn't send -! ERR_NO_FREE_PACKET_BUFFER = 0x29, // no free packet buffer (code location {0}) -! ERR_FREEING_UNUSED = 0x2a, // freeing unused memory -! ERR_FREEING_ERROR = 0x2b, // freeing memory unsupported memory -! ERR_UNSUPPORTED_COMMAND = 0x2c, // unsupported command {0} -! ERR_MSG_UNKNOWN_TYPE = 0x2d, // unknown message type {0} -! ERR_WRONG_ADDR_TYPE = 0x2e, // wrong address type {0} (code location {1}) -! ERR_BRIDGE_MISMATCH = 0x2f, // isBridge mismatch (code location {0}) -! ERR_HEADER_TOO_LONG = 0x30, // header too long, length {1} (code location {0}) -! ERR_INPUTBUFFER_LENGTH = 0x31, // input length problem, length={0} -! ERR_BOOTED = 0x32, // booted -! ERR_INVALIDSERIALFRAME = 0x33, // invalid serial frame -! ERR_INVALIDPACKETFROMRADIO = 0x34, // invalid packet from radio, length {1} (code location {0}) -! }; -! -! //=========================== typedef ========================================= -! -! typedef uint16_t errorparameter_t; -! typedef uint16_t dagrank_t; -! typedef uint8_t error_t; -! #define bool uint8_t -! -! PRAGMA(pack(1)); -! typedef struct { -! uint8_t byte4; -! uint16_t bytes2and3; -! uint16_t bytes0and1; -! } asn_t; -! PRAGMA(pack()); -! -! PRAGMA(pack(1)); -! typedef struct { // always written big endian, i.e. MSB in addr[0] -! uint8_t type; -! union { -! uint8_t addr_16b[2]; -! uint8_t addr_64b[8]; -! uint8_t addr_128b[16]; -! uint8_t panid[2]; -! uint8_t prefix[8]; -! }; -! } open_addr_t; -! PRAGMA(pack()); -! -! typedef struct { -! //admin -! uint8_t creator; // the component which called getFreePacketBuffer() -! uint8_t owner; // the component which currently owns the entry -! uint8_t* payload; // pointer to the start of the payload within 'packet' -! uint8_t length; // length in bytes of the payload -! //l4 -! uint8_t l4_protocol; // l4 protocol to be used -! bool l4_protocol_compressed; // is the l4 protocol header compressed? -! uint16_t l4_sourcePortORicmpv6Type; // l4 source port -! uint16_t l4_destination_port; // l4 destination port -! uint8_t* l4_payload; // pointer to the start of the payload of l4 (used for retransmits) -! uint8_t l4_length; // length of the payload of l4 (used for retransmits) -! //l3 -! open_addr_t l3_destinationAdd; // 128b IPv6 destination (down stack) -! open_addr_t l3_sourceAdd; // 128b IPv6 source address -! //l2 -! error_t l2_sendDoneError; // outcome of trying to send this packet -! open_addr_t l2_nextORpreviousHop; // 64b IEEE802.15.4 next (down stack) or previous (up) hop address -! uint8_t l2_frameType; // beacon, data, ack, cmd -! uint8_t l2_dsn; // sequence number of the received frame -! uint8_t l2_retriesLeft; // number Tx retries left before packet dropped (dropped when hits 0) -! uint8_t l2_numTxAttempts; // number Tx attempts -! asn_t l2_asn; // at what ASN the packet was Tx'ed or Rx'ed -! uint8_t* l2_payload; // pointer to the start of the payload of l2 (used for MAC to fill in ASN in ADV) -! //l1 (drivers) -! uint8_t l1_txPower; // power for packet to Tx at -! int8_t l1_rssi; // RSSI of received packet -! uint8_t l1_lqi; // LQI of received packet -! bool l1_crc; // did received packet pass CRC check? -! //the packet -! uint8_t packet[1+1+125+2+1]; // 1B spi address, 1B length, 125B data, 2B CRC, 1B LQI -! } OpenQueueEntry_t; -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void openwsn_init(); -! -! #endif ---- 1,330 ---- -! /** -! \brief General OpenWSN definitions -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, August 2010 -! \author Ankur Mehta <mehtank@eecs.berkeley.edu>, September 2010 -! */ -! -! #ifndef __OPENWSN_H -! #define __OPENWSN_H -! -! //general -! #include <stdint.h> // needed for uin8_t, uint16_t -! #include "board_info.h" -! -! #include <stdbool.h> -! #include "kernel.h" -! //========================= prototypes ======================================== -! void openwsn_start_thread(void); -! -! //=========================== define ========================================== -! -! #define PRIORITY_OPENWSN PRIORITY_MAIN-1 -! -! static const uint8_t infoStackName[] = "OpenWSN "; -! #define OPENWSN_VERSION_MAJOR 1 -! #define OPENWSN_VERSION_MINOR 4 -! #define OPENWSN_VERSION_PATCH 1 -! -! #ifndef TRUE -! #define TRUE 1 -! #endif -! -! #ifndef FALSE -! #define FALSE 0 -! #endif -! -! #define LENGTH_ADDR16b 2 -! #define LENGTH_ADDR64b 8 -! #define LENGTH_ADDR128b 16 -! -! enum { -! E_SUCCESS = 0, -! E_FAIL = 1, -! }; -! -! // types of addresses -! enum { -! ADDR_NONE = 0, -! ADDR_16B = 1, -! ADDR_64B = 2, -! ADDR_128B = 3, -! ADDR_PANID = 4, -! ADDR_PREFIX = 5, -! ADDR_ANYCAST = 6, -! }; -! -! enum { -! OW_LITTLE_ENDIAN = TRUE, -! OW_BIG_ENDIAN = FALSE, -! }; -! -! // protocol numbers, as defined by the IANA -! enum { -! IANA_IPv6HOPOPT = 0x00, -! IANA_TCP = 0x06, -! IANA_UDP = 0x11, -! IANA_IPv6ROUTE = 0x2b, -! IANA_ICMPv6 = 0x3a, -! IANA_ICMPv6_ECHO_REQUEST = 128, -! IANA_ICMPv6_ECHO_REPLY = 129, -! IANA_ICMPv6_RS = 133, -! IANA_ICMPv6_RA = 134, -! IANA_ICMPv6_RA_PREFIX_INFORMATION = 3, -! IANA_ICMPv6_RPL = 155, -! IANA_ICMPv6_RPL_DIO = 0x01, -! IANA_ICMPv6_RPL_DAO = 0x02, -! IANA_RSVP = 46, -! IANA_UNDEFINED = 250, //use an unassigned -! }; -! -! // well known ports (which we define) -! // warning: first 4 MSB of 2° octect may coincide with previous protocol number -! enum { -! //TCP -! WKP_TCP_HTTP = 80, -! WKP_TCP_ECHO = 7, -! WKP_TCP_INJECT = 2188, -! WKP_TCP_DISCARD = 9, -! //UDP -! WKP_UDP_COAP = 5683, -! WKP_UDP_HELI = 2192, -! WKP_UDP_IMU = 2190, -! WKP_UDP_ECHO = 7, -! WKP_UDP_INJECT = 2188, -! WKP_UDP_DISCARD = 9, -! WKP_UDP_RAND = 61000, -! WKP_UDP_LATENCY = 61001, -! }; -! -! //status elements -! enum { -! STATUS_ISSYNC = 0, -! STATUS_ID = 1, -! STATUS_DAGRANK = 2, -! STATUS_OUTBUFFERINDEXES = 3, -! STATUS_ASN = 4, -! STATUS_MACSTATS = 5, -! STATUS_SCHEDULE = 6, -! STATUS_BACKOFF = 7, -! STATUS_QUEUE = 8, -! STATUS_NEIGHBORS = 9, -! STATUS_MAX = 10, -! }; -! -! //component identifiers -! //the order is important because -! enum { -! COMPONENT_NULL = 0x00, -! COMPONENT_OPENWSN = 0x01, -! //cross-layers -! COMPONENT_IDMANAGER = 0x02, -! COMPONENT_OPENQUEUE = 0x03, -! COMPONENT_OPENSERIAL = 0x04, -! COMPONENT_PACKETFUNCTIONS = 0x05, -! COMPONENT_RANDOM = 0x06, -! //PHY -! COMPONENT_RADIO = 0x07, -! //MAClow -! COMPONENT_IEEE802154 = 0x08, -! COMPONENT_IEEE802154E = 0x09, -! -! //All components with higher component id than COMPONENT_IEEE802154E -! //won't be able to get free packets from the queue -! //when the mote is not synch -! -! //MAClow<->MAChigh ("virtual components") -! COMPONENT_RES_TO_IEEE802154E = 0x0a, -! COMPONENT_IEEE802154E_TO_RES = 0x0b, -! //MAChigh -! COMPONENT_RES = 0x0c, -! COMPONENT_NEIGHBORS = 0x0d, -! COMPONENT_SCHEDULE = 0x0e, -! //IPHC -! COMPONENT_OPENBRIDGE = 0x0f, -! COMPONENT_IPHC = 0x10, -! //IPv6 -! COMPONENT_FORWARDING = 0x11, -! COMPONENT_ICMPv6 = 0x12, -! COMPONENT_ICMPv6ECHO = 0x13, -! COMPONENT_ICMPv6ROUTER = 0x14, -! COMPONENT_ICMPv6RPL = 0x15, -! //TRAN -! COMPONENT_OPENTCP = 0x16, -! COMPONENT_OPENUDP = 0x17, -! COMPONENT_OPENCOAP = 0x18, -! //App test -! COMPONENT_TCPECHO = 0x19, -! COMPONENT_TCPINJECT = 0x1a, -! COMPONENT_TCPPRINT = 0x1b, -! COMPONENT_UDPECHO = 0x1c, -! COMPONENT_UDPINJECT = 0x1d, -! COMPONENT_UDPPRINT = 0x1e, -! COMPONENT_RSVP = 0x1f, -! //App -! COMPONENT_OHLONE = 0x20, -! COMPONENT_HELI = 0x21, -! COMPONENT_IMU = 0x22, -! COMPONENT_RLEDS = 0x23, -! COMPONENT_RREG = 0x24, -! COMPONENT_RWELLKNOWN = 0x25, -! COMPONENT_RT = 0x26, -! COMPONENT_REX = 0x27, -! COMPONENT_RXL1 = 0x28, -! COMPONENT_RINFO = 0x29, -! COMPONENT_RHELI = 0x2a, -! COMPONENT_RRUBE = 0x2b, -! COMPONENT_LAYERDEBUG = 0x2c, -! COMPONENT_UDPRAND = 0x2d, -! COMPONENT_UDPSTORM = 0x2e, -! COMPONENT_UDPLATENCY = 0x2f, -! COMPONENT_TEST = 0x30, -! COMPONENT_R6TUS = 0x31, -! }; -! -! /** -! \brief error codes used throughout the OpenWSN stack -! -! \note The comments are used in the Python parsing tool: -! - {0} refers to the value of the first argument, -! - {1} refers to the value of the second argument, -! */ -! enum { -! // l7 -! ERR_RCVD_ECHO_REQUEST = 0x01, // received an echo request -! ERR_RCVD_ECHO_REPLY = 0x02, // received an echo reply -! ERR_GETDATA_ASKS_TOO_FEW_BYTES = 0x03, // getData asks for too few bytes, maxNumBytes={0}, fill level={1} -! ERR_INPUT_BUFFER_OVERFLOW = 0x04, // the input buffer has overflown -! ERR_COMMAND_NOT_ALLOWED = 0x05, // the command is not allowerd, command = {0} -! // l4 -! ERR_WRONG_TRAN_PROTOCOL = 0x06, // unknown transport protocol {0} (code location {1}) -! ERR_WRONG_TCP_STATE = 0x07, // wrong TCP state {0} (code location {1}) -! ERR_TCP_RESET = 0x08, // TCP reset while in state {0} (code location {1}) -! ERR_UNSUPPORTED_PORT_NUMBER = 0x09, // unsupported port number {0} (code location {1}) -! // l3 -! ERR_UNEXPECTED_DAO = 0x0a, // unexpected DAO (code location {0}) -! ERR_UNSUPPORTED_ICMPV6_TYPE = 0x0b, // unsupported ICMPv6 type {0} (code location {1}) -! ERR_6LOWPAN_UNSUPPORTED = 0x0c, // unsupported 6LoWPAN parameter {1} at location {0} -! ERR_NO_NEXTHOP = 0x0d, // no next hop -! ERR_INVALID_PARAM = 0x0e, // invalid parameter -! ERR_INVALID_FWDMODE = 0x0f, // invalid forward mode -! ERR_LARGE_DAGRANK = 0x10, // large DAGrank {0}, set to {1} -! ERR_HOP_LIMIT_REACHED = 0x11, // packet discarded hop limit reached -! ERR_LOOP_DETECTED = 0x12, // loop detected due to previous rank {0} lower than current node rank {1} -! ERR_WRONG_DIRECTION = 0x13, // upstream packet set to be downstream, possible loop. -! // l2b -! ERR_NEIGHBORS_FULL = 0x14, // neighbors table is full (max number of neighbor is {0}) -! ERR_NO_SENT_PACKET = 0x15, // there is no sent packet in queue -! ERR_NO_RECEIVED_PACKET = 0x16, // there is no received packet in queue -! ERR_SCHEDULE_OVERFLOWN = 0x17, // schedule overflown -! // l2a -! ERR_WRONG_CELLTYPE = 0x18, // wrong celltype {0} at slotOffset {1} -! ERR_IEEE154_UNSUPPORTED = 0x19, // unsupported IEEE802.15.4 parameter {1} at location {0} -! ERR_DESYNCHRONIZED = 0x1a, // got desynchronized at slotOffset {0} -! ERR_SYNCHRONIZED = 0x1b, // synchronized at slotOffset {0} -! ERR_LARGE_TIMECORRECTION = 0x1c, // large timeCorr.: {0} ticks (code loc. {1}) -! ERR_WRONG_STATE_IN_ENDFRAME_SYNC = 0x1d, // wrong state {0} in end of frame+sync -! ERR_WRONG_STATE_IN_STARTSLOT = 0x1e, // wrong state {0} in startSlot, at slotOffset {1} -! ERR_WRONG_STATE_IN_TIMERFIRES = 0x1f, // wrong state {0} in timer fires, at slotOffset {1} -! ERR_WRONG_STATE_IN_NEWSLOT = 0x20, // wrong state {0} in start of frame, at slotOffset {1} -! ERR_WRONG_STATE_IN_ENDOFFRAME = 0x21, // wrong state {0} in end of frame, at slotOffset {1} -! ERR_MAXTXDATAPREPARE_OVERFLOW = 0x22, // maxTxDataPrepare overflows while at state {0} in slotOffset {1} -! ERR_MAXRXACKPREPARE_OVERFLOWS = 0x23, // maxRxAckPrepapare overflows while at state {0} in slotOffset {1} -! ERR_MAXRXDATAPREPARE_OVERFLOWS = 0x24, // maxRxDataPrepapre overflows while at state {0} in slotOffset {1} -! ERR_MAXTXACKPREPARE_OVERFLOWS = 0x25, // maxTxAckPrepapre overflows while at state {0} in slotOffset {1} -! ERR_WDDATADURATION_OVERFLOWS = 0x26, // wdDataDuration overflows while at state {0} in slotOffset {1} -! ERR_WDRADIO_OVERFLOWS = 0x27, // wdRadio overflows while at state {0} in slotOffset {1} -! ERR_WDRADIOTX_OVERFLOWS = 0x28, // wdRadioTx overflows while at state {0} in slotOffset {1} -! ERR_WDACKDURATION_OVERFLOWS = 0x29, // wdAckDuration overflows while at state {0} in slotOffset {1} -! // general -! ERR_BUSY_SENDING = 0x2a, // busy sending -! ERR_UNEXPECTED_SENDDONE = 0x2b, // sendDone for packet I didn't send -! ERR_NO_FREE_PACKET_BUFFER = 0x2c, // no free packet buffer (code location {0}) -! ERR_FREEING_UNUSED = 0x2d, // freeing unused memory -! ERR_FREEING_ERROR = 0x2e, // freeing memory unsupported memory -! ERR_UNSUPPORTED_COMMAND = 0x2f, // unsupported command {0} -! ERR_MSG_UNKNOWN_TYPE = 0x30, // unknown message type {0} -! ERR_WRONG_ADDR_TYPE = 0x31, // wrong address type {0} (code location {1}) -! ERR_BRIDGE_MISMATCH = 0x32, // isBridge mismatch (code location {0}) -! ERR_HEADER_TOO_LONG = 0x33, // header too long, length {1} (code location {0}) -! ERR_INPUTBUFFER_LENGTH = 0x34, // input length problem, length={0} -! ERR_BOOTED = 0x35, // booted -! ERR_INVALIDSERIALFRAME = 0x36, // invalid serial frame -! ERR_INVALIDPACKETFROMRADIO = 0x37, // invalid packet frome radio, length {1} (code location {0}) -! ERR_BUSY_RECEIVING = 0x38, // busy receiving when stop of serial activity, buffer input length {1} (code location {0}) -! ERR_WRONG_CRC_INPUT = 0x39, // wrong CRC in input Buffer (input length {0}) -! }; -! -! //=========================== typedef ========================================= -! -! -! typedef uint16_t errorparameter_t; -! typedef uint16_t dagrank_t; -! typedef uint8_t owerror_t; -! //#define bool uint8_t -! -! //PRAGMA(pack(1)); -! typedef struct { -! uint8_t byte4; -! uint16_t bytes2and3; -! uint16_t bytes0and1; -! } asn_t; -! //PRAGMA(pack()); -! -! //PRAGMA(pack(1)); -! typedef struct { // always written big endian, i.e. MSB in addr[0] -! uint8_t type; -! union { -! uint8_t addr_16b[2]; -! uint8_t addr_64b[8]; -! uint8_t addr_128b[16]; -! uint8_t panid[2]; -! uint8_t prefix[8]; -! }; -! } open_addr_t; -! //PRAGMA(pack()); -! -! typedef struct { -! //admin -! uint8_t creator; // the component which called getFreePacketBuffer() -! uint8_t owner; // the component which currently owns the entry -! uint8_t* payload; // pointer to the start of the payload within 'packet' -! uint8_t length; // length in bytes of the payload -! //l4 -! uint8_t l4_protocol; // l4 protocol to be used -! bool l4_protocol_compressed; // is the l4 protocol header compressed? -! uint16_t l4_sourcePortORicmpv6Type; // l4 source port -! uint16_t l4_destination_port; // l4 destination port -! uint8_t* l4_payload; // pointer to the start of the payload of l4 (used for retransmits) -! uint8_t l4_length; // length of the payload of l4 (used for retransmits) -! //l3 -! open_addr_t l3_destinationAdd; // 128b IPv6 destination (down stack) -! open_addr_t l3_sourceAdd; // 128b IPv6 source address -! //l2 -! owerror_t l2_sendDoneError; // outcome of trying to send this packet -! open_addr_t l2_nextORpreviousHop; // 64b IEEE802.15.4 next (down stack) or previous (up) hop address -! uint8_t l2_frameType; // beacon, data, ack, cmd -! uint8_t l2_dsn; // sequence number of the received frame -! uint8_t l2_retriesLeft; // number Tx retries left before packet dropped (dropped when hits 0) -! uint8_t l2_numTxAttempts; // number Tx attempts -! asn_t l2_asn; // at what ASN the packet was Tx'ed or Rx'ed -! uint8_t* l2_payload; // pointer to the start of the payload of l2 (used for MAC to fill in ASN in ADV) -! uint8_t* l2_ASNpayload; // pointer to the ASN in EB -! uint8_t l2_joinPriority; // the join priority received in EB -! bool l2_joinPriorityPresent; -! //l1 (drivers) -! uint8_t l1_txPower; // power for packet to Tx at -! int8_t l1_rssi; // RSSI of received packet -! uint8_t l1_lqi; // LQI of received packet -! bool l1_crc; // did received packet pass CRC check? -! //the packet -! uint8_t packet[1+1+125+2+1]; // 1B spi address, 1B length, 125B data, 2B CRC, 1B LQI -! } OpenQueueEntry_t; -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! extern void openwsn_init(void); -! -! #endif -diff -crB openwsn/radio.c ../../../sys/net/openwsn/radio.c -*** openwsn/radio.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/radio.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,409 **** -! /** -! \brief CC2420-specific definition of the "radio" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #include "board.h" -! #include "radio.h" -! #include "cc2420.h" -! #include "spi.h" -! #include "debugpins.h" -! #include "leds.h" -! -! //=========================== defines ========================================= -! -! //=========================== variables ======================================= -! -! typedef struct { -! cc2420_status_t radioStatusByte; -! radio_state_t state; -! } radio_vars_t; -! -! radio_vars_t radio_vars; -! -! //=========================== prototypes ====================================== -! -! void radio_spiStrobe (uint8_t strobe, cc2420_status_t* statusRead); -! void radio_spiWriteReg (uint8_t reg, cc2420_status_t* statusRead, uint16_t regValueToWrite); -! void radio_spiReadReg (uint8_t reg, cc2420_status_t* statusRead, uint8_t* regValueRead); -! void radio_spiWriteTxFifo( cc2420_status_t* statusRead, uint8_t* bufToWrite, uint8_t lenToWrite); -! void radio_spiReadRxFifo ( cc2420_status_t* statusRead, uint8_t* bufRead, uint8_t* lenRead, uint8_t maxBufLen); -! -! //=========================== public ========================================== -! -! //===== admin -! -! void radio_init() { -! // clear variables -! memset(&radio_vars,0,sizeof(radio_vars_t)); -! -! // change state -! radio_vars.state = RADIOSTATE_STOPPED; -! -! // reset radio -! radio_reset(); -! -! // change state -! radio_vars.state = RADIOSTATE_RFOFF; -! -! // start radiotimer with dummy setting to activate SFD pin interrupt -! radiotimer_start(0xffff); -! } -! -! void radio_setOverflowCb(radiotimer_compare_cbt cb) { -! radiotimer_setOverflowCb(cb); -! } -! -! void radio_setCompareCb(radiotimer_compare_cbt cb) { -! radiotimer_setCompareCb(cb); -! } -! -! void radio_setStartFrameCb(radiotimer_capture_cbt cb) { -! radiotimer_setStartFrameCb(cb); -! } -! -! void radio_setEndFrameCb(radiotimer_capture_cbt cb) { -! radiotimer_setEndFrameCb(cb); -! } -! -! //===== reset -! -! void radio_reset() { -! volatile uint16_t delay; -! cc2420_MDMCTRL0_reg_t cc2420_MDMCTRL0_reg; -! cc2420_TXCTRL_reg_t cc2420_TXCTRL_reg; -! cc2420_RXCTRL1_reg_t cc2420_RXCTRL1_reg; -! -! // set radio VREG pin high -! PORT_PIN_RADIO_VREG_HIGH(); -! for (delay=0xffff;delay>0;delay--); // max. VREG start-up time is 0.6ms -! -! // set radio RESET pin low -! PORT_PIN_RADIO_RESET_LOW(); -! for (delay=0xffff;delay>0;delay--); -! -! // set radio RESET pin high -! PORT_PIN_RADIO_RESET_HIGH(); -! for (delay=0xffff;delay>0;delay--); -! -! // disable address recognition -! cc2420_MDMCTRL0_reg.PREAMBLE_LENGTH = 2; // 3 leading zero's (IEEE802.15.4 compliant) -! cc2420_MDMCTRL0_reg.AUTOACK = 0; -! cc2420_MDMCTRL0_reg.AUTOCRC = 1; -! cc2420_MDMCTRL0_reg.CCA_MODE = 3; -! cc2420_MDMCTRL0_reg.CCA_HYST = 2; -! cc2420_MDMCTRL0_reg.ADR_DECODE = 0; // turn OFF address recognition -! cc2420_MDMCTRL0_reg.PAN_COORDINATOR = 0; -! cc2420_MDMCTRL0_reg.RESERVED_FRAME_MODE = 1; // accept all frame types -! cc2420_MDMCTRL0_reg.reserved_w0 = 0; -! radio_spiWriteReg(CC2420_MDMCTRL0_ADDR, -! &radio_vars.radioStatusByte, -! *(uint16_t*)&cc2420_MDMCTRL0_reg); -! -! // speed up time to TX -! cc2420_TXCTRL_reg.PA_LEVEL = 31;// max. TX power (~0dBm) -! cc2420_TXCTRL_reg.reserved_w1 = 1; -! cc2420_TXCTRL_reg.PA_CURRENT = 3; -! cc2420_TXCTRL_reg.TXMIX_CURRENT = 0; -! cc2420_TXCTRL_reg.TXMIX_CAP_ARRAY = 0; -! cc2420_TXCTRL_reg.TX_TURNAROUND = 0; // faster STXON->SFD timing (128us) -! cc2420_TXCTRL_reg.TXMIXBUF_CUR = 2; -! radio_spiWriteReg(CC2420_TXCTRL_ADDR, -! &radio_vars.radioStatusByte, -! *(uint16_t*)&cc2420_TXCTRL_reg); -! -! // apply correction recommended in datasheet -! cc2420_RXCTRL1_reg.RXMIX_CURRENT = 2; -! cc2420_RXCTRL1_reg.RXMIX_VCM = 1; -! cc2420_RXCTRL1_reg.RXMIX_TAIL = 1; -! cc2420_RXCTRL1_reg.LNA_CAP_ARRAY = 1; -! cc2420_RXCTRL1_reg.MED_HGM = 0; -! cc2420_RXCTRL1_reg.HIGH_HGM = 1; -! cc2420_RXCTRL1_reg.MED_LOWGAIN = 0; -! cc2420_RXCTRL1_reg.LOW_LOWGAIN = 1; -! cc2420_RXCTRL1_reg.RXBPF_MIDCUR = 0; -! cc2420_RXCTRL1_reg.RXBPF_LOCUR = 1; // use this setting as per datasheet -! cc2420_RXCTRL1_reg.reserved_w0 = 0; -! radio_spiWriteReg(CC2420_RXCTRL1_ADDR, -! &radio_vars.radioStatusByte, -! *(uint16_t*)&cc2420_RXCTRL1_reg); -! } -! -! //===== timer -! -! void radio_startTimer(uint16_t period) { -! radiotimer_start(period); -! } -! -! uint16_t radio_getTimerValue() { -! return radiotimer_getValue(); -! } -! -! void radio_setTimerPeriod(uint16_t period) { -! radiotimer_setPeriod(period); -! } -! -! uint16_t radio_getTimerPeriod() { -! return radiotimer_getPeriod(); -! } -! -! //===== RF admin -! -! void radio_setFrequency(uint8_t frequency) { -! cc2420_FSCTRL_reg_t cc2420_FSCTRL_reg; -! -! // change state -! radio_vars.state = RADIOSTATE_SETTING_FREQUENCY; -! -! cc2420_FSCTRL_reg.FREQ = frequency-11; -! cc2420_FSCTRL_reg.FREQ *= 5; -! cc2420_FSCTRL_reg.FREQ += 357; -! cc2420_FSCTRL_reg.LOCK_STATUS = 0; -! cc2420_FSCTRL_reg.LOCK_LENGTH = 0; -! cc2420_FSCTRL_reg.CAL_RUNNING = 0; -! cc2420_FSCTRL_reg.CAL_DONE = 0; -! cc2420_FSCTRL_reg.LOCK_THR = 1; -! -! radio_spiWriteReg(CC2420_FSCTRL_ADDR, -! &radio_vars.radioStatusByte, -! *(uint16_t*)&cc2420_FSCTRL_reg); -! -! // change state -! radio_vars.state = RADIOSTATE_FREQUENCY_SET; -! } -! -! void radio_rfOn() { -! radio_spiStrobe(CC2420_SXOSCON, &radio_vars.radioStatusByte); -! while (radio_vars.radioStatusByte.xosc16m_stable==0) { -! radio_spiStrobe(CC2420_SNOP, &radio_vars.radioStatusByte); -! } -! } -! -! void radio_rfOff() { -! -! // change state -! radio_vars.state = RADIOSTATE_TURNING_OFF; -! -! radio_spiStrobe(CC2420_SRFOFF, &radio_vars.radioStatusByte); -! // poipoipoi wait until off -! -! // wiggle debug pin -! debugpins_radio_clr(); -! leds_radio_off(); -! -! // change state -! radio_vars.state = RADIOSTATE_RFOFF; -! } -! -! //===== TX -! -! void radio_loadPacket(uint8_t* packet, uint8_t len) { -! // change state -! radio_vars.state = RADIOSTATE_LOADING_PACKET; -! -! radio_spiStrobe(CC2420_SFLUSHTX, &radio_vars.radioStatusByte); -! radio_spiWriteTxFifo(&radio_vars.radioStatusByte, packet, len); -! -! // change state -! radio_vars.state = RADIOSTATE_PACKET_LOADED; -! } -! -! void radio_txEnable() { -! // change state -! radio_vars.state = RADIOSTATE_ENABLING_TX; -! -! // wiggle debug pin -! debugpins_radio_set(); -! leds_radio_on(); -! -! // I don't fully understand how the CC2420_STXCA the can be used here. -! -! // change state -! radio_vars.state = RADIOSTATE_TX_ENABLED; -! } -! -! void radio_txNow() { -! // change state -! radio_vars.state = RADIOSTATE_TRANSMITTING; -! -! radio_spiStrobe(CC2420_STXON, &radio_vars.radioStatusByte); -! } -! -! //===== RX -! -! void radio_rxEnable() { -! // change state -! radio_vars.state = RADIOSTATE_ENABLING_RX; -! -! // put radio in reception mode -! radio_spiStrobe(CC2420_SRXON, &radio_vars.radioStatusByte); -! radio_spiStrobe(CC2420_SFLUSHRX, &radio_vars.radioStatusByte); -! -! // wiggle debug pin -! debugpins_radio_set(); -! leds_radio_on(); -! -! // busy wait until radio really listening -! while (radio_vars.radioStatusByte.rssi_valid==0) { -! radio_spiStrobe(CC2420_SNOP, &radio_vars.radioStatusByte); -! } -! -! // change state -! radio_vars.state = RADIOSTATE_LISTENING; -! } -! -! void radio_rxNow() { -! // nothing to do, the radio is already listening. -! } -! -! void radio_getReceivedFrame(uint8_t* bufRead, -! uint8_t* lenRead, -! uint8_t maxBufLen, -! int8_t* rssi, -! uint8_t* lqi, -! uint8_t* crc) { -! // read the received packet from the RXFIFO -! radio_spiReadRxFifo(&radio_vars.radioStatusByte, bufRead, lenRead, maxBufLen); -! -! // On reception, when MODEMCTRL0.AUTOCRC is set, the CC2420 replaces the -! // received CRC by: -! // - [1B] the rssi, a signed value. The actual value in dBm is that - 45. -! // - [1B] whether CRC checked (bit 7) and LQI (bit 6-0) -! *rssi = *(bufRead+*lenRead-2); -! *rssi -= 45; -! *crc = ((*(bufRead+*lenRead-1))&0x80)>>7; -! *lqi = (*(bufRead+*lenRead-1))&0x7f; -! } -! -! //=========================== private ========================================= -! -! void radio_spiStrobe(uint8_t strobe, cc2420_status_t* statusRead) { -! uint8_t spi_tx_buffer[1]; -! -! spi_tx_buffer[0] = (CC2420_FLAG_WRITE | CC2420_FLAG_REG | strobe); -! -! spi_txrx(spi_tx_buffer, -! sizeof(spi_tx_buffer), -! SPI_FIRSTBYTE, -! (uint8_t*)statusRead, -! 1, -! SPI_FIRST, -! SPI_LAST); -! } -! -! void radio_spiWriteReg(uint8_t reg, cc2420_status_t* statusRead, uint16_t regValueToWrite) { -! uint8_t spi_tx_buffer[3]; -! -! spi_tx_buffer[0] = (CC2420_FLAG_WRITE | CC2420_FLAG_REG | reg); -! spi_tx_buffer[1] = regValueToWrite/256; -! spi_tx_buffer[2] = regValueToWrite%256; -! -! spi_txrx(spi_tx_buffer, -! sizeof(spi_tx_buffer), -! SPI_FIRSTBYTE, -! (uint8_t*)statusRead, -! 1, -! SPI_FIRST, -! SPI_LAST); -! } -! -! void radio_spiReadReg(uint8_t reg, cc2420_status_t* statusRead, uint8_t* regValueRead) { -! uint8_t spi_tx_buffer[3]; -! uint8_t spi_rx_buffer[3]; -! -! spi_tx_buffer[0] = (CC2420_FLAG_READ | CC2420_FLAG_REG | reg); -! spi_tx_buffer[1] = 0x00; -! spi_tx_buffer[2] = 0x00; -! -! spi_txrx(spi_tx_buffer, -! sizeof(spi_tx_buffer), -! SPI_BUFFER, -! spi_rx_buffer, -! sizeof(spi_rx_buffer), -! SPI_FIRST, -! SPI_LAST); -! -! *statusRead = *(cc2420_status_t*)&spi_rx_buffer[0]; -! *(regValueRead+0) = spi_rx_buffer[2]; -! *(regValueRead+1) = spi_rx_buffer[1]; -! } -! -! void radio_spiWriteTxFifo(cc2420_status_t* statusRead, uint8_t* bufToWrite, uint8_t len) { -! uint8_t spi_tx_buffer[2]; -! -! // step 1. send SPI address and length byte -! spi_tx_buffer[0] = (CC2420_FLAG_WRITE | CC2420_FLAG_REG | CC2420_TXFIFO_ADDR); -! spi_tx_buffer[1] = len; -! -! spi_txrx(spi_tx_buffer, -! sizeof(spi_tx_buffer), -! SPI_FIRSTBYTE, -! (uint8_t*)statusRead, -! 1, -! SPI_FIRST, -! SPI_NOTLAST); -! -! // step 2. send payload -! spi_txrx(bufToWrite, -! len, -! SPI_LASTBYTE, -! (uint8_t*)statusRead, -! 1, -! SPI_NOTFIRST, -! SPI_LAST); -! } -! -! void radio_spiReadRxFifo(cc2420_status_t* statusRead, -! uint8_t* pBufRead, -! uint8_t* pLenRead, -! uint8_t maxBufLen) { -! // when reading the packet over SPI from the RX buffer, you get the following: -! // - *[1B] dummy byte because of SPI -! // - *[1B] length byte -! // - [0-125B] packet (excluding CRC) -! // - *[2B] CRC -! uint8_t spi_tx_buffer[125]; -! uint8_t spi_rx_buffer[3]; -! -! spi_tx_buffer[0] = (CC2420_FLAG_READ | CC2420_FLAG_REG | CC2420_RXFIFO_ADDR); -! -! // 2 first bytes -! spi_txrx(spi_tx_buffer, -! 2, -! SPI_BUFFER, -! spi_rx_buffer, -! sizeof(spi_rx_buffer), -! SPI_FIRST, -! SPI_NOTLAST); -! -! *statusRead = *(cc2420_status_t*)&spi_rx_buffer[0]; -! *pLenRead = spi_rx_buffer[1]; -! -! if (*pLenRead>2 && *pLenRead<=127) { -! // valid length -! -! //read packet -! spi_txrx(spi_tx_buffer, -! *pLenRead, -! SPI_BUFFER, -! pBufRead, -! 125, -! SPI_NOTFIRST, -! SPI_LAST); -! -! } else { -! // invalid length -! -! // read a just byte to close spi -! spi_txrx(spi_tx_buffer, -! 1, -! SPI_BUFFER, -! spi_rx_buffer, -! sizeof(spi_rx_buffer), -! SPI_NOTFIRST, -! SPI_LAST); -! } -! } -! -! //=========================== callbacks ======================================= ---- 1,409 ---- -! /** -! \brief CC2420-specific definition of the "radio" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #include "board.h" -! #include "radio.h" -! #include "cc2420.h" -! #include "spi.h" -! #include "debugpins.h" -! #include "leds.h" -! -! //=========================== defines ========================================= -! -! //=========================== variables ======================================= -! -! typedef struct { -! cc2420_status_t radioStatusByte; -! radio_state_t state; -! } radio_vars_t; -! -! radio_vars_t radio_vars; -! -! //=========================== prototypes ====================================== -! -! void radio_spiStrobe (uint8_t strobe, cc2420_status_t* statusRead); -! void radio_spiWriteReg (uint8_t reg, cc2420_status_t* statusRead, uint16_t regValueToWrite); -! void radio_spiReadReg (uint8_t reg, cc2420_status_t* statusRead, uint8_t* regValueRead); -! void radio_spiWriteTxFifo( cc2420_status_t* statusRead, uint8_t* bufToWrite, uint8_t lenToWrite); -! void radio_spiReadRxFifo ( cc2420_status_t* statusRead, uint8_t* bufRead, uint8_t* lenRead, uint8_t maxBufLen); -! -! //=========================== public ========================================== -! -! //===== admin -! -! void radio_init(void) { -! // clear variables -! memset(&radio_vars,0,sizeof(radio_vars_t)); -! -! // change state -! radio_vars.state = RADIOSTATE_STOPPED; -! -! // reset radio -! radio_reset(); -! -! // change state -! radio_vars.state = RADIOSTATE_RFOFF; -! -! // start radiotimer with dummy setting to activate SFD pin interrupt -! radiotimer_start(0xffff); -! } -! -! void radio_setOverflowCb(radiotimer_compare_cbt cb) { -! radiotimer_setOverflowCb(cb); -! } -! -! void radio_setCompareCb(radiotimer_compare_cbt cb) { -! radiotimer_setCompareCb(cb); -! } -! -! void radio_setStartFrameCb(radiotimer_capture_cbt cb) { -! radiotimer_setStartFrameCb(cb); -! } -! -! void radio_setEndFrameCb(radiotimer_capture_cbt cb) { -! radiotimer_setEndFrameCb(cb); -! } -! -! //===== reset -! -! void radio_reset(void) { -! volatile uint16_t delay; -! cc2420_MDMCTRL0_reg_t cc2420_MDMCTRL0_reg; -! cc2420_TXCTRL_reg_t cc2420_TXCTRL_reg; -! cc2420_RXCTRL1_reg_t cc2420_RXCTRL1_reg; -! -! // set radio VREG pin high -! PORT_PIN_RADIO_VREG_HIGH(); -! for (delay=0xffff;delay>0;delay--); // max. VREG start-up time is 0.6ms -! -! // set radio RESET pin low -! PORT_PIN_RADIO_RESET_LOW(); -! for (delay=0xffff;delay>0;delay--); -! -! // set radio RESET pin high -! PORT_PIN_RADIO_RESET_HIGH(); -! for (delay=0xffff;delay>0;delay--); -! -! // disable address recognition -! cc2420_MDMCTRL0_reg.PREAMBLE_LENGTH = 2; // 3 leading zero's (IEEE802.15.4 compliant) -! cc2420_MDMCTRL0_reg.AUTOACK = 0; -! cc2420_MDMCTRL0_reg.AUTOCRC = 1; -! cc2420_MDMCTRL0_reg.CCA_MODE = 3; -! cc2420_MDMCTRL0_reg.CCA_HYST = 2; -! cc2420_MDMCTRL0_reg.ADR_DECODE = 0; // turn OFF address recognition -! cc2420_MDMCTRL0_reg.PAN_COORDINATOR = 0; -! cc2420_MDMCTRL0_reg.RESERVED_FRAME_MODE = 1; // accept all frame types -! cc2420_MDMCTRL0_reg.reserved_w0 = 0; -! radio_spiWriteReg(CC2420_MDMCTRL0_ADDR, -! &radio_vars.radioStatusByte, -! *(uint16_t*)&cc2420_MDMCTRL0_reg); -! -! // speed up time to TX -! cc2420_TXCTRL_reg.PA_LEVEL = 31;// max. TX power (~0dBm) -! cc2420_TXCTRL_reg.reserved_w1 = 1; -! cc2420_TXCTRL_reg.PA_CURRENT = 3; -! cc2420_TXCTRL_reg.TXMIX_CURRENT = 0; -! cc2420_TXCTRL_reg.TXMIX_CAP_ARRAY = 0; -! cc2420_TXCTRL_reg.TX_TURNAROUND = 0; // faster STXON->SFD timing (128us) -! cc2420_TXCTRL_reg.TXMIXBUF_CUR = 2; -! radio_spiWriteReg(CC2420_TXCTRL_ADDR, -! &radio_vars.radioStatusByte, -! *(uint16_t*)&cc2420_TXCTRL_reg); -! -! // apply correction recommended in datasheet -! cc2420_RXCTRL1_reg.RXMIX_CURRENT = 2; -! cc2420_RXCTRL1_reg.RXMIX_VCM = 1; -! cc2420_RXCTRL1_reg.RXMIX_TAIL = 1; -! cc2420_RXCTRL1_reg.LNA_CAP_ARRAY = 1; -! cc2420_RXCTRL1_reg.MED_HGM = 0; -! cc2420_RXCTRL1_reg.HIGH_HGM = 1; -! cc2420_RXCTRL1_reg.MED_LOWGAIN = 0; -! cc2420_RXCTRL1_reg.LOW_LOWGAIN = 1; -! cc2420_RXCTRL1_reg.RXBPF_MIDCUR = 0; -! cc2420_RXCTRL1_reg.RXBPF_LOCUR = 1; // use this setting as per datasheet -! cc2420_RXCTRL1_reg.reserved_w0 = 0; -! radio_spiWriteReg(CC2420_RXCTRL1_ADDR, -! &radio_vars.radioStatusByte, -! *(uint16_t*)&cc2420_RXCTRL1_reg); -! } -! -! //===== timer -! -! void radio_startTimer(uint16_t period) { -! radiotimer_start(period); -! } -! -! uint16_t radio_getTimerValue(void) { -! return radiotimer_getValue(); -! } -! -! void radio_setTimerPeriod(uint16_t period) { -! radiotimer_setPeriod(period); -! } -! -! uint16_t radio_getTimerPeriod(void) { -! return radiotimer_getPeriod(); -! } -! -! //===== RF admin -! -! void radio_setFrequency(uint8_t frequency) { -! cc2420_FSCTRL_reg_t cc2420_FSCTRL_reg; -! -! // change state -! radio_vars.state = RADIOSTATE_SETTING_FREQUENCY; -! -! cc2420_FSCTRL_reg.FREQ = frequency-11; -! cc2420_FSCTRL_reg.FREQ *= 5; -! cc2420_FSCTRL_reg.FREQ += 357; -! cc2420_FSCTRL_reg.LOCK_STATUS = 0; -! cc2420_FSCTRL_reg.LOCK_LENGTH = 0; -! cc2420_FSCTRL_reg.CAL_RUNNING = 0; -! cc2420_FSCTRL_reg.CAL_DONE = 0; -! cc2420_FSCTRL_reg.LOCK_THR = 1; -! -! radio_spiWriteReg(CC2420_FSCTRL_ADDR, -! &radio_vars.radioStatusByte, -! *(uint16_t*)&cc2420_FSCTRL_reg); -! -! // change state -! radio_vars.state = RADIOSTATE_FREQUENCY_SET; -! } -! -! void radio_rfOn(void) { -! radio_spiStrobe(CC2420_SXOSCON, &radio_vars.radioStatusByte); -! while (radio_vars.radioStatusByte.xosc16m_stable==0) { -! radio_spiStrobe(CC2420_SNOP, &radio_vars.radioStatusByte); -! } -! } -! -! void radio_rfOff(void) { -! -! // change state -! radio_vars.state = RADIOSTATE_TURNING_OFF; -! -! radio_spiStrobe(CC2420_SRFOFF, &radio_vars.radioStatusByte); -! // poipoipoi wait until off -! -! // wiggle debug pin -! debugpins_radio_clr(); -! leds_radio_off(); -! -! // change state -! radio_vars.state = RADIOSTATE_RFOFF; -! } -! -! //===== TX -! -! void radio_loadPacket(uint8_t* packet, uint8_t len) { -! // change state -! radio_vars.state = RADIOSTATE_LOADING_PACKET; -! -! radio_spiStrobe(CC2420_SFLUSHTX, &radio_vars.radioStatusByte); -! radio_spiWriteTxFifo(&radio_vars.radioStatusByte, packet, len); -! -! // change state -! radio_vars.state = RADIOSTATE_PACKET_LOADED; -! } -! -! void radio_txEnable(void) { -! // change state -! radio_vars.state = RADIOSTATE_ENABLING_TX; -! -! // wiggle debug pin -! debugpins_radio_set(); -! leds_radio_on(); -! -! // I don't fully understand how the CC2420_STXCA the can be used here. -! -! // change state -! radio_vars.state = RADIOSTATE_TX_ENABLED; -! } -! -! void radio_txNow(void) { -! // change state -! radio_vars.state = RADIOSTATE_TRANSMITTING; -! -! radio_spiStrobe(CC2420_STXON, &radio_vars.radioStatusByte); -! } -! -! //===== RX -! -! void radio_rxEnable(void) { -! // change state -! radio_vars.state = RADIOSTATE_ENABLING_RX; -! -! // put radio in reception mode -! radio_spiStrobe(CC2420_SRXON, &radio_vars.radioStatusByte); -! radio_spiStrobe(CC2420_SFLUSHRX, &radio_vars.radioStatusByte); -! -! // wiggle debug pin -! debugpins_radio_set(); -! leds_radio_on(); -! -! // busy wait until radio really listening -! while (radio_vars.radioStatusByte.rssi_valid==0) { -! radio_spiStrobe(CC2420_SNOP, &radio_vars.radioStatusByte); -! } -! -! // change state -! radio_vars.state = RADIOSTATE_LISTENING; -! } -! -! void radio_rxNow(void) { -! // nothing to do, the radio is already listening. -! } -! -! void radio_getReceivedFrame(uint8_t* bufRead, -! uint8_t* lenRead, -! uint8_t maxBufLen, -! int8_t* rssi, -! uint8_t* lqi, -! uint8_t* crc) { -! // read the received packet from the RXFIFO -! radio_spiReadRxFifo(&radio_vars.radioStatusByte, bufRead, lenRead, maxBufLen); -! -! // On reception, when MODEMCTRL0.AUTOCRC is set, the CC2420 replaces the -! // received CRC by: -! // - [1B] the rssi, a signed value. The actual value in dBm is that - 45. -! // - [1B] whether CRC checked (bit 7) and LQI (bit 6-0) -! *rssi = *(bufRead+*lenRead-2); -! *rssi -= 45; -! *crc = ((*(bufRead+*lenRead-1))&0x80)>>7; -! *lqi = (*(bufRead+*lenRead-1))&0x7f; -! } -! -! //=========================== private ========================================= -! -! void radio_spiStrobe(uint8_t strobe, cc2420_status_t* statusRead) { -! uint8_t spi_tx_buffer[1]; -! -! spi_tx_buffer[0] = (CC2420_FLAG_WRITE | CC2420_FLAG_REG | strobe); -! -! spi_txrx(spi_tx_buffer, -! sizeof(spi_tx_buffer), -! SPI_FIRSTBYTE, -! (uint8_t*)statusRead, -! 1, -! SPI_FIRST, -! SPI_LAST); -! } -! -! void radio_spiWriteReg(uint8_t reg, cc2420_status_t* statusRead, uint16_t regValueToWrite) { -! uint8_t spi_tx_buffer[3]; -! -! spi_tx_buffer[0] = (CC2420_FLAG_WRITE | CC2420_FLAG_REG | reg); -! spi_tx_buffer[1] = regValueToWrite/256; -! spi_tx_buffer[2] = regValueToWrite%256; -! -! spi_txrx(spi_tx_buffer, -! sizeof(spi_tx_buffer), -! SPI_FIRSTBYTE, -! (uint8_t*)statusRead, -! 1, -! SPI_FIRST, -! SPI_LAST); -! } -! -! void radio_spiReadReg(uint8_t reg, cc2420_status_t* statusRead, uint8_t* regValueRead) { -! uint8_t spi_tx_buffer[3]; -! uint8_t spi_rx_buffer[3]; -! -! spi_tx_buffer[0] = (CC2420_FLAG_READ | CC2420_FLAG_REG | reg); -! spi_tx_buffer[1] = 0x00; -! spi_tx_buffer[2] = 0x00; -! -! spi_txrx(spi_tx_buffer, -! sizeof(spi_tx_buffer), -! SPI_BUFFER, -! spi_rx_buffer, -! sizeof(spi_rx_buffer), -! SPI_FIRST, -! SPI_LAST); -! -! *statusRead = *(cc2420_status_t*)&spi_rx_buffer[0]; -! *(regValueRead+0) = spi_rx_buffer[2]; -! *(regValueRead+1) = spi_rx_buffer[1]; -! } -! -! void radio_spiWriteTxFifo(cc2420_status_t* statusRead, uint8_t* bufToWrite, uint8_t len) { -! uint8_t spi_tx_buffer[2]; -! -! // step 1. send SPI address and length byte -! spi_tx_buffer[0] = (CC2420_FLAG_WRITE | CC2420_FLAG_REG | CC2420_TXFIFO_ADDR); -! spi_tx_buffer[1] = len; -! -! spi_txrx(spi_tx_buffer, -! sizeof(spi_tx_buffer), -! SPI_FIRSTBYTE, -! (uint8_t*)statusRead, -! 1, -! SPI_FIRST, -! SPI_NOTLAST); -! -! // step 2. send payload -! spi_txrx(bufToWrite, -! len, -! SPI_LASTBYTE, -! (uint8_t*)statusRead, -! 1, -! SPI_NOTFIRST, -! SPI_LAST); -! } -! -! void radio_spiReadRxFifo(cc2420_status_t* statusRead, -! uint8_t* pBufRead, -! uint8_t* pLenRead, -! uint8_t maxBufLen) { -! // when reading the packet over SPI from the RX buffer, you get the following: -! // - *[1B] dummy byte because of SPI -! // - *[1B] length byte -! // - [0-125B] packet (excluding CRC) -! // - *[2B] CRC -! uint8_t spi_tx_buffer[125]; -! uint8_t spi_rx_buffer[3]; -! -! spi_tx_buffer[0] = (CC2420_FLAG_READ | CC2420_FLAG_REG | CC2420_RXFIFO_ADDR); -! -! // 2 first bytes -! spi_txrx(spi_tx_buffer, -! 2, -! SPI_BUFFER, -! spi_rx_buffer, -! sizeof(spi_rx_buffer), -! SPI_FIRST, -! SPI_NOTLAST); -! -! *statusRead = *(cc2420_status_t*)&spi_rx_buffer[0]; -! *pLenRead = spi_rx_buffer[1]; -! -! if (*pLenRead>2 && *pLenRead<=127) { -! // valid length -! -! //read packet -! spi_txrx(spi_tx_buffer, -! *pLenRead, -! SPI_BUFFER, -! pBufRead, -! 125, -! SPI_NOTFIRST, -! SPI_LAST); -! -! } else { -! // invalid length -! -! // read a just byte to close spi -! spi_txrx(spi_tx_buffer, -! 1, -! SPI_BUFFER, -! spi_rx_buffer, -! sizeof(spi_rx_buffer), -! SPI_NOTFIRST, -! SPI_LAST); -! } -! } -! -! //=========================== callbacks ======================================= -diff -crB openwsn/radio.h ../../../sys/net/openwsn/radio.h -*** openwsn/radio.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/radio.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,80 **** -! /** -! \brief Cross-platform declaration "radio" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #ifndef __RADIO_H -! #define __RADIO_H -! -! #include "radiotimer.h" -! -! //=========================== define ========================================== -! -! #define LENGTH_CRC 2 -! -! /** -! \brief Current state of the radio. -! -! \note This radio driver is very minimal in that it does not follow a state machine. -! It is up to the MAC layer to ensure that the different radio operations -! are called in the righr order. The radio keeps a state for debugging purposes only. -! */ -! typedef enum { -! RADIOSTATE_STOPPED = 0x00, ///< Completely stopped. -! RADIOSTATE_RFOFF = 0x01, ///< Listening for commands, but RF chain is off. -! RADIOSTATE_SETTING_FREQUENCY = 0x02, ///< Configuring the frequency. -! RADIOSTATE_FREQUENCY_SET = 0x03, ///< Done configuring the frequency. -! RADIOSTATE_LOADING_PACKET = 0x04, ///< Loading packet into the radio's TX buffer. -! RADIOSTATE_PACKET_LOADED = 0x05, ///< Packet is fully loaded in the radio's TX buffer. -! RADIOSTATE_ENABLING_TX = 0x06, ///< The RF TX chaing is being enabled (includes locking the PLL). -! RADIOSTATE_TX_ENABLED = 0x07, ///< Radio ready to transmit. -! RADIOSTATE_TRANSMITTING = 0x08, ///< Busy transmitting bytes. -! RADIOSTATE_ENABLING_RX = 0x09, ///< The RF RX chain is being enabled (includes locking the PLL). -! RADIOSTATE_LISTENING = 0x0a, ///< RF chain is on, listening, but no packet received yet. -! RADIOSTATE_RECEIVING = 0x0b, ///< Busy receiving bytes. -! RADIOSTATE_TXRX_DONE = 0x0c, ///< Frame has been sent/received completely. -! RADIOSTATE_TURNING_OFF = 0x0d, ///< Turning the RF chain off. -! } radio_state_t; -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! // admin -! void radio_init(); -! void radio_setOverflowCb(radiotimer_compare_cbt cb); -! void radio_setCompareCb(radiotimer_compare_cbt cb); -! void radio_setStartFrameCb(radiotimer_capture_cbt cb); -! void radio_setEndFrameCb(radiotimer_capture_cbt cb); -! // reset -! void radio_reset(); -! // timer -! void radio_startTimer(PORT_TIMER_WIDTH period); -! PORT_TIMER_WIDTH radio_getTimerValue(); -! void radio_setTimerPeriod(PORT_TIMER_WIDTH period); -! PORT_TIMER_WIDTH radio_getTimerPeriod(); -! // RF admin -! void radio_setFrequency(uint8_t frequency); -! void radio_rfOn(); -! void radio_rfOff(); -! // TX -! void radio_loadPacket(uint8_t* packet, uint8_t len); -! void radio_txEnable(); -! void radio_txNow(); -! // RX -! void radio_rxEnable(); -! void radio_rxNow(); -! void radio_getReceivedFrame(uint8_t* bufRead, -! uint8_t* lenRead, -! uint8_t maxBufLen, -! int8_t* rssi, -! uint8_t* lqi, -! uint8_t* crc); -! -! // interrupt handlers -! kick_scheduler_t radio_isr(); -! -! #endif ---- 1,90 ---- -! #ifndef __RADIO_H -! #define __RADIO_H -! -! /** -! \addtogroup BSP -! \{ -! \addtogroup radio -! \{ -! -! \brief Cross-platform declaration "radio" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #include "radiotimer.h" -! -! //=========================== define ========================================== -! -! #define LENGTH_CRC 2 -! -! /** -! \brief Current state of the radio. -! -! \note This radio driver is very minimal in that it does not follow a state machine. -! It is up to the MAC layer to ensure that the different radio operations -! are called in the righr order. The radio keeps a state for debugging purposes only. -! */ -! typedef enum { -! RADIOSTATE_STOPPED = 0x00, ///< Completely stopped. -! RADIOSTATE_RFOFF = 0x01, ///< Listening for commands, but RF chain is off. -! RADIOSTATE_SETTING_FREQUENCY = 0x02, ///< Configuring the frequency. -! RADIOSTATE_FREQUENCY_SET = 0x03, ///< Done configuring the frequency. -! RADIOSTATE_LOADING_PACKET = 0x04, ///< Loading packet into the radio's TX buffer. -! RADIOSTATE_PACKET_LOADED = 0x05, ///< Packet is fully loaded in the radio's TX buffer. -! RADIOSTATE_ENABLING_TX = 0x06, ///< The RF TX chaing is being enabled (includes locking the PLL). -! RADIOSTATE_TX_ENABLED = 0x07, ///< Radio ready to transmit. -! RADIOSTATE_TRANSMITTING = 0x08, ///< Busy transmitting bytes. -! RADIOSTATE_ENABLING_RX = 0x09, ///< The RF RX chain is being enabled (includes locking the PLL). -! RADIOSTATE_LISTENING = 0x0a, ///< RF chain is on, listening, but no packet received yet. -! RADIOSTATE_RECEIVING = 0x0b, ///< Busy receiving bytes. -! RADIOSTATE_TXRX_DONE = 0x0c, ///< Frame has been sent/received completely. -! RADIOSTATE_TURNING_OFF = 0x0d, ///< Turning the RF chain off. -! } radio_state_t; -! -! //=========================== typedef ========================================= -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! // admin -! void radio_init(void); -! void radio_setOverflowCb(radiotimer_compare_cbt cb); -! void radio_setCompareCb(radiotimer_compare_cbt cb); -! void radio_setStartFrameCb(radiotimer_capture_cbt cb); -! void radio_setEndFrameCb(radiotimer_capture_cbt cb); -! // reset -! void radio_reset(void); -! // timer -! void radio_startTimer(PORT_TIMER_WIDTH period); -! PORT_TIMER_WIDTH radio_getTimerValue(void); -! void radio_setTimerPeriod(PORT_TIMER_WIDTH period); -! PORT_TIMER_WIDTH radio_getTimerPeriod(void); -! // RF admin -! void radio_setFrequency(uint8_t frequency); -! void radio_rfOn(void); -! void radio_rfOff(void); -! // TX -! void radio_loadPacket(uint8_t* packet, uint8_t len); -! void radio_txEnable(void); -! void radio_txNow(void); -! // RX -! void radio_rxEnable(void); -! void radio_rxNow(void); -! void radio_getReceivedFrame(uint8_t* bufRead, -! uint8_t* lenRead, -! uint8_t maxBufLen, -! int8_t* rssi, -! uint8_t* lqi, -! uint8_t* crc); -! -! // interrupt handlers -! kick_scheduler_t radio_isr(void); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/radiotimer.c ../../../sys/net/openwsn/radiotimer.c -*** openwsn/radiotimer.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/radiotimer.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,176 **** -! /** -! \brief TelosB-specific definition of the "radiotimer" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #include "msp430f1611.h" -! #include "radiotimer.h" -! #include "leds.h" -! -! //=========================== variables ======================================= -! -! typedef struct { -! radiotimer_compare_cbt overflowCb; -! radiotimer_compare_cbt compareCb; -! radiotimer_capture_cbt startFrameCb; -! radiotimer_capture_cbt endFrameCb; -! } radiotimer_vars_t; -! -! radiotimer_vars_t radiotimer_vars; -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! //===== admin -! -! void radiotimer_init() { -! // clear local variables -! memset(&radiotimer_vars,0,sizeof(radiotimer_vars_t)); -! } -! -! void radiotimer_setOverflowCb(radiotimer_compare_cbt cb) { -! radiotimer_vars.overflowCb = cb; -! } -! -! void radiotimer_setCompareCb(radiotimer_compare_cbt cb) { -! radiotimer_vars.compareCb = cb; -! } -! -! void radiotimer_setStartFrameCb(radiotimer_capture_cbt cb) { -! radiotimer_vars.startFrameCb = cb; -! } -! -! void radiotimer_setEndFrameCb(radiotimer_capture_cbt cb) { -! radiotimer_vars.endFrameCb = cb; -! } -! -! void radiotimer_start(uint16_t period) { -! // radio's SFD pin connected to P4.1 -! P4DIR &= ~0x02; // input -! P4SEL |= 0x02; // in CCI1a/B mode -! -! // CCR0 contains period of counter -! // do not interrupt when counter reaches TBCCR0, but when it resets -! TBCCR0 = period-1; -! -! // CCR1 in capture mode -! TBCCTL1 = CM_3+SCS+CAP+CCIE; -! TBCCR1 = 0; -! -! // CCR2 in compare mode (disabled for now) -! TBCCTL2 = 0; -! TBCCR2 = 0; -! -! // start counting -! TBCTL = TBIE+TBCLR; // interrupt when counter resets -! TBCTL |= MC_1+TBSSEL_1; // up mode, clocked from ACLK -! } -! -! //===== direct access -! -! uint16_t radiotimer_getValue() { -! return TBR; -! } -! -! void radiotimer_setPeriod(uint16_t period) { -! TBCCR0 = period; -! } -! -! uint16_t radiotimer_getPeriod() { -! return TBCCR0; -! } -! -! //===== compare -! -! void radiotimer_schedule(uint16_t offset) { -! // offset when to fire -! TBCCR2 = offset; -! -! // enable compare interrupt (this also cancels any pending interrupts) -! TBCCTL2 = CCIE; -! } -! -! void radiotimer_cancel() { -! // reset compare value (also resets interrupt flag) -! TBCCR2 = 0; -! -! // disable compare interrupt -! TBCCTL2 &= ~CCIE; -! } -! -! //===== capture -! -! inline uint16_t radiotimer_getCapturedTime() { -! // this should never happpen! -! -! // we can not print from within the BSP. Instead: -! // blink the error LED -! leds_error_blink(); -! // reset the board -! board_reset(); -! -! return 0;// this line is never reached, but here to satisfy compiler -! } -! -! //=========================== private ========================================= -! -! //=========================== interrupt handlers ============================== -! -! /** -! \brief TimerB CCR1-6 interrupt service routine -! */ -! kick_scheduler_t radiotimer_isr() { -! uint16_t tbiv_local; -! -! // reading TBIV returns the value of the highest pending interrupt flag -! // and automatically resets that flag. We therefore copy its value to the -! // tbiv_local local variable exactly once. If there is more than one -! // interrupt pending, we will reenter this function after having just left -! // it. -! tbiv_local = TBIV; -! -! switch (tbiv_local) { -! case 0x0002: // CCR1 fires -! if (TBCCTL1 & CCI) { -! // SFD pin is high: this was the start of a frame -! if (radiotimer_vars.startFrameCb!=NULL) { -! radiotimer_vars.startFrameCb(TBCCR1); -! // kick the OS -! return KICK_SCHEDULER; -! } -! } else { -! // SFD pin is low: this was the end of a frame -! if (radiotimer_vars.endFrameCb!=NULL) { -! radiotimer_vars.endFrameCb(TBCCR1); -! // kick the OS -! return KICK_SCHEDULER; -! } -! } -! break; -! case 0x0004: // CCR2 fires -! if (radiotimer_vars.compareCb!=NULL) { -! radiotimer_vars.compareCb(); -! // kick the OS -! return KICK_SCHEDULER; -! } -! break; -! case 0x0006: // CCR3 fires -! break; -! case 0x0008: // CCR4 fires -! break; -! case 0x000a: // CCR5 fires -! break; -! case 0x000c: // CCR6 fires -! break; -! case 0x000e: // timer overflow -! if (radiotimer_vars.overflowCb!=NULL) { -! radiotimer_vars.overflowCb(); -! // kick the OS -! return KICK_SCHEDULER; -! } -! break; -! } -! return DO_NOT_KICK_SCHEDULER; -! } ---- 1,176 ---- -! /** -! \brief TelosB-specific definition of the "radiotimer" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #include "msp430f1611.h" -! #include "radiotimer.h" -! #include "leds.h" -! -! //=========================== variables ======================================= -! -! typedef struct { -! radiotimer_compare_cbt overflowCb; -! radiotimer_compare_cbt compareCb; -! radiotimer_capture_cbt startFrameCb; -! radiotimer_capture_cbt endFrameCb; -! } radiotimer_vars_t; -! -! radiotimer_vars_t radiotimer_vars; -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! //===== admin -! -! void radiotimer_init(void) { -! // clear local variables -! memset(&radiotimer_vars,0,sizeof(radiotimer_vars_t)); -! } -! -! void radiotimer_setOverflowCb(radiotimer_compare_cbt cb) { -! radiotimer_vars.overflowCb = cb; -! } -! -! void radiotimer_setCompareCb(radiotimer_compare_cbt cb) { -! radiotimer_vars.compareCb = cb; -! } -! -! void radiotimer_setStartFrameCb(radiotimer_capture_cbt cb) { -! radiotimer_vars.startFrameCb = cb; -! } -! -! void radiotimer_setEndFrameCb(radiotimer_capture_cbt cb) { -! radiotimer_vars.endFrameCb = cb; -! } -! -! void radiotimer_start(PORT_RADIOTIMER_WIDTH period) { -! // radio's SFD pin connected to P4.1 -! P4DIR &= ~0x02; // input -! P4SEL |= 0x02; // in CCI1a/B mode -! -! // CCR0 contains period of counter -! // do not interrupt when counter reaches TBCCR0, but when it resets -! TBCCR0 = period-1; -! -! // CCR1 in capture mode -! TBCCTL1 = CM_3+SCS+CAP+CCIE; -! TBCCR1 = 0; -! -! // CCR2 in compare mode (disabled for now) -! TBCCTL2 = 0; -! TBCCR2 = 0; -! -! // start counting -! TBCTL = TBIE+TBCLR; // interrupt when counter resets -! TBCTL |= MC_1+TBSSEL_1; // up mode, clocked from ACLK -! } -! -! //===== direct access -! -! PORT_RADIOTIMER_WIDTH radiotimer_getValue(void) { -! return TBR; -! } -! -! void radiotimer_setPeriod(PORT_RADIOTIMER_WIDTH period) { -! TBCCR0 = period; -! } -! -! PORT_RADIOTIMER_WIDTH radiotimer_getPeriod(void) { -! return TBCCR0; -! } -! -! //===== compare -! -! void radiotimer_schedule(PORT_RADIOTIMER_WIDTH offset) { -! // offset when to fire -! TBCCR2 = offset; -! -! // enable compare interrupt (this also cancels any pending interrupts) -! TBCCTL2 = CCIE; -! } -! -! void radiotimer_cancel(void) { -! // reset compare value (also resets interrupt flag) -! TBCCR2 = 0; -! -! // disable compare interrupt -! TBCCTL2 &= ~CCIE; -! } -! -! //===== capture -! -! inline PORT_RADIOTIMER_WIDTH radiotimer_getCapturedTime(void) { -! // this should never happpen! -! -! // we can not print from within the BSP. Instead: -! // blink the error LED -! leds_error_blink(); -! // reset the board -! board_reset(); -! -! return 0;// this line is never reached, but here to satisfy compiler -! } -! -! //=========================== private ========================================= -! -! //=========================== interrupt handlers ============================== -! -! /** -! \brief TimerB CCR1-6 interrupt service routine -! */ -! kick_scheduler_t radiotimer_isr(void) { -! PORT_RADIOTIMER_WIDTH tbiv_local; -! -! // reading TBIV returns the value of the highest pending interrupt flag -! // and automatically resets that flag. We therefore copy its value to the -! // tbiv_local local variable exactly once. If there is more than one -! // interrupt pending, we will reenter this function after having just left -! // it. -! tbiv_local = TBIV; -! -! switch (tbiv_local) { -! case 0x0002: // CCR1 fires -! if (TBCCTL1 & CCI) { -! // SFD pin is high: this was the start of a frame -! if (radiotimer_vars.startFrameCb!=NULL) { -! radiotimer_vars.startFrameCb(TBCCR1); -! // kick the OS -! return KICK_SCHEDULER; -! } -! } else { -! // SFD pin is low: this was the end of a frame -! if (radiotimer_vars.endFrameCb!=NULL) { -! radiotimer_vars.endFrameCb(TBCCR1); -! // kick the OS -! return KICK_SCHEDULER; -! } -! } -! break; -! case 0x0004: // CCR2 fires -! if (radiotimer_vars.compareCb!=NULL) { -! radiotimer_vars.compareCb(); -! // kick the OS -! return KICK_SCHEDULER; -! } -! break; -! case 0x0006: // CCR3 fires -! break; -! case 0x0008: // CCR4 fires -! break; -! case 0x000a: // CCR5 fires -! break; -! case 0x000c: // CCR6 fires -! break; -! case 0x000e: // timer overflow -! if (radiotimer_vars.overflowCb!=NULL) { -! radiotimer_vars.overflowCb(); -! // kick the OS -! return KICK_SCHEDULER; -! } -! break; -! } -! return DO_NOT_KICK_SCHEDULER; -! } -diff -crB openwsn/radiotimer.h ../../../sys/net/openwsn/radiotimer.h -*** openwsn/radiotimer.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/radiotimer.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,44 **** -! /** -! \brief Cross-platform declaration "radiotimer" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #ifndef __RADIOTIMER_H -! #define __RADIOTIMER_H -! -! #include "stdint.h" -! #include "board.h" -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! typedef void (*radiotimer_compare_cbt)(); -! typedef void (*radiotimer_capture_cbt)(PORT_TIMER_WIDTH timestamp); -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! // admin -! void radiotimer_init(); -! void radiotimer_setOverflowCb(radiotimer_compare_cbt cb); -! void radiotimer_setCompareCb(radiotimer_compare_cbt cb); -! void radiotimer_setStartFrameCb(radiotimer_capture_cbt cb); -! void radiotimer_setEndFrameCb(radiotimer_capture_cbt cb); -! void radiotimer_start(PORT_TIMER_WIDTH period); -! // direct access -! PORT_TIMER_WIDTH radiotimer_getValue(); -! void radiotimer_setPeriod(PORT_TIMER_WIDTH period); -! PORT_TIMER_WIDTH radiotimer_getPeriod(); -! // compare -! void radiotimer_schedule(PORT_TIMER_WIDTH offset); -! void radiotimer_cancel(); -! // capture -! PORT_TIMER_WIDTH radiotimer_getCapturedTime(); -! -! // interrupt handlers -! kick_scheduler_t radiotimer_isr(); -! -! #endif ---- 1,54 ---- -! #ifndef __RADIOTIMER_H -! #define __RADIOTIMER_H -! -! /** -! \addtogroup BSP -! \{ -! \addtogroup radiotimer -! \{ -! -! \brief Cross-platform declaration "radiotimer" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #include "stdint.h" -! #include "board_ow.h" -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! typedef void (*radiotimer_compare_cbt)(void); -! typedef void (*radiotimer_capture_cbt)(PORT_TIMER_WIDTH timestamp); -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! // admin -! void radiotimer_init(void); -! void radiotimer_setOverflowCb(radiotimer_compare_cbt cb); -! void radiotimer_setCompareCb(radiotimer_compare_cbt cb); -! void radiotimer_setStartFrameCb(radiotimer_capture_cbt cb); -! void radiotimer_setEndFrameCb(radiotimer_capture_cbt cb); -! void radiotimer_start(PORT_RADIOTIMER_WIDTH period); -! // direct access -! PORT_RADIOTIMER_WIDTH radiotimer_getValue(void); -! void radiotimer_setPeriod(PORT_RADIOTIMER_WIDTH period); -! PORT_RADIOTIMER_WIDTH radiotimer_getPeriod(void); -! // compare -! void radiotimer_schedule(PORT_RADIOTIMER_WIDTH offset); -! void radiotimer_cancel(void); -! // capture -! PORT_RADIOTIMER_WIDTH radiotimer_getCapturedTime(void); -! -! // interrupt handlers -! kick_scheduler_t radiotimer_isr(void); -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/scheduler.c ../../../sys/net/openwsn/scheduler.c -*** openwsn/scheduler.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/scheduler.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,124 **** -! /** -! \brief OpenOS scheduler. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #include "openwsn.h" -! #include "scheduler.h" -! #include "board.h" -! #include "debugpins.h" -! #include "leds.h" -! -! //=========================== variables ======================================= -! -! typedef struct task_llist_t { -! task_cbt cb; -! task_prio_t prio; -! void* next; -! } taskList_item_t; -! -! typedef struct { -! taskList_item_t taskBuf[TASK_LIST_DEPTH]; -! taskList_item_t* task_list; -! uint8_t numTasksCur; -! uint8_t numTasksMax; -! } scheduler_vars_t; -! -! scheduler_vars_t scheduler_vars; -! -! typedef struct { -! uint8_t numTasksCur; -! uint8_t numTasksMax; -! } scheduler_dbg_t; -! -! scheduler_dbg_t scheduler_dbg; -! -! //=========================== prototypes ====================================== -! -! void consumeTask(uint8_t taskId); -! -! //=========================== public ========================================== -! -! void scheduler_init() { -! -! // initialization module variables -! memset(&scheduler_vars,0,sizeof(scheduler_vars_t)); -! memset(&scheduler_dbg,0,sizeof(scheduler_dbg_t)); -! -! // enable the scheduler's interrupt so SW can wake up the scheduler -! SCHEDULER_ENABLE_INTERRUPT(); -! } -! -! void scheduler_start() { -! taskList_item_t* pThisTask; -! while (1) { -! while(scheduler_vars.task_list!=NULL) { -! // there is still at least one task in the linked-list of tasks -! -! // the task to execute is the one at the head of the queue -! pThisTask = scheduler_vars.task_list; -! -! // shift the queue by one task -! scheduler_vars.task_list = pThisTask->next; -! -! // execute the current task -! pThisTask->cb(); -! -! // free up this task container -! pThisTask->cb = NULL; -! pThisTask->prio = TASKPRIO_NONE; -! pThisTask->next = NULL; -! scheduler_dbg.numTasksCur--; -! } -! debugpins_task_clr(); -! board_sleep(); -! debugpins_task_set(); // IAR should halt here if nothing to do -! } -! } -! -! void scheduler_push_task(task_cbt cb, task_prio_t prio) { -! taskList_item_t* taskContainer; -! taskList_item_t** taskListWalker; -! INTERRUPT_DECLARATION(); -! -! DISABLE_INTERRUPTS(); -! -! // find an empty task container -! taskContainer = &scheduler_vars.taskBuf[0]; -! while (taskContainer->cb!=NULL && -! taskContainer<=&scheduler_vars.taskBuf[TASK_LIST_DEPTH-1]) { -! taskContainer++; -! } -! if (taskContainer>&scheduler_vars.taskBuf[TASK_LIST_DEPTH-1]) { -! // task list has overflown. This should never happpen! -! -! // we can not print from within the kernel. Instead: -! // blink the error LED -! leds_error_blink(); -! // reset the board -! board_reset(); -! } -! // fill that task container with this task -! taskContainer->cb = cb; -! taskContainer->prio = prio; -! -! // find position in queue -! taskListWalker = &scheduler_vars.task_list; -! while (*taskListWalker!=NULL && -! (*taskListWalker)->prio < taskContainer->prio) { -! taskListWalker = (taskList_item_t**)&((*taskListWalker)->next); -! } -! // insert at that position -! taskContainer->next = *taskListWalker; -! *taskListWalker = taskContainer; -! // maintain debug stats -! scheduler_dbg.numTasksCur++; -! if (scheduler_dbg.numTasksCur>scheduler_dbg.numTasksMax) { -! scheduler_dbg.numTasksMax = scheduler_dbg.numTasksCur; -! } -! -! ENABLE_INTERRUPTS(); -! } -! -! //=========================== private ========================================= ---- 1,108 ---- -! /** -! \brief OpenOS scheduler. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #include "openwsn.h" -! #include "scheduler.h" -! #include "board.h" -! #include "debugpins.h" -! #include "leds.h" -! -! //=========================== variables ======================================= -! -! scheduler_vars_t scheduler_vars; -! scheduler_dbg_t scheduler_dbg; -! -! //=========================== prototypes ====================================== -! -! void consumeTask(uint8_t taskId); -! -! //=========================== public ========================================== -! -! void scheduler_init() { -! // initialization module variables -! memset(&scheduler_vars,0,sizeof(scheduler_vars_t)); -! memset(&scheduler_dbg,0,sizeof(scheduler_dbg_t)); -! -! // enable the scheduler's interrupt so SW can wake up the scheduler -! //SCHEDULER_ENABLE_INTERRUPT(); -! puts(__PRETTY_FUNCTION__); -! } -! -! void scheduler_start() { -! puts(__PRETTY_FUNCTION__); -! taskList_item_t* pThisTask; -! while (1) { -! while(scheduler_vars.task_list!=NULL) { -! // there is still at least one task in the linked-list of tasks -! -! // the task to execute is the one at the head of the queue -! pThisTask = scheduler_vars.task_list; -! printf("run task %p with prio %d\n", pThisTask->cb, pThisTask->prio); -! // shift the queue by one task -! scheduler_vars.task_list = pThisTask->next; -! -! // execute the current task -! pThisTask->cb(); -! -! // free up this task container -! pThisTask->cb = NULL; -! pThisTask->prio = TASKPRIO_NONE; -! pThisTask->next = NULL; -! scheduler_dbg.numTasksCur--; -! } -! //debugpins_task_clr(); -! board_sleep(); -! //debugpins_task_set(); // IAR should halt here if nothing to do -! } -! puts("leaving... WTF?!"); -! } -! -! void scheduler_push_task(task_cbt cb, task_prio_t prio) { -! puts(__PRETTY_FUNCTION__); -! taskList_item_t* taskContainer; -! taskList_item_t** taskListWalker; -! INTERRUPT_DECLARATION(); -! -! DISABLE_INTERRUPTS(); -! -! // find an empty task container -! taskContainer = &scheduler_vars.taskBuf[0]; -! while (taskContainer->cb!=NULL && -! taskContainer<=&scheduler_vars.taskBuf[TASK_LIST_DEPTH-1]) { -! taskContainer++; -! } -! if (taskContainer>&scheduler_vars.taskBuf[TASK_LIST_DEPTH-1]) { -! // task list has overflown. This should never happpen! -! -! // we can not print from within the kernel. Instead: -! // blink the error LED -! leds_error_blink(); -! // reset the board -! board_reset(); -! } -! // fill that task container with this task -! taskContainer->cb = cb; -! taskContainer->prio = prio; -! -! // find position in queue -! taskListWalker = &scheduler_vars.task_list; -! while (*taskListWalker!=NULL && -! (*taskListWalker)->prio < taskContainer->prio) { -! taskListWalker = (taskList_item_t**)&((*taskListWalker)->next); -! } -! // insert at that position -! taskContainer->next = *taskListWalker; -! *taskListWalker = taskContainer; -! // maintain debug stats -! scheduler_dbg.numTasksCur++; -! if (scheduler_dbg.numTasksCur>scheduler_dbg.numTasksMax) { -! scheduler_dbg.numTasksMax = scheduler_dbg.numTasksCur; -! } -! -! ENABLE_INTERRUPTS(); -! } -! -! //=========================== private ========================================= -diff -crB openwsn/scheduler.h ../../../sys/net/openwsn/scheduler.h -*** openwsn/scheduler.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/scheduler.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,64 **** -! #ifndef __SCHEDULER_H -! #define __SCHEDULER_H -! -! /** -! \addtogroup drivers -! \{ -! \addtogroup Scheduler -! \{ -! */ -! -! #include "openwsn.h" -! -! //=========================== define ========================================== -! -! typedef enum { -! TASKPRIO_NONE = 0x00, -! // tasks trigger by radio -! TASKPRIO_RESNOTIF_RX = 0x01, // scheduled by IEEE802.15.4e -! TASKPRIO_RESNOTIF_TXDONE = 0x02, // scheduled by IEEE802.15.4e -! // tasks triggered by timers -! TASKPRIO_RES = 0x03, // scheduled by timerB CCR0 interrupt -! TASKPRIO_RPL = 0x04, // scheduled by timerB CCR1 interrupt -! TASKPRIO_TCP_TIMEOUT = 0x05, // scheduled by timerB CCR2 interrupt -! TASKPRIO_COAP = 0x06, // scheduled by timerB CCR3 interrupt -! // tasks trigger by other interrupts -! TASKPRIO_BUTTON = 0x07, // scheduled by P2.7 interrupt -! TASKPRIO_MAX = 0x08, -! } task_prio_t; -! -! #define TASK_LIST_DEPTH 10 -! -! //=========================== typedef ========================================= -! -! typedef void (*task_cbt)(void); -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! // public functions -! void scheduler_init(); -! void scheduler_start(); -! void scheduler_push_task(task_cbt task_cb, task_prio_t prio); -! -! // interrupt handlers -! void isr_ieee154e_newSlot(); -! void isr_ieee154e_timer(); -! void isr_adc(); -! #ifdef ISR_GYRO -! void isr_gyro(); -! #endif -! #ifdef ISR_LARGE_RANGE_ACCEL -! void isr_large_range_accel(); -! #endif -! #ifdef ISR_BUTTON -! void isr_button(); -! #endif -! -! /** -! \} -! \} -! */ -! -! #endif ---- 1,82 ---- -! #ifndef __SCHEDULER_H -! #define __SCHEDULER_H -! -! /** -! \addtogroup kernel -! \{ -! \addtogroup Scheduler -! \{ -! */ -! -! #include "openwsn.h" -! -! //=========================== define ========================================== -! -! typedef enum { -! TASKPRIO_NONE = 0x00, -! // tasks trigger by radio -! TASKPRIO_RESNOTIF_RX = 0x01, // scheduled by IEEE802.15.4e -! TASKPRIO_RESNOTIF_TXDONE = 0x02, // scheduled by IEEE802.15.4e -! // tasks triggered by timers -! TASKPRIO_RES = 0x03, // scheduled by timerB CCR0 interrupt -! TASKPRIO_RPL = 0x04, // scheduled by timerB CCR1 interrupt -! TASKPRIO_TCP_TIMEOUT = 0x05, // scheduled by timerB CCR2 interrupt -! TASKPRIO_COAP = 0x06, // scheduled by timerB CCR3 interrupt -! // tasks trigger by other interrupts -! TASKPRIO_BUTTON = 0x07, // scheduled by P2.7 interrupt -! TASKPRIO_MAX = 0x08, -! } task_prio_t; -! -! #define TASK_LIST_DEPTH 10 -! -! //=========================== typedef ========================================= -! -! typedef void (*task_cbt)(void); -! -! typedef struct task_llist_t { -! task_cbt cb; -! task_prio_t prio; -! void* next; -! } taskList_item_t; -! -! //=========================== module variables ================================ -! -! typedef struct { -! taskList_item_t taskBuf[TASK_LIST_DEPTH]; -! taskList_item_t* task_list; -! uint8_t numTasksCur; -! uint8_t numTasksMax; -! } scheduler_vars_t; -! -! typedef struct { -! uint8_t numTasksCur; -! uint8_t numTasksMax; -! } scheduler_dbg_t; -! -! //=========================== prototypes ====================================== -! -! // public functions -! void scheduler_init(void); -! void scheduler_start(void); -! void scheduler_push_task(task_cbt task_cb, task_prio_t prio); -! -! // interrupt handlers -! void isr_ieee154e_newSlot(void); -! void isr_ieee154e_timer(void); -! void isr_adc(void); -! #ifdef ISR_GYRO -! void isr_gyro(); -! #endif -! #ifdef ISR_LARGE_RANGE_ACCEL -! void isr_large_range_accel(); -! #endif -! #ifdef ISR_BUTTON -! void isr_button(); -! #endif -! -! /** -! \} -! \} -! */ -! -! #endif -diff -crB openwsn/spi.c ../../../sys/net/openwsn/spi.c -*** openwsn/spi.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/spi.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,246 **** -! /** -! \brief TelosB-specific definition of the "spi" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #include "msp430f1611.h" -! #include "spi.h" -! #include "leds.h" -! -! //=========================== defines ========================================= -! -! //=========================== variables ======================================= -! -! typedef struct { -! // information about the current transaction -! uint8_t* pNextTxByte; -! uint8_t numTxedBytes; -! uint8_t txBytesLeft; -! spi_return_t returnType; -! uint8_t* pNextRxByte; -! uint8_t maxRxBytes; -! spi_first_t isFirst; -! spi_last_t isLast; -! // state of the module -! uint8_t busy; -! #ifdef SPI_IN_INTERRUPT_MODE -! // callback when module done -! spi_cbt callback; -! #endif -! } spi_vars_t; -! -! spi_vars_t spi_vars; -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void spi_init() { -! // clear variables -! memset(&spi_vars,0,sizeof(spi_vars_t)); -! -! // hold USART state machine in reset mode during configuration -! U0CTL = SWRST; // [b0] SWRST=1: Enabled. USART logic held in reset state -! -! // configure SPI-related pins -! P3SEL |= 0x02; // P3.1 in SIMO mode -! P3DIR |= 0x02; // P3.1 as output -! P3SEL |= 0x04; // P3.2 in SOMI mode -! P3DIR |= 0x04; // P3.2 as output -! P3SEL |= 0x08; // P3.3 in SCL mode -! P3DIR |= 0x08; // P3.3 as output -! P4OUT |= 0x04; // P4.2 radio CS, hold high -! P4DIR |= 0x04; // P4.2 radio CS, output -! -! // initialize USART registers -! U0CTL |= CHAR | SYNC | MM ; // [b7] 0: unused -! // [b6] 0: unused -! // [b5] I2C=0: SPI mode (not I2C) -! // [b4] CHAR=1: 8-bit data -! // [b3] LISTEN=0: Disabled -! // [b2] SYNC=1: SPI mode (not UART) -! // [b1] MM=1: USART is master -! // [b0] SWRST=x: don't change -! -! U0TCTL = CKPH | SSEL1 | STC | TXEPT; // [b7] CKPH=1: UCLK is delayed by one half cycle -! // [b6] CKPL=0: normal clock polarity -! // [b5] SSEL1=1: -! // [b4] SSEL0=0: SMCLK -! // [b3] 0: unused -! // [b2] 0: unused -! // [b1] STC=1: 3-pin SPI mode -! // [b0] TXEPT=1: UxTXBUF and TX shift register are empty -! -! U0BR1 = 0x00; -! U0BR0 = 0x02; // U0BR = [U0BR1<<8|U0BR0] = 2 -! U0MCTL = 0x00; // no modulation needed in SPI mode -! -! // enable USART module -! ME1 |= UTXE0 | URXE0; // [b7] UTXE0=1: USART0 transmit enabled -! // [b6] URXE0=1: USART0 receive enabled -! // [b5] x: don't touch! -! // [b4] x: don't touch! -! // [b3] x: don't touch! -! // [b2] x: don't touch! -! // [b1] x: don't touch! -! // [b0] x: don't touch! -! -! // clear USART state machine from reset, starting operation -! U0CTL &= ~SWRST; -! -! // enable interrupts via the IEx SFRs -! #ifdef SPI_IN_INTERRUPT_MODE -! IE1 |= URXIE0; // we only enable the SPI RX interrupt -! // since TX and RX happen concurrently, -! // i.e. an RX completion necessarily -! // implies a TX completion. -! #endif -! } -! -! #ifdef SPI_IN_INTERRUPT_MODE -! void spi_setCb(spi_cbt cb) { -! spi_vars.spi_cb = cb; -! } -! #endif -! -! void spi_txrx(uint8_t* bufTx, -! uint8_t lenbufTx, -! spi_return_t returnType, -! uint8_t* bufRx, -! uint8_t maxLenBufRx, -! spi_first_t isFirst, -! spi_last_t isLast) { -! -! #ifdef SPI_IN_INTERRUPT_MODE -! // disable interrupts -! __disable_interrupt(); -! #endif -! -! // register spi frame to send -! spi_vars.pNextTxByte = bufTx; -! spi_vars.numTxedBytes = 0; -! spi_vars.txBytesLeft = lenbufTx; -! spi_vars.returnType = returnType; -! spi_vars.pNextRxByte = bufRx; -! spi_vars.maxRxBytes = maxLenBufRx; -! spi_vars.isFirst = isFirst; -! spi_vars.isLast = isLast; -! -! // SPI is now busy -! spi_vars.busy = 1; -! -! // lower CS signal to have slave listening -! if (spi_vars.isFirst==SPI_FIRST) { -! P4OUT &= ~0x04; -! } -! -! #ifdef SPI_IN_INTERRUPT_MODE -! // implementation 1. use a callback function when transaction finishes -! -! // write first byte to TX buffer -! U0TXBUF = *spi_vars.pNextTxByte; -! -! // re-enable interrupts -! __enable_interrupt(); -! #else -! // implementation 2. busy wait for each byte to be sent -! -! // send all bytes -! while (spi_vars.txBytesLeft>0) { -! // write next byte to TX buffer -! U0TXBUF = *spi_vars.pNextTxByte; -! // busy wait on the interrupt flag -! while ((IFG1 & URXIFG0)==0); -! // clear the interrupt flag -! IFG1 &= ~URXIFG0; -! // save the byte just received in the RX buffer -! switch (spi_vars.returnType) { -! case SPI_FIRSTBYTE: -! if (spi_vars.numTxedBytes==0) { -! *spi_vars.pNextRxByte = U0RXBUF; -! } -! break; -! case SPI_BUFFER: -! *spi_vars.pNextRxByte = U0RXBUF; -! spi_vars.pNextRxByte++; -! break; -! case SPI_LASTBYTE: -! *spi_vars.pNextRxByte = U0RXBUF; -! break; -! } -! // one byte less to go -! spi_vars.pNextTxByte++; -! spi_vars.numTxedBytes++; -! spi_vars.txBytesLeft--; -! } -! -! // put CS signal high to signal end of transmission to slave -! if (spi_vars.isLast==SPI_LAST) { -! P4OUT |= 0x04; -! } -! -! // SPI is not busy anymore -! spi_vars.busy = 0; -! #endif -! } -! -! //=========================== private ========================================= -! -! //=========================== interrupt handlers ============================== -! -! kick_scheduler_t spi_isr() { -! #ifdef SPI_IN_INTERRUPT_MODE -! // save the byte just received in the RX buffer -! switch (spi_vars.returnType) { -! case SPI_FIRSTBYTE: -! if (spi_vars.numTxedBytes==0) { -! *spi_vars.pNextRxByte = U0RXBUF; -! } -! break; -! case SPI_BUFFER: -! *spi_vars.pNextRxByte = U0RXBUF; -! spi_vars.pNextRxByte++; -! break; -! case SPI_LASTBYTE: -! *spi_vars.pNextRxByte = U0RXBUF; -! break; -! } -! -! // one byte less to go -! spi_vars.pNextTxByte++; -! spi_vars.numTxedBytes++; -! spi_vars.txBytesLeft--; -! -! if (spi_vars.txBytesLeft>0) { -! // write next byte to TX buffer -! U0TXBUF = *spi_vars.pNextTxByte; -! } else { -! // put CS signal high to signal end of transmission to slave -! if (spi_vars.isLast==SPI_LAST) { -! P4OUT |= 0x04; -! } -! // SPI is not busy anymore -! spi_vars.busy = 0; -! -! // SPI is done! -! if (spi_vars.callback!=NULL) { -! // call the callback -! spi_vars.spi_cb(); -! // kick the OS -! return KICK_SCHEDULER; -! } -! } -! return DO_NOT_KICK_SCHEDULER; -! #else -! // this should never happpen! -! -! // we can not print from within the BSP. Instead: -! // blink the error LED -! leds_error_blink(); -! // reset the board -! board_reset(); -! -! return DO_NOT_KICK_SCHEDULER; // we will not get here, statement to please compiler -! #endif -! } ---- 1,251 ---- -! /** -! \brief TelosB-specific definition of the "spi" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #include "msp430f1611.h" -! #include "spi.h" -! #include "leds.h" -! -! //=========================== defines ========================================= -! -! //=========================== variables ======================================= -! -! typedef struct { -! // information about the current transaction -! uint8_t* pNextTxByte; -! uint8_t numTxedBytes; -! uint8_t txBytesLeft; -! spi_return_t returnType; -! uint8_t* pNextRxByte; -! uint8_t maxRxBytes; -! spi_first_t isFirst; -! spi_last_t isLast; -! // state of the module -! uint8_t busy; -! #ifdef SPI_IN_INTERRUPT_MODE -! // callback when module done -! spi_cbt spi_cb; -! #endif -! } spi_vars_t; -! -! spi_vars_t spi_vars; -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void spi_init(void) { -! // clear variables -! memset(&spi_vars,0,sizeof(spi_vars_t)); -! -! // hold USART state machine in reset mode during configuration -! U0CTL = SWRST; // [b0] SWRST=1: Enabled. USART logic held in reset state -! -! // configure SPI-related pins -! P3SEL |= 0x02; // P3.1 in SIMO mode -! P3DIR |= 0x02; // P3.1 as output -! P3SEL |= 0x04; // P3.2 in SOMI mode -! P3DIR |= 0x04; // P3.2 as output -! P3SEL |= 0x08; // P3.3 in SCL mode -! P3DIR |= 0x08; // P3.3 as output -! P4OUT |= 0x04; // P4.2 radio CS, hold high -! P4DIR |= 0x04; // P4.2 radio CS, output -! -! // initialize USART registers -! U0CTL |= CHAR | SYNC | MM ; // [b7] 0: unused -! // [b6] 0: unused -! // [b5] I2C=0: SPI mode (not I2C) -! // [b4] CHAR=1: 8-bit data -! // [b3] LISTEN=0: Disabled -! // [b2] SYNC=1: SPI mode (not UART) -! // [b1] MM=1: USART is master -! // [b0] SWRST=x: don't change -! -! U0TCTL = CKPH | SSEL1 | STC | TXEPT; // [b7] CKPH=1: UCLK is delayed by one half cycle -! // [b6] CKPL=0: normal clock polarity -! // [b5] SSEL1=1: -! // [b4] SSEL0=0: SMCLK -! // [b3] 0: unused -! // [b2] 0: unused -! // [b1] STC=1: 3-pin SPI mode -! // [b0] TXEPT=1: UxTXBUF and TX shift register are empty -! -! U0BR1 = 0x00; -! U0BR0 = 0x02; // U0BR = [U0BR1<<8|U0BR0] = 2 -! U0MCTL = 0x00; // no modulation needed in SPI mode -! -! // enable USART module -! ME1 |= UTXE0 | URXE0; // [b7] UTXE0=1: USART0 transmit enabled -! // [b6] URXE0=1: USART0 receive enabled -! // [b5] x: don't touch! -! // [b4] x: don't touch! -! // [b3] x: don't touch! -! // [b2] x: don't touch! -! // [b1] x: don't touch! -! // [b0] x: don't touch! -! -! // clear USART state machine from reset, starting operation -! U0CTL &= ~SWRST; -! -! // enable interrupts via the IEx SFRs -! #ifdef SPI_IN_INTERRUPT_MODE -! IE1 |= URXIE0; // we only enable the SPI RX interrupt -! // since TX and RX happen concurrently, -! // i.e. an RX completion necessarily -! // implies a TX completion. -! #endif -! } -! -! #ifdef SPI_IN_INTERRUPT_MODE -! void spi_setCb(spi_cbt cb) { -! spi_vars.spi_cb = cb; -! } -! #endif -! -! void spi_txrx(uint8_t* bufTx, -! uint8_t lenbufTx, -! spi_return_t returnType, -! uint8_t* bufRx, -! uint8_t maxLenBufRx, -! spi_first_t isFirst, -! spi_last_t isLast) { -! -! #ifdef SPI_IN_INTERRUPT_MODE -! // disable interrupts -! __disable_interrupt(); -! #endif -! -! // register spi frame to send -! spi_vars.pNextTxByte = bufTx; -! spi_vars.numTxedBytes = 0; -! spi_vars.txBytesLeft = lenbufTx; -! spi_vars.returnType = returnType; -! spi_vars.pNextRxByte = bufRx; -! spi_vars.maxRxBytes = maxLenBufRx; -! spi_vars.isFirst = isFirst; -! spi_vars.isLast = isLast; -! -! // SPI is now busy -! spi_vars.busy = 1; -! -! // lower CS signal to have slave listening -! if (spi_vars.isFirst==SPI_FIRST) { -! P4OUT &= ~0x04; -! } -! -! #ifdef SPI_IN_INTERRUPT_MODE -! // implementation 1. use a callback function when transaction finishes -! -! // write first byte to TX buffer -! U0TXBUF = *spi_vars.pNextTxByte; -! -! // re-enable interrupts -! __enable_interrupt(); -! #else -! // implementation 2. busy wait for each byte to be sent -! -! // send all bytes -! while (spi_vars.txBytesLeft>0) { -! // write next byte to TX buffer -! U0TXBUF = *spi_vars.pNextTxByte; -! // busy wait on the interrupt flag -! uint32_t c = 0; -! while ((IFG1 & URXIFG0)==0) -! if (c++ == 1000) { -! puts("spi_txrx timeout"); -! break; -! } -! // clear the interrupt flag -! IFG1 &= ~URXIFG0; -! // save the byte just received in the RX buffer -! switch (spi_vars.returnType) { -! case SPI_FIRSTBYTE: -! if (spi_vars.numTxedBytes==0) { -! *spi_vars.pNextRxByte = U0RXBUF; -! } -! break; -! case SPI_BUFFER: -! *spi_vars.pNextRxByte = U0RXBUF; -! spi_vars.pNextRxByte++; -! break; -! case SPI_LASTBYTE: -! *spi_vars.pNextRxByte = U0RXBUF; -! break; -! } -! // one byte less to go -! spi_vars.pNextTxByte++; -! spi_vars.numTxedBytes++; -! spi_vars.txBytesLeft--; -! } -! -! // put CS signal high to signal end of transmission to slave -! if (spi_vars.isLast==SPI_LAST) { -! P4OUT |= 0x04; -! } -! -! // SPI is not busy anymore -! spi_vars.busy = 0; -! #endif -! } -! -! //=========================== private ========================================= -! -! //=========================== interrupt handlers ============================== -! -! kick_scheduler_t spi_isr(void) { -! #ifdef SPI_IN_INTERRUPT_MODE -! // save the byte just received in the RX buffer -! switch (spi_vars.returnType) { -! case SPI_FIRSTBYTE: -! if (spi_vars.numTxedBytes==0) { -! *spi_vars.pNextRxByte = U0RXBUF; -! } -! break; -! case SPI_BUFFER: -! *spi_vars.pNextRxByte = U0RXBUF; -! spi_vars.pNextRxByte++; -! break; -! case SPI_LASTBYTE: -! *spi_vars.pNextRxByte = U0RXBUF; -! break; -! } -! -! // one byte less to go -! spi_vars.pNextTxByte++; -! spi_vars.numTxedBytes++; -! spi_vars.txBytesLeft--; -! -! if (spi_vars.txBytesLeft>0) { -! // write next byte to TX buffer -! U0TXBUF = *spi_vars.pNextTxByte; -! } else { -! // put CS signal high to signal end of transmission to slave -! if (spi_vars.isLast==SPI_LAST) { -! P4OUT |= 0x04; -! } -! // SPI is not busy anymore -! spi_vars.busy = 0; -! -! // SPI is done! -! if (spi_vars.spi_cb!=NULL) { -! // call the callback -! spi_vars.spi_cb(); -! // kick the OS -! return KICK_SCHEDULER; -! } -! } -! return DO_NOT_KICK_SCHEDULER; -! #else -! // this should never happpen! -! -! // we can not print from within the BSP. Instead: -! // blink the error LED -! leds_error_blink(); -! // reset the board -! board_reset(); -! -! return DO_NOT_KICK_SCHEDULER; // we will not get here, statement to please compiler -! #endif -! } -diff -crB openwsn/spi.h ../../../sys/net/openwsn/spi.h -*** openwsn/spi.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/spi.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,67 **** -! /** -! \brief Cross-platform declaration "spi" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #ifndef __SPI_H -! #define __SPI_H -! -! #include "stdint.h" -! #include "board.h" -! -! //=========================== define ========================================== -! -! /** -! The SPI module functions in two modes: -! - in "blocking" mode, all calls return only when the module is done. the CPU -! is not available while the module is busy. This is the preferred method is -! low-RAM system which can not run an RTOS -! - in "interrupt" mode, calls are returned after the module has started a -! transaction. When the transaction is done, the module uses a callback -! function to signal this to the caller. This frees up CPU time, allowing for -! other operations to happen concurrently. This is the preferred method when an -! RTOS is present. -! */ -! //#define SPI_IN_INTERRUPT_MODE -! -! //=========================== typedef ========================================= -! -! typedef enum { -! SPI_FIRSTBYTE = 0, -! SPI_BUFFER = 1, -! SPI_LASTBYTE = 2, -! } spi_return_t; -! -! typedef enum { -! SPI_NOTFIRST = 0, -! SPI_FIRST = 1, -! } spi_first_t; -! -! typedef enum { -! SPI_NOTLAST = 0, -! SPI_LAST = 1, -! } spi_last_t; -! -! typedef void (*spi_cbt)(void); -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void spi_init(); -! #ifdef SPI_IN_INTERRUPT_MODE -! void spi_setCb(spi_cbt cb); -! #endif -! void spi_txrx(uint8_t* bufTx, -! uint8_t lenbufTx, -! spi_return_t returnType, -! uint8_t* bufRx, -! uint8_t maxLenBufRx, -! spi_first_t isFirst, -! spi_last_t isLast); -! -! // interrupt handlers -! kick_scheduler_t spi_isr(); -! -! #endif ---- 1,67 ---- -! /** -! \brief Cross-platform declaration "spi" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #ifndef __SPI_H -! #define __SPI_H -! -! #include "stdint.h" -! #include "board_ow.h" -! -! //=========================== define ========================================== -! -! /** -! The SPI module functions in two modes: -! - in "blocking" mode, all calls return only when the module is done. the CPU -! is not available while the module is busy. This is the preferred method is -! low-RAM system which can not run an RTOS -! - in "interrupt" mode, calls are returned after the module has started a -! transaction. When the transaction is done, the module uses a callback -! function to signal this to the caller. This frees up CPU time, allowing for -! other operations to happen concurrently. This is the preferred method when an -! RTOS is present. -! */ -! //#define SPI_IN_INTERRUPT_MODE -! -! //=========================== typedef ========================================= -! -! typedef enum { -! SPI_FIRSTBYTE = 0, -! SPI_BUFFER = 1, -! SPI_LASTBYTE = 2, -! } spi_return_t; -! -! typedef enum { -! SPI_NOTFIRST = 0, -! SPI_FIRST = 1, -! } spi_first_t; -! -! typedef enum { -! SPI_NOTLAST = 0, -! SPI_LAST = 1, -! } spi_last_t; -! -! typedef void (*spi_cbt)(void); -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void spi_init(void); -! #ifdef SPI_IN_INTERRUPT_MODE -! void spi_setCb(spi_cbt cb); -! #endif -! void spi_txrx(uint8_t* bufTx, -! uint8_t lenbufTx, -! spi_return_t returnType, -! uint8_t* bufRx, -! uint8_t maxLenBufRx, -! spi_first_t isFirst, -! spi_last_t isLast); -! -! // interrupt handlers -! kick_scheduler_t spi_isr(void); -! -! #endif -diff -crB openwsn/uart_ow.c ../../../sys/net/openwsn/uart_ow.c -*** openwsn/uart_ow.c Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/uart_ow.c Wed Jan 15 13:48:27 2014 -*************** -*** 1,94 **** -! /** -! \brief TelosB-specific definition of the "uart" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #include "msp430f1611.h" -! #include "uart.h" -! #include "board.h" -! -! //=========================== defines ========================================= -! -! //=========================== variables ======================================= -! -! typedef struct { -! uart_tx_cbt txCb; -! uart_rx_cbt rxCb; -! } uart_vars_t; -! -! uart_vars_t uart_vars; -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void uart_init() { -! P3SEL |= 0xc0; // P3.6,7 = UART1TX/RX -! -! UCTL1 = SWRST; // hold UART1 module in reset -! UCTL1 |= CHAR; // 8-bit character -! -! /* -! // 9600 baud, clocked from 32kHz ACLK -! UTCTL1 |= SSEL0; // clocking from ACLK -! UBR01 = 0x03; // 32768/9600 = 3.41 -! UBR11 = 0x00; // -! UMCTL1 = 0x4A; // modulation -! */ -! -! // 115200 baud, clocked from 4.8MHz SMCLK -! UTCTL1 |= SSEL1; // clocking from SMCLK -! UBR01 = 41; // 4.8MHz/115200 - 41.66 -! UBR11 = 0x00; // -! UMCTL1 = 0x4A; // modulation -! -! -! ME2 |= UTXE1 + URXE1; // enable UART1 TX/RX -! UCTL1 &= ~SWRST; // clear UART1 reset bit -! } -! -! void uart_setCallbacks(uart_tx_cbt txCb, uart_rx_cbt rxCb) { -! uart_vars.txCb = txCb; -! uart_vars.rxCb = rxCb; -! } -! -! void uart_enableInterrupts(){ -! IE2 |= (URXIE1 | UTXIE1); -! } -! -! void uart_disableInterrupts(){ -! IE2 &= ~(URXIE1 | UTXIE1); -! } -! -! void uart_clearRxInterrupts(){ -! IFG2 &= ~URXIFG1; -! } -! -! void uart_clearTxInterrupts(){ -! IFG2 &= ~UTXIFG1; -! } -! -! void uart_writeByte(uint8_t byteToWrite){ -! U1TXBUF = byteToWrite; -! } -! -! uint8_t uart_readByte(){ -! return U1RXBUF; -! } -! -! //=========================== private ========================================= -! -! //=========================== interrupt handlers ============================== -! -! kick_scheduler_t uart_tx_isr() { -! uart_clearTxInterrupts(); // TODO: do not clear, but disable when done -! uart_vars.txCb(); -! return DO_NOT_KICK_SCHEDULER; -! } -! -! kick_scheduler_t uart_rx_isr() { -! uart_clearRxInterrupts(); // TODO: do not clear, but disable when done -! uart_vars.rxCb(); -! return DO_NOT_KICK_SCHEDULER; - } -\ No newline at end of file ---- 1,94 ---- -! /** -! \brief TelosB-specific definition of the "uart" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #include "msp430f1611.h" -! #include "uart_ow.h" -! #include "board_ow.h" -! -! //=========================== defines ========================================= -! -! //=========================== variables ======================================= -! -! typedef struct { -! uart_tx_cbt txCb; -! uart_rx_cbt rxCb; -! } uart_vars_t; -! -! uart_vars_t uart_vars; -! -! //=========================== prototypes ====================================== -! -! //=========================== public ========================================== -! -! void uart_init_ow(void) { -! P3SEL |= 0xc0; // P3.6,7 = UART1TX/RX -! -! UCTL1 = SWRST; // hold UART1 module in reset -! UCTL1 |= CHAR; // 8-bit character -! -! /* -! // 9600 baud, clocked from 32kHz ACLK -! UTCTL1 |= SSEL0; // clocking from ACLK -! UBR01 = 0x03; // 32768/9600 = 3.41 -! UBR11 = 0x00; // -! UMCTL1 = 0x4A; // modulation -! */ -! -! // 115200 baud, clocked from 4.8MHz SMCLK -! UTCTL1 |= SSEL1; // clocking from SMCLK -! UBR01 = 41; // 4.8MHz/115200 - 41.66 -! UBR11 = 0x00; // -! UMCTL1 = 0x4A; // modulation -! -! -! ME2 |= UTXE1 + URXE1; // enable UART1 TX/RX -! UCTL1 &= ~SWRST; // clear UART1 reset bit -! } -! -! void uart_setCallbacks(uart_tx_cbt txCb, uart_rx_cbt rxCb) { -! uart_vars.txCb = txCb; -! uart_vars.rxCb = rxCb; -! } -! -! void uart_enableInterrupts(void){ -! IE2 |= (URXIE1 | UTXIE1); -! } -! -! void uart_disableInterrupts(void){ -! IE2 &= ~(URXIE1 | UTXIE1); -! } -! -! void uart_clearRxInterrupts(void){ -! IFG2 &= ~URXIFG1; -! } -! -! void uart_clearTxInterrupts(void){ -! IFG2 &= ~UTXIFG1; -! } -! -! void uart_writeByte(uint8_t byteToWrite){ -! U1TXBUF = byteToWrite; -! } -! -! uint8_t uart_readByte_ow(void){ -! return U1RXBUF; -! } -! -! //=========================== private ========================================= -! -! //=========================== interrupt handlers ============================== -! -! kick_scheduler_t uart_tx_isr(void) { -! uart_clearTxInterrupts(); // TODO: do not clear, but disable when done -! uart_vars.txCb(); -! return DO_NOT_KICK_SCHEDULER; -! } -! -! kick_scheduler_t uart_rx_isr(void) { -! uart_clearRxInterrupts(); // TODO: do not clear, but disable when done -! uart_vars.rxCb(); -! return DO_NOT_KICK_SCHEDULER; - } -\ No newline at end of file -diff -crB openwsn/uart_ow.h ../../../sys/net/openwsn/uart_ow.h -*** openwsn/uart_ow.h Thu Mar 21 21:36:59 2013 ---- ../../../sys/net/openwsn/uart_ow.h Wed Jan 15 13:48:27 2014 -*************** -*** 1,42 **** -! /** -! \brief Cross-platform declaration "uart" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #ifndef __UART_H -! #define __UART_H -! -! #include "stdint.h" -! #include "board.h" -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! typedef enum { -! UART_EVENT_THRES, -! UART_EVENT_OVERFLOW, -! } uart_event_t; -! -! typedef void (*uart_tx_cbt)(); -! typedef void (*uart_rx_cbt)(); -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void uart_init(); -! void uart_setCallbacks(uart_tx_cbt txCb, uart_rx_cbt rxCb); -! void uart_enableInterrupts(); -! void uart_disableInterrupts(); -! void uart_clearRxInterrupts(); -! void uart_clearTxInterrupts(); -! void uart_writeByte(uint8_t byteToWrite); -! uint8_t uart_readByte(); -! -! // interrupt handlers -! kick_scheduler_t uart_tx_isr(); -! kick_scheduler_t uart_rx_isr(); -! -! #endif -\ No newline at end of file ---- 1,52 ---- -! #ifndef __UART_H -! #define __UART_H -! -! /** -! \addtogroup BSP -! \{ -! \addtogroup uart -! \{ -! -! \brief Cross-platform declaration "uart" bsp module. -! -! \author Thomas Watteyne <watteyne@eecs.berkeley.edu>, February 2012. -! */ -! -! #include "stdint.h" -! #include "board_ow.h" -! -! //=========================== define ========================================== -! -! //=========================== typedef ========================================= -! -! typedef enum { -! UART_EVENT_THRES, -! UART_EVENT_OVERFLOW, -! } uart_event_t; -! -! typedef void (*uart_tx_cbt)(void); -! typedef void (*uart_rx_cbt)(void); -! -! //=========================== variables ======================================= -! -! //=========================== prototypes ====================================== -! -! void uart_init_ow(void); -! void uart_setCallbacks(uart_tx_cbt txCb, uart_rx_cbt rxCb); -! void uart_enableInterrupts(void); -! void uart_disableInterrupts(void); -! void uart_clearRxInterrupts(void); -! void uart_clearTxInterrupts(void); -! void uart_writeByte(uint8_t byteToWrite); -! uint8_t uart_readByte_ow(void); -! -! // interrupt handlers -! kick_scheduler_t uart_tx_isr(void); -! kick_scheduler_t uart_rx_isr(void); -! -! /** -! \} -! \} -! */ -! -! #endif diff --git a/pkg/openwsn/patches/02a-MAClow_IEEE802154.c.patch b/pkg/openwsn/patches/02a-MAClow_IEEE802154.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..dc23784861296f90789630092a2445c2274b107c GIT binary patch literal 10561 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FiO<*b#%_jFW2{Ub#=8cFfueX z(M#qG$tYEDEGSYiGEp!zv@$TXGB#5%GB7mZ($&>fC;}M-H9@yLvw$emd=rZljLbo% z85&rb7(h(ZLIqqPw;G!17@I19B)GT~6#Vi_QWZ)v5=#`yQxy`6QWeUJGD|Y^(iKWF zQWerNQ*%-j(u(qP!Q9lm6ovdWFf$`HF(tJ~p(G#7OG-`8%*)HnOV{J#QdEd3NGwXs zRmd$)S3m~QnRz<-r6sWnAsML(xv9m)iRq~z0}=}gKn8>CgPW>{Fea@iF*h}&vLF>| zR&-`wESL!v%TH5)hO3^Tsh)`fST&OF;?(5QqRf&?*Sy4}oYWKrxNgs41(=*dDpWE* zPoX3uvlwECJ;DijsTCz2`2}EGK?K|o$CQ+!)Z$`Tpn%jVWaJlcDJW>^b15j4<!7cS zWTvL3LZUsspePmORS$63Y4{hU<^`6fmZrMql@wLRmuP`POot0(0X|%snO9;FUxK6r z>}ODD5Z0WOpPz%IQ$Yb92+#l`Yy_tL#i@m*sd>q%ex<odsYQfM0Hy5s#FUgGke|V> z0R@~#eu1V!HN^WcJ4#Y>3*s%3tU(D?K|w)ZU!kBVwJbBgv=|f}AR|DbuaTHjo>*C| zU}mD5lv$$5r3f;!ATc>RwIr=HFS#T$Kd(3*l&n*s@uiVloUW6ZlAD;9n4Ve`pPpLc zTj}Yd;ppNL6mMqYq^aZM84}{-8t>}o;_2w8X$^6dzP<v~oeEH!A>x^73L5CPWfnUX z<tL^jCl;6ZmgbaXf*2Z5-I{Q3g1wXkQwTFvA+uNk>LWulkdMG+f}xp?iIIY?uC6X9 zFld%*;h7XY_mY-t;W-4JHbHR$!k}~t$}jkGEnIhIYEEWxNkLI+acUko#d{Wm%NtKu z1&{<NHGpLH!?P+}C)nPw)S}|d{5+7gSV{?nGKe&yw1De|l?>2Kp`buQX@O)2a<))V zPzZ+R6NNl*MgfHaqPW503TS!(J0DCylP^SLDmXO`Y;mIvb{1{|mX8rCP-0Yvi*y6P z5etnu!bQ!HE$_eqqp$CtnwMIXn4{q7TC9+fT9m4wQIe5g46U$1wRLi0QBh`Uib7_d zLSjyi0;C)&)>P2dRq)HtOI1j!RLILO*W=QLlvQ*qLH)zy2U#HsYVaUoa8t;{P{+g^ z(iDOv(c<#VlH?2pSYfSeS5jG!id<qVC@3T+7N;tJYYRg&Co4$ELi8hK%uJlDAT<$0 zMnM4@Ie4lhXokmL{lJY$DoRbvhSo_C!Iadr#L}D+6qhI{D1hqO;?$zd#GLqoqRhM! zXHd&7IWb4W+21$7-_O-ABpzA{8=9KvxCRBqhX?ulxyOTj77`iYsspZhOe}OvO&~Q7 z#5x6q!4OEeQW(sQ3iJ#oq=W@xf)kgip^hmuaY2$uErin7S4c@ME-6UNgQO2gp2d?a zaI{nc9Q{09aJE%ait`}Wp&JjXOpD4=A&t=B%&JsyYp6K0Dm6b%16p8f!rDAq8ZaR( zO^`ZWyMn~ZoczQTO-%(`1=NP0H8{1HTIiTTQwzj?+V~n*?Ca|fgvUW~j)cL{Z*HVx z4vl_LpU&J;$HD?N7ePY?N<rJY@Z<|()YyXCErzBhkWA?s5dsoM#x^!^C2r1c@xejP z5T(BUF0R&)`c+@QAV0GpKU1NiOaZOs1W|y)YLvPf*-j`M&1z3qAJ5>B_<$hSU{}8o zsNFb>My|!7rlC-1M!N+$`ntx4xdsJ$`ukbKDl`0v6KXTGpw!n-OHNbJFf1-nNUAJJ z)r6!?a`OgKT!Wb4__j3GF*GoMR3@-~bvTYLHK>aT?NcYErh|LVutpuc3k+`Prsk#K z>ryL#`m>mw>a5b@5{07F<kZZv)D%R+64n(pH8hEbS`!WKkSi#FTlblHC8<Sui8%^T z$&!5VU;wDKk*biASdyqvlCOuWZ(EdFQk0nrD_5{|Zo%;j>Ucqd9?Zo-Aa$7`PKnRV zDAB@nKB!s-<t;-46CFcCLrCtTQP|_^7$Fa4;0Sj}AVWQc6!;*mLo&=kX&woKlfR*% zxsIWc5hVSCBgM!<$It{CDd33K*H=hOPSXKrKm{X6G5~d+F+xVy4ifD?sd?!o8FsnF z>AH3~V78`0wL(#9Noi4@wL&duJRmP$AveDWJdRY9nwX*pF%_Ek6>Jr7ml4_otkr~; zU<6A~EaqgU`eYWD1c0hqP`}kyK?CL@J3Ex(8nw&>hmxj(nu0-vfuXg&zF`uie8yq} zxBx};Z*kjzQgnhXP=MNCY^|?vl*FYCwIfYI1B*Q<KC!h82?}*pP*cOqin?~lE>g4w zH7r5Z7T9`d!L3;hu?pl0SS0G}XXce9=47ToTgM8C$;tUeDVcdCprOG6Ju?$%c<Gs> zLUh-{iho!m6ldVNxCVzHDnq!p6+p!X$PFM2Zm`1~3vT%O`TMz|w4||w3aI_22kICo z*h2aNAWhbwe1McKv_O0XLsLr~Lo?`jE67HuM-lBkP`ZWo>@{#Uw+N<I!hK<gOTn#1 zA{47(@peICUS^68q}2-c3JwBm&ku`v$hllW+g8B{URi@%$dJ5D^%4SHIGJ1M7+OHv zsbF7VHU$z>hF7fMYBCR+h(XRfT3XQTV{WKp2x~`!BML!KF|&YkzM+{DM#jLF4M4dc zBNw2gc}U8IxD?ivg78QPY^Vn8<uY>CL9ZYQ)R5rxZ)u=oXlVv%F+nVXlY=T)(G%^U z4q2=T*up@^(83JTE`o<K=3o%rY5|BFzzN>W1T(=yq%ldNGXkbohzLpsAvsf6K&u9b zS!C1+1TqE0Trde8H-cmnOC2KvQ;cjfV3h^ffsl%vu91hH4TnJdVa<$|COSs2PC6tk z!Q^0wPi(ah*l}10Y?-mRC>f(t!lD%{L|I;hHPgUGDbOn~8W|ev7#Ug)%DhO=xT82L z(m(pJWkn+cBON0{<6&7Z(l0C0zgmQ3dhl9|ynKbc)YKG(wEQB4L<Q(1l#W7iW?phC zWR9#nzceRBAtSLYRUs)gHBTWqu{1rSL?JOLzbqBfl7kL@>+35d78K-EDwO0G<mcq4 zS1P1s=9HusK@@?C7??zSX0c;(a%w>dXgyB=c##L@xP_*zt(&7yuq$#;Utb?Qq6#wy zYJoyZerhpj&>^*;1hV)CQWxkz+Y8`14I?8%9V27&L0R-r+6*8itx{a{41?r4WQWTJ HZx#apM$;|Q literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/02a-MAClow_IEEE802154.h.patch b/pkg/openwsn/patches/02a-MAClow_IEEE802154.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..49478f8644842e2e30225125cc87fea4256712e5 GIT binary patch literal 3023 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FiO<*b#%_jFW2{Ub#=8cFfueX z(aYcr$tYEDEGSYiGEp!zv@$TXGB#5%GB7mZ($&>fC;}M-H9@yLvw$Si%&bgJtxQcI zrfH!9E|6P|bSxA=!dwap$|<R7nR%%S@$m@9#d~mZDJbY`X>lnk#3ZJql;o!u<(C#H zWTfU4q!tx(DJaBLg9s!kgl3RLHP{azTXc1GbxE`Z5>^mn6j1C(w*=$`Bn<YNp@oi- zImC0Ia5S{gF*Z|xx<Wxg0c3=ssY$$>vs=7dkfX0_e1NN;i>IHv0s`17nCNhUxyY&= zoxS6OTm!-4$b_weDHhe9ej!1Q0gisiDnV>p1v4EkZ4e9DY)@Ao&)|^wfFRdkSHBRD zECkys7-BKo#Wgr2-qFP+DBjoK#TB9wMA|ACVKE!x%P`lVU{8N!=V13`aF8=LqZPpJ zR#2$5=Hk-k(pE^#E6oLmB_uV+rzNMwrxhjUrk14^6=&w>#e)<SD^#O-6%^o5m&6+x z7#M?G4aK$!209A*`kASzsfMN|x*%Enn$4gZK@=#QP&J$3)(p~sj6uPM(9ER`@}xGG z0#-kkR2HPd{RTD!7L6g10j}{*u8z(qfecon0P-7Zf&!~{aSU;UC_o`Wo&hCgq?D}% z;wu=N>X;ZHlD3J7j;RTjq#f+)93SZ#93SlJ92(>q5{Ya$*lcJtV)bBVYEEWx3EYb) zDHWPZ{rr(lgtEb2#HKpZH5jS{i2^$VZ$KBM=A~rjrNbQp)(i`4XqJul^M~YNC?Bi_ z><};uT{S37z?lI_IoKh{0j;G432QSm9dkoOSX&tASePS)by9wQ4%iX}1qE=r4}iGW z8WPRO(uv90L8*nMsl_F!DOjWn67xJ=obz)Fic*U~Ima53aFI>OO!dhuE(s_~El$lV zfy$R==9O5)mw?>>c0d>;<3VjemQE?ogNlOclla7xl%n_&g@VMqOqhF+#Zyv?ORPc3 z4LMXmd<An09Sdl+0jeGJZE*vIf};GAd{Aa7R=}+aS%!;CQK2k9GerSZ06+_sf}&JV zGVn-EOi3+LP|)x%NX-i@O)X7z%_}LYj4#mw`(7cpI9-QJ5yHkpA_obQGH~F9R2HNX zV+L}pAem8|np|3xSyJhmmzb23nnH|8I9yW<N-25CseYxoNvTD|7=#pe(C`2|EHAa9 z#3R2z6BP64;aZehQk0ommI@76yx|Hq3@?EcVHx0<iqFg_(SpUJsi8?cL|D_B3*0KO zG|@3MfaawENJm(FOH=~Fj4%>X4yI;EISb14sd*)Y;~CQcu<g*=mau-zgiCUo#dHFx Ui4`-cB2uX$mjXuqAFy-^07bRTL;wH) literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/02a-MAClow_IEEE802154E.c.patch b/pkg/openwsn/patches/02a-MAClow_IEEE802154E.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..335825ea3090f7efb285799c0151edcf610cdf2a GIT binary patch literal 67753 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ÐFEN@Ie!WJy|d=<AamA>f^b;0<%+gg#Pk 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 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/02a-MAClow_IEEE802154E.h.patch b/pkg/openwsn/patches/02a-MAClow_IEEE802154E.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..42c7d4e94e85149f14b29d3ce66d49964002c540 GIT binary patch literal 10500 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 I6jRFu0F^p!4gdfE literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/02a-MAClow_Makefile.patch b/pkg/openwsn/patches/02a-MAClow_Makefile.patch new file mode 100644 index 0000000000000000000000000000000000000000..13c91eadb9153df1ff2e9ad49c8c3a3f1f7ac419 GIT binary patch literal 1319 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FiO<*b#%_jFW2`?%uY?q%t_@8 z$tYEDEGSYiGEp!zv@$TXGB#5%GB7mZ($&>fC;}M*)va5eS%B9h-~2oU-^5A<Ln8%4 zV=DtoD^o*=Nm{6Y3*<%v1&|=v5<?whBL!VuU0p71h2T&pUw;=XTNRDsjMSVQg`~vd z)V##pR0S0c=g=S*&mc`ry+kf;1!X5sKNrs+1zQCbjUZ3|5GTiAS55t-%shRNAwkYy ziSo>xl;p&s6a_84WKAw@1%D?muy}Bgvz4k|vaN~+#1u_cy?l_oi)#Qb`4mkqZ7yvE zPd{g$P#4!=1#MdeT~8#dQF;2smBsp*dC57YDXC~O$@xX8IHXdFGRsnnaA}0eCMO#j z8dSvRrQ<Lqxu8@(u_!k_IX^cyKM#i@ko)pdOJK5~KtuN$G`Nw{3>N<*6eWQYRz_xe z20m5BiMpNv9?p1`B<Xqvl$qgEVxk)o<miV-MRHMoaj|YrVr6PkF*w@v0zCZvBCQnQ z5w4;ENobH*#S{i9^>^|DB??Xz4M!JE6%EHAO@*T5Vq`OX{ar$RTs0L`G$3k0=~AJf zG$%(PGfyEUwIDSwB{eU(QXw-hEngumzeqtVwIZ{)Br`8vOF=JR0hIlUxwI8@VJQV{ zj+I`%tsXSFDJvxB=N4q<q$(ulr6{DQ=A{-TmZYK^&83ZSl&W67m4d2XGMBaj%;C<? zAQw8j`8c`<gIKVL)>Kf?O;%9R(o0s*%}1D^qNSHlq;6kdh;};^-6<g54h2P-c_nEI zO7O5%Qm9c#PApN-MOCa|r=VYwTc8grY2x!sOBB@96mrYZ#NdXgXz8VZV^mq8C^a{~ vEEO6+i6xo&c?tzZ`6;EzC6G8z&Ph$ovjVxLC|5x@4H`)bDjF`X0h(L@CZ%6h literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/02a-MAClow_stupidmac_Makefile.patch b/pkg/openwsn/patches/02a-MAClow_stupidmac_Makefile.patch new file mode 100644 index 0000000000000000000000000000000000000000..392531cc8aa8fa971151988064f8982a560934e7 GIT binary patch literal 531 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FiO<*b#%_jFV`<FDJ{rM$xTew z_f5=BP0P$l<qXLvRd6gQQZO=6Ff_C>Ftjo@Q!p|xG~v?K)m11083#2-w>-0e3^UEF zOiis!O(14!p#m<DyA2dTf?(?mbxag=b#-;Qv=w~)T|#|at!z~^iZfDkaukvhi&OIw zb5j*mG@L_&Ts(s`HMz7EJpG(~LS0;g6|`*?bUjrxf;|00oE(E)HBou`#g)bSnR&@M zr75XsGRgTxsW_xkiZaVmi*RX#$tEWo8X8o@=cVH?CApwfKd~q`J~=-(H$M-DB9Qy? zQcGa6`dr#v+6piSBY6uRZF->a;EGZ3%U8%tEzil!OI1iLQAo{8QOHkI0L3d80J<xk A=>Px# literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/02a-MAClow_stupidmac_stupidmac.c.patch b/pkg/openwsn/patches/02a-MAClow_stupidmac_stupidmac.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..c4604f46e7756987ed098ec3cd6df80c786588da GIT binary patch literal 3894 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FiO<*b#%_jFV`<FDJ{rM$xTc~ zu=J8SLo!Mg91DsRj7$^^4Xq3et&GhSj0_A-xO8=O6^cM6LXFZb&nzI%STieAQ!7&w zh_PCzfD7b$V?!Mi69te2mx6-6zAbK`P*9X#l3!9;kXo#OTNSbl7ng#9a%Ns~PH9T2 zf|94JtE+{9k)f$cd~$wnZhoF#vJ#h~LRo%hib6qRa&~G-P-=2&W?5>AhNd-4BC#kp zC^0W3Ki4TSIXgcsEhIBHwFo4y0MVG7k(igB8ed$JSdywynweK(5nrN^ms$=M(6k1* z0PZP;w4(f6h0=n8)FOqP#LCnnh-_w_0wj8T9i4R)N-|OviV{;Y^A$3S6%upG6Dx}q z^7C{Qax#lcQu8wN(qS%x=*dk?j?c`?EYZ+ZsOC}t0kG!yq6+^!4QTAerxm3ZmZs(< zSH^>!o0poSX$?^e;=)}Y9PjDk;~MYd864v3=jrDTQ-rW6C9x#Yttc@!H6%YcH7`ZM zR>3dS$Hy9+Tp;nNtE;O!h~g0xw}j#ns%EgoC)im77^k2diG;y<)yUXF#|V~NiHPRR zvc!^9BJ--Ptt}TUX`|;xSTJO!DQI9xjj(L1YnPLnmtK-#X8_L(3ZOCtVw^&9eqKpp zW?r#EL1JZ2eqxG3N@{UQW?pKFLP@?tVjfDy1Z5-;&dV=KEsigOlneOm)`a8&SO|gh z0sTS<C9w?dP(n&mASNVTnON!=nVQ0C0R;tUfe0$x;AIXhmf@w2f<i4k#o#EWVF{-M zRBD3?>7o+<ywu=~{1S~2PhZ!dcwa~7cqd0^Z+|y89bZpBC{xo~L0><_-^E{{2we7O zR;6-*Z3ESdMo`CsqZpJ%sN`6bIHZ<?K|zd!A)#$<sAFUSuX7bZJ_BJcMTMmN{2XNO zq$ZW72NY%IAy+S{C8b4q3T}=*!LFcMq!v<%L91N_u)~WL(lU!cRTVe~6r>hq=BH#P zL*x`niy=9#q$n}3I5)FIM<Fo}oCQmYGSkyjixi4ei!u{)6f*M)N=x+fOG^q$OSqub zG}!cbP_lp-8lRR~1gfyXF|C}LmY0&6rV#8J<mu?+=@;zm;p!6V;~E61?LgHb#PImy zlKcWlEv}rJmy($VuELC<0fUIyT1d3x3mBAWD;ku6gK#1R0fdx_KukzVvNYE*HZX?d zTX0;LWMmdAq?P6+mt^MWfm$%2=1hKGszP~2W^#r?QEFmNPNf2<!IGI+l3EOI?LZSk zaWP0sewsoev^Ay&Hqo<0AwMstQXwTjwOFAzUm-IMtjX8W8PbLVS(2HjfZljPO2y!& zn2thzNk(c>d1i5{LS~6VN@`kaQ88w+N`kcVP*RnG0?1ON!XIp)tu4Bh$dwL`G8ocs zQnUp%n~;?&C@3H$&H_-5b1f>$FVb-K_YLs(bM*@Wl~g*eK|%2@jv<b2L5{wzA^yRx zelGE@K|%gOI*{}WjSg`71qa^niVj3N9uiRk$|gt{oMViQ%yf*6jUYJ&TzSBY7?AHE zMI^X@D^Dy*&Pd5mM^B2y<(VbP8OZG*aB@UWP05MHsS3gIArbLG5suE@R*=#UY@33< zzNdPwLZSjR)0LE@7U?LYWTxb)mncA+ISP)>-U=F^_I-YuLP&%{F{Ja5s;LJ~WiT&* SQyJJ$BE10eAl#V)>J0#^0G~Jj literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/02a-MAClow_stupidmac_stupidmac.h.patch b/pkg/openwsn/patches/02a-MAClow_stupidmac_stupidmac.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..080735d64fb241d736de9f1f4ee5961810bbea8a GIT binary patch literal 1230 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FiO<*b#%_jFV`<FDJ{rM$xTc~ zu=FxGLo!Mg91DsRj7$^^4Xq3et&GhSj0_A-xO8=O6^cM6LXFZb&nzI%STieAV=E&| zh_PCzfD7b$6LTFi0|k%-mjVblI(x^5J9>u1hj{wBf&{?W7DO5wnd>O%>nj)<<Q8)& zDAZbWaVaX4<!7dVB;h`c&&<m#(a^N!QdCGSD#|a4FHu0q6{qH<X!sYT<^`6fmZrMq zl@wLRmuM;E7N>(XU>XL};F6!0id~Zq+zPN&n$}zjSR7Q4n4Fzj5?_>>oSIpdip~Cl z>=M%LhZq|KH5Jn-h_ETi%uOwd&rM8@PfASA&QD8=Ps=PyO@Raw%+Cl#<%uQ987cYc z_*E687G>tAWF{l4O3KgAL5+-*)TGk%fTGMiaFlQ<C@81qrDUdoQy3)bb#--hsT%bl z4}n87zZ@JZv`qjAOTd;5Y!bk94B<oo4=xY`6nQuk0!RTkU_lI2m1v0pqyVfEZ-RiT HLL>?R7#NO_ literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/02a-MAClow_topology.c.patch b/pkg/openwsn/patches/02a-MAClow_topology.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..a86ce007a580a21172123c732cdffba60f3777ee GIT binary patch literal 1715 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FiO<*b#%_jFV`>0FUZfyPp{NV z<_yUwRd6gQQZO=6Ff_C>Ftjo@Q!p|xG~v?K)m11083Wa?Tb@}!f>~x(rlwY=CJ?i< zPyrXnohCYl#tI;DE-nQHeSKTpKp`bHEi*5*SOK>ZG#M@~MFnMuE`<>P0Dm8U_sDo( z{}5M01%nE+G+eSq3I-KPmbhe%6$~njleiQKI=3vbC^IoBhj<4Q4uOKA{F3~V$^xRz z1V<k@h;?;!bqQMl2`p*_v4J73Km-M`fe|iQP!Jm!<B~N|FsLvv85+S4O4vvkoZ^j* zbc`(_NnQa36s4Aw7UhK{=GeM9`UJaLb0NvrB6E_8QWLYSxfG%D$%)0OsOj6-3NERj zppcoSppluHnrdNSWNK&<pOKoFl3Ju|S6q~=mza`L6mMpd6m1@BYm1Uaj5HOhk?mAa zP(ZjZBq$Wkc?zjH#i@97Kz#%%O^l6nOw1L)=@IGyD1|T|sv0T|qVV}&fi?l4P*Z~( ziXc~z9Ev8OP=v)3$OOz#M3SwAg(8v|O1MMA1xdOV*@<ZB0!z4<P@XW1L0*D*1x6ww Ij_ia10NJ#zUjP6A literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/02a-MAClow_topology.h.patch b/pkg/openwsn/patches/02a-MAClow_topology.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/pkg/openwsn/patches/02b-MAChigh_Makefile.patch b/pkg/openwsn/patches/02b-MAChigh_Makefile.patch new file mode 100644 index 0000000000000000000000000000000000000000..3f2bd179f3084e8780c4726db50948c3694f16a7 GIT binary patch literal 1321 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FiO((b#%_iOwZ8wP0UVB%gjmT z49O@}a4aZNFfvgvG_*1>v@$kRFfuSS;nLOBRVV_P0@bcto>_q3DBt`%1>eL<1w$hR zLt`rgODj_Yh*4UofD7bG0|k&E*cL+_V<QD!U0q!+ZH3@aCtrUTD_a$f;*8Xs9EGIB z;?%sv+*Ab>4d>7x7tbI~O}#`eZ3Sf~Pd^vWAO%|m6^$TI{}3m~U{_83q|7{hkRd_N zV2Sd~oRs9mq7(%!y<|-;Z3TZPFR*xUkh7JlUb3x<2E-IiRlR(Wyo+l9F8LHqE^RJt z1y4U`pHLUqU<GYk1zk@ht5JFS#g)bSnR&@Mr75XsGRgTxsW_xkiZaVmi*RX#$tEWo z8X8o@=cVH?CApwfKd~q`J~=-(H$M-DB9Qy?QcGa6pg=?S8Z@}|4U7^&sU|1C9E<-E zir`5LpDN=-UC#gyXS_<1bUg#g%<w5O(G3Z5^uwbfxhTK5ST`rJGPS4}9Bq059{zrj zRtoS4SJ8kZG)Sys3WJpTJ9&W;1*eLJql>1BhGUSXLQ!%tvKhYqE}=fInhGi!5VfFm zsZdawlcSKCr;w6bkeZj0nwMOukeQd3uaK5sq@a~rky%`lnU}7mpqH-z%74XN+6ua` zlma%#N-y7551QPR6_WFF3o>(36%zAO6w*`kQi~ExQqhg((ndH+RWIL4K~*oAOIrcv zaA#+b3!UA39NmLKELcQqDk$hCE2wDcB`fIWBTP`y(#t1Ox34cmyB&(|6p(I*f}+g4 zk~9S+c-Sf_)F>n;mMG|=Dps&l&@ag?&<7PY@%g1C3TkQ!xn*c#a6?qI^isevs;p3y ynwwvi3JsvdlFa-(g@U5|l+xr9NSr6<q$cKBf!tD*tDu_(jU)vX4Hwq{O)daZ>|gQ# literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/02b-MAChigh_neighbors.c.patch b/pkg/openwsn/patches/02b-MAChigh_neighbors.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..e26b96d9d5c80bbcd623829ae23a4ea41c11a6a1 GIT binary patch literal 14774 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 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/02b-MAChigh_neighbors.h.patch b/pkg/openwsn/patches/02b-MAChigh_neighbors.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..454f860a41f5b2de5b8c5c122fbdb9ffe4344a87 GIT binary patch literal 3927 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FiO((b#%_iOwZ8IOU+ErNXjoN z*2~}w$tYEDEGSYiGEp!zv@$TXGB#5%GB7mZ($&>fC;}M-H9@yLvw$Si%&bgJtxQcI zrfH!9E|6P|40Vjm6hIPS%RpRn1zlZTT`n#K1?7~~w9LFz1z*Pq7f1IXM?Y@`G+<DX zmX?-=q}0XL%`wy`1dDQnAza!BlRf=B`~yHHd-^#CxjF{B!YnW{HB(T~*H1}JODxSP zQ7B8yDNR+#%u@&o@KH$2OHuI6%*)J8%uz54$qaV(P)I3COe+DoSzq54H&7_4EJ#gB zO;f<F1Wkqu6iT4rfng9|!Pr8_#2683#+EuJrjSqrJHIqDuf!t01k45#d8N4_6^_o{ z)?8pNHu><P#DZdLef_-B+@#bZh5R&ylFZ!HVug~7RE3fXh2;Fwypq%+g>sNGJ%!}N zJcXoGg`(8l{Ib*(h0HXC+|=CsqDqC#VueJ7qSWG&qRixy%=|n(g~XiVe1+tU)Z}ah zP%0|REG|vV$*f8(0vVmB2XRqiaUQaJ6%-PS^Q^hFL9WGcY*v0|UO-W1KFBk*3b1q> zlwTfS0ul-ca&-4~)F?<y&eqV>w8kEQrWQKp&;V3W02xx^lA2VS?w6XGo|IqYnpaX( ziNiES1^h8wmROXTn3R)ROl%wzPBaBY`6c<FltZkUTwIC@W%-#Ypx}dGSSS_8XXa&= zXlQ~0N?%_gJ+-7HwWyd&Q6VKUy(lp+8yX1+<>{#<zLhSH?jT8!Hbn*0_&`zVSDFh7 zL2$7GQmmkml%JmiaRG=#Q5;Z|nwDBrl$sKdSd^Mq;#!(%W}*Q~A@PYRDMj%mS_&XK zwYWGWKfEZjBvsRzOA(xc;PUXeFOE-7E%A1Q*$uH;Utb{;lw^zY(-TYbi;B5$yC$<Z zxC9hua09S80~}_!{F7OX<{hj)(X<8^a%KiP7RIpbO4Y=do1apeld3>`8st*sQiK;u z#U(|h$t4QaT#Cq%1<qI?0T71AV6?AegkPwypR1?4hm(I$a4aZx6co_X5lD-If<i7V z1wj>|CLySz6i@~X$}fki$xO~IC^IW6$cazM%#Y6~(E=$;$;`J_(AUpSO)XH!EKx|$ z$xlkmQ7Fj=l|`Tk1Tn$pC?w|>6{RMZ<W%Z$DS|UNw6=>cODrk|Wo<4{>5f*|B6Ag} zpX)$b5}b-i&v{U-#OFS!2Ha^rJ+%Za$x<^1LakQ>hw@;|hp_4tN`q@va|;~{Q%J3< zfT#RS$xKcxNe!ydfK*+ebcu{n$_}VRj!}GZQL+wp4d|6MNKa95ai$I=AA-2Z7+h6? za|1#&u{bXTR9lxM<`!UB0#0(E2tlZaXXE(HJcxHfNbyceYH<k;&tS{ikk&^@NosCE zNwE&N2(+-!v9y2{frQ*PXoDI@453yMkWhy;S^|nvi&OJTaOlJqdN7^X;#HfAa6+YH z%tA90i~?sWO9N0$gM=VuL3(NltYS|E)ycRbKRvYsZ*{B#3oB47As*B^f{SG4rKDDX zQ@y^vLT+MSVtQs?x<XNYX$gqV%uCD1(>^LKNJ%V7g|~Se^HN~WfE1UhdC95p1_rpU z;Zj6v=72>5iZb&`;^7$$q6O8nV0C_=au`)<UMjZMsFp%;az;*OaS5nRtDvB-r3KDO qh6ctuhK7c)yacIQhJFZxLJAgz;BX=?l;PSy3`ouckzf-j326Xt6;R>; literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/02b-MAChigh_res.c.patch b/pkg/openwsn/patches/02b-MAChigh_res.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..ff894f4fb0172543a6603154a90995de2ab35f6b GIT binary patch literal 14675 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 a3Q7<m&>V#Vc-fYcrnQzncr6pY)CK_UBszxx literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/02b-MAChigh_res.h.patch b/pkg/openwsn/patches/02b-MAChigh_res.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..30cd06010b7a219f682d1a6281d0316e871245e4 GIT binary patch literal 1902 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FiO((b#%_iOwZ6SN-fsQ;0(zq zRd6gQQZO=6Ff_C>Ftjo@Q!p|xG~v?K)m11083EO+Tb@}!q&a3*rlwY=CJ=M9PyrXn zedanw778G7E(L{{#FUhh{Pd#y(gKAb*I<xHHJ5^dmOdAkf`Y!jEpDKYlA4y8m#TnU z1-cAjBTFg^Qd3gXh&PjqOOb#p%Myz+6O(dMi-|Rquqz9S@=NkTP9@e%kSojbGgA~4 z6cmb5i{mr%GD|cxt+^BxlJfI&K%yzBNu}ulMVWae@wt^Qj_yT?dD$Qppg2%SE6UGR zC@m;REmFuytV}K9QdCGSD#|a4F9DlYoSK)S;a`xN7g(BFn(CTYQdAjVqM(&qoUUmN zjzow7Ir-&C2Ed$Cl31J_UzA$xmtT^Z7Mz-w;*y`23bI*I0jrXr)a2C6GO!Ae*;-nl z6jKXMuI4(%77Dt$y1F1CoXJXCK{+!oIj1xwRY3`qwo5W|Q;UlAGL#61`_M>mx%nxj zIjIW7r#mi1E=2`Uass9N;*z4$<PwEyE=5qXD9y|(F*J)W0kJ{2AhjqnKgBmOGp{5y zFEKAU6_kb)6yV7Sqy~hON{cH&k(rs7?wx225&>a-eT9&qP*;WWjMO{@kP-z@(#gzA zS4dRIPE9S)P0YzGONH1BOPC;iAPiCtHPJDp3}z%A6Y~@jQ_50{N-~R6b5rw5Af|%+ zV}bCFLP~KS%qWm0P^_=7kX%|+l$uwfkdj!Es8F0*SelxboT`vlnwtbp{t5~T=tlV_ zCi|wBgd`ScJLi|?m82Gd4F(wn;VP8mE2N~Bq!#6Z3a#>t#1e(v#Jt3Gu<H~+*#N8} zAL3AW%8buU0l62PN<C9R!Cec^bY+P}#qlN9gcB`w3JXwP1Q!@c-o{#HKolx~BF5jv z-%6o8u^5s%l1fVylJj#5auPH1Qd1O^lJoP@ax#-kK+z9Me8ozj{HzZtD^Lp?P{Bdd T;s)YqE&@dkR29gXuwn-QFOnNL literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/02b-MAChigh_schedule.c.patch b/pkg/openwsn/patches/02b-MAChigh_schedule.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..c2cb38dcc52b054cb573559ac6f1ffe7a3e5c385 GIT binary patch literal 18904 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 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/02b-MAChigh_schedule.h.patch b/pkg/openwsn/patches/02b-MAChigh_schedule.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..f18bf2d589a678aa7f02b6dc142c2b3498cb8c58 GIT binary patch literal 6975 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 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/03a-IPHC_Makefile.patch b/pkg/openwsn/patches/03a-IPHC_Makefile.patch new file mode 100644 index 0000000000000000000000000000000000000000..a0d23c4efe8b922a086a4ecc539edd1ad6ee04e1 GIT binary patch literal 1315 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FizC<4DfK)_f5=BP0P$l<qXLv zRd6gQQZO=6Ff_C>Ftjo@Q!p|xG~v?K)m11083EO+Tb@~f#~k1MJO$sxN(DnB1w&&i z14}CtONcpIsDKOPJ_7}iAlM2+9b+Q}U0q#WE^US2P$yr17b{y8jpB^doE(Lu#NyPv z#N1Q`6%FUmAQ#UdO-;Q-E^P&6Cr>{Y&maX`1r?1TPyY}n$6!}Y{iMu1eUKqR&R~i1 z%$$_u#G(`hExlw-E^P&WCoiygaFDZ=s$R0KiU!0KO;x>oki3g)0516yO)hONZ3Rz1 zXP;0P*I)&0TLoQDB&$(*`o)#S`k8sjIi)G7Xfnz9MX5NXQi?LmQj2hDgvll+8yXr^ z#OI~sFeSO5R6nsOH$FK(H#a{Iha!;s@={A+vY<di_Zl>~^$m;?b$uP3bMniv_#dGt z38W|^Gd%;JDrnNft0YO+GoZ{2pAr+@kRV4tJSvil@{5aga}q04i;BU~rWfGh?-yyM z0FQ7L4M;+R#44sRNU6V*7bsD1s%SX6XsT#925Bl3B^M)`;p^`b>f@@ZprQd$3rd#? z1*JJT3YmEdDX9gic`2!R$(0J3d1?6yY57G8TB#M8#U+_}=~@bU`3j)SSIniYpbJYW zU~{bW@@@5?$xT@yIX|}`GbdFcF)u|SJvA@2D6u3J-DoatgrijT@~sq9^^&=?6<`i` zb_Ti7+0Dn%Js8A-MYN`Zf^M>cik4oof^I&-1Qjj4d?I!G`a-nZq3BKl>2@e6%FHWC zQ&573t&&2GLULk>f-b6J1v>@(lH3A)P&pHyUs|G|rlycvh9(9#L`6$41stQw3Pq{8 x`DLll07@*$%+FIOD9TSMO)i1Nd2&u_VxASqEk(Hsx@pizQc%%waShPq0sutnU0?tJ literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/03a-IPHC_iphc.c.patch b/pkg/openwsn/patches/03a-IPHC_iphc.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..397c6f882973c1e62da35557131d6b039b9b7a1b GIT binary patch literal 24912 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,eb*U+^MkY)f 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 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/03a-IPHC_iphc.h.patch b/pkg/openwsn/patches/03a-IPHC_iphc.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..242a3e48bb07d200d24fbe9854a9aa3f22d52c27 GIT binary patch literal 4003 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 P!A)LVtwFGUwALU1l%Su2 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/03a-IPHC_openbridge.c.patch b/pkg/openwsn/patches/03a-IPHC_openbridge.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..6d886566abe1518e841920ff394eaf98054394a6 GIT binary patch literal 3953 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FizC<4DfIU3nUd~rlhCpC3A*k zlqxtD6e$>)C>R=A85mj_n<*F>7@BbD>gp;KfsBFb*DcR10Ba@AEHf)pQ!7&wh*?^w zfD7bKOC1wK1&}zGf`Y!jEpDJtmROXTn3R)Rtbkh)iVPP)BMXZ1OY%!93y3z8OP8>j zrAaxN$;7(R*4CDbOHrXLKQl!E6vB`QiO<Z-EYZ+ZsOC~osKq8<Qk0pVo?7IRSds`; zrl6ounweK(5nrN!0GW9Or6uu6rD<uYMbU=FX0g`#`sMjW#U%>KiN&c_3KmWZ`DqGy zsTCy(8TkbY+6sn75TTUBl0+`BIsOHyd4Z*=rKzrYB}J9-C0Ysv*(KHxIZO-lN^?PO za;hvzEw<)TgeXH6RImkmvpBUVGchMVJ+;ISNr#4}HJ2jDR!~SFlz4)C;RN=ChMES7 zpA2F(b&!n*833_VU%wzfvmifHp`r{XP?C{ZtdLo(kf>0Snp==xl$fJXo?n!mSd?Fy zm!gnZtWch+kXV$eke6DPTBJ~1T2PQ*oSLFglCO}STB4AgQJR-s3<@tq;OOh;<maWQ z7AcfuB<3lAU8VpDZH3~@s#HBa1y6;<;^NZWRFH}i1rHY=XNB_2oE(MX{G2j~pdObZ z#M7B+3L40Mu`@I_(*&geP>3ifActE)QD$C=Yf({tk%qIsZ-Bp_t6xaGe}Jo>Q;?^N zyQ_|CP*A+5UqEPxQ>dGpYf!w8tDk#_hYrLZsBv&gBNb#&L1Iy2ZfZ$tQGAJ}0nsXv z-3tnPn4$XmMX4pFMS0Np1PLQWh(bwfaS1p?^z;yJLN?156nyz<D3PrRO?9=fbOj2q z%#_^3yu|d>B2ZfLEOr8yXBwKewjn{Gt_o^u3dp9~89=fW$T<q2bPP?6g`o5eGQh1U zH8mhHIXkrkn%uC3F3cSY3JM?>6l9m!+WLk1_<+m?m6qTVO;=Y}mtavbC`vR!#cl!B z$}><Q2MQ!2$~1)1VN<TbN}-`sEP=9#zP^I5qq9OrYGO)i5vcGqG<H(ZR<J-+8pZjb zax*zGFE77DAu%~QwV*_y0Gx-4!C4$!q#_rShK3eSkX#SSJ}CK9!_e4FL07@ZP*b6% z1|{p-SZG#5H0kS?<SP^urIw}Ul_-?t=PMLv<QJ7F<QIWCAd3_rRfj?vs6;CUmEYN* zBDW+XRiU^fF*zF&6CmFq)iX3MQjxt$bm?k<T%^JZRFJzBKxH7frqtI@&M&CU%u81Q zc@J9m<mV-)f+8h5FTY$Nvjh}vpvVCQR#Ij<Bp8vro}OAlRuv11zCl+0f*O)Y7~H}% zHP$h;fHW~d#j~lgj+v<fw0s5!rh>kHL1JZ2eqstdWk3>eT4`Q#NoIataePr~acWUn zss}h51ZP&IY7}IbptL-6Es*Mk+|=CUf=ZAYT|21JI%q8y3$&ICSid%xHpE2=`uece zN=d##a$-qx1~`I2Q3y%z5Etqx6s6|om!*PYIWesywMZeYT-VUR7!>8;CPs=L+(=M# zAtyr{Ls0VqW+BvG(pwo}jy|3)!LC7`jy`Tdj=rusa0_8ZqS9EK8|bbes72EnZcQyb z*7Ws@Q}Ym!2=cH-W<f@BJV@BBC_fk4JSfO6(bTlHb&Yp(^aNMiNY;V!1*AQYhTa$e zX|o0;DWnvp1>!518R(dqL6R8QD3Ft|w%b7tammk1)xd04=N6~yD1e({@g)!%QdcS{ zDC8EW>)Pd)=cN`Y*eYOal0aKVAP<ApCKsh9mgE;H+G0}-H<t7^WvHKPM1ZSvh^tF{ fu&bYoi@%?%4!DPCX0BsyjFhR!4uJgfp%?@J!6ARf literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/03a-IPHC_openbridge.h.patch b/pkg/openwsn/patches/03a-IPHC_openbridge.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..0538cb68a6fbbcc5c4844d3e0310ef126c9f90a0 GIT binary patch literal 740 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FizC<4DfIU3nUd~rlhCpWpIXM zlqxtD6e$>)C>R=A85mj_n<*F>7@BbD>gp;KfsBFb*DcR10Ba@AEHf)pV=E&|h*?^w zfD7bKLo*#C69te27ng#9zP>GPpioehUy@%^S&&++fLj%^3>TN8LRo%hiUP>-5WmJ} z=4F;>Xj)^DDJjZKPfsm!Ni0dkuAn$IFU2K4FIB_8AT=+rG_^F<HLs+oGQLDhA-6bP zM<KPSD8DGa1VU?Cb17h0UX+@gnpuX!08MLf5NK(E1051Dy1Kf$U{N{+3@Ee+1`bX| MgaRnPoN7S?03KH27XSbN literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/03b-IPv6_Makefile.patch b/pkg/openwsn/patches/03b-IPv6_Makefile.patch new file mode 100644 index 0000000000000000000000000000000000000000..1ae17af35c43e38a4661963259561e1a3e762980 GIT binary patch literal 1315 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539Fiz6-3@9_x_f5=BP0P$l<qXLv zRd6gQQZO=6Ff_C>Ftjo@Q!p|xG~v?K)m11083EO+Tb@~f#~k1MJO$sxN(DnB1w&&i z14}Ct3y3*dsDKOPJ_7}iAlM2+9b+Q}U0q#WE^US2P$yr17b{y8jpB^doE(Lu#NyPv z#N1Q`6%FUmAQ#UdO-;Q-E^P&6Cr>{Y&maX`1r?1TPyY}n$6!}Y{iMu1eUKqR&R~i1 z%$$_u#G(`hExlw-E^P&WCoiygaFDZ=s$R0KiU!0KO;x>oki3g)0516yO)hONZ3Rz1 zXP;0P*I)&0TLoQDB&$(*`o)#S`k8sjIi)G7Xfnz9MX5NXQi?LmQj2hDgvll+8yXr^ z#OI~sFeSO5R6nsOH$FK(H#a{Iha!;s@={A+vY<di_Zl>~^$m;?b$uP3bMniv_#dGt z38W|^Gd%;JD&s_5&j1f+yh<Rc6Q2?j-H;$hKRhaui}H($b#oFcQ;Ukh(WV#R;qMn| zr2vm`6%9y2gTyMPFi5GtlNTsaaH?oHx@f9sI0k7d6eSlUo8jy466)issi2|(Q430! z3I(M(ISQG13Mr`tsd*`>dC8RunR#jX3TgR83R<ZZnZ+fUdFfgTdie^V%va2%t)L4_ zDPVJ~^zv=>pvg^HAvr&{ATuXbAu%sSAw4xOwJ5P972RkqZG@v#_42J0RP~a%v=v|u zcXkH3(Amw$(LET%f<?5Zf`V?cf{K=2vVv|t!UPp9y?i2d`}#t(+o9-A0qJ%qD9X$$ zNmEdQhpm!AjY4u_iGnVwVg)+|{gT`QeNZ_QpI=&{pr)pfTZSeEH$+8CF9jT<$_hoP yx%p+O&;Uv-$;{7FC@9KLDNQbc#CdW~YGR%h$Sp;=3c6{~NK#PIaB&UL<N^SS@m-?; literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/03b-IPv6_forwarding.c.patch b/pkg/openwsn/patches/03b-IPv6_forwarding.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..d5c9b4e4de1d0ee8610e4ef17b7142c44abfae6a GIT binary patch literal 18996 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 IQK6O#0RN4>r2qf` literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/03b-IPv6_forwarding.h.patch b/pkg/openwsn/patches/03b-IPv6_forwarding.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..32d5eec13f1c49b503ed14bca83f7a131d4572c9 GIT binary patch literal 1455 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539Fiz6-3@9_xPs=YVPb^Bw%uCnH z;0(zqRd6gQQZO=6Ff_C>Ftjo@Q!p|xG~v?K)m11083Wa?Tb@}!f>~x(rlwY=CJ?i< zPyrXnorVTFMn(!C39wa$20F$@3c9+wx?Efe3d)&z$vLGdsR~M&1sTbD8A@DS+FS|> z`ueuGfkH}ZT4r9V0&W%PGF)8R3d&GjK><GT9{vGNkskg5@gA;@F0MiG{sAGL{(kWx zkpZp>3I-Ks#$ZRJ=9T6uRC6hSK!CG%h?{><xMPqDh^t_$V5ozT33l~^2rDQk*eV!- zWNNKJmO_otR!~szk9YHNbO$RisIV~5;Q|Q;Aq$#71>KMZjlhDn)?C_PH{lPMlFEYA zl+-lhLk1KD`dV6`cmhQb41@RzCI&htmXLTO7$XHm`6c-v+lz^`n~O_Pp)5Z$1r(Tw zWE!8Dmsz5rY0agmkXlrfUld=WfFxO*nwO&CUyzy?Sejaz>Y7(lR2g5Qpp{#k4%UIi zIFJsP{Jc~QU0Mpc#pyb5OTd=lGNdRqIW@Bkrx}?AWoGdisfj76Me&&#B??G<O>0>A zDk#L%f>Xb#fsPp>_2Z9Css<`3bih8$F9-XUW<d*%5FG`CHDK$&R)gGt7U8%87h(#R zB1kzdj1<!7A+JM>&isO;%8dMiczC3N*x-mHpuMOdCq5&;Aitm_Gd~Zc9b`&UB}gnD IB8V3A0Ma;;YXATM literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/03b-IPv6_icmpv6.c.patch b/pkg/openwsn/patches/03b-IPv6_icmpv6.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..3210588efd973894e25bccdfd60b0e935a4f5a89 GIT binary patch literal 1122 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539Fiz6-3@9_x&rHrOC^OSb<_yUw zRd6gQQZO=6Ff_C>Ftjo@Q!p|xG~v?K)m11083EO+Tb@}!q&a3*rlwY=CJ=M9PyrXn zeTGIlM&=422`(-L1$}*6+(4nAG$|)DSpl~SbQvx#MTN5b%oGKPALBFgGD|cx6{@)u z6ly_osYONkMe!vt>EhJ96b=7^)V#pb)Y4Sfypp2I_!2FJ+~RbI9t8yuTh}hXJTJ9K z0Rn6loc(<R{QX@0LgGE0eFMtOthvB4xy9+ab~z^T1x5KK`N{b?3bqQKj((1)ii%Q8 zN{jLo((;SS6N^$Z^U~wNZUET`G6w8OWDkI3UGno%vAa@70p=kvjm^<Gom*U<S(2Qg zpaFAsaeir0a%w<+QHg&LB=kZm3sT`mDkvx<Cl;q7dnw-4*~33R$Tcw3H8{iyoM<4C ntE;Q4ORvZU1s24S;IPXt2ZzLPieiM9z+QuRRskht(l3$$`|C*x literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/03b-IPv6_icmpv6.h.patch b/pkg/openwsn/patches/03b-IPv6_icmpv6.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..3d55420303ad0de046306d217c568c17b2867fff GIT binary patch literal 758 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539Fiz6-3@9_x&rHrOC^OT`;0(zq zRd6gQQZO=6Ff_C>Ftjo@Q!p|xG~v?K)m11083EO+Tb@}!q&a3*rp8uAmJoBaPyrXn zeI^z<re+Et2`(-L1$}*6+(4nAD8D4Xq_QBjSOK>xWEn0lMTN5b%oGI>fcP^$GcU75 zL(`f|Q6aUcD8DGaL_q;6Q=FQYqTyeVnip7_TAJ#bS5j0NU!tXuTbvG7j&2Z0xl4Xt zDt0Y8aO1(&Xj*eAU^t~HH90l242J=l*5Clq(gFuRB$#w{b#=j_bP6Vrm%)C|F9-XA Oc7cVk0BjK@!36+=vfw8G literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/03b-IPv6_icmpv6echo.c.patch b/pkg/openwsn/patches/03b-IPv6_icmpv6echo.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..ac4bcbe1ea95cf1b8c4d07470834a26cb79ea8d1 GIT binary patch literal 3201 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539Fiz6-3@9_x&rHrOC^Jh<&dAqG z<_yUwRd6gQQZO=6Ff_C>Ftjo@Q!p|xG~v?K)m11083Wa?Tb@}!f>~x(rlwY=CJ?i< zPyrXnohCZQ#tI;DE(HbU%)I2B(v(yMC6HyssYRKIIeHmN7&3*Wsimpt5(SCL*{LOI zrFqFEnfZCeAZacI1$}*6+(4l$u_!Y!DJQj90k<L)87?keg_6pG)RfdTh2oN;(&Q3_ zYA#&`1qFqq{QMjc4Z=yK#g)OSc`2EB>DCZgkbmM6Q&NiJOB6CPiyc!^ic*V<p^~MU zc_oHs@g*Rw#i@lL(OLyW?8KKP78S>rSaa!eDPRhti&%3J^mRc|en~#a7sPs-2qR0A zax#;N4Mkg9TP`j|g|ht26lCXT=4F;>Xev~5fdT?q0u%sxNP((gtKjD76YOe@U1f1< zA=m^EVXI&OQdNu1zLKKM^z_ssgq5I(u!t{F$SciFN-c^{sw_z@j!!Gf&yCN_D=00A zPby7IODzJKr=Xw!Q;aMXZD<w?mG&=4%?kvjQ`fwbqRRLZErs0Tba3P-fKp|8YKcN} zer|4JUWx+91_hA%U~r08&@eP}QUGO9g_P9dlFYnBP=ZzfrJmH{Voivj@jFq$Rsoda zAUP;LJ+;IW<bEfx^EK2oP@HTKtEp3*S(Tcfh9a)1X${W%COSrz3c9+wpu|V*{Hd*= zua7V@B{iuuy&#izS$72F9#EDVfE<KkEi7Z;PomIl0#l5VBnjpsZBU6cbn+3XdPBnC zde6c{$I<{+@hK=M)N+9^mQt}eH7~^_KQC1SR6<~sC^`zMMMe3bY6VQg<36`IUDqzZ zJTJ9K!B)Z9-#5VD&($v^-qYDPpv=tG*~1?i{+VeC8ep}_MX8A;`9+Gh*c59jRO{=P zWF(d-lqVJ|Bq~7aS_MyqjKma$y!;Xcu<q0pNZF*IfL!_%6lLa>xPlz1fz4<g*Px*I zP(Rm*09WS_SC{x;S3egQe?M0paOq=VpkrYMD}E>mrTlVm_{5h$!fQB%6H>|oF~O<J z(pbmR5-oK>qXpb}icc#_O$`9In4q;nZgILMEKR^0hTx_L_L^5wp%#=0K{+3}sxC@R zPR%UCkyzoOj+vB;QVVh_AvKPLrH-X3TAWkc?KE*bDD;sqI3f&9EOiV`jnJY3+#JE* zG%YB~EK4j&CB8|;6{FynuaK8oo|BoEs*qTskeZjGke{ZImYI_Z&P#?SraFcu7HA<$ H6Q=+GcC@#) literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/03b-IPv6_icmpv6echo.h.patch b/pkg/openwsn/patches/03b-IPv6_icmpv6echo.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..d3021216879a54e52a516a1d45af4d722007c3a4 GIT binary patch literal 1189 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539Fiz6-3@9_x&rHrOC^Jh<&dArx z;0(zqRd6gQQZO=6Ff_C>Ftjo@Q!p|xG~v?K)m11083Wa?Tb@}!f>~x(rp8uAmJqYF zPyrXnorXp_MkWd%2`(-L1$}*6+(4nEvLH1jHBAAx5;PeuE=2-HmL(QtCMM;i787eI zVOJIu<(K4xoJy>jAXk><XQn71VkAB@FSA5L)0#_B0bQn~C^J1hwFtXpacW+QOMYIe zhJQh7USMfzX{u{pNl|5diIzfcak`E|YEe;sQG5x6*0knQz%afjH90l242J=l)?n{z zX@Qf4p^=WUfr75Ct}a-V-cgsEpHiBWsz7`Uaw&2t!qZT3Nl|HXi9$7(qJn~gLQ;Ny z4u}Tfq|)Nb;MBa7%)E3^_$w$VfRcWEVoC}q<T5gg9aB<@Qj3eBlBJn>C5C44B_OTE psf8fXTI854ODrmmFM$Lc-XNl0x&b8_ylDrg0z&C0znp3*2mmAFRnq_f literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/03b-IPv6_icmpv6rpl.c.patch b/pkg/openwsn/patches/03b-IPv6_icmpv6rpl.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..ec159ea8f17328bf05f63d9f6e0152d96efd6c16 GIT binary patch literal 13672 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 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/03b-IPv6_icmpv6rpl.h.patch b/pkg/openwsn/patches/03b-IPv6_icmpv6rpl.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..06e712ab94857287e8dc2f17b0ac4971d014435e GIT binary patch literal 3401 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539Fiz6-3@9_x&rHrOC^IW6$kEH- z49O@}a4aZNFfvgvG_*1>v@$kRFfuSS;nLOBRVV_P0@bcto>@S=QD#=ArdFmV5TmqE z0T;-X7CMH;3LtT?MHV`SrV6^cy1HBn3Nh7O3JO~KTwK};%9(k|Ii)G73Q8bHlw{_n z78UDdC~;|XDJbac+u{ZaDXD3hd8rDxRiMjoaVaP$Lv@9C`nm?iyLkG?gINBdAqp^H zXl`Htaz4o6Fbv`=n3(IB8X^2+VyR<l0rL>d*npz6c*ppZ%>4NLf|AVqykeNC3I;Yd zCP?;!6guHjXbcJ%eSL-8#0rJH(%hufB8B`kg@VMQ)Vz{ng~YrRh2)IPoRp%}JcW{c zh2qq_6ot$@1s6wuE^P&U{o>SQkktwndPaJN3I&Pj3TEaCL2k}wrltl8y1ELb#hH2O z3W*BErAfu9C7>vPhKa9ZM0|*2kh^P0e1Kz+t6xYk%=HEp28Q4mNzE(G1;w3$f`34W zr@vo(kbh{1YrLnQn}3k6BUmIPGQd?qLBUqRpu)gdhYMr`RIQ7@i=%tIv%jC4r+a7+ zl4`J86CF?}!$KTHgZK)TCOU=&29RI}nWa#gnO9;FUjk->h@yg=%)H`~#JuEG&lGEr z2q@v`+b9&LmMA1uDwJfTDu8WPD9X<-(E~dO!w~Oym-w`t#Pnio?D9pa#i>PQsVUZ6 ziXa=%-QeQrADmiP3UUJu1Hdlubcr@Jiv_8uRe)#E_>{!__>2;eXh4voyRV~0L1J>Y zhNh-9INKN+80Z)pn86a7f&zxy2T=f|<|U_sJc7lQWCZ{y6(C`7f-p2P)iE?SgQW=c zkSs|oN>44p5ul(F0DqxUP?TSiUs73+T1;fY!o{ViP?n#Wf)t^dd6^{|nxLeDCIQN+ zF8O(>8vX^Td4Z*=rKzrYB}J9-C0Yu(#pyZ<sYONkMe!vNS`!qIXa*FeCZ}eW;n1&X z4fdXv7N~%&g(MzhLmfjiV_4!LEv!Ig33?HV#8=48PbtkwRVYg=%1lhkAtJ!Iw7Iku zKw+Dbnx;@(QdF8;qEOAH4a!jZ`U;6DxtVzoUQ&L34oDOeCzTdg2B+qwWagzqvpQ6b zzP`SVLUL&lsEEv|1eb}RQqINGU*E;iUk_p~dbWk?RZxHw5S}h>If?1PsU=88gU!t> zhA99SDv3Eosfj6-_7Fq$^%Yz^{dJ2{a}rBZQ@Ft1LCV~jpv;Z1C?zu=$#jIc0@$L0 zqEy|2{DM-jQ3@`e{tBS7AhiVQeoze=pO}&YN+U>G6%-UwGV@(hi%T-|5<x{jk_}*E zK`jD>6okA2$c)tDVuiH)B9JY`Q1e0IV`zp{w!$qbNG;0DPjT_|M=}~L2{u2av<Pgk z4yYQ+E!F|mR*4GWy4(|_3CzqdMfL_*GCnf})iSUsSPPmxU~4>GKn8=#bFeyv(&E$< zcm?R<>5uFU<Qf9(P%x2_nv+<G#TSs!M^v?7^TF;=NG$_bx=E>N`9-M;iOD6Ui8)9K zED;ob(BK251V`K{0bI<3odG6N5=lr2j%X<XDS;*C$Cnf(<`rjx3Oxk{P;CO`qlO_k z2+<OlqrZYu2t>1jXI@&qk^-dJqL7iAn37rq^%t6DumTop7nn;et3W9n9QZhsh9i0s z1p5nr(r`pc8hBGUhVhW3fj@;i`lF?AP)5R+0x@lYSVLwCgcNYdrF&UoQE_|;q(Z>k uh^AV72db&asq^y7DX#Uj;Y}h$N=;8K2@3G>%!9NGT{NK119d836(j&_Eu<v? literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/04-TRAN_Makefile.patch b/pkg/openwsn/patches/04-TRAN_Makefile.patch new file mode 100644 index 0000000000000000000000000000000000000000..791e087de18d945a06a756845dca48ec80db38e9 GIT binary patch literal 1732 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FwqSOa`e;pP0UVB%gjmT49O@} za4aZNFfvgvG_*1>v@$kRFfuSS;nLOBRVV_P0M)8no>_p~7~lLn1>eL<1w$hRLt`rg zODhv|h%s8IfD7b00|k&E*akx#6C(v(U0q!+ZH3@aCtrUTD_a$f;*8Xs9EGIB;?%sv z+*Ab>4d>7x7tbI~O}#`eZ3Sf~Pd^vWAO%|m6^$TI{}3m~U{_83q|7{hkRd_NV2Sd~ zoRs9mq7(%!y<|-;Z3TZPFR*xUkh7JlUb3x<2E-IiRlR(Wyo+l9F8LHqE^RJt1y4U` zpHLUqU<GYk1zk@ht5JFS#g)bSnR&@Mr75XsGRgTxsW_xkiZaVmi*RX#$tEWo8X8o@ z=cVH?CApwfKd~q`J~=-(H$M-DB9Qy?QcGa6pg=?S8Z@}|4U7_XeI1>1^2@RKAE77- zq$ndZJp-RA<3wH001s!pN|JOv1Io<sDS;$kd@9U!9SaKd^D}bt^HK?`D@iU$P0q+C zN?~SRR%&tyQA!JnGV_Q~S(-wm?WHLN#M)k(Qjn8alA4!XN!X>ODFwv4v?wtzg(xG7 zOY)0y@u*BL$}cX~%}K0GEh+}*EWH2^f4@j81$drR(SVc%kc@{Z3{vXv<ORyNoGKcQ zE}AMDjzO9VMajj;X88KMg!;H@DyV2c)Pjl*g@V$Y9EHq0g_P8S)Vvf>Fezl_rR6K6 z<rgVvrB-AXmt^LpYbogED}ai}VlHh3U07xYn`5PyZ>t9_5tJ2@^K%O_b5a!&^HLPj zQ}a@b5=&CijpouuI7(G7-%3GMFPTeQ0p@ULXOIh>-FzI~gF!4<Uer`j&`nlQ(b7v+ z(9K7fprWM*O0C4`_VtBmw?oklibGBZaI~i>D8a*4Nufp|Ik7}R7ge!>oq~QzZh=0i zCWy~3Em2TYQ^+kt6N4L~qNSGtj!|WWqSV~{vQ%gQC6;97=P48v<)@S;mq6k?IVUwS Y&k7U{MY#&PY0yYgP|<L44bbEQ0B>K<I{*Lx literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/04-TRAN_opencoap.c.patch b/pkg/openwsn/patches/04-TRAN_opencoap.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..92eed82c7ca8d5409ae57eb7d6c794c7a16d38bd GIT binary patch literal 14142 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 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/04-TRAN_opencoap.h.patch b/pkg/openwsn/patches/04-TRAN_opencoap.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..4a9dc828d446bb0d6107cf33a11e70684c512d06 GIT binary patch literal 8272 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 Po+1t5JVZ1Ni$V<m0vsGh literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/04-TRAN_opentcp.c.patch b/pkg/openwsn/patches/04-TRAN_opentcp.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..1e71e1d63e1c210ad0923d2e235334a47dd278fe GIT binary patch literal 13212 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 R<*AaUwU#~?sKJIWi~(emGSL74 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/04-TRAN_opentcp.h.patch b/pkg/openwsn/patches/04-TRAN_opentcp.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..c22ada62c475cab692274ef169b1eaf2eec092a8 GIT binary patch literal 2150 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FwqSOa`Xf9OOgxpGB`srN);Rn ziWH1Y6bucm3=FM|%@m9b3{ALnb#)brKt@3I>Xv5~fb|hJ$IQyq*viNfVvZIn-~zeN zM90ur0VK|)prEg%#igJSlbDiHlAm6bUs|9LQk0liT##Q>0urz0Qbd(>4uA+NC}`<( zf%NO!;sy#SscD&csS3DNpv!=aOwB9JRj3AsfQgQwse-Pqt}e(X(p>6akeU~gT!8Fa zZ3X4byyTqHlvD*JP_UL{=B5@E>t!f$X@ktCnNL7LjfBB*U}>RaXlMe91qB6#(#*UP zL$ml2h0>z*)Vz}Tg8a<9lGGw=E(L{Jg_7ig_>2;3E-pm{eZ0;rODxJvOv*_uCN|7L z0gm6uf};GA{F2H7qRj-kvMfI{MF9lB;hbC$pP83gqM>QcrKpfvRFq#7U!tG@lS<Cd z%S%lz(E#z|6H`)(;!Cs?Qc{acbP$13kXV$M8=sL`9FSjxDV|#i62@+NacW+Q1}HHE zmZp}by5^M>Rf5dVElvlk$8ab}y-R*xDt0|OaOZ=)p$Uo}3?qtClT$OxaF_tL6|5O0 z407^|Qz7A#l%Jmi3ORWAq@*U5rUw*d=79qclu{u%p%$D)3=Ir)42>*dxrAydDK|f* zG$&Po_yonJ$fc+NN+&6)X$r+9MWx9l3ZUWx>LLq}cftOG62&EnC8?kU0aajZgr*|5 zGB~x+uQV4)4LE~9^@Ax$%p<A5FeM|i*e|uBgs@T2#051ADKUaA0uvdT#hw9WW{xQ- zMXANbP?eZzOF=;)C9xziBtJMcFNKh*AV^|?se{Kp*g_})E~tV_5{pVwVd_Bc0}IDz zroh7uEZ_-N0x2`f5{ruCLFI-5fpUY2nH-cIz==G+95b0yGpl1UAC!5qXI!w0Ku!Y( vDLC|!3*tfQ@nv>|6=1KBo81w{z%z9+IKzV+1a=ub+F>q3%Jfi0$Qd61ZL)H1 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/04-TRAN_openudp.c.patch b/pkg/openwsn/patches/04-TRAN_openudp.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..1392a56513e229ec3bfabb0405cbec8ac9700a34 GIT binary patch literal 2263 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FwqSOa`Xf9OH&H;k~u>%N);Rn ziWH1Y6bucm3=FM|%@m9b3{ALnb#)brKt@3I>Xv5~fb|hJ$IQyq)XLNZVvZIn-~zeN z$WX`FKmjDd#igL2uWySRC=`??<zyx+;8uYy!^NejP?n#Wq5yJuX-YwSW?p8AhNeO_ zmx4kqNHVpkD8DGa1TJ5knwO&CUyzy?Sejaz>Y7(lR2g5QrI1^k4$-8b0AlOf<(KEB z7AZi0t%9?^Z-Bp_t6xaGe}JoBs7rt~7g#E{I9=B+$0WX>D8D2>IX_3iR>9NJ&oLg0 zip0vC{KOOm1zU*u1rWY9IOrikq^ql|OSd2b1scT1;9$xxAM^nQN<l~%oVJY3bxe#Q zX$u@5MX4pFMR^Ko`9<Z4MJbti>G9zB2E{HY#=u?$`5YxVxa8-hVowq}3b0TC(~$5& zO(D3`Msay&Npgk;EQu87mlh?b2ILo&_y=Vs=N6Qig;W-#!i`i=P)JTJPE`o^4gjT| zcxQjd04s3ffcO!dIB4TXMBERMFOgyu#01Bzp@D^tp`j^K+=4w12_!!cXK)||_y>gq z$D0Jlo48m(G9*Ni0;rr(fP}b0L4Hw*m4ZP<nn99+wt|9*LQ-Z)u|j5^Zcb)iDyFWK z)Z!AT9tE7b6yf%O82F<Yl;y#;8z^WiK#~JA^G6%RD%ja6m}n}fDHv23q*-%eHy7lj z%)G>s%>2A~kZ(YCg0L;beYnguK$r_sjlczo$=RtTX{C9|AR~+8OY)10JyH`>Qj0*& z(=pTp<rRc-1%;%d)WmFrU@bUZ!eR)KG9g;P$#@9I5GV|E?QleqCM9u%&185aVFWtm zu>{IYNEni@ObvAmP0f+=RV}QlOv=yCfftM^sY#{j0Y#a4u-a5XK>=F2x;gp;yMj_f XEf*vqK#fEs1cF9_%3yfWhiNPTb@6TF literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/04-TRAN_openudp.h.patch b/pkg/openwsn/patches/04-TRAN_openudp.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..265ae18f9b80311efd98427d6ae6e3d9f76c8856 GIT binary patch literal 1012 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FwqSOa`Xf9OH&H;GB`srN);Rn ziWH1Y6bucm3=FM|%@m9b3{ALnb#)brKt@3I>Xv5~fb|hJ$IQyq)XLNZVvZIn-~zeN zM90uT0VK|)prEg%#igJSlbDiHlAm6bUs|9LQk0liT##Q>0urz0QbdsqbqRn7D=28` zbAeq6HceMoSC@3t{0ma^LQ@KmO$0d$2}9g#s$*&jaWKdZeOuf>p`a+gB)_DxAhlQl zw<=^AE-podvi!^x1qB5KP*|6y6vSudWtM1YT5~BXq!tzB7sZ#rWr|btQZzu$4lGSA zO?AyHDXNSw(Nf4QP6sPTHwdKMB|k3}yA~a|@nCB-t+^C1oKlpUoSIpN!vL_IN%{FX z$c|4*O)5<fD9X$OdjS++kSMN=R#!O;bhqElFc!UgQu{Bp2YX&0gh3&0jpKTM%s J0R<i`TmdDCD@_0Z literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/04-TRAN_rsvp.c.patch b/pkg/openwsn/patches/04-TRAN_rsvp.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..a3c8b49d0b35eccf45ff2366e632bc5ed4493c13 GIT binary patch literal 1221 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FwqSOa`e+LDlRL~OXdv8C{=JQ zC{i#oQ7|;LGBC6<Hd8P%Ff`%P)zwuf0_lfp)Gf~}AjS|gD^pV|Qxk|GTBv{v<T68Z z9V2rEkOY?k2$W{#l~}}=D1aOkUy_-dS`?p|V$G$XPzx3*ODrmmFR|w0QdB6*&rCs9 zmYk%aY0br@01<;IM6l7cWaed-XlPbL?1Y=F2WAzd7G>tAfE;71U;wgO0m)2=5}3mj z6rf6K!65|kjIOS(F2rDpJOlC{i5>!Lp{A!m@q&cGF=lM4V`2o0F_4XrKrYNLjxS0r zEKMyg(SZ3oDKRglJhLQ2M*$>aXa<Vc)U=}1;*5AmAnPcA(o=k5N=i|Di9$+hafxO% zC<;M=ub|*xkeU}*np&FbnpaX(8DFBMP>@|>&7}yDRY)x=$_HtKaupO5@=HsS^K(<7 zai*XEwic9{5K1z2vcQQ1B2tiDqF@VlLm|kX`1I5gx1!Y4fW+kN)DoxCw6xSB4QGGf z0DnJMzmWK#;IIHqgyETK3K|93CAPMHp*}vE3f15w016#51!xi&$k53zCqI0&xwIkS Vqo4uuf+jp%QH3+D(bUl{XaUzrX(9js literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/04-TRAN_rsvp.h.patch b/pkg/openwsn/patches/04-TRAN_rsvp.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..f959c2828585f76efcf139ae89b89c17f3717548 GIT binary patch literal 440 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FwqSOa`e+LDlRL~%is*jC{=JQ zC{i#oQ7|;LGBC6<Hd8P%Ff`%P)zwuf0_lfp)Gf~}AjS|gD^pV|Qxk|GTBv{v<T683 za~(r7V+D{D7Z(?oqC#1IW{QG>f&$1%@tJv<B^sL6Tnebdh55ztMX80Qsl_E4rI~pp z7V#wtNr`zW<(VZJItm~WL$ml2g`(87qSWGy_=41;%={D`klW)EQ&NiJOB7O4i%T@E exwsS*lvDFkGSk35ggHi6S63I8V?fTMi-Q32NrhVg literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_Makefile.patch b/pkg/openwsn/patches/07-App_Makefile.patch new file mode 100644 index 0000000000000000000000000000000000000000..c14082be4e66ab0d96bc035fe85015422ad57337 GIT binary patch literal 1776 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~DA4y!%uY?q%t_@8$tYED zEGSYiGEp!zv@$TXGB#H*GB7mZ($&>fC;}M()u~&aS%A|N-~2oU-^5A<Ln8%4V=Dto zD-$z_DO#w23*<Hf1&|=v0z(}WO9fqBU0p71h2T&pUw;=XTNRDsjMSVQg`~vd)V##p zR0S0c=g=S*&mc`ry+kf;1!X5sKNrs+1zQCbjUZ3|5GTiAS55t-%shRNAwkYyiSo>x zl;p&s6a_84WKAw@1%D?muy}Bgvz4k|vaN~+#1u_cy?l_oi)#Qb`4mkqZ7yvEPd{g$ zP#4!=1#MdeT~8#dQF;2smBsp*dC57YDXC~O$@xX8IHXdFGRsnnaA}0eCMO#j8dSvR zrQ<Lqxu8@(u_!k_IX^cyKM#i@ko)pdOJK5~KtuN$G`RH*j1qNy9i4OX%dz+$p(qKY zC?hjH1D`76L|xAS4`;kel5{--%FOU7G0_bPa`eNe0+PJ*Gjj6tQVFXoNiIlD&d4W9 zVP;-dYH|rtN(+iI^YE!mF3K-1*3C(*Of4z~CoUJyAaKGe%FIgxxdzTJPtD26&dV>) z<I+}u3Bo-G6F~R^Nd)d(Br%w~U_zxSFz+LYU}!8&Dac7INzF^HL~=xFN&yzriW2iu zP!$!I<QL_F{g{}OW2FGkcPbi?{0_=|oDOOEMGBb;nRyB-8X%WwDp)I|<SQttX!tsM zyJ{*a=sGK?sAPgg^HLS8!RBEa1v1{>$qQ_xiiV?$rizARkfuUWaxt>KzWy$uKCYSy zDjE>AT-plC3I(M(IUxH}QVUY^Qb2xH07ZoY$YENk6`92)nR)423VQhppi;A#OItw~ zmdU~9Sn1{4>Oo5iWrgJY+=9%URE5O66ovHEywsw^l2ipWqq(#Zj#Aajw^C5mOXkv6 z;LOcV$t+UPEkMYEM4{esb_TiI+0Dn%Js8A-<y=h#1>Ix?6)nAF1>JmvP8BUZP-@~N zLbtCkM7te|Zct=$I)EcO4HO;FLQ|<GIk7}R7gec(oq~QzZh=0i(umJ5Em2TYQ^+kt e6GKFrmR<@t8k2KU6Z5RBK%OKv8GyAQ5(5A~F55H! literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_heli_heli.c.patch b/pkg/openwsn/patches/07-App_heli_heli.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/pkg/openwsn/patches/07-App_heli_heli.h.patch b/pkg/openwsn/patches/07-App_heli_heli.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..3b76048420424f618ac39ac34f68ffa5f9a6f7b9 GIT binary patch literal 1103 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~DA3PH&B+84dKsJ{8Knx2 z1w{%*CJKgzRtAPv#^wq}28JeFy1KdwMIbYvnsv)F3y3wy%*xc*%E%I8kQOT70=dvg z$Iw^-B+jLvpq!GLmYJ8T5FhX1>f;&j!NsMZps%IHrKk{-n37VGpI($-TA<)qP{5_2 z5K|2zkc2%_b233fAaN~yuvUFr+&}?p7j6~kGK7sRsVqoMNljBg*NKx44q77}LsJD^ zU0q#LLLfASs6f!>(pFH;%uCKGO-WTyg2ta-h7u@X2Y={*k_8e5rx!yD9U~J+g5gq7 zD9g`GQ2-_4_{_Y_5)Dmj6tR+`%=GlsB9O2mlG5VTycC!Gyi^VUg4Ddg($vya*SwOV z%J>p3h1}wF9fj1QqWq%x5(tfEWKn8zYGxS@tzflD`T02zC#9q&m8J(2W#)k$28n9} T9V0VHWTUv0imuNur;YmoS!OpO literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_heli_heli.py.patch b/pkg/openwsn/patches/07-App_heli_heli.py.patch new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/pkg/openwsn/patches/07-App_imu_imu.c.patch b/pkg/openwsn/patches/07-App_imu_imu.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..b620a44b8da868db7f0cc0dfbad4cc220762cd87 GIT binary patch literal 718 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~DA3Q$Ed^n{WX_O`QU%9? zA_XH81w%tC14Aoga|I&<LlZ7tU0sDDkO@$&y5*S##2I5|Wom3?WC<}w3l(sITxV*c zV`iWLlHgKMsO92PP|(-+RLCkVE>S2>%_~tzRPgi-RVYYI&Q2}SQAo~6P0m*ERLDzB zO;ISxS13v?PR&bE$j?jVQdB6*&rDIs%q@)viMizGrE2&Wq~-;drk19<=9Lsx#+PU* z<QAvvD5Mq@<rl@5Kxj>cYAyv3$SqFSwaYKhOD$5cRdDwA4e<AK^$Usj^bNI!D9B7x z&;Tn+E=o--$uCm0MNtJeNI^jX6i&sdMVW~?@dZVhc_pqO8#Pdr>$nC5#fSR2Mg+Jz ihq$`L2fO;YxcK|I>VQKV5-hs9y1MiWmi+QT9xwokSJ(Ui literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_imu_imu.h.patch b/pkg/openwsn/patches/07-App_imu_imu.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..274a168fac4b4d21cb99177ea249f2d4a9a9976b GIT binary patch literal 716 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~DA3Q$Ed^n{49<{@QU%9? zA_XH81w%tC14Aoga|I&<LlZ7tU0sDDkO@$&y5*S##2I5|Wom3?WC<}w3l(sITxX<X zp#T!*QczG%NlnYlOI3)E_w)^o_u%4EP|(-X;!;$INlZy8$xkoJFD+1TEGXboP>87p z5lF(BxuqbHYOqs5X6owd>XKk)XbOH~K~6-%V5b{e=opzm9M7eoP?n#WqL7(e8lRb$ zS)!q7jVx4Bl$oBMS_BeRL?|py%}a5~&r8+tFG$S`EKMy<b<Ha&s*EquQphb%*HK6< zD#|a4FM-gg1{S3zr)HMn&<R$Wl%Jmic1}uaQfYcXQDz?4QQ+`_I2;^8$gZTC!}H5& G;dB61E!cVh literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_imu_imu.py.patch b/pkg/openwsn/patches/07-App_imu_imu.py.patch new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/pkg/openwsn/patches/07-App_layerdebug_layerdebug.c.patch b/pkg/openwsn/patches/07-App_layerdebug_layerdebug.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..d2a9cad5e0ded0e41ebc5ba2022f5515f35036a1 GIT binary patch literal 7696 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~DA3PItV}IRNlhwEM`G$F zbB1J;DmWGtDHxe37#dm`7+M*dD;OCVnsDjr>M9h0%!3-FTb@}!j-h5&rlwY=CJ;ll zPyrXn<>oqu#tI;DE(HbU%)I2B(v(yMC6KMfsYRKIIeHmN7&1kPc`5n1=rYC08L26y zIjKb;2}Le01qFS51(=E808mKF%t<X)D9Kj<2L+0`d8wJ{8A<s?#UR}v-<#_gnkeY% z>gu8>qugOgzVvi;b+s@sGBh=D1=*^IB$b(xo0ylF4)F{nUI7Iy5(bC4v5Ag}DJ0Or zM%&^B3I#>^CHW<l1*ydfxK$y`aB(Rrq!tzB7sZz-fI}S|*72~|i7!e`PR%S!)$lJ! z%?m6|ElqXJD=DgsFVRxSEl$_rQost5^Aii=Gg1>%Qj6j<GfK1+6p%#lYRWGt$;{6~ z)&vnL*0kor;Z%517*uWrrAcE`9TPK1qNGj4<(ChksKe^m!5Mi-IS|AI=R#8h9aA$% zE>ut`%g;;!rF^6uQ<7Mm9gpx%a*_rp$zoMnoSK*7lAnh&Qz?Rs#)e_B4W=Q+>+2)u zW;C`!L1|J>W-^gQ0Z20!xGFI<)G;-OBwVZ>pod=($%U4_1w}6s2FJ9afq{;pfh8=i z_4Q$ep+a#<Vo5O<G)U0n9;PZD6!i+#kfIT@*eu8{vE~BDFxX%5B}fsSUs{r!pPOn8 z(Oa6CS7L!8pI4ge4=x~!aVja!tV*>8)usyI3N^VXHL)aBAyL6O-!VWT$VH(bF*!T6 z1Y$u!c8P+m0;rBG1eNUZ>8T}dMX9L)U?onaX=$lN8qWT{0seljej)Kbj*+fGF0M|Y z?wU~BGt(3_3bIRVZT&)hd^8oR!D+|Pz);7~$N-jlXcl^i^nnOK>V=;+$WVQKg_Qg} z^%8}m(maLCG=;qU5{2T*yyOfnur$c~nW?F%hNdQ|@tMWJAQ=r!1zTGMH%FgfS51YY z)RNMoJZmm(h<Z>12Vq`*o<d4udQpCU2}Blb8mt)siVDwS7e{xHyoM$yY{6E7Tm_1+ zlFZ!HqT=}ClKcV<<Z8Ptv8Y(DI5`6>@0p@$4KbT2ZFxz>ShT_Y05YSNOB<4M^z{|! zo3fDdD2NHkr^bdlh9*X^e5#-TP26dvdC8zwL~(pkYH?~&S*i!PB@&!jl?qC(I-o3) zpQZuNuSglWAh9IFKvUNcmcnyWbCU}yHPi~SOLXlD5-W4^6H}rMVs+GTY9_^WNM0o5 zT##eH<pr7}KoNq9Z51?}{T&11{R2Wg{r%#7{GA;^i~z?F4_#ylXMevCSHF;u$N*PO z1sfX$6NMT`v??el5D_@g+>a=Xw6&o^pk$GsSCX1nq6=z+DnQz95VMK%tdS<Pa3sRB zIJ|`JBSWa;P)sz8MGZO-&sG6!qOYq9C}iRt0|NY=LtI0GLxNl#eW8Y+dK%QoGc+;M zF*G%Xm3O155G@t@h5E*a26=)K;c!W8ATL4lkeh#yuVV-ulN_k@L&A`P(9B53(98l> z5P}=0NQD}f)|x^!w23fK?Gtd$F*nvRG`EE19BMh6whaTMum>?A;cscGV`KpD9FSTB zAUX|5kw$b)gj+YPD#EP-siq^Ycpi|t2(SCGmdl{h9MsxM9%+@4k%5_xks-Y6HkuL@ z6ck9WkA_@=8*CMlk&%&(kuh?C2<t{DDAa<6@zBe90wW^u5lV2E8PppB=WtL@2-0&+ zL+`fc7N>*T@U^%`4dD%VvIaO&1~eg~l|+niLUln}#Ynm!0>vPIfgAc@U&faxVDHX? zTIis`P*4?WWNfTsWP+UEDGX>t<q38K$VsFHHNpU-%4{$PHp0R9gBw)aBVlmGZ)9qq zV}uwL1cwx8TpYQts9>w$>loqa9O4<~8tmgA5)2!ifeg?Tr<N#`WTZmIXCOo7T)Gg0 zkO$3m?fjjgqDYjjf&sMtQ-G!|hzYuO&iN^+ND9GBX#d99-^DdP$Tc`19@>UQau75K zz{;@_whFHC!J*F1uED|9;Nc!4GeaFCGw3KcQuu(FkT5bc)-f_i?xjPLD01osmkHnm zhdK*^D2Ru4E;TpSF|sg%HFOmepd&*VL4Zh$NSS9)2Li&y(4+%RkFc>zSYZW94oDc1 nGAzt>j4a{PiIDV`Tbz!Td!R-@q``xlLq5+~n(G)FK+^*NO>n0f literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_layerdebug_layerdebug.h.patch b/pkg/openwsn/patches/07-App_layerdebug_layerdebug.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..77bd2ba11ad3557a62aaf744cd62acb7127d8f35 GIT binary patch literal 370 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~DA3PItV}IRNlhwEM`G$_ zaE4@*DmWGtDHxe37#dm`7+M*dD;OCVnsDjr>M9h0%!3-FTb@}!j-h5&rp8uAmJma= zPyrXn<wiOd3Ls%F1qJ1l)U?dJRE79>AIC`7AQxAsQ1^HbE-nQHeJw36MTMBel$4VE x^rHOI0tLr{0xkuGm}(G#BwQ2%5~v0{A7rwwuC6ZWCOhXl20+YFK(Q2NIspGcYEJ+F literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_ohlone_Makefile.patch b/pkg/openwsn/patches/07-App_ohlone_Makefile.patch new file mode 100644 index 0000000000000000000000000000000000000000..387883424711aeef432b59371ecf685ff9f7fb09 GIT binary patch literal 1334 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~DA3Q($jQ%3)%Q)zPEE_q zN#zX5C{=JQC{i#oQ7|;LGBC6<Hdin*Ff`%P)zwuf0+|CfK({=zfRJIn`FRSyiIob5 zMhb?;RtA<<CT0-Bv`_&T$fX7fAVIJ_hC0SZ3c9+wx?I`{!J$sUp-#U3E>^ZG8pRo@ zIXMbRiN&dTiMgo?DjLqAK`x#_nwolvT-plCPM&@)o<Rz>3Mv{wp8g?Dj=`>)`bn92 z`XF<HoWT<1nK>!RiA5<2T6)QvT-pl$PF`T~;2>u!RlQ_e6%B|fnyPyFAbA(p09^7Z znq1mk+6tb2&OV_ouE7f0whFqQNLHir^ouKt^)vI5b4pWE(PWbIi&Ak&r4(hBr554R z2$M}tHZ(M-h|f#MVM=mAseWQnZhUfnZf<@a4n-jM<)xOuWI=(3?lov|>l+v)>iRl5 z=j4}T@jpUQ5=c=-W_kubRmO?Bo&g@tc$FmSdIpr4;ZtIw8xrK`het(nQGRi;Zcbul zYEdyb+VlcE{QV-W6yOoAq5)59kch=91JdB{<ONC^oGKcQE}AMDjzO9VMajj;Ci(ii zg!;H@DyV2c)Pho{LP2RxjzVUhLP}~uYF<ieUUH>EW?ovpLRx;2f>vrpW^qYoUb>co zUcLe-D;9HUE9k<~3)mbhy?k3eXrfbANY2kK$jnJqNX$!7NKeg6ElMm&MK_vD8{sHb zy?iSLRlQ^`Z3URaot;50bawM`bPooxV9~9qprD(qprWOhte~5ZFhNC2FP})=zP=Fc zb||`2K)M|YiZb&`(iD{7!K<WDqmZ0fqM(baSiw#~za+OnA5`kZ=a-f!sHrLBmZ6Ek z4N=k3O998LvO-a6Zhl!RG=LIIGV}8k3X1YmN|Q?<F`t~1nwVz=a!XOJf^Hf#k`z=l JTwDV*xd2vhWW)df literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_ohlone_ohlone.c.patch b/pkg/openwsn/patches/07-App_ohlone_ohlone.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..bec8cf83f21512f5351c66d5e7bd7fd073552075 GIT binary patch literal 2688 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~DA3Q($jQ%3g;ILSoFN&d z3XTOu3PvUhhK5!KhE~Sr3PuKoCS1C@x(Y=gbD#$3mS+}_Vwjngsi~Ez3B)ihRKNvt zsilsIkpf7Zi%UU4U*8rtP$)|*%1lhkNi9~utq4Vii%VCbq_QA2B{fZ<xTL5wxkRCw zOIJZbLBYQuH7~F<wKUZ=ucW9lzC;ToSdd*}4UtaD&(8sgpy1-vyp+tmbf}Wj%)Amq zv-lDeB^f0p1<o0zdD%#cEYQ>_q^Fhyr52W^7MDbaI0wYLxVkxp`h>)Xd-}QfhsOtd zM!Cj<wAU)+gCi-vEU~CK9^^7E1ymtqo;Bg%D=5k@$p-}ovEj$XrKnJrpP2%)2NVDW z*(Dm9)?5k-;2?s!FgYVNIol*TBeAGh0~9VGFDDyDo5boUz_~`zCb62txUw`UCo`GY z7`C;wMR#RpUS^4grb0CrIA)+O1cjj<Ja!ap6%0UrP(TS#J*0>+h*hvvP}f(-ugVat zN&!t(d1_KYVtQ(EJj5j+BWgj8L=LgyjQrA^6wjQ@;*!)nglmgZOG=CK6heYRUE$iW z#sJKFu;5K9O-oBH!jqoBfq|+zJ|{KLnhTu6Ep?1d6?AoVbqS{;GBP1bD94w;k`pLS zh)EFCO17YY90Exf>`Ykv4vFN8;$mWxFp4JBgh^I122~+Q7*e-b=olK9Kx!9o1^`uJ zg`i?TKCLJ<H6SrLJGI0KoOLvEi_^i01DsVsj)NsrP^ssVpO>nES!d)Hr|T%B78T_e z#g{;6c)62XoUUt^U!Ip*q+qMy?C%@k@8{|l67TQf<L?K~+X@N_nQ00jYjy3Ci&7Iy z@{1I0(G|jt1C>+-sd>ezMVW~?@dZVhc_pqOdo|E?=(q+2#fSR2Mg+Jzhq$`L2fO;Y zxcK|I>Ok_jp^l|FB%{+TJo3wjN{ApO7Z4MiWDE@rbPNqGDNHlT`FVM%$tB=qgC#V; zX$-kKNJ&j9O%DLYDn?!4=I9d)PB68QqT0~FSjW)Nh{8xjb|BUW!{<a$?trIEXnsd> FCIF5-7ApV% literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_ohlone_ohlone.h.patch b/pkg/openwsn/patches/07-App_ohlone_ohlone.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..d5b7d04175874cb91f925864508c93503f4219ee GIT binary patch literal 1764 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~DA3Q($jQ%3g;IJMoFN&d z3XTOu3PvUhhK5!KhE~Sr3PuKoCS1C@x(Y=gbD#$3mS+}_Vwjngsj-!jCB!f-RKNvt zsgaJ6xdKR>OF=<7B{eNGFI6Ev-rvK=-_JGPgNsW+L0?OYOHm;vF(suWKfNfwv_QeJ zpnyw3A*LEcAPGY}1rh|wXz7DB>)YZ63Q+rSt3a0_Y-CAgL262BngY5`oO~`WMFoAl zt}II|%1lhkNi8PUP{OV(D9SI%2RW5kGeNE_%g;<vfCO@UW?p8AhNd-_qC!%Behy5u zI3vF_C&e=-v$!NR4<xOifUKz~H90l2ELFq5AT=+rG_^F<HLs+oGQLDhA-6akY#6fY z;?%qpm;5{&%5@Y{i;D7#;!7YjhVJD2yu8%p60iZ7Dv=$XlA2VS9#E8-2lfy&!6_)j z)PfVgk&dyMg08NvE@|mAB$>!0s;!`$nU|bXnv$xZ1j=J2$pv~DN?h6?ci>GGLnH0x z=BJeAq$&`fgt-*C6cs=z6O@UHONvU9OBAZP6crQ{6fl#Gf`URpb_pmIDkwk_B1j!F z1|_1*ymY9N(#*UPL$ml2WEBb-B_##U8KrsINQx}b)F`B<mIS31mZlb$M29#B#Jjk< zIfnX##D{zOx%h|22YW`j#)7oh!g4}cVo`B?i8Z})A}HU0vjB3!M$L^-CA7?u`Q?~7 f4P-4WP>}N^Hnqr(N6M8TBQzmFsig%f-fOu42u%4T literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_ohlone_ohlone_webpages.c.patch b/pkg/openwsn/patches/07-App_ohlone_ohlone_webpages.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..a009d6390fdf226787dbd231df52741646d622b4 GIT binary patch literal 702 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~DA3Q($jQ%3g;Me5sYwNi z>8Ztf$($h>r3#J(MG8hH3WkPO28LF~<_bmzh9+FPy1EKQAOoQ$>6T{}kY%cwm8q$f zsR_hXEmXh-a=VeKj<KNvNP>$?K|x>N7B^5RC{4=AOjf|H0$qlSOHrXLKQl!E5(03q z$7kkcmS|`yRC6hSfW8)l&P-F#(9%##EzLAD(Kgn!wKb?Pu+&tj2C2cs`uYkb8JWcj znZ*i;3hthMjtWWniA5<28hQC83W*9yiN&eKC5a`O`FWZU;}sMX(kqMdp_W^N0~z9d QU0q#Wx_ciKFasR~0EF|pP5=M^ literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_ohlone_ohlone_webpages.h.patch b/pkg/openwsn/patches/07-App_ohlone_ohlone_webpages.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..19a779042c6026d07863ae3337bf89509ff206b2 GIT binary patch literal 698 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~DA3Q($jQ%3g;Me5sYwNi z>8Ztf8Jr;*r3#J(MG8hH3WkPO28LF~<_bmzh9+FPy1EKQAOoQ$>6T{}kY%cwm8q$f zsR_hXEmXh-a=Veaj<K-<NP>$?K|x>N7B^5RD9SI%FR3g@Empv-3R#AWOHrXLKQl!E z1R$XR_kMh4US^4grZty>LTP4RiA8*gf&!`%4VbuAdTL2fYGG+=afuFCv7uRfi9&Kl zX<jyj57MkvkeHmETB2zU@`rM2UP@*fSB!#RzCvDVc}`|tszPFkLTX-$LVlV;T4qiv XIEW#h*VWb41!<zY=RrX;Z~*`Sk}A-c literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_rex_rex.c.patch b/pkg/openwsn/patches/07-App_rex_rex.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..3ef1472b7f77dc2750ea619781c3ff1ea0ea9412 GIT binary patch literal 4404 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rTtpH)YWX_O`QU%9? zA_XH81w%tC14Aoga|I&<LlZ7tU0sDDkO@$&y5*S##2I5|Wol|=Y63Av3l(sITxX$U zXsiGd2U}vHV`!?NtE;QarJ$gknU|bXnv$xZ1hTa#F)t-QS1&^eMW#48BQ>QoC$$J7 zp|6k7<mloY@0^jCmzSCYlGH{rFEb@KF)uM4q6=BV)7910!obMT)Wj8}hf6_0U*8rt zP)JEl%gjqHR=}+UO@<5PXOM4U7{pgFvd}RxfCK_TD+`M9OY%!93y8Lri%U@<wWuh+ zD859YD77NKC^b1Xvn*A^zaTX)ur#$a)itlAs4~7pOCh&7U585nD@e{yEQrrYO-xBG ziqFg_(Na)A62Yq}zn~;DKMz?GM5I{LnoB{UEI%^^WFg35C7HRYMe)f=8kjPP#o1UT zic|AaT=Mg9dPWgsHZ}|k5HPK2%|$raOOtXklZlULTP|>VHa5^PF@hv$!d8$Iv-#y< zFO0@5B9;+B0uCA)#V#xZLuqh6Hnq?(Ga))3XO<<Fq!OQ^sFIIS@+~A&5|NRix*!=B zNf$(*SW}@IQfw5ZmXsFdDY(YFIePk7gEN4cfsUCO(HVe@AVI`7s0<;iaD#dexp<>p zpg_|Li~^?{b0Zyd3wXK#mx&<Hl)#ETSomTV*#+4p)?DCH4xHBGOAy&WA-}XFIX^cQ zRLm+UD3oUAl~|z2=auIAgA3<koJumSA;p-viH?N<JQm4wAR?j=ZlsbEVSx#y!C`7) zq+@9W2~)6rApaYh!2=+%EFCNiB5V~5u!n$OJVKeRf}w#mC=V(qD5T{VDQINol_+E? zfb=S4D%dE1)mkfLYHMpkBBUBZftnDYrbv2fNm+hQNn(1cMnQZ<d}dyWrZtx$OigiV zu7b9$0$3dCmRd-j0=d9ep|~_xA7TR}LM%*l3=N<a3&;!L=%tqT^z{`|^7GV76pBjo z6f)Bk^72a*iYxPyGa#<bOjFRvOifKSG&M<$&nylG$!KUQ*xD+%Ir;><YAQgA0VLmn z!T`z0{5*w}#Pp*4{1PMsVNJ65^wbj1Vi!kuki3Q_sB8hJZ;&rR?LcrVp*X&{B)>od zlu61Gi;DHYf}Sa$5Cy3NVYnkeoLW#wLo9>D9oBeLfJd2vzCP|a0~x5G0E!Z#qYRob zVH7xl8XB7G7#cydJ=n~G#N_PMlC;viWKff-IKC*gIJKxO)dSq@3eK!b)hNg=(J9WX zO3hCL`@JBsB*Q>c*AU!bQczIHP0dX%sMJs^$S%>fD@d%&$xlp)Hi*?x0|gXVF+SbI zSr4)d93g0yfPH{M*eYl^`#T22`v-)0`uoNE_&Ym-7y*tU9=ga9&i;NOu6`jQkpZrn z3N|(hCJHr>qz?*YOwU5I2cq=S)`kk{>nkMZ=ar=9mFR*R$O@3^31Sv;o-=}_AR;`6 z!wcv>FoZe|#YDqcl#l{*Y!$#J`ntM+LL%NVAi&=_#5E*1B*@j#7itKqr$N0kLnCt? zLt_g_*$g&^IG+yHROA=x8y_0v2}(pmHL-xa08R65{z1NuA#_YKuo4JLLkc1j6CFbn zOQgCIR(2{V)Pia}czsWxy9MuNg4-gXk{g^LL8W#fsG}L5R+O3=050U5O4HI(i!^eJ d)4^p|Ex4^{XlkNkXljX+mdSMpqOC!OQvmVXt{wmY literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_rex_rex.h.patch b/pkg/openwsn/patches/07-App_rex_rex.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..f2ec2e9a4d3283331a52a74786629f9a9cc82a80 GIT binary patch literal 327 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rTtpH)Y49<{@QU%9? zA_XH81w%tC14Aoga|I&<LlZ7tU0sDDkO@$&y5*S##2I5|Wom3?WC<}w3l(sITxX<X zp#T!*QczG%NlnYlOI3)E4|0u&_u%4EP|(-X;!;$INlZy8$xkoJFD+1TEGXboP>87p b5lF&CAs~TjuuDNk>gww1l3-+L3SLtId1PAm literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_rheli_rheli.c.patch b/pkg/openwsn/patches/07-App_rheli_rheli.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..def335b266db322d53b8d4b4f8261d3e77a01aa4 GIT binary patch literal 2416 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|s;NX^NFkb23SAsM9# zjs-;uMkWe|hE@iKR>tNEMh1o^T)Mit3Pm7OpxSlIGYg0}%FN2t)XLNZVw4st-~zeQ z&{D_PKmjDd#igL2uWySRC=?Xsm*kgJ7Niy{;8uk!!^NejkXlrfUld=W0QPQtQEGB( zW?8C+e?e+qU}<V;s%u_JQDuCImO^fEx(=5D4v?ImSP-9)nwXMW6rY(<qNSjKBtk%2 zenClQejc(mh)A)fHJ5@yS$<{;$Wn;&N-}d(i!`uE6sP8;xa8;IbhskO3~U(YeK4(Q zO++A<Cgo%%6B)puz~%xc5lB4h>gwteVFfwym|qU|!pMzDL;!#Tf<|!(%85uAoJUP8 zbxbXY&ZC)Si6yDTr=LNdM-{5Mz<CQC=J6#8`K2Yv`MIg!jHIBTkeQ~Sfm9Ue+BxT^ zq}tj#`#T22JNvu1#s|3u#s~NZhiEEPLox~^Fp145WCSK6oj}TzK~?0zf)n9LiUJfV zrGl8?)M{p;V-BrRU<G1sak{QuPHJ9yNd`;^m9|wdfW@c+s1{NvPAyR=$w*aj&UXw@ zfE4^(x==kR@$K&n6-A=Jros3qszIp(CIO>u6_8U)a6r7Xhohgns|%8Y@*#;1rUR3< zRd9_D4s~{R4Gy*j7sqBMI%bv%;8X?*7$gi1BXdg~3lm6=1{(%y3dHB9r9rBmT2P(@ zS4@x;M4<A4SFzwc0!rv$GePZzLQoYOpH`Hb8jzTrom%2lnwFMYq>)>k4zA;BxndOj w@)hz@%X2dGQWX+Q6jJk26!Oy)(lT>W!TvC}(6KOv_ycSxWe!E8Ix0IA0K^`Q`Tzg` literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_rheli_rheli.h.patch b/pkg/openwsn/patches/07-App_rheli_rheli.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..0132ceb3ce08e9ec75d2dd15ec9512e24043546e GIT binary patch literal 346 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|s;NX^NFka`)MAsM9# zjs-;uMkWe|hE@iKR>tNEMh1o^T)Mit3Pm7OpxSlIGYg0}%FN2t*viNfVw4st-~zeQ zNXJ3}B+R9tpq!GLmYJ8T5Fa1p;p*cV@4>~TprEg%#ighalbDiHlAm6bUs|BxSWv*F qpb%3HB9MfOJW_KqL1NWlCxgt@)z#G{$z11r#{h^C3Mf`0nGFDjykUy~ literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_rinfo_Makefile.patch b/pkg/openwsn/patches/07-App_rinfo_Makefile.patch new file mode 100644 index 0000000000000000000000000000000000000000..a98120ee47477fd553312cf73914fa58f39ca0da GIT binary patch literal 1332 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|s;%uCDH_f5=BP0P$l z<qXLvRd6gQQZO=6Ff_C>Ftjo@S1>X#G~v?K)m11083Wa?Tb@}!z%1YVJO$sxN(DnB z1w&&i14}Ct6Np(_sDKOPP6GvyAlMp19b+Q}U0q#WE^US2P^aKfCtrUTD_a$f;*8Xs z9EGIB;?%sv+*Ab>4d>7x7tbI~O}#`eZ3Sf~Pd^vWAO%|m6^$TI{}3m~U{_83q|7{h zkU2rlV2Sd~oRs9mq7(%!y<|-;Z3TZPFR*xUkh7JlUb3x<2E-IiRlR(Wyo+l9F8LHq zE^RJt1y4U`pHLUqU<GYk1zk@ht5JFS#g)bSnR&@Mr75XsGRgTxsW_xkiZaVmi*RX# z$tEWo8X8o@=cVH?CApwfKd~q`J~=-(H$M-DB9Qy?QcGa6pg=?S8Z@}|4U7_XeI1>1 z^2@RKAE77-q$ndZJp-RA<3wH001s!pN|JOv1Io<sDKXIv33BwqqawK|zqnX8C$TcM zs2Ch=dI28(evwuR@CaAYfTuM`#A1~JY4CUQ0woPj6%9uhO%)BtAWem$<YHu#eEnTQ zeOxsaR5T!JL8()rpfo2(Au~@QCAA<mFC{fExl#d?_Y~6dixjj{D>92qGV{{46!h{H zKsm9POItw~mR`W-Sn1{4>Om8ovO;oxZb4>FszPF3ib8s7UTRTdNh-S0T-pdnsp{oh zDX8itb7?EU9PaE4a-p-EkE44qhy{yoO$7zrWCay1y<`R5e1r)qT6+0J>h|@8XtzVr zodVMBP*9YaSCXcn1P@*%g&KwA#1aKvRK*H*3i>6vpaLqtBtE~iL_tkWA-4=o3~q>u zmR<@tUX>M!QgidmQlSBqSdy8ar%+IopHiA!0*U$LoYcfTE09}?ausybppm4YqT%8i HpveUQC)i{3 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_rinfo_rinfo.c.patch b/pkg/openwsn/patches/07-App_rinfo_rinfo.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..9ad63ee0d7ac5ce3653ee98d0c48fd4dda8aa81a GIT binary patch literal 3356 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|s;%uCCMkb23SAsM9# zjs-;uMkWe|hE@iKR>tNEMh1o^T)Mit3Pm7OpxSlIGYg0}%FN2t)XLNZVw4st-~zeQ zOvlhr0VEE#$V|u3NI_RuSC>mcK{+!oIj1xwRY3`4b8%`>W@3(Bh7yKMQDR<7elEI9 zQhs7l3P?~J$)L=X+{C=Z^wc7d1ebz>zP>GPppcT9mYJ7YtbkhynhY1nM<BnzFo>^U zWT<0o3h^RAD+`M9OY%!93y8Lri%U@<wWuh+D857i9HH?=smZCCWvLqe1*v&~rKzQ< zu6ZRzmGLE73c1DUI$R1kKyrR!L3~DPVoGXJd}c<8mVyG32mx*R1tppJdC1xzBE_24 zTnY+h`I#voOCioHPR&bk$<M>-K1GmHY#8QCFs*6LMK~-=lX5bXiH|*7P*{Q;3vp>? zUS^4grb0C&$n^CU3W`z-5{pt5N-|Ovic*X7ON)|I6;e`*lZ!G7O7e>o((;SIa{48y zxdjRZi6t2jtq|kN5{ruUK&tgXG6p%Rc__ZLRVdD^O3hExfT#wm(bP2r1)zcgG-}a| zC`-&iGeV;@Gq1!VzC=q?Lk-y+YjEZ=GSV@&gyb&5fk#e4%r6H=&ah942!De8OSi-b zN}QkssmP_s1<og#X&Ue%Ej~T9#IxAN(Y+`?zeGdR);1(4)KycVD7B=tC=Z&9hIk@| z6{}DhT)LW==$IN4UAktLC6=TTUnGD^1aK5nJxP;SxPo=T%2tJHNFsnaFu$}UIX^cQ zTrw&sC}gH7Xn@s23UysO=lqmZTU%#;$AEZee;3#IAlJZnch?Y5f&v#0CKfuT=0q0{ zWP~Il+d#@DYSmOoz9gZd0_#E#ON0|C2~BAFgi+vhYGJ5jVF5{}utGbxI9=DSAh9wh zKQSd5TKa?9WWgng$=QC1xv84EhT5jOhOr8^3hD;x+WrBqe&NA>@nNn(!Jhtp@d1t@ z&K|JnRsgkT6pB+zz*UfQzGHv_B;p~7L;<Bf*R}I^hPeVk+bS4XV^<AIItX<TmaPJE zQVIqoD!&j{zYrt`LBkND9vf+^;2Iws>g?<q9Bj=6PJ|YwI+lizL<rMB=U_r^_dqfY z%powE`aXxH6etZ&FqS4dmX=5f22zkKK*JPNpx1(mCs3ULZ5|M4TEW|i-~t1b?ZF-b zHLeRm?Zo)BqSVxY#N_PM5~tF%wA3Pv+~Ra_3$B(cM!_#%AuqK&Co?ZqA+bauH7`XW iKTRPmGba@sZI<Rbh6eDKJE*||u68JKEg~yY*}VX+kDZ<X literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_rinfo_rinfo.h.patch b/pkg/openwsn/patches/07-App_rinfo_rinfo.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..3842ed37772587aa965e807f68ac7d5258c4de6c GIT binary patch literal 628 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|s;%uCCMka`)MAsM9# zjs-;uMkWe|hE@iKR>tNEMh1o^T)Mit3Pm7OpxSlIGYg0}%FN2t*viNfVw4st-~zeQ zNXJ3}B+R9tpq!GLmYJ8T5Fa1p>F4Gj@4>~TprEg%#ighalbDiHlAm6bUs|BxSWv*F zpb%3HB9MfOB76)%Le*dwgN)VH)zu}*Sm%7l0EiI^C^jOD2DuaogMDCVrekCT@dL=c z`nI@%LP1e}Nq$LXL29uAZdJ%KTwIC@W%-#Y3gFm^&&<m#(a^Mp1&o41OfA^E5I2B5 MOdmIZ+=S*105x``?f?J) literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_rleds_rleds.c.patch b/pkg/openwsn/patches/07-App_rleds_rleds.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..4aab9e366e01d6fad4f0a68a506c1bdbb91383bc GIT binary patch literal 3663 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|s;Nlht+kb23SAsM9# zjs-;uMkWe|hE@iKR>tNEMh1o^T)Mit3Pm7OpxSlIGYg0}%FN2t)XLNZVw4st-~zeQ zP{%?6B+R9tpq!bPoKu>Ts-Oh5N-sl+OA$#J>|&50y4vLY!~%5jg2d$P)RMH)yyTM1 z{Jdh2G_qMB&x6F!jVdfnElmYUa49J0>)YZ63T25!nTbg`sl^Jo6`{z0gA(LlU0q#W zqWv46Uk-8(x;x4AG7i&d>1$BzB4J3Zo9h@GLgJlZI2RP<m*kgJ77!iKTwIC@sYONk zMe!vH;3N}Yl$xBHS(d8dUyzy?2#R3Wypp2I_!2FJ+~RZ{E(II_6vpuxsfj76Me&&# zC0Ys!NFoHZ<rjdG9kMovNU^3hmx4lBer5{DQi$`4Q}a?>^7C-IPZ6XP8;1E3Olw+m z5f01Jq@2uTViT;btt}`l!H$KvG&3)=L_<@d8WLps`U(X_sRfBesR|_-sR~7@#rdU0 z$*Bq{sl~}fnFS^JMG9&8MPNC7z4FwY9Np}^{PH~g<ou#kg@VMA42UrhqstPDiuFJ` z^*}NPIjMQbKDJdT&a6t!Pt$-X1}o9jH3WsFf&w&_(M%{y%t19lqck(G#3H^#OH)G) z*%)g`#snuxaMmOojN~NA{Bm$K4f{li@F&>6^hlQR!!%tY6`LR?xac%7&@r(jy6DU- zODstxKEH#qJ2=(`XDU^w<^q?6Fem1hmL%urrh*GT1qFr7G+2h$Kq{zp?VR&dQf+OW z{T&11o&8;0<AYoS<K10D;N_SCsHz7QU#TSukY<BIL1JZ2eqsu^WPpS?u_Xf;A&$r~ zkYZ_2RadYuM>vx9p$<yyNEn>%O)YiIOd;tW7R$Au3J=23*H<V`Edf_G&iRf33Xocx zOBW)GTyN{z`8z{JktkaQ187~MfKtmt5)YC>Fw<56IWYx;l9gYGt6vB#Au1>+Km!S^ z94ld~;2Iws>g?<q91N*|Kpr$v04Fmfzk`@y|C?LtSfKeow>VwbE+;iFy(9yx6$)Tq zK`L2D8XwRw@^JKXcXgpCjLa=`ER1o7k%gs>r3q3RDM~FVEy{z%1t@}RK_whggN8uU z3*L?dmpJeO1JpkOH<{zpic(Vpz&#D8(zLYHB8}YQbZ`r=mMccVFJB=qwLB*?FI6G2 lL?JaVMIk>;AuTf}6<n-XnCn;?LHq)aJ<1)6$f8tsE&v8e=>Y%$ literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_rleds_rleds.h.patch b/pkg/openwsn/patches/07-App_rleds_rleds.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..3f36eb11f0ac90e99ed0d11bae3251dd68c07c94 GIT binary patch literal 631 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|s;Nlht+ka`)MAsM9# zjs-;uMkWe|hE@iKR>tNEMh1o^T)Mit3Pm7OpxSlIGYg0}%FN2t*viNfVw4st-~zeQ zNXJ3}B+R9tpq!GLmYJ8T5Fa1p<LVL|@4>~TprEg%#ighalbDiHlAm6bUs|BxSWv*F zpb%3HB9MghQcHYNQ;I>N)nG@1OxD%a)g{Sf=X}Qih!F}XmZF#raxW4F`@_&o$H)lc z6OgO*ZE*vIf};GA{F2Io)M5qPs*q*4xD*x2@-tHuz;PCznU`6jp=k{Z9tDM%TCk5H NZUFn4=5E012mk?nri%ao literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_rreg_rreg.c.patch b/pkg/openwsn/patches/07-App_rreg_rreg.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..963fec56040de96271788092d2cc5e88ba6319e9 GIT binary patch literal 6004 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 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_rreg_rreg.h.patch b/pkg/openwsn/patches/07-App_rreg_rreg.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..2a0529148614c6f0052e9938260545aab12a9ee3 GIT binary patch literal 338 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|q|N=*k7dKsJ{8Knx2 z1w{%*CJKgzRtAPv#^wq}28JeFy1KdwMIbYvnsv)F3y3wy%*xc*%E%I8kQOT70=dvg z$3g)l%%z~9oRXTBnU|^%A0HIt>K^aG#igL2ucgJMs1TEwl2VeNUX)*2px{_gz@?xN nQw<`Jgo}bw(?LSjVCRBN)z#J2CB;<de8&KY2?{6{B1{GV`l(*4 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_rrube_rrube.c.patch b/pkg/openwsn/patches/07-App_rrube_rrube.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..7ca51bc8faff5da37b23fb82377065f309ecd6cc GIT binary patch literal 4738 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|q|Dosj-kb23SAsM9# zjs-;uMkWe|hE@iKR>tNEMh1o^T)Mit3Pm7OpxSlIGYg0}%FN2t)XLNZVw4st-~zeQ zLdVcV0VK|)prD+Ymz-0YlB%GTnUb5BmzbVfq?e(DB9WAzSd@Y;n30;32@+F8G9f25 zr5Gf}rJ$g%Z;Kl!q@<>0=A{-Z;8ubr!vzi!u)B42b#+mkM;&*^=a<vU>7bBC!r&+{ zHrFw+fW!g8&?+d(FUc>dEFe0-xVRJ*Qj3c6i{eWZz$q@iC^b1Xvn*A^zaTX)ur#$a z)itlAs4~7pOCh&7U585nJ4nt?EQrrYO-xBGiqFg_(Na)A62Y%4zn~;DKMz?KM5I{L znoB{UEI%^^WF^FLC7HRYMH*Nnic|AaT=Mg9I$IHB1{MtSJD3KWTbh|yVi8}Wkdayu zlJ8iYoSCUniV)JY<{}&krAaxN$;78vTX2enL^C+a61IVyXwEMOdvb(EG{X1bP#CbN zM#|kFCOC(i8|YXV5S_y_%MwdciBDbB$>B)38In_x1aM?;unI_4M$!TiDArV{202VY z0bcs#mzE^w=ca=5mx6*qW}1QqB+r*678UD3n8hWDC8@TyK|!HTuJOSk@t!U|t_o^u zh(ZZ$C!`qCwR6r-Nwu|g_IC`3clLL2jSq4Sj1TY+4guK>sx~3PPHc`NBiIpX4&r=r zidG~aA%!Bui<AXC!gcfwdQh@Q!r&ZWX`o|i2FU@iLOQoNUDqxrH7~s+115w@+bS5q z5{m+;6`@d^TB1;rk*eUF?--x}2_Y_Bs2-$X)V1?>hKeFlVAEiH6xE<)1e1W#whG9} zDmWlM%+bfw1=Tr;DP@Uy$*Bt9M5~aSn4FQBmkKWGLB2Ir04F@8fB-SUfnjKDrekPg z1Pcyu4G2j<(CSa28j|8MtLTF45>Tb7pr8P&vtTY(P{=FI^#@nA#nxQl>JVHI#+M*e zDCDE&L4AFNlG36)h5WQM1yCanVk?LhpP!Zns)j+?$k5nS$I!$O;vZ;*O$+BD(ksHn zBs&-s$VeCx-e!h6hGyol@P?RPkeHmET9Q_pmkes16vr2(7N-`KrFwvyIKi1!sTu{@ zB|62KRjK)D(1NNUu_VJlQ`Zn&w?ItEP0dX%sMJs^$S%>fD@d%&$xlp)Hi*?xg9H#* z2SG!Ka|*~>aI`8YD4<!VV5^`3POts}A)fwz@u5MU0gfRanhG{H3ML9QkZ6TC7>&g0 zKWGY5Ku%KH+6Ym7eTCfAlEjq6l0<NFH#9TQF*GxSB@l=e#CZy<{ewPy{X%`|8OBKI z8N>vqX(Izu9V0`-(KHQ7ZOA0nG=)gLh+-07nl>^p(J?YK7){g2A&X#B9LAu8jD#U+ z+So$J$ix^aO&6tt>L*a#)q+}+NHrya{vf>739bV{4MMQnL1QR|pgwPWT2X3h0JsWp zDosmEEz-y>P6wAewOla@e)$S{spUDDd8rDCB?_r|DGK>%3Tc@+klNkI*j&fR#0V*A Nknc=HokwMd0szAiC*lAA literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_rrube_rrube.h.patch b/pkg/openwsn/patches/07-App_rrube_rrube.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..eeb83065263e21b73633340d916004f10ef9d66e GIT binary patch literal 346 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|q|Dosj-ka`)MAsM9# zjs-;uMkWe|hE@iKR>tNEMh1o^T)Mit3Pm7OpxSlIGYg0}%FN2t*viNfVw4st-~zeQ zNXJ3}B+R9tpq!GLmYJ8T5FZ~D6zb#}@4>~TprEg%#ighalbDiHlAm6bUs|BxSWv*F qpb%3HB9MfOf=ZK8L1NWlCxgt@)z#G{$z11r#{h^C3Mf`0nGFERBw_0S literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_rt_rt.c.patch b/pkg/openwsn/patches/07-App_rt_rt.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..70c74e3943adbee122552eff2639df28bdb0589e GIT binary patch literal 4505 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|q|(Jv~|OXdv8C{=JQ zC{i#oQ7|;LGBC6<Hdin*Ff`%P)zwuf0_lfp)Gf~}AjS|gD^pV|Qxk|GTBv{v<T4|3 z9b*dxkOUW(f`Y!jEpDJtP?TSiUs73+TC9Lu6|xK$m!d*yQBi(Te2GF)NqkXia%yH- zs)m0-YF=PzYH6x#UP)19e2JDqZgIK}mjVuuoS#?_pOKoFl3Em>nNgyppnxPoKwEx6 zNoIZ?vNniFv8FYbf<jq-W(vsCqLTQM%-qx>4Rq1s)Vvgz{5+gaRs`wBhGD)2)0);q zgl%b3PG&NZ;R*_4E^wNFM4zs%t}YQ)kQ06R<zO$2xClh}8|;4?MIk8PAz^TiG_}w% zGbcJnW|k$Eq!OQOXp|$#%aCAQu>7b{%>~X);NXrgQOGYXNzTtr1!YqO1%=Ygyb=pg zB1|k#Ni0c>4tDhm_6+e1bB%X&c6RlN4{`Mka1C+{2@P_McX14H^l|lz1?M^i1%=Es z1r4xOkTOKq&N)9N)z;S8-!UNG+26%AKFBpNKEOXXL{p&}oT(r&Ky0QWBL)zOi;ATp zk{3xR6v4XC;{f5l0g45rJON^Y^M$#Ej)e&%U%*P-+~RayyPVX#^pXsi5Grk}U;s-6 z3ZU9e!8zYCKmn2txOAav!9f5K)3x(=hKeFlU{hdx6xE=V1e1W#whG88D>xuN%+bfw z1<4utkd&=ptKb?R9O~@s8XRm5PIn+58Y_U)9mv;67#skW<~oK3*g~Knu`(w=F(ukC zR>4-G2%1AI;prdZ^WxMJg_4X^ln?-CI0cmY6i*0XRZUa~IQ#pBxcY@)2?JQ5VbCan z0}dTaGaW+%BS`STl!Frh#okA5Pe4isnE5aoBTgyy5mMxWnBWLDG&IsNG(@z<z|9jx z+eD!n(nP{+J{4q_SfiGnFo!GPC`S?Ud8N7j;6_q0T2YHo0!vav7P_Fes-dBQj-jC$ zB(`8JEz-P#D1;C$fo2_?E~UO_K#_xlA@O8vsbgqrfK(P0BqnF4mZX*DC4-uq#qmX{ z#i>PQsUF})Yj9>&szyO}iB555Rcd~kMo~$8L1IaUfu^n@xV@>MppcuIn_N(-p;nMx zqH70B&jztNYB05U^b%(`$SQCKMzaDDwlJ2hf(Ez%^A8B|^!JPR@ppCvF#;SzJamyI zpjjX!GQd?+!Nx|xM4<+fJ{1%cFntP*GDHMvYeR+f^%auy^GZ_lN_0Ve3k67J1Tl&@ zzZq#lQ$G=Y!{GyT4;Vrnhhm~(EG&!=G_+*!b#(y+M7(1_fWLEyYe;ZNkgKCF)DTop zgR_URxsIWU1tfcb4I|E{nBh7EQjlM$Z+vKwCny08(S!o>0W`V0`3LzrhR`v&AQe6! zCZqr|Gt)6NH$*Ccic(8Ti}FC}trpb8ht(Ve`mgZLIk?dcYW{-LB4~`E5Y#`9Pb*4I z4FH#IPNivSsYM#O#p&P_SIZTn;FqtEms*~anU|`NSfY@cm!goLrjVAIlM1e`4b4n+ S49zT&k~o=eMAQRRb|nCvK*Co5 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_rt_rt.h.patch b/pkg/openwsn/patches/07-App_rt_rt.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..c37bb3813496eac6d791cc8cb9a40bea34a70ffd GIT binary patch literal 322 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|q|(Jv~|%is*jC{=JQ zC{i#oQ7|;LGBC6<Hdin*Ff`%P)zwuf0_lfp)Gf~}AjS|gD^p`DBTI-OTBv{v<T4{2 z3k8rcmx6+FN@`kWUaCTTd{9Wd2N#!ug1(j(m!d*UVoFL$etJ=UX@P=cK>?S7LQFM? iKoTwr0SQ!toe45gS65e;coUuT9Rncx6;LdLnF;_NWmww) literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_rwellknown_Makefile.patch b/pkg/openwsn/patches/07-App_rwellknown_Makefile.patch new file mode 100644 index 0000000000000000000000000000000000000000..e854d58293cc554123ffcccefd13a2ff10308d76 GIT binary patch literal 1342 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|q|PtD26&dV>))Avox zPEE_qN#zX5C{=JQC{i#oQ7|;LGBC6<Hdin*Ff`%P)zwuf0+|IhM7KP%fEWXP^YavZ z6Dt)AjT8)xtqd%!OpGB0YM}xykc$lzK!RYq40Vi+6m)fUb-A<^f<v8xL!Es6U94<X zG>S7)b8-}t5{pyw5_3}(R5YAJgIqj=G&S`SxwI9Oojm<qJcAT$6;w2WJpDtQ9D`jo z^^-F5^g-qXIfEt2Gjmds6N^$5wDgiSxwIAhoxH%}!9mVes(Q(`DjE<|G*$KTLGmuH z0l4H-G`Y07v=u!4oP9!FT!R&~Z54Dqk*r4L=@(ZP>u2UA=ai<TqRAxZ7p3BmN-4@L zOD)2s5hk0QY-ngu5ucZi!<6KLQvJlD-1y}D+}!*;9Ew2h%S$bR$$|n6-D}X`);BOp z)b(|A&dD#w;(vsqB#@$v%=8R=s*DqLJp(+P@hVBu^$aL8!>7bVHzdf>508rEqWt1w z-JHbA)S_Z=wCM$S`1?g#DZnFKMFXDJAQ6jI2Bg8?$qSS;I8`(pT{KlR9D_6!ijs?w zP4e}33H5Q+R8Y}?s0F1?g@V$Y9EHq0g_P8S)V!3`yyQxS%)GRGg|z%41+CPI%;J*F zymT!Ey?g~wb}Z)7R?vl|7qB^2dil0`&_t)Kker`ekeQRJkeHXEke-^CT9jClif%NQ zHo{S=dihogs(Q&>+6pj-J3E71=<Md>=pGDW!J=DJK|wcJK}Ab1SwS}+VS<X5UOth! zeSIO??ND^5fOI<)6lLa>q$w!DgI7tRMj<(|L_rr-v4Wj~eo1bDKB(l0&o3=eP*YRL zEkhH78=|76mjaGgWrd>D-2AdsXaFUaWaj576cpvBlqQ!zVm>)1H8IZ$<d&jb1>H1g OBq^w9xVQ#rasdF^J!oA3 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_rwellknown_rwellknown.c.patch b/pkg/openwsn/patches/07-App_rwellknown_rwellknown.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..5c0aa0fd59ab8e32b25dba5f41dabad503b74876 GIT binary patch literal 4232 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|q|PtD26&dV>)Lt^SB zbB1J;DmWGtDHxe37#dm`7+M*dD;OCVnsDjr>M9h0%!3-FTb@}!j-h5&rlwY=CJ;ll zPyrXn<t93Y1_~f?E(HbU%)I2B(v(yMC6KL!rKzQ<dKpS65(SCL*{LOIrFqFEnfZCe z=+Yp4#i>P^i8&w{MJ@#eeSKTpK%p$LC^IoBC$(4sw;~i7E-nRylFEYAl+-kZ;*z4$ z<PwEyaA1M`p{uK_i{f06d#K<Kq>#x>$xX~lOiwKWd5}Kd1H}#!21lErrH-*NB;E)H zazRmkNj@mhhz(^fE=7gZqN4nw_!0#~%8f5dO-{`$OV#i%NX-ibB@WlTlA_A^5-o+? z;&dG@1$-bmKd~S_BQ-H4wJ1I_qeM$V0ZD`yz4-;81c$5_B2uhr&847FmY<mdvL4B` z#i@BIF8O&lovR2^j}ybZ52iJ(LCFq(N-ii(%E?S7HW}O6+JXWZ>}(`AXXa&=XlN=_ zL&8#DU!kBVwIH!5RiPv!RiP-gIKQ+gIaMJgwK%ybv!EouNFgo12rQ?s2P$B6Atg+5 zeo?AIL1IY;#26&=%My!<^+4M7K+*;|sd>l&V5?A^S(Tcfrh%jbtWHzc5ERG?3dpGe z&8)J-98|M3N;C6HEaFSFG&R&P473L4Sx_Q2R{&>P+9cxqa&Y{O++>Uh0B}IiHz9*k zHz+YHaw&3wb6aMb2E6!;PfsoJEOv2pFUrp^(a^ND4G9W$)l?`-Eh#O^v*rR-9SWf0 zbr@#>q%s}E1efb3Mmna3M3?KCWr-!J#FsgsA_trfhD3%?sD`8(n2YmEOOo?*Q^94i zf`US3nt}#W9inUJoS%|vYwPUq7!dF5@8TLC<Qf?7?ivD0fv}QEUmsM8rj{r`nlTCm ziIq9|i7DX1$iz&?)RgGLh>Va&<VB?7aFEuiu&_tCnTDYcO8iI|oDWRRb<8Z``2Z4s z`uYlqDJjq*LIG0!L#j9h1!#=I8>aC^sl};9WvL$ECP#2)RjLN4kz%B24M|iA3ZO=d zt{pT5L>t6H>_8@M6~KwfKOn@@-!I<T-!H_~FC-)~z*WJ<M!`g(25vX9CLC;71&VI3 zA#QtpU0pzy#XANB_;~txyZHzCI)=bfKcs9dPAvgf|IYc20Sb`T72JC$dBfis(_OX- zhKRsGQ4PvT=<1<?0nJ&#pgaZ+4<rXclL)#_1m9M{H9k1h+1WKX7}}nwRY=V#PK7q% z%?x$Sjo>*DqHSQ~+%MD@7VnVY9}+Q-+_Z)ii;%EHkTi}=q|6Lrf-|(ak&d}JBtwJU z0jcN}plJq_9BM(;6R6FA+{z@-iidYoz?B5NsE2p^;?s&!Qv<+#R;SXmwA3O{DFE&< z)N;ir_~k3)rIzPp=A|kmmMEm=r6}a5DWqlQq=G91b5k7)14weDri&3pDwW*~0Nomn AumAu6 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_rwellknown_rwellknown.h.patch b/pkg/openwsn/patches/07-App_rwellknown_rwellknown.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..000ac9795168fc72cbce84e0150dcab78c340c56 GIT binary patch literal 680 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|q|PtD26&dV>)Lt^S> zaE4@*DmWGtDHxe37#dm`7+M*dD;OCVnsDjr>M9h0%!3-FTb@}!j-h5&rp8uAmJma= zPyrXn<wiOd3Ls%F1qJ1l)U?dJRE7BXpm0|oA8$YZaKCsDE-nQHeJw36MTMBel$4VE z^rHOI0tLr{0xkuGm}(G#BwQ4pnv>%V@+U~58te^_4Z6Czx}@9SobMO_F-HN#a&%ij z?nlC4e;JzT7#Tr)2J(QuEpDJtP?TSiUs73+TC9Lu6|xK$m!d*herAdSB3|P&^D;{` bG_7I5rJxW~3-&(5A>aU@qeDQhLvsuOI-<Jn literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_rxl1_rxl1.c.patch b/pkg/openwsn/patches/07-App_rxl1_rxl1.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..0ff35576cb84ab7c4e1a0645242ab44e7f99b528 GIT binary patch literal 4314 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|se$T0*HddZw28Knx2 z1w{%*CJKgzRtAPv#^wq}28JeFy1KdwMIbYvnsv)F3y3wy%*xc%%G3m6kQOT70=dx0 zT*uf#0VKi2rJ$g%Z;Kl!6cpu`<d;+yq!ugSR)s9X#igi_T2z!@6knnM@@jlhYI163 zS*nJAL26!LX=-VzYhFoFWqgU2LT+)o4wnKBker`b5TB8nn37r)pP5mjrJ#T$LO@%7 zK}lwQ9<nxwNU^3hmx4lBer5{DQn2evGILXlG%&@BQ}a?>^7C*yTM=XeHVpGSnAWr= zB7{qmax#;N3|&x2bAeL_BocLXb#;lbf}BXqF9&;JghnI6_ux>VQAC3BAQA@WPBQ}? zGfSd#XJ%PqNh<M)hi18xyvzyK1<RWX)m-3Q1rG4|5{3NIlH~l{R8W>xP*5n%%qy_~ zCC0?^l*E$6=wMgBV9yZGFxPlTXJ=QR_z+j$0M{VLkkBC4co)YIM;}+eSa9xBP*BKB zQ_uig1u0K-?VR&dQf+OW{T&11o&8;0<AYoS;{*JILo^kt!I=vZ2gGJBGU5P{yuhUp zwaQ2&Pm)kXf_0(C0>Xs@6c0%G0>lL84GUu(3uxYemA$#e>AH3~sd?!o889JK+E&2; zmJSp^wVi@<zGHv_Bqea^Le+wU03xPq=kE*^MWVo_!1yStL1_sl0i$gdkkeLhKzx{^ zkEaWgGx8y6TftVrH9k1h+1WKX*czPjKt8lk0H-{VuaPh~01OQbbqo#6A;kmCw%pX* z<bp~KHE>WABv$6+C#FOj#OkOOLGy}5td0ew1cPYN*H<V`Em0`RNF9*CaQ62LarFzq z5*!fcVIeWX$<V++$I!qOPe>V>=@=RrK|%^v>w_~Jw8~eghO|8}+a(3rCDy1#5yC~# zh(jxs5b}AYx&GkRM=?$%uvj6o1Oqh%4Gm3n42=vRz9rW)h#ZY@F8#fOl%hdQNUAn5 z)-g0Sfy5QqaRrIV*{LOIrFqGqmRxasQEG8&QCX@7xIGx0S(U0$kX@ovoLQBcpQZth z)q=#53<FJFLvT}0K|ukQDGIVnbnQ?wMMaKbJXkee{lvKdWF5HDLbC?!2^7LsK?7VS z_y>e|`uoNE_&Ym-7y*tU9=ga9(997M8Q`j^U}K|TqEG`#rwR%R*!&AkW{7mBtqm2@ z*H=i+&nrpIE71it;1wVxJj5{Kd}pKy%?CvI4u>Dmy<iA+9EypCu_!?W=0J;3Uso4U zP{cb11o%6LxP}CW1i3o;LJdLnG&rM}80r|B8bLA&*c{?~iY;V^NJ{bx^^Fe=@&qNM zA)8=8et;%?H~%1C#}GOu8&D~PgdqizxuK4sxfxP{RFqm$T9gM$ceS84G`J55E_VoY z6ybegaH|&7z67UAP`ADi)ESOXD@sib0GD=7rD<uYMH;!q>EM)C3vLe>npx@?nwuac NXtG^`DF4ZD3ji5FlX?IE literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_rxl1_rxl1.h.patch b/pkg/openwsn/patches/07-App_rxl1_rxl1.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..8ec3b84e03ee28772c09f6c0d6148a1120d0453b GIT binary patch literal 338 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|se$T0*HdKsJ{8Knx2 z1w{%*CJKgzRtAPv#^wq}28JeFy1KdwMIbYvnsv)F3y3wy%*xc*%E%I8kQOT70=dvg z$3g)l%%z~9oRXTBnU|^%A0HIqV;Jwj#igL2ucgJMs1TEwl2VeNUX)*2px{_gz@?xN nQw<`Jgo`443_(KGVCRBN)z#J2CB;<de8&KY2?{6{B1{GVFK1n2 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_tcpecho_Makefile.patch b/pkg/openwsn/patches/07-App_tcpecho_Makefile.patch new file mode 100644 index 0000000000000000000000000000000000000000..56d5d606bb6f8632551d454e2274c55fcfc15f11 GIT binary patch literal 1336 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rSE=Wzz$k+Ex%uY?q z%t_@8$tYEDEGSYiGEp!zv@$TXGB#H*GB7mZ($&>fC;}M-H9@yLvw)y!zWI3yzKN9z zhDHj8##RQFRwhOe)3i_l7s#y!3LrtSMTR=YMhd#Ry1HE23c;aH!J$sR{w`LwDjLNZ zsW~|cNr}a&d5O8H3Mv}Tp+PR5L7JL+iCo$W%1)ksE}lUOwhAg5L7x60PL9E@n)*qZ zdHNu8f}Ft;<(WAt$%#cN3R-%}nq1ln{!U(C@!%k5D^<N@TNMq6DVnN!`5<{0*8p7d zDVki`T-pkre$GCjF0R1}+O`V1o=8@s^7M-<i}f?}l5<K^Qqg3R^NUh(NTn2ImZcWq z(g>4HPBt_&sEE%?$6-oxL8*RXQEq&4er|4l9u7qy_vNLQz+^#zhVC_JaO)cwCF=S* zI_Kn<WAQ&iQ4&Z|MrL{jK2^qvx}E_Z&Ulq1>3Rl~nc-7nq8k$A=!Zu|a#4P9v2IRc zWol6|INJ0AJpBD4trXx9uA%`?YmkV=Dg)Bs@8kta8k{N`jxL%i8jeAl3Ps7q$R_#v zyM+3<YAUE`K-7X#r$Rw#PL4umo<d4$L26z~YF=`sLS|lCzCv1lk%CrgMP_kHW?s6M zf?mD?C@&UsX)EZ$(hJxeE4_SMJ!qm+R!GjzEy&DCRY=TBQAkhCOD#$)NkuoBOB>-R zRlR&G1y#LdE^P&v!=0T$E_8PDadZy`v0%}ysi2^nte~Q$m#m<hk1#<+OD~^D-M+pM z?RF@-Q$V^M3W_rGO41aR;K8e;P@|BXSfZeds#w8JLBAxoKp#}>#OIfmD5$9^<d&g{ z!3|N-(n|rytFl5-YHog6Dl~u+OEUBG6bg#+Q%aLdATghulbV=k1#(MKu7YkFG?Ell KG+bN*G`RpT)@6bK literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_tcpecho_tcpecho.c.patch b/pkg/openwsn/patches/07-App_tcpecho_tcpecho.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..051f6e718cdf149e0b5844c6f33b455be6b47db5 GIT binary patch literal 1388 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rSE=Wzz$cNE-$($h> zr3#J(MG8hH3WkPO28LF~<_bmzh9+FPy1EKQAd{d*=$2;|kY=2jm8q$fsR_h5EmXh- za;>3(j-jOjNP>$?K|x>N7B^5RC{4=AOjf|H0$qlSOHrXLKQl!E>gV{(yvz~}O@(SM z1%+CWWKw>94qUQ0Bfm5!#WN?fxFj_Xs!BmYp(wSav?xy@Bq-F?8ln#rED(3=>gwv! z&D|iM5a)J;O04b&g*Flf$Aht<j<Go;9uz>J7UEU3@GDNuOL581OV#i%NX-i@O)X7z z%_}LYj4#nr$SqFSQAjN+$}fs9fzS}QDky-YbnWuX^HPfxY!#gSeFOacT>V1gL!1L# zojv?PfvTXOkeQ~Skz1UuYnNP<npl!wq-cww5^kV^f&wT-7N-_vCg#K!6lLa>xPolf zz|f-O8Wa>C>gO5};OZRW>JlI9>gVF(@8_xmPTLSqgCh~-X9e;+onJnLyp0s^ASO8O zO^kI+jgaCV6t;z+$c;}cN=*$&OwLX%aVkwqODzJ$kR~X?z_|yM%;32vIX^EiHMs<w zIv^1RR)dnmQc{yj(*r=!g^|779DRb3^B2TTh^V31O;}?IuM<JugZKoIi;$cN0IK<q AoB#j- literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_tcpecho_tcpecho.h.patch b/pkg/openwsn/patches/07-App_tcpecho_tcpecho.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..ca12822d17e53546d6c7f6ac275a3687df9f7fbf GIT binary patch literal 1076 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rSE=Wzz$cNE-8Jr;* zr3#J(MG8hH3WkPO28LF~<_bmzh9+FPy1EKQAd{d*=$2;|kY=2jm8r3nktM`9EmXh- za;=e$g#t*JOF=<7B{eNGFI6EvKEye|)!D;8-h+!vK|x<ji%U@<CNU+YBtN|<zqCNX zv7mrUK_R9ZL?8*5Bp0|QXXJxKtHDkOnXRj<t4pHUA<2Y|2RRuDgS}#CrekCd@eIh> z`nI@%LP1e}Nq$LXL29uAZdJ%KTwIC@W%-#Y3ef0_&&<m#(a^N!QdCIF&(DDi7iZ*` z=A?M$WEPjC=7HoDP_-4MCZ}eWrE2&Wq~-;drk19<=9Lsx#+PU*<QAucjYF}eI5jWD zB|i^`dL4z-qN4nw_!0<>sXaMAFE2H@1Z)CW7R9Y8sY#{j0Y#a4V2^;pOiK$Cd$r)$ rg9Ily{y<Xn2u_gKF`bDTq);`q4c7c}5&{;RVqD=2bv-CRVPOpbPrXK{ literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_tcpinject_Makefile.patch b/pkg/openwsn/patches/07-App_tcpinject_Makefile.patch new file mode 100644 index 0000000000000000000000000000000000000000..7cbf6c5efe601199a9b6dee060d9955670cf2278 GIT binary patch literal 1340 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rSF38NwN=+`&_f5=B zP0P$l<qXLvRd6gQQZO=6Ff_C>Ftjo@S1>X#G~v?K)m11083i>%w>-0e2=jdN^Avm& zD-{fl6by~63@oioj3DM|p#m<Ddkqvof?%r*b&QP^bai!gxwI96L!E*{oqYXWtZY>@ ziZfDkaukvhi&OIwb5j*mG@L_&Ts(s`HT4p?v=x+{JpEiegA{BPR5XG-{X?7_gIzWC zlQQ%4LFNQGgC)u{b5fEMi&7M{^pZ8Xv=#iFyujkYLC#jHddapb8W2-7RrT^g@-D6c zxa3nbxwN^o6+Hc%eL`JagB7%G6?8q3tVZSO7grYRXXYj6l%}Mj$t33&rQ(oEDatHM zEyAS{CYzjWXlPIopO=oql;na^{luc&_~iWD-26Noia_qmOD%!Pf&vZQYtZ1<H!w=n z^>uX4$uGy^e}tkWkfMyt^bCBej1zS|13aAZDoN7y3@9_hr^G}zB*@VZkBa1?{NiHW zoW#o1qGE8g=>>TB`$bwQz$08m1D@6(5sOs@q`}|G3zRfCRWux3G*vVlgESS2l8cc| z^7VHK^>NiyP|<*>1*J}fg3_EEh0HvKl+=RMyp+_u<VuCiytI6UwEQ9kt<;Ll;*!j~ zbS(wFd<9T$EauWy(1oQJusK$G`L=q{M5nBfoS$2enUkuJn3tlEo|>0hlvt9AZZwxR z!cnSv`Bn<5ddXbc3NVK|JA+*4?B?U>9t>i^qFYlzK{r`JMN2PPK{p>^f{K=2K9Rb8 zeIeTIP;{q&bUPFjW#*NnDJa2%S4p8pAvv)`K^IlAf}MhXNp68YsNjjuFD+3}Q&Y$- zLlc7=qN1gj0*+T@g`(8l{IXPN040`W=I1FC6y>LsCYL~BJ~<~fG0zI*mZDq*-85(< NDX3_;xCUr)0RSKEXFdP` literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_tcpinject_tcpinject.c.patch b/pkg/openwsn/patches/07-App_tcpinject_tcpinject.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..6f41d3e1e36a522afd948518e643c2a9b69a8f59 GIT binary patch literal 2961 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rSF38NwN=+_7u=J8S zLo!Mg91DsRj7$^^4Xq3et&GhTj0_A-xO8=O6^cNnL5<NZ&nzI_NHZ%_Q!7&wh>=>T zfD7bma~)%21&}xwmx6-6zAbK`P?lJfnV6K5TC9Lu5sC~Km##udWkG66YMMfENl|HX zi9$7(u7ZMsf`373USMfzX{u{pNl|5di55t(AiKmGBAt|<p92y>!NsY0DVcfcP$i&H ziBC*PDT*&asLIGJc1%erN-Zvisw&OQD={=fR-&Mwkdav&kY5D0t5yLXEAeHCMaA(T zQ7#1xQ8WQ-!huy#lwXn$@;tGjMTC*1NjaIx#0I{ttt}UqqC#1IW(tz)GxIV_G&B{e zxfB#?LDJxmMub6eMt*5dif2w{aY<?(RGor?LQ!f-X;Geno1;&#t2In3n#m<and#}N zMF>rxu(yaWQOGOJO-e0_PpT|QEsjqs%Fm6@%qu7@iBBp`OG_;R8K<D208@-C6>Vq{ z3zgQ_PfsmTNY2mAP0UMC02u;KLcys;nTa_H8ir<03Z4OFW(p~(#U+_}i6xo&c?zJ! zky>1=qhREOB3_VRRH6yaUgkPRW(vBxy1InJo{Y3V+*1)K{)tUV2(=`pCKQdZL^3#2 z6sQnI!r;=?#8k)B5K_E?ODRyPRgzo~pPZkUmzrFnp@ztMpyEdlQGn@S%76+jopA4f z_z>rScuzksSLYB-Q2qdCWKcjM<#VV7F8O(>8mUD^`JiGFOhaN!K|vuiO#vcfYwH>x z9O~@s8XOFlR6tL>dIi}f3bqO$_ZNc7?fCT661Sq%)PTg~?9>t`a8}lE_V*3&_jC0N z0l5&#fncwLEkyHFL3W9)tzW2*56EIrg=cJ`V`2iyl3-0B`{*8C`Q_k{iZ4+B(;&Bj z9W&@c3@NpNnBWv=ZlYshfRy5DaTM2}+7z5RFstI+;&dH|*D-=1w>VwbF26i4wMfBM z0ZVj)k|Q*2ft4l~r6!i-7b)6eQ40@O1qE=rDh3zk@dZVhc_pr(B#SLQ>9__3#fSR2 zMg+Jzhq$`L2fO;YxcK|I>VOM$GjkntW2EFmuIF*30I;71r}se#011QBf`x^Sr3ox8 zpcN2BsmZCCWvLoiqaPAA;Bp16fsm4#RGJ<DiXucskEL}0%F7mpIu_=z$e_CIAOj)J I#9E^O094O*-T(jq literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_tcpinject_tcpinject.h.patch b/pkg/openwsn/patches/07-App_tcpinject_tcpinject.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..89e7e8d30b40d02a3502e97a3856ff4558b568f8 GIT binary patch literal 1703 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rSF38NwN=+_7u=FxG zLo!Mg91DsRj7$^^4Xq3et&GhTj0_A-xO8=O6^cNnL5<NZ&nzI_NHZ%_V=H3=h>=>T zfD7bmBOMC`kT92mf^te~T4r9VLVSFPbAYFxm#cF~yayMTf`Y!57MG$zOkzq(Nq%}! zerbV%V?hCzf<jC+h(Ho9NiOgNdl4jF4fX=ad|h2#U6RcYNhZb$kkgSc*h_{+Iz~`W zfgG=IiyJ7ER2HPBq^2q0R)QwO#igjAkJreu#G=f^q@2`ZVhsfcF<v7Jit<bHK~5#s zOpq(f@-tHu;E66iGcU75L(`f|Q6VWmKL<&oI3vF_C&e=-v$!NR526B1Ye`XNdU|RR zR=MQ-yu8%p5|{kERE^Z4qWq%x5(O{~whGOl;?%qpuuA`e)V#pb)Y4Sfypp2I_!2FJ z+~RZ{h(;s>6co@5C`wIE%`8jRz^Wf?Bbw(@Qj<#41Bx>9z<viM2Q4j7;;aQHPD3Ld zV^ali@&rlYjRR2dQ#qyN=BJeAq$&`fV7L^y6yZs>xTL5wxkRCwOHn~VK>;&F6ciK+ zvP(b_uAl&kbC5b@42q7-ymY7%P&pHyn34jDLAa`n%worsl%mw)VyLRp%)Amqv-lFY z3J@bBvp68X2y9m^QpzezEGmvKv8H4C1|=74$pAHt!&QM8NbZHDbC59D6c7VR9yzV& hmxEI|Qess^PpqKe#h2PKji73J2RU9768Nw*4*(Dc_J;rf literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_tcpprint_Makefile.patch b/pkg/openwsn/patches/07-App_tcpprint_Makefile.patch new file mode 100644 index 0000000000000000000000000000000000000000..eabba9b048e0a38502d9eafa4ffa7e5e16d5d100 GIT binary patch literal 1338 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rSE+{C<%q!9NP0UVB z%gjmT49O@}a4aZNFfvgvG_*1>v@$kVFfuSS;nLOBRVV_P1T{jpJhOnXalZL^3ciVz z3Wi1shQ?L~mR2T)5aYB^0T;-%1_~fSuuX<K#zqRdy1Ket+6uv;PQjs0zWy#&wkjIM z8L2rr3Q38@sd<UHsR}9@&Y?jro<W+LdWl@x3d&BNelDIt3bqO=8bO}^Ax@6LuA2Hu znR)skbAp_~66KjWDanaNDGFM8$(mf+3jR)BVDaD}XDd~`WLp&th$)(?difxE7uNt> z@+q2J+FaTSo_@|gp)Rh$3fi^`x}Hc@qw@5ND~t6r^OAE)Q&Q1nlJkpFaY&^UWtOED z;nE0`O-?p6G^mKrOUGeKazUwnVo`2<a(-@ZejW}*Aot~^mcV2|frjoiXmINr7$xfZ zIy&d%mt*liLQxV(QATEZ20m5BiMpNv9?p1`B<Xqvl$qgEVxk)o<miV-MRHMoaj|Yr zVr6PkF*w@v0zCZvBCQnQ5w4;EPiv5f#VP~R;P2!GN*bIh8jdcSDjJSKnhHh9#mFZ4 z`n!bsxN0h>Xh770Ql~;eX-<wpW}ZSyYC&pVN@`wmr9x(2TE0SBevyJ!YDH#oNoHQU zmV#cs0w^;Ub7?E+!qN-a94oziTRmu^Q&vdM&n?KzNmWS9OHoKq%}XsxEJ;N-noAqu zC{?|DD+N`(WG-z5n8Tf&K`wN5^Ko<!2C-n#t*M}(o2;OsrI)Orn~yL-MN2QANZr1^ z5bbs-x>G>99l&Kynt~EMc$E}t6p|B56m(G)E7&RMm*f`cgUX%w{L&HyH8q9YGBh!` zAu3vWDd2cjRwzo%%`Z!Z22f&2W`3SRK~a86X>ti9=96<$6Z5P<ZYj!D&`pCzl7fnc Ji)(-;7XZ@-W}N^4 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_tcpprint_tcpprint.c.patch b/pkg/openwsn/patches/07-App_tcpprint_tcpprint.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..e5edc9d02183564088dc45c250694f05fd4de1e5 GIT binary patch literal 1045 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rSE+{C<%qxL2^pZJ4 zGD;O33yKtsOcV?atqcsUjLj8{3=B=UbaizVia=&T4bd&nEFjfDGb>Y5D^nAQfm*15 z3*=%$106$41&{<6mx6-6zAbK`P*9qblbNi5TLrod7nh<!S$<}U0?gm>nR%Hd8k!2# zTnY-cAlan+{2YXAaYlY=PKswvW^qYso`xn!m4bpoQEEwPQJz9bP^halL?0+*AP(2n z)zzh+!$E!_((z!WI6VLgZzK$k2_q97V>3uhD1ZPc)(cBhOH<?1ic(Vp5|gu2OPos6 z(o%~wa*NY7p+SKjz{&Y}d8x@IF8O(>8mUD^`9<+13Sb(^-5|Fi1$t^;3Rt;+L26zg z$U@h=lA_A^5-o+?;&dH|ZY-vtMqNs3QfYbsC~ZTd7ZGu8jy}Q2F$eJ|IOah9RG{3W a`Q>0QVsRvCUd3$=PS1iYfCMd84+8*=3pgGC literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_tcpprint_tcpprint.h.patch b/pkg/openwsn/patches/07-App_tcpprint_tcpprint.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..c0c10dcf0a62d4456d0984fecfa0ccf9faa59273 GIT binary patch literal 1109 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rSE+{C<%qxL2^fEX@ zGD;O33yKtsOcV?atqcsUjLj8{3=B=UbaizVia=&T4bd&nEFjfDGb>YLD`NwQfm*15 z3*=%W9Sa4JFqeXYa!P7iW?rg7e0+#=KtPbEUr4+M7ng#9zLpl3qC!k!N=iw7dQpC9 zfr4W}0hfY8Of`r=5-v$D2mtvGBwP)4KFD-kU0q#LO%F*X!UB-9kucahhGsfO<`55o zT&{168z>YM<(K4_R2HNbE8tdzEW^d6s8E)lnW6xT#`w&<%n}VvYc55Fr2PCGgm`gA zerZmMXHI5uNopQQfdZPwqSWNn%(7Gs|AN%Kz|z#xRM)(cqRRLZErs0Tbg+S_7A5EB z<)tQ<xa8-hYNQqw<rl@5D1d1!YKv3zQosta8m<G;hoT?V@hPcErRm^^1i2g(j9OZt zD6IuYDI|o!kqVNcO9+F)0_;&#hoXiuR1q~pI=>to#wcM0vIZ%l34}E^6Hq;Y6xtx8 OHLYP;PC+52mJ0y=a8|zn literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_udpecho_Makefile.patch b/pkg/openwsn/patches/07-App_udpecho_Makefile.patch new file mode 100644 index 0000000000000000000000000000000000000000..ec9672ff28796422a52e3c37670b9bf4143edda1 GIT binary patch literal 1336 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rWDM(Gu$k+Ex%uY?q z%t_@8$tYEDEGSYiGEp!zv@$TXGB#H*GB7mZ($&>fC;}M-H9@yLvw)y!zWI3yzKN9z zhDHj8##RQFRwf1z)3i_l7s#y!3LrtSMTR=YMhd#Ry1HE23c;aH!J$sR{w`LwDjLNZ zsW~|cNr}a&d5O8H3Mv}Tp+PR5L7JL+iCo$W%1)ksE}lUOwhAg5L7x60PL9E@n)*qZ zdHNu8f}Ft;<(WAt$%#cN3R-%}nq1ln{!U(C@!%k5D^<N@TNMq6DVnN!`5<{0*8p7d zDVki`T-pkre$GCjF0R1}+O`V1o=8@s^7M-<i}f?}l5<K^Qqg3R^NUh(NTn2ImZcWq z(g>4HPBt_&sEE%?$6-oxL8*RXQEq&4er|4l9u7qy_vNLQz+^#zhVC_JaO)cwCF=S* zI_Kn<WAQ&iQ4&Z|MrL{jK2^qvx}E_Z&Ulq1>3Rl~nc-7nq8k$A=!Zu|a#4P9v2IRc zWol6|INJ0AJpBD4trXx9uA%`?YmkV=Dg)Bs@8kta8k{N`jxL%i8jeAl3Ps7q$R_#v zyM+3<YAUE`K-7X#r$Rw#PL4umo<d4$L26z~YF=`sLS|lCzCv1lk%CrgMP_kHW?s6M zf?mD?C@&UsX)EZ$(hJxeE4_SMJ!qm+R!GjzEy&DCRY=TBQAkhCOD#$)NkuoBOB>-R zRlR&G1y#LdE^P&v!=0T$E_8PDadZy`v0%}ysi2^nte~Q$m#m<hk1#<+OD~^D-M+pM z?RF@-Q$V^M3W_rGO41aR;K8e;P@|BXSfZeds#w8JLBAxoKp#}>#OIfmD5$9^<d&g{ z!3|N-(n|rytFl5-YHog6Dl~u+OEUBG6bg#+Q%aLdATghulbV=k1#(MKu7YkFG?Ell KG+bN*G`RpeLS=*i literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_udpecho_udpecho.c.patch b/pkg/openwsn/patches/07-App_udpecho_udpecho.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..7a74d19fe79a18edd76d58aa41e917ed66485ba3 GIT binary patch literal 1281 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rWDM(Gu$cNE-$($h> zr3#J(MG8hH3WkPO28LF~<_bmzh9+FPy1EKQAd{d*=$2;|kY=2jm8q$fsR_h5EmXh- za;>3(j-i<XNP>$?K|x>N7B^5RC{4=AOjf|H0$qlSOHrXLKQl!E>gV{(yvz~}O@(SM z1%+CWeJGMesmZCCWvLqe1*v&~rKzQ<u6ZRzmGLE73c1DUAWfj)fVfvzS63ILpDykN zITB<&S#Ab}ED{EXxrvF6sR1O+6+oaC5*%n@Rh*ia;*y_-BRq5zQj3c6i{eWlG{k)h z3ZS6UwaYKhOD$5cRdDwA4e<AK^$Up)bqR2F_VBmn0@<gKnWmtTTb!<Imt2&ZSdw3) zXp5l|ZlHpK0x0zrrxs-<=EN5iW#*N*f^62n(4ylS6ciuo=Nb{<>Kx+g5+Cg9=i=h; z=c)rv#}H40BM$5a@;seiK7_oD6z?D=IPOhNbj*<B9u&5Ppu`@ZR+O3=keHmETH;ii zmX=xsiXlx<gw=wwQBr<>4m=yBq$ZW72Y{jinwb<76pB(yN{jLo+#G#^U7@-_`2}Jh OBG@Ul50M$L+6e&tkZ^4P literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_udpecho_udpecho.h.patch b/pkg/openwsn/patches/07-App_udpecho_udpecho.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..556763163c5ef622da870cd3a263305fe81d3791 GIT binary patch literal 933 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rWDM(Gu$cNE-8Jr;* zr3#J(MG8hH3WkPO28LF~<_bmzh9+FPy1EKQAd{d*=$2;|kY=2jm8r3nu>r(5EmXh- za;=e$g#t*JOF=<7B{eNGFI6EvKGY?^)!D;8-h+!vK|x<ji%U@<CNU+YBtN|<zqCNX zv7mrUK_R9ZL?8*5rWCj)XXJxKtHDkOnXRj<t4pHUp(%uo2RRuDgS}#CrekCZ@eIh> z`nI@%LP1e}Nq$LXL29uAZdJ%KTwIC@W%-#Y3ef0_&&<m#(a^N!Qa}|hN=;79EKAk! zFG$S`EKMy<b<Ha&s*EquQphb%*R)1Ar8qS&#U(!vhk6}_)S{yNqWBUB4c4BNpPvJF zL`rH>X?j3WW**onAYW@~fx^EQ9R8310mlGHiXH(13L=^ZN`5)<!2)#<$p5gQ0RRJf B6NLZ( literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_udpecho_udpecho.py.patch b/pkg/openwsn/patches/07-App_udpecho_udpecho.py.patch new file mode 100644 index 0000000000000000000000000000000000000000..f3b6eb0764b7dc71e5eccaac13e55d7e6544266d GIT binary patch literal 2113 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rWDM(Gu$cNE-1(lp3 z8Knx21w{%*CJKgzRtAPv#^wq}28JeFy1KdwMIfV~X6Tk@7LaJ3nU$%rm9YWDJS|kf z1#+*kj**!HNSsSSp(wSmG_|-yK|w*mRzayCKNF6WxD*s}D;-l(ic*V<L9*)V3d*^u ziFw5e>WMiy>R{=B{35Vk1zQCpLsK&gE=7fm%wm`(TLpC^0|P@V6LSMA6N@AZtK_tl zR4YRhLsKhDBLf2~LnEtHGvg$XQ5l)VFtcnG%()b~6ch@IGV@9lltNOAOEUA)6-rYI zT$3~M_4M?VxVRJ*iu04RQ%mAA67y1WQi~L9p#pjkaSaHi=jayi>E{|^rUT^%`#XEb zySN8A`f6gBp;w$*Qj(dQnqOL?VTwgMDKjrcLjxWpI=Ph~7i(fsS)7`eQj)I$4O<-z zM3Cq}{R!3u^<YdMRH1^BHr#Y=B~>Nu;*uf_s4dz`3c7X*O4<mc;3{B7aw$TC3~HRV zl7a@rjGWXwm}4|GwUrc-Doav}HI=v&6-tUKt+*6Hv0s#0kW;CXl3835pO}(@2vArE z>lLLYm!%cu=V}-l7@2@Pom!EcT2KNDcWB5#O@n(aFJA#{GRU&joZ?h;d9b7c#F=o* zqYYv;;od`t8iGV2!GJTIAfAC(4>lV;6bf=G(ZT?dG~oVB&dD!M)zIVuWsb!1_{_Y5 z(h?1&n7jaRJ}62pDJ{xVD9Kj<t5Yb+$ShVU&&*57F9)SeO>hP_)-g6x(ACw|1(`wP z43?CXlw<|ZQ%P0^#s-E~1_r5?*m9LZacOcgD7L}b-GEC`AuTa82T6cXu1m`=Qpi-u z%u^^z%u7$zFf`CajZjcIr=X;utpG~8nV?jnpa4xFumC16t6~^~ky|lU;K{I<iiym# z3h)r3Vzz}FN<z+6P(aGO3ZR0V)cmWUpnxw6!yTm*lZTv(A*ltFZfrq>wjm_TA!Tl4 zo!~r3_52OD0c<?sEDmuqDDm5Z2$-93<$P^uL8=5&466NLDH_DrRM1vXg5(>RFen@} KL3y2w@&W+435K-* literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_udpinject_Makefile.patch b/pkg/openwsn/patches/07-App_udpinject_Makefile.patch new file mode 100644 index 0000000000000000000000000000000000000000..8d9116ea862941d45bca6614cd517c0b50e5008a GIT binary patch literal 1340 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rWDag#rN=+`&_f5=B zP0P$l<qXLvRd6gQQZO=6Ff_C>Ftjo@S1>X#G~v?K)m11083i>%w>-0e2=jdN^Avm& zD-{fl6by~63@oio3?Sxdp#m<Ddkqvof?%r*b&QP^bai!gxwI96L!E*{oqYXWtZY>@ ziZfDkaukvhi&OIwb5j*mG@L_&Ts(s`HT4p?v=x+{JpEiegA{BPR5XG-{X?7_gIzWC zlQQ%4LFNQGgC)u{b5fEMi&7M{^pZ8Xv=#iFyujkYLC#jHddapb8W2-7RrT^g@-D6c zxa3nbxwN^o6+Hc%eL`JagB7%G6?8q3tVZSO7grYRXXYj6l%}Mj$t33&rQ(oEDatHM zEyAS{CYzjWXlPIopO=oql;na^{luc&_~iWD-26Noia_qmOD%!Pf&vZQYtZ1<H!w=n z^>uX4$uGy^e}tkWkfMyt^bCBej1zS|13aAZDoN7y3@9_hr^G}zB*@VZkBa1?{NiHW zoW#o1qGE8g=>>TB`$bwQz$08m1D@6(5sOs@q`}|G3zRfCRWux3G*vVlgESS2l8cc| z^7VHK^>NiyP|<*>1*J}fg3_EEh0HvKl+=RMyp+_u<VuCiytI6UwEQ9kt<;Ll;*!j~ zbS(wFd<9T$EauWy(1oQJusK$G`L=q{M5nBfoS$2enUkuJn3tlEo|>0hlvt9AZZwxR z!cnSv`Bn<5ddXbc3NVK|JA+*4?B?U>9t>i^qFYlzK{r`JMN2PPK{p>^f{K=2K9Rb8 zeIeTIP;{q&bUPFjW#*NnDJa2%S4p8pAvv)`K^IlAf}MhXNp68YsNjjuFD+3}Q&Y$- zLlc7=qN1gj0*+T@g`(8l{IXPN040`W=I1FC6y>LsCYL~BJ~<~fG0zI*mZDq*-85(< NDX3_;xCUr)0RSpxXFvb| literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_udpinject_udpinject.c.patch b/pkg/openwsn/patches/07-App_udpinject_udpinject.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..340791e7fcff9f81a1fc414828368dc06c928b57 GIT binary patch literal 1487 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rWDag#rN=+_7u=J8S zLo!Mg91DsRj7$^^4Xq3et&GhTj0_A-xO8=O6^cNnL5<NZ&nzI_NHZ%_Q!7&wh>=>T zfD7bmLqi=S0|k%-7ng#9zP>GPpioenl#`jPfLjH+3>TN8LRo%hiUQp4@tJv<B^sIv z)m#b+wOFJ}iZavFQ;VP~6ciNv3sUm}OH)fzUGqwcD&tGE6biCSthp3GpfoeD#3H^# zA+IzyDYYm*sj?)sI6kc?KQ}%zub{LfKB+V<Ewu<uF|t&&p+&4UIHV!LpsTB^OUGaU z1r6b#K&YZmaDdVR5(cLdQxhFCXet2(yh1IG=qpamOL581OVz-Pw%p=$9fj1QqWq%x z5(o|Px`Kj2ZgIM<U4D69YLSAig0sJGfWM!sUr2nYOMs`Jm#cFKGzK%%6g0p}lZ#Rl zOY(~pZLz3@8>*n70LnSVsYRKIIq?NWnRz9yAlo&tXwq>F3W^W)bBzdabq;ZLi4S)5 zb8+$abJYQ-4T$H#X@erq=a&yT?<1uH5EGmh%q(=wO&}!(I5<F|TnNgc@o7b=sR4<} z*{LN?;G74FElp75fpdCNetr&8L6DM~RGJ<DiWWp>FG?*bEy`1HbMy&zh3W$pgAf}L N5kR?(D0vFgRsaYgw($S} literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_udpinject_udpinject.h.patch b/pkg/openwsn/patches/07-App_udpinject_udpinject.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..aa83f22d872aac54be989b2b63a7aea068a7ecb6 GIT binary patch literal 1025 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rWDag#rN=+_7u=FxG zLo!Mg91DsRj7$^^4Xq3et&GhTj0_A-xO8=O6^cNnL5<NZ&nzI_NHZ%_V=H3=h>=>T zfD7bmBOMC`kT92mf^te~T4r9VLVSFvOMs`Jm#cF~yayMTf`Y!57MG$zOkzq(Nq%}! zerbV%V?hCzf<jC+h(Ho9O)2mMdl4jF4fX=ad|h2#U6RcYO(Dh#kkgSc*h_|HI!0y? zPk|h-Z;Kl!6cpu`<d;+yq!ugSR)s9X#igiFmY<oT0FTc2%)HDJ4NYrIiISqs^z_ss zta8Pvc_}XWd8r!y1*v&~rKzQ<u6ZRzmGLE73c1DUItr;pMfpYXB@kNEno9xQ)}qwp z)XXv*`oXSA%FoY1a%M_uQfYcXQDz?4v7nIA(gMX(EjXSafd-B#kQ99a4HS@Ir-B$r bPK5;=NEn+up}@;8r)ls(odpUfSP%jL5?VGL literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_udplatency_Makefile.patch b/pkg/openwsn/patches/07-App_udplatency_Makefile.patch new file mode 100644 index 0000000000000000000000000000000000000000..5eb880f5950fbef0d4a7450c0f795d292184a098 GIT binary patch literal 1342 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rWDac7INzF^H)b~xy zPEE_qN#zX5C{=JQC{i#oQ7|;LGBC6<Hdin*Ff`%P)zwuf0+|IhM7KP%fEWXP^YavZ z6Dt)AjT8)xtqd%!j4dGsYM}xykc$lzK!RYq40Vi+6m)fUb-A<^f<v8xL!Es6U94<X zG>S7)b8-}t5{pyw5_3}(R5YAJgIqj=G&S`SxwI9Oojm<qJcAT$6;w2WJpDtQ9D`jo z^^-F5^g-qXIfEt2Gjmds6N^$5wDgiSxwIAhoxH%}!9mVes(Q(`DjE<|G*$KTLGmuH z0l4H-G`Y07v=u!4oP9!FT!R&~Z54Dqk*r4L=@(ZP>u2UA=ai<TqRAxZ7p3BmN-4@L zOD)2s5hk0QY-ngu5ucZi!<6KLQvJlD-1y}D+}!*;9Ew2h%S$bR$$|n6-D}X`);BOp z)b(|A&dD#w;(vsqB#@$v%=8R=s*DqLJp(+P@hVBu^$aL8!>7bVHzdf>508rEqWt1w z-JHbA)S_Z=wCM$S`1?g#DZnFKMFXDJAQ6jI2Bg8?$qSS;I8`(pT{KlR9D_6!ijs?w zP4e}33H5Q+R8Y}?s0F1?g@V$Y9EHq0g_P8S)Vvf>-c!iTOUqYC%P&&UO0CE&F3HSG z*HX~SR{&+lVlHh3U08Ynn`5PyZ>tAQbjk|J`MCv|IjIVXc_|9%sd=eIi6yD%MssN+ z9Hpw4Z>6BBm&~QD0CTvrGsuO`Za$9g!5|hax-}IPbdwcSwDgh{bn_7=sA%cs6RF$R z7oyz`MRy8Fw?jcuW?o5}f)YG<l@w|ek`qf5bWs&6*eU3j<QC|IN}l-q(h>zVHHF+V zG%>g#Dq4Ce;CNM5C`!%EFH406P-01Dex5=>QGQBkatS2nlXFrN^Q=H_DauvQO@l^~ Mf{KQVYk(#f0P#9#E&u=k literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_udplatency_udplatency.c.patch b/pkg/openwsn/patches/07-App_udplatency_udplatency.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..bb210be5b8c8168556d0cb688dbead250268e2bd GIT binary patch literal 7332 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rWDac7INzF^HL}KbC zbB1J;DmWGtDHxe37#dm`7+M*dD;OCVnsDjr>M9h0%!3-FTb@}!j-h5&rlwY=CJ;ll zPyrXn<%UK&MurL?2`&W%<;=X~oYIt31*OcC+{C=Z^wc7~3?&qaywuF}jHLXcVvq!v zqJqA@EpDKYlA4y8ms+fVTM3#B7uZOBh0MH?)FR!2#N_PM5`}`)qRjjh1&z!+h1}xQ z<ovvpVofeZ1!aio3ZX6mK8_)-e$J5ru0fvuE(#!EY+ztuz{RCNz=36nMVX07ImA1W z3mi3|P%}`_)z#HS2^^wB4H3{K8AYjyDYObq8h9U+RFE(@5gD22n8FiLtpXyo$Co7* z6~~uYgCYV$6kQ!y75?;8P?TSiUs72>bbNu*Q(1my3bI`#nYpP&8k)pdSDKWQnM{1@ zwZ&##W?p8AhNeO_mm(-OQu6cEOB9Mq^Az&)6jBn?i}LeJKr)$W3L5a_6Q7=1;#utC z=nj(A(9~2YN-ZfZ%CqKD1Sv%eNIkHBJX1ia-c|urUVsIP<BLlYi%K-mbB7Md2#{K$ zaEPa`YfwBSUwJy~fVlC#!K9gi<X*7LG_AQ56l$>rRY_uTwuWXk7uae31*v&~rKzQ< zu6ZRzmGLE73I*9EAgu}tU|+^3rlb_bmndi{6krimD6|IIpa2T<f}+%d#G+IMNO1x& zy&$_p0TNn;AUi-I?pBnV8UQYFoJ!NuQj0X4{e1)c{apP*;t_!ecD#au0w}%;vP*1j z{X%_wK(PyUGt_CtsYRKIIq?NWnRz9yMMe48jnZ)q3X1phk9P}lb&U^jboO=)iFXQh zb8`*S0T(hx#yV#3LWY7|rL9n!nO9<H7GDB$qk=+lYN20gt~Hl7m$rhwesM`+NoKM_ zaz<hiIB3g@^Wu?Wt+*sHIXl|hHOSA^C*IlL&n-SU#L?M1*fYvC-q+F7FP50BM7^8~ z%Fp!8y<i(5IT#jn3bqOc){v}(6jGq#j;8rhK>?HnDb0}z7{wttS>w)=umAujAnIjI z1w?6>nWm7JU!qW4nU|aa306=J%S=s8H8eFzjn6C&2FYk>D%jd8xH<X+yP_3}pnQ&G z9BSbT$*#DIS8&-3_8U0)gG(t;`I%p!fg^G?p>Yq=1TUOHoLWd34R+2DEO(G<b`TR> zyPI0*7#f(t+K37YpmJE(F2^JuTpK6n=Yaf;f^8K%9sL|Zr6#mwF32tc>nP4IElN%e z$S*4K56Vo=EhsY!sVqoUP*AW{2=@*EX^4k5<<K;yq!yQC<|US7=I6y1<QE}IGAtSu zL2iNAXdI8E(J>`O57c&0uvKt$aS4hyG_r7lT9ccan_N(-p@u^jxTY~QvPg<Hh}BWc zEO1OoDT>d{FG)>FEJ@TcGy|1Jpr&w12B?y$%*jtoQAp0uD@n}ED^>srnwcbJmMDOX zNi8l`$WH?c7N_Q=q!uY?gE@}Devo7jsie|M^O8ZHEsifrElw>eOZ7-iOi3*Y&a6t+ zD9A3+DbB1)%}>)vEY6EB(S#+&#Nxd0qRf)iko<t`5|A=YYkmFn)RJO_#Ns@Kw4(f6 zh1|qsg`C97)FM4llMED>;0lkBbr#_A0i@g(B^UWtdb((U1JlgJ3FZuNAQmKogCW`= z*0w;`4&?KAGZRqwK{F1DB12R~hOyWb8KEjN!m7v^Rgp1PMJA|<Ot304MO9>qRgoF0 zA~URt%uyAYL#j&!1qFCt3e@@tC`wIBEh<V)2}mqT%`0&&%``L7P%DH5DyTFp1Selx zTX=v&TS}mKAvzi%sZ3u#IlrJ%A-7VY0A{ZOsEw3YqEMW#P@bxgoS3JORGOKS0#2PJ z`33no`RSDq%^>?g85${$3-vIg7+slRtSyo<cqF4MGeS`Yk7jgb#wg0*5sj|Q1VtG< zs?n91q9}t$Ho7u16lL(}MptHzq6`$_pdv}377~2=`k<T-YmI_SD^ToefST^5DFyK$ zS#a*vw6%4OcXRZ_XkS8_tZC@&)q?C2SU#=A*~Er)exQw+;^d6fl+v8kqWFT+;*5B3 z`x~jo1Mzi29D}_Bf;|1>o&6mHz~*CZCxBe-lAo8Vf!RFBEl$@_NCmZn<4YhkyuqAX zoUUt^U!Ip*q+qLnt-TE`pg{oyR-0Uunpl!wq-cvxG2B?v+u@;pt`PyQ&LOTY@xiWs zE-wClu8>x^nYoUku@S7V4~yv`T>F8OB8{p*aCZw_VnE9V8drk~SnEM}t1&&b#IZOJ zl$Uhvpbi=oRU#+~Y!!&97co`B%T1IT)F>8HCA{cFQE7}tCA{=RQE7rjCA<JdQE7@r zCA<tpQE7%nCA=6#QE84vC8#8Ybl)kiIu$6XI~Ax}c`Dc{Ak~Wour>s&sDUQjXv0`k zh46%cuFwcgAv_(RD>Oz^2u}v+3Qf=y!czgdLQ^z_@I-*F&<sr>JPn{LG)GeiN&=vy z4ysIH)u}>eUU6zsi9&E{VQFe!a;kz~X>L+#5k#7#_B3Qz1m2)VNstE61gQa0q+n;K zV4<m?reIK!mWHjpY6w*iRSs7OahATm0;t9$rWF9{@{->U0FCfKisj6_<f7EvR8SKS zJo>|>4GKtz^R%@gV?hv=$vOGOsS4n3utIr8YMw$#YH^7|T4r8maRx*es6K}1RIpR< z3-t}~4heA$4gpobU{gURgW5A-GYEF2!CDA3SztpD;P#RNISm((PJJ!NfO|Z+9gzxd zb733p(ow)Y+=X@Y6VyTq@(hWL_YZLO3lH`K^<|-5SsexEAXmo_SIDRtD44LCfZpy> zP(p|(fLdZon$}wSxY~7~#DuT;m0vy-8(^R@2qX+1jxaPd(J?eMM;ea+B{UpO;@skN zM3a@!+(KqqVo56Tqy1bl3V!(td8y?&nR%%Si6siDc`2a2eOhKtDtG|b(8NH;(8L(2 J?Kn^_1pr@RU%>zX literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_udplatency_udplatency.h.patch b/pkg/openwsn/patches/07-App_udplatency_udplatency.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..fd1611b02f5b72bd37a6a3c0884b721e91bd56a7 GIT binary patch literal 1673 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rWDac7INzF^HL}Kb? zaE4@*DmWGtDHxe37#dm`7+M*dD;OCVnsDjr>M9h0%!3-FTb@}!j-h5&rp8vr1`tEF zPyrXn<wiP2<_aKjE(HbUl+?7$yi|qw_)wPsAIA_^Kj+AJ4=yeR1$`|oE=7fy#FUhh z{Pd#y(gFp?f&wl@G_lf@0w0JkxfB#)s<{*twDiHc^=)wj1*oOCRiMidHnOC$AT=d5 zO#xjePCj8H%Myz+6O(dMi-|Rqu#p8t`6c-vrxI%>7nh<!S$<}U0wOuZXXa&=XlPnv zktr$4OixcO!Y)~ynwR2|pO>oPUyzy?Sejaz>Y7(lR2g5QrI1^kuA`7zRFq#7Ujm^u zt+^C1EG|k-PR%UCVF1`cN%{FX$WBd3O)5<fD9X&k<>18PY>;cA=}kc)rWTwJjC70* z6?AoVbxBX6p(zERG+GTJkP>ewy%MUng1)}KLS|k`YLRY1VsdtBi9$hYQD%OMf<|VZ zLT+(ta(-S)u_l)`JntcLUVv+mr@xB=2pAg}7$B+f3-t}~4heA$4gpC*u`x&qDCqEJ zHc)aKNjU?QUBHPE#6V7ru-pL>$Etu(4#_X4aUQ|xvJy}}fy#m+TuTd7+}3gd0B6|Y A;s5{u literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_udpprint_Makefile.patch b/pkg/openwsn/patches/07-App_udpprint_Makefile.patch new file mode 100644 index 0000000000000000000000000000000000000000..aa91cffc148714188933fe9f109d2b4a9018bcf1 GIT binary patch literal 1338 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rWDJUq)%q!9NP0UVB z%gjmT49O@}a4aZNFfvgvG_*1>v@$kVFfuSS;nLOBRVV_P1T{jpJhOnXalZL^3ciVz z3Wi1shQ?L~mR80V5aYB^0T;-%1_~fSuuX<K#zqRdy1Ket+6uv;PQjs0zWy#&wkjIM z8L2rr3Q38@sd<UHsR}9@&Y?jro<W+LdWl@x3d&BNelDIt3bqO=8bO}^Ax@6LuA2Hu znR)skbAp_~66KjWDanaNDGFM8$(mf+3jR)BVDaD}XDd~`WLp&th$)(?difxE7uNt> z@+q2J+FaTSo_@|gp)Rh$3fi^`x}Hc@qw@5ND~t6r^OAE)Q&Q1nlJkpFaY&^UWtOED z;nE0`O-?p6G^mKrOUGeKazUwnVo`2<a(-@ZejW}*Aot~^mcV2|frjoiXmINr7$xfZ zIy&d%mt*liLQxV(QATEZ20m5BiMpNv9?p1`B<Xqvl$qgEVxk)o<miV-MRHMoaj|Yr zVr6PkF*w@v0zCZvBCQnQ5w4;EPiv5f#VP~R;P2!GN*bIh8jdcSDjJSKnhHh9#mFZ4 z`n!bsxN0h>Xh770Ql~;eX-<wpW}ZSyYC&pVN@`wmr9x(2TE0SBevyJ!YDH#oNoHQU zmV#cs0w^;Ub7?E+!qN-a94oziTRmu^Q&vdM&n?KzNmWS9OHoKq%}XsxEJ;N-noAqu zC{?|DD+N`(WG-z5n8Tf&K`wN5^Ko<!2C-n#t*M}(o2;OsrI)Orn~yL-MN2QANZr1^ z5bbs-x>G>99l&Kynt~EMc$E}t6p|B56m(G)E7&RMm*f`cgUX%w{L&HyH8q9YGBh!` zAu3vWDd2cjRwzo%%`Z!Z22f&2W`3SRK~a86X>ti9=96<$6Z5P<ZYj!D&`pCzl7fnc Ji)(-;7XSjEW~TrE literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_udpprint_udpprint.c.patch b/pkg/openwsn/patches/07-App_udpprint_udpprint.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..4c3d0fdec70f307be11f57b8b4f94dbdd54eaebb GIT binary patch literal 1151 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rWDJUq)%qxL2^pZJ4 zGD;O33yKtsOcV?atqcsUjLj8{3=B=UbaizVia=&T4bd&nEFjfDGb>Y5D^nAQfm*15 z3*=%;9YYHRkT@5Yf`Y!jEpDJtP@0sJnXG_Y1-c9um!d*herAdS%-ivqd6^{|nhMoi z3JSHDvc;)+DK7bWsT%$Tsd<5=simo|c_l@a@g-Ucxy9)^3aLd!`9<+15E^2Nf`S4l zbc$1pG81#+!C~tPQl;VS?;GIn=js;{AL<ei5aj6>qT?DA6d&s68WG^?9OCK{AMEPq z;^Ob;s>7v#8)$&-EJ!R$%uOvxEs8JEG$2*IrZqSw!2zwStE)@DfChy<B$&tu?EG@D z*N0+ogOW262B&i)6CGm%NJ0n4HYn8;f|6K#T2X3hKw@%sYKc>6T3Tw6Ms9JsrZp^u zCgtbnAkuG2YEo%>04N7TQ?Y`ALQ!f-X;Geno1;&#D^wdO=Rzz5M>usXM8qamO9Aib BMZ5q2 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_udpprint_udpprint.h.patch b/pkg/openwsn/patches/07-App_udpprint_udpprint.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..871019c3e6cb4003bfb3cf60f327b2eb8288d491 GIT binary patch literal 949 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rWDJUq)%qxL2^fEX@ zGD;O33yKtsOcV?atqcsUjLj8{3=B=UbaizVia=&T4bd&nEFjfDGb>YLD`NwQfm*15 z3*=%W9Sa4JFqeXYa!P7iW?rg7e0-=&KtPbEUr4+M7ng#9zLpl3qC!k!N=iw7dQpC9 zfr4W}0hfY8Of`r=5-v?C2mtvGBwP)4KFD-kU0q#LO%F{W!UB-9kucahhGsfOrVtN- zT&{168z>YM<(K4_R2HNbE8tdzEW^d6s8E)lnW6xT#`w&<%n}VvYYg$?)Vvgz{Jc~R z|AN%Kz|z#xRM)(cqRRLZErs0TbRC7%qN4nw_!0=MY0ag8W^Pexa%yH74((w3lJfI& z5bj7xO)5<XhdszOAfIb#fnuQ+91D;@0mlPKiY|cy3Ma5bK@5aL2?b1kISqpb<P=S7 MSdvyyh^gfQ0NceJB>(^b literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_udprand_Makefile.patch b/pkg/openwsn/patches/07-App_udprand_Makefile.patch new file mode 100644 index 0000000000000000000000000000000000000000..242288b76bde2e845b184ab9910efa01e34048a4 GIT binary patch literal 1336 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rWDJV+JOVRgD%uY?q z%t_@8$tYEDEGSYiGEp!zv@$TXGB#H*GB7mZ($&>fC;}M-H9@yLvw)y!zWI3yzKN9z zhDHj8##RQFaMQF<0T;-v1_~fSutkPC#zqRdy1Ket+6uv;PQjs0zWy#&wkjIM8L2rr z3Q38@sd<UHsR}9@&Y?jro<W+LdWl@x3d&BNelDIt3bqO=8bO}^Ax@6LuA2HunR)sk zbAp_~66KjWDanaNDGFM8$(mf+3jR)BVDaD}XDd~`WLp&th$)(?difxE7uNt>@+q2J z+FaTSo_@|gp)Rh$3fi^`x}Hc@qw@5ND~t6r^OAE)Q&Q1nlJkpFaY&^UWtOED;nE0` zO-?p6G^mKrOUGeKazUwnVo`2<a(-@ZejW}*Aot~^mcV2|frjoiXmINr7$xfZIy&d% zmt*liLQxV(QATEZ20m5BiMpNv9?p1`B<Xqvl$qgEVxk)o<miV-MRHMoaj|YrVr6Pk zF*w@v0zCZvBCQnQ5w4;EPiv5f#VP~R;P2!GN*bIh8jdcSDjJSKnhHh9#mFZ4`n!bs zxN0h>Xh770Ql~;eX-<wpW}ZSyYC&pVN@`wmr9x(2TE0SBevyJ!YDH#oNoHQUmV#cs z0w^yQb7?E+!qN-a94oziTRmu^Q&vdM&n?KzNmWS9OHoKq%}XsxEJ;N-noAquC{?|D zD+N`(WG-z5n8Tf&K`wN5^Ko<!2C-n#t*M}(o2;OsrI)Orn~yL-MN2QANZr1^5bbs- zx>G>99SVvv^Gebbl;FXuq)?-foLHiui>g?`PC>sUw?H3M?8N7nmMEyHDdd)+iNOs~ z(b7u+$E&hJQEF~}St>Mu5=%1k^Ark-@>5EaOCT|yoRgZEX9aRgQLch+8Z?p=R5V;% H12nk+kvV0S literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_udprand_udprand.c.patch b/pkg/openwsn/patches/07-App_udprand_udprand.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..957854b02de15484fc90aadb65df9afebefde48c GIT binary patch literal 3254 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rWDJV+JOM%gP$($h> zr3#J(MG8hH3WkPO28LF~<_bmzh9+FPy1EKQAd{d*=$2;|kY=2jm8q$fsR_h5EmXh- za;=4qp|Ju;9Bi3|j-k1NuCA^wmx6+FW?phmX-cYs63BLtlk;=+GL$f6lJgS_(8Y_B zGg4DZb5e^y652>cWv1jN<|U?MN_e`ux>^_*8Je27g7t7A>nh18N=-}wiE}9^=<D0! z1_~*uX_<Mc#R|BUpviE7f&ml&Fbv`=7#ZrA7(&8DL7`Rw8fWokiABZnCDvSA3TQ$o zTx%{xg6=FR$}h<;sVpGcsa#x&3T643DR7%gGILXlG&I4E!5=0CrAaxN$;1bVErwm0 zd6^{|nhMoi3Lt<S8hT)7c&32FZ52Q%1uRe;UtE${RH6YAfFzyx^wbhVvm^~o)lip! zAV)u!0M{T-e-|Byks$3v;1Ew=*PwWaPEThY5I5d8m^3qBt_QnQ)0#^`p%%lxC5gq^ z8k$h=D)<+q<^`6fmZrMql@wLRmuM*zWS4+6Du7aBK~ZW!Vo|C>L1J=tY6-+U1=%GE zkkBXu=>z%Qttd4$0IbBRG%YQ)NW<CRH^AS|)h{F-8X#b|C@3gorYUF?WS7|5`i1)V zfC3#<3>cZ}n3}?}CK(A*L0`YPB(WqjSs^(iu?QSd<;8jNu)ruTNlea;_I3^ObM=XL z_V;s(4-Rp3_73)pa*g+O^z@4bd6z&cqf&|nC2~5ZYOr-9EM<fJOdxe@b7_Mzq`tmF zN`9Vti9%6n9w=qz<(DWFSLP*WK%_xwH8V9e)zH)=H9oUA7$l>isbFiX;O6KP?5e3y zlv+|+lxNKaHBJG=y!<?cl*II+{QMFm(_l3ODARZryEwXo<TW%w83F7f1qE>G1!rGS zF_T}Q0ZYZ8;u%&TX<9?fR8T;;0py`tE^SC2)z_ze&V|(}P#Rpdm>KAp8^Ed-1yJb& z!Z=EIg=#KE1qB6oeHvd-TAUFNE}meX261#k9D}_Bf;|1>o&6mHzy%3rp;nxlm*SG2 zm#TqTp5+#&>nNla73CMjmq2JxaD#$NA-6bP*Dk+2FSSU)Rso~T0u>9;A`7fAxhOTU zB)>?}7DFZ6Kxq6Grxs-<=EN5iW#*N*f^5bt5OrLGg5pE{Tq6QpokLt*;)7lNTwMJ9 zTy?;06>}3E3wUFNKsbUEJTxrH2u)BF=xae*A@N`@rh;oWj1p8w0e2Cq1CB{>m?8*J zoCSG?M8^9ExcY?$`@!l09R=qgSH}=nNHHAZ8XSUEJ4zZ*P=az5KuJPL(^^X(Yvo2L z9psk}p_Bm4SuhHm!^|yoEZ~hdXmW$p!)fT1aBgurBDWB#-!jV*OHzq%MsdX`_~k3) nrIzPp=A|kmmMEm=r6}a5DWqlQq=HkhrKygk1*}dVKz9NF2)dQC literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_udprand_udprand.h.patch b/pkg/openwsn/patches/07-App_udprand_udprand.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..be05ff1d28d2ed7532f8f826f019263902944ea9 GIT binary patch literal 1050 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rWDJV+JOM%gP8Jr;* zr3#J(MG8hH3WkPO28LF~<_bmzh9+FPy1EKQAd{d*=$2;|kY=2jm8r3nu>r(5EmXh- za;=e$p@9NOoJ&DLIVCkMGcQ#kK0eeXAjr|rCEkOJOF=<jON&cUAto^;r6fPSD8IBo z!Lgu#OA$@1G^HRYF)xKnK_RA^OF=<Pp9}1Ku=%>Wy1FEqADU7CvY;A7AlV#>X$#2l zNEqxZLo*#CbBMP<9?-YN4HOEB@=NkdDhpDJ6>zIUmf_-3R4B{OOi_TwWPD~`W{HNT zHM(#~QD%C2Y7rKh;?%qpm;Ag`4gZ4Fyui}b(p1;HlA_A^5-o+?;&dH_)S{yNqWBUB zt!d4rfNEb+YI16384lfGcO>QK=fItplA2VS9#E8-ht-jZ#n~Vif`Um)3lw{`;CO?C vAUNVcQuGKxP?&;U4`RSw4+}+*Af_y#kjyWqSy*CsPzfkJp;DlLgM}#oe04bt literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_udpstorm_Makefile.patch b/pkg/openwsn/patches/07-App_udpstorm_Makefile.patch new file mode 100644 index 0000000000000000000000000000000000000000..95348b137169268a07993f04ef0f929149c78e3a GIT binary patch literal 1338 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rWDJU+<FUr;TP0UVB z%gjmT49O@}a4aZNFfvgvG_*1>v@$kVFfuSS;nLOBRVV_P1T{jpJhOnXalZL^3ciVz z3Wi1shQ?L~mR81Q5aYB^0T;-%1_~fSuuX<K#zqRdy1Ket+6uv;PQjs0zWy#&wkjIM z8L2rr3Q38@sd<UHsR}9@&Y?jro<W+LdWl@x3d&BNelDIt3bqO=8bO}^Ax@6LuA2Hu znR)skbAp_~66KjWDanaNDGFM8$(mf+3jR)BVDaD}XDd~`WLp&th$)(?difxE7uNt> z@+q2J+FaTSo_@|gp)Rh$3fi^`x}Hc@qw@5ND~t6r^OAE)Q&Q1nlJkpFaY&^UWtOED z;nE0`O-?p6G^mKrOUGeKazUwnVo`2<a(-@ZejW}*Aot~^mcV2|frjoiXmINr7$xfZ zIy&d%mt*liLQxV(QATEZ20m5BiMpNv9?p1`B<Xqvl$qgEVxk)o<miV-MRHMoaj|Yr zVr6PkF*w@v0zCZvBCQnQ5w4;EPiv5f#VP~R;P2!GN*bIh8jdcSDjJSKnhHh9#mFZ4 z`n!bsxN0h>Xh770Ql~;eX-<wpW}ZSyYC&pVN@`wmr9x(2TE0SBevyJ!YDH#oNoHQU zmV#cs0w^;Ub7?E+!qN-a94oziTRmu^Q&vdM&n?KzNmWS9OHoKq%}XsxEJ;N-noAqu zC{?|DD+N`(WG-z5n8Tf&K`wN5^Ko<!2C-n#t*M}(o2;OsrI)Orn~yL-MN2QANZr1^ z5bbs-x>G>99SVvv^Gebbl;FXuq)?-foLHiui>g?`PC>sUw?H3M?!@PpmMEyHDdd)+ ziNOs~(b7u+$E&hJQEF~}St>Mu5=%1k^Ark-@>5EaOCT|yoRgZEX9aRgQLch+8Z?p= LR5V;%12nk+NEK$a literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_udpstorm_udpstorm.c.patch b/pkg/openwsn/patches/07-App_udpstorm_udpstorm.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..fa0b15962d71a84c4e15573fa7fe5dbf79520a93 GIT binary patch literal 5734 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 RfsKXL$y9MUq7tUE+X2?ci_8E3 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/07-App_udpstorm_udpstorm.h.patch b/pkg/openwsn/patches/07-App_udpstorm_udpstorm.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..1ca03304a389a9fa1ac8b13f2add7248bd6ae68c GIT binary patch literal 659 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV539FxPb~D9|rWDJU+<FUo~8^fEX@ zGD;O33yKtsOcV?atqcsUjLj8{3=B=UbaizVia=&T4bd&nEFjfDGb>YLD`NwQfm*15 z3*=%W9Sa4JFqeXYa!P7iW?rg7e0-=&KyZkEkZ-&P7ng#9zLpl3qC!k!N=iw7dQpC9 zfr4W}0hfY8Of`r=5-v?C2nP8MBwP)4KFD-kU0q#LO%F{W!UB-9kucahhGsfOMi38y zT&{168z>YM<(K4_R2HNbE8tdzEW^d6s8E)lnW6xT#`w&<%n}VvYgi~LD8$r){S9#j O*ynU}2FPV-P5}Uv7_&M6 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/Makefile.patch b/pkg/openwsn/patches/Makefile.patch new file mode 100644 index 0000000000000000000000000000000000000000..d9ebd971fd930cfae676e6faffe819a9b3b8d93e GIT binary patch literal 2074 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV55VP0UVB%gjmT49O@}a4aZNFfvgv zG_*1>v@$kVFfuSS;nLOBRVV`Kglf?(&n&>y?wg;d;G0;fU}&UZXl!L*X=Q2z(XNFG zxInHkPyh*nO*YgqHCNEp)z#(FR!FTV$S*2U@bz~I^>MYbRnaKUNX^MnNJ=bD%}dNp zRZ!7z4h?eg4ARupOXSj4P<Hb4bMXvPuvJje2=ep~adHfH)znYQ%+u%6RtOGq21}G@ z=A<Mi7Nsa?=_PA&X)E|Ud4a`)gPg5Y^^$E>G$5vEs_Nx~<Xv0?aLK1=a%ppED|q@j z`-Hl<1}kXWD(HG5S&homFRm=s&&*5CDNRX5lS$4mO2r|SQj}SiT7*j@Og1^$(9obF zJ}(`IDai$;`iVuk@yYqQx%qi`6y+8dm>3)A;#CLoM_y_P%oKgBfdGvdEWrbn(Kj$k z)b(|A&dD#wt0)PiC?hjH1D`76L|xAS4`;kel5{--%FOU7G0_bPa`eNaBDpBPxL7wQ zu`;!&7>_aob6v-R0{x=QytI5Gl$EFE<YedNm*){yo1c-BpO;ElT}g65YH|h<mX{<K zWaee1CYKOpW<gPA9uX=_Q;4*^G=*r}OH&GR5=&C^k}C<jv^1rFc$XF>=A{s2WN}G; zQ7$O0b7?EMcm@S4*uogvwhCw|11zs?tALWm5rW8R8ZL@R!w4aGnuQC&(<od7oY+9_ zQb^3nu~LASUn&}qauZaDaXO^s7b#>aWacTTXn=HTDp)I|<SQttX!tsMyJ{*a=sGK? zsAPgg^HLS8!RBEa1v1{>$qQ_xiiV?$rizARkfuUWaxoTr6;w1JYPqx(lobj}b8<lT zr=%97=B0olQUR1d6hIEsO0CE&F3HSG*HX~SR{+&MpzNg!D=fk0Sn1{4>Oo6fWrgJY z+=9%URE5O66ovHEywsw^l2ipWqq(#Zj#Aajw^C5mO9nZGGdDXWvq(X=03pq#t-uNO zkF&ETs9tgNadZy`v0$aUrh<ZQvVw}1Ub2F2K0>F8mL4dZ5u@AJ7oyz`MK>t%aXNt0 zYZ@p%ptX-uO>$z1f-b631v>@(l3Y;9l3x;^Us|G|rlycvh9-uHH7&gqP&|VCtWcDi in_rd+4Y$OS%=|osf};GC(&Q3QP$%c4CgxdLaRC56ttkos literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/Systick.c.patch b/pkg/openwsn/patches/Systick.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..f0fe6cc9028abac22a2ecc4cc9339160f3b53a93 GIT binary patch literal 368 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV52st}HIeOwQIz<_yUwRd6gQQZO=6 zFf_C>w6rp|R4_6yG~v?K)m110X@%<1Ezc|<px?~O)Y!_{5TaiT6>x#vW1s*M1RHIr zV`!+LtE;QarLCZxnU|bXnv$xZR9up4Y?NkbP!XS#nWUGY#HG!ptx%d*oSB}Nnxc@L zkyxZq403vQe5N&qOi@X4d~s&Ft)UKxRgjZdX${t2mY<oT5L{Utl9`<Ck(if~lUk$! w64OMI_Af}y3lH{-hboJA&d*EBOou4r(pISE(pFG_nE{iuGynsTF$%R@0NZnH>;M1& literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/Systick.h.patch b/pkg/openwsn/patches/Systick.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..0bace0e5459239e7e7a125857d8c43425b456cba GIT binary patch literal 303 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV52st}HIeOwQKJ;0(zqRd6gQQZO=6 zFf_C>w6rp|R4_6yG~v?K)m110X@%<1Ezc|<px?~O)YQt<1fpLH6>x#vW1s*M1RHIr zW2&I5tE<bU4T1_~`I#vS!Ii}!naSDl&iQ$1ndurJF->bOZH3f|lGLI+h0?s@%=Em} z6ourB#3F@akQcJ!GjS>?DoKtn&P>+<(FHk)mDXG_3V!(td8y?&nR%%Si6siDc_|9{ LX$onXIjLL#`g2>= literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/at86rf231.h.patch b/pkg/openwsn/patches/at86rf231.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..bf07de6212bf1d062f850a4a68f08b197b554f4e GIT binary patch literal 24775 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 VPG(-JLSl(RD&%nSw9K4TE&zbva!mjL literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/board_info.h.patch b/pkg/openwsn/patches/board_info.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..83d73c202ac3507509a1ce8b900573c3aa0905e1 GIT binary patch literal 3418 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 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/board_ow.c.patch b/pkg/openwsn/patches/board_ow.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..79e1f8d1159df5c86e7061299dc867c6f5be018f GIT binary patch literal 3509 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 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/board_ow.h.patch b/pkg/openwsn/patches/board_ow.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..b86aff1d389402cbc2e6ed291948beb77d9096c0 GIT binary patch literal 1965 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV53X%1<mxiO(<B%is*jC{=JQC{i#o zQ7|;LGBC6<Hdin*Ff`%P)zwuf0_lZn(k;&{AY_1<m8r3nu>r&YEmXh-a*?5qp^*Ye zoJ&DLUrUQiK_MooC^I!p!MP~ExLCI!C$S_gzbIEBB{exGu_&=5Ge1v33G7-Wg{0yF zh1~p<(wtO1E|A8=(vpn)B88BQ{M^K1h493ZlGMt)R0W%ID9a%=HMv+XDYYm&H7B)F zFEypqPDjBlHL0jHv8WQ{L?b;e1qCgAE-qaK<;=9al+-kZ_;@FO#~_z@50F?&YFcJq zDzX@tf`W2pUUE)pN-ES@@tJvP`Fa^jAQ$QD+u{ZaP}6X$K$ii>fT50|xq_~)t}d50 z7Ds9;C_{}!I9wYVwAu<Wi76>1`RPUZr3DI3!2w*_3Nh6n0!bJgv>>r+E|9*#5E*n0 zVo*{<!jLp-rekCYOQZ@43f`X1-tocC9<DB-KCVGJTnY-c3fY;-+40568L6P;SQKAk zO*sBbDhpCUNen%jaq<ZpS(aFonV6K5TC9N65L5}mMivz1m*j(-O01b&T#5>1`I#vS z;G`6vnU`6jp=pgOSe%oZT7V&1lv<n$Rtw5isd*`xY2XxZWT<0e2}$w_AV6gBgR=)T zlci|H$GiK5I>*OrDyXR`z<IW|CYlP!BEFt}{z38aHnyf<g^;`i((M}@U}9_#AFs)! z4RV9NzCvzsL3(nsf{lrusa^#*GeXM&o8rv$yu=*63_Fl0#0Uk?;2@1MO@++7lGLK2 z(t;8NjWPvgWrg@KSLYD_AWa1b53DLbGX-Rea%xU-D%`gGl8n?MB=h3q1A-jgeI4WD zH7Ya};sc5j({mFwlq<kGQSC%hT9%qzl3!#CvJ7r>d_2NY;CKVeqPhee7ohS0e~AW4 sCL<$7$LE)8fC3A9!p0^8N!&0QE=6!{r>GE9%LOGs^^SsqG9=vt08FnSyZ`_I literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/cross-layers_Makefile.patch b/pkg/openwsn/patches/cross-layers_Makefile.patch new file mode 100644 index 0000000000000000000000000000000000000000..84bb535263dead4aaaa3138c6d5f84c40dfb53cb GIT binary patch literal 1323 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV53XF3K-1*3C(*Of4$b_f5=BP0P$l z<qXLvRd6gQQZO=6Ff_C>Ftjo@S1>X#G~v?K)m11083Wa?Tb@}!z%1YVJO$sxN(DnB z1w&&i14}DoQ;1nwsDKOPP6GvyAlMp19b+Q}U0q#WE^US2P$yr17b{y8jpB^doE(Lu z#NyPv#N1Q`6%FUmAQ#UdO-;Q-E^P&6Cr>{Y&maX`1r?1TPyY}n$6!}Y{iMu1eUKqR z&R~i1%$$_u#G(`hExlw-E^P&WCoiygaFDZ=s$R0KiU!0KO;x>oki3g)0516yO)hON zZ3Rz1XP;0P*I)&0TLoQDB&$(*`o)#S`k8sjIi)G7Xfnz9MX5NXQi?LmK#_x8BTP0q z+0f9SB0eu2hbhSgrTU3Qx$(*Qxw-jyI23{0mzP=slLZADy4Rq=t#4qIsO#(KoReRU z#s3IJNgzcTnduq$R2e7gdIoqn<5iNR>lsjHhEIu!Zb*=$A08FRNgW(*dI28(evwuR z@CaAYfFv|XtYQj-l=?e)ff5C$iiV?$rizARkfuUWaxt<QzWy$uKCYSyDjE>ApmeEF zP@0pYkeR2Dl3I|Omy(*7T&a+mmzJ-PmS3cxm0FQmT#}iWuBD)tuK>z`#a!A7y08cb zn`5PyZ>tAQZpsSD`MCv|IjIVXc_|9%sd=eIi6yD%MssN+9Hpw4Z>6BBm&~QD0CTvr zGsuO`Za$9g!5|haqBRv1bdwcSwDgh{bn_7=sA%cs6RF$R7oyz`MRy8Fw?jcuW?o5} zf)YGzl@w|ek`qf5bWs&6*eU3j<QC|I%9{B6(h>zVHHF+VG%>g#Dq4Ce;22d_C`!%E xFH406P-01Dex5=>QGQBka!D~*MRHDRVxASqEk(Hsx@pizQc%%waShPq0swJ|V*mgE literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/cross-layers_idmanager.c.patch b/pkg/openwsn/patches/cross-layers_idmanager.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..ca7964bca37f0ddd25706274563735dd6680a0bf GIT binary patch literal 13766 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 CFNdlC literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/cross-layers_idmanager.h.patch b/pkg/openwsn/patches/cross-layers_idmanager.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..560bb46769c8f730902816c4ee4c76470d9d319b GIT binary patch literal 2237 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV53XF3K-1*3C(*Of4$b&rHcp%u7s9 zEz-;249O@}a4aZNFfvgvG_*1>v@$kVFfuSS;nLOBRVV_P1T{jpJhOl_<IJo~jjfCg zAjWB-0xpni4UKdR%@sfrVA~9hbc_rYbai!gxwsS*^!06V1BH~-w9LFz1>7poWw^Ms z6_la69Gycv{r%!2U4s?CKs{0&Q`XNPET^EL?uSJ-#NXZB$5lZ=K|MsBOPio`ODYRe zQ&Q82cP}UeV48|cib|796skdC1_~?~2Jsb)jCD**AYll0FDSO+6H`)(;!6}16mlyA zic-@uE3CN`6lxVxQj<#4Jzabuk?)#UQdAjVV$H>+NFcDw5{ohulX6mviFH57_4wnj zpeVm2ALKz|%>=o!EI%^^>`4#-PsH(=d6^{|n$}#33Q76-IUqSOMkq*6E%7XNada=r z&j%}1P{3hQF|tCiVR@<LLHRkU1Wk7;%1lX51-Syh;ZSvGW-BNlMVpoaipzZ~JzX?P zGxJI;;!6}jAqI9!YEe->B#IRjkkl8amVnix7?+n??&+clN&;YO!GVLKE3??Q(lI5a zD7Cm)14Sn&9f7UG5nd%lnd#}NMUF}Nr6oboz*WQ*xX6m3!Jr9Fd?>C0r_q3-%)FBL z%oI>~g42?g7Py2kGS@LRhm;UtUm!V_YKc8JKczG$Re|_4&!xzv2#y#~28ZWWMUVqg ze5Q~IOM{@Ks-S?HS`{*jA%OywME9DZS(2v<4mmRu+;RbqemM2P$_7P+TBI~omRM8_ zE*1!t!Bo$~pi~A<ZYbe~k{b~D7^)b5c7tVluz@7zWuh#A#F++~`K0IP{PIDXqoJWd XO0I@#K`)O{b2dy7mx6-6mKGNPfz^it literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/cross-layers_openqueue.c.patch b/pkg/openwsn/patches/cross-layers_openqueue.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..2c170ee734b1b21ca3a9d798004339dc5f1149d1 GIT binary patch literal 3493 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV53XF3K-1*3C(*Of4z~3l^59mZs_@ zbB1J;DmWGtDHxe37#dm`7+M*dD;OCVnsDjr>M9h0OoAGrTb@|})=9K+W>%)AR;DHp z<Frr#7s$0{I)<hSAaO1(1qFS5TiigQEU_pvF)1gtSOK>p6d5iqU4@d$g4C4MG=<`l zqSE9Ng=#Kc1qB5K|AN%KK#=cU^Gb>;<4Y94K@lAo>Kf|m<Lc)g;t^}jrK?b@0P;9k zF1{?Ws5rjFnoE~U0Yel`z?!gM3X1Ye@<DDR)-&L^Fw-$KRM6Gc)dd9|D9~US#8)sf z)-ke#gr$OlzLpl3f<jDEQD$nIf@fZ4NoHbBW>u;}Nk(R|LT-LaX-=vhmx6+pK9{0G zS$<{;k{2@bGD|cx6{@*FA*E27nO9;FU!ss{4dJKd7b$3D+8S7A+8_m&b*8qqCRB$4 zasU;j7N?fPr-Fi6LrnuUIQ76G8=V=esc8-NpP{9WktxK3l=}eWE4upv79mg?952Qe zIwmHNcmYL8QEEwPQC_h^NKmM&LS`ByM$$_2l1no4^Ark-GV@AOQxuBxb5lz)GV{`P z6x<wrf?XBzOEOZ6$}@`*(Uz2-pQDhHnpBz|0MZl>4oyVFfn_ifdVXn1L1_tEN+&g< zLD@)GSHajs$HV{<U3BmmN_^7RbI{m>QQ%m#w9qj$fJUQ&LJTYxUE_m8ot<5SgB8j% zQu7o_GEx=Nic(WE^U@W{6N?p!OOumR(@Jwdc@0UAo1>=>LIWf_DkSHZ=A<a(<(DX= zW#*-TjVdlkP0mcqOifWJNKDR7Em24+O-oBH0+|NRxv51(`9<+1NSPO8c>q|g6IiJR zdJ51|D9A3snJ+y3LR^D_LIXnLU0j`g9D^J~JpKJNG@*Il#WUE^$;UMwt|}NL1*#=1 zO>_(mplM;ygie0>pa>sWGJ?|J)MRL6rekPq1Su8J$~w2A)KrDUoE&fpK#BKah2)~t zL{RaNRH=}t08Jgq@ba8XQ6Z)vu_!TDA-_B?wMZc(BUK?YB{i=El!l5F@<D}7szP#p zZb5!tYF>$sLP=tFYMw%7o`SQ#Z-Bp_t6xaG7Bq1wpjQh;sk!-Osg5~0&JZ^^RcgTM z2C%F0i?F3CP~tE&GSV?LvVfEnH1I6c`oZ8`XdJ^RNL-s*>KK|~Y2_#+C+6g&rYIy; zDg?O(b8#tRv`e&*a&}Q_v3qJsaB5x&B!44HdRR2Ts%UujBry{knwshunn7C_$jvbd z9g0$NQ^T>a;DyqVP&PNwF|;s%<tPOO1xOLC;1}xS11i62i3{MM)a2C6veXos1+uw; zj-k03EHhBcopcFfBO_BCBV$7f!Z<fE**&$yF{O-F!E0n>sAFVgPC@XZJCW)k3jjeK B0(JlZ literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/cross-layers_openqueue.h.patch b/pkg/openwsn/patches/cross-layers_openqueue.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..8a9ae20bc379f454b56a74c22bd7a1fad6638c05 GIT binary patch literal 2098 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV53XF3K-1*3C(*Of4z~3l^59mZs`u zaE4@*DmWGtDHxe37#dm`7+M*dD;OCVnsDjr>M9h0OoAGrTb@|})=9K+W>%)gR>lSp z<Frr#7s$0nMmi>@3LptC1rR9B%qy{oFHum)FV9OYvgT4ys8vWwO)5?IFG$S`1Uc9> zucW9lzQme~OHn~z-xfDeC`&BLOiap2Empv-2t|gAOM!rq1x5KK`6ZPFM4JgQQXw%V zH#3h*QK2k9GX>;LBn%2$a7@H!=4F;>Xj*eADkSCS=O8HoF~NZlP?VWh5)W1lQV4Rb zLULkGPHKumQl&y-UZp~Eer`d2UTR(mmx2O%kZCC>AS_EyEpaPKO$|s)&Q2|HDosmE zEz*DmesWQ2Vo81x*eR(+MfpXb2mv_)f)R$Kp__ndWkGg{CMX*5`n)JLH@_^^F(=0v zWOHhYQzaI+DBur0xEcQCc_=1;Qxez>`ua$rRg_xHrHDU_ic*W+Q%izV^GYDW1PXJa zv;?Ilr)HL=rXaMTMU|(ktE+{9k)f$8p?JzoOm<H#aY-ymgc=44{rJR`l%n_&ErpVN zztqh1j3j7eVFo`^j6+OvOeupJq-hOKoLX933JNi`;LHxnjg|_!y1Kg5&yBhHDWy57 zBxFi1MJ`1JP+m((O;ac?DJo4aQK;rp1f@ZAe=2~pM08-NYpAP_tDk#_M=U5C)gt-6 zEU~B<Txx(~0wvd@aujHv#X(sCoVSR{=1|2TS0g1}nq>9-a`em&N^9VtjUQ<_9UAQ9 V<aVf5v=|!<IUedVP%Q_`^#CczjqCsb literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/cross-layers_openrandom.c.patch b/pkg/openwsn/patches/cross-layers_openrandom.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..0e04c3aa242c8e3f6af19508393ee39446097d6d GIT binary patch literal 1693 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV53XF3K-1*3C(*Of4z~3l=5jrR3-8 zC3A*klqxtD6e$>)C>R=A85mj_n=2R@7@BbD>gp;KfsBHhp<A9=0M<&pd1h9ordFmV z5c9N90T;-<COSsu3LtSVE(HaBeOuf>p)9c|GchSAwO9eSA`}@eE?tF^%7WCC)HH?S zlA_Y&5`}6mT?GXNh0@Ht5<|225{2T7%(RmDqSSP2knIZYi8=Y1#Sl@2qSW-v;*!)N zh0@~G6ory}h5V$F#LPT}M1_Ll)Y6oET}TKj<dx<or517ND%2`KMB>X5i;Ck*thsc# z6i|hbdDet|Tu_u>k`M9$v0f&^$kL>o%w%Fi(AL(Li%U_VEI%_v0h9=!{>#kEEYZ+Z zsOAENrGmb`LUAf6gfdd0{(}aILV9XmYEfcIevv|XW=V!ZNk*zdPGWJ1f{{W}Wl3tW zLVg-p%-7LbAu%PTD7Cm4Vj|QUP%!GjV@N^4R>8m;p8{=Lh0K)P#Jt4x)S~$G)DquH zPZteG7nh)TLo+8$T|1B+@rGte(FU<vMy6)eG0QL(WKJz8nBb`jDX7v@OAO7D5P=0! zV-a7XppXgDhMW}Pp3W&vg~}ldL3|I&k|sJv#tOQ+y1Im8n~W?oj8iNq8IPt~a1J0Y L)uIF#g((*R{W$e- literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/cross-layers_openrandom.h.patch b/pkg/openwsn/patches/cross-layers_openrandom.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..303b08863cd33b594e857d4ee194e1d5368cdab9 GIT binary patch literal 1226 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV53XF3K-1*3C(*Of4z~3l=5jrR3-8 zWpIXMlqxtD6e$>)C>R=A85mj_n=2R@7@BbD>gp;KfsBHhp<A9=0M<&pd1h9ordFmV z5c9N90T;-<MmmND3LtSV1qJ1l)U?dJRE79>{{UCNAV)tJf8TfyE-nQHeJw36MTMBe zl$4VE^rHOI0)>p!oPyM%VlD-Rm})esAh5?EG71V>`dna-fGyJ1)zu}@BIIy`n2G8T z|AN#!OdCNyLc(CL8k*=BnL_*u@{+zSZlF+7S&*8Nnx=qT37QNSm!g6`UL(sAi!u|F za#D+lH5451c#SM5$}h<WIh9y5L9Q&z&rDGO0Z^)fB*OU2yvz~}O=~Vih0@Ht5<|22 z5(OmL^wbhVvm}r_DBQHPK+#YOj#N;PS}K5J6(oh%u^@L+IY@K!Q%ZAE6^IX6E=4Xy zc-$736qP2ID1ef$f&#+h#Tl7tCGkb6>DCGg`uYm)i8=Y1#R_0ig`(8-%;J*NB8Af8 z)D(r1e1-g^lElnBg+zsd;?&ZVd|gO*D&&>sCZ!f}DJs+|Kt$rp5{ruCORVV~r=Z9t N6t7S<pa_J;EdZ{tQGfsd literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/cross-layers_packetfunctions.c.patch b/pkg/openwsn/patches/cross-layers_packetfunctions.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..718e0f79b9e2c364254a219dc3f713ffb8f81f80 GIT binary patch literal 4864 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV53XF3K-1*3C(*Of4$bFGx(zPAy3* z%}XxH%+D*<OXdv8C{=JQC{i#oQ7|;LGBC6<Hdin*Ff`%P)zwuf0+|OjNVhz*fE+{3 ztV~U<Oidt$YM}xykjo9tEp!YmOcg*<U|S&q<_fyHy1HBn2#}bPQj}U;9G{b#mtK;g zV5?wZjVzs1l$w~05J^rfPE~MpaS4hyG_r8A;?jm1gb;W1i*$Aj4zWTu1j7zPGlY=} z3JOq5wBdSEQqvMkb4pMQ0fks`YEfolPJBU8W?qSNQD#YIa$=5#v%hbEzn`mLNPK{! zv$t!ATd1FNh^N0_u#Rg`P<(ihzn^<N*vTQ00j@f5JD@Jdq%=~Cit>vJ5{nXZQ%h2d z;!8AP?l;u6E2%6<)d7VtC}3e2#8)sfGuJUPH->~b*wljT5?#B3#LArf#1sWxTZN3& z#FW$`Xh=f?0IUWY_6pkA)nukAXeeluX6BVx#FuDkYJl}X&DB(}!6F4pkD3aa3e{YS zV3#N;pog9-$d3eq&coHw#Wg5C#NR*O$KTJLP|#t9n*r%sz<z^-hbA<LYQgE($jnm5 z$lMeu{eqQ3gJG}*FOi9J(1b87B|~X&f;Kia(lNHQge7Qw{o>SAg^ZGt0xNy}^73-s zywnoC<YK+j+{EHyz0{Oa{p`}B{NhyolA^@C;)49568%t@0KJTo+#DT+{34jnlKlLf zV!h1Nk~F>iqI7+bw0==qvY~;wA(w&ziY2LedgYnfnFXmSnTcS<AfA3`acWV#OJYf4 zdQoC-d_YltNq%yEj<RP!nOS^5uxqG`zb+(LxfB%2@-tHu(2D2y<iwoh(wxMSROgJ; z<m}?oTn+z%)V#pb)Y4Sfypp2I_!2FJ+~RZ{1z3(#NQNqmFDNMjWhz}zrUK=tcu>g@ zU!tH;lA2o(pORW!5?@f1nwD8%&4o`*Zep^TNfI=9Lv4W=0kbLEC>BjRC$pp^CpA7J zHK!o82rLcG+WPvLd6^}di8+~7iJ;mCQoMnk12@YcRzbm5!2oI?s+=KA4s4nhOb^JX zAWuT{LF6=$CAAGTk>vFCi}Op1l2i3TL6DgTc8LNgY*LGhAw>{+BxDvC8d)TT<okky zLPJd>w>VwbF2@)gh)@$8Q&Kc_)WGfqnF|eCWD!U}YFb0=0F{&I_7o@PraD5ZI1Nmr zGE;IB^Agiji{jH$OMELmT{OTIML>|Nn`eZkCMd4KepgUXKn;I`Sdi~4(o&&TV<<3$ zD6lX<D1ZeLEMOEMNd@9|1qFrtywqan{M>?^)ZEm(lHk%@4Y1c?p{|4C0v#imuNA<# z1|0lwlU+kSi8fXPM<AG)IB9C?+JRy*-pnLP#{$JdP=r9E32rOIKMERYsa6&SnnXJQ zpTDqKLyG6XAqX-g9+Fh_FuhZ&keXARid0on8c(<a6qc%V?H~b#7NU?G1P@G7e2L3O zlB1C5IK!S>A)yP(*gA%0u;fw;F;rh4QmaD>D3mylhU6w_`GhJ3&PNd2zztNWA~N%e zzJ6Y6MG3SaM!ri-;tQbF4yDfVboLD>GlN!95C;+R8aObZ%^n>v2NJNb<`Ou`!wL;h z(8k#+7*x2qL7j>!Z5XS7Dy^?yUX)pqs*st7;wWqt1FA^|unJ2HOFe<A)G*c>+@v!$ zHPJD)gg5C>>i&`4zyMdh<TngpIZgrIHb_+{D$UEw%u9#2Wgv+SHDZWsD8Nj&1px(6 zyGx;<IJGn-AC|8aVJZ~R$}|l~!KaXzm!jYr>S<;Itt1E~c?}#@6z&q0TobXDm~iia zDiX9x4<bj%I!HD}Z`@!Mmk`7B^%WpF8WKgQ<sn^)O1L`)O=$^p5h%&oDnLs=E=8EI zLQ!gQYKcNgMk+jgD<qc|6{Y5t<Wz#nGLQ^h7btgOE6`wVHEbmqNDdMoM8!4KE~=K# K(BTn!mCyii7};C^ literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/cross-layers_packetfunctions.h.patch b/pkg/openwsn/patches/cross-layers_packetfunctions.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..733d43ec606612bf52499c30d9a8943829d71e1c GIT binary patch literal 415 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV53XF3K-1*3C(*Of4$bFGx(zPAy3* z%}XxH%+D*<%is*jC{=JQC{i#oQ7|;LGBC6<Hdin*Ff`%P)zwuf0+|OjNVhz*fE+{3 ztV~U<Oidt$YM}xykjss9EEGV(TnY-xDXD3hd8rEV@d1v`-mW2Tp?=OGp8kHp@g7`U z3JUsKT3m_>F^MTDCHd(^`K1L48L2r1sYS(H3JNjRAOcA$0PIyam{&ov)nHG7?9<iN T)g{M1<iLcOsDR=gtd;@*VqAV~ literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/debugpins.c.patch b/pkg/openwsn/patches/debugpins.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..baa264464011588f2abeed0e518fbf77610b6df6 GIT binary patch literal 1330 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV53XNlhwEFUZU*)=TCL$tYEDEGSYi zGEp!zv@*1`GPYDOGB7mZ($&>fC<1AQ>e4OGEFfrtnU$%rm9YWD1T9p+1#**t0!R>S zxS@`Tk%F$St}d6hg1(j(m$pJoQc-4VngYmDh>I0cQqwZ?GD|Y^^Az&a6iPBu6_ntP zS5inSE>OtLPbtkw)#K6z=}#;z$;dBKaLh?eO-aejOH~L@EzU_S$yBgOgbC@DLxdbM z^NKPP_0o#$bQBc467xzEiz>m+*5lGv(9-A9R#48&OU@}xNmWoPF3B}EN;5R5h|kGP z(#udnk%YSkECKS1zAbJ5@lk5A0&XQ}GGL$S<2AD^u_!Y!DTjDdi7>OED8D4Xq_Ti$ zLy0l7G$|)DnRu_;g3T<;&rDH(hjKh9J!ohuRM%pYOe;#vO^q+fPfyQDg(^}&(+^RS zoKu8XzBsi6D$k{jZbETRehGd%z$$QC0hY#RLt1ezehWYfaGMX3#b<m;VsSQp^T8@` oTL6~EXG3Oj5q=9m3UHeblEr6yQDRDFK7I=zN^n~Nkw>xw0MZef@&Et; literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/debugpins.h.patch b/pkg/openwsn/patches/debugpins.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..f0e9b0f37af6562caecdcc14ebfb73ba057a3216 GIT binary patch literal 2423 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV53XNlhwEFUZU**2~}w$tYEDEGSYi zGEp!zv@$TXGB#H*GB7mZ($&>fC<1AQ>e4OGEFfrtnU$%rm9YWD1T9p+1#*+2j-inP zNSsSSL0?OYOF<zfsVFlwO~JV+zqnYpASbaTEx#yNAtg0AC$T88Br`uxK`AFSrC3QJ zsklHPH$SB`CsmINq%X0wBqP5_AtWO|H?deDJh7xCwK6YN!KNI_a!5^0F4jv*Ey_;K zNv+gNO)0h0QE*F5Dk@DZssy>vNRLZFK}(;DOIJZTGc7MAHBBKt-o@1^)IGq{FF4)< zB%YF*mYJ7|E)H_MzAbK`0M&+D1-cB#NBVe;EU7F=1vwF2Cr&;%1`Tx#%@uTYb#=M4 zad=W&K^f{=RL^UJJgKF{rL7Q?n37VGpI($-TA<(*8~_rj1`$ZY@Dv3SujT^j9R%^J zpnyL}q5j4hf*2CCh$T>FK*Eq*Vya_e0?8(zSiqYu3X1Ye@<EBCSOLSmSOvJa6cx(y zGgB1ckrtnsmsz5rX^llDttc@!HNGT2Jv}ECqyj@LL_u;+5gys%RIuram=+i3<d@(x z9W0N_aIhq9v(t)m@fi)0#$_@{4!6N2iN)FYOa{y2G8!z2+w9EZB78=Jq;Z)HlEZCq zQDRDFK0c!%3UC<?k%b!1rJ$gknwOH91}<WZ40KFQAY}~w5-TVHYg%(*Nm7sm2~Dvu zW#|bWq6p+!{3<{mhN-}xdSR;2Z2~7!d=`Nf;I{{q90_@-I5!@jEg&QCTLMm)1Z)AT z!DkIv0e*Wx$&`RKASL*00m<XH1d?0{SOZan&mxElB&)a-!L1fWg_v3{C;@6f!1DtD D3PA9O literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/eui64.c.patch b/pkg/openwsn/patches/eui64.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..31ab7cebcd9ae54a208b37fa486edf1ea7bcdb72 GIT binary patch literal 1256 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV53XEzLAD(M#qG$tYEDEGSYiGEp!z zv@*1`GPYDOGB7mZ($&>fC<1AO>d-CEEWoSV%*xc*%Gdy+TMHF%f!t!C01^ZnY^Y;w zqM)m*tIMUWps%IHrL7Q?RFs*TrU0@K;!=f_)U?dJ%#zIfJcax;g_4X^1tqYfl@yYS z3lwtmQ%ZAE^|-V_dJ{`aGV+TQ9CH#=Q&KYXQWe5ei*pi7G8JqRVM2Q45Fv-myrRrR zy|f}b9R;t%ywb#?O0bLdxU?0t^ufj{XXYj6l%}LAC>56!W#*;pWhilJD<DL{t^f;y zT(5778$kS!TC9Lu37QPpM1|s#Tw|j&Lj&WY)Jh!%OEcZ1%o2styv)MVR0U5Lg~XJU zqSWGIkfXqXl&TQw=NTC48t>^6@8lTl8t>@h666{jtN;fF6^3qZZf@qT7GNLh<8^dd zVo_#dQV#LX2Ai3jpI2O>P@0)nVi8}W0O4tsW~M0EDri7>FgYzSR}+V$t-+?@cVR(M zeo1~wWdYGnB*x6rq@2uT;$zAdY-U-0W{LthLByx0mS{k|s0E9nko@qX%#u`1E^UQs zE^P$`H1TMISOr^!(#(`-gIH^9@`f;ZL+tWKFnJ^F^2RWEW9;%KFnJT~@}@9(Q|$6) eFnKfV^5!skbFh3ZILrveZDv_wNh<LX!36*()?pn0 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/eui64.h.patch b/pkg/openwsn/patches/eui64.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..745506fde9c4b745036eff8b6def3f44f3189954 GIT binary patch literal 937 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV53XEzLAD(aYcr$tYEDEGSYiGEp!z zv@$TXGB#H*GB7mZ($&>fC<1AO>d-CEEWoSV%*xc%%G3m+TMHF%f!t!KV`!uR66aD- z(AU!9Qc#FVD#}bvQ*bWIFD}+C$Vn_o%P-1RNJ&l3Ni0e%$;{7FPy)MCNg=7YKp{6j zr8Fm1j|-$Rv9u&3zeph@BR@B>SRp*Iq$IU6FIB;&9LjP?O-(M=OG+)uPR&WJ)Jsh% zwbN1XO)N^z0J+adk4r&8OP`BNS3x;5EiWZCO(8zsHPqA0B;ErgmXey5nU{(z#-*U3 zoSB!LQ<{>hU{hR@l9^YcmthBTioU)rZlC})3AYM#8F088>KK|U=<4d~a%p36ptgcC z)L4Y0wV`3Etq_x#l2VeNUX)*2px_i7z@@DaQw<`Jgu!77607C{=^OA^pj+625+4$V zq)JO2BWSV&C3zzg9b+R%*mEf;l;vlpD1d`2K0UQWqck(G#3H^#OCd2Or6{$yI3z#3 zD6=G0)0&G*8=R!I6=G^Z0Sh9u^ueL4oSK)CnZ^~P;FqtEms*|!N?3^{3aNQ13i)XY JX_+~xTmUTa23`OF literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/exti.c.patch b/pkg/openwsn/patches/exti.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..e96f8fc4b4b21ca0d3da91410605e8bf9f1f631f GIT binary patch literal 484 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV53XttiRVOXdv8C{=JQC{i#oQ7|;L zGPJZZwp1`OFf`%P)zwuf0_lTl&@Im_z^B>F%GB7(*Z`tg3l(sITw<UA5(JxTsAFiN zpsTB^%cZTLucgJMtq_w`l$n~Q0J0C_PKA`zw9LHBlFa-(h5R&yl8jUZC6JSq6q1Sy z6ms)ZN^?^6xU@l96H7}n@{1H4a}rZiQZn;W6~a@Ca}rB36>Jh=LVD#8A&1PoqRd3S zv?4nl1+T=s(!`=lu!Hruv=y}U!N%$9D|qH5=ai<T7K5D#awhp0WT=92Cd5DmrQ(uY zW1}=fgNpc^%p|=GB`$5OlIaDR`CwTtZH2P@%oGLJijvHD&%DeM4G>q8OIx9uOIx9q HOPdP-(ujpG literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/gpio.c.patch b/pkg/openwsn/patches/gpio.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..1da8fa3e9893245feabbda9473950d278c985b49 GIT binary patch literal 1504 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV53XFUZW-OXdv8C{=JQC{i#oQ7|;L zGPJZZwp1`OFf`%P)zwuf0_lTl&@Im_z^B>F%GA`#)C8hg3l(sITw<UA5(JxTsAFQH zpsTB^%cZTLoSB!LQ<{>hpj2FvYiyKeXiyPfl$@-Wp@c&+wW1^ww=CFOXnNsdT-ply z`nI@%LP}~{W?pKs0&XQ}GF;jO%`8hS%1lhkA>LFX%q%EP%E?S7-kG+xAVayd70U86 zQxx0-JpJRH^YhX&)8id|eBvEF{WL%lnq1ln)m+*N3J?{Zd6^|4l?ACTsc8s-;F6-! z<dV{&RBMol3JMDP`U<XjApe2YxF{s%K`d}pNY2Sm&ITJ7<m?>p7~o_SkXn>kkl_px zcg{`GKoyP$Im=O@Mgfbk6WAC9>;S6{XY2;KkYtdfo2S2yf~%jSlaH$=l7|Bv!N!0b z91jX5c%bNkg#t436l}r45g(A57w?#pV~tn6Z+=QDOaq7wiV!p%8X$umbrjS<G^(8- zhe6^Y01`}?N@(jWCqmA0#_M}pg_biRXF<{ey+g|dx3g+NSqe)gEiFnc$;{6~$)g~( E07X2fi~s-t literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/gpio.h.patch b/pkg/openwsn/patches/gpio.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..db81487909c5df33423afeaa10eb86d3685cb83d GIT binary patch literal 533 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV53XFUZW-%is*jC{=JQC{i#oQ7|;L zGPJZZwp1`OFf`%P)zwuf0_lTl&@Im_z^B>F%GB7(*Z`tg3l(sITw<UA5(JxTsAFiX zpsTB^%cZTLoSBxFlA5LvAMYOE=^yU_5=u!;%gjqf65`TU(AT%c4HO_ciWP7xL6hOq zCTM0^Vo_#dQcfz-rV?RhK~a85eo18k(T0M}EX&VKQ2+;zbADc0W_rA%k59a#r=JE$ fLerW{TLHvCR#94%Sdy8a2Uh?J)zrL{%rq_ln=*{~ literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/isr.c.patch b/pkg/openwsn/patches/isr.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..dc9562cd11925d182b939ec914e4ede6b0b63391 GIT binary patch literal 1693 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV54?EH2VZ<_yUwRd6gQQZO=6Ff_C> zw6roYR4_6yG~v?K)m110X@jcQEzc~#qu0#J)Y!_{0HRk56>x#vVW0pK1RHCpV`ieD ztE;QarLCZ^rQn&DoKu>TS_~Ef36qbt^g%}ID`!HCR8T4|$u%}gGc>4(&n(f)P~y^7 zK*;5!rW8ZO^pSKV6&J*pWag$8L8K7MixN{Z^Rdbl7i3~p3=!1VN3yf1BpKOs6uHvG zBB&ctgi}(JO4AE6^Pp};a!_(I#0I#KO>s#|X1-pA9hWx9rzxpvnR%%Su6~YAKCbaD zu1=xu3K|BQASrkNflUV+!=<fImY<oT0CHkRVqQv4YLNy=0HnT}OIra1z-DMDsTRlN zDe1(=2L!o>gha->h59*%c>4Rr$7@<c6=tSs1cf-qyQh}8<s_yDmn4>y7K24RL*gBM zf;1HrZ54uCgIz;Frh`m|*`S~R(&wC$npor+5|Emgl9`w8lv#qT*BYc=K|x<1tO}%F z!7(SXC|4mfuOzjosI;I&p#Y*$At|#2>L7@@;fa|gZuvz%iNz%$iN)C(nozSKCPGMk zeUK`J(!7$)9EF_3;u3}OqRf(1h5UllqQsKS{5*yHJg}ujsp*-;C8<Tl3K@yT3Tc^n znZ+5YDNy@rxwI8(!O;K;Lr|b5g4`HSFk}@B@rSLxz5+PTKq(?Vv$!a}IJHCr8t$2C z8m<u`o}gg&41oqZSimPUFV)Z-J=8&A&Iy(Wha^gPgN32mV3CT*0U(QEmV$f=iVZYp zCFc}DR3L>yaY3db;Siw6|G@#C@t#J(pddg>dBFjmhB`1QHy=m$_@D?sS8U+{N(03O znPhq}wW1``gi;^kjYShAM}y)I<X)Uf0-6@}^+82ld}>iqeo=f$etLRNDkN$^n!yo` oC;m-9X$x*pkh61qcw%;HX#v6naI%007+fi?^q>IB7Yemp0OOS2I{*Lx literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/leds_ow.c.patch b/pkg/openwsn/patches/leds_ow.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..27b06b821b9356f3aa3944881a7da981b358744d GIT binary patch literal 3946 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV54?Nlht^&o9?Y<_yUwRd6gQQZO=6 zFf_C>w6roYP%ttuG~v?K)m110X@%<1Ezc|<px?~O)YQt<1fpLH6>x#vW1s*M1RHIr zV`y%opsTB^%cZTLucgJMtq_w`l$n~Q0J0O}T!oa>w9LHBlFa-(h5R&yl8jUZC6LRN z6q1Sy6ms)ZN^?^6xU@l96H7}n@{1H4a}rZiQZn;W6~a@Ca}rB36>Jh=LVD#8A&1Po zqRd3Sv?4nl1+T=s(!`=lu#5G$v=y}U!Nw_P<|XHprlcw;6_?~18>JZ<RK(|GCh27; zacL_cBtdQgg(658<O_XU+yLU2)M5qPO3-9LR)GT`Rl&#AB|ga2B|gB@PXQTd7~0qv zX`(4~4{~+&LsJS;Xo{}TKgiL~-4#_ONTH#DCO8!I@%pDMu_!Y!DTjC;5n*OQQGQ8& zNo4`ihJwv3%g;<va7oQctkeK8HLby-_+4L6nv|27OnhY6g3SaOuK<p9P_m5AFNavj zrL9oSrLCZ#ps%ms9^mO8@0pib5>i=^>XMp<5C|?QDorjaElRZprxh@vpr8=s>>TeH z;A9k#T9jFk;hdA7ob8;OqJb(L4>HzCK}W&W&(X=p734()eSMe_AW5*Da4Yn{LIIh1 z3bqgj1Z3vLn<~^GIEDtuJR^vk6ciu|K<-B~%QrtI6=oQS9q(US5+4viP+xFCYHA8h zBbXC!YT)Zpg{e^k<Yp%w1vL<j>K!!yqJ|B=AakZL$P5iI-8nD;<4oOvaiK6^22Fx- z!5uEO;5@6ZuTYel!lkW%$h@gVMfpYX`FUu$7nJT?bnX0If)vzj73z=*T~H#Z#b!iW z8g4UcY>~@tTt<}Sr>Ezn;x;7?t0|?Kc_kL{C6KZR;+@Q5e{>I(S|}uCmK2vHmXsDN z*eV!Q7=V+rf<k7Rf(AId!Muy?QcVR#TLq0$V<SyaJ)ocfE!z}um<0+K1%=d{;#6=E z2q_3L6dQv4ub==?T$EZ;T9k({4<rYYL64!NoXoszNYE%$!(%hOC^a<?B{GUD^OCVg zrxR*)!mCD18zE+3jZdf{(D)=|2F?hD8Uu|`3}aBD6zm$ZVianN8aPJbmJC>&LaM0z zqQty(Q2Ic`a8Y7PW<K^vb4HCce|R$mGuEJ{V2w7YG0<ouYzoeZgBk>lI81|3Vh-Y> zOmZ?K)E-FG`NMrZU~va(&Qzx6<m8v5<hGR5q|$VF%z-l|QrQZXg~bSVY2=`Ws6Yur zh#8siFjS~kfEF1B){tTVk&Y5`a^P-(x5L0qG)S?SpQizCJt#oRN^r(P6N5w<Oc1po z0viwW3|8~g(y&;7CJ40wCW>hVa)4m71uBo>6D;BoyO1T&gDg3-D7iEzu_(ScBQvc8 zQoa(l6w<&Z-~voVn9fmvw$;H#p}Q?JFS#f+H#HCHEO6ogmmz4KBV?{ZK~ZK|Vo56T zt$A?60Gx&(4hAtny(38F1xky?M)4&InV<qkK_M-_NF&qMz*-^G#-Jh%1gsS@wYA~y F2LS1lYkmL# literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/leds_ow.h.patch b/pkg/openwsn/patches/leds_ow.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..2bd0c03c21b4bc8e5b844ef1fe791200d9a91347 GIT binary patch literal 2461 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV54?Nlht^&o9@@;0(zqRd6gQQZO=6 zFf_C>Ftjo@S1>X#G~v?K)m110X@%<1Ezc|<px?~O)YQt<1fpLH6>x#vW2j?jqyQ4< zQc%#>(&AE3h)F8SOifd8F3K-1)-A|MEJ@2R%2h~7P0mRyN-W9D&r?tWxm8IasklHP zH$SB`CsmINq%X0wBqP5_AtWO|H?deDJh7xCwK6YN!KNI_a!5^0F4jv*Ey_;KNv+gN zO)0h0QE*F5Dk@DZssy>vNRLZFK}(;DOIJZTGc7MAHBBKt-pAD?INk#!l#-g3nU{(r z#HFC1oSB!LQ<{>hpj2Fvl9^Ycm!Sl5i@v@sZlC})2)7D!8F0uO>KK|U=<4d~a%p2a zPg_A5YAW2t+RzZyR)|SVNh!%sFUl`1P;d$k;L=uzsRj{9!k`cZ2~~4}v<-qNpj*&_ z(jF3qBuaA~Qv*n<1O+1A$Sf$zFUc>dEJ!U@K#w-;d@e3Ug|ht26a@tZ1yHcZXXa&= zXlPnvh^H16<rl^0=YizVv_PfO(s0U^<fo_Sq(Y=iGxJI;;!7a5L9}KT`{On@DJL^8 z8>|)GsYQt?nfchA1eL<-B#0bNCqbm)PC~b|xH2ypyPXgjtX6`haM}o##c5$mYEo%B zb{nBmSgnM};j|MXjnmS^oE+>{f+et82$DfqhaPOnnMKK^If+H_#Tl7t-~@)2h%)n% zi&Aq_^T2YTvMe<(B{L0N))*P-m>EC{8#-lx`22DWP_EFl=2ArW2_(tp=fM@A<{zkZ zS{hz?Xh6a2P{5Tb;0iztcpin=0m&F332e@UBx9V;gi7OdCPW^uGa*XANeGuCz$qK2 z8z8bcodA}`>jJO}ybgdQbDS=KO5=0_L>{jjAWHB$0+cgwIsq(+(*Yn^RO```BU;9S h#RO`iL}V_gJeMN4eWR!lQ_BS<Kurw=1!YLK0{~lx=Fb2C literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/nvic.c.patch b/pkg/openwsn/patches/nvic.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..ec6bf463568d6e66d7e29e1829324c008265830a GIT binary patch literal 5022 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV54?E6YsQOXdv8C{=JQC{i#oQ7|;L zGPJZZwp1`OFf`%P)zwuf0_lTl&@Im_z^B>F%GA`#)C8hg3l(sITw<UA5(JxTsAFhk zuAr-{tIMUWps%IHrL7Q?RFs*TrU0@K;!uT@)U?dJ%#zIfJcax;g_4X^1tpN1l@yYS z3lwtmQ%ZAE^|-V_S`$l4GV+TQ9CH#=Q&KYXQWe5ei*pi7G8JqRVM2Q45Fv-myrRrR zy|f}b9R;t%ywb#?O0bLdxU?0t^trSZlr!^^b4pWE6_koga*d7B3=Jycb25|kGL%40 z)wjhBAP!C~R=}+UO$O|GeY|FtB^G5SCgl)sDiLND6y=xXmsA!IZ74BjmL}z7CKK;< zTd<jB`I#vSeqo-@@t~O20C6?Bv=yqkv=tN-lrz&(QqvR^!d#t0;zJyr;)5K0!4mpf z3c;x*;1m&-np~1!q!0oMB88;H;#7s4{NzM%nn^5CFsLvxfB;C`DnRTCPA!4x18dU& z+Yb^5NlXISp`&0>VW4RZwn{lQr#MwXL0=2u3O66eU=IbDfh4%az=A}#fNer`O<qc7 z8ke?0EjaY_^^^1S(lXOaiy%HOO)M%=$jmEAEh;J~E#cBu0EH*S%OEMV;MLc6hU!iQ ztFclDC`wJuEdU2zKv8CXQD#Y{f~|tFLSkNuLU3u40<s`Dbig6!nU`4-QdyAdlA5N# z2^R@2DJo4aDJ@Ecgd?W79z-Z8&^aS9FE2Gm0SmBI2n}`&3NeiL3<}I6)*ys0;O+(a zf>`arrAY{VP&e5s7!#}AIX4BW2|?K^xcWId`M9E)p`iu|g1pQUcxZu>9roBQF37|Y zxy1#UC~*tTIKcs)@t%J1o_-;&K|!GbA@RQcF0SBsBR1*{u|>Th*a*1OVNnkkfcpi_ zyKr&znCC=<6r5$N5FFr1dAuvwDi{*$45WxhxQGP(&bcWFeK3!Z8uiMlcyoACaY0FD zZfX&ZgaDI9Nev1L#74IfU7}mTRw2aG*ND<QZL45JM$D3uAV67})cC`mb&E=p@kJX< z8c(zZg*Ypu=j10P=0Kyqw4lTaoDqqQT>9i?Sh`21Z54t-oGFcN1zQCJa^f525YjR- zOc$IcF&$vU3@H8_a}tYk$&Ee(BJw8A5*F?aBnCKEz)qq<)R0ri!rekb%!0BcTpyG{ zV$|ShI~66SWai_|q;LhJ*%aDj!`{*w&8Fy$WwaL4Xf}oR!$3U;5*xwbYzi$y3()#F zU^%qRNm<*+09=m4Teh&KF1WiC4{|*`Dv7O{pk)>+Wvk#C5#nh=aXG9&W}67^8VXBd z1?m*V`DxGyE-gUq#KQWk;NC7;MC<Dl9uh#rCU~>~)Yk$F>FXOQBxRNqE2QNYVeJHi mI>1Ouko&@51HdT+)@yVx$}cT|I2AIqfFcoZ1hN)f2>}4`v+<7r literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/nvic.h.patch b/pkg/openwsn/patches/nvic.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..ff145d0dd90c0f97e58a13878a56f3b4df157453 GIT binary patch literal 972 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV54?E6YsQ%is*jC{=JQC{i#oQ7|;L zGPJZZwp1`OFf`%P)zwuf0_lTl&@Im_z^B>F%GA`#)C8hg3l(sITw<UA5(JxTsAFuP zpsTB^%cZTLucgJMtq_w`l$n~Q0J1ALza%v{#MjtJAtf~}GcU6wGe1uuKTV+|BUQmK z%+pzqOB<viv9u&3zevG3BQY;sAtW^~JuNj;!KMVl&`SmhJEZ3(X6EQ6=jYn#C@6T9 z=2U`QXQaoat)Qh3HbprzEiWZCO(8xWWOBR*m$rg3*w$1eA&?{WZE*vLJ5!4la4SKR z0o$#Q*UYlSqRhmk9O6wS!pwrA{F3~V$^xPdg_;SDgv1<h=qrFCqaZa86idY=xyD9Z z+6ra)nJHk&c#ujB5LeS0sy8`5FD)~@v?vi4jhT5RsYOMl1ts`Raz@sN&&b^Tl+v73 z1&FZ)r38#EO)M&bn}+1@;(|<U!b!yiC7HRYMcCwuN|JHQC8lKN<CldS2}*ORc`2D` gTrmoM`3iZd<vE#osS1fD3aNQ1poE{6nUl%|02wzOlmGw# literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/openhdlc.c.patch b/pkg/openwsn/patches/openhdlc.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/pkg/openwsn/patches/openhdlc.h.patch b/pkg/openwsn/patches/openhdlc.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..ba3cab76a9120d8fe89603fd768db9ff4378f352 GIT binary patch literal 343 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFU|wg87Vo*dKsJ{8Knx21w{%*CJKgz zRtAPv#^wq}28JeFy1KdwMIgOUO}gco1z?SM3^21YHMKG|ff%5L3b;TnGBngNG*<vg za49G#XXYj6l%}LAC_$~z%TVItQc%#>(&AE7h)GOIDalVS$}cTYNG{4RF4oOStV}H` l=2B3IsRj{9@*XZe&LE*`u&W`K=<4d~l4MCrQDzxI^8w4<VkQ6p literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/openserial.c.patch b/pkg/openwsn/patches/openserial.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..4b255af179023db5dcb8cd5b99164cb92f62637e GIT binary patch literal 39039 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 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/openserial.h.patch b/pkg/openwsn/patches/openserial.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..ae1da1ba551dd4385aa166498af0d8652fb00028 GIT binary patch literal 3847 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFU|wg#i>P^i8*>1oFN&d3XTOu3PvUh zhK5!KhE~Sr3PuKoCS1C@x(Y=g-B4}1<(UOwt$2+vvobZcGBtr1p@j;#K&~=0&@nVq z07-BuC@5#<CFhi;q$(&uEz!$R;^I<J(AU!9QdEdZOi3xpPcO<ZEl@}<$}cX~%}K0G zEh^?xP>87p5lHg>1*v(#U_XH*s==;@Sf#70t4oqqDMguOMA`!K1`-B)(9A%`(g5N? zkWch&aRY^t%7WCC)HDU$O3-A$frHn`f};GAe2}@tM4HOQrKnJrpP8bdpr8PX1xU(> z&&<m#(a^N!QdCGSD#|a4FF}?pD9X$$2`))2DJ|A0&CDyYh%Zqn26J6=Qgc)DN^}&U z!dePRrD<uYMGyf)v-lE)oYcJZk_@~?d*-F(!wpVO%*n~jOOH>^&n?K$LpB`hwB-Dh zR2?pm`|)A0HwqGq5_3~aQbGPnEJ`;dPn!{5$Gd{UYsk9ZxhS(FGdVG5$a=sfu_O`Z zc+}JfN~K7N51K-e({*}kiC<|h$ONa#lGI{Q`d5IZWHfc2c?G2<PT;hSZd*uxcu{6a zDkRB+EX_@<@GH#)8wpN1Sh8DjNn%k6*i4Y6SaT#;iGOKHK`At2Vl^he0AfH=etr%p zJEWv0m8J)P@@srP%)y>{DXA4O?_n_|H8}&G{Xjv8$j+eL?30?OX$>ie6f*NlQj3a8 z3rZ9+67y1WK*c7)?U}_z@kk{~Q3b?hFbmP7OTf~gB2!BXREF1r%WyLT9YaH71#lq_ zlEYi}fr>p6i&Jd{eY{5I=BJeAq$-pp7G)+T<)jiWRJpXdwBhA?aY<2Wa*0AUmo_LW z^z{`IQ*tx&AUs&|Q&3RI%}+_S#t=osoO6CDD4d~6^z{`oL5UATLs4p>8>o1THq<uM zHqthXwN}vAS4hiAOjpn_bkfvONY2mAP0UMC&@ck=oP(U9EVvS!MtY`HKy62Ic1~h( zNl*nSSwrPuX-+{wA*r;uGAK1UHM1-;FC9}F>;c!}<irAmG{|Id1)%`(pL0<%R3k_R zl#djkGESvwZkahbxMib*U4uLwed0a+0zyOLokHE*T!Z3+J)>M>p?dW774pG33F2cU zheL#+Hl(IN)q`9BbsIzhR>wi4oJ!L?Q!2udbVA*ZEFFYL8s>Wc&=73SuSG72$`Xr; z<4df$v<YSosx}Njc^F)j<(Gr&Rq8YkK;eW`K;t%hNVE@dJAY`j5OBMH$g~k~djV9( zqu1Mr3L7aAf^t46T_ROv=&b~3W}tsd0ctU##zk@@a%%y<y8HqSxB^%~h^TuoTMbaf a3fOuLG;29PEk$@0v-JQ~0xAe$EeHUyK8@u7 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/opentimers.c.patch b/pkg/openwsn/patches/opentimers.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..e5a046ee25c0c596b9fb6db3fd794a21ca91a44f GIT binary patch literal 9303 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 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/opentimers.h.patch b/pkg/openwsn/patches/opentimers.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..17795ef572faa1ef91020967dc94d1f9c816131f GIT binary patch literal 2082 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFU|wgC7HRYMa6m<oFN&d3XTOu3PvUh zhK5!KhE~Sr3PuKoCS1C@x(Y=g-B4}1<(UOwt$2+vvobZdGB$u1p@j;#K(4aXF*H#C ziGwY$)G;zq(ACw|<>FFMP|nOt&M8evRZxOjsh6R|#iflTo>2~VcYJa|DM$`ksvxx} zvmhfrIX^EAEXAd*ps%IHrL7Q?n37VGpI($-TA+|plv$QqR16ZW1`$Y7{spOdA>cp( zNq}Uv^trUT6cqIJZE*vIl+?7$yi^6;D$r#>9@W>^SMW`&$jmLxRmdyNO-e0N$WK!M zd#zZZBqOmzAvrNmp{O)ZAvr%UxwNP#HLoP65)^!(fP-NWU%|*o$H*KJp2kKx#+L8^ zEvYO>O-W5tD9g`GQP9u=g(}37_~fJ#O%0H+rZqT(q2BNhaP<rE^mPpij`s)$GvYm6 z6f_Jqi3kapW#}Hp$p?i5OjBxJX|6&w$VV{WfoKq4!Ng3*6q;fbKp-hUKL<pk;Ecp# z*NTG7qSO>?xVXN)LU~4NNk(dsLP<udLULkGPEulWwn9c?u|i3{LJ~wMHHAw-p;iGY zY)Y&_F2f(~1x5KK`5?y^6B+efT#ArrfIAP_%FMjX5)DmjE(L^Od}c~~34&W3UtE${ zRH9LunO9<L6kh^0CZ)6}u_QA;PlpRCfQJG{eLTp~VC^6VvD#p|Kt@3Hfl3Ec3mtQ4 z?gd**mzdEekRfyPQ%ZAE70MEeG82<>QVGWomo}HS0?1RKoKjp;RGM6(0LuOfNRd$t z4l%GNq1n`_G%ecKF(TeC)HfcSQG#QwxwJtlu!cfWX<lAtUOH4sfPYX3L|1&cr%Q+j zNSgvQpM%Pv{L&I@1$}*(5ZKE6(h?no%shpX%;aoP0fv%f%My!<<4dfG$fdMMxX^M0 zDZB=G;sup0NElqqn40UD86XN$b8{UFb4Wp|fG6V?m*f{{z{?JZw=+|~IT;ix;E06~ za7D%OMX8Xy3>QMu$EA(Www%<|0#E{R&d)7KEe7X&aEV}O7GI)J43pIaB?Nf&R|~4o QKm@ctQ%=oG$xPz{0OOZBd;kCd literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/openwsn.c.patch b/pkg/openwsn/patches/openwsn.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..76f11fcb00457e6ee78857d9914025094fea40e6 GIT binary patch literal 4949 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV2I}ddZw28Knx21w{%*CJKgzRtAPv z#^wq}28JeFy1KdwMIfzEJ-X$Y1u%Uu8cn~Mm8q$fsR=~C7AoKZxyMw;&_Dqs4mRCX z$IwJUS65e;OF=<PpNmUDK{+!oIj1xwRY3`Asa}Q>mo}1cadJj#N@-4N5xPW4Mp0^F z3c6@geqvEde118)cus0cF;rMVL0{h%1Qb$=GRsnniZPr~oLZEbm;*8bp|-drF*zIL zC6H%e7{pgFHr6pQh4>NOKgs!t1u$cDbrli|3KTSw^K*0a^EA0YMk9P*RFs+yQmLq* zua6{Jo|==BotIyphea+kFD)M=3^EAh9b1t3Iho0cC7JnoAW!M*>*^|mI0tYkB86v3 zazScx23RASaAsasYH|t4L^O$lqRc$7IEwc&a`N+1L8?La>*^|mx&)vEWN8ZAB2dCI zHrFw+gvC9=hoD#|CzKE-6rqI?k_;&!gdFTBVT2}u97<?X6o(TmSwU%V>N2s^F}HxF zE@TT!QwnktOH%WaD`Am<@Of!UL2*fbQ7%kIS69I~-w~7$kWDB8WeS)Qgyte>T%#yW zt-zu%BQ+-zi*QkC5<Fob8C#KKh^aUyu`;zNB{iuOocf_jDL1n?87+Tcw<<HY6l5e= zEjSBcCltyOi!u|Fa#D*Guq(h21r<%uQUXH`ETB+OlwXoxQdvN>nOt0o3T643DGHz@ zUtXLSpP83gqM>O`gjJ<UIho1CI^EXRmIxz@GRqQ6Qi(SchwBxpxfDPE8dmTURS_fz z@+hPzMfR%#D3T#z2q{xRN)^CmRdP{&aj`BqNkFO#V;w^S3s|9noF1u^_>pP^q=Y(f z>0cYQ^f!aML|0dV<V>Nhpq!GLmYJ8T;Ogh-<l`Fe;_4LYuApJ4iBiGBGoLmsvXQnz zaY<rHX0k$ZMq&{>>4PIa+S@hA&($a1+27ACJ~+hD**n-X$~E5C(bF&1nv1Y&sFVXi zc~a9FJ#!Y9Bo>uuK;;MqOabXRR2#K00NWQ|0&deltW~Jy(gtS@aI|SCsTRlNDe1(= z2L!o>gha->h59*%c>4Rr$7@<c6+(2!Cl{qAmZWNcav!Le0f)7Y0`9=pfoca^h9Clh zJpF?_Ln7n-16=*WgZ*?AoP%5)LtG(I72+Bkf<q&c#YH7L@P?fN#Cb|!=hkv*b72bs za=i|!$>I}pa^myT(m-V@B;+8CK~OmxpI?p;hBqnU#S%n0%;6vn2-O9pCB+&_{spOd z;lX}TPk<72QAuiw9>h1GKtmV`j!KArkT>DQ9k|THAQTFyQxt=fszNmvxa3tJBF!k` zDY^B*&3&@VZfN@jMuFQgh6V;YhK9zlmW+Y|xG(@U{a~>G3PpW=1yJZ`Cgx;Tr79$) zrsWr<DkSDrD&(grlw_oWTQTU(TyTYg*}4V`gPPSa^C3Z_ua9UjV#t6RjBr8J@JTEv zKyF)uO@}wH6%-VpZAQ3ma6FVG7eLyJ7{cJTB3u;Yb%lIziyBo7TrEOc)(Q#=&?Yrp z38-CdXl$TkXkrYjBnK>9afNCT1!1bMk3Co+;@CnKB14tHg{5974N1g?<~oK(mPm<M zUmwvFfyWCtI>9pFRyeviqBRaqMc`&Qx|*UA43X3d3?Wdf7()=${KgQh$T3701Glrl zwLiKHqO}2bAU0bvb4%g6z{$|WT*uJN04W)Q{SWP-z?G64GSKoHs(oMr2V6<$>lc|} zL=B1I1x-;f3X-yn4Rs8SO^{L+s5XL@z~J=knU|KY;q31l;P2<^7Xq)9U4w$+o&5bn zTwQb^1r|7run`)mMMe2V1&Kw8xv3?oMe!w?24rXfH<fC+Vif%H74lNcb3pCO#1e(n oycAFwotBxC3U0a^ni=UBnwcS`hr#S0P;lw%E1<U`6cuW@0LX$!8vp<R literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/openwsn.h.patch b/pkg/openwsn/patches/openwsn.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..faf22ecb248bd2fbc59f0f768516a41aef62b830 GIT binary patch literal 17260 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV2I}dKsJ{8Knx21w{%*CJKgzRtAPv z#^wq}28JeFy1KdwMIfzEJ-X$Y1u%Uu8cn~Mm8q$fsR=~C7AoKZxyR5*$H-g(B*CSi zpq!bPoKu>Ts$f%Gl9HKMqL*Q(fC}{W74lM3Q&LkD((;QGN;C5;;!AWubcvx^d<n7< zN=f;NMJe%_d1?828A@DS3JUuAwzz>pN@`kWUaA6a73eY`Ba2HCOEQxclJoP5OTezM zh%Zq9Ss7fCn4ImGn420Mt6;03<X@1Q7ar`VpkxhlBGfAX09U{8V88e<*Pvief4_KN zM=$>%uy+l)6cv<lsq*xLsxrc3R)AxOvj@~HE?otEeTCG#lGGxFl8jV^oW$Z1g`~=o zRE7LBh06TWB8A-il2r9#g~XJUqSWGIg-o!pLV03di9%+HLP@?tQmR5?o`R245SK38 zVJ@ytq3-d%{vocOF7dvO!6B{?$15lpRHRyP>4IFBnU<H5nx+sE6zU4%LcIjyDj0$U zQu9(W)4=J<&`8JFP(fE$7ov}L=|CGbl_llp=jdhFaUlsSWv3S9rRIQAjW)hSqfk(k zUy@%^S&&*xbh6>nRw&EQOi_U5p!njF#G;b;l8mC%#1svXjHWf0HZ9VsHay+}f;|0$ zJVPSmq3I8tN}vQ>&eze?PuCFalmSiSCZJRTO*T;X!t)DC8V3~~L?t#*QG<lRg^;PC zj+q&(5URBX<?PhF(p-gVE=5ql_;`kd__)Tq`nh;I`hf(nU|Vn^*MVqo@^r_qT0ud< zR>95DC)iboOF;o*qrN^QK_%zsDCCvqCZ!e?>nJ1^Lkp%9g``Sw?)7x^bL3J`Kz1KU zC_dEB#nsKz&(#Hs<G|J#R2Ue5Y*SEB0BZ<w4#2JyB5JE(P+?$(tRd8epaw%jXb6C9 z@C+z33-S*QafO(OPTDFcD3}-{+u-T!8&GD3t`5!zImtK?Q$xI~vxk3tkZWM5Yj6l$ zHQ3V%hDH{+H3axXA}a?)ih`k$r4G16GBwpPH-ME$kSIb9bpP;plGBBMc>F*l4NyFI z_y_n0pac%w=b&I6bV<XY!YBzd;^1yZXMp@bpQM3Qc7T}R^25wh$J`QDe!%h<Br(Sa zImQPBxw?5q#C!U=`3LzrhIsme3K3B1SHP0`<AVZx(0vEy+bSp+nwnyU2}nb{i>E(W z5i$V^69d!?3C>>-4URZ8m>}B_6dZ;x&x8D60xlyU`9oh{p*%GwM<F{ezdTQ&Ait=j zSV5yaBQrTep*$5@kZB?cFR)|v^+TKkxWLSC?|}Fa=YV*RkPw`<f~-`qFo0xHb7LI~ zQ&<)q;^A&YM!0K(f(=~M5-j}{j7$x56!i5=i@{B~(!9jt;>`5C)D-0Uhlt1nwTKkT z6N~aP^U|#p(lU#ROB75Le1n}pjY*?J8x-=BOHz|d6mk<Q6_WEa^O7@DQWeTGOEMG+ zic-rm^Gl1-YdI>V2T*22!r**qXkwycXlj6zGoAf?1N{A5{X*g)*%Mqn!P>2$&;-{S z1{H>|Y=EHwOYQ_^G(%X<)YlIQa`c0=0}z@)Z5QknE?6@-4=E@pplZNg;es`oLsJW? z24{aqEExx^0agp@>pK<{D3qiYmw+odLsJ7CLsK)PJcKZDG=z}S6Nm{(Q|87xhUONK zGzIDr8=70{7@`zIh#(Ag2?!4H5AubkEF=mPDMqOnu^8$S;NuwL>gSBsFab493@VJ$ zFf@dqHF*$LfNU@}(BT3X5(p;+nPG1QKx{BJ1la&B&9$^ZJ_h+5hCzG<LkkNXBNKRg zSwTU;H7F=P$T`df))2#JS3z@?ff1+(QYcDIPR%S!O#$^OQ<F3D6^c>|aw;Kp0LUnJ z*AN%S5XX4OVDI4g5P$!8H`nlZr^pc3V2JNPJ~J=|8<n0~;*waBsE}BkT?`%)D9O)P zNJ}jT_iu}J6mk<Q{7Q43Doav}ZL1AxbrjMvb8-}NQp-|vY^x1x5q5g|1%!sgJB7Nr zxdz4ihq(s1`S^!JtOJu^J59iLg8I;zc?G2<3Q47DX{kjD8HvRT`DLj^X*v1jc@QJ@ z^%ZhVAcX+PN8v&Ke(v$0f+0R2$Uns2*&nrz2b*pRHoY_tQhSyZCFT`_s!&9ES#40O zppl%PlB$rCpPX2dnV+XnZCI;`VU2S@d~k>(mS#8D8Z)pp<wf~<=?b7CskkJuBvpZ+ z*`SI!$Tip%U+OV12b&EtwJ5bXwM3yjBQqyeAu~^bNJ~Qff<prW{DVSVUE)DhykDrV z6MS3&l0*$Gz?PKe6_*x(!Y4Ha+|q#dnQ(dp9E+f6F-C+}sGn;@fU7geHWw`IAq8-F zSwgK#ttd!ME=f&M04YU}1_R`1K=uWw5Dhbn4~Yyw^n$>~CPIxx_yVM~%uE3^pn%gC z;QlBmMVa~dhX*+N#Ut4T_92V_+mVD}hnY`4NSi`IVo_plDriKg+OSq3u>>ha8Pp;I z$j?9C&ov^%!yikv0<sBgOETD&ynKbc)QS>?jQj$GeowzJM;}j@_yETsM=XUPB!E-E z`ZM#&5_2+B5H7<s#Vy>$*WU#ZjvyC+FxVBTD5j+47nLU#r6}a)r=%hb@^K7uca3*( zbPsa$^9Jce!(fBbzy{?c7Nw^uxH!5OCFW&=qC-akl%PxUL0JxAqKAJ#ypN}^XGnaI ztE00AM(-PBq9M59rBINVoSj;tkdj%PoLB@J!OX}nP{_&5%`8zUN=;1805`=HK*N*@ zIYvncEBstN-94QAgM#DTLVZw+4Y2dURv3aEotK)Ko{^MaRIE^vm;}mr#R_SqIXMa% zxrr69{E?rg08^%rSq$<SQUT)UA0G^A90fQ!dt=M#V7nlNcu7WTQ7XuUynKb?)Vvay z|1$Fw3QJQ<kwV=M)Hio_^$Y`LYAgnW4TTiv$cDme324A!8XOD?@K7IDczF%#SAoL> zLVyj1l-b3g@GZ?r#a2!mB_aYFQcyd)`uL#aScrMhTFekqP(w=4<kXxTc#cghQ7F#I zFY!-H1Em#E{Q}Rgp02L0hNdQX^Q$4GXhtsCK-w$}jPwjm^-K_11C$1FXIdB6;7C7b zk05_P&nS!p3G)M_q)yK-QAkNGuFOl$D9X>vtOC`^sD3~$4e%QaDV+@=r8BWcLULq? zr?0ECe^8LCGqiJz8s3l+7?LAPGILX%^NWh~tUyUup(HaoyBJX^>VZNADLq4?6I>a_ zd-{RK<lKTBeO=>0J^|SQP9czz7!sX`dMYzdAvG@r)T>DY6_wf`AEBocxWU08jzJ;8 zKK}5^5o|D|_{Cx{c+@vIC%;4o6pOf$44UIXffVHC83bzufeTMVNa2gc4p2Z9fjVfZ zpkYMRNHs(%;?ZpJa}7uK2Q*S4MKl&$z&?Qo5-Hws^>gue1IGp^B4Ei9Qi@}-2stkB zTI1^&5fTAvJ_ZE21~>*G3I}9sAZ2`RVns*=sQDOBlv<EjgeV+}p$!*MeulS>K&==Y zncLSfA}GSq*&E$TXnPeLQ$~<lAUClhsKPNh8*C-zmSXcL)K*XuG=kI%U`yd1EuhS& zAq0I2sUX0i3->7nc80rveCZMz1Rgqr7xqwZLQ<#^r2Z&R0r}FUv<T8VhBeAbjn8nG zAV(KZe@v^8(vT6PVku7vN=(Vjhu14)S``w3!!mFzLMt4IRUs7=Smx;LjXNMA=@e24 zm8Uo+XOkO{;9%0%S4dCIOD#&wK@^)#p}~=$7KV$bpF3C)8Ugk#q-shkEv^JLEK)M_ z(h&wAwb+AQ{ajr9{ZN~OU<064P-<R^OMYG|xLXKqLwG8rWTxb)mw*jMnCj;r?-u0h z8V_mqKzo5mP6L|?sfF_L71D}QQ(>(gXb%u?cK~Fxr=NR#s9$I>uKL&rQVD^K&df_! zD9tM^PEAqBP0h_OszkUGW|C`A5OfY0$&t_^)Cf}Rz)XS|p@7_`fCwQ>Me0JtJNx_k zI{Kl`A%T4lsb`RlNzTvBP0ULHRl^9ge1k#$^!D=)_e1UTKphG;3sRfFI=Z>3#l?x~ zsqlUe!Z1kH<mloOgw-raaz(B&U=!Hz1{r$1p!AlVf;?T^UE_T{gMHz%<xppWDX?21 zHAQBzQ&DD0da6QhW^ry}Npc3F$pI;8s!=+C9<Giqu0i0T3m<<hDIH|8F{D1oNKH%u z&CBQKE9B(orRyl<q~@iUWPsW+`0W4>SU|@sd|dt9Lm<=rV3&gkupN-%A2L`0HMpQC zKPe|Q7iJM?R0I*?PX7KO*pev7KoABS3Mt-`^7BhlQxICAUA<t}AWugh<a!;X51KZO zA*D2|t5=*_l$n^L0B&Dl7zD|SZbAOO;IbHM3d|r#;R`ben!D4A@^cl6K*cf4cQ}I) zG3koFtOJP;PLiPY3rJ%4nUFD6OH&;qQwyXqRZxe0bbJgtJ_a6-1ceB+tcmyY4~cj5 z@$nBwOL?HgW&o-BKtpb@@+PxbAuqo~Au%T>zdW@lMMnW9VGAybzzGF3&O_?(8>HTY zl}a=leuLC*kQOdzpbXLDz*|@mHT(vt_&}!8aQF>U4<gqDpiwy3@B*%JM0m82I{XHy z7)$f0Jp2Z!C6RqW{oyyvI+GT|Z;;xQ{NXo91&Sz2LA~9Q)FO-mIUeuu8?>H;4&sqN z{01E?gLL+(GyDdr1fg{VzTr3cV2zKze?Yv8YY2E~7@TrZ2~f#o2&o2h^79K6Qc^*4 zo~bDcDW$2P<#O<;PT1g~0=TSFD9K37Q%Ei?Dgup{<$(tBAqp`2<1U_921CG(0NV|z zM@tKeONvqxb7759(4Z4!v0h4kc^*VgN1-6UxHuCu8VGW#9%6ce<S|A_oeLX0r0p0Z zyx6Da7$c;Fr@<H_q)eyk7$c-8hg1_(9b?2SzG*hb2r0U0FvbWeyg?&!#0*;!HO2@j zt0Bb>Xy}Z}V~mhO8WNp|8lMVdjF8eBi^1TLIqHltLdte5c7OtkT4RjR@i8p6fPF%} zF-GW^7#54DI>u-OsUN_jV4y)M@PHo$qhLghF+%DE@Nge|<c;EiP0;8Yj*(4JWdt1v z16vCBD9y(hAr%BTbm2awAascuV}#Tn^c-V^R4jBEV}w>X^ciD>R6+wd#t5mJC>Ude zRzXxAV}#T~v>IcCR6?+kK}yCLA+-+7B*=gw<ztMHdIq^q2J6~aBTqvTGsXxVU4!-J zDH~%nhV&pHH3s#^7>yw{1ue!HA@u=m#~2~q0xFL&LW*~?#uy=`G^{^M!5AZ?@P!!! z?LUIX7*mNHWQ6x8!P6c=uAns#SSLO})u=I~00tLHkfjfxiGcEqRM6t7`~pz>2kMu^ z<dV#?%#unS*!nY+um`Q@K_5v%8JvcUsyhcc$AgEE!JSHE0_+%Q0S#Ux<{ab<TEYdf z#R;<HO#{M%jwypjziBn33R`;!rNK)OjZ8p8tR|2}m;|>=fu;jU8^+~QfRFu_X6AwS z7Ah#D78T_e!52=&mw@*2!Hh<zN=Zxyb?QOViYSJFwgy5Cfk?u3_<^>d!8Q+qwjKop zIlB8gYJd`)hM}e=vNgpeMWx9l3f16oW+PK`9V0Vy$T%}C0s*uU4by{E2?o&6ZBc#^ zBp~$lDG3T_x`0uT^kHG4V`K?UAK=6d+He;SD!b!L6ciM4jN?;Mi%T-|z_T}wDJj-q zMQ}o2AGC2ONddHT2DCs1rcyxzG_nF(&6u1G+Q^`w0N%-mVsLSOX;E@2rkP;FQ4EHt zgl)Tojm+d2L5AMI;S6>yNN0{wd@;1K;R;HJXbuML@XRkQNzTs&@9HcmssxoDCE%r5 zDGDVSnZ?jSB8V+$p<xscTDs>S1RJ;V$S*)PUteFr%p^$xWt;${0VOmP@{15l{547o zG(jr?QT+zWB#>MH^$~dHC#13<71=hB90=>{D<q{RCg<nrD5NBoB<d(6CTHs?B<F&5 zEGQ_zG7Ly1C_;_mQ;PGj83R$Eudh&?T3DKzmz)Y4sm@OW@27*5wV(~fpn*?t#xgcA z)G;=IW-PFNwD1}NsRy3H!0sPSJ@iREutEq*L&_pcGaX|CLr7f(+Av^jV5wtlh@8AI zGDco$Zb*e=Nl9vMK}j)sss`<W2k#G62&qs=gerpM>%`(bc!{B)kYf~|NFY-rg4Sp! zmMAy|`+;)<sL}zg+fFQ22&qs{O#$WVAP@s$KGdOF;6w#7zaX(PCqEIr_=HG<%A|t) zOvt|Te6aEGp&ZbJ9#k)=Ws_s1paEX-0NT~>>*x#`L<g_b&&&fm4Me$wX+rigU^v1t z*bizJdQd@@)1o;7<k!qR1y?5&<DhQNF^bR1&&&%b%FHjyEUCmWP+uSH5s(^%0;nRy zh6W^K!L>TnP;gX$w7`rF0L{<kfm;w@C*~L`XrvTnmZcUIL#q|2C!q%97{-@W1c351 zhJ(N=KzoNlvdC*)O7bD;0}^wYc_oOVS0TqRzNol36T4wx7bye<2YZ5|23|fwk_ISA zLsK`H0`V0fDH>Yc5^RZ(yltL~OA&R~d}dx|iH0V4pSCjM2mxawQypVt=$2jDxFWTp TB(*3Hi({Z$_d&bWAr1ln(R%m_ literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/radio.c.patch b/pkg/openwsn/patches/radio.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..6d7a9245287920a758dc6c46a81e415e292965aa GIT binary patch literal 13229 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV531N=(Vj*GuLM$tYEDEGSYiGEp!z zv@*1`GBHpvGB7mZ($&>fC<1AO>d-CEEWoSV%*xc%%G3m+TMHF%f!t!C01^ZnY^Y;m zYN(*AtE<bUt)Q=^#igwflT?(Mnx^0wVqq5KW@K!rTU?NuoSBxHtdNqLmYJ7Xl9`{U zke{Ydl98&Q1a`fWLQ-*oLT-LaX-=vhmo~_Z#L|+C{33;rjQrfhVukR;l9JTQyi^67 zawy9oH8r_dFDbPsJ2fY@QZF^7)J{jiEj6jAG_j}><Z>fDE^P%ZeUNEf+6u~<dC57Y zDX9udN%@IIDe?K`dKpS6;$VlM3nrFWm=&cN85^QY6c=Qo3xN$N$;?eHLYGNNO)5<< z$jmE7m&i#?DTX-(<QQ=Hq$;@jIXd~c#=E#Wg}N(f7-)i|;O++-1~v%fH3fZrTigH= z;Hkw5xRs#E5MgFnVo_#dQV#K^g3T<cEJ#gBO;ac?DJo4aQK;t9R!~q-K!jO*a$-SA zX;Er?a#9IMrnn@rsKl)(F&89aO-OZWUJ5p~@x>*HC8_aX13`v@F<1;_VlBk___D;J z;`kD4urt99f{GwXLnQHsbwN>nNj}J%#0EFm!m|9#6p*tZ78e&}h8Ja)qz0v?Ym{c@ zl~}}=C={ip$0w$w6zM1+ixj7plw{_mYl1ui7YCID@x=w1L8*x;*o*+H#%^Osg<ED? zKFm@rg{0E7kbJOP5ccMz=0U}<8w9o%&71<K(ln5`4kQXeUd4)`e$Y}V@JY=hL4$%q zZeoQ~X_`-J9tl<yW`cbHwG<lBuz&-FqGw)Oz6L0yK<Ypx8{TYIP@0sJnM`~xvjs;z zG&w0GrsQVkfki+TLLCDtCp9!d`2-Sh`uYmVIjM<73h?X)5zkG{Elw@bP=ll&P*T=0 z&?(NWO3hExK#0YcXhJ=rpr8OUDkCv3Jyijm6(Hsy)arpn5s_r85aj6M=^q^87~&cq z9O54k;OYX&4^Xr6^U^ZYON&y$1v=OqWFwK2bdY;|NKiyP*eD$ZXJ40iH~%1KSFoVJ zo13OJ$X0!Qg_6>uJV-bw<fo;9g9cVufRZ;jS%T7ckbAsmP++{TW3V^Q$k%WT0V{&o z8x&Hb02Kha#MRG56J#sM&eWV7sGTMG3Tc@|sS25SC8<S4r3EDl`FRRZ<qC;;DGD&N z(EJHXwn)wbc{4N^WIV`Q7+7ClAtg1jxHz?_1RQb*+X^!C6f*M^k`s$l6*7wzGBVRM z&}>2u0Y|@(co)ww9Y{3AJ9~Hr#5?+hxcd1yLhaVqS12t`RY=arEKo?yD@o1EO9WLZ z(AowXDb685KJkVM1{DS-cq{{j0z{>bf<c9m0n`R0&*|$cWF(d$B?g7$#GK^PoWzn; z1?M1Vh}ru3Nu|Y=3gwBJB?_f^C7H002PM7IVvwgn7WuomL6nzgWagx5K+`iUo2I5~ zK%EW^XazL|g9<}8O$9|;aBP876fE&jlIVln{N3C@1#K<ZG^AWwoLb^vmRgjSlV9$f z1aTj@1rVQ{pIeX!t<92?!1)*yM&R55QGu#8ISG_M6|h<03^9rf^AS4n7#|F;Xwhsy zs*llq0IncG<piRNR#322NKV2PNUqTOnN%x~>UB`?p;`eeKZ{a}Q%lfe1}q3EKtVbK z{DVT`13dlW!DU%|kZZ7ONW71KxCT<N!^{K654w5a_DBe*b*BL~E5y^+H7GvZ(<Q`1 zp&+#=Gd~4uB!dE111gUQ91Ih{=^{QowFGQKSYl3TD#GnWsfh9r>^6`>s2YTssHqZc zP5{_lB)K=W1geQtH$$}{0s)(&VTus0hJ|^M8}@3jIJLyBD7COOH7~gm);Li}gNeXx zBQAHN)?}_BA)bEj@oqt`fuXK`&XEM_G=-9Ua4}t!nVwMsbwY9_q<n%zA6iWp;1L<` z>>Tgx?5G1ODYX%<MzM)-O^o7fxO3x!T|*Gzh!p!pY5sYL!~;%h1QI@~=Cm|~ZUt~3 zL_<lnI3`a?Cq6zP$TcJ+GTtrJ&pE`?-!DEMoPD6}01|x?5*p+OiU4TYid?}XRivPL z09w9-e5;@Ub5e0hYJq}bOr8>w6A<|X(ry6de5`Q;Gu0JqD+Cg$P_KjSF+#G37z07( zqgOxZHC{@7UMj>UDpYUCjx|PdtiHZNd1iWgPO1X9->6UkYH5Ok1<VEYN#h~@NzN&P zl!Xck3gB)jL^vOm8n6Vs3922*B*s0wMn#KHQ<$-kiV#*hghZeh$2s|lDFKPe*{LP4 zQb9|h0L(|}u251y`1m`zfYN7xqq8?St3e`5Uta-aIn*{#J1r!_&C|^vA`1yMSV;iw zR6!k<lbQ!gs}O}`lvogl#Dm-gZh>RA7D_5y^FUp5L<T0q8t~`?$m1aq$ORQ~$q3XJ z0eKRX#E_Fw9yoEqy$;T(`Or4Lda*))j}Jr+HT<BBX;5wgl>yM)8sOs-@9zh)1)_)a z>;p3a)D^;>Eg>e85qcpJ@!$Z&8AE>g<%sA3m(IvdiL%5TXl^6N?jT3MU|&ygy#_S} zDGo~VLFE8A9ze09udh&?nwJ7g$4Qk61*JK~nR)5pS}xcpAU-50-q|n22T^8#U5lto zkkrI`c)EMQjmD!6*5rbRZ%9TeVx&+ZB|o)TAuqo~Aw4xOwFuN@NCb6-VBN6tjMO}^ z^T5eOp`<7=uQ)feq!=UyH!;}FMMt4LBQrTeAvd+SIJH=zv;d?)!Pn6l(&JUgO-#<n z%uCf%0NI`b>IxTu`Wz)0i6uG;nQ02;sR}u%iDl5@8Pqw<$ShV!1NBt$^AvJ2vq9aP z%wipd#JoyqpRqi#Bsn7`KV1RbLQ^Qu%*jzmttiMW0u5+F!`m~jxFj_(MF(Vlaz<)m zi9%wYLT+YmW^%SdBFJe)C7^N9G|;G*LTXuRUWr0dC8+z9lbM$e_g`jeYO0~BNh)Y? ztEj|34LtCrkXDqRtB{de1ol*Bu|i@_alS%sYGNKJa1u)tiu2P-$`gxH6_OM46!KEb zQi~LlK~9Dnn+WwtdQN6Zat6p^NEj-E!#W;Tv?!G4m*%8^<0vUrAuT^AC%-&31*AL? zo|ICNoePVklGGFh4Nvv5RH*I6so=OwEYSoF)G8=|!X46s!qU4?wDk-1@qw4-&<00h zP7XL?lM{1tk`j}%A%0O%P$)~xu?0ID92ubIvNNPNlLBfN!_z6e$pIQRLG8|HlqKeX zN*GYg)k4gLR<XgZej$)H2WlM^gi%KoQMEJ<LMe?4N=u;em6@kdl$xAc03KD(%};?Q zTCn%g2TRZj(x3>Ga+K({0+EG0ddUiQl0s2xVopw_LQZCJNopQEp^#pNV>+JHMu?AR zaEL3Y2?{DJA(4sP60SfgsrB_iX+8s7KISW=<a23bR=??~B|)jlshMS|kkM$Qrpe$L z1qF?2S;UuUDHH@17iZ!eHUlMm1qIlUGiX@0kOalfMal5Y3L9iCNzE;Y2MuPIfx5Ry zO$+c8ghFyrG9;g&ssoKHfD;ZVEhF^{K)tJ=;9yT!Ce<o%E=q<v8bsMDXrLJc8XdAQ z(6qBNw+4@a<`yS`3jOko)RK(UB3R*702+}?fs9l^+yiTb78Ms~!bB7ji$T49h2qp? zaK5w9Gtn~!mEE8@E%?Nj4!Cpzxe{a%Vi+v3*a~ituBD-Zwt}mRLUf8#ZY)F?&EX2R zkgSd+1YBL>eO$v_eGs7lid2yQA=p*{Vm_*g7-0`-ph7H14Q$A0J`scXL=4*#Gf-dP z109-&<VR@OgHs3wp-@niSq5q&V94MS0QDlcv|))FEmTp5{h<?7u*3@qPAFMikQrZ6 z5ua3=mX=x+Z5#_KKM;8Zst8Jf)E1$tg@m)dzCuA!Drk@pG}n@rS_B$k0Jq5UL6viG zfG0#9$N+?82C-msZ50$W3@R)P6ly?2p00>dSbcqk=p=KnB2Z@02M-imf%F)H2#uoD z#1zncBBTb5PBMcib@bH_N=*k9$wdlQ3NWP*0c7Q-x*!LDW}{Mzi^0Y!D1cp{py8XC zSDKcX44T6$Qt))qQSiwxPc2d~G*fWOEP<MV>K8+>-3qoK6ATQ%WB(vG!ZECcny3)$ z=N|x?Im}N=RmdtWE&&BqdMaetyeKstRNt3E>pfH}jHqn|Bu@186^c?ziZWBnQXz>* zAs5y63fSVXs6qq9btq*objk)rfhLNI-~i8fr%*RH*B}&OkPdhPLzRKd0--3tG}6s8 zC^!T~AIKsf$KVi9p#t$QbOaK`q-Y~>x`*Ubq<Rz9_XYLcV7UiW>VpyuqHhioflXn8 zCb>Y74pR-X29e?+)*xjskTl%G5LZB436enQGl*5N1!WRvP$mIc2XX*PMgez16H`)B zi;F?s_(TPDP+BSn&A+NEfK;az7h^No5M(mQM5qVg#VN!Ac%xZCL4j~gD<~*{;s8rz zD<~+y8x@)$>)-)_5`(C=z}28eKGYV>_=ifsk^r=w1B)Hh`T@&4HAck`awj5QD2-2W zp$7_mPz(_fpP&+taC90}U@L(@sS;5N<>klc7l3-Dp!F-s`MJ5EsX#o%5pvoYZixa^ zlY+WWkWqe648v1dv>{T#ps%H+kd|MhP?A~<TCSi_P+C-wUz}R3qfnHZn_rd+>h*#8 z`+2FUDXA%-{&a4BQK}YX-Hrm5Vg)*+22G9F*C{9<EmWYWa52<2)HXCSk43MW^z{`C zoj`dMR!r!C_&KS0=_MIDpaltf3Wi4JP6{cBC5h0GQUHY!A{T&5CxZ$zEY%(;(SZi0 zf&)AiQozBM2ySD7(mSZA0tF}XkRz(W;KB*ve{`3F42HN<A*r$?71ePxPNX1*!cz(L z%PT+s5Ll6gmh+I-vOr|OK@1`g0fp`!+yyXoyy52`LS)Gcjw95Z0BYI=L7L|9j6g&i z9i=-*#3~!8*~Biffhvde72&l2XjB0-YzHcb!M*2<R9IgN)<}X3UV*w!K@rf#u#Q4y zeyIYijRzTK%FIhg>NhE9MH@Onns+Isxw)0#^sJDSnw$t)>yV!Y%ASze*4J0iMN*BD z{6UETEUyr4plfJk>J$reoJMK|XvHAN$<9H}&;~46saCWR)MBLd3@BFk1VS6{&>%s} z{DwxR;35)dqXyiifH)qM+AxX@BLjGwLtkIP2(((I7&KN`l8Vw`A(Wqu=$+_srg)6J zs|D*%g8KiUFn|{vkm>~zIGJe*8gP|%Mha?b3UIECt)Y=QJQYIvJ7tMEnJJ*!A-yC6 zoUK674;l;rB~EC>Lrey>puoL6LSd+&fUpuhIH3(G?Cm%O1%(3Kqe6y8rZ`N)Rd7Hp z!w5-;&z*yu6*P>TG{MW4d;&ccGz^`fX_^$T8fhEia28HaqC_4R&Bj>7K!q;>f1(!k zkXR_pRKQFw;PxgYQfn1bbBa@8EdofuWai;a6riEX6oo`cj}uf|g1Vi_Ir+t@p!^Im zl9a%sde9;DB;eTtqm7S97g%#2R2mkXpbP;T?}l{i@DIPhhTVx>?~1bO5&IAgXmAp` z<SrvIFC{0nh>+pnY@D5$oE=}BoRJDzKwbn|GYcBbiO(!9!ZXzdU2qJZ5<nlp$t)@a zO|O)c79$t5P#xe=J<!YoBnd!8!REk*>OitZSmzxedcXq+i7BAU1+;(>G`SfXtN^aM ziXkHk>ctA4L4lyTH&Cie&sWIFFNf$wxD93-+Q1;fL_`lB)QbVFMFNdcBF!&BO-xhJ zKr&Sgwn7rN%n`X1g)P4TFB^lKrU#q12c;iSfvSKx7!T?$fTIOA+ftIMfU>kD$ko}^ zGtAS^9U2=X&j~?tG$>huqX@)6nHIuu0b==@268Ndf(_yk5UH=P07_qABmILRAqEmx z0F42G7OHxCI(x?lJA1ggg!;G!AsmlU+$bo3<|T7dH4Kq#0Od9X1yCm&WT?Kr0%%e; zKTUz?SOQJzfYz}hm20p_a?MKtMG<(0kSb9W5)l*;@8a+0itr_<4u*^gfa4Wu#UAFQ e9cdASWYl1Y9!ShXhr(R^<Nf?Y;xVJXmJ0xP`<*HP literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/radio.h.patch b/pkg/openwsn/patches/radio.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..466c38496086fb72a904ca67b7ed9c04ba276acd GIT binary patch literal 3313 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV531N=(Vj*UR7x$tYEDEGSYiGEp!z zv@$TXGB#H*GB7mZ($&>fC<1AO>d-CEEWoSV%*xc%%G3m+TMHF%f!t!KV`!uR66aD- z(AU!9Qc#FVD#}bvQ*bWIFD}+C$Vn_o%P-1RNJ&l3Ni0e%$;{7FPy)MCNg=7YKp{6j zr8Fm1j|-$Rv9u&3zeph@BR@B>SRp*Iq$IU6FIB;&9LjP?O-(M=OG+)uPR&WJ)Jsh% zwbM~>OHC>&O)RPeInhXuOF=<PpNmUZK{+!mFC{fiAwE9H(Z$n0-UB3-lA4y8mx?UL zrJ$gknU|bXnvx22R!L@VYLQ-s639jR`nI@%0@O6zD$r%X!EdNzXs)2EtE<bUjm44L z3d&Gp5f0ae2CcS2Okzq(Nq%}!erbV%Q*Z#6wn9ubh(Hns2Q5gfnhT_FFhmAjgBX+) zkuW%onwaRABN8dzI4vm3FUc>dEJ!U@K#x7_d`L1;NKDDi%;Qp2D9g`GQ2+sOJj7?_ zWtM1YT5~C&OBAP;_?M*?rRC(8J11#?6@wFAd~$wnL1IyAd~#BWLUIxgt<DfdWatbo zNh~UHD@x2wMbn&EP*O_BTGzZ3;<W1PD-@*`r<Py_2v`^rBKrCYU@v0{9FQYJK>1K3 zz&|J?KE%`4H7GvZ(<Q`1p&+#=Ge1SsnoCguLk=8_@#(20V7+09Ii;x(tI%Sl7^)%w zY!)SUKurKglfJ$}kQ+21V2f|JqSV6D)V$<Mjnd4#5{vi}g*2E5*gI&BEK2jw1Gyd} zO%<j2r=@{p6cqIJ6+$8~!!IX4F(n`|IXkrkW|fvg0hq6&0JA$MH4mGuB^9oDiAg!& zaKo^<q{1)19By+^1eWN<r@aWF9nG)lsU<<F$*GxTsgMMQaCTB@T2N|YiVhbjPvOT< zpJ^%Nq~?*RM?oPsvBIe|%_lWa2V6*-Sn8NVOKDIjW6%0vQ3YC*7@*(*rzsEv>}yEU z9@(V^C@{dGLZ6ZYZXJk$8VTU?1)BFUN+IG)D5wb_^I`s?dI<tG93wA7N)f0mD2>ys zB!Sw2;Q~l$0+j{30B?x`Rfu5>q*Q^*VwAgss$@ZGmw=eywu!l^j)eiN0S!)NcnEkA zmt2&rX$@_9WagEm78R8ilqh5*=B4DM78P?TDr9FSXU7*OXQYB!*G2Iq3JMC4A|$i8 z2vmZD+P$fHDVb^D;?BZA$I<}OD8*wtREkQDfX0|2mm;{|pr{a2%LOGsEqDb5Wr+I# D{}j&w literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/radiotimer.c.patch b/pkg/openwsn/patches/radiotimer.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..413b472f3e7d51af443c18d1ac2b50a0da6dce73 GIT binary patch literal 7856 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 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/radiotimer.h.patch b/pkg/openwsn/patches/radiotimer.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..b0b2508ec6b7224158bf1bf7eeb5c01c76a3293e GIT binary patch literal 3241 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV531N=(VjFUibJEz-;249O@}a4aZN zFfvgvG_*1>v@$kVFfuSS;nLOBRVV`KhHBF-&nzHpgqfA8v6Zm_#0V`^zy)%Zp^lM( z0!W-oK|x<ji%UTvCaEYhHBG^}D8IN^w;(66BrU%vS0N=eIVZ6wu_QA;PeBRcVkL#7 z;sS--{FKt1R6Q<`?!?lPjQk>nkc|A?#A1c;#FCQK%Dhwsn{p`2AvHC*ST8BHC_6PL zwNfuNrPNMG!7VkZs5G&t668)JJuU?WEqyL7T?OULw7itmG==#1AV(KZ{}4}K*PwV0 zkVHyqT4r7<h6I;_f^ueFa!zSVs)AB+NlIp3iC%^hmm-pAQhs7l3P=#-VSQWNKmlq8 zZWZV<Aph&*HL|3#AQj{xbe%Z)TwIC@FimConJEeyT8O}pPtMORNGwW?PfjY))X=o% zQoyG+v7n?BrZ&JoC?p;doZ+4>Asz~#<X2phm|LJ}P1qM@iA9--Nja&-3OL=3DgjQs zhB`*33c9+wx?I}0B34^L85-zlF|G}YEG;cAZH1V`l$4VE^rHOI0tKhw0FX#Eh(HoX z1Q1A~nhT_P&?IUi6KH&X`EX35pd>t)(<!JRM8e<_(#S~1!~|YM;?3R#MfoN9pzKO) z&Vb}Kg~XKH%sehd1yJxPfB+&1$7kkcmO%10Hre9T692N)qO_d+a_1xsByC7VgF<o= zILvYAcZL)q<Z2HtNh~UHD@x2wMKb|W-VktrYhDU5`mqO3G01uijPk4?wJ0+`1?+8o zeT9_FqSWLPg~a6K)Z$_;MFkAyNCB6gS`wC+Q<@42a~xKtmIQ!}$73x)JD?`OTnLRW z9BH69IU^NR!(v*PpO#jfTB2!<Lt}DcUUF&<$SVp8`uYmVkT@Y60?rVHDIuA;;D7)X zzxoQ9c_pbuMWqEL3K@xcDLJV{ps>u&OwNvnIj|_cL_t9TDKs;Si$J!6>gCkDl*}}6 zO<-iMV`>7a3P8?6tt(J?3N*`6pv(Xcd=LYa<&a%HnyV1G3aRA<X(|wrwJ`J`r3iTb z0tGzIgj<Z7$1n_pI|7=~FchHL2+eI!D?y1)fs`DFVLEZy4#hf1j)G-93=>h^i<1AK f#!!?8p=Ky@DS})1iV88cTu=hk)K*YXhGb6wr*z}* literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/rcc.c.patch b/pkg/openwsn/patches/rcc.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..4ea0a2ad61578df74e4d043e74cd39c089316e8c GIT binary patch literal 2635 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV531N>0{G<_yUwRd6gQQZO=6Ff_C> zw6roYP%ttuG~v?K)m110X@jcQEzc~#qu0#J)YQt<1fo|96>x#vVW0pK1RHCpV`-wG ztE;QarLCZ^rNyPK5R+7tnVO~mvMM*fBsDn1*VsrQB{eNGFS8^wKTjb)O`#+sRUydP zS&vH_q&~5<BqP5_!8s!_FI^!dH7`9aHB-T+1j5iu1_?W)=O$+6=q2ap+UY1Lc$MZ< zf*fb0$EB^HrO&0Upq!bPoKu>Ts-RR{l51>~W@u0mpOcxSm!Sl5mcA`+0C8Dru>x)- zXfj|&>*F=EEU_pvF)4?5Q;9IMpeVm2zofE&XhVrHvot9uGnsg=+k(w3%g;;!MPIyg zeqLH;dTCK2C|)%{!kS##3e{ZN3LxNGRFq#7T#{H)TCCs^>>6B>SX2^P01>bT8w66N zuLUwnp}4ZRBsEu|D784XL?bP~NFgOPsWe@optPtUzc^JB63Za<LC((cE~%b*nI#&U zD5kjPfkGT)6RKj5U{{DcH9%TDf?ebN{ZMs=CuWu?lw{`QfHh|pD-@+Brc@$KL3g}@ zEy&67AZ>2>MF?4B2W6&dAS57uR<N~I2o802b`1^&1rx|Ku%J><(AQFcdLW=EH7&Iy zIYYszG%YQ)2;mF`1vekZV2^m10*JhGZi)sr@py=FNInHy;+B(GoS|T(P!95QaY<rH zDy9X&sU<#%C8>GIl~9wRym%vY(>$DgycKK}f+K@L3~){ac}oEtJ|Ib?kcTLWcgZX> zL^meD*~i;R!BzpJ1KByC2m{L@83R&-(-1?bA^Jwxj4{Mw42G8ie0)HDu~jfM^Yy4w z&{r^0&{D8euvIWOQUD2{c@m@?oD0CIE5OGmIKQ+gIW-=X&RjCfjC8<35#ZzFTbdJZ ziSBVo94Q3&_+Yr##|IR%u6~YAKCbB6Kq(KBU_m-D6Rd(lc}8YVD%eTxsU>bXiRq9e z2o`bkadeLl@bL+9iPQw8$spHY*AQ5WRDfq+1%+C8CIu&*;MAPd<PxxB6N_OPHaRCh zIa{F^>}hmAKw=yz&>;fQ5CVmqk2gWDl@_O_C=j*}#ly(<XlN=Z+A0`S7+B!&A~?Y! zysEFC3Moh&-8}uFB^f9kItDly1*8^b7GyYsybOvQRN;7#1|0=Nj6uUsU%xyfHBX^D zF*~)iKq0A8Au%VhC|5@z8JuiNi&7Pel9Rc#6+p$O0?5d4uu5`^Q<(ETf?bhZkE;*_ zdtP53k)S++T@_#n3aTHo9D_PDvjnsF0~<(k;RkbcfR7K<Qb-X3N+Y=`8c1OZHeUhR z#mHFzt{EjckeL1vX+c3jUtfV>vWHs=iabctBPGov1wPa(c#=HaE))+!EQRDNtm(ZL Kq7OuYd<OsnmBb?e literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/rcc.h.patch b/pkg/openwsn/patches/rcc.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..f2ddfa92c2d060342d296e40ca5563588a4c85eb GIT binary patch literal 673 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV531N>0|x;0(zqRd6gQQZO=6Ff_C> zw6roYP%ttuG~v?K)m110X@jcQEzc~#qu0#J)YQt<1fo|96>x#vVW0pK1RHCpV`QM9 ztE;QarLCZ^rNyPK5R+7tnVO~mvMM*fBsDn1*VsrQB{eNGFS8^wKTjb)O`#+sRUydP zS&vH_q&~5<BqP5_!8s!_FI^!dH7`9aHB-T+1j5iu1_?W)=O$+6=q2ap+UY1Lc$MZ< zf*fb0$EB^Hr4KemIWsLUB{fYUK0e6VIo^XyTR|CYXDUJj<U)O0+yLUp)M5qPO3-A$ zHtXXxvn;VFGchTLcvFcmv!E!yB)_DxfM`R(W|rk=rhq~{-Z?)nEi=8eC=nDL8X#d! xYg85CiP@>81;|p$sd*`xX<RW1e)$S{spUDDd8rDCB?_r|DWLdF%gjmT0stEGx7q*z literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/scheduler.c.patch b/pkg/openwsn/patches/scheduler.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..b46f7a5671414ccead9fd5133a8a83e72c494934 GIT binary patch literal 4816 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV531PR>Y8Da}bO(o5zH$tYEDEGSYi zGEp!zv@$TXGB#H*GB7mZ($&>fC<1AQ>e4OGEFfrtnU$%jm8l8D1T9p+1#**_j<JOT zNSupHK|wh)FFB_)B~?KQYKLBi5{fXwp&3eCib(2{@)L_v&{e0TCY7caWabrvB#>3- zq^5wyxD*xi^=)wjg|ft=%*3Re)M5qPicn;@xD*viDhpCmQqvTQONvU9OB6~Hi?ic% zax#lc;!6~&xfB%?6d+>BNhKgQ949APBgqyNW#-2tDFE@I@@4s%DOzxCP)1&AMF~j0 z7Hqf=$hypu)ZBQGAf}^`+<~MNVid^1PNiwlA&$Y`@jjlxA@MG*0U;i-Ak(34N74gv z2uM#n$d6D(rI~pp7Rb&A8J$;}8<JR@UF=+1M2s@u#0rqIS_OEl$Co7*6@z@lrGO!b zCSc8_h|||Ja$HJMI>>Dxdl4=M3nIBKB`Mt+l+^L3yMm(pl6+7)A~xZ1fwQNXj**Fi zuCA^w$OZ~CQ+$3oDBB=sO1$|AsvbF;Wt5j>=B5_KCl)1VfXqUcE6FHIO$6syP(Dsc zP0P$nRdDrlbn<bHcX4$Jbyv_Z&;&`riv+OkAY*8eYl%rusIdr2+$hmZn`i|UjYt?= zW||o4n3_QfO$7o4SV3u0PG&N(rI)R(Ehy!H$`>ThX69v<XlN=_bLnz{a<PKGz5+-n zGchN#DzPLpKTjbyA5?oFN=t~k+|=CS)DjIfL@0r>ua1FEab{I&ewqfVczlVbrZp~& zDM{(r^no)MNE<|-zP>_g9;mohD9K1gctE{aAv3QewWz4HphTfKUm-YLAvrNmp*%4= zRiU&1RV}0d4tDl%bqV!x4T^`RNKd~I*Px)#fDjF^8*8zIQgKOQ5hR$vfdncLQA){z zkc`Y?Q1J)#WO+trPO5^2At+$MIusNXz+!0Oq6abwT(m0M`i1)VfYgJkVk2`M6KH0q zYa#%<b@(R%eSQ3i0948=C@6r7Dh(yo;+Q-oo%r~GAlHzP$auF<Kj#onf4}&6B9e<X zI7Epu2wUw-&2)uS(14iW!p77>$IJv$*g$d_*twuW0F=o<iBq8@Um>+3HMz7TRUxw& zoS*XZQWX+Qz|4%)#1w`6G%&lcG_^Dp*%Y|rA%-GITSWE+SNe!t0IJv#>Ok%&&d5xI z*abFUA*oUUWIxDh$abL?HwXh2Y!%?n(6xg!qrkPPiJ6Y65xhEu+o`V)_6x{(y89gN z2w1`^D$N78_Y_nM6v{J8G890~L<Q9pP;x}}R&tUKG8d!@oHXGE>gy}eA{;@<2nmBz zl)0gfg*hZe!L3(7b{!}V5Hhw3pkfbNYC?n&QJIpIu7}jD)YV0(tA&*13JMC~mIJ6C z5D$v9_~e`-P%#c}h$|>4fV&Ry#W|^|1<1l^nm{#~rZvQRbW&em!P7BFp*SPIG$%zN zBQd8$AtSXYRUtD?AuqoqBQq}@lu%OgA*r#JOF;o#fheHWvjwHa8DJM`K%ALWq5z6E zFb5Q2@g?Bc1yulG7l0&Csu*xeaL&&wNzBYkErNywx+*QODv-YL#GGunGI$La@8at0 z;~3-!D!;(t0dcj9XE3;J23Hphl7z_V>no&X=A|ek<|(A+7L-(iZBR&tIRu=UOf7ZH zEg_i+?05))mhm8hAd>P(*Vl&@sd@PdDfxPOdNFxQnxOs!$aqkVi59_VsX|{LSHjTO zN7G4_qybBfkalr=WoBwl3MhoZuC3()R}xSU<)kK-W#*;p>FFtihq&1*LOe!!q5|7N zWR-@kCIUzMAWVKp<qwDnE`tmW&2<cop!FI!j5E^|kXl}7<%%8l62~{O0-hTckh>7b z+I<r%6ciMYD>P(Ta9<egfLd7l8okX4&S{DYwcs8tp?+g#Sz<{l@$G$Z-ZV6@)G;(P SM#`OoATYpTf+HvtYPkTT8f!HG literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/scheduler.h.patch b/pkg/openwsn/patches/scheduler.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..ca19f56b01619a38bb5dfdac2fe1af59247bda68 GIT binary patch literal 1868 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV531PR>Y8Da}bO(#zls$tYEDEGSYi zGEp!zv@$TXGB#H*GB7mZ($&>fC<1AQ>e4OGEFfrtnU$%rm9YWD1T9p+1#**-j)ek9 zm`g!HIVCkMGcQ#kK0esl!__6!$2BP4gNsW+L0?OYOHm;vF(suWKfNfwv_K)HD6=fJ zsF+JZA*LEcAV~$o`~niM2D=($hpw)!E@^gTrxxX<=0HqQK(QUo3Xt=WFxXqh#yX~k z5RY*wD3nwdq^6{%DU{`BrYLA=l_VBt$0sM1Xlj52G_AR~6czOKZE*vIvc#gy#H5_m zVg=laP-MWthS$h~qWqG4ki&>I6Jn%7L1|J>X0k$BX<l+kW`15Vmm<Vl@H7;knU`6j zp=pgNQCyN(1eQ@i*HTbgoDmNS77Y*q3L6C|LkGerD9X%_FHrzdpzu;q(AQVU%qvMP zDk?1~QOHQlOUVJH2dG;zi;LnjQ&Uq7O-)kc^HR%$bMnFVVv{b(%uOvqaxO@3VoEYd zL_tA0GYu4Pp20!!?vX+MTu_ID)TCDy<wF&v=A~q&fm52Xv5uLg0ywP^7ww=30NGGn zQdF8;0`Y53PG)gQe2GFem!g7#0z@o1sRYD^<K!ez_`+mC!4i+80K|vNgHo6lTpN^; zms(K*lCK3D?gO$evm`Y)9wbOGE#~HfiV6~vB$pzWB0LK~J&NQvB<ms01I4^kX<BrM zW3YF;k7sa5yo+l<h(|2Q#ZVt3>4A6-q$eH}Zcs&~nRz7^$Uy=!I<GW0B(XTV*txWb z7-hbR6(D7`3W%g#mRM8_3njFugZhX@7N;bogX{$rh69<aL8%FM&W6fDGYKNp=#jgj ScH_?Bm<m9-94bm$P6q(BktL@9 literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/spi.c.patch b/pkg/openwsn/patches/spi.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..4fcbb8e37681cf4ad74e5b9857a742352a9b7347 GIT binary patch literal 8853 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 YDGGV1WvN998Hoi2sd=Do0b(Qp0CrCeWB>pF literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/spi.h.patch b/pkg/openwsn/patches/spi.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..d151e9689448f8c71e1bea7d7459c6d417dc7b2b GIT binary patch literal 1129 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV531F38l&;0(zqRd6gQQZO=6Ff_C> zFtjo@S1>X#G~v?K)m110X@jcQEzc~#qu0#J)Y!_{0HRk56>x#vVWDGaq5u--QczG% zNlnYlOI3)E4-W8*_uv8vW#%R4l%}LAC>58aWagFVWhikeDk#H6lkyXbQb2-S3JUuA zwzz=;)NI@;&}F#5eg(TvS65dT<QS+Kq`EIYznoT11ce+D1_!B$rH-j7Buoj0N<mS6 zNq$LXL29uAy8p5BxwsS+%JMT)6ciK`iVHI1GxIV_G&HS2p_7@GlA5LfiaJlfcu&6& z*Px)#fRK1!e-~FS1r$xisU^-y8X)b-NhJ!&Nf7<1c`2D`;6R7?037Oc@&U+85LZyg z7f5jeVuItv%t*(~91<^}&_lzZ(8x(FE{QKuP*BJ$_DL)*(X<9-0eyXi%)FA+qN37* z5`~P!yp){OqGB#Zh3w4a?D*p3jMS9UoYbQD5=e9u7lC2}6dj1*gjfs?PBcqFT<Td2 I4Mc?H0G;eB!~g&Q literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/stm32f10x_lib.h.patch b/pkg/openwsn/patches/stm32f10x_lib.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..dc01250121977ce0b5c15224190f3f6379bad373 GIT binary patch literal 3506 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 MJ5bPqOw#8909b0mk^lez literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/uart_ow.c.patch b/pkg/openwsn/patches/uart_ow.c.patch new file mode 100644 index 0000000000000000000000000000000000000000..2d61138f24f48e7abbbe27910d7d3e1d5b159b0a GIT binary patch literal 4194 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 DgTvk| literal 0 HcmV?d00001 diff --git a/pkg/openwsn/patches/uart_ow.h.patch b/pkg/openwsn/patches/uart_ow.h.patch new file mode 100644 index 0000000000000000000000000000000000000000..f26c049a43667b7e4c117f5bf9e93955a000faae GIT binary patch literal 2351 zcmdPW(o!fc$xqIX&&)5;%}Gp(_chkfFG$TRFV531O)M&j&o9@@;0(zqRd6gQQZO=6 zFf_C>Ftjo@S1>X#G~v?K)m110X@%<1Ezc|<px?~O)YQt<1fpLH6>x#vW2j?jq5u-- zQc%#>(&AE3h)F8SOifd8F3K-1)-A|MEJ@2R%2h~7P0mRyN-W9D&r?tWxm8IasklHP zH$SB`CsmINq%X0wBqP5_AtWO|H?deDJh7xCwK6YN!KNI_a!5^0F4jv*Ey_;KNv+gN zO)0h0QE*F5Dk@DZssy>vNRLZFK}(;DOIJZTGc7MAHBBKtKGZQNB;Ergl#-g3nU{(r z#HFC1oSB!LQ<{>hpj2Fvl9^Ycm!ZU^h$NbnpIDRv5(Ifq-xfDefSQh51-c9uI6e$@ z3@sIOb#-;Qv@sp6t)L7w7VZyikVCYzxU>~w5>rx2^3#j*OA8d7f&)Mz)gS^%7!=MR zp=vIWwm}dvL<TrG9V>wng+8^z9F$a%FeD9I>X;b860w4U0yxRIhPnEM#QTT22D$n8 zhwE@DDAX!|!ZSX#EH$qrzQme~OHrYuvLF?d%*ygJQxr6`!15&(@ySUgni`tcI205i z6o4WVuMf)-i!u|Fa#D*G(31}iKH)$sD9SI%2RWQrGeI5&dr(0E5(1fdnI$0aDJY-_ z7pImuC+6fNB_?MVYaj)MLP>>lk`6>G#P14470yZE@If&kH4o%f&%Bb<qN37*l46h@ zil}y^WEK-tlbn;9SQJ!&*Br2#5HvMt{wXiYEJ<~$EJ@WU&CDyYh%Zq{sw_zj$qxsK zgIy032Ya?CH8BOOTGJX52@07opD1J`=B4DM78P?TDr9FSXU7*OXQYA(zM}XNNVt?# z#Ag;4K|G9IMG;&DsDMh%OUX>*ic#>(SIA2(&jFQdi6siDc_|9{X$onXIjP{n#mGd* z)Cf|#D1ZQU5;iE#z}^QXBJ|V`iC|3)sG^~pz~l4FVV*!s7t~MZ(7+;?*0HMtr)8A% zjz=9znun@G^B<Y%9x1@Uu}((vhq?z>CV^%Fm?|zsaEn7xA*PlKN`NYVMFnL@?f?MK Cp2%+i literal 0 HcmV?d00001 diff --git a/pkg/openwsn/structure_changes.sh b/pkg/openwsn/structure_changes.sh old mode 100755 new mode 100644 index c2ed48c123..54347b1001 --- a/pkg/openwsn/structure_changes.sh +++ b/pkg/openwsn/structure_changes.sh @@ -1,34 +1,69 @@ -#!/usr/bin/zsh +#!/usr/bin/env sh -printf "Moving openwsn stack ..." +function _out() { + [[ $QUIET != "1" ]] && printf "$@" +} +QUIET=0 + +_out "\n*INFO* restructuring OpenWSN tree\n" + +_out "Moving openwsn stack ..." # move openwsn stack directory up mv openwsn-fw-RB-1.4/firmware/openos/openwsn/ ./ # and all needed hw dependent files too -mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/telosb/spi.c openwsn -mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/telosb/uart.c openwsn/uart_ow.c -mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/telosb/leds.c openwsn -mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/telosb/board.c openwsn/board_ow.c -mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/telosb/board_info.h openwsn -mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/telosb/radiotimer.c openwsn -mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/telosb/eui64.c openwsn -mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/telosb/debugpins.c openwsn +# +# telosb disabled for now +# mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/telosb/spi.c openwsn +# mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/telosb/uart.c openwsn/uart_ow.c +# mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/telosb/leds.c openwsn +# mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/telosb/board.c openwsn/board_ow.c +# mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/telosb/board_info.h openwsn +# mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/telosb/radiotimer.c openwsn +# mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/telosb/eui64.c openwsn +# mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/telosb/debugpins.c openwsn +# mv openwsn-fw-RB-1.4/firmware/openos/bsp/chips/cc2420/radio.c openwsn +# mv openwsn-fw-RB-1.4/firmware/openos/bsp/chips/cc2420/cc2420.h openwsn + +# +# common BSP files +_out "common..." mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/board.h openwsn/board_ow.h mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/debugpins.h openwsn mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/eui64.h openwsn -mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/leds.h openwsn +mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/leds.h openwsn/leds_ow.h mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/radio.h openwsn mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/radiotimer.h openwsn mv openwsn-fw-RB-1.4/firmware/openos/bsp/boards/uart.h openwsn/uart_ow.h mv openwsn-fw-RB-1.4/firmware/openos/bsp/chips/spi.h openwsn -mv openwsn-fw-RB-1.4/firmware/openos/bsp/chips/cc2420/radio.c openwsn -mv openwsn-fw-RB-1.4/firmware/openos/bsp/chips/cc2420/cc2420.h openwsn mv openwsn-fw-RB-1.4/firmware/openos/drivers/common/openhdlc.* openwsn mv openwsn-fw-RB-1.4/firmware/openos/drivers/common/opentimers.* openwsn mv openwsn-fw-RB-1.4/firmware/openos/drivers/common/openserial.{c,h} openwsn mv openwsn-fw-RB-1.4/firmware/openos/kernel/openos/scheduler.{c,h} openwsn -printf "[OK]\n" -printf "Removing files not needed ... " + +# +# iot-lab_M3 BSPs +_out "BSPs..." +touch openwsn/Systick.{c,h} +touch openwsn/at86rf231.h +touch openwsn/board_info.h +touch openwsn/board_ow.c +touch openwsn/debugpins.c +touch openwsn/eui64.c +touch openwsn/exti.c +touch openwsn/gpio.{c,h} +touch openwsn/nvic.{c,h} +touch openwsn/leds_ow.c +touch openwsn/radio.c +touch openwsn/radiotimer.c +touch openwsn/rcc.{c,h} +touch openwsn/spi.c +touch openwsn/stm32f10x_lib.h +touch openwsn/uart_ow.c +touch openwsn/isr.c +_out "[OK]\n" + +_out "Removing files not needed ... " # remove all *dox files for i in `find ./openwsn -name "*.dox"`; do rm -f $i @@ -36,9 +71,9 @@ done rm -f openwsn/SConscript rm -rf openwsn/02.5-MPLS -printf "[OK]\n" +_out "[OK]\n" -printf "Initialize Makefile structure ..." +_out "Initialize Makefile structure ..." # create empty Makefiles touch openwsn/Makefile @@ -61,20 +96,18 @@ rm -f openwsn/07-App/rxl1/Makefile \ openwsn/07-App/layerdebug/Makefile \ openwsn/07-App/imu/Makefile \ openwsn/07-App/heli/Makefile -printf "[OK]\n" - -mkdir openwsn/07-App/r6tus -touch openwsn/07-App/r6tus/r6tus.c -touch openwsn/07-App/r6tus/r6tus.h +_out "[OK]\n" -printf "Clean up ..." +_out "Clean up ..." # clean not need files rm -rf openwsn-fw-RB-1.4 -printf "[OK]\n" +_out "[OK]\n" -printf "Remove CRLF line endings ... " +_out "Remove CRLF line endings ... " # deal with crlf line endings for i in `find ./openwsn -type f`; do perl -pi -e 's/\r\n/\n/g' $i done -printf "[OK]\n" +_out "[OK]\n" + +exit 0 -- GitLab