I fear the formatting of the source code will be broken when coming
out of the mail-list. The actual code is this:
error_t dsrRouteRequest(am_addr_t destination) {
message_t rrMessage; // The message we
will use
nx_struct dsrPacket* rrPayload; // A pointer to the
messages payload
nx_struct dsrOptionsHeader* header; // A pointer to the
DSR Header
nx_struct dsrRouteRequestOption* rrOption; // A pointer to the
DSR Route Request Option
uint8_t requestPacketLength = // Keeps the length
of the Route Request Payload which is
sizeof(nx_struct dsrOptionsHeader) // The length of the
DSR Options Header +
+ sizeof(nx_struct dsrRouteRequestOption) // The length of the
DSR Route Request Option -
- sizeof(am_addr_t)*MAX_ROUTE_LENGTH; // The number of
addresses we do not use. Since we initiate this Route Request we only
need to attach this nodes address to the Request
error_t err; // Space to store
returned error messages
/
*********************************************************************************
* Create a Route Request
Packet *
********************************************************************************/
rrPayload = (nx_struct dsrPacket*) (call Packet.getPayload
(&rrMessage, requestPacketLength)); // Get a pointer to the Packets
payload
if(rrPayload==NULL) return
FAIL; // If
getPayload fails return FAIL, happens when the payload length exceeds
the maximum length
header = (nx_struct dsrOptionsHeader*)
rrPayload; // Header points to the first
element of the packet's payload
rrOption = (nx_struct dsrRouteRequestOption*) (((nx_uint8_t*)
rrPayload ) + sizeof(nx_struct dsrOptionsHeader)); // RrOption points
to the first element in the buffer after the header
header->nextHeader =
59; // 59 == No
Next Header
header->flagF =
0; // Flow State
Flag must be 0
header->reserved =
0; // Reserved
bits must be 0
header->payloadLength = sizeof(nx_struct dsrRouteRequestOption) -
sizeof(am_addr_t)*MAX_ROUTE_LENGTH; // Length of carried options,
which is only the Route Request Option with a single address appended
rrOption->optionType = OPTION_TYPE_ROUTE_REQUEST;
rrOption->optDataLength = sizeof(nx_uint16_t) + sizeof(am_addr_t)
*2; // OptionType and OptDataLength are not taken into
account (RFC4728 p. 41)
rrOption->identification = routeRequestId+
+; // Take the routeRequestId
value as the ID and increment the variable
rrOption->targetAddress =
destination; // Add the
address to which we want to find a route
rrOption->address[0] = call AMPacket.address
(); // Add this nodes address to the
Route Request Option
/
*********************************************************************************
* Send the Route Request
Packet *
********************************************************************************/
err = call AMSend.send(AM_BROADCAST_ADDR, &rrMessage,
requestPacketLength);
if(err != SUCCESS) return FAIL;
return SUCCESS;
}
The sending node sends its message a couple of times and then crashes
and reboots. The crashes do occur even if I out-comment everything
between the "Create a Route..." and "Send the Route..." comments
(except the getPayload line of course) and set a fixed
requestPacketLength. Since there is not really that much code I start
wondering whether I'm trying to do something that simply doesn't work
this way with TinyOS. I had a lot of debugging messages in this code
so I know that the packet is build as expected and send.
I've also programmed a little network sniffer node which prints the
packets caught onto the pc screen. So I know that the packets are sent
correctly since everything arrives as expected at the sniffer node and
can be decoded.
Thanks David.
_______________________________________________
Tinyos-help mailing list
[email protected]
https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help