The protocol byte denotes "no ack" when communicating from the mote->PC, as
you've pointed out.  Without an ack request, there is no need for a sequence
number, so it is removed.  The next byte is the packet dispatch format,
which is 0.  This corresponds with TOS_SERIAL_MESSAGE_ID as defined in
Serial.h.

 

-David

 

 

 

  _____  

From: Pedro Almeida [mailto:[EMAIL PROTECTED] 
Sent: Wednesday, June 13, 2007 6:39 PM
To: David Moss
Cc: tinyos-help@millennium.berkeley.edu
Subject: Re: [Tinyos-help] Documentation regarding exact contents of the
MACProtocol Data Unit frame

 

Hello all;

After reading the TEP provided by David, it greatly helped, yet some things
still don't match. It is said that:

typedef nx_struct SerialAMHeader {
nx_am_addr_t addr;
nx_uint8_t length; 
nx_am_group_t group;
nx_am_id_t type;
} SerialAMHeader;

and the frame like

____________________________________________
| | | | | | | |
| | | | | | | | 
|_|_|_|_|_______________________________|__|_|
F P S D Payload CR F
F = Framing byte, denoting start of packet: HdlcTranslateC
P = Protocol byte: SerialP
S = Sequence number byte: SerialP 
D = Packet format dispatch byte: SerialDispatcherC
Payload = Data payload (stored in SerialDispatcherC): SerialDispatcherC
CR = Two-byte CRC over S to end of Payload: SerialP
F = Framing byte denoting end of packet: HdlcTranslateC 

would give something like 
7e 40 09 00 be ef 05 7d 5d 06 01 02 03 04 05 7e
(explanation: For example, a platform independent AM packet of type 6, group
0x7d, and length 5 to destination 0xbeef with a payload of 1 2 3 4 5. Note
that the group 0x7d is escaped to 0x7d 0x5d. The protocol field (P) is 0x40
(64), corresponding to SERIAL_PROTO_ACK (in Serial.h).)

yet what i read is (mind only the beggining and end now)
7E 45 00 FF FF 00 00 13 00 EE 00 01 00 00 00 07 80 EE 00 07 00 80 00 00 00
00 20 00 00 53 63 7E 

so there's some bytes missing, and the start has more similarities with this
struct than the SerialAMHeader:

typedef nx_struct serial_header { 
nx_am_addr_t dest; 
nx_am_addr_t src; 
nx_uint8_t length; 
nx_am_group_t group; 
nx_am_id_t type; 
} serial_header_t; 

So if i disregard the 

D = Packet format dispatch byte: SerialDispatcherC

it actually starts out nicely. Still do decide if the last 2 bytes before
the 0x7E are the 2 byte CRC (which are not even showing up in the example
sequence from the TEP) or the rssi+fcsCheck. 

So, doing it all again and completing with new information:

7E : Framing byte, denoting start of packet 
45 : Protocol Byte (0x45 = SERIAL_PROTO_PACKET_NOACK = 69 from  Serial.h) 
00 : Sequence Number Byte (from the #define NO_TX_SEQNO in SerialP.nc) ??
FF FF : destination address (from UART) 
00 00 : source address (root node)
13 : length ?  
00 EE : Collection ID (from CTP) ?? / Type ?? / Destination PAN Identifier
(from MAC Header) ?? 
00 : ???? 
01 : hopcount (seems out of place, but sure looks like it) ????
00 00 : Destination Address (root ID=0) (from  MAC Header) ??? 
00 07 : Source Address (from the MAC Header) ????
80 : sendCount ??? (this field increments like the seqno below) 
EE : Collection ID (from CTP) ?? / Type ??
00 07 : source  
00 80 : seqno
00 00 : parent
00 00 : metric
20 00 : data 
00 : ???
53 63: rssi+fcsCheck / CRC ?? 
7E : Framing byte, denoting end of packet 

Thanks everyone for helping with this "research"!

Pedro



On 6/13/07, David Moss < [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]> > wrote:

I haven't been following this discussion much, but if you haven't done so
already, take a look at TEP 113, second 3.6:

 

http://www.tinyos.net/tinyos-2.x/doc/html/tep113.html 

 

Some of your unknown bytes are explained there in the serial HDLC header,
which I don't believe is documented explicitly in a struct.

 

[HDLC header][Serial Header][Payload][HDLC Footer]

 

The length byte in the serial header is the length of only the message
payload I believe.  There should be no radio message_t metadata information
transmitted by default as part of the serial payload. 

 

http://en.wikipedia.org/wiki/High-Level_Data_Link_Control 

 

-David

 

 

 

 

  _____  

From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]> ] On Behalf Of Pedro
Almeida
Sent: Wednesday, June 13, 2007 2:50 PM
To: R. Steve McKown 
Cc: tinyos-help@Millennium.Berkeley.EDU
Subject: Re: [Tinyos-help] Documentation regarding exact contents of the
MACProtocol Data Unit frame

 

Hello, Steve!

Things are starting to look less blurry now. Some still sound strange,
though. 
If the 13 (19 in decimal) was the length, then the payload would end (unless
it doesn't start counting in the byte immediately after the 13) right after
the byte with "20", which is a 2 byte field. 

Here's the line again:

7E 45 00 FF FF 00 00 13 00 EE 00 01 00 00 00 07 80 EE 00 07 00 80 00 00 00
00 20 00 00 53 63 7E

About that 20 and the "0xCAFE", it's because I have changed the struct for
my app, and now the 2 byte field "data" in the struct is now split in 2,
datah and datal, each with 1 byte (datah is the "20", datal is the "00"). So
the 19 count cannot (unless i'm wrong) end in the "20". 

The payload struct looks like this:

typedef nx_struct TestNetworkMsg {
nx_am_addr_t source;
nx_uint16_t seqno;
nx_am_addr_t parent;
nx_uint16_t metric;
nx_uint8_t datah;
nx_uint8_t datal; 
nx_uint8_t hopcount;
nx_uint16_t sendCount;
nx_uint16_t sendSuccessCount;
} TestNetworkMsg;

How about the "+4" in 
call UARTSend.send(0xFFFF, recvPtr, call Receive.payloadLength(msg) + 4) ==
SUCCESS), can it influence anything? It does add more bytes to what I get. 

typedef nx_struct serial_header {
nx_am_addr_t dest;
nx_am_addr_t src;
nx_uint8_t length;
nx_am_group_t group;
nx_am_id_t type;
} serial_header_t;

So far, i've ran more tests to try and figure the fields out. Here's how I
understand it so far, with your help and using the structs above: 

7E : Sync 
45 00 : ????
FF FF : destination address 
00 00 : source address (root node)
13 : length ?  
00 EE : Collection ID (from CTP) ?? / Type ?? / Destination PAN Identifier
(from MAC Header) ?? 
00 : ???? 
01 : hopcount (seems out of place, but sure looks like it) ????
00 00 : Destination Address (root ID=0) (from  MAC Header) ??? 
00 07 : Source Address (from the MAC Header) ????
80 : sendCount ??? (this field increments like the seqno below) 
EE : Collection ID (from CTP) ?? / Type ??
00 07 : source  
00 80 : seqno
00 00 : parent
00 00 : metric
20 00 : data 
00 : ???
53 : rssi ?
63 : fcs check ?
7E : Sync

Almost there, but still unclear. How does it look? 

Many thanks for all the help so far on this,

Pedro

On 6/13/07, R. Steve McKown <[EMAIL PROTECTED]  <mailto:[EMAIL PROTECTED]>
> wrote:

On Tuesday 12 June 2007 18:22:41 Pedro Almeida wrote:
> Thank you, Steve McKown and Alexander Becher for your replies.
>
> Thanks to your help I more or less figured out how many bytes there were 
> from the Address Information to be included in the MAC Header. 
>
> According to:
>
> typedef nx_struct cc2420_header_t {
> nxle_uint8_t length;
> nxle_uint16_t fcf;
> nxle_uint8_t dsn;
> nxle_uint16_t destpan;
> nxle_uint16_t dest; 
> nxle_uint16_t src;
> /** I-Frame 6LowPAN interoperability byte */
> #ifdef CC2420_IFRAME_TYPE
> nxle_uint8_t network; 
> #endif
> nxle_uint8_t type;
> } cc2420_header_t;
> 
> I then have 9 bytes from the MHR, adding to 1 from length (PHR) and
> the 5 from the Synchronization Header
> (SHR), assuming (I don't think I'm mistaken here) the I-frame is not in 
> use, giving a total of 15 bytes. The type byte is include in the payload 
> (according to Steve).

In terms of the 802.15.4 frame format, section 14.2 of the CC2420 data sheet
shows that the data received into software from the radio.  The SHR are
never 
received by software, so it can't be part of the data you are trying to 
decode.  The data returned is a length byte, the MPDU bytes, an RSSI byte
and
an FCScheck/corr byte (note the 2-byte FCS is replaced by RSSI and 
FCScheck/coor on receive).  Also, if you look at CC2420.h and
CC2420ActiveMessageP.nc , you'll see that the last 2 bytes (MAC_FOOTER_SIZE)
are not calculated as part of the length field returned to the upper layers 
of software on a receive.  Instead, the data in the last two bytes are
placed
in the metadata structure. 

So, I don't think SHR and FCS can be part of the packet format you are
trying
to decode.

>
> The payload, from the TestNetwork application, is
>
> typedef nx_struct TestNetworkMsg { 
> nx_am_addr_t source;
> nx_uint16_t seqno;
> nx_am_addr_t parent;
> nx_uint16_t metric; 
> nx_uint16_t data;
> nx_uint8_t hopcount;
> nx_uint16_t sendCount;
> nx_uint16_t sendSuccessCount; 
> } TestNetworkMsg;
>
> since nx_am_addr_t is 2 bytes, this struct is 15 bytes. Adding the 1 from 
> the type (as seen above), there's 16 bytes in payload.
> Since
>
> typedef nx_struct cc2420_footer_t { 
> } cc2420_footer_t;
>
> and according to Steve, "The current radio stack has the cc2420 generate 
> the FCS (crc) automatically", so I presume it's not included.
> This totals 31 bytes, and I read 32! If FCS was indeed included (2 bytes),

> i'd get 33 bytes!!
>
> Please notice i'm using a representation such as this 
>
http://www.eng.yale.edu/enalab/courses/eeng460a/homeworks/hw1_results/dataf 
>rame.gifto try and figure it out.
>
> This application uses CTP. Can it have anything to do with it? According
to
> TEP-123 ( http://www.tinyos.net/tinyos-2.x/doc/html/tep123.html
<http://www.tinyos.net/tinyos-2.x/doc/html/tep123.html> ),
>
> The CTP data frame format is as follows (check the URL for correct
> formatting):
> 1
> 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
>
> |P|C| reserved | THL | 
>
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
>
> | ETX |
>
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
>
> | origin |
>
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
>
> | seqno | collect_id | 
>
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
>
> | data ...
>
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
>
> But I don't know how to understand that, so it doesnt help me much.
> Also, I don't understand why the frame starts and ends with 0x7E. Is 7E
> both preamble and last byte in payload? 
>
> Here's one example sequence again:
>
> 7E 45 00 FF FF 00 00 13 00 EE 00 01 00 00 00 07 80 EE 00 07 00 80 00 00 00

> 00 20 00 00 53 63 7E

This is output from tn-listener, right?  0x7E is the serial sync byte.  I'm 
not sure about the next 2 bytes, but the serial header starts at the fourth
byte.  Look at $TOSDIR/lib/serial/Serial.h and they'll match up: 

typedef nx_struct serial_header {
  nx_am_addr_t dest; 
  nx_am_addr_t src;
  nx_uint8_t length;
  nx_am_group_t group;
  nx_am_id_t type;
} serial_header_t;

dest: FFFF - the dest addr as set by UARTSend.send(), as you note
        below.
src: 0000 - the src addr of the sending mote.  May be the PC 
        connected mote itself.
length: 13 (decimal 19)

The next 19 bytes are CTP data, and I don't know the format so well.  It
looks 
like there's an initial byte, 2 8-byte entries, and a 2-byte footer, but I'm

guessing.

Note that tn-listener.c seems to have some problems.  For example, it
accesses
packet after it has been freed.  The data you are seeing could be corrupt, 
since there's a malloc() after packet is freed and the space could have been

reused.  The safe thing to do would be to move the free(packet) to just
under
the free(myPacket).  I'm thinking there may be corruption because the second

CTP unit is supposed to have a 16-bit constant value that should read "ca
fe" 
in the raw data stream (see TestNetworkC.nc).

Because the link to the PC is a serial link, the mote is sending a serial 
active message to the PC, which is the payload wrapped in the serial frame.
This is why you don't see any of the CC2420/802.15.4 frame formatting in the

data you are trying to match.

Cheers,
Steve

>
> I believe the EE is the Collection ID, as seen from TestNetworkC.h,
> which might relate to the CTP frame
> ( http://www.tinyos.net/tinyos-2.x/apps/tests/TestNetwork/TestNetworkC.h
<http://www.tinyos.net/tinyos-2.x/apps/tests/TestNetwork/TestNetworkC.h>  ),
> but I'm not sure that helps. The FF FF could also be from, but I can't be
> sure:
>
> call UARTSend.send(0xFFFF, recvPtr, call Receive.payloadLength(msg) + 4)
==
> SUCCESS)
>
> Many thanks and sorry for the confusing posts!
> Hope you help me figure this out byte by byte and make sense out of it.
>
> Very best regards, 
>
> Pedro
>
>
>
> /**
> * CC2420 Packet Footer
> */
> typedef nx_struct cc2420_footer_t {
> } cc2420_footer_t;
>
> On 6/11/07, Steve McKown < [EMAIL PROTECTED]  <mailto:[EMAIL PROTECTED]>
> wrote:
> > On Friday 08 June 2007 13:21, Pedro Almeida wrote:
> > > Hello; 
> > >
> > > I'm trying to look for documentation where I can understand the exact
> > > contents, byte by byte, of the MPDU. I've looked into the TEPs and the

> > > source files themselves, butI wasn't completely clear. 
> > >
> > > I'm using now the TestNetwork demo, where I receive 32 bytes per
> >
> > message,
> >
> > > of which I know little about, except for the contents of the message_t

> > > itself:
> > >
> > > typedef nx_struct TestNetworkMsg {
> > > nx_am_addr_t source; 
> > > nx_uint16_t seqno;
> > > nx_am_addr_t parent;
> > > nx_uint16_t metric;
> > > nx_uint16_t data;
> > > nx_uint8_t hopcount;
> > > nx_uint16_t sendCount; 
> > > nx_uint16_t sendSuccessCount;
> > > } TestNetworkMsg; 
> > >
> > > That are not, by far, 32 bytes.
> > > So far I understood the MPDU is made of
> > > 
> > > 2 bytes - Frame Control
> > > 1 byte - Data Sequence Number 
> > > 4 to 20 bytes - Address Information
> > > n bytes - Data Payload
> > > 2 bytes - Frame Check Sequence 
> > >
> > > which adds 5 bytes of the SHR and 1 byte of the PHR. So what exactly 
> > > are those 32 bytes??? Which ones are the payload (MSDU) and which ones
> > > are
> > 
> > not
> >
> > > (and what are they?)?
> > >
> > > An example of the 32 bytes is as follows:
> > >
> > > 7E 45 00 FF FF 00 00 13 00 EE 00 01 00 00 00 07 80 EE 00 07 00 80 00
00 
> >
> > 00
> >
> > > 00 20 00 00 53 63 7E 
> >
> > The data above looks like an active message (AM) delivered via a serial
> > physical layer.  The hint are the 0x7E bytes, which are sync bytes.  If 
> > this
> > output came from the PC, then you should be able to map it to the 
> > serial_packet_t in $TOSDIR/lib/serial/Serial.h.  The payload are
> > delivered within the frame appropriate for the link on which the data is

> > sent.  Hence,
> > one sees the serial headers and not the radio headers. 
> >
> > I haven't played with Collection or the TestNetwork app, so I can't help
> > out
> > there.  But I can provide some info on how the CC2420 component
populates
> > the 
> > 802.15.4 compatible frame.  You can see the mapping in the
> > cc2420_header_t structure in $TOSDIR/chips/cc2420/CC2420.h.  The
physical 
> > radio frame looks
> > like this:
> >
> > preamble + sfd + cc2420_header_t + app_data + FCS (crc)
> >
> > In terms of 802.15.4, the second field of cc2420_header_t, fcf, is the 
> > first
> > field of the MAC header.  The last field of cc2420_header_t, type, is 
> > actually part of the MAC payload.  The current radio stack has the
cc2420
> > generate the FCS (crc) automatically. 
> >
> > In terms of addressing, short addresses with the 802.15.4 PAN ID
> > Compression
> > is set, so the address info consists of pan_id + dest_addr +
source_addr.
> > You can see these fields in the cc2420_header_t structure.  The fcf is 
> > set in 
> > CC2420CsmaP.nc's Send.send() implementation, where length, dsn and
source
> > are
> > also set (destination has already been set in the header by this time).
> > 
> > All the best, 
> > Steve
> >
> > > Help!
> > >
> > > Thank you!!!
> > >
> > > Pedro
>
> !DSPAM:466f3c33326061804284693! 

 

 

_______________________________________________
Tinyos-help mailing list
Tinyos-help@Millennium.Berkeley.EDU
https://mail.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help

Reply via email to