You can't really mix L2 frames (Receive interface, Ieee154Message) and UDP packets like that. You don't even know where the payload is in the received frame, and so you're really just overwriting the frame randomly -- it's no surprise that the checksum is invalid and the network stops working. In fact, you're overwriting _every_ frame with the LQI data. You'd need to either use the UDP receive interface on the intermediate mote or else stick to L2 frames only and do this some other way.
Steve On Wed, Jul 14, 2010 at 1:04 PM, <[email protected]> wrote: > Hi, > I'm experiencing udp checksum error while forwarding packets in multihop > network. > I've modified UDPEcho to get RSSI and LQI in a multihop network using > getRssi() > and getLqi() provide by CC2420Packet interface. > I'm testing the application in a basic network: > telosb.0 is acting as IPBaseStation > telosb.1 is the first hop (directly connected to base station) > telosb.2 can reach the base station only hopping through telosb_1 > when telos.1 receive packet from telosb.2, it read rssi and lqi and write > those > values in empty fields (nx_uint16) inside the received packet before forward > it > to the base station. (I'm using blip stack) > Wireshark (connected to tun0) shows me udp packets sent from telosb.2 and its > payload is correctly modified by telosb.1 but checksum is incorrect (caused by > UDP checksum offload). > Moreover, after less than 100 packets sent, network freeze; motes don't send > packets anymore. > I cannot understand what I'm doing wrong so I post the code below. > Could you have a look and give me suggestions? > > Many thanks > > Davide > > ------ CONFIGURATION > ----------------------------------------------------------------- > #include <6lowpan.h> > #include "DemoReading.h" > > configuration AppC { > > } implementation { > components MainC, LedsC; > components AppP; > > AppP.Boot -> MainC; > AppP.Leds -> LedsC; > > components RandomC; > AppP.Random -> RandomC; > > components IPDispatchC; > AppP.RadioControl -> IPDispatchC; > > components new UdpSocketC() as Report; > > AppP.Report -> Report; > > components new TimerMilliC() as ReportTimer; > AppP.ReportTimer -> ReportTimer; > > components UdpC; > > components CC2420Ieee154MessageC; > AppP.CC2420Packet -> CC2420Ieee154MessageC.CC2420Packet; > AppP.Receive -> CC2420Ieee154MessageC.Ieee154Receive; > } > > > -------- > IMPLEMENTATION > ------------------------------------------------------------------------------------------------ > > > module AppP { > uses { > interface Boot; > interface SplitControl as RadioControl; > > interface Leds; > > interface UDP as Report; // sensor data > interface Timer<TMilli> as ReportTimer; > > interface CC2420Packet; > interface Receive; > } > } > > implementation { > > bool timerReportStarted; > > struct sockaddr_in6 report_dest; > > nx_struct hreport report; > > event void Boot.booted() { > call RadioControl.start(); > > timerReportStarted = FALSE; > > report.idrssi = 0x00; > report.rssi = 0xFF; //INVALID_SIGNAL_VALUE; > report.idlqi = 0x00; > report.lqi = 0xFF; //INVALID_SIGNAL_VALUE; > > report_dest.sin6_port = hton16(APP_PORT); > inet_pton6(REPORT_DEST, &report_dest.sin6_addr); > call ReportTimer.startPeriodic(1024 * 7);//APP_PERIOD); > > call Report.bind(7011);//APP_PORT); > call Status.bind(7010);//STATS_PORT); > } > > event void RadioControl.startDone(error_t e) {} > event void RadioControl.stopDone(error_t e) {} > > > event void Report.recvfrom(struct sockaddr_in6 *from, void *data, > uint16_t len, struct ip_metadata *meta) {} > > event message_t * Receive.receive(message_t *msg, void *payload, > uint8_t len){ > > Udp_PaKet *temp_payload = payload; > > temp_payload->idrssi = 0x2; > temp_payload->rssi = call CC2420Packet.getRssi(msg); > temp_payload->idlqi = 0x3; > temp_payload->lqi = call CC2420Packet.getLqi(msg); > > } > } > > return msg; > } > > > event void ReportTimer.fired(){ > call Report.sendto(&report_dest, &report, sizeof(report)) > } > > } > > > > -------- > DemoReading > .h > ------------------------------------------------------------------------------------------------ > > /* > // SENT UDP PAYLOAD > typedef nx_struct hreport{ > nx_uint8_t idvolt; > nx_uint16_t volt; > nx_uint8_t idrssi; > nx_uint16_t rssi;//nx_uint8_t > nx_uint8_t idlqi; > nx_uint16_t lqi;//nx_uint8_t > }hreport; > > // PAYLOAD RECEIVED IN CC2420 RECEIVER > typedef nx_struct Udp_PaKet{ > nx_uint32_t part1; > nx_uint32_t part2; > nx_uint32_t part3; > nx_uint16_t part4; > > nx_uint8_t idrssi; > nx_uint16_t rssi;//nx_uint8_t > nx_uint8_t idlqi; > nx_uint16_t lqi;//nx_uint8_t > > } Udp_PaKet; > > > */ > -- stephen dawson-haggerty http://cs.berkeley.edu/~stevedh uc berkeley wireless and embedded systems lab berkeley, ca 94720 _______________________________________________ Tinyos-help mailing list [email protected] https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help
